Пример #1
0
    def play(self, session, item, mode, player_callback=None):
        #debug props
        #try:
        #    props = ""
        #    for property, value in vars(item).iteritems():
        #        props = props + ("%s : %s\n"%(property,value))
        #    log.logDebug(props)
        #except:
        #    log.logError("iter items failed.\n%s"%traceback.format_exc())
        #    pass

        self.player = Player(session, player_callback, self)
        if mode in self.capabilities:
            if mode == 'play':
                try:
                    self.player.play_item(item)
                except:
                    traceback.print_exc()
            elif mode == 'play_and_download':
                try:
                    self.play_and_download(session, item, "auto",
                                           player_callback)
                except:
                    traceback.print_exc()
        else:
            log.error('Invalid playing mode - %s', str(mode))
Пример #2
0
    def __init__(self, session, name, content_provider):
        BaseArchivCZSKMenuListScreen.__init__(self, session, panelList=PanelListDownload)
        DownloadList.__init__(self)
        self.name = name
        self.content_provider = content_provider
        from Plugins.Extensions.archivCZSK.engine.player.player import Player
        self.player = Player(session, self.workingFinished)
        self.sort_options = [{'id':'az', 'name':_('Sort alphabetically')},
                             {'id':'date', 'name':_('Sort by date')},
                             {'id':'size', 'name':_('Sort by size')},
                             {'id':'state', 'name':_('Sort by state')}]
        self.sort_current = self.sort_options[0]
        self.sort_next = self.sort_options[1]
        self.lst_items = self.content_provider.get_downloads()

        self["key_red"] = Button(_("Remove"))
        self["key_green"] = Button("")
        self["key_yellow"] = Button(self.sort_next['name'])
        self["key_blue"] = Button("")
        self.title = self.name.encode('utf-8', 'ignore') + ' - ' + (_("Downloads"))

        self["actions"] = NumberActionMap(["archivCZSKActions"],
            {
                "ok": self.ok,
                "cancel": self.cancel,
                "red": self.askRemoveDownload,
                "yellow": self.toggleSort,
                "up": self.up,
                "down": self.down,
            }, -2)

        self.onLayoutFinish.append(self.sortList)
        self.onShown.append(self.setWindowTitle)
Пример #3
0
    def __init__(self, session):
        BaseArchivCZSKMenuListScreen.__init__(self, session)
        ArchivCZSKDownloadListScreen.instance = self
        self["key_red"] = Button(_("Cancel"))
        self["key_green"] = Button(_("Play"))
        self["key_yellow"] = Button(_("Remove"))
        self["key_blue"] = Button("")

        from Plugins.Extensions.archivCZSK.engine.player.player import Player
        self.player = Player(session, self.workingFinished)

        self.lst_items = []
        self.title = "ArchivyCZSK" + " - " + _("Recent downloads")
        self.onClose.append(self.__onClose)

        self["actions"] = NumberActionMap(["archivCZSKActions"],
            {
                "ok": self.ok,
                "cancel": self.cancel,
                "red": self.askCancelDownload,
                "green": self.askPlayDownload,
                "yellow": self.askRemoveDownload,
                "up": self.up,
                "down": self.down,
            }, -2)

        self.lst_items = DownloadManager.getInstance().download_lst
        self.onShown.append(self.setWindowTitle)
Пример #4
0
    def __init__(self, session, name, content_provider):
        BaseArchivCZSKMenuListScreen.__init__(self, session, panelList=PanelListDownload)
        DownloadList.__init__(self)
        self.name = name
        self.content_provider = content_provider
        from Plugins.Extensions.archivCZSK.engine.player.player import Player
        self.player = Player(session, self.workingFinished)
        self.sort_options = [{'id':'az', 'name':_('Sort alphabetically')},
                             {'id':'date', 'name':_('Sort by date')},
                             {'id':'size', 'name':_('Sort by size')},
                             {'id':'state', 'name':_('Sort by state')}]
        self.sort_current = self.sort_options[0]
        self.sort_next = self.sort_options[1]
        self.lst_items = self.content_provider.get_downloads()

        self["key_red"] = Button(_("Remove"))
        self["key_green"] = Button("")
        self["key_yellow"] = Button(self.sort_next['name'])
        self["key_blue"] = Button("")
        self.title = self.name.encode('utf-8', 'ignore') + ' - ' + (_("Downloads"))

        self["actions"] = NumberActionMap(["archivCZSKActions"],
            {
                "ok": self.ok,
                "cancel": self.cancel,
                "red": self.askRemoveDownload,
                "yellow": self.toggleSort,
                "up": self.up,
                "down": self.down,
            }, -2)

        self.onLayoutFinish.append(self.sortList)
        self.onShown.append(self.setWindowTitle)
