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: item = self.getSelectedItem() self.player.play_item(item)
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)
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 = "ArchivCZSK" + " - " + _("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() video_item = PVideo() video_item.name = download.name video_item.url = download.local subpath = os.path.splitext(download.local)[0] + '.srt' if os.path.isfile(subpath): video_item.subs = subpath self.player.play_item(video_item) 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)
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)
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)