from os import path as os_path, remove as os_remove, listdir as os_listdir
from time import strftime
-from enigma import eTimer, iPlayableService, eServiceCenter, iServiceInformation
+from enigma import iPlayableService, eTimer, eServiceCenter, iServiceInformation
from Screens.Screen import Screen
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
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
+from Components.Harddisk import harddiskmanager
+from Tools.Directories import fileExists, pathExists
import random
class MyPlayList(PlayList):
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
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()
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)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|mkv|mp4|dat|flac)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
self["filelist"] = self.filelist
self.playlist = MyPlayList()
self["genretext"] = Label(_("Genre:"))
self["genre"] = Label("")
self["coverArt"] = MediaPixmap()
+ self["repeat"] = MultiPixmap()
+ self.repeat = False
self.seek_target = None
class MoviePlayerActionMap(NumberActionMap):
"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",
self.currList = "filelist"
self.coverArtFileName = ""
+ self.isAudioCD = False
+ self.AudioCD_albuminfo = {}
+ self.savePlaylistOnExit = True
self.playlistIOInternal = PlaylistIOInternal()
list = self.playlistIOInternal.open(resolveFilename(SCOPE_CONFIG, "playlist.e2pls"))
self.playlist.addFile(x.ref)
self.playlist.updateList()
+ self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+ {
+ iPlayableService.evUpdatedInfo: self.__evUpdatedInfo,
+ iPlayableService.evUser+11: self.__evDecodeError,
+ iPlayableService.evUser+12: self.__evPluginError
+ })
+
def doNothing(self):
pass
self.playlistIOInternal.clear()
for x in self.playlist.list:
self.playlistIOInternal.addService(ServiceReference(x[0]))
- self.playlistIOInternal.save(resolveFilename(SCOPE_CONFIG, "playlist.e2pls"))
+ if self.savePlaylistOnExit:
+ self.playlistIOInternal.save(resolveFilename(SCOPE_CONFIG, "playlist.e2pls"))
self.close()
def checkSkipShowHideLock(self):
def __onClose(self):
self.session.nav.playService(self.oldService)
+ def __evUpdatedInfo(self):
+ currPlay = self.session.nav.getCurrentService()
+ currenttitle = currPlay.info().getInfo(iServiceInformation.sCurrentTitle)
+ totaltitles = currPlay.info().getInfo(iServiceInformation.sTotalTitles)
+ sTitle = currPlay.info().getInfoString(iServiceInformation.sTitle)
+ 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, message, type = MessageBox.TYPE_INFO,timeout = 20 )
+
def delMPTimer(self):
del self.rightKeyTimer
del self.leftKeyTimer
def readTitleInformation(self):
currPlay = self.session.nav.getCurrentService()
if currPlay is not None:
- stitle = currPlay.info().getInfoString(iServiceInformation.sTitle)
- if stitle == "":
- stitle = currPlay.info().getName().split('/')[-1]
-
- self.updateMusicInformation( artist = currPlay.info().getInfoString(iServiceInformation.sArtist),
- title = stitle,
- album = currPlay.info().getInfoString(iServiceInformation.sAlbum),
- genre = currPlay.info().getInfoString(iServiceInformation.sGenre),
- clear = True)
+ sTitle = currPlay.info().getInfoString(iServiceInformation.sTitle)
+ sAlbum = currPlay.info().getInfoString(iServiceInformation.sAlbum)
+ sGenre = currPlay.info().getInfoString(iServiceInformation.sGenre)
+ sArtist = currPlay.info().getInfoString(iServiceInformation.sArtist)
+ sYear = currPlay.info().getInfoString(iServiceInformation.sTimeCreate)
+
+ if sTitle == "":
+ if not self.isAudioCD:
+ sTitle = currPlay.info().getName().split('/')[-1]
+ else:
+ sTitle = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()].getName()
+
+ if self.AudioCD_albuminfo:
+ if sAlbum == "" and "title" in self.AudioCD_albuminfo:
+ sAlbum = self.AudioCD_albuminfo["title"]
+ if sGenre == "" and "genre" in self.AudioCD_albuminfo:
+ sGenre = self.AudioCD_albuminfo["genre"]
+ if sArtist == "" and "artist" in self.AudioCD_albuminfo:
+ sArtist = self.AudioCD_albuminfo["artist"]
+ if "year" in self.AudioCD_albuminfo:
+ sYear = self.AudioCD_albuminfo["year"]
+
+ self.updateMusicInformation( sArtist, sTitle, sAlbum, sYear, sGenre, clear = True )
else:
self.updateMusicInformation()
path = path[:-1]
pngname = path + "folder.png"
- if not os_path.exists(pngname):
+ if not fileExists(pngname):
pngname = self["coverArt"].default_pixmap
if self.coverArtFileName != pngname:
self.coverArtFileName = pngname
def hideAfterResume(self):
self.hide()
+ def getIdentifier(self, ref):
+ if self.isAudioCD:
+ return ref.getName()
+ else:
+ text = ref.getPath()
+ return text.split('/')[-1]
+
# FIXME: maybe this code can be optimized
def updateCurrentInfo(self):
text = ""
if t is None:
return
#display current selected entry on LCD
- text = t.getPath()
- text = text.split('/')[-1]
+ text = self.getIdentifier(t)
self.summaries.setText(text,1)
self["currenttext"].setText(text)
idx = self.playlist.getSelectionIndex()
idx += 1
if idx < len(self.playlist):
currref = self.playlist.getServiceRefList()[idx]
- text = currref.getPath()
- text = text.split('/')[-1]
+ text = self.getIdentifier(currref)
self.summaries.setText(text,3)
else:
self.summaries.setText(" ",3)
idx += 1
if idx < len(self.playlist):
currref = self.playlist.getServiceRefList()[idx]
- text = currref.getPath()
- text = text.split('/')[-1]
+ text = self.getIdentifier(currref)
self.summaries.setText(text,4)
else:
self.summaries.setText(" ",4)
menu.append((_("save playlist"), "saveplaylist"));
menu.append((_("load playlist"), "loadplaylist"));
menu.append((_("delete saved playlist"), "deleteplaylist"));
+ menu.append((_("repeat playlist"), "repeat"));
+ drivepath = harddiskmanager.getAutofsMountpoint(harddiskmanager.getCD())
+ if pathExists(drivepath):
+ menu.insert(0,(_("Play Audio-CD..."), "audiocd"))
self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu)
def menuCallback(self, choice):
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)
+ elif choice[1] == "audiocd":
+ from Components.Scanner import scanDevice
+ drivepath = harddiskmanager.getAutofsMountpoint(harddiskmanager.getCD())
+ self.cdAudioTrackFiles = []
+ res = scanDevice(drivepath)
+ list = [ (r.description, r, res[r], self.session) for r in res ]
+ if list:
+ (desc, scanner, files, session) = list[0]
+ for file in files:
+ if file.mimetype == "audio/x-cda":
+ self.cdAudioTrackFiles.append(file.path)
+ self.playAudioCD()
+ def playAudioCD(self):
+ from enigma import eServiceReference
+ from Plugins.Extensions.CDInfo.plugin import Query
+
+ if len(self.cdAudioTrackFiles):
+ self.playlist.clear()
+ self.savePlaylistOnExit = False
+ self.isAudioCD = True
+ for file in self.cdAudioTrackFiles:
+ ref = eServiceReference(4097, 0, file)
+ self.playlist.addFile(ref)
+ cdinfo = Query(self)
+ cdinfo.scan()
+ self.changeEntry(0)
+ self.switchToPlayList()
def showEventInformation(self):
from Screens.EventView import EventViewSimple
def PlaylistSelected(self,path):
if path is not None:
self.clear_playlist()
- self.playlistIOInternal = PlaylistIOInternal()
- list = self.playlistIOInternal.open(path[1])
- if list:
+ extension = path[0].rsplit('.',1)[-1]
+ if self.playlistparsers.has_key(extension):
+ playlist = self.playlistparsers[extension]()
+ list = playlist.open(path[1])
for x in list:
self.playlist.addFile(x.ref)
- self.playlist.updateList()
+ self.playlist.updateList()
def delete_saved_playlist(self):
listpath = []
def copyDirectory(self, directory, recursive = True):
print "copyDirectory", directory
- filelist = FileList(directory, useServiceRef = True)
+ filelist = FileList(directory, useServiceRef = True, isTop = True)
for x in filelist.getFileList():
if x[0][1] == True: #isDir
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):
# display just playing musik on LCD
idx = self.playlist.getCurrentIndex()
currref = self.playlist.getServiceRefList()[idx]
- text = currref.getPath()
- text = text.split('/')[-1]
+ 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"]:
+ if ext not in [".mp2", ".mp3", ".wav", ".ogg", "flac"] and not self.isAudioCD:
self.hide()
else:
needsInfoUpdate = True
idx += 1
if idx < len(self.playlist):
currref = self.playlist.getServiceRefList()[idx]
- text = currref.getPath()
- text = text.split('/')[-1]
+ text = self.getIdentifier(currref)
self.summaries.setText(text,3)
else:
self.summaries.setText(" ",3)
idx += 1
if idx < len(self.playlist):
currref = self.playlist.getServiceRefList()[idx]
- text = currref.getPath()
- text = text.split('/')[-1]
+ text = self.getIdentifier(currref)
self.summaries.setText(text,4)
else:
self.summaries.setText(" ",4)
idx = self.playlist.getCurrentIndex()
currref = self.playlist.getServiceRefList()[idx]
text = currref.getPath()
- ext = text[-3:].lower()
- if ext not in ["mp3", "wav", "ogg"]:
+ ext = text[-4:].lower()
+ if ext not in [".mp2", ".mp3", ".wav", ".ogg", "flac"] and not self.isAudioCD:
self.hide()
else:
needsInfoUpdate = True
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()
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 = """
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
+
+ mp = session.open(MediaPlayer)
+ mp.cdAudioTrackFiles = []
+ for file in list:
+ mp.cdAudioTrackFiles.append(file.path)
+ mp.playAudioCD()
def filescan(**kwargs):
from Components.Scanner import Scanner, ScanPath
- return [
- Scanner(mimetypes = ["video/mpeg"],
+ mediatypes = [
+ Scanner(mimetypes = ["video/mpeg", "video/MP2T", "video/x-msvideo"],
paths_to_scan =
[
ScanPath(path = "", with_subdirs = False),
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),
name = "Music",
description = "Play Music...",
openfnc = filescan_open,
- )
- ]
+ )]
+ try:
+ from Plugins.Extensions.CDInfo.plugin import Query
+ mediatypes.append(
+ Scanner(mimetypes = ["audio/x-cda"],
+ paths_to_scan =
+ [
+ ScanPath(path = "", with_subdirs = False),
+ ],
+ name = "Audio-CD",
+ description = "Play Audio-CD...",
+ openfnc = audioCD_open,
+ ))
+ return mediatypes
+ except ImportError:
+ return mediatypes
from Plugins.Plugin import PluginDescriptor
def Plugins(**kwargs):