X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/75e207fb2728784db1c8bf3d0e9c52cc3fa323a9..8105da47caaa6e47246d73239d056491fa091ae5:/lib/python/Plugins/Extensions/MediaPlayer/plugin.py diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index 27b47768..afb8772e 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -6,7 +6,7 @@ from Screens.MessageBox import MessageBox from Screens.InputBox import InputBox from Components.ActionMap import NumberActionMap, HelpableActionMap from Components.Label import Label -from Components.Pixmap import Pixmap +from Components.Pixmap import Pixmap,MultiPixmap from Components.Label import Label from Components.FileList import FileList from Components.MediaPlayer import PlayList @@ -14,7 +14,7 @@ from Tools.Directories import resolveFilename, SCOPE_CONFIG, SCOPE_PLAYLIST, SCO from Components.ServicePosition import ServicePositionGauge from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase from Components.Playlist import PlaylistIOInternal, PlaylistIOM3U, PlaylistIOPLS -from Screens.InfoBarGenerics import InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications +from Screens.InfoBarGenerics import InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport from ServiceReference import ServiceReference from Screens.ChoiceBox import ChoiceBox from Screens.HelpMenu import HelpableScreen @@ -42,7 +42,7 @@ class MediaPixmap(Pixmap): self.default_pixmap = resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/no_coverArt.png") return Pixmap.applySkin(self, desktop, screen) -class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, HelpableScreen): +class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport, HelpableScreen): ALLOW_SUSPEND = True ENABLE_RESUME_SUPPORT = True @@ -52,6 +52,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB InfoBarCueSheetSupport.__init__(self, actionmap = "MediaPlayerCueSheetActions") InfoBarNotifications.__init__(self) InfoBarBase.__init__(self) + InfoBarSubtitleSupport.__init__(self) HelpableScreen.__init__(self) self.summary = None self.oldService = self.session.nav.getCurrentlyPlayingServiceReference() @@ -63,7 +64,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB self.addPlaylistParser(PlaylistIOInternal, "e2pls") # 'None' is magic to start at the list of mountpoints - self.filelist = FileList(None, matchingPattern = "(?i)^.*\.(mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") + self.filelist = FileList(None, matchingPattern = "(?i)^.*\.(mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|mkv|dat|flac)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") self["filelist"] = self.filelist self.playlist = MyPlayList() @@ -87,7 +88,9 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB self["genretext"] = Label(_("Genre:")) self["genre"] = Label("") self["coverArt"] = MediaPixmap() + self["repeat"] = MultiPixmap() + self.repeat = False self.seek_target = None class MoviePlayerActionMap(NumberActionMap): @@ -121,6 +124,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB "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", @@ -163,6 +167,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB self.coverArtFileName = "" self.isAudioCD = False self.AudioCD_albuminfo = {} + self.savePlaylistOnExit = True self.playlistIOInternal = PlaylistIOInternal() list = self.playlistIOInternal.open(resolveFilename(SCOPE_CONFIG, "playlist.e2pls")) @@ -173,7 +178,9 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { - iPlayableService.evUpdatedInfo: self.__evUpdatedInfo + iPlayableService.evUpdatedInfo: self.__evUpdatedInfo, + iPlayableService.evUser+11: self.__evDecodeError, + iPlayableService.evUser+12: self.__evPluginError }) def doNothing(self): @@ -190,7 +197,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB self.playlistIOInternal.clear() for x in self.playlist.list: self.playlistIOInternal.addService(ServiceReference(x[0])) - if not self.isAudioCD: + if self.savePlaylistOnExit: self.playlistIOInternal.save(resolveFilename(SCOPE_CONFIG, "playlist.e2pls")) self.close() @@ -214,6 +221,18 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB print "[__evUpdatedInfo] title %d of %d (%s)" % (currenttitle, totaltitles, sTitle) self.readTitleInformation() + 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 = 20 ) + + 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 delMPTimer(self): del self.rightKeyTimer del self.leftKeyTimer @@ -437,6 +456,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB menu.append((_("save playlist"), "saveplaylist")); menu.append((_("load playlist"), "loadplaylist")); menu.append((_("delete saved playlist"), "deleteplaylist")); + menu.append((_("repeat playlist"), "repeat")); self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu) def menuCallback(self, choice): @@ -472,7 +492,13 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB self.delete_saved_playlist() elif choice[1] == "shuffle": self.playlist.PlayListShuffle() - + elif choice[1] == "repeat": + if self.repeat == True: + self.repeat = False + self["repeat"].setPixmapNum(0) + else: + self.repeat = True + self["repeat"].setPixmapNum(1) def showEventInformation(self): from Screens.EventView import EventViewSimple @@ -599,6 +625,9 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB next = self.playlist.getCurrentIndex() + 1 if next < len(self.playlist): self.changeEntry(next) + elif ( len(self.playlist) > 0 ) and ( self.repeat == True ): + self.stopEntry() + self.changeEntry(0) def nextMarkOrEntry(self): if not self.jumpPreviousNextMark(lambda x: x): @@ -662,10 +691,10 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB currref = self.playlist.getServiceRefList()[idx] text = self.getIdentifier(currref) text = ">"+text - ext = text[-3:].lower() + ext = text[-4:].lower() # FIXME: the information if the service contains video (and we should hide our window) should com from the service instead - if ext not in ["mp3", "wav", "ogg"] and not self.isAudioCD: + if ext not in [".mp3", ".wav", ".ogg", "flac"] and not self.isAudioCD: self.hide() else: needsInfoUpdate = True @@ -691,8 +720,8 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB idx = self.playlist.getCurrentIndex() currref = self.playlist.getServiceRefList()[idx] text = currref.getPath() - ext = text[-3:].lower() - if ext not in ["mp3", "wav", "ogg"] and not self.isAudioCD: + ext = text[-4:].lower() + if ext not in [".mp3", ".wav", ".ogg", "flac"] and not self.isAudioCD: self.hide() else: needsInfoUpdate = True @@ -718,7 +747,10 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB def pauseEntry(self): self.pauseService() - self.show() + if self.seekstate == self.SEEK_STATE_PAUSE: + self.show() + else: + self.hide() def stopEntry(self): self.playlist.stopFile() @@ -728,6 +760,10 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB def unPauseService(self): self.setSeekState(self.SEEK_STATE_PLAY) + + def subtitleSelection(self): + from Screens.Subtitles import Subtitles + self.session.open(Subtitles) class MediaPlayerLCDScreen(Screen): skin = """ @@ -769,15 +805,19 @@ def filescan_open(list, session, **kwargs): from enigma import eServiceReference mp = session.open(MediaPlayer) + mp.playlist.clear() + mp.savePlaylistOnExit = False - mp.switchToPlayList() for file in list: - ref = eServiceReference(4097, 0, file.path) + if file.mimetype == "video/MP2T": + stype = 1 + else: + stype = 4097 + ref = eServiceReference(stype, 0, file.path) mp.playlist.addFile(ref) - # TODO: rather play first than last file? - mp.playServiceRefEntry(ref) - mp.playlist.updateList() + mp.changeEntry(0) + mp.switchToPlayList() def audioCD_open(list, session, **kwargs): from enigma import eServiceReference @@ -785,6 +825,7 @@ def audioCD_open(list, session, **kwargs): mp = session.open(MediaPlayer) mp.playlist.clear() + mp.savePlaylistOnExit = False mp.isAudioCD = True for file in list: @@ -800,7 +841,7 @@ def audioCD_open(list, session, **kwargs): def filescan(**kwargs): from Components.Scanner import Scanner, ScanPath mediatypes = [ - Scanner(mimetypes = ["video/mpeg"], + Scanner(mimetypes = ["video/mpeg", "video/MP2T", "video/x-msvideo"], paths_to_scan = [ ScanPath(path = "", with_subdirs = False), @@ -809,7 +850,17 @@ def filescan(**kwargs): description = "View Movies...", openfnc = filescan_open, ), - Scanner(mimetypes = ["audio/mpeg", "audio/x-wav", "application/ogg"], + Scanner(mimetypes = ["video/x-vcd"], + paths_to_scan = + [ + ScanPath(path = "mpegav", with_subdirs = False), + ScanPath(path = "MPEGAV", with_subdirs = False), + ], + name = "Video CD", + description = "View Video CD...", + openfnc = filescan_open, + ), + Scanner(mimetypes = ["audio/mpeg", "audio/x-wav", "application/ogg", "audio/x-flac"], paths_to_scan = [ ScanPath(path = "", with_subdirs = False), @@ -820,7 +871,8 @@ def filescan(**kwargs): )] try: from Plugins.Extensions.CDInfo.plugin import Query - mediatypes.insert(0,Scanner(mimetypes = ["audio/x-cda", "audio/x-wav"], + mediatypes.append( + Scanner(mimetypes = ["audio/x-cda"], paths_to_scan = [ ScanPath(path = "", with_subdirs = False),