Пример #5
0
    def __init__(self, session):
        BaseArchivCZSKMenuListScreen.__init__(self, session)
        DownloadListScreen.instance = self
        self["key_red"] = Button(_("Cancel"))
        self["key_green"] = Button(_("Play"))
        self["key_yellow"] = Button(_("Remove"))
        self["key_blue"] = Button("")

        from Plugins.Extensions.archivCZSK.engine.player.player import Player
        self.player = Player(session, self.workingFinished)

        self.lst_items = []
        self.title = "ArchivyCZSK" + " - " + _("Recent downloads")
        self.onClose.append(self.__onClose)

        self["actions"] = NumberActionMap(["archivCZSKActions"],
            {
                "ok": self.ok,
                "cancel": self.cancel,
                "red": self.askCancelDownload,
                "green": self.askPlayDownload,
                "yellow": self.askRemoveDownload,
                "up": self.up,
                "down": self.down,
            }, -2)

        self.lst_items = DownloadManager.getInstance().download_lst
        self.onShown.append(self.setWindowTitle)
Пример #6
0
 def play(self, session, item, mode, player_callback=None):
     self.player = Player(session, player_callback, self)
     if mode in self.capabilities:
         if mode == 'play':
             self.handle_substitles_and_play(item)
             #try:
             #    self.player.play_item(item)
             #except:
             #    traceback.print_exc()
         elif mode == 'play_and_download':
             try:
                 self.play_and_download(session, item, "auto", player_callback)
             except:
                 traceback.print_exc()
     else:
         log.error('Invalid playing mode - %s', str(mode))
Пример #7
0
 def play(self, session, item, mode, player_callback=None):
     self.player = Player(session, player_callback, self)
     if mode in self.capabilities:
         if mode == 'play':
             self.handle_substitles_and_play(item)
             #try:
             #    self.player.play_item(item)
             #except:
             #    traceback.print_exc()
         elif mode == 'play_and_download':
             try:
                 self.play_and_download(session, item, "auto", player_callback)
             except:
                 traceback.print_exc()
     else:
         log.error('Invalid playing mode - %s', str(mode))
