change .e2 to .e2pls
[enigma2.git] / lib / python / Screens / MediaPlayer.py
index 9b06d1f4f0cb5fd1859a2347b112c0b29dcd4bbc..39d7ab9952a10a1416c5678571031d014fa42595 100644 (file)
@@ -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 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.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 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)
 
 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.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()
                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["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,
                {
                        "ok": self.ok,
-                       "cancel": self.close,
+                       "cancel": self.exit,
                        
                        "right": self.rightDown,
                        "rightRepeated": self.doNothing,
                        
                        "right": self.rightDown,
                        "rightRepeated": self.doNothing,
@@ -88,9 +106,9 @@ class MediaPlayer(Screen, InfoBarSeek):
 
                self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
                        {
 
                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,
                        })
                                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.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.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 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 checkSkipShowHideLock(self):
                self.updatedSeekState()
        
        def __evEOF(self):
                self.nextEntry()
-               
+       
        def __onClose(self):
        def __onClose(self):
-               self.session.nav.playService(None)
+               self.session.nav.playService(self.oldService)
        
        def delMPTimer(self):
                del self.rightKeyTimer
                del self.leftKeyTimer
        
        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()
 
        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((_("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):
                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":
                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()
                        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)
                
        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()
        
                                self.playlist.addFile(x[0][0])
                self.playlist.updateList()
        
+       ADDPLAYLIST = 0
+       REPLACEPLAYLIST = 1
+       
        def copyFile(self):
        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
 
        def nextEntry(self):
                next = self.playlist.getCurrentIndex() + 1
@@ -280,15 +372,15 @@ class MediaPlayer(Screen, InfoBarSeek):
                self.playEntry()
        
        def playEntry(self):
                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()
        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)
        def stopEntry(self):
                self.playlist.stopFile()
                self.session.nav.playService(None)
+               self.updateMusicInformation(clear=True)
+
+       def unPauseService(self):
+               self.setSeekState(self.SEEK_STATE_PLAY)
+