some cleanups
[enigma2.git] / lib / python / Screens / MediaPlayer.py
index fe1e0a8fd857dbece1c25f3618187df5031b8b89..8f92df5e1232eb8ba9bd8c7e52650c3d453fba37 100644 (file)
@@ -10,21 +10,31 @@ 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, SCOPE_SKIN_IMAGE
 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):
 
 import os
 
 class MediaPlayer(Screen, InfoBarSeek):
+       ALLOW_SUSPEND = True
+       
        def __init__(self, session, args = None):
                Screen.__init__(self, session)
                self.oldService = self.session.nav.getCurrentlyPlayingServiceReference()
                self.session.nav.stopService()
        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|wav|wave)", useServiceRef = True)
+
+               self.playlistparsers = {}
+               self.addPlaylistParser(PlaylistIOM3U, "m3u")
+               self.addPlaylistParser(PlaylistIOPLS, "pls")
+               self.addPlaylistParser(PlaylistIOInternal, "e2pls")
+
+               self.filelist = FileList(resolveFilename(SCOPE_MEDIA), matchingPattern = "(?i)^.*\.(mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob)", useServiceRef = True)
                self["filelist"] = self.filelist
 
                self.playlist = PlayList()
                self["filelist"] = self.filelist
 
                self.playlist = PlayList()
@@ -44,10 +54,20 @@ class MediaPlayer(Screen, InfoBarSeek):
                self["year"] = Label("")
                self["genretext"] = Label(_("Genre:"))
                self["genre"] = Label("")
                self["year"] = Label("")
                self["genretext"] = Label(_("Genre:"))
                self["genre"] = Label("")
+               self["coverArt"] = Pixmap()
                
                #self["text"] = Input("1234", maxSize=True, type=Input.NUMBER)
                
                #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.exit,
                {
                        "ok": self.ok,
                        "cancel": self.exit,
@@ -89,9 +109,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,
                        })
@@ -112,11 +132,24 @@ class MediaPlayer(Screen, InfoBarSeek):
                self.infoTimer.start(500)
                
                self.currList = "filelist"
                self.infoTimer.start(500)
                
                self.currList = "filelist"
+
+               self.coverArtFileName = ""
+               
+               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):
                
        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.close()
        
        def checkSkipShowHideLock(self):
@@ -124,7 +157,7 @@ class MediaPlayer(Screen, InfoBarSeek):
        
        def __evEOF(self):
                self.nextEntry()
        
        def __evEOF(self):
                self.nextEntry()
-               
+       
        def __onClose(self):
                self.session.nav.playService(self.oldService)
        
        def __onClose(self):
                self.session.nav.playService(self.oldService)
        
@@ -141,8 +174,10 @@ class MediaPlayer(Screen, InfoBarSeek):
                                                                                 album = currPlay.info().getInfoString(iServiceInformation.sAlbum),
                                                                                 genre = currPlay.info().getInfoString(iServiceInformation.sGenre),
                                                                                 clear = True)
                                                                                 album = currPlay.info().getInfoString(iServiceInformation.sAlbum),
                                                                                 genre = currPlay.info().getInfoString(iServiceInformation.sGenre),
                                                                                 clear = True)
+                       self.updateCoverArtPixmap( currPlay.info().getName() )
                else:
                        self.updateMusicInformation()
                else:
                        self.updateMusicInformation()
+                       self.updateCoverArtPixmap( "" )
        
        def updateMusicInformation(self, artist = "", title = "", album = "", year = "", genre = "", clear = False):
                self.updateSingleMusicInformation("artist", artist, clear)
        
        def updateMusicInformation(self, artist = "", title = "", album = "", year = "", genre = "", clear = False):
                self.updateSingleMusicInformation("artist", artist, clear)
@@ -156,6 +191,19 @@ class MediaPlayer(Screen, InfoBarSeek):
                        if self[name].getText() != info:
                                self[name].setText(info)
 
                        if self[name].getText() != info:
                                self[name].setText(info)
 
+       def updateCoverArtPixmap(self, currentServiceName):
+               filename = currentServiceName
+               # The "getName" usually adds something like "MP3 File:" infront of filename
+               # Get rid of this...by finding the first "/"
+               filename = filename[filename.find("/"):]
+               path = os.path.dirname(filename)
+               pngname = path + "/" + "folder.png"
+               if not os.path.exists(pngname):
+                       pngname = resolveFilename(SCOPE_SKIN_IMAGE, "no_coverArt.png")
+               if self.coverArtFileName != pngname:
+                       self.coverArtFileName = pngname
+                       self["coverArt"].instance.setPixmapFromFile(self.coverArtFileName)
+
        def fwdTimerFire(self):
                self.fwdKeyTimer.stop()
                self.fwdtimer = False
        def fwdTimerFire(self):
                self.fwdKeyTimer.stop()
                self.fwdtimer = False
@@ -253,6 +301,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):
@@ -268,12 +317,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)
                
@@ -284,11 +337,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.changeEntry(0)
+               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
@@ -311,15 +392,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()
@@ -344,5 +425,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)
+