Pip is now working with CI
[enigma2.git] / lib / python / Screens / MediaPlayer.py
index b38cb1b7b91fd2d4af6fa779652ade52fa2ce738..835bfd4dad76fd123060aeade298f2cf299da2e2 100644 (file)
@@ -10,11 +10,14 @@ 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
 
 
 import os
 
@@ -23,8 +26,13 @@ class MediaPlayer(Screen, InfoBarSeek):
                Screen.__init__(self, session)
                self.oldService = self.session.nav.getCurrentlyPlayingServiceReference()
                self.session.nav.stopService()
                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 = "^.*\.(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()
@@ -46,8 +54,17 @@ 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,
                        "cancel": self.exit,
                {
                        "ok": self.ok,
                        "cancel": self.exit,
@@ -89,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,
                        })
@@ -113,10 +130,21 @@ class MediaPlayer(Screen, InfoBarSeek):
                
                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 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 +152,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)
        
@@ -253,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):
@@ -268,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)
                
@@ -284,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.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
@@ -316,7 +377,7 @@ class MediaPlayer(Screen, InfoBarSeek):
                        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)
                        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)
+                               description = info and info.getInfoString(currref, iServiceInformation.sDescription) or ""
                                self["title"].setText(description)
                        self.unPauseService()
                                
                                self["title"].setText(description)
                        self.unPauseService()
                                
@@ -344,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)
+