from Components.MediaPlayer import PlayList
from Tools.Directories import resolveFilename, SCOPE_CONFIG, SCOPE_PLAYLIST, SCOPE_SKIN_IMAGE
from Components.ServicePosition import ServicePositionGauge
-from Components.ServiceEventTracker import ServiceEventTracker
+from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
from Components.Playlist import PlaylistIOInternal, PlaylistIOM3U, PlaylistIOPLS
from Screens.InfoBarGenerics import InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications
from ServiceReference import ServiceReference
self.oldCurrPlaying = -1
class MediaPixmap(Pixmap):
- def applySkin(self, desktop):
+ def applySkin(self, desktop, screen):
self.default_pixmap = None
- for (attrib, value) in self.skinAttributes:
- if attrib == "pixmap":
- self.default_pixmap = value
- break
+ if self.skinAttributes is not None:
+ for (attrib, value) in self.skinAttributes:
+ if attrib == "pixmap":
+ self.default_pixmap = value
+ break
if self.default_pixmap is None:
- self.default_pixmap = resolveFilename(SCOPE_SKIN_IMAGE, "no_coverArt.png")
- return Pixmap.applySkin(self, desktop)
+ self.default_pixmap = resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/no_coverArt.png")
+ return Pixmap.applySkin(self, desktop, screen)
-class MediaPlayer(Screen, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, HelpableScreen):
+class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, HelpableScreen):
ALLOW_SUSPEND = True
ENABLE_RESUME_SUPPORT = True
InfoBarAudioSelection.__init__(self)
InfoBarCueSheetSupport.__init__(self, actionmap = "MediaPlayerCueSheetActions")
InfoBarNotifications.__init__(self)
+ InfoBarBase.__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)
+ 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"] = self.filelist
self.playlist = MyPlayList()
self["MediaPlayerActions"] = HelpableActionMap(self, "MediaPlayerActions",
{
- "play": (self.playEntry, _("play entry")),
+ "play": (self.xplayEntry, _("play entry")),
"pause": (self.pauseEntry, _("pause")),
"stop": (self.stopEntry, _("stop entry")),
- "previous": (self.previousEntry, _("play previous playlist entry")),
- "next": (self.nextEntry, _("play next playlist entry")),
+ "previous": (self.previousMarkOrEntry, _("play from previous mark or playlist entry")),
+ "next": (self.nextMarkOrEntry, _("play from next mark or playlist entry")),
"menu": (self.showMenu, _("menu")),
"skipListbegin": (self.skip_listbegin, _("jump to listbegin")),
"skipListend": (self.skip_listend, _("jump to listend")),
InfoBarSeek.__init__(self, actionmap = "MediaPlayerSeekActions")
- self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
- {
- #iPlayableService.evStart: self.__serviceStarted,
- #iPlayableService.evSeekableStatusChanged: InfoBarSeek.__seekableStatusChanged,
-
- iPlayableService.evEOF: self.__evEOF,
- })
-
self.onClose.append(self.delMPTimer)
self.onClose.append(self.__onClose)
self.righttimer = False
self.rightKeyTimer = eTimer()
- self.rightKeyTimer.timeout.get().append(self.rightTimerFire)
+ self.rightKeyTimer.callback.append(self.rightTimerFire)
self.lefttimer = False
self.leftKeyTimer = eTimer()
- self.leftKeyTimer.timeout.get().append(self.leftTimerFire)
-
- self.infoTimer = eTimer()
- self.infoTimer.timeout.get().append(self.infoTimerFire)
- self.infoTimer.start(500)
+ self.leftKeyTimer.callback.append(self.leftTimerFire)
self.currList = "filelist"
def checkSkipShowHideLock(self):
self.updatedSeekState()
- def __evEOF(self):
- self.nextEntry()
+ def doEofInternal(self, playing):
+ if playing:
+ self.nextEntry()
+ else:
+ self.show()
def __onClose(self):
self.session.nav.playService(self.oldService)
def delMPTimer(self):
del self.rightKeyTimer
del self.leftKeyTimer
- del self.infoTimer
- def infoTimerFire(self):
+ def readTitleInformation(self):
currPlay = self.session.nav.getCurrentService()
if currPlay is not None:
stitle = currPlay.info().getInfoString(iServiceInformation.sTitle)
album = currPlay.info().getInfoString(iServiceInformation.sAlbum),
genre = currPlay.info().getInfoString(iServiceInformation.sGenre),
clear = True)
- self.updateCoverArtPixmap( currPlay.info().getName() )
else:
self.updateMusicInformation()
- self.updateCoverArtPixmap( "" )
def updateMusicInformation(self, artist = "", title = "", album = "", year = "", genre = "", clear = False):
self.updateSingleMusicInformation("artist", artist, clear)
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 "/"
- # FIXME: this should be fixed in the servicemp3.cpp handler
- filename = filename[filename.find("/"):]
- path = os_path.dirname(filename)
- pngname = path + "/" + "folder.png"
+ def updateCoverArtPixmap(self, path):
+ while not path.endswith("/"):
+ path = path[:-1]
+ pngname = path + "folder.png"
+
if not os_path.exists(pngname):
pngname = self["coverArt"].default_pixmap
if self.coverArtFileName != pngname:
if next < len(self.playlist):
self.changeEntry(next)
- def previousEntry(self):
- next = self.playlist.getCurrentIndex() - 1
- if next >= 0:
- self.changeEntry(next)
+ def nextMarkOrEntry(self):
+ if not self.jumpPreviousNextMark(lambda x: x):
+ next = self.playlist.getCurrentIndex() + 1
+ if next < len(self.playlist):
+ self.changeEntry(next)
+ else:
+ self.doSeek(-1)
+
+ def previousMarkOrEntry(self):
+ if not self.jumpPreviousNextMark(lambda x: -x-5*90000, start=True):
+ next = self.playlist.getCurrentIndex() - 1
+ if next >= 0:
+ self.changeEntry(next)
def deleteEntry(self):
self.playlist.deleteFile(self.playlist.getSelectionIndex())
if serviceRefList[count] == serviceref:
self.changeEntry(count)
break
-
+
+ def xplayEntry(self):
+ if self.currList == "playlist":
+ self.playEntry()
+ else:
+ self.stopEntry()
+ self.playlist.clear()
+ sel = self.filelist.getSelection()
+ if sel:
+ if sel[1]: # can descent
+ # add directory to playlist
+ self.copyDirectory(sel[0])
+ else:
+ # add files to playlist
+ self.copyDirectory(os_path.dirname(sel[0].getPath()) + "/", recursive = False)
+ if len(self.playlist) > 0:
+ self.changeEntry(0)
+
def playEntry(self):
if len(self.playlist.getServiceRefList()):
+ needsInfoUpdate = False
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()])
# 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"]:
self.hide()
+ else:
+ needsInfoUpdate = True
self.summaries.setText(text,1)
# get the next two entries
ext = text[-3:].lower()
if ext not in ["mp3", "wav", "ogg"]:
self.hide()
+ else:
+ needsInfoUpdate = True
+
self.unPauseService()
+ if needsInfoUpdate == True:
+ self.updateCoverArtPixmap(currref.getPath())
+ else:
+ pngname = self["coverArt"].default_pixmap
+ self.coverArtFileName = pngname
+ self["coverArt"].instance.setPixmapFromFile(self.coverArtFileName)
+ self.readTitleInformation()
def updatedSeekState(self):
if self.seekstate == self.SEEK_STATE_PAUSE:
self.playlist.pauseFile()
elif self.seekstate == self.SEEK_STATE_PLAY:
self.playlist.playFile()
- elif self.seekstate in ( self.SEEK_STATE_FF_2X,
- self.SEEK_STATE_FF_4X,
- self.SEEK_STATE_FF_8X,
- self.SEEK_STATE_FF_16X,
- self.SEEK_STATE_FF_32X,
- self.SEEK_STATE_FF_48X,
- self.SEEK_STATE_FF_64X,
- self.SEEK_STATE_FF_128X):
+ elif self.isStateForward(self.seekstate):
self.playlist.forwardFile()
- elif self.seekstate in ( self.SEEK_STATE_BACK_8X,
- self.SEEK_STATE_BACK_16X,
- self.SEEK_STATE_BACK_32X,
- self.SEEK_STATE_BACK_48X,
- self.SEEK_STATE_BACK_64X,
- self.SEEK_STATE_BACK_128X):
+ elif self.isStateBackward(self.seekstate):
self.playlist.rewindFile()
def pauseEntry(self):