1 from enigma import eServiceReference
2 from Components.Sources.Source import Source
3 from Components.FileList import FileList
4 from os import path as os_path
16 def __init__(self, session, func=LIST):
19 self.session = session
20 error = "unknown command (%s)" % func
22 self.result = ((error, error, error),)
24 self.result = (False, error)
26 def handleCommand(self, cmd):
30 self.result = self.getFileList(cmd)
31 elif func is self.PLAY:
32 self.result = self.playFile(cmd)
33 elif func is self.COMMAND:
34 self.result = self.command(cmd)
35 elif func is self.WRITEPLAYLIST:
36 self.result = self.writePlaylist(cmd)
37 elif func is self.LOADPLAYLIST:
38 self.result = self.loadPlaylist(cmd)
39 elif func is self.REMOVE:
40 self.result = self.removeFile(cmd)
41 elif func is self.ADD:
42 param = { "file" : cmd, "root" : None}
43 self.result = self.addFile(param)
45 def tryOpenMP(self, noCreate = False):
46 # check if there is an active link
47 if hasattr(self.session, "mediaplayer"):
48 mp = self.session.mediaplayer
56 # check if we actually have the mp installed
58 from Plugins.Extensions.MediaPlayer.plugin import MediaPlayer, MyPlayList
60 except ImportError, ie:
63 # mp installed, see if it's running
64 if isinstance(self.session.current_dialog, MediaPlayer):
65 self.session.mediaplayer = self.session.current_dialog
68 # bail out if we don't want to open a new mp
71 self.session.mediaplayer = self.session.open(MediaPlayer)
72 return self.session.mediaplayer
74 def getFileList(self, param):
75 if param["path"] == "playlist":
77 # TODO: Fix dummy return if unable to load mp
79 return (("empty", True, "playlist"),)
82 return [(serviceRef.getPath(), False, "playlist") for serviceRef in mp.playlist.getServiceRefList()]
84 return (("empty", True, "playlist"),)
86 matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov|m2ts)" #MediaPlayer-Match
88 if param["types"] == "audio":
89 matchingPattern = "(?i)^.*\.(mp3|ogg|wav|wave|m3u|pls|e2pls)"
91 elif param["types"] == "video":
92 matchingPattern = "(?i)^.*\.(ts|avi|mpeg|m3u|pls|e2pls|mpg|vob)"
94 elif param["types"] == "any":
95 matchingPattern = ".*"
97 matchingPattern = param["types"]
100 if path == "Filesystems":
102 elif path is not None and not os_path.isdir(path):
103 # TODO: returning something is better than just dying but is this return sane?
104 return ((None, True, path),)
106 filelist = FileList(path, showDirectories=True, showFiles=True, matchingPattern=matchingPattern, useServiceRef=useServiceRef, isTop=False)
107 list = filelist.getFileList()
108 if useServiceRef is True:
109 returnList = [ (x[0][0].toString(), x[0][1], path) if x[0][1] is False else (x[0][0], x[0][1], path) for x in list ]
111 returnList = [ (param["path"] + x[0][0], x[0][1], path) if x[0][1] is False else (x[0][0], x[0][1], path) for x in list ]
115 def playFile(self, param):
116 return self.addFile(param, doPlay=True)
118 def addFile(self, param, doPlay=False):
119 # TODO: fix error handling
120 mp = self.tryOpenMP()
122 return (False, "mediaplayer not installed")
125 doAdd = False if param["root"] == "playlist" else True
128 return (False, "missing or invalid parameter file")
130 ref = eServiceReference(file)
132 if not os_path.isfile(file):
133 return (False, "%s is neither a valid reference nor a valid file" % file)
134 ref = eServiceReference(4097, 0, file)
137 mp.playlist.addFile(ref)
139 mp.playServiceRefEntry(ref)
141 mp.playlist.updateList()
142 return (True, "%s added to playlist and/or playback started" % (file))
144 def removeFile(self, file):
145 # TODO: fix error handling
146 mp = self.tryOpenMP()
148 return (False, "mediaplayer not installed")
150 ref = eServiceReference(file)
152 ref = eServiceReference(4097, 0, file)
154 return (False, "%s is neither a valid reference nor a valid file" % file)
156 serviceRefList = mp.playlist.getServiceRefList()
158 for mpref in serviceRefList:
160 mp.playlist.deleteFile(i)
161 mp.playlist.updateList()
162 return (True, "%s removed from playlist" % file)
165 return (False, "%s not found in playlist" % file)
167 def loadPlaylist(self, param):
168 filename = "playlist/%s" % param
169 from Tools.Directories import resolveFilename, SCOPE_CONFIG
171 # TODO: fix error handling
172 mp = self.tryOpenMP()
174 return (False, "mediaplayer not installed")
176 fullPath = resolveFilename(SCOPE_CONFIG, filename)
177 mp.PlaylistSelected(fullPath)
178 return (True, "playlist loaded from %s" % fullPath)
180 def writePlaylist(self, param):
181 filename = "playlist/%s.e2pls" % param
182 from Tools.Directories import resolveFilename, SCOPE_CONFIG
184 # TODO: fix error handling
185 mp = self.tryOpenMP()
187 return (False, "mediaplayer not installed")
189 fullPath = resolveFilename(SCOPE_CONFIG, filename)
190 mp.playlistIOInternal.save(fullPath)
191 return (True, "playlist saved to %s" % fullPath)
193 def command(self, param):
194 # TODO: fix error handling
195 noCreate = True if param == "exit" else False
196 mp = self.tryOpenMP(noCreate=noCreate)
198 return (False, "mediaplayer not installed")
200 return (True, "mediaplayer was not active")
202 if param == "previous":
203 mp.previousMarkOrEntry()
204 elif param == "play":
206 elif param == "pause":
208 elif param == "next":
210 elif param == "stop":
212 elif param == "exit":
214 elif param == "shuffle":
215 mp.playlist.PlayListShuffle()
216 elif param == "clear":
219 return (False, "unknown parameter %s" % param)
220 return (True, "executed %s" % param)
222 def getCurrent(self):
223 mp = self.tryOpenMP()
225 msg = "mediaplayer not installed"
226 return ((msg, msg, msg, msg, msg, msg),)
229 mp["artist"].getText(),
230 mp["title"].getText(),
231 mp["album"].getText(),
232 mp["year"].getText(),
233 mp["genre"].getText(),
234 mp["coverArt"].coverArtFileName
238 if self.func is self.CURRENT:
239 return self.getCurrent()
243 if self.func is self.CURRENT:
253 "ServiceReference": 0,
258 list = property(getList)
259 lut = property(getLut)