Пример #8
0
class PlayMixin(object):
    def __init__(self, allowed_download=True):
        self.player = None
        self.capabilities.append('play')
        if allowed_download:
            self.capabilities.append('play_and_download')

    def play(self, session, item, mode, player_callback=None):
        self.player = Player(session, player_callback, self)
        if mode in self.capabilities:
            if mode == 'play':
                self.handle_substitles_and_play(item)
                #try:
                #    self.player.play_item(item)
                #except:
                #    traceback.print_exc()
            elif mode == 'play_and_download':
                try:
                    self.play_and_download(session, item, "auto",
                                           player_callback)
                except:
                    traceback.print_exc()
        else:
            log.error('Invalid playing mode - %s', str(mode))

    def handle_substitles_and_play(self, item):
        def check_download(self, data, retval, extra_args):
            self.__console = None
            log.logDebug(
                "Handle subs check download finish... retval=%s, fname=%s" %
                (retval, fname))
            if retval == 0 and os.path.exists(fname):
                item.subs = fname
            self.player.play_item(item)

        try:
            subs = ''
            if not isinstance(item, PPlaylist) and hasattr(item, 'subs'):
                subs = "%s" % item.subs
            if subs.startswith('http'):
                spl = subs.split('/')
                fname = os.path.join(
                    config.plugins.archivCZSK.tmpPath.getValue(),
                    spl[len(spl) - 1])
                try:

                    download_web_file(subs, fname)
                    item.subs = fname
                    self.player.play_item(item)
                except urllib2.URLError:  #SSL cert problem
                    if subs.startswith('https:\\'):  # only for https
                        log.logDebug(
                            "Handle substitle file failed (try download by CURL).\n%s"
                            % traceback.format_exc())
                        # download file by CURL
                        self.__console = Console()
                        self.__console.ePopen(
                            'curl -kfo %s %s' % (fname, subs), check_download)
                    else:
                        log.logError("Handle substitle file failed.\n%s" %
                                     traceback.format_exc())
                        self.player.play_item(item)
                except:
                    log.logError("Handle substitle file failed.\n%s" %
                                 traceback.format_exc())
                    self.player.play_item(item)
            else:
                self.player.play_item(item)
        except:
            log.logError("Handle substitle file failed.\n%s" %
                         traceback.format_exc())
            self.player.play_item(item)

    def play_and_download(self,
                          session,
                          item,
                          mode,
                          player_callback=None,
                          prefill_buffer=20 * 1024 * 1024):
        def stop_etimer():
            if len(etimer):
                etimer[0].stop()
                del etimer[1]
                del etimer[0]

        def play_video_callback(callback=None):
            if callback != "error":
                stop_etimer()
                download_obj[0].onFinishCB.remove(finish_download_callback)
                download_obj[0].onFinishCB.append(
                    DownloadManagerMessages.finishDownloadCB)
                video_item = PVideo()
                video_item.name = item.name
                video_item.url = download_obj[0].local
                # TODO subs should point to local path download to path where is movie
                video_item.subs = item.subs
                self.player.play_item(video_item)

        def check_prefill_state():
            status = download_obj[0].status
            status.update(1)
            size_kb = util.BtoKB(status.currentLength)
            prefill_buffer_kb = util.BtoKB(prefill_buffer)
            percent = size_kb / float(prefill_buffer_kb) * 100
            speed_kbs = util.BtoKB(status.speed)
            if size_kb < prefill_buffer_kb:
                messagebox[0]["text"].setText(
                    "%s\n\n%s: %dKB/%dKB (%d%%) %dKB/s\n\n%s" %
                    (_("Please wait until enough data is downloaded for fluent playback"
                       ), _("Bufferring"), size_kb, prefill_buffer_kb, percent,
                     speed_kbs,
                     _("You can press any key to stop pre-buffering and start immediately"
                       )))
                etimer[0].start(1000, True)
            else:
                messagebox[0].close()

        def start_download_callback(download):
            download_obj.append(download)
            messagebox.append(
                session.openWithCallback(play_video_callback,
                                         MessageBox,
                                         "",
                                         MessageBox.TYPE_INFO,
                                         close_on_any_key=True))
            etimer.append(eTimer())
            etimer.append(
                eConnectCallback(etimer[0].timeout, check_prefill_state))
            etimer[0].start(1000, True)

        def finish_download_callback(download):
            stop_etimer()
            if not download.downloaded:
                messagebox[0].close("error")
                DownloadManagerMessages.finishDownloadCB(download)
                player_callback and player_callback()
            else:
                messagebox[0].close()

        def do_play_and_download():
            self.download(session,
                          item,
                          start_callback=start_download_callback,
                          finish_callback=finish_download_callback,
                          player_callback=player_callback,
                          mode=mode)

        def ask_if_play_and_download_callback(answer):
            if answer:
                do_play_and_download()
            else:
                player_callback and player_callback()

        download_obj = []
        etimer = []
        messagebox = []

        message = "%s%s\n\n%s" % (
            _("Play and download mode is not supported by all video formats."),
            _("Player can start to behave unexpectedly or no to play video at all."
              ), _("Do yo want to continue?"))
        session.openWithCallback(ask_if_play_and_download_callback, MessageBox,
                                 message, MessageBox.TYPE_YESNO)
