from Components.ActionMap import ActionMap, NumberActionMap
from Components.Label import Label
from enigma import RT_VALIGN_CENTER, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER, gFont, eListbox,ePoint, eListboxPythonMultiContent
-
# merlin mp3 player
import merlinmp3player
ENIGMA_MERLINPLAYER_ID = 0x1014
-
from Components.FileList import FileList
from enigma import eServiceReference, eTimer
from os import path as os_path, mkdir as os_mkdir, listdir as os_listdir, walk as os_walk
from mutagen.easyid3 import EasyID3
from mutagen.easymp4 import EasyMP4
from mutagen.oggvorbis import OggVorbis
-import datetime
+from datetime import timedelta as datetime_timedelta
+from time import time
from random import shuffle, randrange
from Components.config import config, ConfigSubsection, ConfigDirectory, ConfigYesNo, ConfigInteger, getConfigListEntry, configfile
from Components.ConfigList import ConfigListScreen
from Tools.HardwareInfo import HardwareInfo
+from Components.SystemInfo import SystemInfo
+from enigma import eServiceCenter, getBestPlayableServiceReference
+from Components.VideoWindow import VideoWindow
+from ServiceReference import ServiceReference
+from Screens.EpgSelection import EPGSelection
+from Screens.EventView import EventViewEPGSelect
+from enigma import ePoint, eEPGCache
+from Screens.InfoBarGenerics import NumberZap
+
config.plugins.merlinmusicplayer = ConfigSubsection()
config.plugins.merlinmusicplayer.hardwaredecoder = ConfigYesNo(default = True)
connection.text_factory = str
cursor = connection.cursor()
counter = 0
+ checkTime = 0
for root, subFolders, files in os_walk(self.__path):
if self.__cancel:
break
for filename in files:
if self.__cancel:
break
- audio, isAudio, title, genre,artist,album,tracknr,track,date,length,bitrate = getID3Tags(root,filename)
- if audio:
- # 1. Artist
- artistID = -1
- cursor.execute("""SELECT artist_id FROM Artists WHERE artist = "%s";""" % (artist))
- row = cursor.fetchone()
- if row is None:
- cursor.execute("""INSERT INTO Artists (artist) VALUES("%s");""" % (artist))
- artistID = cursor.lastrowid
- else:
- artistID = row[0]
- # 2. Album
- albumID = -1
- cursor.execute("""SELECT album_id FROM Album WHERE album_text = "%s";""" % (album))
- row = cursor.fetchone()
- if row is None:
- cursor.execute("""INSERT INTO Album (album_text) VALUES("%s");""" % (album))
- albumID = cursor.lastrowid
- else:
- albumID = row[0]
-
- # 3. Genre
- genreID = -1
- cursor.execute("""SELECT genre_id FROM Genre WHERE genre_text = "%s";""" % (genre))
- row = cursor.fetchone()
- if row is None:
- cursor.execute("""INSERT INTO Genre (genre_text) VALUES("%s");""" % (genre))
- genreID = cursor.lastrowid
- else:
- genreID = row[0]
+ cursor.execute('SELECT song_id FROM Songs WHERE filename = "%s";' % os_path.join(root,filename))
+ row = cursor.fetchone()
+ if row is None:
+ audio, isAudio, title, genre,artist,album,tracknr,track,date,length,bitrate = getID3Tags(root,filename)
+ if audio:
+ # 1. Artist
+ artistID = -1
+ cursor.execute('SELECT artist_id FROM Artists WHERE artist = "%s";' % (artist.replace('"','""')))
+
+ row = cursor.fetchone()
+ if row is None:
+ cursor.execute('INSERT INTO Artists (artist) VALUES("%s");' % (artist.replace('"','""')))
+ artistID = cursor.lastrowid
+ else:
+ artistID = row[0]
+ # 2. Album
+ albumID = -1
+ cursor.execute('SELECT album_id FROM Album WHERE album_text = "%s";' % (album.replace('"','""')))
+ row = cursor.fetchone()
+ if row is None:
+ cursor.execute('INSERT INTO Album (album_text) VALUES("%s");' % (album.replace('"','""')))
+ albumID = cursor.lastrowid
+ else:
+ albumID = row[0]
+
+ # 3. Genre
+ genreID = -1
+ cursor.execute('SELECT genre_id FROM Genre WHERE genre_text = "%s";' % (genre.replace('"','""')))
+ row = cursor.fetchone()
+ if row is None:
+ cursor.execute('INSERT INTO Genre (genre_text) VALUES("%s");' % (genre.replace('"','""')))
+ genreID = cursor.lastrowid
+ else:
+ genreID = row[0]
- # 4. Songs
- try:
- cursor.execute("INSERT INTO Songs (filename,title,artist_id,album_id,genre_id,tracknumber, bitrate, length, track, date) VALUES(?,?,?,?,?,?,?,?,?,?);" , (os_path.join(root,filename),title,artistID,albumID,genreID, tracknr, bitrate, length, track, date))
- self.__messages.push((THREAD_WORKING, _("%s\n added to database") % os_path.join(root,filename)))
- mp.send(0)
- counter +=1
- except sqlite.IntegrityError:
- self.__messages.push((THREAD_WORKING, _("%s\n already exists in database!") % os_path.join(root,filename)))
- mp.send(0)
- audio = None
+ # 4. Songs
+ try:
+ cursor.execute("INSERT INTO Songs (filename,title,artist_id,album_id,genre_id,tracknumber, bitrate, length, track, date) VALUES(?,?,?,?,?,?,?,?,?,?);" , (os_path.join(root,filename),title,artistID,albumID,genreID, tracknr, bitrate, length, track, date))
+ self.__messages.push((THREAD_WORKING, _("%s\n added to database") % os_path.join(root,filename)))
+ mp.send(0)
+ counter +=1
+ except sqlite.IntegrityError:
+ self.__messages.push((THREAD_WORKING, _("%s\n already exists in database!") % os_path.join(root,filename)))
+ mp.send(0)
+ audio = None
+ elif time() - checkTime >= 0.1: # update interval for gui
+ self.__messages.push((THREAD_WORKING, _("%s\n already exists in database!") % os_path.join(root,filename)))
+ mp.send(0)
+ checkTime = time()
+
if not self.__cancel:
connection.commit()
cursor.close()
isAudio = False
if audio:
title = audio.get('title', [filename])[0]
- genre = audio.get('genre', ['n/a'])[0]
+ try:
+ # list index out of range workaround
+ genre = audio.get('genre', ['n/a'])[0]
+ except:
+ genre = "n/a"
artist = audio.get('artist', ['n/a'])[0]
album = audio.get('album', ['n/a'])[0]
- tracknr = int(audio.get('tracknumber', ['-1'])[0].split("/")[0])
+ try:
+ tracknr = int(audio.get('tracknumber', ['-1'])[0].split("/")[0])
+ except:
+ tracknr = -1
track = audio.get('tracknumber', [None])[0]
date = audio.get('date', [None])[0]
- length = str(datetime.timedelta(seconds=int(audio.info.length)))
+ length = str(datetime_timedelta(seconds=int(audio.info.length)))
if not isFlac:
bitrate = audio.info.bitrate / 1000
else:
def createSummary(self):
return MerlinMusicPlayerLCDScreen
+
+class MerlinMusicPlayerTV(MerlinMusicPlayerScreenSaver):
+
+ w = getDesktop(0).size().width()
+ h = getDesktop(0).size().height()
+ if w == 1280:
+ cy = 606
+ else:
+ cy = 462
+ dx = 135
+ cx = 66
+ dy = cy + 20
+ dw = w - dx - cx
+
+ skin = """
+ <screen backgroundColor="transparent" flags="wfNoBorder" position="0,0" size="%d,%d" title="MerlinMusicPlayerTV">
+ <widget backgroundColor="transparent" name="video" position="0,0" size="%d,%d" zPosition="1"/>
+ <widget name="coverArt" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MerlinMusicPlayer/images/no_coverArt.png" position="%d,%d" size="64,64" transparent="1" alphatest="blend" zPosition="2" />
+ <widget name="display" position="%d,%d" size="%d,24" zPosition="2" backgroundColor="#33000000" font="Regular;20" foregroundColor="#fcc000" />
+ </screen>""" % (w,h,w,h,cx,cy,dx,dy,dw)
+
+
+ def __init__(self, session, currentService, servicelist):
+ self.session = session
+ Screen.__init__(self, session)
+ self.onClose.append(self.__onClose)
+ self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ChannelSelectBaseActions", "ChannelSelectEPGActions"],
+ {
+ "cancel": self.close,
+ "ok": self.showHide,
+ "right": self.nextService,\r
+ "left": self.prevService,
+ "nextBouquet": self.nextBouquet,
+ "prevBouquet": self.prevBouquet,
+ "showEPGList": self.openEventView,
+
+ }, -1)
+ self["actions2"] = NumberActionMap(["NumberActions"],
+ {
+ "1": self.keyNumberGlobal,
+ "2": self.keyNumberGlobal,
+ "3": self.keyNumberGlobal,
+ "4": self.keyNumberGlobal,
+ "5": self.keyNumberGlobal,
+ "6": self.keyNumberGlobal,
+ "7": self.keyNumberGlobal,
+ "8": self.keyNumberGlobal,
+ "9": self.keyNumberGlobal,
+ }, -1)
+ self.epgcache = eEPGCache.getInstance()
+ self.servicelist = servicelist
+ self["coverArt"] = MerlinMediaPixmap()
+ self["display"] = Label()
+ self["video"] = VideoWindow(fb_width = getDesktop(0).size().width(), fb_height = getDesktop(0).size().height())
+ if self.servicelist is None:
+ self.playService(currentService)
+ else:
+ current = ServiceReference(self.servicelist.getCurrentSelection())
+ self.playService(current.ref)
+
+ self.showHideTimer = eTimer()
+ self.showHideTimer.timeout.get().append(self.showHideTimerTimeout)
+ self.idx = config.usage.infobar_timeout.index
+ if self.idx:
+ self.showHideTimer.start(self.idx * 1000)
+ self.displayShown = True
+
+ def showHide(self):
+ if self.displayShown:
+ if self.showHideTimer.isActive():
+ self.showHideTimer.stop()
+ self["coverArt"].hide()
+ self["display"].hide()
+ else:
+ self["coverArt"].show()
+ self["display"].show()
+ if self.idx:
+ self.showHideTimer.start(self.idx * 1000)
+ self.displayShown = not self.displayShown
+
+ def showHideTimerTimeout(self):
+ self.showHide()
+
+ def updateDisplayText(self, text):
+ if self.showHideTimer.isActive():
+ self.showHideTimer.stop()
+ self["display"].setText(text)
+ self.displayShown = False
+ self.showHide()
+
+# Source Code taken from Virtual(Pip)Zap :-)
+
+ # switch with numbers
+ def keyNumberGlobal(self, number):
+ self.session.openWithCallback(self.numberEntered, NumberZap, number)
+
+ def numberEntered(self, retval):
+ if retval > 0:
+ self.zapToNumber(retval)
+
+ def searchNumberHelper(self, serviceHandler, num, bouquet):
+ servicelist = serviceHandler.list(bouquet)
+ if not servicelist is None:
+ while num:
+ serviceIterator = servicelist.getNext()
+ if not serviceIterator.valid(): #check end of list
+ break
+ playable = not (serviceIterator.flags & (eServiceReference.isMarker|eServiceReference.isDirectory))
+ if playable:
+ num -= 1;
+ if not num: #found service with searched number ?
+ return serviceIterator, 0
+ return None, num
+
+ def zapToNumber(self, number):
+ bouquet = self.servicelist.bouquet_root
+ service = None
+ serviceHandler = eServiceCenter.getInstance()
+ bouquetlist = serviceHandler.list(bouquet)
+ if not bouquetlist is None:
+ while number:
+ bouquet = bouquetlist.getNext()
+ if not bouquet.valid(): #check end of list
+ break
+ if bouquet.flags & eServiceReference.isDirectory:
+ service, number = self.searchNumberHelper(serviceHandler, number, bouquet)
+ if not service is None:
+ if self.servicelist.getRoot() != bouquet: #already in correct bouquet?
+ self.servicelist.clearPath()
+ if self.servicelist.bouquet_root != bouquet:
+ self.servicelist.enterPath(self.servicelist.bouquet_root)
+ self.servicelist.enterPath(bouquet)
+ self.servicelist.setCurrentSelection(service) #select the service in servicelist
+ # update infos, no matter if service is none or not
+ current = ServiceReference(self.servicelist.getCurrentSelection())
+ self.playService(current.ref)
+
+ def nextService(self):
+ if self.servicelist is not None:
+ # get next service
+ if self.servicelist.inBouquet():
+ prev = self.servicelist.getCurrentSelection()
+ if prev:
+ prev = prev.toString()
+ while True:
+ if config.usage.quickzap_bouquet_change.value and self.servicelist.atEnd():
+ self.servicelist.nextBouquet()
+ else:
+ self.servicelist.moveDown()
+ cur = self.servicelist.getCurrentSelection()
+ if not cur or (not (cur.flags & 64)) or cur.toString() == prev:
+ break
+ else:
+ self.servicelist.moveDown()
+ if self.isPlayable():
+ current = ServiceReference(self.servicelist.getCurrentSelection())
+ self.playService(current.ref)
+ else:
+ self.nextService()
+
+ def prevService(self):
+ if self.servicelist is not None:
+ # get previous service
+ if self.servicelist.inBouquet():
+ prev = self.servicelist.getCurrentSelection()
+ if prev:
+ prev = prev.toString()
+ while True:
+ if config.usage.quickzap_bouquet_change.value:
+ if self.servicelist.atBegin():
+ self.servicelist.prevBouquet()
+ self.servicelist.moveUp()
+ cur = self.servicelist.getCurrentSelection()
+ if not cur or (not (cur.flags & 64)) or cur.toString() == prev:
+ break
+ else:
+ self.servicelist.moveUp()
+ if self.isPlayable():
+ current = ServiceReference(self.servicelist.getCurrentSelection())
+ self.playService(current.ref)
+ else:
+ self.prevService()
+
+ def isPlayable(self):
+ # check if service is playable
+ current = ServiceReference(self.servicelist.getCurrentSelection())
+ return not (current.ref.flags & (eServiceReference.isMarker|eServiceReference.isDirectory))
+
+
+ def nextBouquet(self):
+ if self.servicelist is not None:
+ # next bouquet with first service
+ if config.usage.multibouquet.value:
+ self.servicelist.nextBouquet()
+ current = ServiceReference(self.servicelist.getCurrentSelection())
+ self.playService(current.ref)
+
+ def prevBouquet(self):
+ if self.servicelist is not None:
+ # previous bouquet with first service
+ if config.usage.multibouquet.value:
+ self.servicelist.prevBouquet()
+ current = ServiceReference(self.servicelist.getCurrentSelection())
+ self.playService(current.ref)
+
+ def openSingleServiceEPG(self):
+ # show EPGList
+ current = ServiceReference(self.servicelist.getCurrentSelection())
+ self.session.open(EPGSelection, current.ref)
+
+ def openEventView(self):
+ # show EPG Event
+ epglist = [ ]
+ self.epglist = epglist
+ service = ServiceReference(self.servicelist.getCurrentSelection())
+ ref = service.ref
+ evt = self.epgcache.lookupEventTime(ref, -1)
+ if evt:
+ epglist.append(evt)
+ evt = self.epgcache.lookupEventTime(ref, -1, 1)
+ if evt:
+ epglist.append(evt)
+ if epglist:
+ self.session.open(EventViewEPGSelect, epglist[0], service, self.eventViewCallback, self.openSingleServiceEPG, self.openMultiServiceEPG, self.openSimilarList)
+
+ def eventViewCallback(self, setEvent, setService, val):
+ epglist = self.epglist
+ if len(epglist) > 1:
+ tmp = epglist[0]
+ epglist[0] = epglist[1]
+ epglist[1] = tmp
+ setEvent(epglist[0])
+
+ def openMultiServiceEPG(self):
+ # not supported
+ pass
+
+ def openSimilarList(self, eventid, refstr):
+ self.session.open(EPGSelection, refstr, None, eventid)
+
+ def playService(self, service):
+ if service and (service.flags & eServiceReference.isGroup):
+ ref = getBestPlayableServiceReference(service, eServiceReference())
+ else:
+ ref = service
+ self.pipservice = eServiceCenter.getInstance().play(ref)
+ if self.pipservice and not self.pipservice.setTarget(1):
+ self.pipservice.start()
+
+ def __onClose(self):
+ self.pipservice = None
+ if self.showHideTimer.isActive():
+ self.showHideTimer.stop()
+
+
+
class MerlinMusicPlayerScreen(Screen, InfoBarBase, InfoBarSeek, InfoBarNotifications):
sz_w = getDesktop(0).size().width()
</screen>"""
- def __init__(self, session, songlist, index, idreammode):
+ def __init__(self, session, songlist, index, idreammode, currentservice, servicelist):
self.session = session
Screen.__init__(self, session)
InfoBarNotifications.__init__(self)
"yellow": self.pauseEntry,
"green": self.play,
"input_date_time": self.config,
+ "ok": self.showTV,
}, -1)
self.onClose.append(self.__onClose)
self.screenSaverScreen = None
self.iDreamMode = idreammode
+ self.currentService = currentservice
+ self.serviceList = servicelist
def embeddedCoverArt(self):
self["coverArt"].embeddedCoverArt()
if self.screenSaverTimer.isActive():
self.screenSaverTimer.stop()
self.session.openWithCallback(self.setupFinished, MerlinMusicPlayerSetup, False)
+
+ def showTV(self):
+ if SystemInfo.get("NumVideoDecoders", 1) > 1:
+ if self.screenSaverTimer.isActive():
+ self.screenSaverTimer.stop()
+ if self.screenSaverScreen:
+ self.screenSaverScreen.doClose()
+ self.screenSaverScreen = None
+ self.screenSaverScreen = self.session.instantiateDialog(MerlinMusicPlayerTV, self.currentService, self.serviceList)
+ self.session.execDialog(self.screenSaverScreen)
+ self.screenSaverScreen.updateLCD(self.currentTitle,1)
+ self.screenSaverScreen.updateLCD(self.nextTitle,4)
+ album = self["album"].getText()
+ if album:
+ text = "%s - %s" % (self["title"].getText(), album)
+ else:
+ text = self["title"].getText()
+ self.screenSaverScreen.updateDisplayText(text)
+ self.screenSaverScreen.updateCover(self["coverArt"].coverArtFileName, modus = 0)
def setupFinished(self, result):
if result:
try:
index = self["list"].getCurrentIndex()
songlist = self["list"].getList()
- self.summaries.setText(songlist[index][0].title,1)
+ mode = self.iDreamMode or songlist[index][0].PTS
+ if mode:
+ self.summaries.setText(songlist[index][0].title,1)
+ else:
+ self.summaries.setText(songlist[index][0].text,1)
count = self["list"].getItemCount()
# voheriges
index -= 1
if index < 0:
index = count
- self.summaries.setText(songlist[index][0].title,3)
+ if mode:
+ self.summaries.setText(songlist[index][0].title,3)
+ else:
+ self.summaries.setText(songlist[index][0].text,3)
# naechstes
index = self["list"].getCurrentIndex() + 1
if index > count:
index = 0
- self.summaries.setText(songlist[index][0].title,4)
+ if mode:
+ self.summaries.setText(songlist[index][0].title,4)
+ else:
+ self.summaries.setText(songlist[index][0].text,4)
except: pass
def createSummary(self):
</screen>"""
- def __init__(self, session):
+ def __init__(self, session, servicelist):
self.session = session
Screen.__init__(self, session)
self["list"] = iDreamList()
self.onShown.append(self.lcdUpdate)
self.onClose.append(self.__onClose)
- self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference()
+ self.serviceList = servicelist
+ self.currentService = self.session.nav.getCurrentlyPlayingServiceReference()
self.session.nav.stopService()
self.mode = 0
def createPlaylistFinished(self, text = None):
if text:
- self.sqlCommand("""INSERT INTO Playlists (playlist_text) VALUES("%s");""" % (text))
+ self.sqlCommand('INSERT INTO Playlists (playlist_text) VALUES("%s");' % (text))
self.clearCache()
self.menu_pressed()
search = "%" + searchText + "%"
if searchType == 1:
sql_where = "where title like '%s'" % search
- text = _("""Search results for "%s" in all titles""") % searchText
+ text = _('Search results for "%s" in all titles') % searchText
elif searchType == 2:
sql_where = "where artists.artist like '%s'" % search
- text = _("""Search results for "%s" in all artists""") % searchText
+ text = _('Search results for "%s" in all artists') % searchText
elif searchType == 3:
sql_where = "where album_text like '%s'" % search
- text = _("""Search results for "%s" in all albums""") % searchText
+ text = _('Search results for "%s" in all albums') % searchText
else:
sql_where = "where (title like '%s' or artists.artist like '%s' or album_text like '%s')" % (search,search,search)
- text = _("""Search results for "%s" in title, artist or album""") % searchText
+ text = _('Search results for "%s" in title, artist or album') % searchText
self.setButtons(red = True, yellow = True, blue = True)
oldmode = self.mode
self.mode = 20
if self.player is not None:
self.player.doClose()
self.player = None
- self.player = self.session.instantiateDialog(MerlinMusicPlayerScreen,self["list"].getList()[1:], self["list"].getCurrentIndex() -1, True)
+ self.player = self.session.instantiateDialog(MerlinMusicPlayerScreen,self["list"].getList()[1:], self["list"].getCurrentIndex() -1, True, self.currentService, self.serviceList)
self.session.execDialog(self.player)
def red_pressed(self):
index = config.plugins.merlinmusicplayer.lastsonglistindex.value
if index >= count:
index = 0
- self.player = self.session.instantiateDialog(MerlinMusicPlayerScreen,SongList, index, iDreamMode)
+ self.player = self.session.instantiateDialog(MerlinMusicPlayerScreen,SongList, index, iDreamMode, self.currentService, self.serviceList)
self.session.execDialog(self.player)
def config(self):
if self.player is not None:
self.player.doClose()
self.player = None
- self.session.nav.playService(self.CurrentService)
+ if self.serviceList is None:
+ self.session.nav.playService(self.currentService)
+ else:
+ current = ServiceReference(self.serviceList.getCurrentSelection())
+ self.session.nav.playService(current.ref)
+
def lcdUpdate(self):
try:
</screen>"""
else:
skin = """
- <screen name="MerlinMusicPlayerFileList" position="0,0" size="720,576" flags="wfNoBorder" backgroundColor="#00000000" title="Merlin Music Player Setup">
+ <screen position="0,0" size="720,576" flags="wfNoBorder" backgroundColor="#00000000" title="Merlin Music Player Setup">
<ePixmap position="50,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
<ePixmap position="200,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
<widget render="Label" source="key_red" position="50,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
</screen>"""
- def __init__(self, session):
+ def __init__(self, session, servicelist):
self.session = session
Screen.__init__(self, session)
self["list"] = FileList(config.plugins.merlinmusicplayer.defaultfilebrowserpath.value, showDirectories = True, showFiles = True, matchingPattern = "(?i)^.*\.(mp3|m4a|flac|ogg|m3u|pls|cue)", useServiceRef = False)
"back": self.close,
"input_date_time": self.config,
"info" : self.info_pressed,
+ "green": self.green_pressed,
+ "up": self.moveup,
+ "down": self.movedown,
+ "right": self.moveright,
+ "left" : self.moveleft,
}, -1)
-
- self["headertext"] = Label(_("Filelist"))
+ self.serviceList = servicelist
+ self["headertext"] = Label()
self.player = None
self.onClose.append(self.__onClose)
self.onLayoutFinish.append(self.startRun)
- self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference()
+ self.onShown.append(self.updateTarget)
+ self.currentService = self.session.nav.getCurrentlyPlayingServiceReference()
self.session.nav.stopService()
def startRun(self):
index = config.plugins.merlinmusicplayer.lastsonglistindex.value
if index >= count:
index = 0
- self.player = self.session.instantiateDialog(MerlinMusicPlayerScreen,SongList, index, iDreamMode)
+ self.player = self.session.instantiateDialog(MerlinMusicPlayerScreen,SongList, index, iDreamMode, self.currentService, self.serviceList)
self.session.execDialog(self.player)
def readCUE(self, filename):
if m.group('filename')[0] == "/":
songfilename = m.group('filename')
else:
- songfilename = os_path.dirname(filename) + "/" + m.group('filename')
+ songfilename = os_path.join(os_path.dirname(filename), m.group('filename'))
m = title_re.search(entry)
if m:
if state == 0:
if entry[0] == "/":
songfilename = entry
else:
- songfilename = os_path.dirname(filename) + "/" + entry
+ songfilename = os_path.join(os_path.dirname(filename),entry)
if displayname:
text = displayname
displayname = None
plsfile.close()
return SongList
+ def green_pressed(self):
+ SongList = []
+ count = 0
+ for root, subFolders, files in os_walk(self["list"].getCurrentDirectory()):
+ files.sort()
+ for filename in files:
+ if filename.lower().endswith(".mp3") or filename.lower().endswith(".flac") or filename.lower().endswith(".m4a") or filename.lower().endswith(".ogg"):
+ SongList.append((Item(text = filename, filename = os_path.join(root,filename)),))
+ if self.player is not None:
+ self.player.doClose()
+ self.player = None
+ count = len(SongList)
+ if count:
+ self.player = self.session.instantiateDialog(MerlinMusicPlayerScreen,SongList, 0, False, self.currentService, self.serviceList)
+ self.session.execDialog(self.player)
+ else:
+ self.session.open(MessageBox, _("No music files found!"), type = MessageBox.TYPE_INFO,timeout = 20 )
+
def ok(self):
if self["list"].canDescent():
self["list"].descent()
+ self.updateTarget()
else:
SongList = []
- index = 0
foundIndex = 0
count = 0
+ index = 0
currentFilename = self["list"].getFilename()
if currentFilename.lower().endswith(".m3u"):
SongList = self.readM3U(os_path.join(self["list"].getCurrentDirectory(),currentFilename))
if self["list"].getFilename() == filename:
foundIndex = index
index += 1
+
if self.player is not None:
self.player.doClose()
self.player = None
count = len(SongList)
if count:
- self.player = self.session.instantiateDialog(MerlinMusicPlayerScreen,SongList, foundIndex, False)
+ self.player = self.session.instantiateDialog(MerlinMusicPlayerScreen,SongList, foundIndex, False, self.currentService, self.serviceList)
self.session.execDialog(self.player)
else:
self.session.open(MessageBox, _("No music files found!"), type = MessageBox.TYPE_INFO,timeout = 20 )
if self.player.songList:
self.session.execDialog(self.player)
+ def moveright(self):
+ self["list"].pageDown()
+ self.lcdupdate()
+
+ def moveleft(self):
+ self["list"].pageUp()
+ self.lcdupdate()
+
+ def moveup(self):
+ self["list"].up()
+ self.lcdupdate()
+
+ def movedown(self):
+ self["list"].down()
+ self.lcdupdate()
+
+ def updateTarget(self):
+ currFolder = self["list"].getCurrentDirectory()
+ if currFolder is None:
+ currFolder = ("Invalid Location")
+ self["headertext"].setText(_("Filelist: %s") % currFolder)
+ self.lcdupdate()
+
+ def lcdupdate(self):
+ index = self["list"].getSelectionIndex()
+ sel = self["list"].list[index]
+ text = sel[1][7]
+ if sel[0][1] == True:
+ text = "/" + text
+ self.summaries.setText(text,1)
+ # voheriges
+ index -= 1
+ if index < 0:
+ index = len(self["list"].list) -1
+ sel = self["list"].list[index]
+ text = sel[1][7]
+ if sel[0][1] == True:
+ text = "/" + text
+ self.summaries.setText(text,3)
+ # naechstes
+ index = self["list"].getSelectionIndex() + 1
+ if index > (len(self["list"].list) -1):
+ index = 0
+ sel = self["list"].list[index]
+ text = sel[1][7]
+ if sel[0][1] == True:
+ text = "/" + text
+ self.summaries.setText(text,4)
+
def __onClose(self):
if self.player is not None:
self.player.doClose()
self.player = None
- self.session.nav.playService(self.CurrentService)
+ if self.serviceList is None:
+ self.session.nav.playService(self.currentService)
+ else:
+ current = ServiceReference(self.serviceList.getCurrentSelection())
+ self.session.nav.playService(current.ref)
if config.plugins.merlinmusicplayer.rememberlastfilebrowserpath.value:
config.plugins.merlinmusicplayer.defaultfilebrowserpath.value = self["list"].getCurrentDirectory()
config.plugins.merlinmusicplayer.defaultfilebrowserpath.save()
+ def createSummary(self):
+ return MerlinMusicPlayerLCDScreenText
def main(session,**kwargs):
- session.open(iDreamMerlin)
+ if kwargs.has_key("servicelist"):
+ servicelist = kwargs["servicelist"]
+ else:
+ servicelist = None
+ session.open(iDreamMerlin, servicelist)
def merlinmusicplayerfilelist(session,**kwargs):
- session.open(MerlinMusicPlayerFileList)
+ if kwargs.has_key("servicelist"):
+ servicelist = kwargs["servicelist"]
+ else:
+ servicelist = None
+ session.open(MerlinMusicPlayerFileList, servicelist)
def Plugins(**kwargs):