class AddDownloadDialog(Gtk.Dialog, Gtk.Buildable): __gtype_name__ = "AddDownloadDialog" def __init__(self): Gtk.Dialog.__init__(self) self.mode = 0 self.filename = "" def do_parser_finished(self, builder): self.builder = builder self.builder.connect_signals(self) self.cutlists_treeview = CutlistsTreeView() self.cutlists_treeview.show() self.cutlists_treeview.get_selection().connect( 'changed', self.treeview_cutlists_selection_changed) self.builder.get_object('scrolledwindow_cutlists').add( self.cutlists_treeview) animation = GdkPixbuf.PixbufAnimation.new_from_file( path.get_image_path("spinner.gif")) self.builder.get_object('image_spinner').set_from_animation(animation) self.builder.get_object('image_spinner_download').set_from_animation( animation) selection = self.builder.get_object( 'treeview_programs').get_selection() selection.connect('changed', self.treeview_programs_selection_changed) ## del_libtorrent -> """
def do_parser_finished(self, builder): self.builder = builder self.builder.connect_signals(self) self.chosen_cutlist = None self.treeview_cutlists = CutlistsTreeView() self.treeview_cutlists.show() self.treeview_cutlists.get_selection().connect( 'changed', self._on_selection_changed) self.builder.get_object('scrolledwindow_cutlists').add( self.treeview_cutlists) self.filename = ""
def do_parser_finished(self, builder): self.builder = builder self.builder.connect_signals(self) self.chosen_cutlist = None self.treeview_local_cutlists = CutlistsTreeView() self.treeview_local_cutlists.show() self.treeview_local_cutlists.get_selection().connect('changed', self._on_local_selection_changed) self.builder.get_object('scrolledwindow_local').add(self.treeview_local_cutlists) self.treeview_download_cutlists = CutlistsTreeView() self.treeview_download_cutlists.show() self.treeview_download_cutlists.get_selection().connect('changed', self._on_download_selection_changed) self.builder.get_object('scrolledwindow_download').add(self.treeview_download_cutlists) self.filename = ""
def do_parser_finished(self, builder): self.builder = builder self.builder.connect_signals(self) self.cutlists_treeview = CutlistsTreeView() self.cutlists_treeview.show() self.cutlists_treeview.get_selection().connect( 'changed', self.treeview_cutlists_selection_changed) self.builder.get_object('scrolledwindow_cutlists').add( self.cutlists_treeview) animation = gtk.gdk.PixbufAnimation(path.get_image_path("spinner.gif")) self.builder.get_object('image_spinner').set_from_animation(animation) self.builder.get_object('image_spinner_download').set_from_animation( animation) selection = self.builder.get_object( 'treeview_programs').get_selection() selection.connect('changed', self.treeview_programs_selection_changed)
def do_parser_finished(self, builder): self.log.debug("Function start") self.builder = builder self.builder.connect_signals(self) self.chosen_cutlist = None self.treeview_local_cutlists = CutlistsTreeView() self.treeview_local_cutlists.show() self.treeview_local_cutlists.get_selection().connect( 'changed', self._on_local_selection_changed) self.builder.get_object('scrolledwindow_local').add( self.treeview_local_cutlists) self.treeview_download_cutlists = CutlistsTreeView() self.treeview_download_cutlists.show() self.treeview_download_cutlists.get_selection().connect( 'changed', self._on_download_selection_changed) self.builder.get_object('scrolledwindow_download').add( self.treeview_download_cutlists) self.filename = ""
def do_parser_finished(self, builder): self.builder = builder self.builder.connect_signals(self) self.cutlists_treeview = CutlistsTreeView() self.cutlists_treeview.show() self.cutlists_treeview.get_selection().connect("changed", self.treeview_cutlists_selection_changed) self.builder.get_object("scrolledwindow_cutlists").add(self.cutlists_treeview) animation = gtk.gdk.PixbufAnimation(path.get_image_path("spinner.gif")) self.builder.get_object("image_spinner").set_from_animation(animation) self.builder.get_object("image_spinner_download").set_from_animation(animation) selection = self.builder.get_object("treeview_programs").get_selection() selection.connect("changed", self.treeview_programs_selection_changed)
class LoadCutDialog(gtk.Dialog, gtk.Buildable): """ Dialog, um Cutlists lokal oder von cutlist.at zu laden """ __gtype_name__ = "LoadCutDialog" def __init__(self): self.download_error = False def do_parser_finished(self, builder): self.builder = builder self.builder.connect_signals(self) self.chosen_cutlist = None self.treeview_local_cutlists = CutlistsTreeView() self.treeview_local_cutlists.show() self.treeview_local_cutlists.get_selection().connect( 'changed', self._on_local_selection_changed) self.builder.get_object('scrolledwindow_local').add( self.treeview_local_cutlists) self.treeview_download_cutlists = CutlistsTreeView() self.treeview_download_cutlists.show() self.treeview_download_cutlists.get_selection().connect( 'changed', self._on_download_selection_changed) self.builder.get_object('scrolledwindow_download').add( self.treeview_download_cutlists) self.filename = "" ### ### Convenience methods ### def setup(self, video_file): self.filename = video_file self.builder.get_object('label_file').set_markup( "<b>%s</b>" % os.path.basename(video_file)) # looking for local cutlists p, filename = os.path.split(video_file) cutregex = re.compile("^" + filename + "\.?(.*).cutlist$") files = os.listdir(p) local_cutlists = [] for f in files: match = cutregex.match(f) if match: # print "Found local cutlist" local_cutlists.append(p + '/' + match.group()) else: # print f + " is no cutlist" pass # print "%d cutlists found" % len(local_cutlists) if len(local_cutlists) > 0: self.treeview_local_cutlists.get_model().clear() self.builder.get_object('scrolledwindow_local').set_sensitive(True) self.builder.get_object('button_local').set_sensitive(True) for c in local_cutlists: cutlist = cutlists_management.Cutlist() cutlist.local_filename = c cutlist.read_from_file() self.treeview_local_cutlists.add_cutlist(cutlist) else: self.builder.get_object('scrolledwindow_local').set_sensitive( False) self.builder.get_object('button_local').set_active(False) self.builder.get_object('button_local').set_sensitive(False) # start looking for downloadable cutlists self.treeview_download_cutlists.get_model().clear() self.builder.get_object('label_status').set_markup( "<b>Cutlisten werden heruntergeladen...</b>") self.download_error = False GeneratorTask(cutlists_management.download_cutlists, None, self._completed).start( video_file, self.app.config.get('general', 'server'), self.app.config.get('general', 'choose_cutlists_by'), self.app.config.get('general', 'cutlist_mp4_as_hq'), self._error_cb, self._cutlist_found_cb) def _error_cb(self, error): print "Error: %s" % error self.builder.get_object('label_status').set_markup("<b>%s</b>" % error) self.download_error = True def _cutlist_found_cb(self, cutlist): # print "Found cutlist" self.add_cutlist(cutlist) def _completed(self): # print "Downloading cutlists completed. download_error = %r" % self.download_error if not self.download_error: self.builder.get_object('label_status').set_markup("") def add_cutlist(self, c): self.treeview_download_cutlists.add_cutlist(c) ### ### Signal handlers ### def _on_local_selection_changed(self, selection, data=None): model, paths = selection.get_selected_rows() if paths: self.builder.get_object('button_local').set_active(True) self.treeview_download_cutlists.get_selection().unselect_all() def _on_download_selection_changed(self, selection, data=None): model, paths = selection.get_selected_rows() if paths: self.builder.get_object('button_download').set_active(True) self.treeview_local_cutlists.get_selection().unselect_all() def on_button_ok_clicked(self, widget, data=None): if self.builder.get_object('button_local').get_active() == True: cutlist = self.treeview_local_cutlists.get_selected() if not cutlist: self.gui.message_error_box( "Es wurde keine Cutlist ausgewählt!") return self.result = cutlist self.response(1) elif self.builder.get_object('button_download').get_active() == True: cutlist = self.treeview_download_cutlists.get_selected() if not cutlist: self.gui.message_error_box( "Es wurde keine Cutlist ausgewählt!") return cutlist.download(self.app.config.get('general', 'server'), self.filename) self.result = cutlist self.response(1)
class CutDialog(Gtk.Dialog, Gtk.Buildable): """ Dialog, um den Schnittmodus constants.Cut_action und ggf die Cutlist auszuwählen """ __gtype_name__ = "CutDialog" def __init__(self): Gtk.Dialog.__init__(self) pass def do_parser_finished(self, builder): self.builder = builder self.builder.connect_signals(self) self.chosen_cutlist = None self.treeview_cutlists = CutlistsTreeView() self.treeview_cutlists.show() self.treeview_cutlists.get_selection().connect( 'changed', self._on_selection_changed) self.builder.get_object('scrolledwindow_cutlists').add( self.treeview_cutlists) self.filename = "" # # Convenience methods # def setup(self, video_file, folder_cut_avis, cut_action_ask): self.filename = video_file self.builder.get_object('label_file').set_markup("<b>%s</b>" % basename(video_file)) self.builder.get_object('label_warning').set_markup( '<span size="small">Wichtig! Um eine Cutlist zu erstellen muss das Projekt im Ordner %s gespeichert werden (siehe Website->Einstieg->Funktionen). OTR-Verwaltung schneidet die Datei dann automatisch.</span>' % folder_cut_avis) if cut_action_ask: self.builder.get_object('radio_best_cutlist').set_active(True) else: self.builder.get_object('radio_choose_cutlist').set_active(True) # looking for a local cutlist filename_cutlist = video_file + ".cutlist" if exists(filename_cutlist): self.builder.get_object('label_cutlist').set_markup( "<b>%s</b>" % filename_cutlist) self.builder.get_object('radio_local_cutlist').set_sensitive(True) else: self.builder.get_object('label_cutlist').set_markup( "Keine lokale Cutlist gefunden.") self.builder.get_object('radio_local_cutlist').set_sensitive(False) # start looking for cutlists self.treeview_cutlists.get_model().clear() self.builder.get_object('label_status').set_markup( "<b>Cutlisten werden heruntergeladen...</b>") def add_cutlist(self, c): self.treeview_cutlists.add_cutlist(c) # # Signal handlers # def _on_radio_manually_toggled(self, widget, data=None): self.builder.get_object('button_show_cuts').set_sensitive( not widget.get_active()) def _on_radio_best_cutlist_toggled(self, widget, data=None): self.builder.get_object('button_show_cuts').set_sensitive( not widget.get_active()) def _on_button_show_cuts_clicked(self, widget, data=None): cutlist = cutlists_management.Cutlist() if self.builder.get_object('radio_local_cutlist').get_active(): cutlist.local_filename = self.builder.get_object( 'label_cutlist').get_text() else: cutlist = self.treeview_cutlists.get_selected() if not cutlist: self.gui.message_error_box( "Es wurde keine Cutlist ausgewählt!") return error = cutlist.download(self.app.config.get('general', 'server'), self.filename) if error: self.gui.message_error_box(error) return self.app.show_cuts(self.filename, cutlist) # delete cutlist fileoperations.remove_file(cutlist.local_filename) def _on_selection_changed(self, selection, data=None): model, paths = selection.get_selected_rows() if paths: self.builder.get_object('radio_choose_cutlist').set_active(True) def _on_buttonCutOK_clicked(self, widget, data=None): if self.builder.get_object('radio_best_cutlist').get_active() == True: self.response(Cut_action.BEST_CUTLIST) elif self.builder.get_object( 'radio_choose_cutlist').get_active() == True: cutlist = self.treeview_cutlists.get_selected() if not cutlist: self.gui.message_error_box( "Es wurde keine Cutlist ausgewählt!") return self.chosen_cutlist = cutlist self.response(Cut_action.CHOOSE_CUTLIST) elif self.builder.get_object( 'radio_local_cutlist').get_active() == True: self.response(Cut_action.LOCAL_CUTLIST) else: self.response(Cut_action.MANUALLY)
class AddDownloadDialog(gtk.Dialog, gtk.Buildable): __gtype_name__ = "AddDownloadDialog" def __init__(self): self.mode = 0 self.filename = "" def do_parser_finished(self, builder): self.builder = builder self.builder.connect_signals(self) self.cutlists_treeview = CutlistsTreeView() self.cutlists_treeview.show() self.cutlists_treeview.get_selection().connect( 'changed', self.treeview_cutlists_selection_changed) self.builder.get_object('scrolledwindow_cutlists').add( self.cutlists_treeview) animation = gtk.gdk.PixbufAnimation(path.get_image_path("spinner.gif")) self.builder.get_object('image_spinner').set_from_animation(animation) self.builder.get_object('image_spinner_download').set_from_animation( animation) selection = self.builder.get_object( 'treeview_programs').get_selection() selection.connect('changed', self.treeview_programs_selection_changed) def get_download_options(self): if self.builder.get_object('radiobutton_torrent').get_active(): return ('torrent', ) else: link = self.builder.get_object('entry_link').get_text() if self.builder.get_object('checkbutton_cut').get_active(): cutlist_id = self.cutlists_treeview.get_selected().id return ('normal', 'decodeandcut', link, cutlist_id) if self.builder.get_object('checkbutton_decode').get_active(): return ('normal', 'decode', link) return ('normal', link) # # SEARCH # def search(self, text): try: html = urllib.urlopen("http://otrkeyfinder.com/?search=%s" % text).read() except IOError: yield 'Verbindungsprobleme' return results = re.findall( r'title="(([^&]*)_([0-9\.]*)_([0-9-]*)_([^_]*)_([0-9]*)_TVOON_DE.mpg\.(avi|HQ\.avi|HD\.avi|mp4).otrkey)"[^\(]*>\(([0-9]*)\)', html) for result in results: filename, name, date, time, station, length, format, mirrors = result name = name.replace('_', ' ') date = "%s.%s.20%s" % tuple(reversed(date.split('.'))) time = time.replace('-', ':') station = station.capitalize() length = "%s min" % length yield [ filename, name, station, date, time, format, length, int(mirrors) ] def search_callback(self, row): model = self.builder.get_object('treeview_programs').get_model() if type(row) == str: self.error = row else: model.append(row) def search_stop(self): model = self.builder.get_object('treeview_programs').get_model() self.builder.get_object('scrolledwindow_programs').show() self.builder.get_object('vbox_searching').hide() self.builder.get_object('button_search').set_sensitive(True) if self.error: self.builder.get_object('label_status').set_markup("<b>%s</b>" % self.error) else: if len(model) == 1: self.builder.get_object('label_status').set_text( "Es wurden eine Datei gefunden") else: self.builder.get_object('label_status').set_text( "Es wurden %i Dateien gefunden" % len(model)) # # GATHER_INFORMATION # def forward(self, iter=None, link=None): """ iter==None --> programs search was skipped iter!=None --> iter is the selected program link!=None --> executable was called with 'link' argument """ self.mode = 1 # download self.builder.get_object('vbox_search').hide() self.builder.get_object('vbox_download').show() self.builder.get_object('button_ok').set_label("_Download") self.builder.get_object('button_ok').set_sensitive(True) if iter: self.filename, mirrors = self.builder.get_object( 'liststore_programs').get(iter, 0, 7) if mirrors == 1: self.builder.get_object('button_mirror_search').set_label( "Auf einem Mirror suchen") else: self.builder.get_object('button_mirror_search').set_label( "Auf %i Mirrors suchen" % mirrors) GeneratorTask(self.gather_information, self.gather_information_callback, self.gather_information_stop).start() else: self.builder.get_object('image_spinner_download').hide() self.builder.get_object('button_mirror_search').hide() self.builder.get_object('label_torrent').set_markup( "Download via Torrent") self.builder.get_object('label_error').set_markup('') if link: self.builder.get_object('entry_link').set_text(link) else: self.builder.get_object('label_download_status').set_markup( "Füge einen Downloadlink in das Feld ein!") def gather_information(self): self.builder.get_object('image_spinner_download').show() self.builder.get_object('label_download_status').set_markup( "Es soll die Datei\n<b>%s</b>\nheruntergeladen werden." % self.filename) self.cutlists_treeview.get_model().clear() without_otrkey = self.filename[:-7] # search for torrents try: email = self.config.get('general', 'email') password = base64.b64decode(self.config.get('general', 'password')) params = urllib.urlencode({ 'email': email, 'pass': password, 'btn_login': '******' }) website = urllib.urlopen( "http://www.onlinetvrecorder.com/index.php", params) sessid = website.info().getheader('Set-Cookie') sessid = sessid[sessid.index("=") + 1:sessid.index(";")] if not "Dekodierungen" in website.read(): yield 'torrent_error', 'OTR-Daten nicht korrekt!' else: params = urllib.urlencode({ 'aktion': 'tracker', 'search': without_otrkey }) request = urllib2.Request( "http://www.onlinetvrecorder.com/index.php?%s" % params, headers={'Cookie': "PHPSESSID=" + sessid}) response = urllib2.urlopen(request).read() result = re.findall( r"<td valign=top bgcolor='' nowrap>([0-9]*)</td>", response) if result: yield 'torrent', int(result[0]), int(result[1]) else: yield 'torrent', 0, 0 except IOError: yield 'torrent_error', 'Verbindungsprobleme' # search for cutlists error, cutlists_found = cutlists.download_cutlists( without_otrkey, self.config.get('general', 'server'), 1, False) if error: yield 'cutlist_error', error else: yield 'cutlist', cutlists_found def gather_information_callback(self, value, *args): # torrent if value == 'torrent_error': self.builder.get_object('label_torrent').set_markup( "Download via Torrent (<b>%s</b>)" % args[0]) elif value == 'torrent': self.builder.get_object('label_torrent').set_markup( "Download via Torrent (<b>%i Seeder, %i Leecher</b>)" % args) self.builder.get_object('radiobutton_torrent').set_sensitive(True) # cutlist elif value == 'cutlist_error': self.builder.get_object('checkbutton_cut').set_sensitive(False) self.builder.get_object('label_error').set_markup('<b>%s</b>' % args[0]) elif value == 'cutlist': if len(args[0]) == 0: self.builder.get_object('checkbutton_cut').set_sensitive(False) self.builder.get_object('label_error').set_markup( '<b>Keine Cutlists gefunden</b>') else: self.builder.get_object('label_error').set_markup('') self.builder.get_object('checkbutton_cut').set_sensitive(True) for cutlist in args[0]: self.cutlists_treeview.add_cutlist(cutlist) def gather_information_stop(self): self.builder.get_object('image_spinner_download').hide() # # SIGNALS # def on_entry_link_changed(self, widget, data=None): download_link = widget.get_text() result = re.findall("([a-z._\-0-9]*_TVOON_DE[a-z0-9.]*\.otrkey)", download_link, re.IGNORECASE) if result: self.filename = result[0] GeneratorTask(self.gather_information, self.gather_information_callback, self.gather_information_stop).start() else: pass def treeview_cutlists_selection_changed(self, treeselection, data=None): model, iter = treeselection.get_selected() if iter: self.builder.get_object('checkbutton_cut').set_active(True) def treeview_programs_selection_changed(self, treeselection, data=None): model, iter = treeselection.get_selected() self.builder.get_object('button_ok').set_sensitive(iter != None) def on_button_search_clicked(self, widget, data=None): text = self.builder.get_object('entry_search').get_text() if len(text) < 3: self.builder.get_object('label_status').set_markup( "<b>Die Suche muss mindesten 3 Zeichen haben!</b>") return else: for char in text: if not char.lower( ) in 'abcdefghijklmnopqrstuvwxyz0123456789.-_ *': self.builder.get_object('label_status').set_markup( "<b>Erlaubt sind nur Groß- und Kleinbuchstaben, die Ziffern 0 bis 9, der Punkt, das Minus, der Unterstrich und der Stern/Leerzeichen als Platzhalter!</b>" ) return self.builder.get_object('label_status').set_markup("") model = self.builder.get_object('liststore_programs') model.clear() self.builder.get_object('scrolledwindow_programs').hide() self.builder.get_object('vbox_searching').show() self.builder.get_object('button_search').set_sensitive(False) self.error = "" GeneratorTask(self.search, self.search_callback, self.search_stop).start(text) def on_treeview_programs_row_activated(self, treeview, path, view_column, data=None): iter = treeview.get_model().get_iter(path) self.forward(iter) def on_checkbutton_cut_toggled(self, widget, data=None): if widget.get_active(): self.builder.get_object('checkbutton_decode').set_active(True) def on_radiobutton_torrent_toggled(self, widget, data=None): self.builder.get_object('box_normal').set_sensitive( not widget.get_active()) def on_button_mirror_search_clicked(self, widget, data=None): subprocess.call( ["xdg-open", "http://otrkeyfinder.com/?search=%s" % self.filename]) def on_button_cancel_clicked(self, widget, data=None): self.response(-6) def on_button_ok_clicked(self, widget, data=None): if self.mode == 0: # search for files selection = self.builder.get_object( 'treeview_programs').get_selection() model, iter = selection.get_selected() self.forward(iter) else: # actual download if self.builder.get_object('radiobutton_normal').get_active(): if not self.builder.get_object('entry_link').get_text(): self.gui.message_error_box( "Es ist kein Download-Link eingetragen!") return if self.builder.get_object('checkbutton_cut').get_active(): if not self.cutlists_treeview.get_selected(): self.gui.message_error_box( "Es ist keine Cutlist ausgewählt!") return self.response(-5)
class AddDownloadDialog(Gtk.Dialog, Gtk.Buildable): __gtype_name__ = "AddDownloadDialog" def __init__(self): Gtk.Dialog.__init__(self) self.mode = 0 self.filename = "" def do_parser_finished(self, builder): self.builder = builder self.builder.connect_signals(self) self.cutlists_treeview = CutlistsTreeView() self.cutlists_treeview.show() self.cutlists_treeview.get_selection().connect( 'changed', self.treeview_cutlists_selection_changed) self.builder.get_object('scrolledwindow_cutlists').add( self.cutlists_treeview) animation = GdkPixbuf.PixbufAnimation.new_from_file( path.get_image_path("spinner.gif")) self.builder.get_object('image_spinner').set_from_animation(animation) self.builder.get_object('image_spinner_download').set_from_animation( animation) selection = self.builder.get_object( 'treeview_programs').get_selection() selection.connect('changed', self.treeview_programs_selection_changed) def get_download_options(self): if self.builder.get_object('radiobutton_torrent').get_active(): return ('torrent', ) else: link = self.builder.get_object('entry_link').get_text() if self.builder.get_object('checkbutton_cut').get_active(): cutlist_id = self.cutlists_treeview.get_selected().id return ('normal', 'decodeandcut', link, cutlist_id) if self.builder.get_object('checkbutton_decode').get_active(): return ('normal', 'decode', link) return ('normal', link) # # SEARCH # def search(self, text): try: # html = urllib.urlopen("http://otrkeyfinder.com/?search=%s" % text).read() # html = Request.urlopen("http://otrkeyfinder.com/?search=%s" % text).read() html = requests.get("http://otrkeyfinder.com/?search=%s" % text) except IOError: yield 'Verbindungsprobleme' return results = re.findall( r'title="(([^&]*)_([0-9\.]*)_([0-9-]*)_([^_]*)_([0-9]*)_TVOON_DE.mpg\.(avi|HQ\.avi|HD\.avi|mp4).otrkey)"[^\(]*>\(([0-9]*)\)', html) for result in results: filename, name, date, time, station, length, format, mirrors = result name = name.replace('_', ' ') date = "%s.%s.20%s" % tuple(reversed(date.split('.'))) time = time.replace('-', ':') station = station.capitalize() length = "%s min" % length yield [ filename, name, station, date, time, format, length, int(mirrors) ] def search_callback(self, row): model = self.builder.get_object('treeview_programs').get_model() if type(row) == str: self.error = row else: model.append(row) def search_stop(self): model = self.builder.get_object('treeview_programs').get_model() self.builder.get_object('scrolledwindow_programs').show() self.builder.get_object('vbox_searching').hide() self.builder.get_object('button_search').set_sensitive(True) if self.error: self.builder.get_object('label_status').set_markup("<b>%s</b>" % self.error) else: if len(model) == 1: self.builder.get_object('label_status').set_text( "Es wurden eine Datei gefunden") else: self.builder.get_object('label_status').set_text( "Es wurden %i Dateien gefunden" % len(model)) # # GATHER_INFORMATION # def forward(self, iter=None, link=None): """ iter==None --> programs search was skipped iter!=None --> iter is the selected program link!=None --> executable was called with 'link' argument """ self.mode = 1 # download self.builder.get_object('vbox_search').hide() self.builder.get_object('vbox_download').show() self.builder.get_object('button_ok').set_label("_Download") self.builder.get_object('button_ok').set_sensitive(True) if iter: self.filename, mirrors = self.builder.get_object( 'liststore_programs').get(iter, 0, 7) if mirrors == 1: self.builder.get_object('button_mirror_search').set_label( "Auf einem Mirror suchen") else: self.builder.get_object('button_mirror_search').set_label( "Auf %i Mirrors suchen" % mirrors) GeneratorTask(self.gather_information, self.gather_information_callback, self.gather_information_stop).start() else: self.builder.get_object('image_spinner_download').hide() self.builder.get_object('button_mirror_search').hide() self.builder.get_object('label_torrent').set_markup( "Download via Torrent") self.builder.get_object('label_error').set_markup('') if link: self.builder.get_object('entry_link').set_text(link) else: self.builder.get_object('label_download_status').set_markup( "Füge einen Downloadlink in das Feld ein!") def gather_information(self): self.builder.get_object('image_spinner_download').show() self.builder.get_object('label_download_status').set_markup( "Es soll die Datei\n<b>%s</b>\nheruntergeladen werden." % self.filename) self.cutlists_treeview.get_model().clear() without_otrkey = self.filename[:-7] # search for torrents torrent_filename = os.path.join( self.config.get('general', 'folder_new_otrkeys'), self.filename + '.torrent') if not os.path.exists(torrent_filename): url = 'http://81.95.11.2/torrents/' + self.filename + '.torrent' try: request.urlretrieve(url, torrent_filename) except IOError: yield 'torrent_error', "Torrentdatei konnte nicht heruntergeladen werden (%s)!" # read filename torrent = lt.bdecode(open(torrent_filename, 'rb').read()) info = lt.torrent_info(torrent) info_hash = str(info.info_hash()) try: result = scrape('http://81.95.11.2:8080/announce', [info_hash]) for hash, stats in result.iteritems(): yield 'torrent', stats["seeds"], stats["peers"] except: yield 'torrent_error', "Tracker konnte nicht erreicht werden" if os.path.isfile(torrent_filename): os.remove(torrent_filename) # search for cutlists error, cutlists_found = cutlists.download_cutlists( without_otrkey, self.config.get('general', 'server'), 1, False) if error: yield 'cutlist_error', error else: yield 'cutlist', cutlists_found def gather_information_callback(self, value, *args): # torrent if value == 'torrent_error': self.builder.get_object('label_torrent').set_markup( "Download via Torrent (<b>%s</b>)" % args[0]) elif value == 'torrent': self.builder.get_object('label_torrent').set_markup( "Download via Torrent (<b>%i Seeder, %i Leecher</b>)" % args) self.builder.get_object('radiobutton_torrent').set_sensitive(True) # cutlist elif value == 'cutlist_error': self.builder.get_object('checkbutton_cut').set_sensitive(False) self.builder.get_object('label_error').set_markup('<b>%s</b>' % args[0]) elif value == 'cutlist': if len(args[0]) == 0: self.builder.get_object('checkbutton_cut').set_sensitive(False) self.builder.get_object('label_error').set_markup( '<b>Keine Cutlists gefunden</b>') else: self.builder.get_object('label_error').set_markup('') self.builder.get_object('checkbutton_cut').set_sensitive(True) for cutlist in args[0]: self.cutlists_treeview.add_cutlist(cutlist) def gather_information_stop(self): self.builder.get_object('image_spinner_download').hide() # # SIGNALS # def on_entry_link_changed(self, widget, data=None): download_link = widget.get_text() result = re.findall("([a-z._\-0-9]*_TVOON_DE[a-z0-9.]*\.otrkey)", download_link, re.IGNORECASE) if result: self.filename = result[0] GeneratorTask(self.gather_information, self.gather_information_callback, self.gather_information_stop).start() else: pass def treeview_cutlists_selection_changed(self, treeselection, data=None): model, iter = treeselection.get_selected() if iter: self.builder.get_object('checkbutton_cut').set_active(True) def treeview_programs_selection_changed(self, treeselection, data=None): model, iter = treeselection.get_selected() self.builder.get_object('button_ok').set_sensitive(iter != None) def on_button_search_clicked(self, widget, data=None): text = self.builder.get_object('entry_search').get_text() if len(text) < 3: self.builder.get_object('label_status').set_markup( "<b>Die Suche muss mindesten 3 Zeichen haben!</b>") return else: for char in text: if not char.lower( ) in 'abcdefghijklmnopqrstuvwxyz0123456789.-_ *': self.builder.get_object('label_status').set_markup( "<b>Erlaubt sind nur Groß- und Kleinbuchstaben, die Ziffern 0 bis 9, der Punkt, das Minus, der Unterstrich und der Stern/Leerzeichen als Platzhalter!</b>" ) return self.builder.get_object('label_status').set_markup("") model = self.builder.get_object('liststore_programs') model.clear() self.builder.get_object('scrolledwindow_programs').hide() self.builder.get_object('vbox_searching').show() self.builder.get_object('button_search').set_sensitive(False) self.error = "" GeneratorTask(self.search, self.search_callback, self.search_stop).start(text) def on_treeview_programs_row_activated(self, treeview, path, view_column, data=None): iter = treeview.get_model().get_iter(path) self.forward(iter) def on_checkbutton_cut_toggled(self, widget, data=None): if widget.get_active(): self.builder.get_object('checkbutton_decode').set_active(True) def on_radiobutton_torrent_toggled(self, widget, data=None): self.builder.get_object('box_normal').set_sensitive( not widget.get_active()) def on_button_mirror_search_clicked(self, widget, data=None): subprocess.call( ["xdg-open", "http://otrkeyfinder.com/?search=%s" % self.filename]) def on_button_cancel_clicked(self, widget, data=None): self.response(-6) def on_button_ok_clicked(self, widget, data=None): if self.mode == 0: # search for files selection = self.builder.get_object( 'treeview_programs').get_selection() model, iter = selection.get_selected() self.forward(iter) else: # actual download if self.builder.get_object('radiobutton_normal').get_active(): if not self.builder.get_object('entry_link').get_text(): self.gui.message_error_box( "Es ist kein Download-Link eingetragen!") return if self.builder.get_object('checkbutton_cut').get_active(): if not self.cutlists_treeview.get_selected(): self.gui.message_error_box( "Es ist keine Cutlist ausgewählt!") return self.response(-5)
class LoadCutDialog(gtk.Dialog, gtk.Buildable): """ Dialog, um Cutlists lokal oder von cutlist.at zu laden """ __gtype_name__ = "LoadCutDialog" def __init__(self): self.download_error = False def do_parser_finished(self, builder): self.builder = builder self.builder.connect_signals(self) self.chosen_cutlist = None self.treeview_local_cutlists = CutlistsTreeView() self.treeview_local_cutlists.show() self.treeview_local_cutlists.get_selection().connect('changed', self._on_local_selection_changed) self.builder.get_object('scrolledwindow_local').add(self.treeview_local_cutlists) self.treeview_download_cutlists = CutlistsTreeView() self.treeview_download_cutlists.show() self.treeview_download_cutlists.get_selection().connect('changed', self._on_download_selection_changed) self.builder.get_object('scrolledwindow_download').add(self.treeview_download_cutlists) self.filename = "" ### ### Convenience methods ### def setup(self, video_file): self.filename = video_file self.builder.get_object('label_file').set_markup("<b>%s</b>" % os.path.basename(video_file)) # looking for local cutlists p, filename = os.path.split(video_file) cutregex = re.compile("^" + filename + "\.?(.*).cutlist$") files = os.listdir(p) local_cutlists = [] for f in files: match = cutregex.match(f) if match: # print "Found local cutlist" local_cutlists.append(p + '/' + match.group()) else: # print f + " is no cutlist" pass # print "%d cutlists found" % len(local_cutlists) if len(local_cutlists) > 0: self.treeview_local_cutlists.get_model().clear() self.builder.get_object('scrolledwindow_local').set_sensitive(True) self.builder.get_object('button_local').set_sensitive(True) for c in local_cutlists: cutlist = cutlists_management.Cutlist() cutlist.local_filename = c cutlist.read_from_file() self.treeview_local_cutlists.add_cutlist(cutlist) else: self.builder.get_object('scrolledwindow_local').set_sensitive(False) self.builder.get_object('button_local').set_active(False) self.builder.get_object('button_local').set_sensitive(False) # start looking for downloadable cutlists self.treeview_download_cutlists.get_model().clear() self.builder.get_object('label_status').set_markup("<b>Cutlisten werden heruntergeladen...</b>") self.download_error = False GeneratorTask(cutlists_management.download_cutlists, None, self._completed).start(video_file, self.app.config.get('general', 'server'), self.app.config.get('general', 'choose_cutlists_by'), self.app.config.get('general', 'cutlist_mp4_as_hq'), self._error_cb, self._cutlist_found_cb) def _error_cb(self, error): print "Error: %s" % error self.builder.get_object('label_status').set_markup("<b>%s</b>" % error) self.download_error = True def _cutlist_found_cb(self, cutlist): # print "Found cutlist" self.add_cutlist(cutlist) def _completed(self): # print "Downloading cutlists completed. download_error = %r" % self.download_error if not self.download_error: self.builder.get_object('label_status').set_markup("") def add_cutlist(self, c): self.treeview_download_cutlists.add_cutlist(c) ### ### Signal handlers ### def _on_local_selection_changed(self, selection, data=None): model, paths = selection.get_selected_rows() if paths: self.builder.get_object('button_local').set_active(True) self.treeview_download_cutlists.get_selection().unselect_all() def _on_download_selection_changed(self, selection, data=None): model, paths = selection.get_selected_rows() if paths: self.builder.get_object('button_download').set_active(True) self.treeview_local_cutlists.get_selection().unselect_all() def on_button_ok_clicked(self, widget, data=None): if self.builder.get_object('button_local').get_active() == True: cutlist = self.treeview_local_cutlists.get_selected() if not cutlist: self.gui.message_error_box("Es wurde keine Cutlist ausgewählt!") return self.result = cutlist self.response(1) elif self.builder.get_object('button_download').get_active() == True: cutlist = self.treeview_download_cutlists.get_selected() if not cutlist: self.gui.message_error_box("Es wurde keine Cutlist ausgewählt!") return cutlist.download(self.app.config.get('general', 'server'), self.filename) self.result = cutlist self.response(1)
class AddDownloadDialog(gtk.Dialog, gtk.Buildable): __gtype_name__ = "AddDownloadDialog" def __init__(self): self.mode = 0 self.filename = "" def do_parser_finished(self, builder): self.builder = builder self.builder.connect_signals(self) self.cutlists_treeview = CutlistsTreeView() self.cutlists_treeview.show() self.cutlists_treeview.get_selection().connect("changed", self.treeview_cutlists_selection_changed) self.builder.get_object("scrolledwindow_cutlists").add(self.cutlists_treeview) animation = gtk.gdk.PixbufAnimation(path.get_image_path("spinner.gif")) self.builder.get_object("image_spinner").set_from_animation(animation) self.builder.get_object("image_spinner_download").set_from_animation(animation) selection = self.builder.get_object("treeview_programs").get_selection() selection.connect("changed", self.treeview_programs_selection_changed) def get_download_options(self): if self.builder.get_object("radiobutton_torrent").get_active(): return ("torrent",) else: link = self.builder.get_object("entry_link").get_text() if self.builder.get_object("checkbutton_cut").get_active(): cutlist_id = self.cutlists_treeview.get_selected().id return ("normal", "decodeandcut", link, cutlist_id) if self.builder.get_object("checkbutton_decode").get_active(): return ("normal", "decode", link) return ("normal", link) # # SEARCH # def search(self, text): try: html = urllib.urlopen("http://otrkeyfinder.com/?search=%s" % text).read() except IOError: yield "Verbindungsprobleme" return results = re.findall( r'title="(([^&]*)_([0-9\.]*)_([0-9-]*)_([^_]*)_([0-9]*)_TVOON_DE.mpg\.(avi|HQ\.avi|HD\.avi|mp4).otrkey)"[^\(]*>\(([0-9]*)\)', html, ) for result in results: filename, name, date, time, station, length, format, mirrors = result name = name.replace("_", " ") date = "%s.%s.20%s" % tuple(reversed(date.split("."))) time = time.replace("-", ":") station = station.capitalize() length = "%s min" % length yield [filename, name, station, date, time, format, length, int(mirrors)] def search_callback(self, row): model = self.builder.get_object("treeview_programs").get_model() if type(row) == str: self.error = row else: model.append(row) def search_stop(self): model = self.builder.get_object("treeview_programs").get_model() self.builder.get_object("scrolledwindow_programs").show() self.builder.get_object("vbox_searching").hide() self.builder.get_object("button_search").set_sensitive(True) if self.error: self.builder.get_object("label_status").set_markup("<b>%s</b>" % self.error) else: if len(model) == 1: self.builder.get_object("label_status").set_text("Es wurden eine Datei gefunden") else: self.builder.get_object("label_status").set_text("Es wurden %i Dateien gefunden" % len(model)) # # GATHER_INFORMATION # def forward(self, iter=None, link=None): """ iter==None --> programs search was skipped iter!=None --> iter is the selected program link!=None --> executable was called with 'link' argument """ self.mode = 1 # download self.builder.get_object("vbox_search").hide() self.builder.get_object("vbox_download").show() self.builder.get_object("button_ok").set_label("_Download") self.builder.get_object("button_ok").set_sensitive(True) if iter: self.filename, mirrors = self.builder.get_object("liststore_programs").get(iter, 0, 7) if mirrors == 1: self.builder.get_object("button_mirror_search").set_label("Auf einem Mirror suchen") else: self.builder.get_object("button_mirror_search").set_label("Auf %i Mirrors suchen" % mirrors) GeneratorTask( self.gather_information, self.gather_information_callback, self.gather_information_stop ).start() else: self.builder.get_object("image_spinner_download").hide() self.builder.get_object("button_mirror_search").hide() self.builder.get_object("label_torrent").set_markup("Download via Torrent") self.builder.get_object("label_error").set_markup("") if link: self.builder.get_object("entry_link").set_text(link) else: self.builder.get_object("label_download_status").set_markup("Füge einen Downloadlink in das Feld ein!") def gather_information(self): self.builder.get_object("image_spinner_download").show() self.builder.get_object("label_download_status").set_markup( "Es soll die Datei\n<b>%s</b>\nheruntergeladen werden." % self.filename ) self.cutlists_treeview.get_model().clear() without_otrkey = self.filename[:-7] # search for torrents torrent_filename = os.path.join(self.config.get("general", "folder_new_otrkeys"), self.filename + ".torrent") if not os.path.exists(torrent_filename): url = "http://81.95.11.2/torrents/" + self.filename + ".torrent" try: urllib.urlretrieve(url, torrent_filename) except IOError: yield "torrent_error", "Torrentdatei konnte nicht heruntergeladen werden (%s)!" # read filename torrent = lt.bdecode(open(torrent_filename, "rb").read()) info = lt.torrent_info(torrent) info_hash = str(info.info_hash()) try: result = scrape("http://81.95.11.2:8080/announce", [info_hash]) for hash, stats in result.iteritems(): yield "torrent", stats["seeds"], stats["peers"] except: yield "torrent_error", "Tracker konnte nicht erreicht werden" if os.path.isfile(torrent_filename): os.remove(torrent_filename) # search for cutlists error, cutlists_found = cutlists.download_cutlists( without_otrkey, self.config.get("general", "server"), 1, False ) if error: yield "cutlist_error", error else: yield "cutlist", cutlists_found def gather_information_callback(self, value, *args): # torrent if value == "torrent_error": self.builder.get_object("label_torrent").set_markup("Download via Torrent (<b>%s</b>)" % args[0]) elif value == "torrent": self.builder.get_object("label_torrent").set_markup( "Download via Torrent (<b>%i Seeder, %i Leecher</b>)" % args ) self.builder.get_object("radiobutton_torrent").set_sensitive(True) # cutlist elif value == "cutlist_error": self.builder.get_object("checkbutton_cut").set_sensitive(False) self.builder.get_object("label_error").set_markup("<b>%s</b>" % args[0]) elif value == "cutlist": if len(args[0]) == 0: self.builder.get_object("checkbutton_cut").set_sensitive(False) self.builder.get_object("label_error").set_markup("<b>Keine Cutlists gefunden</b>") else: self.builder.get_object("label_error").set_markup("") self.builder.get_object("checkbutton_cut").set_sensitive(True) for cutlist in args[0]: self.cutlists_treeview.add_cutlist(cutlist) def gather_information_stop(self): self.builder.get_object("image_spinner_download").hide() # # SIGNALS # def on_entry_link_changed(self, widget, data=None): download_link = widget.get_text() result = re.findall("([a-z._\-0-9]*_TVOON_DE[a-z0-9.]*\.otrkey)", download_link, re.IGNORECASE) if result: self.filename = result[0] GeneratorTask( self.gather_information, self.gather_information_callback, self.gather_information_stop ).start() else: pass def treeview_cutlists_selection_changed(self, treeselection, data=None): model, iter = treeselection.get_selected() if iter: self.builder.get_object("checkbutton_cut").set_active(True) def treeview_programs_selection_changed(self, treeselection, data=None): model, iter = treeselection.get_selected() self.builder.get_object("button_ok").set_sensitive(iter != None) def on_button_search_clicked(self, widget, data=None): text = self.builder.get_object("entry_search").get_text() if len(text) < 3: self.builder.get_object("label_status").set_markup("<b>Die Suche muss mindesten 3 Zeichen haben!</b>") return else: for char in text: if not char.lower() in "abcdefghijklmnopqrstuvwxyz0123456789.-_ *": self.builder.get_object("label_status").set_markup( "<b>Erlaubt sind nur Groß- und Kleinbuchstaben, die Ziffern 0 bis 9, der Punkt, das Minus, der Unterstrich und der Stern/Leerzeichen als Platzhalter!</b>" ) return self.builder.get_object("label_status").set_markup("") model = self.builder.get_object("liststore_programs") model.clear() self.builder.get_object("scrolledwindow_programs").hide() self.builder.get_object("vbox_searching").show() self.builder.get_object("button_search").set_sensitive(False) self.error = "" GeneratorTask(self.search, self.search_callback, self.search_stop).start(text) def on_treeview_programs_row_activated(self, treeview, path, view_column, data=None): iter = treeview.get_model().get_iter(path) self.forward(iter) def on_checkbutton_cut_toggled(self, widget, data=None): if widget.get_active(): self.builder.get_object("checkbutton_decode").set_active(True) def on_radiobutton_torrent_toggled(self, widget, data=None): self.builder.get_object("box_normal").set_sensitive(not widget.get_active()) def on_button_mirror_search_clicked(self, widget, data=None): subprocess.call(["xdg-open", "http://otrkeyfinder.com/?search=%s" % self.filename]) def on_button_cancel_clicked(self, widget, data=None): self.response(-6) def on_button_ok_clicked(self, widget, data=None): if self.mode == 0: # search for files selection = self.builder.get_object("treeview_programs").get_selection() model, iter = selection.get_selected() self.forward(iter) else: # actual download if self.builder.get_object("radiobutton_normal").get_active(): if not self.builder.get_object("entry_link").get_text(): self.gui.message_error_box("Es ist kein Download-Link eingetragen!") return if self.builder.get_object("checkbutton_cut").get_active(): if not self.cutlists_treeview.get_selected(): self.gui.message_error_box("Es ist keine Cutlist ausgewählt!") return self.response(-5)
class CutDialog(gtk.Dialog, gtk.Buildable): """ Dialog, um den Schnittmodus constants.Cut_action und ggf die Cutlist auszuwählen """ __gtype_name__ = "CutDialog" def __init__(self): pass def do_parser_finished(self, builder): self.builder = builder self.builder.connect_signals(self) self.chosen_cutlist = None self.treeview_cutlists = CutlistsTreeView() self.treeview_cutlists.show() self.treeview_cutlists.get_selection().connect('changed', self._on_selection_changed) self.builder.get_object('scrolledwindow_cutlists').add(self.treeview_cutlists) self.filename = "" ### ### Convenience methods ### def setup(self, video_file, folder_cut_avis, cut_action_ask): self.filename = video_file self.builder.get_object('label_file').set_markup("<b>%s</b>" % basename(video_file)) self.builder.get_object('label_warning').set_markup('<span size="small">Wichtig! Um eine Cutlist zu erstellen muss das Projekt im Ordner %s gespeichert werden (siehe Website->Einstieg->Funktionen). OTR-Verwaltung schneidet die Datei dann automatisch.</span>' % folder_cut_avis) if cut_action_ask: self.builder.get_object('radio_best_cutlist').set_active(True) else: self.builder.get_object('radio_choose_cutlist').set_active(True) # looking for a local cutlist filename_cutlist = video_file + ".cutlist" if exists(filename_cutlist): self.builder.get_object('label_cutlist').set_markup("<b>%s</b>" % filename_cutlist) self.builder.get_object('radio_local_cutlist').set_sensitive(True) else: self.builder.get_object('label_cutlist').set_markup("Keine lokale Cutlist gefunden.") self.builder.get_object('radio_local_cutlist').set_sensitive(False) # start looking for cutlists self.treeview_cutlists.get_model().clear() self.builder.get_object('label_status').set_markup("<b>Cutlisten werden heruntergeladen...</b>") def add_cutlist(self, c): self.treeview_cutlists.add_cutlist(c) ### ### Signal handlers ### def _on_radio_manually_toggled(self, widget, data=None): self.builder.get_object('button_show_cuts').set_sensitive(not widget.get_active()) def _on_radio_best_cutlist_toggled(self, widget, data=None): self.builder.get_object('button_show_cuts').set_sensitive(not widget.get_active()) def _on_button_show_cuts_clicked(self, widget, data=None): cutlist = cutlists_management.Cutlist() if self.builder.get_object('radio_local_cutlist').get_active(): cutlist.local_filename = self.builder.get_object('label_cutlist').get_text() else: cutlist = self.treeview_cutlists.get_selected() if not cutlist: self.gui.message_error_box("Es wurde keine Cutlist ausgewählt!") return error = cutlist.download(self.app.config.get('general', 'server'), self.filename) if error: self.gui.message_error_box(error) return self.app.show_cuts(self.filename, cutlist) # delete cutlist fileoperations.remove_file(cutlist.local_filename) def _on_selection_changed(self, selection, data=None): model, paths = selection.get_selected_rows() if paths: self.builder.get_object('radio_choose_cutlist').set_active(True) def _on_buttonCutOK_clicked(self, widget, data=None): if self.builder.get_object('radio_best_cutlist').get_active() == True: self.response(Cut_action.BEST_CUTLIST) elif self.builder.get_object('radio_choose_cutlist').get_active() == True: cutlist = self.treeview_cutlists.get_selected() if not cutlist: self.gui.message_error_box("Es wurde keine Cutlist ausgewählt!") return self.chosen_cutlist = cutlist self.response(Cut_action.CHOOSE_CUTLIST) elif self.builder.get_object('radio_local_cutlist').get_active() == True: self.response(Cut_action.LOCAL_CUTLIST) else: self.response(Cut_action.MANUALLY)
class LoadCutDialog(Gtk.Dialog, Gtk.Buildable): """ Dialog, um Cutlists lokal oder von cutlist.at zu laden """ __gtype_name__ = "LoadCutDialog" def __init__(self): Gtk.Dialog.__init__(self) self.log = logging.getLogger(self.__class__.__name__) self.download_error = False self.cutlists_list = [] self.download_first_try = True def do_parser_finished(self, builder): self.log.debug("Function start") self.builder = builder self.builder.connect_signals(self) self.chosen_cutlist = None self.treeview_local_cutlists = CutlistsTreeView() self.treeview_local_cutlists.show() self.treeview_local_cutlists.get_selection().connect( 'changed', self._on_local_selection_changed) self.builder.get_object('scrolledwindow_local').add( self.treeview_local_cutlists) self.treeview_download_cutlists = CutlistsTreeView() self.treeview_download_cutlists.show() self.treeview_download_cutlists.get_selection().connect( 'changed', self._on_download_selection_changed) self.builder.get_object('scrolledwindow_download').add( self.treeview_download_cutlists) self.filename = "" ### ### Convenience methods ### def setup(self, video_file): self.filename = video_file self.builder.get_object('label_file').set_markup( "<b>%s</b>" % os.path.basename(video_file)) # looking for local cutlists p, filename = os.path.split(video_file) cutregex = re.compile("^" + filename + "\.?(.*).cutlist$") files = os.listdir(p) local_cutlists = [] for f in files: match = cutregex.match(f) if match: local_cutlists.append(p + '/' + match.group()) else: pass if len(local_cutlists) > 0: self.treeview_local_cutlists.get_model().clear() self.builder.get_object('scrolledwindow_local').set_sensitive(True) self.builder.get_object('button_local').set_sensitive(True) for c in local_cutlists: cutlist = cutlists_management.Cutlist() cutlist.local_filename = c cutlist.read_from_file() self.cutlists_list.append(cutlist) # ~ self.treeview_local_cutlists.add_cutlist(cutlist) ## Sorting -> self.cutlists_list.sort(key=lambda x: x.quality, reverse=False) for cutlist_obj in self.cutlists_list: self.treeview_local_cutlists.add_cutlist(cutlist_obj) ## <- Sorting else: self.builder.get_object('scrolledwindow_local').set_sensitive( False) self.builder.get_object('button_local').set_active(False) self.builder.get_object('button_local').set_sensitive(False) self.download_generator(False) def download_generator(self, get_all_qualities): # start looking for downloadable cutlists self.treeview_download_cutlists.get_model().clear() self.builder.get_object('label_status').set_markup( "<b>Cutlisten werden heruntergeladen...</b>") self.download_error = False # Empty the list for reuse self.cutlists_list = [] GeneratorTask(cutlists_management.download_cutlists, None, self._completed).\ start(self.filename, self.app.config.get('general', 'server'), self.app.config.get('general', 'choose_cutlists_by'), self.app.config.get('general', 'cutlist_mp4_as_hq'), self._error_cb, self._cutlist_found_cb, get_all_qualities) def _error_cb(self, error): if error == "Keine Cutlists gefunden" and self.download_first_try: self.download_first_try = False self.builder.get_object('label_status').set_markup( "<b>%s</b>" % error + ". Versuche es mit allen Qualitäten") self.download_generator(True) else: self.builder.get_object('label_status').set_markup("<b>%s</b>" % error) self.download_error = True self.download_first_try = True def _cutlist_found_cb(self, cutlist): ## Sorting # ~ self.add_cutlist(cutlist) self.cutlists_list.append(cutlist) def _completed(self): if not self.download_error: ## Sorting -> self.cutlists_list.sort(key=lambda x: x.quality, reverse=False) for cutlist_obj in self.cutlists_list: self.add_cutlist(cutlist_obj) ## <- Sorting self.builder.get_object('label_status').set_markup("") def add_cutlist(self, c): self.treeview_download_cutlists.add_cutlist(c) ### ### Signal handlers ### def _on_local_selection_changed(self, selection, data=None): model, paths = selection.get_selected_rows() if paths: self.builder.get_object('button_local').set_active(True) self.treeview_download_cutlists.get_selection().unselect_all() def _on_download_selection_changed(self, selection, data=None): model, paths = selection.get_selected_rows() if paths: self.builder.get_object('button_download').set_active(True) self.treeview_local_cutlists.get_selection().unselect_all() def on_button_ok_clicked(self, widget, data=None): if self.builder.get_object('button_local').get_active() == True: cutlist = self.treeview_local_cutlists.get_selected() if not cutlist: self.gui.message_error_box( "Es wurde keine Cutlist ausgewählt!") return self.result = cutlist self.response(1) elif self.builder.get_object('button_download').get_active() == True: cutlist = self.treeview_download_cutlists.get_selected() if not cutlist: self.gui.message_error_box( "Es wurde keine Cutlist ausgewählt!") return cutlist.download(self.app.config.get('general', 'server'), self.filename) self.result = cutlist self.response(1)