Пример #9
0
class DownloadsScreen(BaseArchivCZSKMenuListScreen, DownloadList):
    instance = None
    def __init__(self, session, name, content_provider):
        BaseArchivCZSKMenuListScreen.__init__(self, session, panelList=PanelListDownload)
        DownloadList.__init__(self)
        self.name = name
        self.content_provider = content_provider
        from Plugins.Extensions.archivCZSK.engine.player.player import Player
        self.player = Player(session, self.workingFinished)
        self.sort_options = [{'id':'az', 'name':_('Sort alphabetically')},
                             {'id':'date', 'name':_('Sort by date')},
                             {'id':'size', 'name':_('Sort by size')},
                             {'id':'state', 'name':_('Sort by state')}]
        self.sort_current = self.sort_options[0]
        self.sort_next = self.sort_options[1]
        self.lst_items = self.content_provider.get_downloads()

        self["key_red"] = Button(_("Remove"))
        self["key_green"] = Button("")
        self["key_yellow"] = Button(self.sort_next['name'])
        self["key_blue"] = Button("")
        self.title = self.name.encode('utf-8', 'ignore') + ' - ' + (_("Downloads"))

        self["actions"] = NumberActionMap(["archivCZSKActions"],
            {
                "ok": self.ok,
                "cancel": self.cancel,
                "red": self.askRemoveDownload,
                "yellow": self.toggleSort,
                "up": self.up,
                "down": self.down,
            }, -2)

        self.onLayoutFinish.append(self.sortList)
        self.onShown.append(self.setWindowTitle)

    def setWindowTitle(self):
        self.setTitle(self.title)

    def refreshList(self, sort=False):
        if not sort:
            self.lst_items = self.content_provider.get_downloads()
        self.updateMenuList()

    def askRemoveDownload(self):
        if len(self.lst_items) > 0:
            download = self.getSelectedItem()
            self.session.openWithCallback(self.removeDownload, MessageBox, _('Do you want to remove') \
                                          + ' ' + download.name.encode('utf-8', 'ignore') + ' ?', type=MessageBox.TYPE_YESNO)

    def removeDownload(self, callback=None):
        if callback:
            self.content_provider.remove_download(self.getSelectedItem())
            self.refreshList()

    def toggleSort(self):
        next_idx = self.sort_options.index(self.sort_next)
        self.sort_current = self.sort_next

        if  next_idx == len(self.sort_options) - 1:
            self.sort_next = self.sort_options[0]
        else:
            self.sort_next = self.sort_options[next_idx + 1]

        self["key_yellow"].setText(self.sort_next['name'])

        self.sortList()

    def sortList(self):
        if self.sort_current['id'] == 'az':
            self.lst_items.sort(key=lambda d:d.name)
        elif self.sort_current['id'] == 'size':
            self.lst_items.sort(key=lambda d:d.size)
        elif self.sort_current['id'] == 'state':
            self.lst_items.sort(key=lambda d:d.state)
        elif self.sort_current['id'] == 'date':
            self.lst_items.sort(key=lambda d:d.finish_time)
        self.refreshList(True)


    def updateMenuList(self):
        menu_list = []
        for idx, x in enumerate(self.lst_items):
            menu_list.append(PanelListDownloadListEntry(x))
        self["menu"].setList(menu_list)

    def ok(self):
        if not self.working and len(self.lst_items) > 0:
            it = self.getSelectedItem()
            download = DownloadManager.getInstance().findDownloadByIT(it)
            if download is not None and download.running:
                self.player.playDownload(download)
            else:
                self.player.setMediaItem(it)
                self.player.play()
Пример #10
0
class DownloadListScreen(BaseArchivCZSKMenuListScreen):
    instance = None
    def __init__(self, session):
        BaseArchivCZSKMenuListScreen.__init__(self, session)
        DownloadListScreen.instance = self
        self["key_red"] = Button(_("Cancel"))
        self["key_green"] = Button(_("Play"))
        self["key_yellow"] = Button(_("Remove"))
        self["key_blue"] = Button("")

        from Plugins.Extensions.archivCZSK.engine.player.player import Player
        self.player = Player(session, self.workingFinished)

        self.lst_items = []
        self.title = "ArchivyCZSK" + " - " + _("Recent downloads")
        self.onClose.append(self.__onClose)

        self["actions"] = NumberActionMap(["archivCZSKActions"],
            {
                "ok": self.ok,
                "cancel": self.cancel,
                "red": self.askCancelDownload,
                "green": self.askPlayDownload,
                "yellow": self.askRemoveDownload,
                "up": self.up,
                "down": self.down,
            }, -2)

        self.lst_items = DownloadManager.getInstance().download_lst
        self.onShown.append(self.setWindowTitle)

    def __onClose(self):
        DownloadListScreen.instance = None

    def setWindowTitle(self):
        self.setTitle(self.title)

    def refreshList(self):
        self.lst_items = DownloadManager.getInstance().download_lst
        self.updateMenuList()


    def askCancelDownload(self):
        if len(self.lst_items) > 0:
            download = self.getSelectedItem()
            self.session.openWithCallback(self.cancelDownload, MessageBox, _('Do you want to cancel') + ' '\
                                           + download.name.encode('utf-8', 'ignore') + ' ?', type=MessageBox.TYPE_YESNO)

    def cancelDownload(self, callback=None):
        if callback:
            download = self.getSelectedItem()
            DownloadManager.getInstance().cancelDownload(download)
            self.refreshList()

    def askRemoveDownload(self):
        if len(self.lst_items) > 0:
            download = self.getSelectedItem()
            self.session.openWithCallback(self.removeDownload, MessageBox, _('Do you want to remove') + ' '\
                                           + download.name.encode('utf-8', 'ígnore') + _('from disk') + ' ?', type=MessageBox.TYPE_YESNO)

    def removeDownload(self, callback=None):
        if callback:
            download = self.getSelectedItem()
            DownloadManager.getInstance().removeDownload(download)
            self.refreshList()

    def askPlayDownload(self):
        if len(self.lst_items) > 0:
            self.workingStarted()
            download = self.getSelectedItem()
            if download.downloaded or not download.running:
                self.playDownload(True)
            else:
                message = '%s %s %s' % (_("The file"), download.name.encode('utf-8', 'ígnore'), _('is not downloaded yet. Do you want to play it anyway?'))
                self.session.openWithCallback(self.playDownload, MessageBox, message, type=MessageBox.TYPE_YESNO)


    def playDownload(self, callback=None):
        if callback:
            download = self.getSelectedItem()
            self.player.playDownload(download)
        else:
            self.workingFinished()

    def updateMenuList(self):
        menu_list = []
        for idx, x in enumerate(self.lst_items):
            menu_list.append(PanelListDownloadEntry(x.name, x))
        self["menu"].setList(menu_list)

    def ok(self):
        if  len(self.lst_items) > 0:
            download = self.getSelectedItem()
            self.session.openWithCallback(self.workingFinished, DownloadStatusScreen, download)
