class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarNotifications, HelpableScreen): ALLOW_SUSPEND = True def __init__(self, session, args=None): Screen.__init__(self, session) InfoBarAudioSelection.__init__(self) InfoBarNotifications.__init__(self) InfoBarBase.__init__(self) HelpableScreen.__init__(self) self.summary = None self.oldService = self.session.nav.getCurrentlyPlayingServiceReference() self.session.nav.stopService() self.playlistparsers = {} self.addPlaylistParser(PlaylistIOM3U, "m3u") self.addPlaylistParser(PlaylistIOPLS, "pls") self.addPlaylistParser(PlaylistIOInternal, "e2pls") self.title = 'MediaPlayer2' # 'None' is magic to start at the list of mountpoints defaultDir = config.plugins.mediaplayer2.defaultDir.getValue() self.filelist = FileList(defaultDir, matchingPattern="(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|m2ts|avi|divx|mkv|mp4|m4a|dat|flac|rec)", useServiceRef=True, additionalExtensions="4098:m3u 4098:e2pls 4098:pls") self["filelist"] = self.filelist self.playlist = MyPlayList() self.is_closing = False self.MoviePlayerOpen = False self.delname = "" self["playlist"] = self.playlist self["PositionGauge"] = ServicePositionGauge(self.session.nav) self["currenttext"] = Label("") self["artisttext"] = Label(_("Artist") + ':') self["artist"] = Label("") self["titletext"] = Label(_("Title") + ':') self["title"] = Label("") self["albumtext"] = Label(_("Album") + ':') self["album"] = Label("") self["yeartext"] = Label(_("Year") + ':') self["year"] = Label("") self["genretext"] = Label(_("Genre") + ':') self["genre"] = Label("") self["coverArt"] = MediaPixmap() self["repeat"] = MultiPixmap() self.seek_target = None hotplugNotifier.append(self.hotplugCB) class MoviePlayerActionMap(NumberActionMap): def __init__(self, player, contexts=[ ], actions={ }, prio=0): NumberActionMap.__init__(self, contexts, actions, prio) self.player = player def action(self, contexts, action): self.player.show() return NumberActionMap.action(self, contexts, action) self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", { "ok": (self.ok, _("add file to playlist")), "cancel": (self.exit, _("exit mediaplayer")), }, -2) self["MediaPlayerActions"] = HelpableActionMap(self, "MediaPlayerActions", { "csfd": (self.csfd, _("show csfd info")), "play": (self.xplayEntry, _("play entry")), "pause": (self.pauseEntry, _("pause")), "stop": (self.stopEntry, _("stop entry")), "previous": (self.previousEntry, _("play from previous playlist entry")), "next": (self.nextEntry, _("play from next playlist entry")), "menu": (self.showMenu, _("menu")), "skipListbegin": (self.skip_listbegin, _("jump to listbegin")), "skipListend": (self.skip_listend, _("jump to listend")), "prevBouquet": (self.switchToPlayList, _("switch to playlist")), "nextBouquet": (self.switchToFileList, _("switch to filelist")), "delete": (self.deletePlaylistEntry, _("delete playlist entry")), "shift_stop": (self.clear_playlist, _("clear playlist")), "shift_record": (self.playlist.PlayListShuffle, _("shuffle playlist")), }, -2) self["InfobarEPGActions"] = HelpableActionMap(self, "InfobarEPGActions", { "showEventInfo": (self.showEventInformation, _("show event details")), }) self["actions"] = MoviePlayerActionMap(self, ["DirectionActions"], { "right": self.rightDown, "rightRepeated": self.doNothing, "rightUp": self.rightUp, "left": self.leftDown, "leftRepeated": self.doNothing, "leftUp": self.leftUp, "up": self.up, "upRepeated": self.up, "upUp": self.doNothing, "down": self.down, "downRepeated": self.down, "downUp": self.doNothing, }, -2) InfoBarSeek.__init__(self, actionmap="MediaPlayerSeekActions") self.onShown.append(self.setWindowTitle) self.onClose.append(self.delMPTimer) self.onClose.append(self.__onClose) self.righttimer = False self.rightKeyTimer = eTimer() self.rightKeyTimer.callback.append(self.rightTimerFire) self.lefttimer = False self.leftKeyTimer = eTimer() self.leftKeyTimer.callback.append(self.leftTimerFire) self.currList = "filelist" self.isAudioCD = False self.AudioCD_albuminfo = {} self.savePlaylistOnExit = False self.cdAudioTrackFiles = [] self.applySettings() self.bookmarks = config.movielist.videodirs self.playlistIOInternal = PlaylistIOInternal() list = self.playlistIOInternal.open(resolveFilename(SCOPE_CONFIG, "playlist.e2pls")) if list: for x in list: self.playlist.addFile(x.ref) self.playlist.updateList() self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { iPlayableService.evUpdatedInfo: self.__evUpdatedInfo, iPlayableService.evUser + 10: self.__evAudioDecodeError, iPlayableService.evUser + 11: self.__evVideoDecodeError, iPlayableService.evUser + 12: self.__evPluginError, iPlayableService.evUser + 13: self["coverArt"].embeddedCoverArt }) def doNothing(self): pass def setWindowTitle(self): self.setTitle(self.title) def createSummary(self): return MediaPlayerLCDScreen def exit(self): if self.savePlaylistOnExit and not config.plugins.mediaplayer2.savePlaylistOnExit.getValue(): self.savePlaylistOnExit = False if config.plugins.mediaplayer2.askOnExit.getValue(): if not self.savePlaylistOnExit: self.session.openWithCallback(self.exitCB, MessageBox, _("Do you really want to exit?"), timeout=5) else: list = [] list.append((_("No"), "no")) list.append((_("Yes"), "yes")) self.session.openWithCallback(self.exitCBsave, ChoiceBox, title=_("save playlist before exit?"), list=list) else: self.exitCB(True) def exitCB(self, answer): if answer == True: self.playlistIOInternal.clear() if self.savePlaylistOnExit: print "save playlist" for x in self.playlist.list: self.playlistIOInternal.addService(ServiceReference(x[0])) self.playlistIOInternal.save(resolveFilename(SCOPE_CONFIG, "playlist.e2pls")) if config.plugins.mediaplayer2.saveDirOnExit.getValue(): config.plugins.mediaplayer2.defaultDir.setValue(self.filelist.getCurrentDirectory()) config.plugins.mediaplayer2.defaultDir.save() hotplugNotifier.remove(self.hotplugCB) del self["coverArt"].picload self.close() def exitCBsave(self, answer): if answer is not None: if answer[1] == "no": self.savePlaylistOnExit = False self.exitCB(True) def checkSkipShowHideLock(self): self.updatedSeekState() def doEofInternal(self, playing): print "--- eofint mediaplayer---" if playing: if not self.MoviePlayerOpen: self.nextEntry() else: self.show() def __onClose(self): self.session.nav.playService(self.oldService) def __evUpdatedInfo(self): currPlay = self.session.nav.getCurrentService() currenttitle = currPlay.info().getInfo(iServiceInformation.sCurrentTitle) totaltitles = currPlay.info().getInfo(iServiceInformation.sTotalTitles) sTagTitle = currPlay.info().getInfoString(iServiceInformation.sTagTitle) print "[__evUpdatedInfo] title %d of %d (%s)" % (currenttitle, totaltitles, sTagTitle) self.readTitleInformation() def __evAudioDecodeError(self): currPlay = self.session.nav.getCurrentService() sAudioType = currPlay.info().getInfoString(iServiceInformation.sUser + 10) print "[__evAudioDecodeError] audio-codec %s can't be decoded by hardware" % (sAudioType) self.session.open(MessageBox, _("This Dreambox can't decode %s streams!") % sAudioType, type=MessageBox.TYPE_INFO, timeout=20) def __evVideoDecodeError(self): currPlay = self.session.nav.getCurrentService() sVideoType = currPlay.info().getInfoString(iServiceInformation.sVideoType) print "[__evVideoDecodeError] video-codec %s can't be decoded by hardware" % (sVideoType) self.session.open(MessageBox, _("This Dreambox can't decode %s streams!") % sVideoType, type=MessageBox.TYPE_INFO, timeout=20) def __evPluginError(self): currPlay = self.session.nav.getCurrentService() message = currPlay.info().getInfoString(iServiceInformation.sUser + 12) print "[__evPluginError]" , message self.session.open(MessageBox, message, type=MessageBox.TYPE_INFO, timeout=20) def delMPTimer(self): del self.rightKeyTimer del self.leftKeyTimer def readTitleInformation(self): currPlay = self.session.nav.getCurrentService() if currPlay is not None: sTagTitle = currPlay.info().getInfoString(iServiceInformation.sTagTitle) sTagAlbum = currPlay.info().getInfoString(iServiceInformation.sTagAlbum) sTagGenre = currPlay.info().getInfoString(iServiceInformation.sTagGenre) sTagArtist = currPlay.info().getInfoString(iServiceInformation.sTagArtist) sYear = currPlay.info().getInfoString(iServiceInformation.sTimeCreate) if sTagTitle == "": if not self.isAudioCD: sTagTitle = currPlay.info().getName().split('/')[-1] else: sTagTitle = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()].getName() if self.AudioCD_albuminfo: if sTagAlbum == "" and "title" in self.AudioCD_albuminfo: sTagAlbum = self.AudioCD_albuminfo["title"] if sTagGenre == "" and "genre" in self.AudioCD_albuminfo: sTagGenre = self.AudioCD_albuminfo["genre"] if sTagArtist == "" and "artist" in self.AudioCD_albuminfo: sTagArtist = self.AudioCD_albuminfo["artist"] if "year" in self.AudioCD_albuminfo: sYear = self.AudioCD_albuminfo["year"] self.updateMusicInformation(sTagArtist, sTagTitle, sTagAlbum, sYear, sTagGenre, clear=True) else: self.updateMusicInformation() def updateMusicInformation(self, artist="", title="", album="", year="", genre="", clear=False): self.updateSingleMusicInformation("artist", artist, clear) self.updateSingleMusicInformation("title", title, clear) self.updateSingleMusicInformation("album", album, clear) self.updateSingleMusicInformation("year", year, clear) self.updateSingleMusicInformation("genre", genre, clear) def updateSingleMusicInformation(self, name, info, clear): if info != "" or clear: if self[name].getText() != info: self[name].setText(info) def leftDown(self): self.lefttimer = False self.leftKeyTimer.start(10) def rightDown(self): self.righttimer = False self.rightKeyTimer.start(10) def leftUp(self): if self.lefttimer: self.leftKeyTimer.stop() self.lefttimer = False self[self.currList].pageUp() self.updateCurrentInfo() def rightUp(self): if self.righttimer: self.rightKeyTimer.stop() self.righttimer = False self[self.currList].pageDown() self.updateCurrentInfo() def leftTimerFire(self): self.leftKeyTimer.stop() self.lefttimer = False self.switchToFileList() def rightTimerFire(self): self.rightKeyTimer.stop() self.righttimer = False self.switchToPlayList() def switchToFileList(self): self.currList = "filelist" self.filelist.selectionEnabled(1) self.playlist.selectionEnabled(0) self.updateCurrentInfo() def switchToPlayList(self): if len(self.playlist) != 0: self.currList = "playlist" self.filelist.selectionEnabled(0) self.playlist.selectionEnabled(1) self.updateCurrentInfo() def up(self): self[self.currList].up() self.updateCurrentInfo() def down(self): self[self.currList].down() self.updateCurrentInfo() def showAfterSeek(self): self.show() def showAfterCuesheetOperation(self): self.show() def hideAfterResume(self): self.hide() def getIdentifier(self, ref): if self.isAudioCD: return ref.getName() else: text = ref.getPath() return text.split('/')[-1] # FIXME: maybe this code can be optimized def updateCurrentInfo(self): text = "" if self.currList == "filelist": idx = self.filelist.getSelectionIndex() r = self.filelist.list[idx] text = r[1][7] if r[0][1] == True: if len(text) < 2: text += " " if text[:2] != "..": text = "/" + text self.summaries.setText(text, 1) idx += 1 if idx < len(self.filelist.list): r = self.filelist.list[idx] text = r[1][7] if r[0][1] == True: text = "/" + text self.summaries.setText(text, 3) else: self.summaries.setText(" ", 3) idx += 1 if idx < len(self.filelist.list): r = self.filelist.list[idx] text = r[1][7] if r[0][1] == True: text = "/" + text self.summaries.setText(text, 4) else: self.summaries.setText(" ", 4) text = "" if not self.filelist.canDescent(): r = self.filelist.getServiceRef() if r is None: return text = r.getPath() self["currenttext"].setText(os_path.basename(text)) if self.currList == "playlist": t = self.playlist.getSelection() if t is None: return #display current selected entry on LCD text = self.getIdentifier(t) self.summaries.setText(text, 1) self["currenttext"].setText(text) idx = self.playlist.getSelectionIndex() idx += 1 if idx < len(self.playlist): currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) self.summaries.setText(text, 3) else: self.summaries.setText(" ", 3) idx += 1 if idx < len(self.playlist): currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) self.summaries.setText(text, 4) else: self.summaries.setText(" ", 4) def ok(self): if self.currList == "filelist": if self.filelist.canDescent(): self.filelist.descent() self.updateCurrentInfo() else: self.copyFile() if self.currList == "playlist": selection = self["playlist"].getSelection() self.changeEntry(self.playlist.getSelectionIndex()) def showMenu(self): menu = [] if len(self.cdAudioTrackFiles): menu.insert(0, (_("Play Audio-CD..."), "audiocd")) if self.currList == "filelist": #menu.append((_("add selection after current playing"), "addAfterCurrent")) if self.filelist.canDescent(): menu.append((_("add directory to playlist"), "copydir")) else: menu.append((_("add files to playlist"), "copyfiles")) menu.append((_("switch to playlist"), "playlist")) else: menu.append((_("switch to filelist"), "filelist")) menu.append((_("clear playlist"), "clear")) menu.append((_("Delete entry"), "deleteentry")) if config.usage.setup_level.index >= 1: # intermediate+ menu.append((_("shuffle playlist"), "shuffle")) if pathExists("/usr/lib/enigma2/python/Plugins/Extensions/PicturePlayer/"): menu.append((_("PicturePlayer"), "PicturePlayer")); if config.usage.setup_level.index >= 1: # intermediate+ menu.append((_("delete file"), "deletefile")) menu.append((_("hide player"), "hide")); menu.append((_("load playlist"), "loadplaylist")); if config.usage.setup_level.index >= 1: # intermediate+ menu.append((_("save playlist"), "saveplaylist")); menu.append((_("delete saved playlist"), "deleteplaylist")); menu.append((_("Edit settings"), "settings")) menu.append((_("add/remove bookmarks (locationbox)"), "locationbox")) if self.currList == "filelist": menu.append((_("---------------------- bookmarks -------------------"), "line")) for x in self.bookmarks.value: menu.append((x, x)) self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu) def menuCallback(self, choice): if choice is None: return if choice[1] == "copydir": self.savePlaylistOnExit = True self.copyDirectory(self.filelist.getSelection()[0]) elif choice[1] == "copyfiles": self.stopEntry() self.playlist.clear() self.savePlaylistOnExit = True self.isAudioCD = False self.copyDirectory(os_path.dirname(self.filelist.getSelection()[0].getPath()) + "/", recursive=False) self.playServiceRefEntry(self.filelist.getServiceRef()) elif choice[1] == "addAfterCurrent": self.copyFileAfterCurrentPlaying() elif choice[1] == "playlist": self.switchToPlayList() elif choice[1] == "filelist": self.switchToFileList() elif choice[1] == "deleteentry": if self.playlist.getSelectionIndex() == self.playlist.getCurrentIndex(): self.stopEntry() self.deleteEntry() elif choice[1] == "clear": self.clear_playlist() elif choice[1] == "hide": self.hide() elif choice[1] == "saveplaylist": self.save_playlist() elif choice[1] == "loadplaylist": self.load_playlist() elif choice[1] == "deleteplaylist": self.delete_saved_playlist() elif choice[1] == "shuffle": self.playlist.PlayListShuffle() elif choice[1] == "PicturePlayer": from Plugins.Extensions.PicturePlayer.plugin import picshow self.session.open(picshow) elif choice[1] == "deletefile": self.deleteFile() elif choice[1] == "settings": self.session.openWithCallback(self.applySettings, MediaPlayerSettings, self) elif choice[1] == "audiocd": self.playAudioCD() elif choice[1] == "locationbox": self.doPathSelect() elif choice[1] == "line": print "--- bookmark ---" else: print "bookmark: ", choice[1] self.filelist.changeDir(choice[1]) def doPathSelect(self): self.session.openWithCallback(self.gotPath, LocationBox, _("Please select the path..."), currDir=self.filelist.getCurrentDirectory(), bookmarks=config.movielist.videodirs) def gotPath(self, res): if res is not None: self.filelist.changeDir(res) def playAudioCD(self): from enigma import eServiceReference from Plugins.Extensions.CDInfo.plugin import Query if len(self.cdAudioTrackFiles): self.playlist.clear() self.savePlaylistOnExit = False self.isAudioCD = True for file in self.cdAudioTrackFiles: ref = eServiceReference(4097, 0, file) self.playlist.addFile(ref) cdinfo = Query(self) cdinfo.scan() self.changeEntry(0) self.switchToPlayList() def applySettings(self): if config.plugins.mediaplayer2.repeat.getValue() == True: self["repeat"].setPixmapNum(1) else: self["repeat"].setPixmapNum(0) def showEventInformation(self): from Screens.EventView import EventViewSimple from ServiceReference import ServiceReference evt = self[self.currList].getCurrentEvent() if evt: self.session.open(EventViewSimple, evt, ServiceReference(self.getCurrent())) # also works on filelist (?) def getCurrent(self): return self["playlist"].getCurrent() def deletePlaylistEntry(self): if self.currList == "playlist": if self.playlist.getSelectionIndex() == self.playlist.getCurrentIndex(): self.stopEntry() self.deleteEntry() def skip_listbegin(self): if self.currList == "filelist": self.filelist.moveToIndex(0) else: self.playlist.moveToIndex(0) self.updateCurrentInfo() def skip_listend(self): if self.currList == "filelist": idx = len(self.filelist.list) self.filelist.moveToIndex(idx - 1) else: self.playlist.moveToIndex(len(self.playlist) - 1) self.updateCurrentInfo() def save_playlist(self): self.session.openWithCallback(self.save_playlist2, InputBox, title=_("Please enter filename (empty = use current date)"), windowTitle=_("Save Playlist")) def save_playlist2(self, name): if name is not None: name = name.strip() if name == "": name = strftime("%y%m%d_%H%M%S") name += ".e2pls" self.playlistIOInternal.clear() for x in self.playlist.list: self.playlistIOInternal.addService(ServiceReference(x[0])) self.playlistIOInternal.save(resolveFilename(SCOPE_PLAYLIST) + name) def load_playlist(self): listpath = [] playlistdir = resolveFilename(SCOPE_PLAYLIST) try: for i in os_listdir(playlistdir): listpath.append((i, playlistdir + i)) except IOError, e: print "Error while scanning subdirs ", e self.session.openWithCallback(self.PlaylistSelected, ChoiceBox, title=_("Please select a playlist..."), list=listpath)
class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarScreenSaver, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport, HelpableScreen): ALLOW_SUSPEND = True ENABLE_RESUME_SUPPORT = True def __init__(self, session, args=None): Screen.__init__(self, session) InfoBarAudioSelection.__init__(self) InfoBarCueSheetSupport.__init__(self, actionmap="MediaPlayerCueSheetActions") InfoBarNotifications.__init__(self) InfoBarBase.__init__(self) InfoBarScreenSaver.__init__(self) InfoBarSubtitleSupport.__init__(self) HelpableScreen.__init__(self) self.summary = None self.oldService = self.session.nav.getCurrentlyPlayingServiceReference( ) self.session.nav.stopService() self.playlistparsers = {} self.addPlaylistParser(PlaylistIOM3U, "m3u") self.addPlaylistParser(PlaylistIOPLS, "pls") self.addPlaylistParser(PlaylistIOInternal, "e2pls") # 'None' is magic to start at the list of mountpoints defaultDir = config.mediaplayer.defaultDir.value self.filelist = FileList( defaultDir, matchingPattern= "(?i)^.*\.(mp2|mp3|ogg|ts|mts|m2ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|flv|mov|dts|3gp|3g2|asf|wmv|wma|webm)", useServiceRef=True, additionalExtensions="4098:m3u 4098:e2pls 4098:pls") self["filelist"] = self.filelist self.playlist = MyPlayList() self.is_closing = False self.delname = "" self.playlistname = "" self["playlist"] = self.playlist self["PositionGauge"] = ServicePositionGauge(self.session.nav) self["currenttext"] = Label("") self["artisttext"] = Label(_("Artist") + ':') self["artist"] = Label("") self["titletext"] = Label(_("Title") + ':') self["title"] = Label("") self["albumtext"] = Label(_("Album") + ':') self["album"] = Label("") self["yeartext"] = Label(_("Year") + ':') self["year"] = Label("") self["genretext"] = Label(_("Genre") + ':') self["genre"] = Label("") self["coverArt"] = MediaPixmap() self["repeat"] = MultiPixmap() self.seek_target = None try: from Plugins.SystemPlugins.Hotplug.plugin import hotplugNotifier hotplugNotifier.append(self.hotplugCB) except Exception as ex: print("[MediaPlayer] No hotplug support", ex) class MoviePlayerActionMap(NumberActionMap): def __init__(self, player, contexts=None, actions=None, prio=0): if not contexts: contexts = [] if not actions: actions = {} NumberActionMap.__init__(self, contexts, actions, prio) self.player = player def action(self, contexts, action): self.player.show() return NumberActionMap.action(self, contexts, action) self["OkCancelActions"] = HelpableActionMap( self, "OkCancelActions", { "ok": (self.ok, _("Add file to playlist")), "cancel": (self.exit, _("Exit mediaplayer")), }, -2) self["MediaPlayerActions"] = HelpableActionMap( self, "MediaPlayerActions", { "play": (self.xplayEntry, _("Play entry")), "pause": (self.pauseEntry, _("Pause")), "stop": (self.stopEntry, _("Stop entry")), "previous": (self.previousMarkOrEntry, _("Play from previous mark or playlist entry")), "next": (self.nextMarkOrEntry, _("Play from next mark or playlist entry")), "menu": (self.showMenu, _("Menu")), "skipListbegin": (self.skip_listbegin, _("Jump to beginning of list")), "skipListend": (self.skip_listend, _("Jump to end of list")), "prevBouquet": (self.switchLists, _("Switch between filelist/playlist")), "nextBouquet": (self.switchLists, _("Switch between filelist/playlist")), "delete": (self.deletePlaylistEntry, _("Delete playlist entry")), "shift_stop": (self.clear_playlist, _("Clear playlist")), "shift_record": (self.playlist.PlayListShuffle, _("Shuffle playlist")), "subtitles": (self.subtitleSelection, _("Subtitle selection")), }, -2) self["InfobarEPGActions"] = HelpableActionMap( self, "InfobarEPGActions", { "showEventInfo": (self.showEventInformation, _("show event details")), }) self["actions"] = MoviePlayerActionMap( self, ["DirectionActions"], { "right": self.rightDown, "rightRepeated": self.doNothing, "rightUp": self.rightUp, "left": self.leftDown, "leftRepeated": self.doNothing, "leftUp": self.leftUp, "up": self.up, "upRepeated": self.up, "upUp": self.doNothing, "down": self.down, "downRepeated": self.down, "downUp": self.doNothing, }, -2) InfoBarSeek.__init__(self, actionmap="MediaPlayerSeekActions") self.onClose.append(self.delMPTimer) self.onClose.append(self.__onClose) self.righttimer = False self.rightKeyTimer = eTimer() self.rightKeyTimer.callback.append(self.rightTimerFire) self.lefttimer = False self.leftKeyTimer = eTimer() self.leftKeyTimer.callback.append(self.leftTimerFire) self.currList = "filelist" self.isAudioCD = False self.AudioCD_albuminfo = {} self.cdAudioTrackFiles = [] self.onShown.append(self.applySettings) self.playlistIOInternal = PlaylistIOInternal() list = self.playlistIOInternal.open( resolveFilename(SCOPE_CONFIG, "playlist.e2pls")) if list: for x in list: self.playlist.addFile(x.ref) self.playlist.updateList() self.__event_tracker = ServiceEventTracker( screen=self, eventmap={ iPlayableService.evUpdatedInfo: self.__evUpdatedInfo, iPlayableService.evUser + 10: self.__evAudioDecodeError, iPlayableService.evUser + 11: self.__evVideoDecodeError, iPlayableService.evUser + 12: self.__evPluginError, iPlayableService.evUser + 13: self["coverArt"].embeddedCoverArt }) def hideAndInfoBar(self): self.hide() self.mediaPlayerInfoBar.show() if config.mediaplayer.alwaysHideInfoBar.value or self.ext not in AUDIO_EXTENSIONS and not self.isAudioCD: self.hideMediaPlayerInfoBar.start(5000, True) def timerHideMediaPlayerInfoBar(self): self.hideMediaPlayerInfoBar.stop() self.mediaPlayerInfoBar.hide() def doNothing(self): pass def createSummary(self): return MediaPlayerLCDScreen def exit(self): self.playlistIOInternal.clear() for x in self.playlist.list: self.playlistIOInternal.addService(ServiceReference(x[0])) if self.savePlaylistOnExit: try: self.playlistIOInternal.save( resolveFilename(SCOPE_CONFIG, "playlist.e2pls")) except IOError: print("couldn't save playlist.e2pls") if config.mediaplayer.saveDirOnExit.value: config.mediaplayer.defaultDir.setValue( self.filelist.getCurrentDirectory()) config.mediaplayer.defaultDir.save() try: from Plugins.SystemPlugins.Hotplug.plugin import hotplugNotifier hotplugNotifier.remove(self.hotplugCB) except: pass del self["coverArt"].picload self.close() def checkSkipShowHideLock(self): self.updatedSeekState() def doEofInternal(self, playing): if playing: self.nextEntry() else: self.show() def __onClose(self): self.session.nav.playService(self.oldService) def __evUpdatedInfo(self): currPlay = self.session.nav.getCurrentService() sTagTrackNumber = currPlay.info().getInfo( iServiceInformation.sTagTrackNumber) sTagTrackCount = currPlay.info().getInfo( iServiceInformation.sTagTrackCount) sTagTitle = currPlay.info().getInfoString( iServiceInformation.sTagTitle) print("[__evUpdatedInfo] title %d of %d (%s)" % (sTagTrackNumber, sTagTrackCount, sTagTitle)) self.readTitleInformation() def __evAudioDecodeError(self): currPlay = self.session.nav.getCurrentService() sTagAudioCodec = currPlay.info().getInfoString( iServiceInformation.sTagAudioCodec) print( "[__evAudioDecodeError] audio-codec %s can't be decoded by hardware" % sTagAudioCodec) self.session.open( MessageBox, _("This %s %s cannot decode %s streams!") % (getMachineBrand(), getMachineName(), sTagAudioCodec), type=MessageBox.TYPE_INFO, timeout=20) def __evVideoDecodeError(self): currPlay = self.session.nav.getCurrentService() sTagVideoCodec = currPlay.info().getInfoString( iServiceInformation.sTagVideoCodec) print( "[__evVideoDecodeError] video-codec %s can't be decoded by hardware" % sTagVideoCodec) self.session.open( MessageBox, _("This %s %s cannot decode %s streams!") % (getMachineBrand(), getMachineName(), sTagVideoCodec), type=MessageBox.TYPE_INFO, timeout=20) def __evPluginError(self): currPlay = self.session.nav.getCurrentService() message = currPlay.info().getInfoString(iServiceInformation.sUser + 12) print("[__evPluginError]", message) self.session.open(MessageBox, message, type=MessageBox.TYPE_INFO, timeout=20) def delMPTimer(self): del self.rightKeyTimer del self.leftKeyTimer def readTitleInformation(self): currPlay = self.session.nav.getCurrentService() if currPlay is not None: sTitle = currPlay.info().getInfoString( iServiceInformation.sTagTitle) sAlbum = currPlay.info().getInfoString( iServiceInformation.sTagAlbum) sGenre = currPlay.info().getInfoString( iServiceInformation.sTagGenre) sArtist = currPlay.info().getInfoString( iServiceInformation.sTagArtist) sYear = currPlay.info().getInfoString(iServiceInformation.sTagDate) if sTitle == "": if not self.isAudioCD: sTitle = currPlay.info().getName().split('/')[-1] else: sTitle = self.playlist.getServiceRefList()[ self.playlist.getCurrentIndex()].getName() if self.AudioCD_albuminfo: if sAlbum == "" and "title" in self.AudioCD_albuminfo: sAlbum = self.AudioCD_albuminfo["title"] if sGenre == "" and "genre" in self.AudioCD_albuminfo: sGenre = self.AudioCD_albuminfo["genre"] if sArtist == "" and "artist" in self.AudioCD_albuminfo: sArtist = self.AudioCD_albuminfo["artist"] if "year" in self.AudioCD_albuminfo: sYear = self.AudioCD_albuminfo["year"] self.updateMusicInformation(sArtist, sTitle, sAlbum, sYear, sGenre, clear=True) else: self.updateMusicInformation() def updateMusicInformation(self, artist="", title="", album="", year="", genre="", clear=False): self.updateSingleMusicInformation("artist", artist, clear) self.updateSingleMusicInformation("title", title, clear) self.updateSingleMusicInformation("album", album, clear) self.updateSingleMusicInformation("year", year, clear) self.updateSingleMusicInformation("genre", genre, clear) def updateSingleMusicInformation(self, name, info, clear): if info != "" or clear: if self[name].getText() != info: self[name].setText(info) def leftDown(self): self.lefttimer = True self.leftKeyTimer.start(1000) def rightDown(self): self.righttimer = True self.rightKeyTimer.start(1000) def leftUp(self): if self.lefttimer: self.leftKeyTimer.stop() self.lefttimer = False self[self.currList].pageUp() self.updateCurrentInfo() def rightUp(self): if self.righttimer: self.rightKeyTimer.stop() self.righttimer = False self[self.currList].pageDown() self.updateCurrentInfo() def leftTimerFire(self): self.leftKeyTimer.stop() self.lefttimer = False self.switchToFileList() def rightTimerFire(self): self.rightKeyTimer.stop() self.righttimer = False self.switchToPlayList() def switchLists(self): if self.currList == "filelist": self.switchToPlayList() return self.switchToFileList() def switchToFileList(self): self.currList = "filelist" self.filelist.selectionEnabled(1) self.playlist.selectionEnabled(0) self.updateCurrentInfo() def switchToPlayList(self): if len(self.playlist) != 0: self.currList = "playlist" self.filelist.selectionEnabled(0) self.playlist.selectionEnabled(1) self.updateCurrentInfo() def up(self): self[self.currList].up() self.updateCurrentInfo() def down(self): self[self.currList].down() self.updateCurrentInfo() def showAfterSeek(self): pass def showAfterCuesheetOperation(self): self.show() def hideAfterResume(self): self.hide() def getIdentifier(self, ref): if self.isAudioCD: return ref.getName() else: text = ref.getPath() return text.split('/')[-1] # FIXME: maybe this code can be optimized def updateCurrentInfo(self): text = "" if self.currList == "filelist": idx = self.filelist.getSelectionIndex() r = self.filelist.list[idx] text = r[1][7] if r[0][1]: if len(text) < 2: text += " " if text[:2] != "..": text = "/" + text self.summaries.setText(text, 1) idx += 1 if idx < len(self.filelist.list): r = self.filelist.list[idx] text = r[1][7] if r[0][1]: text = "/" + text self.summaries.setText(text, 3) else: self.summaries.setText(" ", 3) idx += 1 if idx < len(self.filelist.list): r = self.filelist.list[idx] text = r[1][7] if r[0][1]: text = "/" + text self.summaries.setText(text, 4) else: self.summaries.setText(" ", 4) text = "" if not self.filelist.canDescent(): r = self.filelist.getServiceRef() if r is None: return text = r.getPath() self["currenttext"].setText(os.path.basename(text)) if self.currList == "playlist": t = self.playlist.getSelection() if t is None: return #display current selected entry on LCD text = self.getIdentifier(t) self.summaries.setText(text, 1) self["currenttext"].setText(text) idx = self.playlist.getSelectionIndex() idx += 1 if idx < len(self.playlist): currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) self.summaries.setText(text, 3) else: self.summaries.setText(" ", 3) idx += 1 if idx < len(self.playlist): currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) self.summaries.setText(text, 4) else: self.summaries.setText(" ", 4) def ok(self): if self.currList == "filelist": if self.filelist.canDescent(): self.filelist.descent() self.updateCurrentInfo() else: self.copyFile() if self.currList == "playlist": if self.playlist.getCurrentIndex( ) == self.playlist.getSelectionIndex(): self.hide() else: self.changeEntry(self.playlist.getSelectionIndex()) def showMenu(self): menulist = [] if len(self.cdAudioTrackFiles): menulist.insert(0, (_("Play audio-CD..."), "audiocd")) if self.currList == "filelist": if self.filelist.canDescent(): menulist.append((_("Add directory to playlist"), "copydir")) else: menulist.append((_("Add files to playlist"), "copyfiles")) menulist.append((_("Switch to playlist"), "playlist")) if config.usage.setup_level.index >= 1: # intermediate+ menulist.append((_("Delete file"), "deletefile")) else: menulist.append((_("Switch to filelist"), "filelist")) menulist.append((_("Clear playlist"), "clear")) menulist.append((_("Delete entry"), "deleteentry")) if config.usage.setup_level.index >= 1: # intermediate+ menulist.append((_("Shuffle playlist"), "shuffle")) menulist.append((_("Hide player"), "hide")) menulist.append((_("Load playlist"), "loadplaylist")) if config.usage.setup_level.index >= 1: # intermediate+ menulist.append((_("Save playlist"), "saveplaylist")) menulist.append((_("Delete saved playlist"), "deleteplaylist")) menulist.append((_("Edit settings"), "settings")) #self.timerHideMediaPlayerInfoBar() self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menulist) def menuCallback(self, choice): self.show() if choice is None: return if choice[1] == "copydir": self.copyDirectory(self.filelist.getSelection()[0]) elif choice[1] == "copyfiles": self.copyDirectory( os.path.dirname(self.filelist.getSelection()[0].getPath()) + "/", recursive=False) elif choice[1] == "playlist": self.switchToPlayList() elif choice[1] == "filelist": self.switchToFileList() elif choice[1] == "deleteentry": if self.playlist.getSelectionIndex( ) == self.playlist.getCurrentIndex(): self.stopEntry() self.deleteEntry() elif choice[1] == "clear": self.clear_playlist() elif choice[1] == "hide": self.hide() elif choice[1] == "saveplaylist": self.save_playlist() elif choice[1] == "loadplaylist": self.load_playlist() elif choice[1] == "deleteplaylist": self.delete_saved_playlist() elif choice[1] == "shuffle": self.playlist.PlayListShuffle() elif choice[1] == "deletefile": self.deleteFile() elif choice[1] == "settings": self.session.openWithCallback(self.applySettings, MediaPlayerSettings, self) elif choice[1] == "audiocd": self.playAudioCD() def playAudioCD(self): from enigma import eServiceReference if len(self.cdAudioTrackFiles): self.playlist.clear() self.savePlaylistOnExit = False self.isAudioCD = True for file in self.cdAudioTrackFiles: ref = eServiceReference(4097, 0, file) self.playlist.addFile(ref) try: from Plugins.Extensions.CDInfo.plugin import Query cdinfo = Query(self) cdinfo.scan() except ImportError: pass # we can live without CDInfo self.changeEntry(0) self.switchToPlayList() def applySettings(self): self.savePlaylistOnExit = config.mediaplayer.savePlaylistOnExit.value if config.mediaplayer.repeat.value: self["repeat"].setPixmapNum(1) else: self["repeat"].setPixmapNum(0) def showEventInformation(self): from Screens.EventView import EventViewSimple from ServiceReference import ServiceReference evt = self[self.currList].getCurrentEvent() if evt: self.session.open(EventViewSimple, evt, ServiceReference(self.getCurrent())) # also works on filelist (?) def getCurrent(self): return self["playlist"].getCurrent() def deletePlaylistEntry(self): if self.currList == "playlist": if self.playlist.getSelectionIndex( ) == self.playlist.getCurrentIndex(): self.stopEntry() self.deleteEntry() def skip_listbegin(self): if self.currList == "filelist": self.filelist.moveToIndex(0) else: self.playlist.moveToIndex(0) self.updateCurrentInfo() def skip_listend(self): if self.currList == "filelist": idx = len(self.filelist.list) self.filelist.moveToIndex(idx - 1) else: self.playlist.moveToIndex(len(self.playlist) - 1) self.updateCurrentInfo() def save_playlist(self): self.session.openWithCallback( self.save_playlist2, InputBox, title=_("Please enter filename (empty = use current date)"), windowTitle=_("Save playlist"), text=self.playlistname) def save_playlist2(self, name): if name is not None: name = name.strip() if name == "": name = strftime("%y%m%d_%H%M%S") self.playlistname = name name += ".e2pls" self.playlistIOInternal.clear() for x in self.playlist.list: self.playlistIOInternal.addService(ServiceReference(x[0])) self.playlistIOInternal.save( resolveFilename(SCOPE_PLAYLIST) + name) def load_playlist(self): listpath = [] playlistdir = resolveFilename(SCOPE_PLAYLIST) try: for i in os.listdir(playlistdir): listpath.append((i, playlistdir + i)) except IOError as e: print("Error while scanning subdirs ", e) if config.mediaplayer.sortPlaylists.value: listpath.sort() self.session.openWithCallback(self.PlaylistSelected, ChoiceBox, title=_("Please select a playlist..."), list=listpath) def PlaylistSelected(self, path): if path is not None: self.playlistname = path[0].rsplit('.', 1)[-2] self.clear_playlist() extension = path[0].rsplit('.', 1)[-1] if extension in self.playlistparsers: playlist = self.playlistparsers[extension]() list = playlist.open(path[1]) for x in list: self.playlist.addFile(x.ref) self.playlist.updateList() def delete_saved_playlist(self): listpath = [] playlistdir = resolveFilename(SCOPE_PLAYLIST) try: for i in os.listdir(playlistdir): listpath.append((i, playlistdir + i)) except IOError as e: print("Error while scanning subdirs ", e) if config.mediaplayer.sortPlaylists.value: listpath.sort() self.session.openWithCallback( self.DeletePlaylistSelected, ChoiceBox, title=_("Please select a playlist to delete..."), list=listpath) def DeletePlaylistSelected(self, path): if path is not None: self.delname = path[1] self.session.openWithCallback( self.deleteConfirmed, MessageBox, _("Do you really want to delete %s?") % (path[1])) def deleteConfirmed(self, confirmed): if confirmed: try: os.remove(self.delname) except OSError as e: print("delete failed:", e) self.session.open(MessageBox, _("Delete failed!"), MessageBox.TYPE_ERROR) def clear_playlist(self): self.isAudioCD = False self.stopEntry() self.playlist.clear() self.switchToFileList() def copyDirectory(self, directory, recursive=True): print("copyDirectory", directory) if directory == '/': print("refusing to operate on /") return filelist = FileList(directory, useServiceRef=True, showMountpoints=False, isTop=True) for x in filelist.getFileList(): if x[0][1]: #isDir if recursive: if x[0][0] != directory: self.copyDirectory(x[0][0]) elif filelist.getServiceRef() and filelist.getServiceRef( ).type == 4097: self.playlist.addFile(x[0][0]) self.playlist.updateList() def deleteFile(self): if self.currList == "filelist": self.service = self.filelist.getServiceRef() else: self.service = self.playlist.getSelection() if self.service is None: return if self.service.type != 4098 and self.session.nav.getCurrentlyPlayingServiceReference( ) is not None: if self.service == self.session.nav.getCurrentlyPlayingServiceReference( ): self.stopEntry() serviceHandler = eServiceCenter.getInstance() offline = serviceHandler.offlineOperations(self.service) info = serviceHandler.info(self.service) name = info and info.getName(self.service) result = False if offline is not None: # simulate first if not offline.deleteFromDisk(1): result = True if result: self.session.openWithCallback( self.deleteConfirmed_offline, MessageBox, _("Do you really want to delete %s?") % name) else: self.session.openWithCallback(self.close, MessageBox, _("You cannot delete this!"), MessageBox.TYPE_ERROR) def deleteConfirmed_offline(self, confirmed): if confirmed: serviceHandler = eServiceCenter.getInstance() offline = serviceHandler.offlineOperations(self.service) result = False if offline is not None: # really delete! if not offline.deleteFromDisk(0): result = True if not result: self.session.open(MessageBox, _("Delete failed!"), MessageBox.TYPE_ERROR) else: self.removeListEntry() def removeListEntry(self): currdir = self.filelist.getCurrentDirectory() self.filelist.changeDir(currdir) deleteend = False while not deleteend: index = 0 deleteend = True if len(self.playlist) > 0: for x in self.playlist.list: if self.service == x[0]: self.playlist.deleteFile(index) deleteend = False break index += 1 self.playlist.updateList() if self.currList == "playlist": if len(self.playlist) == 0: self.switchToFileList() def copyFile(self): if self.filelist.getServiceRef().type == 4098: # playlist ServiceRef = self.filelist.getServiceRef() extension = ServiceRef.getPath()[ServiceRef.getPath().rfind('.') + 1:] if extension in self.playlistparsers: playlist = self.playlistparsers[extension]() list = playlist.open(ServiceRef.getPath()) for x in list: self.playlist.addFile(x.ref) self.playlist.updateList() else: self.playlist.addFile(self.filelist.getServiceRef()) self.playlist.updateList() if len(self.playlist) == 1: self.changeEntry(0) def addPlaylistParser(self, parser, extension): self.playlistparsers[extension] = parser def nextEntry(self): next = self.playlist.getCurrentIndex() + 1 if next < len(self.playlist): self.changeEntry(next) elif (len(self.playlist) > 0) and (config.mediaplayer.repeat.value == True): self.stopEntry() self.changeEntry(0) elif len(self.playlist) > 0: self.stopEntry() def nextMarkOrEntry(self): if not self.jumpPreviousNextMark(lambda x: x): next = self.playlist.getCurrentIndex() + 1 if next < len(self.playlist): self.changeEntry(next) else: self.doSeek(-1) def previousMarkOrEntry(self): if not self.jumpPreviousNextMark(lambda x: -x - 5 * 90000, start=True): next = self.playlist.getCurrentIndex() - 1 if next >= 0: self.changeEntry(next) def deleteEntry(self): self.playlist.deleteFile(self.playlist.getSelectionIndex()) self.playlist.updateList() if len(self.playlist) == 0: self.switchToFileList() def changeEntry(self, index): self.playlist.setCurrentPlaying(index) self.playEntry() def playServiceRefEntry(self, serviceref): serviceRefList = self.playlist.getServiceRefList() for count in list(range(len(serviceRefList))): if serviceRefList[count] == serviceref: self.changeEntry(count) break def xplayEntry(self): if self.currList == "playlist": self.playEntry() else: self.stopEntry() self.playlist.clear() self.isAudioCD = False sel = self.filelist.getSelection() if sel: if sel[1]: # can descent # add directory to playlist self.copyDirectory(sel[0]) else: # add files to playlist self.copyDirectory(os.path.dirname(sel[0].getPath()) + "/", recursive=False) if len(self.playlist) > 0: self.changeEntry(0) def playEntry(self): if len(self.playlist.getServiceRefList()): needsInfoUpdate = False currref = self.playlist.getServiceRefList()[ self.playlist.getCurrentIndex()] if self.session.nav.getCurrentlyPlayingServiceReference( ) is None or currref != self.session.nav.getCurrentlyPlayingServiceReference( ): idx = self.playlist.getCurrentIndex() currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) ext = os.path.splitext(text)[1].lower() if ext not in AUDIO_EXTENSIONS and not self.isAudioCD: movie = self.playlist.getServiceRefList()[ self.playlist.getCurrentIndex()] self.session.openWithCallback(self.stopEntry, ExMoviePlayer, movie) else: self.session.nav.playService( self.playlist.getServiceRefList()[ self.playlist.getCurrentIndex()]) info = eServiceCenter.getInstance().info(currref) description = info and info.getInfoString( currref, iServiceInformation.sDescription) or "" self["title"].setText(description) # display just playing musik on LCD idx = self.playlist.getCurrentIndex() currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) ext = os.path.splitext(text)[1].lower() text = ">" + text # FIXME: the information if the service contains video (and we should hide our window) should com from the service instead if ext not in AUDIO_EXTENSIONS and not self.isAudioCD: self.hide() else: needsInfoUpdate = True self.summaries.setText(text, 1) # get the next two entries idx += 1 if idx < len(self.playlist): currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) self.summaries.setText(text, 3) else: self.summaries.setText(" ", 3) idx += 1 if idx < len(self.playlist): currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) self.summaries.setText(text, 4) else: self.summaries.setText(" ", 4) else: idx = self.playlist.getCurrentIndex() currref = self.playlist.getServiceRefList()[idx] text = currref.getPath() ext = os.path.splitext(text)[1].lower() if ext not in AUDIO_EXTENSIONS and not self.isAudioCD: self.hide() else: needsInfoUpdate = True self.unPauseService() if needsInfoUpdate: path = self.playlist.getServiceRefList()[ self.playlist.getCurrentIndex()].getPath() self["coverArt"].updateCoverArt(path) else: self["coverArt"].showDefaultCover() self.readTitleInformation() def updatedSeekState(self): if self.seekstate == self.SEEK_STATE_PAUSE: self.playlist.pauseFile() elif self.seekstate == self.SEEK_STATE_PLAY: self.playlist.playFile() elif self.isStateForward(self.seekstate): self.playlist.forwardFile() elif self.isStateBackward(self.seekstate): self.playlist.rewindFile() def pauseEntry(self): self.pauseService() if self.seekstate == self.SEEK_STATE_PAUSE: self.show() else: self.hide() def stopEntry(self): self.playlist.stopFile() self.session.nav.playService(None) self.updateMusicInformation(clear=True) self.show() def unPauseService(self): self.setSeekState(self.SEEK_STATE_PLAY) def subtitleSelection(self): from Screens.AudioSelection import SubtitleSelection self.session.open(SubtitleSelection, self) def hotplugCB(self, dev, media_state): if dev == harddiskmanager.getCD(): if media_state == "1": from Components.Scanner import scanDevice devpath = harddiskmanager.getAutofsMountpoint( harddiskmanager.getCD()) self.cdAudioTrackFiles = [] res = scanDevice(devpath) list = [(r.description, r, res[r], self.session) for r in res] if list: (desc, scanner, files, session) = list[0] for file in files: if file.mimetype == "audio/x-cda": self.cdAudioTrackFiles.append(file.path) else: self.cdAudioTrackFiles = [] if self.isAudioCD: self.clear_playlist()
class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarNotifications, InfoBarSubtitleSupport, HelpableScreen): ALLOW_SUSPEND = True def __init__(self, session, args = None): Screen.__init__(self, session) InfoBarAudioSelection.__init__(self) InfoBarNotifications.__init__(self) InfoBarBase.__init__(self) InfoBarSubtitleSupport.__init__(self) HelpableScreen.__init__(self) self.summary = None self.oldService = self.session.nav.getCurrentlyPlayingServiceReference() self.session.nav.stopService() self.playlistparsers = {} self.addPlaylistParser(PlaylistIOM3U, "m3u") self.addPlaylistParser(PlaylistIOPLS, "pls") self.addPlaylistParser(PlaylistIOInternal, "e2pls") # 'None' is magic to start at the list of mountpoints defaultDir = config.mediaplayer.defaultDir.getValue() self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|m2ts|avi|divx|mkv|mp4|m4a|dat|flac|rec)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") self["filelist"] = self.filelist self.playlist = MyPlayList() self.is_closing = False self.MoviePlayerOpen = False self.delname = "" self["playlist"] = self.playlist self["PositionGauge"] = ServicePositionGauge(self.session.nav) self["currenttext"] = Label("") self["artisttext"] = Label(_("Artist")+':') self["artist"] = Label("") self["titletext"] = Label(_("Title")+':') self["title"] = Label("") self["albumtext"] = Label(_("Album")+':') self["album"] = Label("") self["yeartext"] = Label(_("Year")+':') self["year"] = Label("") self["genretext"] = Label(_("Genre")+':') self["genre"] = Label("") self["coverArt"] = MediaPixmap() self["repeat"] = MultiPixmap() self.seek_target = None hotplugNotifier.append(self.hotplugCB) class MoviePlayerActionMap(NumberActionMap): def __init__(self, player, contexts = [ ], actions = { }, prio=0): NumberActionMap.__init__(self, contexts, actions, prio) self.player = player def action(self, contexts, action): self.player.show() return NumberActionMap.action(self, contexts, action) self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", { "ok": (self.ok, _("add file to playlist")), "cancel": (self.exit, _("exit mediaplayer")), }, -2) self["MediaPlayerActions"] = HelpableActionMap(self, "MediaPlayerActions", { "play": (self.xplayEntry, _("play entry")), "pause": (self.pauseEntry, _("pause")), "stop": (self.stopEntry, _("stop entry")), "previous": (self.previousEntry, _("play from previous playlist entry")), "next": (self.nextEntry, _("play from next playlist entry")), "menu": (self.showMenu, _("menu")), "skipListbegin": (self.skip_listbegin, _("jump to listbegin")), "skipListend": (self.skip_listend, _("jump to listend")), "prevBouquet": (self.switchToPlayList, _("switch to playlist")), "nextBouquet": (self.switchToFileList, _("switch to filelist")), "delete": (self.deletePlaylistEntry, _("delete playlist entry")), "shift_stop": (self.clear_playlist, _("clear playlist")), "shift_record": (self.playlist.PlayListShuffle, _("shuffle playlist")), "subtitles": (self.subtitleSelection, _("Subtitle selection")), }, -2) self["InfobarEPGActions"] = HelpableActionMap(self, "InfobarEPGActions", { "showEventInfo": (self.showEventInformation, _("show event details")), }) self["actions"] = MoviePlayerActionMap(self, ["DirectionActions"], { "right": self.rightDown, "rightRepeated": self.doNothing, "rightUp": self.rightUp, "left": self.leftDown, "leftRepeated": self.doNothing, "leftUp": self.leftUp, "up": self.up, "upRepeated": self.up, "upUp": self.doNothing, "down": self.down, "downRepeated": self.down, "downUp": self.doNothing, }, -2) InfoBarSeek.__init__(self, actionmap = "MediaPlayerSeekActions") self.onClose.append(self.delMPTimer) self.onClose.append(self.__onClose) self.righttimer = False self.rightKeyTimer = eTimer() self.rightKeyTimer.callback.append(self.rightTimerFire) self.lefttimer = False self.leftKeyTimer = eTimer() self.leftKeyTimer.callback.append(self.leftTimerFire) self.currList = "filelist" self.isAudioCD = False self.AudioCD_albuminfo = {} self.savePlaylistOnExit = False self.cdAudioTrackFiles = [] self.applySettings() self.bookmarks = config.movielist.videodirs self.playlistIOInternal = PlaylistIOInternal() list = self.playlistIOInternal.open(resolveFilename(SCOPE_CONFIG, "playlist.e2pls")) if list: for x in list: self.playlist.addFile(x.ref) self.playlist.updateList() self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { iPlayableService.evUpdatedInfo: self.__evUpdatedInfo, iPlayableService.evUser+10: self.__evAudioDecodeError, iPlayableService.evUser+11: self.__evVideoDecodeError, iPlayableService.evUser+12: self.__evPluginError, iPlayableService.evUser+13: self["coverArt"].embeddedCoverArt }) def doNothing(self): pass def createSummary(self): return MediaPlayerLCDScreen def exit(self): if self.savePlaylistOnExit and not config.mediaplayer.savePlaylistOnExit.getValue(): self.savePlaylistOnExit = False if config.mediaplayer.askOnExit.getValue(): if not self.savePlaylistOnExit: self.session.openWithCallback(self.exitCB, MessageBox, _("Do you really want to exit?"), timeout=5) else: list = [] list.append((_("No"), "no")) list.append((_("Yes"), "yes")) self.session.openWithCallback(self.exitCBsave, ChoiceBox, title=_("save playlist before exit?"), list = list) else: self.exitCB(True) def exitCB(self, answer): if answer == True: self.playlistIOInternal.clear() if self.savePlaylistOnExit: print "save playlist" for x in self.playlist.list: self.playlistIOInternal.addService(ServiceReference(x[0])) self.playlistIOInternal.save(resolveFilename(SCOPE_CONFIG, "playlist.e2pls")) if config.mediaplayer.saveDirOnExit.getValue(): config.mediaplayer.defaultDir.setValue(self.filelist.getCurrentDirectory()) config.mediaplayer.defaultDir.save() hotplugNotifier.remove(self.hotplugCB) del self["coverArt"].picload self.close() def exitCBsave(self, answer): if answer is not None: if answer[1] == "no": self.savePlaylistOnExit = False self.exitCB(True) def checkSkipShowHideLock(self): self.updatedSeekState() def doEofInternal(self, playing): print "--- eofint mediaplayer---" if playing: if not self.MoviePlayerOpen: self.nextEntry() else: self.show() def __onClose(self): self.session.nav.playService(self.oldService) def __evUpdatedInfo(self): currPlay = self.session.nav.getCurrentService() currenttitle = currPlay.info().getInfo(iServiceInformation.sCurrentTitle) totaltitles = currPlay.info().getInfo(iServiceInformation.sTotalTitles) sTagTitle = currPlay.info().getInfoString(iServiceInformation.sTagTitle) print "[__evUpdatedInfo] title %d of %d (%s)" % (currenttitle, totaltitles, sTagTitle) self.readTitleInformation() def __evAudioDecodeError(self): currPlay = self.session.nav.getCurrentService() sAudioType = currPlay.info().getInfoString(iServiceInformation.sUser+10) print "[__evAudioDecodeError] audio-codec %s can't be decoded by hardware" % (sAudioType) self.session.open(MessageBox, _("This Dreambox can't decode %s streams!") % sAudioType, type = MessageBox.TYPE_INFO,timeout = 20 ) def __evVideoDecodeError(self): currPlay = self.session.nav.getCurrentService() sVideoType = currPlay.info().getInfoString(iServiceInformation.sVideoType) print "[__evVideoDecodeError] video-codec %s can't be decoded by hardware" % (sVideoType) self.session.open(MessageBox, _("This Dreambox can't decode %s streams!") % sVideoType, type = MessageBox.TYPE_INFO,timeout = 20 ) def __evPluginError(self): currPlay = self.session.nav.getCurrentService() message = currPlay.info().getInfoString(iServiceInformation.sUser+12) print "[__evPluginError]" , message self.session.open(MessageBox, message, type = MessageBox.TYPE_INFO,timeout = 20 ) def delMPTimer(self): del self.rightKeyTimer del self.leftKeyTimer def readTitleInformation(self): currPlay = self.session.nav.getCurrentService() if currPlay is not None: sTagTitle = currPlay.info().getInfoString(iServiceInformation.sTagTitle) sTagAlbum = currPlay.info().getInfoString(iServiceInformation.sTagAlbum) sTagGenre = currPlay.info().getInfoString(iServiceInformation.sTagGenre) sTagArtist = currPlay.info().getInfoString(iServiceInformation.sTagArtist) sYear = currPlay.info().getInfoString(iServiceInformation.sTimeCreate) if sTagTitle == "": if not self.isAudioCD: sTagTitle = currPlay.info().getName().split('/')[-1] else: sTagTitle = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()].getName() if self.AudioCD_albuminfo: if sTagAlbum == "" and "title" in self.AudioCD_albuminfo: sTagAlbum = self.AudioCD_albuminfo["title"] if sTagGenre == "" and "genre" in self.AudioCD_albuminfo: sTagGenre = self.AudioCD_albuminfo["genre"] if sTagArtist == "" and "artist" in self.AudioCD_albuminfo: sTagArtist = self.AudioCD_albuminfo["artist"] if "year" in self.AudioCD_albuminfo: sYear = self.AudioCD_albuminfo["year"] self.updateMusicInformation( sTagArtist, sTagTitle, sTagAlbum, sYear, sTagGenre, clear = True ) else: self.updateMusicInformation() def updateMusicInformation(self, artist = "", title = "", album = "", year = "", genre = "", clear = False): self.updateSingleMusicInformation("artist", artist, clear) self.updateSingleMusicInformation("title", title, clear) self.updateSingleMusicInformation("album", album, clear) self.updateSingleMusicInformation("year", year, clear) self.updateSingleMusicInformation("genre", genre, clear) def updateSingleMusicInformation(self, name, info, clear): if info != "" or clear: if self[name].getText() != info: self[name].setText(info) def leftDown(self): self.lefttimer = False self.leftKeyTimer.start(10) def rightDown(self): self.righttimer = False self.rightKeyTimer.start(10) def leftUp(self): if self.lefttimer: self.leftKeyTimer.stop() self.lefttimer = False self[self.currList].pageUp() self.updateCurrentInfo() def rightUp(self): if self.righttimer: self.rightKeyTimer.stop() self.righttimer = False self[self.currList].pageDown() self.updateCurrentInfo() def leftTimerFire(self): self.leftKeyTimer.stop() self.lefttimer = False self.switchToFileList() def rightTimerFire(self): self.rightKeyTimer.stop() self.righttimer = False self.switchToPlayList() def switchToFileList(self): self.currList = "filelist" self.filelist.selectionEnabled(1) self.playlist.selectionEnabled(0) self.updateCurrentInfo() def switchToPlayList(self): if len(self.playlist) != 0: self.currList = "playlist" self.filelist.selectionEnabled(0) self.playlist.selectionEnabled(1) self.updateCurrentInfo() def up(self): self[self.currList].up() self.updateCurrentInfo() def down(self): self[self.currList].down() self.updateCurrentInfo() def showAfterSeek(self): self.show() def showAfterCuesheetOperation(self): self.show() def hideAfterResume(self): self.hide() def getIdentifier(self, ref): if self.isAudioCD: return ref.getName() else: text = ref.getPath() return text.split('/')[-1] # FIXME: maybe this code can be optimized def updateCurrentInfo(self): text = "" if self.currList == "filelist": idx = self.filelist.getSelectionIndex() r = self.filelist.list[idx] text = r[1][7] if r[0][1] == True: if len(text) < 2: text += " " if text[:2] != "..": text = "/" + text self.summaries.setText(text,1) idx += 1 if idx < len(self.filelist.list): r = self.filelist.list[idx] text = r[1][7] if r[0][1] == True: text = "/" + text self.summaries.setText(text,3) else: self.summaries.setText(" ",3) idx += 1 if idx < len(self.filelist.list): r = self.filelist.list[idx] text = r[1][7] if r[0][1] == True: text = "/" + text self.summaries.setText(text,4) else: self.summaries.setText(" ",4) text = "" if not self.filelist.canDescent(): r = self.filelist.getServiceRef() if r is None: return text = r.getPath() self["currenttext"].setText(os_path.basename(text)) if self.currList == "playlist": t = self.playlist.getSelection() if t is None: return #display current selected entry on LCD text = self.getIdentifier(t) self.summaries.setText(text,1) self["currenttext"].setText(text) idx = self.playlist.getSelectionIndex() idx += 1 if idx < len(self.playlist): currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) self.summaries.setText(text,3) else: self.summaries.setText(" ",3) idx += 1 if idx < len(self.playlist): currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) self.summaries.setText(text,4) else: self.summaries.setText(" ",4) def ok(self): if self.currList == "filelist": if self.filelist.canDescent(): self.filelist.descent() self.updateCurrentInfo() else: self.copyFile() if self.currList == "playlist": selection = self["playlist"].getSelection() self.changeEntry(self.playlist.getSelectionIndex()) def showMenu(self): menu = [] if len(self.cdAudioTrackFiles): menu.insert(0,(_("Play Audio-CD..."), "audiocd")) if self.currList == "filelist": #menu.append((_("add selection after current playing"), "addAfterCurrent")) if self.filelist.canDescent(): menu.append((_("add directory to playlist"), "copydir")) else: menu.append((_("add files to playlist"), "copyfiles")) menu.append((_("switch to playlist"), "playlist")) else: menu.append((_("switch to filelist"), "filelist")) menu.append((_("clear playlist"), "clear")) menu.append((_("Delete entry"), "deleteentry")) if config.usage.setup_level.index >= 1: # intermediate+ menu.append((_("shuffle playlist"), "shuffle")) if pathExists("/usr/lib/enigma2/python/Plugins/Extensions/PicturePlayer/"): menu.append((_("PicturePlayer"), "PicturePlayer")); if config.usage.setup_level.index >= 1: # intermediate+ menu.append((_("delete file"), "deletefile")) menu.append((_("hide player"), "hide")); menu.append((_("load playlist"), "loadplaylist")); if config.usage.setup_level.index >= 1: # intermediate+ menu.append((_("save playlist"), "saveplaylist")); menu.append((_("delete saved playlist"), "deleteplaylist")); menu.append((_("Edit settings"), "settings")) menu.append((_("add/remove bookmarks (locationbox)"), "locationbox")) if self.currList == "filelist": menu.append((_("---------------------- bookmarks -------------------"), "line")) for x in self.bookmarks.value: menu.append((x, x)) self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu) def menuCallback(self, choice): if choice is None: return if choice[1] == "copydir": self.savePlaylistOnExit = True self.copyDirectory(self.filelist.getSelection()[0]) elif choice[1] == "copyfiles": self.stopEntry() self.playlist.clear() self.savePlaylistOnExit = True self.isAudioCD = False self.copyDirectory(os_path.dirname(self.filelist.getSelection()[0].getPath()) + "/", recursive = False) self.playServiceRefEntry(self.filelist.getServiceRef()) elif choice[1] == "addAfterCurrent": self.copyFileAfterCurrentPlaying() elif choice[1] == "playlist": self.switchToPlayList() elif choice[1] == "filelist": self.switchToFileList() elif choice[1] == "deleteentry": if self.playlist.getSelectionIndex() == self.playlist.getCurrentIndex(): self.stopEntry() self.deleteEntry() elif choice[1] == "clear": self.clear_playlist() elif choice[1] == "hide": self.hide() elif choice[1] == "saveplaylist": self.save_playlist() elif choice[1] == "loadplaylist": self.load_playlist() elif choice[1] == "deleteplaylist": self.delete_saved_playlist() elif choice[1] == "shuffle": self.playlist.PlayListShuffle() elif choice[1] == "PicturePlayer": from Plugins.Extensions.PicturePlayer.plugin import picshow self.session.open(picshow) elif choice[1] == "deletefile": self.deleteFile() elif choice[1] == "settings": self.session.openWithCallback(self.applySettings, MediaPlayerSettings, self) elif choice[1] == "audiocd": self.playAudioCD() elif choice[1] == "locationbox": self.doPathSelect() elif choice[1] == "line": print "--- bookmark ---" else: print "bookmark: ", choice[1] self.filelist.changeDir(choice[1]) def doPathSelect(self): self.session.openWithCallback(self.gotPath, LocationBox, _("Please select the path..."), currDir = self.filelist.getCurrentDirectory(), bookmarks = config.movielist.videodirs) def gotPath(self, res): if res is not None: self.filelist.changeDir(res) def playAudioCD(self): from enigma import eServiceReference from Plugins.Extensions.CDInfo.plugin import Query if len(self.cdAudioTrackFiles): self.playlist.clear() self.savePlaylistOnExit = False self.isAudioCD = True for file in self.cdAudioTrackFiles: ref = eServiceReference(4097, 0, file) self.playlist.addFile(ref) cdinfo = Query(self) cdinfo.scan() self.changeEntry(0) self.switchToPlayList() def applySettings(self): if config.mediaplayer.repeat.getValue() == True: self["repeat"].setPixmapNum(1) else: self["repeat"].setPixmapNum(0) def showEventInformation(self): from Screens.EventView import EventViewSimple from ServiceReference import ServiceReference evt = self[self.currList].getCurrentEvent() if evt: self.session.open(EventViewSimple, evt, ServiceReference(self.getCurrent())) # also works on filelist (?) def getCurrent(self): return self["playlist"].getCurrent() def deletePlaylistEntry(self): if self.currList == "playlist": if self.playlist.getSelectionIndex() == self.playlist.getCurrentIndex(): self.stopEntry() self.deleteEntry() def skip_listbegin(self): if self.currList == "filelist": self.filelist.moveToIndex(0) else: self.playlist.moveToIndex(0) self.updateCurrentInfo() def skip_listend(self): if self.currList == "filelist": idx = len(self.filelist.list) self.filelist.moveToIndex(idx - 1) else: self.playlist.moveToIndex(len(self.playlist)-1) self.updateCurrentInfo() def save_playlist(self): self.session.openWithCallback(self.save_playlist2,InputBox, title=_("Please enter filename (empty = use current date)"),windowTitle = _("Save Playlist")) def save_playlist2(self, name): if name is not None: name = name.strip() if name == "": name = strftime("%y%m%d_%H%M%S") name += ".e2pls" self.playlistIOInternal.clear() for x in self.playlist.list: self.playlistIOInternal.addService(ServiceReference(x[0])) self.playlistIOInternal.save(resolveFilename(SCOPE_PLAYLIST) + name) def load_playlist(self): listpath = [] playlistdir = resolveFilename(SCOPE_PLAYLIST) try: for i in os_listdir(playlistdir): listpath.append((i,playlistdir + i)) except IOError,e: print "Error while scanning subdirs ",e self.session.openWithCallback(self.PlaylistSelected, ChoiceBox, title=_("Please select a playlist..."), list = listpath)
class EVOMC_AudioPlayer(Screen, HelpableScreen): def __init__(self, session): Screen.__init__(self, session) HelpableScreen.__init__(self) self.bScreen = self.session.instantiateDialog(Blackscreen) self.bScreen.show() self.myaudioScreenSaverconfig = int(config.plugins.EVOMC_saver.myaudioScreenSaver.value) self.myaudioScreenSaverTimer = eTimer() self.myaudioScreenSaverTimer.timeout.get().append(self.myaudioScreenSaverTimer_Timeout) self.ResetmyaudioScreenSaverTimer() self.start_timer = eTimer() self.moveTimer = eTimer() self.start_timer.timeout.get().append(self.onLayoutFinished) self.isVisible = True self.oldService = self.session.nav.getCurrentlyPlayingServiceReference() self.skindir = "/usr/lib/enigma2/python/Plugins/Extensions/EVOMediaCenter/skins/basic" self.coverArtFileName = "" self["PositionGauge"] = ServicePositionGauge(self.session.nav) self["key_red"] = Button(_("Delete")) self["key_green"] = Button(_("Play All")) self["key_yellow"] = Button(_("Favorites")) self["key_blue"] = Button(_("Settings")) self["fileinfo"] = Label() self["coverArt"] = MediaPixmap() self["currentfolder"] = Label() self["currentfavname"] = Label() self.playlist = MyPlayList() self.currList = "filelist" self.curfavfolder = -1 self["play"] = Pixmap() self["stop"] = Pixmap() self["curplayingtitle"] = Label() self.currPlaying = 0 self.PlaySingle = 0 self.PlaySingleRUN = 0 self.PlayAll = 0 self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { iPlayableService.evEOF: self.doEOF, iPlayableService.evStopped: self.StopPlayback, iPlayableService.evUser+11: self.__evDecodeError, iPlayableService.evUser+12: self.__evPluginError, iPlayableService.evUser+13: self["coverArt"].embeddedCoverArt }) self["actions"] = HelpableActionMap(self, "EVOMC_AudioPlayerActions", { "ok": (self.KeyPlaySingle, "Play selected file"), "left": (self.leftUp, "List Top"), "right": (self.rightDown, "List Bottom"), "up": (self.up, "List up"), "down": (self.down, "List down"), "menu": (self.KeyMenu, "File / Folder Options"), "video": (self.visibility, "Show / Hide Player"), "nextBouquet": (self.NextFavFolder, "Next Favorite Folder"), "prevBouquet": (self.PrevFavFolder, "Previous Favorite Folder"), "red": (self.deleteFile, "Delete File"), "green": (self.KeyPlayAll, "Play All"), "yellow": (self.FavoriteFolders, "Favorite Folders"), "blue": (self.Settings, "Settings"), }, -2) self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", { "cancel": (self.Exit, "Exit Audio Player"), }, -2) self["InfobarShowHideActions"] = HelpableActionMap(self, "InfobarShowHideActions", { "toggleShow": (self.showFileInfo, "Show File Info"), }, -2) self["MediaPlayerActions"] = HelpableActionMap(self, "MediaPlayerActions", { "stop": (self.StopPlayback, "Stop Playback"), }, -2) self.aspect = getAspect() currDir = config.plugins.EVOMC_ap.lastDir.value if not pathExists(currDir): currDir = "/" self["currentfolder"].setText(str(currDir)) self.filelist = FileList(currDir, useServiceRef = True, showDirectories = True, showFiles = True, matchingPattern = "(?i)^.*\.(mp3|ogg|wma|wav|wave|flac|m4a)") self["filelist"] = self.filelist self["thumbnail"] = Pixmap() evfd.getInstance().vfd_write_string("EVO-AUDIOPLAYER") self.ThumbTimer = eTimer() self.ThumbTimer.callback.append(self.showThumb) self.ThumbTimer.start(config.plugins.EVOMC_ap.preview_delay.getValue() * 1000, True) self.DimmerTimer = eTimer() self.DimmerTimer.callback.append(self.showDimmer) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) self.BlinkingPlayIconTimer = eTimer() self.BlinkingPlayIconTimer.callback.append(self.BlinkingPlayIcon) self.blinking=False self.FileInfoTimer = eTimer() self.FileInfoTimer.callback.append(self.updateFileInfo) self.myaudioScreenSaverconfig = int(config.plugins.EVOMC_saver.myaudioScreenSaver.value) self.ResetmyaudioScreenSaverTimer() def onLayoutFinished(self): global startindex self.startindex = startindex self.num += 1 if startindex is not None: self.start_timer.stop() else: if self.num < 30: self.start_timer.start(2000) else: self.start_timer.stop() fehler = "Fehler beim automatischen Start" self.session.open(MessageBox,_("%s" %fehler), MessageBox.TYPE_INFO) def myaudioScreenSaverTimer_Timeout(self): if self.myaudioScreenSaverTimer.isActive(): self.myaudioScreenSaverTimer.stop() self.session.openWithCallback(self.ResetmyaudioScreenSaverTimer,myaudioScreenSaver) def ResetmyaudioScreenSaverTimer(self): if onmyaudioScreenSaver: pass if self.myaudioScreenSaverconfig != 0: if self.myaudioScreenSaverTimer.isActive(): self.myaudioScreenSaverTimer.stop() self.myaudioScreenSaverTimer.start(self.myaudioScreenSaverconfig * 1000) def deleteFile(self): if self.currList == "filelist": self.service = self.filelist.getServiceRef() else: self.service = self.playlist.getSelection() if self.service is None: return if self.service.type != 4098 and self.session.nav.getCurrentlyPlayingServiceReference() is not None: if self.service == self.session.nav.getCurrentlyPlayingServiceReference(): self.stopEntry() serviceHandler = eServiceCenter.getInstance() offline = serviceHandler.offlineOperations(self.service) info = serviceHandler.info(self.service) name = info and info.getName(self.service) result = False if offline is not None: # simulate first if not offline.deleteFromDisk(1): result = True if result == True: self.session.openWithCallback(self.deleteConfirmed_offline, MessageBox, _("Do you really want to delete %s?") % (name)) else: self.session.openWithCallback(self.close, MessageBox, _("You cannot delete this!"), MessageBox.TYPE_ERROR) def deleteConfirmed_offline(self, confirmed): if confirmed: serviceHandler = eServiceCenter.getInstance() offline = serviceHandler.offlineOperations(self.service) result = False if offline is not None: # really delete! if not offline.deleteFromDisk(0): result = True if result == False: self.session.open(MessageBox, _("Delete failed!"), MessageBox.TYPE_ERROR) else: self.removeListEntry() def removeListEntry(self): self.savePlaylistOnExit = True currdir = self.filelist.getCurrentDirectory() self.filelist.changeDir(currdir) deleteend = False while not deleteend: index = 0 deleteend = True if len(self.playlist) > 0: for x in self.playlist.list: if self.service == x[0]: self.playlist.deleteFile(index) deleteend = False break index += 1 self.playlist.updateList() if self.currList == "playlist": if len(self.playlist) == 0: self.switchToFileList() def up(self): self["filelist"].up() system("stfbcontrol a 255") self.ThumbTimer.start(config.plugins.EVOMC_ap.preview_delay.getValue() * 1000, True) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) def down(self): self["filelist"].down() system("stfbcontrol a 255") self.ThumbTimer.start(config.plugins.EVOMC_ap.preview_delay.getValue() * 1000, True) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) def leftUp(self): self["filelist"].pageUp() system("stfbcontrol a 255") self.ThumbTimer.start(config.plugins.EVOMC_ap.preview_delay.getValue() * 1000, True) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) def rightDown(self): self["filelist"].pageDown() system("stfbcontrol a 255") self.ThumbTimer.start(config.plugins.EVOMC_ap.preview_delay.getValue() * 1000, True) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) def showDimmer(self): if config.plugins.EVOMC_all.showDimmer.value: system("stfbcontrol a 80") # else: # pass def NextFavFolder(self): system("stfbcontrol a 255") if self.curfavfolder + 1 < config.plugins.EVOMC_favorites.foldercount.value: self.curfavfolder += 1 self.favname = config.plugins.EVOMC_favorites.folders[self.curfavfolder].name.value self.folder = config.plugins.EVOMC_favorites.folders[self.curfavfolder].basedir.value self["currentfolder"].setText(("%s") % (self.folder)) self["currentfavname"].setText(("%s") % (self.favname)) if pathExists(self.folder) == True: self["filelist"].changeDir(self.folder) else: return def PrevFavFolder(self): system("stfbcontrol a 255") if self.curfavfolder <= 0: return else: self.curfavfolder -= 1 self.favname = config.plugins.EVOMC_favorites.folders[self.curfavfolder].name.value self.folder = config.plugins.EVOMC_favorites.folders[self.curfavfolder].basedir.value self["currentfolder"].setText(("%s") % (self.folder)) self["currentfavname"].setText(("%s") % (self.favname)) if pathExists(self.folder) == True: self["filelist"].changeDir(self.folder) def KeyPlaySingle(self): filename = self["filelist"].getFilename() print "filename", filename print "self.PlaySingle", self.PlaySingle if self.PlaySingleRUN == 0: if self.PlaySingle == 1 or config.plugins.EVOMC_ap.showPreview.getValue(): if filename.upper().endswith(".MP3") or filename.upper().endswith(".OGG") or filename.upper().endswith(".WAV") or filename.upper().endswith(".WAVE") or filename.upper().endswith(".FLAC") or filename.upper().endswith(".M4A"): return else: if config.plugins.EVOMC_ap.showPreview.getValue(): if filename.upper().endswith(".MP3") or filename.upper().endswith(".OGG") or filename.upper().endswith(".WAV") or filename.upper().endswith(".WAVE") or filename.upper().endswith(".FLAC") or filename.upper().endswith(".M4A"): return system("stfbcontrol a 255") self.ThumbTimer.stop() if self["filelist"].canDescent(): self["currentfavname"].setText("") self.curfavfolder = -1 self.filelist.descent() self["currentfolder"].setText(str(self.filelist.getCurrentDirectory())) else: self.PlaySingle = 1 self.PlaySingleRUN = 1 self.PlayService() self.BlinkingPlayIconTimer.stop() def KeyPlayAll(self): self.ThumbTimer.stop() if not self["filelist"].canDescent(): self.PlaySingle = 0 self.PlayAll = 1 self.PlayService() self.BlinkingPlayIconTimer.start(1000, True) def PlayService(self): system("stfbcontrol a 255") self.StopPlayback() self.filelist.refresh() self.currPlaying = 1 if self.PlayAll == 1: self.BlinkingPlayIconTimer.start(1000, True) evfd.getInstance().vfd_write_string("PLAY") self.session.nav.playService(self["filelist"].getServiceRef()) self.FileInfoTimer.start(2000, True) self["play"].instance.setPixmapFromFile(str(self.skindir) + "/images/icons/play_enabled.png") self["stop"].instance.setPixmapFromFile(str(self.skindir) + "/images/icons/stop_disabled.png") system("vfdctl +play") system("vfdctl +mp3") system("vfdctl +music") path = self["filelist"].getFilename() self["coverArt"].updateCoverArt(path) def JumpToFolder(self, jumpto = None): if jumpto is None: return else: self["filelist"].changeDir(jumpto) self["currentfolder"].setText(("%s") % (jumpto)) def FavoriteFolders(self): self.session.openWithCallback(self.JumpToFolder, EVOMC_FavoriteFolders) def StartThumb(self): self.session.openWithCallback(self.returnVal, ThumbView, self.filelist.getFileList(), self.filelist.getFilename(), self.filelist.getCurrentDirectory()) def showThumb(self): if config.plugins.EVOMC_ap.showPreview.getValue() == False: return if self["filelist"].canDescent(): return else: if self["filelist"].getServiceRef() is not None: system("stfbcontrol a 255") self.ThumbTimer.stop() system("killall -9 showiframe") system("stfbcontrol a 255") self.filelist.refresh() self.session.nav.stopService() self.session.nav.playService(self["filelist"].getServiceRef()) self.currPlaying = 1 self["play"].instance.setPixmapFromFile(str(self.skindir) + "/images/icons/play_enabled.png") self["stop"].instance.setPixmapFromFile(str(self.skindir) + "/images/icons/stop_disabled.png") self.FileInfoTimer.start(2000, True) self.BlinkingPlayIconTimer.start(1000, True) def returnVal(self, val=0): if val > 0: for x in self.filelist.getFileList(): if x[0][1] == True: val += 1 self.filelist.moveToIndex(val) def StartExif(self): if not self.filelist.canDescent(): self.session.open(ExifView, self.filelist.getCurrentDirectory() + self.filelist.getFilename(), self.filelist.getFilename()) def visibility(self, force=1): if self.isVisible == True: self.isVisible = False self.hide() else: self.isVisible = True self.show() def BlinkingPlayIcon(self): if self.blinking: self.blinking=False self["play"].instance.setPixmapFromFile(str(self.skindir) + "/images/icons/play_disabled.png") self.BlinkingPlayIconTimer.start(1000, True) else: self.blinking=True self["play"].instance.setPixmapFromFile(str(self.skindir) + "/images/icons/play_enabled.png") self.BlinkingPlayIconTimer.start(1000, True) def StopPlayback(self): evfd.getInstance().vfd_write_string("STOP") if self.isVisible == False: self.show() self.isVisible = True if self.session.nav.getCurrentService() is None: return else: self.session.nav.stopService() self["play"].instance.setPixmapFromFile(str(self.skindir) + "/images/icons/play_disabled.png") self["stop"].instance.setPixmapFromFile(str(self.skindir) + "/images/icons/stop_enabled.png") self.currPlaying = 0 self.BlinkingPlayIconTimer.stop() self.ThumbTimer.stop() system("killall -9 showiframe") system("stfbcontrol a 255") self.ThumbTimer.start(config.plugins.EVOMC_ap.preview_delay.getValue() * 1000, True) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) system("vfdctl -play") system("vfdctl -mp3") system("vfdctl -music") self.StopPlayback() def showFileInfo(self): if self["filelist"].canDescent(): return else: system("stfbcontrol a 255") self.ThumbTimer.start(config.plugins.EVOMC_ap.preview_delay.getValue() * 1000, True) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) self.session.open(EVOMC_AudioInfoView, self["filelist"].getCurrentDirectory() + self["filelist"].getFilename() , self["filelist"].getFilename(), self["filelist"].getServiceRef()) def updateFileInfo(self): if self["filelist"].canDescent(): return currPlay = self.session.nav.getCurrentService() if currPlay is not None: stitle = currPlay.info().getInfoString(iServiceInformation.sTagTitle) sArtist = currPlay.info().getInfoString(iServiceInformation.sTagArtist) sAlbum = currPlay.info().getInfoString(iServiceInformation.sTagAlbum) sGenre = currPlay.info().getInfoString(iServiceInformation.sTagGenre) sYear = currPlay.info().getInfoString(iServiceInformation.sTimeCreate) # sComment = currPlay.info().getInfoString(iServiceInformation.sTagComment) if stitle == "": stitle = currPlay.info().getName().split('/')[-1] self["fileinfo"].setText("Title: " + stitle + "\nArtist: " + sArtist + "\nAlbum: " + sAlbum + "\nGenre: " + sGenre) self["curplayingtitle"].setText(stitle) else: pass def doEOF(self): try: print "EVO-MediaCenter: EOF Event ..." if self.PlaySingle == 0: print "Play Next File ..." self.ThumbTimer.stop() self.down() try: self.PlayService() except: pass else: print "Stop Playback ..." self.StopPlayback() system("vfdctl -play") system("vfdctl -mp3") system("vfdctl -music") except: pass def __evDecodeError(self): currPlay = self.session.nav.getCurrentService() sAudioType = currPlay.info().getInfoString(iServiceInformation.sUser+10) print "[__evAudioDecodeError] audio-codec %s can't be decoded by hardware" % (sAudioType) self.session.open(MessageBox, _("This UFS can't decode %s streams!") % sAudioType, type = MessageBox.TYPE_INFO,timeout = 5 ) def __evPluginError(self): currPlay = self.session.nav.getCurrentService() message = currPlay.info().getInfoString(iServiceInformation.sUser+12) print "[__evPluginError]" , message self.session.open(MessageBox, message, type = MessageBox.TYPE_INFO,timeout = 20 ) def Playlists(self): evfd.getInstance().vfd_write_string("PLAYLIST") self.ThumbTimer.stop() self.session.open(MessageBox,"Coming soon ... :)", MessageBox.TYPE_INFO) def KeyMenu(self): self.ThumbTimer.stop() if self["filelist"].canDescent(): if self.filelist.getCurrent()[0][1]: self.currentDirectory = self.filelist.getCurrent()[0][0] self.foldername = self.currentDirectory.split('/') self.foldername = self.foldername[-2] self.session.open(EVOMC_FolderOptions, self.currentDirectory, self.foldername) def Settings(self): evfd.getInstance().vfd_write_string("SETTINGS") system("stfbcontrol a 255") self.ThumbTimer.stop() self.session.open(AudioPlayerSettings) config.plugins.EVOMC_ap.save() config.plugins.EVOMC_all.save() def Exit(self): if self.isVisible == False: self.visibility() return if self.filelist.getCurrentDirectory() is None: config.plugins.EVOMC_ap.lastDir.value = "/" else: config.plugins.EVOMC_ap.lastDir.value = self.filelist.getCurrentDirectory() system("killall -9 showiframe") system("stfbcontrol a 255") system("vfdctl -play") system("vfdctl -mp3") system("vfdctl -music") self.ThumbTimer.stop() self.DimmerTimer.stop() self.FileInfoTimer.stop() del self["coverArt"].picload config.plugins.EVOMC_ap.save() config.plugins.EVOMC_all.save() self.session.nav.stopService() evfd.getInstance().vfd_write_string("EVO-MediaCenter") self.close()
class EVOMC_VideoPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarNotifications, HelpableScreen): def __init__(self, session): Screen.__init__(self, session) HelpableScreen.__init__(self) InfoBarNotifications.__init__(self) InfoBarBase.__init__(self) InfoBarSeek.__init__(self, actionmap="MediaPlayerSeekActions") self.isVisible = True self.oldService = self.session.nav.getCurrentlyPlayingServiceReference() self.session.nav.stopService() self.playlistparsers = {} self.addPlaylistParser(PlaylistIOM3U, "m3u") self.playlist = MyPlayList() self["fileinfo"] = Label() self["key_red"] = Button(_("Delete")) self["key_green"] = Button(_("")) self["key_yellow"] = Button("Favorites") self["key_blue"] = Button(_("Settings")) self["currentfolder"] = Label("") self["currentfavname"] = Label("") self.currList = "filelist" self.curfavfolder = -1 self["actions"] = HelpableActionMap( self, "EVOMC_VideoPlayerActions", { "ok": (self.KeyOk, "Play selected file"), "left": (self.leftUp, "List Top"), "right": (self.rightDown, "List Bottom"), "up": (self.up, "List up"), "down": (self.down, "List down"), "menu": (self.KeyMenu, "File / Folder Options"), "video": (self.visibility, "Show / Hide Player"), "nextBouquet": (self.NextFavFolder, "Next Favorite Folder"), "prevBouquet": (self.PrevFavFolder, "Previous Favorite Folder"), "stop": (self.StopPlayback, "Stop Playback"), "red": (self.deleteFile, "Delete File"), "yellow": (self.FavoriteFolders, "Favorite Folders"), # "green": (self.showPreview, "Preview"), "blue": (self.KeySettings, "Settings"), }, -2, ) self["InfobarShowHideActions"] = HelpableActionMap( self, "InfobarShowHideActions", {"toggleShow": (self.showFileInfo, "Show File Info")}, -2 ) self["OkCancelActions"] = HelpableActionMap( self, "OkCancelActions", {"cancel": (self.Exit, "Exit Video Player")}, -2 ) self.aspect = getAspect() currDir = config.plugins.EVOMC_vp.lastDir.value if not pathExists(currDir): currDir = "/" self["currentfolder"].setText(str(currDir)) if pathExists("/usr/lib/enigma2/python/Plugins/Extensions/DVDPlayer") is True: self.filelist = FileList( currDir, useServiceRef=True, showDirectories=True, showFiles=True, matchingPattern="(?i)^.*\.(mp4|ts|trp|wmv|mpg|vob|avi|mkv|dat|flac|m2ts|trp|flv)", ) else: self.filelist = FileList( currDir, useServiceRef=True, showDirectories=True, showFiles=True, matchingPattern="(?i)^.*\.(mp4|ts|trp|wmv|mpg|vob|avi|mkv|dat|flac|m2ts|trp|flv)", ) self["filelist"] = self.filelist self["thumbnail"] = Pixmap() evfd.getInstance().vfd_write_string("EVO-VIDEOPLAYER") # self.filelist.refresh() # self.ThumbTimer = eTimer() # self.ThumbTimer.callback.append(self.showThumb) # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) # self.filelistTimer = eTimer() # self.filelistTimer.callback.append(self.filelist.refresh()) # self.filelistTimer.start(60, True) self.DimmerTimer = eTimer() self.DimmerTimer.callback.append(self.showDimmer) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) self.__event_tracker = ServiceEventTracker( screen=self, eventmap={ iPlayableService.evUser + 11: self.__evDecodeError, iPlayableService.evUser + 12: self.__evPluginError, }, ) def addPlaylistParser(self, parser, extension): self.playlistparsers[extension] = parser def deleteFile(self): if self.currList == "filelist": self.service = self.filelist.getServiceRef() else: self.service = self.playlist.getSelection() if self.service is None: return if self.service.type != 4098 and self.session.nav.getCurrentlyPlayingServiceReference() is not None: if self.service == self.session.nav.getCurrentlyPlayingServiceReference(): self.stopEntry() serviceHandler = eServiceCenter.getInstance() offline = serviceHandler.offlineOperations(self.service) info = serviceHandler.info(self.service) name = info and info.getName(self.service) result = False if offline is not None: # simulate first if not offline.deleteFromDisk(1): result = True if result == True: self.session.openWithCallback( self.deleteConfirmed_offline, MessageBox, _("Do you really want to delete %s?") % (name) ) else: self.session.openWithCallback(self.close, MessageBox, _("You cannot delete this!"), MessageBox.TYPE_ERROR) def deleteConfirmed_offline(self, confirmed): if confirmed: serviceHandler = eServiceCenter.getInstance() offline = serviceHandler.offlineOperations(self.service) result = False if offline is not None: # really delete! if not offline.deleteFromDisk(0): result = True if result == False: self.session.open(MessageBox, _("Delete failed!"), MessageBox.TYPE_ERROR) else: self.removeListEntry() def removeListEntry(self): self.savePlaylistOnExit = True currdir = self.filelist.getCurrentDirectory() self.filelist.changeDir(currdir) deleteend = False while not deleteend: index = 0 deleteend = True if len(self.playlist) > 0: for x in self.playlist.list: if self.service == x[0]: self.playlist.deleteFile(index) deleteend = False break index += 1 self.playlist.updateList() if self.currList == "playlist": if len(self.playlist) == 0: self.switchToFileList() def up(self): system("stfbcontrol a 255") self["filelist"].up() # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) def down(self): system("stfbcontrol a 255") self["filelist"].down() # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) def leftUp(self): system("stfbcontrol a 255") self["filelist"].pageUp() # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) def rightDown(self): system("stfbcontrol a 255") self["filelist"].pageDown() # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) def showDimmer(self): if config.plugins.EVOMC_all.showDimmer.getValue(): system("stfbcontrol a 80") def NextFavFolder(self): system("stfbcontrol a 255") if self.curfavfolder + 1 < config.plugins.EVOMC_favorites.foldercount.value: self.curfavfolder += 1 self.favname = config.plugins.EVOMC_favorites.folders[self.curfavfolder].name.value self.folder = config.plugins.EVOMC_favorites.folders[self.curfavfolder].basedir.value self["currentfolder"].setText(("%s") % (self.folder)) self["currentfavname"].setText(("%s") % (self.favname)) if pathExists(self.folder) == True: self["filelist"].changeDir(self.folder) else: return def PrevFavFolder(self): system("stfbcontrol a 255") if self.curfavfolder <= 0: return else: self.curfavfolder -= 1 self.favname = config.plugins.EVOMC_favorites.folders[self.curfavfolder].name.value self.folder = config.plugins.EVOMC_favorites.folders[self.curfavfolder].basedir.value self["currentfolder"].setText(("%s") % (self.folder)) self["currentfavname"].setText(("%s") % (self.favname)) if pathExists(self.folder) == True: self["filelist"].changeDir(self.folder) # def showPreview(self): # system("stfbcontrol a 255") # if self["filelist"].canDescent(): # return # else: # if self["filelist"].getServiceRef() is not None: # self.DimmerTimer.stop() # self.session.nav.stopService() # self.session.nav.playService(self["filelist"].getServiceRef()) # def showThumb(self): # if config.plugins.EVOMC_vp.showPreview.getValue() == False: # return # if self["filelist"].canDescent(): # return # else: # if self["filelist"].getServiceRef() is not None: # self.DimmerTimer.stop() # self.session.nav.stopService() # self.session.nav.playService(self["filelist"].getServiceRef()) def showFileInfo(self): if self["filelist"].canDescent(): return else: system("stfbcontrol a 255") # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) self.session.open( EVOMC_VideoInfoView, self["filelist"].getCurrentDirectory() + self["filelist"].getFilename(), self["filelist"].getFilename(), self["filelist"].getServiceRef(), ) def KeyOk(self): system("stfbcontrol a 255") system("echo 3 -> /dev/ttyAS1") self.filelist.refresh() if self.isVisible == False: self.visibility() return # self.ThumbTimer.stop() self.DimmerTimer.stop() if self.filelist.canDescent(): self.filelist.descent() else: evfd.getInstance().vfd_write_string("PLAY") if self.filelist.getServiceRef().type == 4098: ServiceRef = self.filelist.getServiceRef() extension = ServiceRef.getPath()[ServiceRef.getPath().rfind(".") + 1 :] if self.playlistparsers.has_key(extension): playlist = self.playlistparsers[extension]() list = playlist.open(ServiceRef.getPath()) for x in list: self.playlist.addFile(x.ref) self.playlist.updateList() else: self.playlist.addFile(self.filelist.getServiceRef()) self.playlist.updateList() currref = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()] print "currref !!!!!!!!!!!!!!!!!!!!!!!!!", currref self.session.open(MoviePlayer, currref) # system("echo " + hex(config.plugins.EVOMC_globalsettings.dst_top.value)[2:] + " > /proc/stb/vmpeg/0/dst_top") # system("echo " + hex(config.plugins.EVOMC_globalsettings.dst_left.value)[2:] + " > /proc/stb/vmpeg/0/dst_left") # system("echo " + hex(config.plugins.EVOMC_globalsettings.dst_width.value)[2:] + " > /proc/stb/vmpeg/0/dst_width") # system("echo " + hex(config.plugins.EVOMC_globalsettings.dst_height.value)[2:] + " > /proc/stb/vmpeg/0/dst_height") def KeyMenu(self): # self.ThumbTimer.stop() if self["filelist"].canDescent(): if self.filelist.getCurrent()[0][1]: self.currentDirectory = self.filelist.getCurrent()[0][0] foldername = self.currentDirectory.split("/") foldername = foldername[-2] self.session.open(EVOMC_FolderOptions, self.currentDirectory, foldername) # def StartThumb(self): # self.session.openWithCallback(self.returnVal, ThumbView, self.filelist.getFileList(), self.filelist.getFilename(), self.filelist.getCurrentDirectory()) # def returnVal(self, val=0): # if val > 0: # for x in self.filelist.getFileList(): # if x[0][1] == True: # val += 1 # self.filelist.moveToIndex(val) # def StartExif(self): # if not self.filelist.canDescent(): # self.session.open(ExifView, self.filelist.getCurrentDirectory() + self.filelist.getFilename(), self.filelist.getFilename()) def visibility(self, force=1): if self.isVisible == True: self.isVisible = False self.hide() else: self.isVisible = True self.show() def StopPlayback(self): # self.ThumbTimer.stop() system("echo C -> /dev/ttyAS1") self.session.nav.stopService() self.session.nav.playService(self.oldService) # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) self.DimmerTimer.start(config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) system("stfbcontrol a 255") self.show() def JumpToFolder(self, jumpto=None): if jumpto is None: return else: self["filelist"].changeDir(jumpto) self["currentfolder"].setText(("%s") % (jumpto)) def FavoriteFolders(self): self.session.openWithCallback(self.JumpToFolder, EVOMC_FavoriteFolders) def KeySettings(self): self.session.open(VideoPlayerSettings) config.plugins.EVOMC_vp.save() config.plugins.EVOMC_all.save() def __evDecodeError(self): currPlay = self.session.nav.getCurrentService() sVideoType = currPlay.info().getInfoString(iServiceInformation.sVideoType) print "[__evDecodeError] video-codec %s can't be decoded by hardware" % (sVideoType) self.session.open( MessageBox, _("This Dreambox can't decode %s video streams!") % sVideoType, type=MessageBox.TYPE_INFO, timeout=10, ) def __evPluginError(self): currPlay = self.session.nav.getCurrentService() message = currPlay.info().getInfoString(iServiceInformation.sUser + 12) print "[__evPluginError]", message self.session.open(MessageBox, ("GStreamer Error: missing %s") % message, type=MessageBox.TYPE_INFO, timeout=20) def Exit(self): system("stfbcontrol a 255") if self.isVisible == False: self.visibility() return if self.filelist.getCurrentDirectory() is None: config.plugins.EVOMC_vp.lastDir.value = "/" else: config.plugins.EVOMC_vp.lastDir.value = self.filelist.getCurrentDirectory() self.session.nav.stopService() self.DimmerTimer.stop() config.plugins.EVOMC_vp.save() config.plugins.EVOMC_all.save() self.close() def showAfterSeek(self): self.show() def checkSkipShowHideLock(self): self.updatedSeekState() def unPauseService(self): self.setSeekState(self.SEEK_STATE_PLAY) def updatedSeekState(self): if self.seekstate == self.SEEK_STATE_PAUSE: self.playlist.pauseFile() elif self.seekstate == self.SEEK_STATE_PLAY: self.playlist.playFile() elif self.isStateForward(self.seekstate): self.playlist.forwardFile() elif self.isStateBackward(self.seekstate): self.playlist.rewindFile() def addPlaylistParser(self, parser, extension): self.playlistparsers[extension] = parser
class EVOMC_VideoPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarNotifications, HelpableScreen): def __init__(self, session): Screen.__init__(self, session) HelpableScreen.__init__(self) InfoBarNotifications.__init__(self) InfoBarBase.__init__(self) InfoBarSeek.__init__(self, actionmap="MediaPlayerSeekActions") self.isVisible = True self.oldService = self.session.nav.getCurrentlyPlayingServiceReference( ) self.session.nav.stopService() self.playlistparsers = {} self.addPlaylistParser(PlaylistIOM3U, "m3u") self.playlist = MyPlayList() self["fileinfo"] = Label() self["key_red"] = Button(_("Delete")) self["key_green"] = Button(_("")) self["key_yellow"] = Button("Favorites") self["key_blue"] = Button(_("Settings")) self["currentfolder"] = Label("") self["currentfavname"] = Label("") self.currList = "filelist" self.curfavfolder = -1 self["actions"] = HelpableActionMap( self, "EVOMC_VideoPlayerActions", { "ok": (self.KeyOk, "Play selected file"), "left": (self.leftUp, "List Top"), "right": (self.rightDown, "List Bottom"), "up": (self.up, "List up"), "down": (self.down, "List down"), "menu": (self.KeyMenu, "File / Folder Options"), "video": (self.visibility, "Show / Hide Player"), "nextBouquet": (self.NextFavFolder, "Next Favorite Folder"), "prevBouquet": (self.PrevFavFolder, "Previous Favorite Folder"), "stop": (self.StopPlayback, "Stop Playback"), "red": (self.deleteFile, "Delete File"), "yellow": (self.FavoriteFolders, "Favorite Folders"), # "green": (self.showPreview, "Preview"), "blue": (self.KeySettings, "Settings"), }, -2) self["InfobarShowHideActions"] = HelpableActionMap( self, "InfobarShowHideActions", { "toggleShow": (self.showFileInfo, "Show File Info"), }, -2) self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", { "cancel": (self.Exit, "Exit Video Player"), }, -2) self.aspect = getAspect() currDir = config.plugins.EVOMC_vp.lastDir.value if not pathExists(currDir): currDir = "/" self["currentfolder"].setText(str(currDir)) if pathExists("/usr/lib/enigma2/python/Plugins/Extensions/DVDPlayer" ) is True: self.filelist = FileList( currDir, useServiceRef=True, showDirectories=True, showFiles=True, matchingPattern= "(?i)^.*\.(mp4|ts|trp|wmv|mpg|vob|avi|mkv|dat|flac|m2ts|trp|flv)" ) else: self.filelist = FileList( currDir, useServiceRef=True, showDirectories=True, showFiles=True, matchingPattern= "(?i)^.*\.(mp4|ts|trp|wmv|mpg|vob|avi|mkv|dat|flac|m2ts|trp|flv)" ) self["filelist"] = self.filelist self["thumbnail"] = Pixmap() evfd.getInstance().vfd_write_string("EVO-VIDEOPLAYER") # self.filelist.refresh() # self.ThumbTimer = eTimer() # self.ThumbTimer.callback.append(self.showThumb) # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) # self.filelistTimer = eTimer() # self.filelistTimer.callback.append(self.filelist.refresh()) # self.filelistTimer.start(60, True) self.DimmerTimer = eTimer() self.DimmerTimer.callback.append(self.showDimmer) self.DimmerTimer.start( config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) self.__event_tracker = ServiceEventTracker( screen=self, eventmap={ iPlayableService.evUser + 11: self.__evDecodeError, iPlayableService.evUser + 12: self.__evPluginError }) def addPlaylistParser(self, parser, extension): self.playlistparsers[extension] = parser def deleteFile(self): if self.currList == "filelist": self.service = self.filelist.getServiceRef() else: self.service = self.playlist.getSelection() if self.service is None: return if self.service.type != 4098 and self.session.nav.getCurrentlyPlayingServiceReference( ) is not None: if self.service == self.session.nav.getCurrentlyPlayingServiceReference( ): self.stopEntry() serviceHandler = eServiceCenter.getInstance() offline = serviceHandler.offlineOperations(self.service) info = serviceHandler.info(self.service) name = info and info.getName(self.service) result = False if offline is not None: # simulate first if not offline.deleteFromDisk(1): result = True if result == True: self.session.openWithCallback( self.deleteConfirmed_offline, MessageBox, _("Do you really want to delete %s?") % (name)) else: self.session.openWithCallback(self.close, MessageBox, _("You cannot delete this!"), MessageBox.TYPE_ERROR) def deleteConfirmed_offline(self, confirmed): if confirmed: serviceHandler = eServiceCenter.getInstance() offline = serviceHandler.offlineOperations(self.service) result = False if offline is not None: # really delete! if not offline.deleteFromDisk(0): result = True if result == False: self.session.open(MessageBox, _("Delete failed!"), MessageBox.TYPE_ERROR) else: self.removeListEntry() def removeListEntry(self): self.savePlaylistOnExit = True currdir = self.filelist.getCurrentDirectory() self.filelist.changeDir(currdir) deleteend = False while not deleteend: index = 0 deleteend = True if len(self.playlist) > 0: for x in self.playlist.list: if self.service == x[0]: self.playlist.deleteFile(index) deleteend = False break index += 1 self.playlist.updateList() if self.currList == "playlist": if len(self.playlist) == 0: self.switchToFileList() def up(self): system("stfbcontrol a 255") self["filelist"].up() # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) self.DimmerTimer.start( config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) def down(self): system("stfbcontrol a 255") self["filelist"].down() # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) self.DimmerTimer.start( config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) def leftUp(self): system("stfbcontrol a 255") self["filelist"].pageUp() # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) self.DimmerTimer.start( config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) def rightDown(self): system("stfbcontrol a 255") self["filelist"].pageDown() # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) self.DimmerTimer.start( config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) def showDimmer(self): if config.plugins.EVOMC_all.showDimmer.getValue(): system("stfbcontrol a 80") def NextFavFolder(self): system("stfbcontrol a 255") if self.curfavfolder + 1 < config.plugins.EVOMC_favorites.foldercount.value: self.curfavfolder += 1 self.favname = config.plugins.EVOMC_favorites.folders[ self.curfavfolder].name.value self.folder = config.plugins.EVOMC_favorites.folders[ self.curfavfolder].basedir.value self["currentfolder"].setText(("%s") % (self.folder)) self["currentfavname"].setText(("%s") % (self.favname)) if pathExists(self.folder) == True: self["filelist"].changeDir(self.folder) else: return def PrevFavFolder(self): system("stfbcontrol a 255") if self.curfavfolder <= 0: return else: self.curfavfolder -= 1 self.favname = config.plugins.EVOMC_favorites.folders[ self.curfavfolder].name.value self.folder = config.plugins.EVOMC_favorites.folders[ self.curfavfolder].basedir.value self["currentfolder"].setText(("%s") % (self.folder)) self["currentfavname"].setText(("%s") % (self.favname)) if pathExists(self.folder) == True: self["filelist"].changeDir(self.folder) # def showPreview(self): # system("stfbcontrol a 255") # if self["filelist"].canDescent(): # return # else: # if self["filelist"].getServiceRef() is not None: # self.DimmerTimer.stop() # self.session.nav.stopService() # self.session.nav.playService(self["filelist"].getServiceRef()) # def showThumb(self): # if config.plugins.EVOMC_vp.showPreview.getValue() == False: # return # if self["filelist"].canDescent(): # return # else: # if self["filelist"].getServiceRef() is not None: # self.DimmerTimer.stop() # self.session.nav.stopService() # self.session.nav.playService(self["filelist"].getServiceRef()) def showFileInfo(self): if self["filelist"].canDescent(): return else: system("stfbcontrol a 255") # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) self.DimmerTimer.start( config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) self.session.open( EVOMC_VideoInfoView, self["filelist"].getCurrentDirectory() + self["filelist"].getFilename(), self["filelist"].getFilename(), self["filelist"].getServiceRef()) def KeyOk(self): system("stfbcontrol a 255") system("echo 3 -> /dev/ttyAS1") self.filelist.refresh() if self.isVisible == False: self.visibility() return # self.ThumbTimer.stop() self.DimmerTimer.stop() if self.filelist.canDescent(): self.filelist.descent() else: evfd.getInstance().vfd_write_string("PLAY") if self.filelist.getServiceRef().type == 4098: ServiceRef = self.filelist.getServiceRef() extension = ServiceRef.getPath( )[ServiceRef.getPath().rfind('.') + 1:] if self.playlistparsers.has_key(extension): playlist = self.playlistparsers[extension]() list = playlist.open(ServiceRef.getPath()) for x in list: self.playlist.addFile(x.ref) self.playlist.updateList() else: self.playlist.addFile(self.filelist.getServiceRef()) self.playlist.updateList() currref = self.playlist.getServiceRefList()[ self.playlist.getCurrentIndex()] print "currref !!!!!!!!!!!!!!!!!!!!!!!!!", currref self.session.open(MoviePlayer, currref) # system("echo " + hex(config.plugins.EVOMC_globalsettings.dst_top.value)[2:] + " > /proc/stb/vmpeg/0/dst_top") # system("echo " + hex(config.plugins.EVOMC_globalsettings.dst_left.value)[2:] + " > /proc/stb/vmpeg/0/dst_left") # system("echo " + hex(config.plugins.EVOMC_globalsettings.dst_width.value)[2:] + " > /proc/stb/vmpeg/0/dst_width") # system("echo " + hex(config.plugins.EVOMC_globalsettings.dst_height.value)[2:] + " > /proc/stb/vmpeg/0/dst_height") def KeyMenu(self): # self.ThumbTimer.stop() if self["filelist"].canDescent(): if self.filelist.getCurrent()[0][1]: self.currentDirectory = self.filelist.getCurrent()[0][0] foldername = self.currentDirectory.split('/') foldername = foldername[-2] self.session.open(EVOMC_FolderOptions, self.currentDirectory, foldername) # def StartThumb(self): # self.session.openWithCallback(self.returnVal, ThumbView, self.filelist.getFileList(), self.filelist.getFilename(), self.filelist.getCurrentDirectory()) # def returnVal(self, val=0): # if val > 0: # for x in self.filelist.getFileList(): # if x[0][1] == True: # val += 1 # self.filelist.moveToIndex(val) # def StartExif(self): # if not self.filelist.canDescent(): # self.session.open(ExifView, self.filelist.getCurrentDirectory() + self.filelist.getFilename(), self.filelist.getFilename()) def visibility(self, force=1): if self.isVisible == True: self.isVisible = False self.hide() else: self.isVisible = True self.show() def StopPlayback(self): # self.ThumbTimer.stop() system("echo C -> /dev/ttyAS1") self.session.nav.stopService() self.session.nav.playService(self.oldService) # self.ThumbTimer.start(config.plugins.EVOMC_vp.preview_delay.getValue() * 1000, True) self.DimmerTimer.start( config.plugins.EVOMC_all.dimmer_delay.getValue() * 1000, True) system("stfbcontrol a 255") self.show() def JumpToFolder(self, jumpto=None): if jumpto is None: return else: self["filelist"].changeDir(jumpto) self["currentfolder"].setText(("%s") % (jumpto)) def FavoriteFolders(self): self.session.openWithCallback(self.JumpToFolder, EVOMC_FavoriteFolders) def KeySettings(self): self.session.open(VideoPlayerSettings) config.plugins.EVOMC_vp.save() config.plugins.EVOMC_all.save() def __evDecodeError(self): currPlay = self.session.nav.getCurrentService() sVideoType = currPlay.info().getInfoString( iServiceInformation.sVideoType) print "[__evDecodeError] video-codec %s can't be decoded by hardware" % ( sVideoType) self.session.open(MessageBox, _("This Dreambox can't decode %s video streams!") % sVideoType, type=MessageBox.TYPE_INFO, timeout=10) def __evPluginError(self): currPlay = self.session.nav.getCurrentService() message = currPlay.info().getInfoString(iServiceInformation.sUser + 12) print "[__evPluginError]", message self.session.open(MessageBox, ("GStreamer Error: missing %s") % message, type=MessageBox.TYPE_INFO, timeout=20) def Exit(self): system("stfbcontrol a 255") if self.isVisible == False: self.visibility() return if self.filelist.getCurrentDirectory() is None: config.plugins.EVOMC_vp.lastDir.value = "/" else: config.plugins.EVOMC_vp.lastDir.value = self.filelist.getCurrentDirectory( ) self.session.nav.stopService() self.DimmerTimer.stop() config.plugins.EVOMC_vp.save() config.plugins.EVOMC_all.save() self.close() def showAfterSeek(self): self.show() def checkSkipShowHideLock(self): self.updatedSeekState() def unPauseService(self): self.setSeekState(self.SEEK_STATE_PLAY) def updatedSeekState(self): if self.seekstate == self.SEEK_STATE_PAUSE: self.playlist.pauseFile() elif self.seekstate == self.SEEK_STATE_PLAY: self.playlist.playFile() elif self.isStateForward(self.seekstate): self.playlist.forwardFile() elif self.isStateBackward(self.seekstate): self.playlist.rewindFile() def addPlaylistParser(self, parser, extension): self.playlistparsers[extension] = parser