~ubuntu-branches/ubuntu/karmic/quodlibet/karmic

« back to all changes in this revision

Viewing changes to qltk/downloader.py

  • Committer: Bazaar Package Importer
  • Author(s): Luca Falavigna
  • Date: 2009-01-30 23:55:34 UTC
  • mfrom: (1.1.12 upstream)
  • Revision ID: james.westby@ubuntu.com-20090130235534-l4e72ulw0vqfo17w
Tags: 2.0-1ubuntu1
* Merge from Debian experimental (LP: #276856), remaining Ubuntu changes:
  + debian/patches/40-use-music-profile.patch:
    - Use the "Music and Movies" pipeline per default.
* Refresh the above patch for new upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright 2005 Joe Wreschnig
2
 
#
3
 
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License version 2 as
5
 
# published by the Free Software Foundation
6
 
#
7
 
# $Id: downloader.py 3494 2006-06-23 04:43:35Z mu $
8
 
 
9
 
import os
10
 
import urllib
11
 
 
12
 
import gobject
13
 
import gtk
14
 
import pango
15
 
 
16
 
import qltk
17
 
import util
18
 
 
19
 
from qltk.views import AllTreeView
20
 
 
21
 
class DownloadWindow(qltk.Window):
22
 
    __window = None
23
 
    downloads = None
24
 
 
25
 
    def download(klass, source, target):
26
 
        if klass.downloads is None:
27
 
            # source fileobj, target fileobj, I/O watch callback ID
28
 
            klass.downloads = gtk.ListStore(object, object, int)
29
 
        if klass.__window is None:
30
 
            klass.__window = DownloadWindow()
31
 
        klass.__window._download(source, target)
32
 
        klass.__window.present()
33
 
    download = classmethod(download)
34
 
 
35
 
    def __init__(self):
36
 
        super(DownloadWindow, self).__init__()
37
 
        self.set_title("Quod Libet - " + _("Downloads"))
38
 
        self.set_default_size(300, 150)
39
 
        self.set_border_width(12)
40
 
        self.__timeout = None
41
 
 
42
 
        view = AllTreeView()
43
 
        view.connect('popup-menu', self.__popup_menu)
44
 
        view.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
45
 
        view.set_model(self.downloads)
46
 
        view.set_rules_hint(True)
47
 
 
48
 
        render = gtk.CellRendererText()
49
 
        render.set_property('ellipsize', pango.ELLIPSIZE_START)
50
 
        column = gtk.TreeViewColumn(_("Filename"), render)
51
 
        column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
52
 
        column.set_expand(True)
53
 
        def cell_data_name(column, cell, model, iter):
54
 
            cell.set_property('text', model[iter][1].name)
55
 
        column.set_cell_data_func(render, cell_data_name)
56
 
        view.append_column(column)
57
 
        
58
 
        render = gtk.CellRendererText()
59
 
        column = gtk.TreeViewColumn(_("Size"), render)
60
 
        column.set_sizing(gtk.TREE_VIEW_COLUMN_GROW_ONLY)
61
 
        def cell_data_size(column, cell, model, iter):
62
 
            size = util.format_size(model[iter][1].tell())
63
 
            cell.set_property('text', size)
64
 
        column.set_cell_data_func(render, cell_data_size)
65
 
        view.append_column(column)
66
 
 
67
 
        sw = gtk.ScrolledWindow()
68
 
        sw.add(view)
69
 
        sw.set_shadow_type(gtk.SHADOW_IN)
70
 
        sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
71
 
        self.add(sw)
72
 
        self.connect_object(
73
 
            'delete-event', DownloadWindow.__delete_event, self)
74
 
        self.child.show_all()
75
 
 
76
 
    def __update(self):
77
 
        for row in self.downloads:
78
 
            self.downloads.row_changed(row.path, row.iter)
79
 
        return True
80
 
 
81
 
    def __popup_menu(self, view):
82
 
        selection = view.get_selection()
83
 
        model, paths = selection.get_selected_rows()
84
 
        if model:
85
 
            iters = map(model.get_iter, paths)
86
 
            menu = gtk.Menu()
87
 
            item = gtk.ImageMenuItem(gtk.STOCK_STOP)
88
 
            item.connect_object('activate', self.__stop_download, iters)
89
 
            menu.append(item)
90
 
            menu.connect('selection-done', lambda m: m.destroy())
91
 
            menu.show_all()
92
 
            return view.popup_menu(menu, 0, gtk.get_current_event_time())
93
 
 
94
 
    def __stop_download(self, iters):
95
 
        for iter in iters:
96
 
            gobject.source_remove(self.downloads[iter][2])
97
 
            self.downloads[iter][0].close()
98
 
            self.downloads[iter][1].close()
99
 
            os.unlink(self.downloads[iter][1].name)
100
 
            self.downloads.remove(iter)
101
 
 
102
 
    def present(self):
103
 
        super(DownloadWindow, self).present()
104
 
        if self.__timeout is None:
105
 
            self.__timeout = gobject.timeout_add(1000, self.__update)
106
 
 
107
 
    def __delete_event(self, event):
108
 
        self.hide()
109
 
        if self.__timeout is not None:
110
 
            gobject.source_remove(self.__timeout)
111
 
        self.__timeout = None
112
 
        return True
113
 
 
114
 
    def _download(self, source, target):
115
 
        fileobj = file(target, "wb")
116
 
        url = urllib.urlopen(source)
117
 
        sock = url.fp._sock
118
 
        sock.setblocking(0)
119
 
        iter = self.downloads.append(row=[sock, fileobj, 0])
120
 
        sig_id = gobject.io_add_watch(
121
 
            sock, gobject.IO_IN|gobject.IO_ERR|gobject.IO_HUP,
122
 
            self.__got_data, fileobj, iter)
123
 
        self.downloads[iter][2] = sig_id
124
 
 
125
 
    def __got_data(self, src, condition, fileobj, iter):
126
 
        if condition in [gobject.IO_ERR, gobject.IO_HUP]:
127
 
            fileobj.close()
128
 
            src.close()
129
 
            self.downloads.remove(iter)
130
 
            return False
131
 
        else:
132
 
            buf = src.recv(1024*1024)
133
 
            if buf: fileobj.write(buf)
134
 
            else:
135
 
                fileobj.close()
136
 
                src.close()
137
 
                self.downloads.remove(iter)
138
 
            return bool(buf)