Пример #11
0
class ArchivCZSKDownloadsScreen(BaseArchivCZSKMenuListScreen, DownloadList):
    instance = None
    def __init__(self, session, name, content_provider):
        BaseArchivCZSKMenuListScreen.__init__(self, session, panelList=PanelListDownload)
        DownloadList.__init__(self)
        self.name = name
        self.content_provider = content_provider
        from Plugins.Extensions.archivCZSK.engine.player.player import Player
        self.player = Player(session, self.workingFinished)
        self.sort_options = [{'id':'az', 'name':_('Sort alphabetically')},
                             {'id':'date', 'name':_('Sort by date')},
                             {'id':'size', 'name':_('Sort by size')},
                             {'id':'state', 'name':_('Sort by state')}]
        self.sort_current = self.sort_options[0]
        self.sort_next = self.sort_options[1]
        self.lst_items = self.content_provider.get_downloads()

        self["key_red"] = Button(_("Remove"))
        self["key_green"] = Button("")
        self["key_yellow"] = Button(self.sort_next['name'])
        self["key_blue"] = Button("")
        self.title = self.name.encode('utf-8', 'ignore') + ' - ' + (_("Downloads"))

        self["actions"] = NumberActionMap(["archivCZSKActions"],
            {
                "ok": self.ok,
                "cancel": self.cancel,
                "red": self.askRemoveDownload,
                "yellow": self.toggleSort,
                "up": self.up,
                "down": self.down,
            }, -2)

        self.onLayoutFinish.append(self.sortList)
        self.onShown.append(self.setWindowTitle)

    def setWindowTitle(self):
        self.setTitle(self.title)

    def refreshList(self, sort=False):
        if not sort:
            self.lst_items = self.content_provider.get_downloads()
        self.updateMenuList()

    def askRemoveDownload(self):
        if len(self.lst_items) > 0:
            download = self.getSelectedItem()
            self.session.openWithCallback(self.removeDownload, MessageBox, _('Do you want to remove') \
                                          + ' ' + download.name.encode('utf-8', 'ignore') + ' ?', type=MessageBox.TYPE_YESNO)

    def removeDownload(self, callback=None):
        if callback:
            self.content_provider.remove_download(self.getSelectedItem())
            self.refreshList()

    def toggleSort(self):
        next_idx = self.sort_options.index(self.sort_next)
        self.sort_current = self.sort_next

        if  next_idx == len(self.sort_options) - 1:
            self.sort_next = self.sort_options[0]
        else:
            self.sort_next = self.sort_options[next_idx + 1]

        self["key_yellow"].setText(self.sort_next['name'])

        self.sortList()

    def sortList(self):
        if self.sort_current['id'] == 'az':
            self.lst_items.sort(key=lambda d:d.name)
        elif self.sort_current['id'] == 'size':
            self.lst_items.sort(key=lambda d:d.size)
        elif self.sort_current['id'] == 'state':
            self.lst_items.sort(key=lambda d:d.state)
        elif self.sort_current['id'] == 'date':
            self.lst_items.sort(key=lambda d:d.finish_time)
        self.refreshList(True)


    def updateMenuList(self):
        menu_list = []
        for idx, x in enumerate(self.lst_items):
            menu_list.append(PanelListDownloadListEntry(x))
        self["menu"].setList(menu_list)

    def ok(self):
        if not self.working and len(self.lst_items) > 0:
            it = self.getSelectedItem()
            download = DownloadManager.getInstance().findDownloadByIT(it)
            if download is not None and download.running:
                self.player.playDownload(download)
            else:
                self.player.setMediaItem(it)
                self.player.play()
