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()
143 return (True, "Playback of '%s' started" % (file))
145 return (True, "'%s' has been added to playlist" % (file))
147 def removeFile(self, file):
148 # TODO: fix error handling
149 mp = self.tryOpenMP()
151 return (False, "Mediaplayer not installed")
153 ref = eServiceReference(file)
155 ref = eServiceReference(4097, 0, file)
157 return (False, "'%s' is neither a valid reference nor a valid file" % file)
159 serviceRefList = mp.playlist.getServiceRefList()
161 for mpref in serviceRefList:
163 mp.playlist.deleteFile(i)
164 mp.playlist.updateList()
165 return (True, "'%s' removed from playlist" % file)
168 return (False, "'%s' not found in playlist" % file)
170 def loadPlaylist(self, param):
171 filename = "playlist/%s" % param
172 from Tools.Directories import resolveFilename, SCOPE_CONFIG
174 # TODO: fix error handling
175 mp = self.tryOpenMP()
177 return (False, "Mediaplayer not installed")
179 fullPath = resolveFilename(SCOPE_CONFIG, filename)
180 mp.PlaylistSelected((filename, fullPath))
181 return (True, "Playlist loaded from '%s'" % fullPath)
183 def writePlaylist(self, param):
184 filename = "playlist/%s.e2pls" % param
185 from Tools.Directories import resolveFilename, SCOPE_CONFIG
187 # TODO: fix error handling
188 mp = self.tryOpenMP()
190 return (False, "Mediaplayer not installed")
192 fullPath = resolveFilename(SCOPE_CONFIG, filename)
193 mp.playlistIOInternal.save(fullPath)
194 return (True, "Playlist saved to '%s'" % fullPath)
196 def command(self, param):
197 # TODO: fix error handling
198 noCreate = True if param == "exit" else False
199 mp = self.tryOpenMP(noCreate=noCreate)
201 return (False, "Mediaplayer not installed")
203 return (True, "Mediaplayer was not active")
205 if param == "previous":
206 mp.previousMarkOrEntry()
207 elif param == "play":
209 elif param == "pause":
211 elif param == "next":
213 elif param == "stop":
215 elif param == "exit":
217 elif param == "shuffle":
218 mp.playlist.PlayListShuffle()
219 elif param == "clear":
222 return (False, "Unknown parameter %s" % param)
223 return (True, "Command '%s' executed" % param)
225 def getCurrent(self):
226 mp = self.tryOpenMP()
228 msg = "Mediaplayer not installed"
229 return ((msg, msg, msg, msg, msg, msg),)
232 mp["artist"].getText(),
233 mp["title"].getText(),
234 mp["album"].getText(),
235 mp["year"].getText(),
236 mp["genre"].getText(),
237 mp["coverArt"].coverArtFileName
241 if self.func is self.CURRENT:
242 return self.getCurrent()
246 if self.func is self.CURRENT:
256 "ServiceReference": 0,
261 list = property(getList)
262 lut = property(getLut)