Ejemplo n.º 1
0
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 ->
    """
Ejemplo n.º 2
0
    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 = ""
Ejemplo n.º 3
0
    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 = ""
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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 = ""
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
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)
Ejemplo n.º 13
0
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)
Ejemplo n.º 14
0
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)