Пример #12
0
class ArchivCZSKDownloadListScreen(BaseArchivCZSKMenuListScreen):
    instance = None
    def __init__(self, session):
        BaseArchivCZSKMenuListScreen.__init__(self, session)
        ArchivCZSKDownloadListScreen.instance = self
        self["key_red"] = Button(_("Cancel"))
        self["key_green"] = Button(_("Play"))
        self["key_yellow"] = Button(_("Remove"))
        self["key_blue"] = Button("")

        from Plugins.Extensions.archivCZSK.engine.player.player import Player
        self.player = Player(session, self.workingFinished)

        self.lst_items = []
        self.title = "ArchivyCZSK" + " - " + _("Recent downloads")
        self.onClose.append(self.__onClose)

        self["actions"] = NumberActionMap(["archivCZSKActions"],
            {
                "ok": self.ok,
                "cancel": self.cancel,
                "red": self.askCancelDownload,
                "green": self.askPlayDownload,
                "yellow": self.askRemoveDownload,
                "up": self.up,
                "down": self.down,
            }, -2)

        self.lst_items = DownloadManager.getInstance().download_lst
        self.onShown.append(self.setWindowTitle)

    def __onClose(self):
        ArchivCZSKDownloadListScreen.instance = None

    def setWindowTitle(self):
        self.setTitle(self.title)

    def refreshList(self):
        self.lst_items = DownloadManager.getInstance().download_lst
        self.updateMenuList()


    def askCancelDownload(self):
        if len(self.lst_items) > 0:
            download = self.getSelectedItem()
            self.session.openWithCallback(self.cancelDownload, MessageBox, _('Do you want to cancel') + ' '\
                                           + download.name.encode('utf-8', 'ignore') + ' ?', type=MessageBox.TYPE_YESNO)

    def cancelDownload(self, callback=None):
        if callback:
            download = self.getSelectedItem()
            DownloadManager.getInstance().cancelDownload(download)
            self.refreshList()

    def askRemoveDownload(self):
        if len(self.lst_items) > 0:
            download = self.getSelectedItem()
            self.session.openWithCallback(self.removeDownload, MessageBox, _('Do you want to remove') + ' '\
                                           + download.name.encode('utf-8', 'ígnore') + _('from disk') + ' ?', type=MessageBox.TYPE_YESNO)

    def removeDownload(self, callback=None):
        if callback:
            download = self.getSelectedItem()
            DownloadManager.getInstance().removeDownload(download)
            self.refreshList()

    def askPlayDownload(self):
        if len(self.lst_items) > 0:
            self.workingStarted()
            download = self.getSelectedItem()
            if download.downloaded or not download.running:
                self.playDownload(True)
            else:
                message = '%s %s %s' % (_("The file"), download.name.encode('utf-8', 'ígnore'), _('is not downloaded yet. Do you want to play it anyway?'))
                self.session.openWithCallback(self.playDownload, MessageBox, message, type=MessageBox.TYPE_YESNO)


    def playDownload(self, callback=None):
        if callback:
            download = self.getSelectedItem()
            self.player.playDownload(download)
        else:
            self.workingFinished()

    def updateMenuList(self):
        menu_list = []
        for idx, x in enumerate(self.lst_items):
            menu_list.append(PanelListDownloadEntry(x.name, x))
        self["menu"].setList(menu_list)

    def ok(self):
        if  len(self.lst_items) > 0:
            download = self.getSelectedItem()
            self.session.openWithCallback(self.workingFinished, ArchivCZSKDownloadStatusScreen, download)
