class MC_VideoPlayer(Screen, HelpableScreen): def __init__(self, session): Screen.__init__(self, session) HelpableScreen.__init__(self) self["key_red"] = Button(_("Exit")) self["key_green"] = Button(_("Info")) self["key_yellow"] = Button(_("IMDb")) self["key_blue"] = Button(_("Menu")) self["currentfolder"] = Label("") #Check if AzBox because of using MRUA if os.path.exists("/proc/player"): self.azbox = True else: self.azbox = False #Check if we have a saved last dir currDir = config.plugins.mc_vp.lastDir.value if not pathExists(currDir): currDir = None self["currentfolder"].setText(str(currDir)) self.filelist = FileList(currDir, showMountpoints = True, useServiceRef = True, showDirectories = True, showFiles = True, matchingPattern = "(?i)^.*\.(vob|mpg|mpeg|avi|mkv|dat|iso|img|mp4|divx|m2ts|wmv|flv|mov)") self["filelist"] = self.filelist self["filelist"].onSelectionChanged.append(self.selectionChanged) self["actions"] = HelpableActionMap(self, "MC_VideoPlayerActions", { "ok": (self.KeyOk, _("Play selected file")), "cancel": (self.Exit, _("Exit Video Player")), "left": (self.leftUp, _("List Top")), "right": (self.rightDown, _("List Bottom")), "up": (self.up, _("List up")), "down": (self.down, _("List down")), "menu": (self.showMenu, _("File / Folder Options")), "info": (self.showFileInfo, _("Show File Info")), #"red": (self.Exit, _("Exit Videos")), "yellow": (self.startIMDb, ("Start IMDb")), "home": (self.Exit, _("Exit Videos")), }, -2) def selectionChanged(self): pass def up(self): self["filelist"].up() def down(self): self["filelist"].down() def leftUp(self): self["filelist"].pageUp() def rightDown(self): self["filelist"].pageDown() def showFileInfo(self): if self["filelist"].canDescent(): return else: self.session.open(MC_VideoInfoView, self["filelist"].getCurrentDirectory() + self["filelist"].getFilename() , self["filelist"].getFilename(), self["filelist"].getServiceRef()) def KeyExit(self): self.filelist.gotoParent() def KeyOk(self): self.isDVD = False self.isIso = False self.isFile = False self.pathname = "" filename = self["filelist"].getFilename() if filename is not None: if filename.lower().endswith("iso") or filename.lower().endswith("img"): os.system("mkdir /tmp/discmount") os.system("umount -f /tmp/discmount") os.system("losetup -d /dev/loop0") os.system("losetup /dev/loop0 \"" + str(filename) + "\"") os.system("mount -t udf /dev/loop0 /tmp/discmount") self.pathname = "/tmp/discmount/" self.isIso = True elif self.filelist.canDescent(): self.filelist.descent() self["filelist"].refresh() self.pathname = self["filelist"].getCurrentDirectory() or "" else: self.isFile = True elif self.filelist.canDescent(): self.filelist.descent() self["filelist"].refresh() if self.pathname != "": dvdFilelist = [ ] dvdDevice = None if fileExists(self.pathname+"VIDEO_TS.IFO"): dvdFilelist.append(str(self.pathname[0:-1])) self.isDVD = True elif fileExists(self.pathname+"VIDEO_TS/VIDEO_TS.IFO"): dvdFilelist.append(str(self.pathname+"VIDEO_TS")) self.isDVD = True elif self.isIso: self["filelist"].setIsoDir(filename, self["filelist"].getCurrentDirectory()) self.JumpToFolder("/tmp/discmount/") self["filelist"].up() if self.isDVD: self.filelist.gotoParent() if self.azbox == True: from AZ_DVDPlayer import AZDVDPlayer self.session.open(AZDVDPlayer, dvd_device = dvdDevice, dvd_filelist = dvdFilelist) else: print "Play dvd normal" from Screens import DVD self.session.open(DVD.DVDPlayer, dvd_filelist=dvdFilelist) elif self.isFile: if self.azbox == True: from AZ_MRUAPlayer import MRUAPlayer self.session.open(MRUAPlayer, ref=self["filelist"].getFilename()) else: from MC_MoviePlayer import MC_MoviePlayer self.session.open(MC_MoviePlayer, self["filelist"].getServiceRef()) def JumpToFolder(self, jumpto = None): if jumpto is None: return else: self["filelist"].changeDir(jumpto) self["currentfolder"].setText(("%s") % (jumpto)) def KeySettings(self): self.session.open(VideoPlayerSettings) def Exit(self): try: config.plugins.mc_vp.lastDir.value = self.filelist.getCurrentDirectory() except: config.plugins.mc_vp.lastDir.value = 'mountpoint' config.plugins.mc_vp.save() configfile.save() self.close() def showMenu(self): menu = [] menu.append((_("Check IMDB"), "imdblookup")) if self.filelist.canDescent(): x = self.filelist.getName() if x == "..": return menu.append((_("delete directory"), "deletedir")) else: menu.append((_("delete file"), "deletefile")) self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu) def menuCallback(self, choice): if choice is None: return if choice[1] == "deletedir": self.deleteDir() elif choice[1] == "deletefile": self.deleteFile() elif choice[1] == "imdblookup": try: from MC_Imdb import IMDB name = self["filelist"].getName() self.session.open(IMDB, name.partition('(')[0]) except ImportError: self.session.open(MessageBox, _("Cannot load IMDB, please check if python-html is installed"), MessageBox.TYPE_INFO, timeout = 5) def deleteDir(self): self.session.openWithCallback(self.deleteDirConfirmed, MessageBox, _("Do you really want to delete this directory and it's content ?")) def deleteDirConfirmed(self, confirmed): if confirmed: import shutil deldir = self.filelist.getSelection()[0] shutil.rmtree(deldir) self["filelist"].refresh() def deleteFile(self): self.session.openWithCallback(self.deleteFileConfirmed, MessageBox, _("Do you really want to delete this file ?")) def deleteFileConfirmed(self, confirmed): if confirmed: delfile = self["filelist"].getFilename() os.remove(delfile) self["filelist"].refresh() def startIMDb(self): from MC_Imdb import IMDB name = self["filelist"].getName() self.session.open(IMDB, name.partition('(')[0])
class MC_AudioPlayer(Screen, HelpableScreen): def __init__(self, session): Screen.__init__(self, session) HelpableScreen.__init__(self) self.isVisible = True self.coverArtFileName = "" self["key_red"] = Button(_(" ")) self["key_green"] = Button(_(" ")) self["key_yellow"] = Button(_("Add to Playlist")) self["key_blue"] = Button(_("Go to Playlist")) self["fileinfo"] = Label() self["coverArt"] = MediaPixmap() self["currentfolder"] = Label() self["play"] = Pixmap() self["stop"] = Pixmap() self["curplayingtitle"] = Label() self.PlaySingle = 0 MC_AudioPlayer.STATE = "NONE" self.playlist = PlayList() self["playlist"] = self.playlist MC_AudioPlayer.playlistplay = 0 MC_AudioPlayer.currPlaying = -1 self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { iPlayableService.evStopped: self.doEOF, iPlayableService.evEOF: self.doEOF, iPlayableService.evUpdatedInfo: self.__evUpdatedInfo, iPlayableService.evUser+11: self.__evDecodeError, iPlayableService.evUser+12: self.__evPluginError, iPlayableService.evUser+13: self["coverArt"].embeddedCoverArt }) self["actions"] = HelpableActionMap(self, "MC_AudioPlayerActions", { "ok": (self.KeyOK, _("Play selected file")), "cancel": (self.Exit, _("Exit Audio Player")), "left": (self.leftUp, _("List Top")), "right": (self.rightDown, _("List Bottom")), "up": (self.up, _("List up")), "down": (self.down, _("List down")), "menu": (self.showMenu, _("File / Folder Options")), "video": (self.visibility, _("Show / Hide Player")), "info": (self.showFileInfo, _("Show File Info")), "stop": (self.StopPlayback, _("Stop Playback")), #"red": (self.Exit, _("Exit Music")), #"green": (self.KeyPlayAll, _("Play All")), "yellow": (self.addFiletoPls, _("Add file to playlist")), "blue": (self.Playlists, _("Playlists")), "next": (self.KeyNext, _("Next song")), "previous": (self.KeyPrevious, _("Previous song")), "playpause": (self.PlayPause, _("Play / Pause")), "stop": (self.StopPlayback, _("Stop")), "seekFwd": (self.seekFwd, _("skip forward")), "seekBwd": (self.seekBwd, _("skip backward")), }, -2) self.playlistparsers = {} self.addPlaylistParser(PlaylistIOM3U, "m3u") self.addPlaylistParser(PlaylistIOPLS, "pls") self.addPlaylistParser(PlaylistIOInternal, "e2pls") currDir = config.plugins.mc_ap.lastDir.value if not pathExists(currDir): currDir = None self["currentfolder"].setText(str(currDir)) self.filelist = FileList(currDir, showMountpoints = True, useServiceRef = True, showDirectories = True, showFiles = True, matchingPattern = "(?i)^.*\.(mp3|ogg|wav|wave|flac|m4a|m3u|pls|e2pls)", additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") self["filelist"] = self.filelist self["thumbnail"] = Pixmap() def up(self): self["filelist"].up() def down(self): self["filelist"].down() def leftUp(self): self["filelist"].pageUp() def rightDown(self): self["filelist"].pageDown() def KeyOK(self): if self["filelist"].canDescent(): self.filelist.descent() self["currentfolder"].setText(str(self.filelist.getCurrentDirectory())) else: if self.filelist.getServiceRef().type == 4098: # playlist ServiceRef = self.filelist.getServiceRef() extension = ServiceRef.getPath()[ServiceRef.getPath().rfind('.') + 1:] if self.playlistparsers.has_key(extension): self.playlist.clear() playlist = self.playlistparsers[extension]() list = playlist.open(ServiceRef.getPath()) for x in list: self.playlist.addFile(x.ref) self.playlist.updateList() MC_AudioPlayer.currPlaying = 0 self.PlayServicepls() else: self.PlaySingle = 0 self.PlayService() def PlayPause(self): if MC_AudioPlayer.STATE == "PLAY": service = self.session.nav.getCurrentService() pausable = service.pause() pausable.pause() MC_AudioPlayer.STATE = "PAUSED" elif MC_AudioPlayer.STATE == "PAUSED" or MC_AudioPlayer.STATE == "SEEKBWD" or MC_AudioPlayer.STATE == "SEEKFWD": service = self.session.nav.getCurrentService() pausable = service.pause() pausable.unpause() MC_AudioPlayer.STATE = "PLAY" else: self.KeyOK() def seekFwd(self): if MC_AudioPlayer.STATE == "PLAY" or MC_AudioPlayer.STATE == "SEEKBWD": service = self.session.nav.getCurrentService() pausable = service.pause() pausable.setFastForward(4) MC_AudioPlayer.STATE = "SEEKFWD" def seekBwd(self): if MC_AudioPlayer.STATE == "PLAY" or MC_AudioPlayer.STATE == "SEEKFWD": service = self.session.nav.getCurrentService() pausable = service.pause() pausable.setFastForward(-4) MC_AudioPlayer.STATE = "SEEKBWD" def KeyNext(self): if MC_AudioPlayer.STATE != "NONE": if MC_AudioPlayer.playlistplay == 1: next = self.playlist.getCurrentIndex() + 1 if next < len(self.playlist): MC_AudioPlayer.currPlaying = MC_AudioPlayer.currPlaying + 1 else: MC_AudioPlayer.currPlaying = 0 self.PlayServicepls() else: print "Play Next File ..." self.down() self.PlayService() def KeyPrevious(self): if MC_AudioPlayer.STATE != "NONE": if MC_AudioPlayer.playlistplay == 1: next = self.playlist.getCurrentIndex() - 1 if next != -1: MC_AudioPlayer.currPlaying = MC_AudioPlayer.currPlaying - 1 else: MC_AudioPlayer.currPlaying = 0 self.PlayServicepls() else: print "Play previous File ..." self.up() self.PlayService() def KeyPlayAll(self): if not self["filelist"].canDescent(): self.PlaySingle = 0 self.PlayService() def KeyExit(self): self.filelist.gotoParent() def KeyYellow(self): print "yellow" def visibility(self, force=1): if self.isVisible == True: self.isVisible = False self.hide() else: self.isVisible = True self.show() def Playlists(self): self.session.openWithCallback(self.updateFileInfo, MC_AudioPlaylist) def PlayService(self): playlistplay = 0 self.session.nav.playService(self["filelist"].getServiceRef()) MC_AudioPlayer.STATE = "PLAY" self.updateFileInfo() path = self["filelist"].getCurrentDirectory() + self["filelist"].getFilename() self["coverArt"].updateCoverArt(path) def PlayServicepls(self): MC_AudioPlayer.playlistplay = 1 x = self.playlist.getCurrentIndex() print "x is %s" % (x) x = len(self.playlist) print "x is %s" % (x) ref = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()] self.session.nav.playService(ref) MC_AudioPlayer.STATE = "PLAY" self.updateFileInfo() #path = self["filelist"].getCurrentDirectory() + self["filelist"].getFilename() #self["coverArt"].updateCoverArt(path) def StopPlayback(self): if self.isVisible == False: self.show() self.isVisible = True if self.session.nav.getCurrentService() is None: return else: self.session.nav.stopService() MC_AudioPlayer.STATE = "NONE" def showFileInfo(self): if self["filelist"].canDescent(): return else: self.session.open(MC_AudioInfoView, self["filelist"].getCurrentDirectory() + self["filelist"].getFilename() , self["filelist"].getFilename(), self["filelist"].getServiceRef()) def JumpToFolder(self, jumpto = None): if jumpto is None: return else: self["filelist"].changeDir(jumpto) self["currentfolder"].setText(("%s") % (jumpto)) def updateFileInfo(self): currPlay = self.session.nav.getCurrentService() if currPlay is not None: sTitle = currPlay.info().getInfoString(iServiceInformation.sTagTitle) sArtist = currPlay.info().getInfoString(iServiceInformation.sTagArtist) sAlbum = currPlay.info().getInfoString(iServiceInformation.sTagAlbum) sGenre = currPlay.info().getInfoString(iServiceInformation.sTagGenre) sComment = currPlay.info().getInfoString(iServiceInformation.sTagComment) sYear = currPlay.info().getInfoString(iServiceInformation.sTagDate) if sTitle == "": sTitle = currPlay.info().getName().split('/')[-1] self["fileinfo"].setText(_("Title:") + " " + sTitle + "\n" + _("Artist:") + " " + sArtist + "\n" + _("Album:") + " " + sAlbum + "\n" + _("Genre:") + " " + sGenre + "\n" + _("Comment:") + " " + sComment) self["curplayingtitle"].setText(_("Now Playing:") + " " + sArtist + " - " + sTitle) def addFiletoPls(self): if self.filelist.getServiceRef().type == 4098: # playlist ServiceRef = self.filelist.getServiceRef() extension = ServiceRef.getPath()[ServiceRef.getPath().rfind('.') + 1:] if self.playlistparsers.has_key(extension): playlist = self.playlistparsers[extension]() list = playlist.open(ServiceRef.getPath()) for x in list: self.playlist.addFile(x.ref) self.playlist.updateList() else: self.playlist.addFile(self.filelist.getServiceRef()) self.playlist.updateList() def addDirtoPls(self, directory, recursive = True): print "copyDirectory", directory if directory == '/': print "refusing to operate on /" return filelist = FileList(directory, useServiceRef = True, showMountpoints = False, isTop = True) for x in filelist.getFileList(): if x[0][1] == True: #isDir if recursive: if x[0][0] != directory: self.copyDirectory(x[0][0]) elif filelist.getServiceRef() and filelist.getServiceRef().type == 4097: self.playlist.addFile(x[0][0]) self.playlist.updateList() def deleteFile(self): self.service = self.filelist.getServiceRef() if self.service.type != 4098 and self.session.nav.getCurrentlyPlayingServiceReference() is not None: if self.service == self.session.nav.getCurrentlyPlayingServiceReference(): self.StopPlayback() self.session.openWithCallback(self.deleteFileConfirmed, MessageBox, _("Do you really want to delete this file ?")) def deleteFileConfirmed(self, confirmed): if confirmed: delfile = self["filelist"].getFilename() os.remove(delfile) def deleteDir(self): self.session.openWithCallback(self.deleteDirConfirmed, MessageBox, _("Do you really want to delete this directory and it's content ?")) def deleteDirConfirmed(self, confirmed): if confirmed: import shutil deldir = self.filelist.getSelection()[0] shutil.rmtree(deldir) def addPlaylistParser(self, parser, extension): self.playlistparsers[extension] = parser def Exit(self): if self.isVisible == False: self.visibility() return try: config.plugins.mc_ap.lastDir.value = self.filelist.getCurrentDirectory() except: config.plugins.mc_ap.lastDir.value = 'mountpoint' config.plugins.mc_ap.save() configfile.save() del self["coverArt"].picload self.session.nav.stopService() MC_AudioPlayer.STATE = "NONE" self.close() def showMenu(self): menu = [] if self.filelist.canDescent(): x = self.filelist.getName() if x == "..": return menu.append((_("add directory to playlist"), "copydir")) menu.append((_("delete directory"), "deletedir")) else: menu.append((_("add file to playlist"), "copyfile")) menu.append((_("add file to playlist and play"), "copyandplay")) menu.append((_("add all files in directory to playlist"), "copyfiles")) menu.append((_("delete file"), "deletefile")) self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu) def menuCallback(self, choice): if choice is None: return if choice[1] == "copydir": self.addDirtoPls(self.filelist.getSelection()[0]) elif choice[1] == "deletedir": self.deleteDir() elif choice[1] == "copyfile": self.addFiletoPls() elif choice[1] == "copyandplay": self.addFiletoPls() MC_AudioPlayer.currPlaying = len(self.playlist) - 1 print "curplay is %s" % (MC_AudioPlayer.currPlaying) self.PlayServicepls() elif choice[1] == "copyfiles": self.addDirtoPls(os_path.dirname(self.filelist.getSelection()[0].getPath()) + "/", recursive = False) elif choice[1] == "deletefile": self.deleteFile() def doEOF(self): print "MediaCenter: EOF Event AUDIO..." if MC_AudioPlayer.playlistplay == 1: next = self.playlist.getCurrentIndex() + 1 if next < len(self.playlist): MC_AudioPlayer.currPlaying = MC_AudioPlayer.currPlaying + 1 self.PlayServicepls() elif self.PlaySingle == 0: print "Play Next File ..." self.down() if not self["filelist"].canDescent(): self.PlayService() else: self.StopPlayback() else: print "Stop Playback ..." self.StopPlayback() def __evUpdatedInfo(self): self.updateFileInfo() 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, message, type = MessageBox.TYPE_INFO,timeout = 20 )