X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/3b90c686f9c7821d8567dc5725ad1565d59e9a89..41f90e2892a469f8d3bf7aeb8bfff87eb5cb6253:/lib/python/Screens/MediaPlayer.py diff --git a/lib/python/Screens/MediaPlayer.py b/lib/python/Screens/MediaPlayer.py index 9b06d1f4..39d7ab99 100644 --- a/lib/python/Screens/MediaPlayer.py +++ b/lib/python/Screens/MediaPlayer.py @@ -10,20 +10,29 @@ from Components.Label import Label from Components.FileList import FileEntryComponent, FileList from Components.MediaPlayer import PlayList, PlaylistEntryComponent from Plugins.Plugin import PluginDescriptor -from Tools.Directories import resolveFilename, SCOPE_MEDIA +from Tools.Directories import resolveFilename, SCOPE_MEDIA, SCOPE_CONFIG from Components.ServicePosition import ServicePositionGauge from Screens.ChoiceBox import ChoiceBox from Components.ServiceEventTracker import ServiceEventTracker +from Components.Playlist import PlaylistIOInternal, PlaylistIOM3U, PlaylistIOPLS from Screens.InfoBarGenerics import InfoBarSeek +from ServiceReference import ServiceReference +from Screens.ChoiceBox import ChoiceBox import os class MediaPlayer(Screen, InfoBarSeek): def __init__(self, session, args = None): Screen.__init__(self, session) + self.oldService = self.session.nav.getCurrentlyPlayingServiceReference() self.session.nav.stopService() - - self.filelist = FileList(resolveFilename(SCOPE_MEDIA), matchingPattern = "^.*\.(mp3|ogg|ts|avi)", useServiceRef = True) + + self.playlistparsers = {} + self.addPlaylistParser(PlaylistIOM3U, "m3u") + self.addPlaylistParser(PlaylistIOPLS, "pls") + self.addPlaylistParser(PlaylistIOInternal, "e2pls") + + self.filelist = FileList(resolveFilename(SCOPE_MEDIA), matchingPattern = "^.*\.(mp3|ogg|ts|wav|wave|m3u|pls|e2pls)", useServiceRef = True) self["filelist"] = self.filelist self.playlist = PlayList() @@ -45,11 +54,20 @@ class MediaPlayer(Screen, InfoBarSeek): self["genre"] = Label("") #self["text"] = Input("1234", maxSize=True, type=Input.NUMBER) - - self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "NumberActions", "MediaPlayerSeekActions"], + + 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["actions"] = MoviePlayerActionMap(self, ["OkCancelActions", "DirectionActions", "NumberActions", "MediaPlayerSeekActions"], { "ok": self.ok, - "cancel": self.close, + "cancel": self.exit, "right": self.rightDown, "rightRepeated": self.doNothing, @@ -88,9 +106,9 @@ class MediaPlayer(Screen, InfoBarSeek): self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { -# iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged, -# iPlayableService.evStart: self.__serviceStarted, - + #iPlayableService.evStart: self.__serviceStarted, + #iPlayableService.evSeekableStatusChanged: InfoBarSeek.__seekableStatusChanged, + iPlayableService.evEOF: self.__evEOF, # iPlayableService.evSOF: self.__evSOF, }) @@ -106,24 +124,65 @@ class MediaPlayer(Screen, InfoBarSeek): self.leftKeyTimer = eTimer() self.leftKeyTimer.timeout.get().append(self.leftTimerFire) + self.infoTimer = eTimer() + self.infoTimer.timeout.get().append(self.infoTimerFire) + self.infoTimer.start(500) + self.currList = "filelist" + 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() + def doNothing(self): pass + def exit(self): + self.playlistIOInternal.clear() + for x in self.playlist.list: + self.playlistIOInternal.addService(ServiceReference(x[0])) + self.playlistIOInternal.save(resolveFilename(SCOPE_CONFIG, "playlist.e2pls")) + self.close() + def checkSkipShowHideLock(self): self.updatedSeekState() def __evEOF(self): self.nextEntry() - + def __onClose(self): - self.session.nav.playService(None) + self.session.nav.playService(self.oldService) def delMPTimer(self): del self.rightKeyTimer del self.leftKeyTimer + del self.infoTimer + def infoTimerFire(self): + currPlay = self.session.nav.getCurrentService() + if currPlay is not None: + self.updateMusicInformation( artist = currPlay.info().getInfoString(iServiceInformation.sArtist), + title = currPlay.info().getInfoString(iServiceInformation.sTitle), + album = currPlay.info().getInfoString(iServiceInformation.sAlbum), + genre = currPlay.info().getInfoString(iServiceInformation.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 fwdTimerFire(self): self.fwdKeyTimer.stop() @@ -222,6 +281,7 @@ class MediaPlayer(Screen, InfoBarSeek): menu.append((_("switch to filelist"), "filelist")) menu.append((_("delete"), "delete")) menu.append((_("clear playlist"), "clear")) + menu.append((_("hide player"), "hide")); self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu) def menuCallback(self, choice): @@ -237,12 +297,16 @@ class MediaPlayer(Screen, InfoBarSeek): elif choice[1] == "filelist": self.switchToFileList() elif choice[1] == "delete": + if self.playlist.getSelectionIndex() == self.playlist.getCurrentIndex(): + self.stopEntry() self.deleteEntry() elif choice[1] == "clear": self.stopEntry() self.playlist.clear() self.switchToFileList() - + elif choice[1] == "hide": + self.hide() + def copyDirectory(self, directory): filelist = FileList(directory, useServiceRef = True, isTop = True) @@ -253,11 +317,39 @@ class MediaPlayer(Screen, InfoBarSeek): self.playlist.addFile(x[0][0]) self.playlist.updateList() + ADDPLAYLIST = 0 + REPLACEPLAYLIST = 1 + def copyFile(self): - self.playlist.addFile(self.filelist.getServiceRef()) - self.playlist.updateList() - if len(self.playlist) == 1: - self.playEntry() + if self.filelist.getServiceRef().type == 4098: # playlist + list = [] + list.append((_("Add files to playlist"), (self.ADDPLAYLIST, self.filelist.getServiceRef()))) + list.append((_("Replace current playlist"), (self.REPLACEPLAYLIST, self.filelist.getServiceRef()))) + self.session.openWithCallback(self.playlistCallback, ChoiceBox, title=_("You selected a playlist"), list = list) + 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 playlistCallback(self, answer): + if answer is not None: + extension = answer[1][1].getPath()[answer[1][1].getPath().rfind('.') + 1:] + print "extension:", extension + if self.playlistparsers.has_key(extension): + playlist = self.playlistparsers[extension]() + if answer[1][0] == self.REPLACEPLAYLIST: + self.stopEntry() + self.playlist.clear() + self.switchToFileList() + if answer[1][0] == self.REPLACEPLAYLIST or answer[1][0] == self.ADDPLAYLIST: + list = playlist.open(answer[1][1].getPath()) + for x in list: + self.playlist.addFile(x.ref) + def nextEntry(self): next = self.playlist.getCurrentIndex() + 1 @@ -280,15 +372,15 @@ class MediaPlayer(Screen, InfoBarSeek): self.playEntry() def playEntry(self): - currref = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()] - if self.session.nav.getCurrentlyPlayingServiceReference() is None or currref != self.session.nav.getCurrentlyPlayingServiceReference(): - self.session.nav.playService(self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()]) - info = eServiceCenter.getInstance().info(currref) - description = info.getInfoString(currref, iServiceInformation.sDescription) - self["title"].setText(description) - self.unPauseService() - - + if len(self.playlist.getServiceRefList()): + currref = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()] + if self.session.nav.getCurrentlyPlayingServiceReference() is None or currref != self.session.nav.getCurrentlyPlayingServiceReference(): + 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) + self.unPauseService() + def updatedSeekState(self): if self.seekstate == self.SEEK_STATE_PAUSE: self.playlist.pauseFile() @@ -313,5 +405,10 @@ class MediaPlayer(Screen, InfoBarSeek): def stopEntry(self): self.playlist.stopFile() self.session.nav.playService(None) + self.updateMusicInformation(clear=True) + + def unPauseService(self): + self.setSeekState(self.SEEK_STATE_PLAY) +