Пример #13
0
class PlayMixin(object):
    def __init__(self, allowed_download=True):
        self.player = None
        self.capabilities.append('play')
        if allowed_download:
            self.capabilities.append('play_and_download')

    def play(self, session, item, mode, player_callback=None):
        import traceback
        self.player = Player(session, player_callback, self)
        if mode in self.capabilities:
            if mode == 'play':
                try:
                    self.player.play_item(item)
                except:
                    traceback.print_exc()
            elif mode == 'play_and_download':
                try:
                    self.play_and_download(session, item, "auto",
                                           player_callback)
                except:
                    traceback.print_exc()
        else:
            log.error('Invalid playing mode - %s', str(mode))

    def play_and_download(self,
                          session,
                          item,
                          mode,
                          player_callback=None,
                          prefill_buffer=20 * 1024 * 1024):
        def stop_etimer():
            if len(etimer):
                etimer[0].stop()
                del etimer[1]
                del etimer[0]

        def play_video_callback(callback=None):
            if callback != "error":
                stop_etimer()
                download_obj[0].onFinishCB.remove(finish_download_callback)
                download_obj[0].onFinishCB.append(
                    DownloadManagerMessages.finishDownloadCB)
                video_item = PVideo()
                video_item.name = item.name
                video_item.url = download_obj[0].local
                # TODO subs should point to local path
                video_item.subs = item.subs
                self.player.play_item(video_item)

        def check_prefill_state():
            status = download_obj[0].status
            status.update(1)
            size_kb = util.BtoKB(status.currentLength)
            prefill_buffer_kb = util.BtoKB(prefill_buffer)
            percent = size_kb / float(prefill_buffer_kb) * 100
            speed_kbs = util.BtoKB(status.speed)
            if size_kb < prefill_buffer_kb:
                messagebox[0]["text"].setText(
                    "%s\n\n%s: %dKB/%dKB (%d%%) %dKB/s\n\n%s" %
                    (_("Please wait until enough data is downloaded for fluent playback"
                       ), _("Bufferring"), size_kb, prefill_buffer_kb, percent,
                     speed_kbs,
                     _("You can press any key to stop pre-buffering and start immediately"
                       )))
                etimer[0].start(1000, True)
            else:
                messagebox[0].close()

        def start_download_callback(download):
            download_obj.append(download)
            messagebox.append(
                session.openWithCallback(play_video_callback,
                                         MessageBox,
                                         "",
                                         MessageBox.TYPE_INFO,
                                         close_on_any_key=True))
            etimer.append(eTimer())
            etimer.append(
                eConnectCallback(etimer[0].timeout, check_prefill_state))
            etimer[0].start(1000, True)

        def finish_download_callback(download):
            stop_etimer()
            if not download.downloaded:
                messagebox[0].close("error")
                DownloadManagerMessages.finishDownloadCB(download)
                player_callback and player_callback()
            else:
                messagebox[0].close()

        def do_play_and_download():
            self.download(session,
                          item,
                          start_callback=start_download_callback,
                          finish_callback=finish_download_callback,
                          player_callback=player_callback,
                          mode=mode)

        def ask_if_play_and_download_callback(answer):
            if answer:
                do_play_and_download()
            else:
                player_callback and player_callback()

        download_obj = []
        etimer = []
        messagebox = []

        message = "%s%s\n\n%s" % (
            _("Play and download mode is not supported by all video formats."),
            _("Player can start to behave unexpectedly or no to play video at all."
              ), _("Do yo want to continue?"))
        session.openWithCallback(ask_if_play_and_download_callback, MessageBox,
                                 message, MessageBox.TYPE_YESNO)
Пример #14
0
class PlayMixin(object):
    def __init__(self, allowed_download=True):
        self.player = None
        self.capabilities.append('play')
        if allowed_download:
            self.capabilities.append('play_and_download')

    def play(self, session, item, mode, player_callback=None):
        self.player = Player(session, player_callback, self)
        if mode in self.capabilities:
            if mode == 'play':
                self.handle_substitles_and_play(item)
                #try:
                #    self.player.play_item(item)
                #except:
                #    traceback.print_exc()
            elif mode == 'play_and_download':
                try:
                    self.play_and_download(session, item, "auto", player_callback)
                except:
                    traceback.print_exc()
        else:
            log.error('Invalid playing mode - %s', str(mode))

    def handle_substitles_and_play(self, item):
        def check_download(self, data, retval, extra_args):
            self.__console = None
            log.logDebug("Handle subs check download finish... retval=%s, fname=%s"%(retval, fname))
            if retval == 0 and os.path.exists(fname):
                item.subs = fname
            self.player.play_item(item)

        try:
            subs = ''
            if not isinstance(item, PPlaylist) and hasattr(item, 'subs'):
                subs = "%s"%item.subs
            if subs.startswith('http'):
                spl = subs.split('/')
                fname = os.path.join(config.plugins.archivCZSK.tmpPath.getValue(), spl[len(spl)-1])
                try:
                            
                    download_web_file(subs, fname)
                    item.subs = fname
                    self.player.play_item(item)
                except urllib2.URLError: #SSL cert problem
                    if subs.startswith('https:\\'): # only for https
                        log.logDebug("Handle substitle file failed (try download by CURL).\n%s"%traceback.format_exc())
                        # download file by CURL
                        self.__console = Console()
                        self.__console.ePopen('curl -kfo %s %s' % (fname, subs), check_download)
                    else:
                        log.logError("Handle substitle file failed.\n%s"%traceback.format_exc())
                        self.player.play_item(item)
                except:
                    log.logError("Handle substitle file failed.\n%s"%traceback.format_exc())
                    self.player.play_item(item)
            else:
                self.player.play_item(item)
        except:
            log.logError("Handle substitle file failed.\n%s"%traceback.format_exc())
            self.player.play_item(item)



    def play_and_download(self, session, item, mode, player_callback=None, prefill_buffer=20*1024*1024):

        def stop_etimer():
            if len(etimer):
                etimer[0].stop()
                del etimer[1]
                del etimer[0]

        def play_video_callback(callback=None):
            if callback != "error":
                stop_etimer()
                download_obj[0].onFinishCB.remove(finish_download_callback)
                download_obj[0].onFinishCB.append(DownloadManagerMessages.finishDownloadCB)
                video_item = PVideo()
                video_item.name = item.name
                video_item.url = download_obj[0].local
                # TODO subs should point to local path download to path where is movie
                video_item.subs = item.subs
                self.player.play_item(video_item)

        def check_prefill_state():
            status = download_obj[0].status
            status.update(1)
            size_kb = util.BtoKB(status.currentLength)
            prefill_buffer_kb = util.BtoKB(prefill_buffer)
            percent = size_kb / float(prefill_buffer_kb) * 100
            speed_kbs = util.BtoKB(status.speed)
            if size_kb < prefill_buffer_kb:
                messagebox[0]["text"].setText("%s\n\n%s: %dKB/%dKB (%d%%) %dKB/s\n\n%s"%(
                    _("Please wait until enough data is downloaded for fluent playback"),
                    _("Bufferring"), size_kb, prefill_buffer_kb, percent, speed_kbs,
                    _("You can press any key to stop pre-buffering and start immediately")))
                etimer[0].start(1000, True)
            else:
                messagebox[0].close()

        def start_download_callback(download):
            download_obj.append(download)
            messagebox.append(session.openWithCallback(
                    play_video_callback, MessageBox, "",
                    MessageBox.TYPE_INFO, close_on_any_key=True))
            etimer.append(eTimer())
            etimer.append(eConnectCallback(etimer[0].timeout, check_prefill_state))
            etimer[0].start(1000, True)

        def finish_download_callback(download):
            stop_etimer()
            if not download.downloaded:
                messagebox[0].close("error")
                DownloadManagerMessages.finishDownloadCB(download)
                player_callback and player_callback()
            else:
                messagebox[0].close()

        def do_play_and_download():
            self.download(session, item,
                    start_callback=start_download_callback,
                    finish_callback=finish_download_callback,
                    player_callback = player_callback,
                    mode = mode)

        def ask_if_play_and_download_callback(answer):
            if answer:
                do_play_and_download()
            else:
                player_callback and player_callback()

        download_obj = []
        etimer       = []
        messagebox   = []

        message = "%s%s\n\n%s"%(
                _("Play and download mode is not supported by all video formats."),
                _("Player can start to behave unexpectedly or no to play video at all."),
                _("Do yo want to continue?"))
        session.openWithCallback(ask_if_play_and_download_callback, MessageBox,
                message, MessageBox.TYPE_YESNO)