add /web/mediaplayeradd?file=
[vuplus_dvbapp-plugin] / webinterface / src / WebComponents / Sources / MP.py
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
5
6 class MP(Source):
7         LIST = 0
8         PLAY = 1
9         COMMAND = 3
10         WRITEPLAYLIST = 4
11         ADD = 5
12         REMOVE = 6
13
14         def __init__(self, session, func=LIST):
15                 Source.__init__(self)
16                 self.func = func
17                 self.session = session
18                 error = "unknown command (%s)" % func
19                 if func is self.LIST:
20                         self.result = ((error, error, error),)
21                 else:
22                         self.result = (False, error)
23
24         def handleCommand(self, cmd):
25                 self.cmd = cmd
26                 func = self.func
27                 if func is self.LIST:
28                         self.result = self.getFileList(cmd)
29                 elif func is self.PLAY:
30                         self.result = self.playFile(cmd)
31                 elif func is self.COMMAND:
32                         self.result = self.command(cmd)
33                 elif func is self.WRITEPLAYLIST:
34                         self.result = self.writePlaylist(cmd)
35                 elif func is self.REMOVE:
36                         self.result = self.removeFile(cmd)
37                 elif func is self.ADD:
38                         param = { "file" : cmd, "root" : None}
39                         self.result = self.addFile(param)
40
41         def tryOpenMP(self, noCreate = False):
42                 # check if there is an active link
43                 if hasattr(self.session, "mediaplayer"):
44                         mp = self.session.mediaplayer
45                         try:
46                                 len(mp.playlist)
47                         except Exception, e:
48                                 pass
49                         else:
50                                 return mp
51
52                 # check if we actually have the mp installed
53                 try:
54                         from Plugins.Extensions.MediaPlayer.plugin import MediaPlayer, MyPlayList
55                 # nope, bail out
56                 except ImportError, ie:
57                         return None
58                 else:
59                         # mp installed, see if it's running
60                         if isinstance(self.session.current_dialog, MediaPlayer):
61                                 self.session.mediaplayer = self.session.current_dialog
62                         # start new mp
63                         else:
64                                 # bail out if we don't want to open a new mp
65                                 if noCreate:
66                                         return False
67                                 self.session.mediaplayer = self.session.open(MediaPlayer)
68                         return self.session.mediaplayer
69
70         def getFileList(self, param):
71                 if param["path"] == "playlist":
72                         mp = self.tryOpenMP()
73                         # TODO: Fix dummy return if unable to load mp
74                         if mp is None:
75                                 return (("empty", True, "playlist"),)
76
77                         if mp.playlist:
78                                 return [(serviceRef.getPath(), False, "playlist") for serviceRef in mp.playlist.getServiceRefList()]
79                         else:
80                                 return (("empty", True, "playlist"),)
81
82                 matchingPattern = "(?i)^.*\.(mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob)" #MediaPlayer-Match
83                 useServiceRef = False
84                 if param["types"] == "audio":
85                         matchingPattern = "(?i)^.*\.(mp3|ogg|wav|wave|m3u|pls|e2pls)"
86                         useServiceRef = True
87                 elif param["types"] == "video":
88                         matchingPattern = "(?i)^.*\.(ts|avi|mpeg|m3u|pls|e2pls|mpg|vob)"
89                         useServiceRef = True
90                 elif param["types"] == "any":
91                         matchingPattern = ".*"
92                 else:
93                         matchingPattern = param["types"]
94
95                 path = param["path"]
96                 if path == "Filesystems":
97                         path = None
98                 elif path is not None and not os_path.isdir(path):
99                         # TODO: returning something is better than just dying but is this return sane?
100                         return ((None, True, path),)
101
102                 filelist = FileList(path, showDirectories=True, showFiles=True, matchingPattern=matchingPattern, useServiceRef=useServiceRef, isTop=False)
103                 list = filelist.getFileList()
104                 if useServiceRef is True:
105                         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 ]
106                 else:
107                         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 ]
108
109                 return returnList
110
111         def playFile(self, param):
112                 return self.addFile(param, doPlay=True)
113
114         def addFile(self, param, doPlay=False):
115                 # TODO: fix error handling
116                 mp = self.tryOpenMP()
117                 if mp is None:
118                         return (False, "mediaplayer not installed")
119
120                 file = param["file"]
121                 doAdd = False if param["root"] == "playlist" else True
122
123                 if not file:
124                         return (False, "missing or invalid parameter file")
125
126                 ref = eServiceReference(file)
127                 if not ref.valid():
128                         if not os_path.isfile(file):
129                                 return (False, "%s is neither a valid reference nor a valid file" % file)
130                         ref = eServiceReference(4097, 0, file)
131
132                 if doAdd:
133                         mp.playlist.addFile(ref)
134                 if doPlay:
135                         mp.playServiceRefEntry(ref)
136
137                 mp.playlist.updateList()
138                 return (True, "%s added to playlist and/or playback started" % (file))
139
140         def removeFile(self, file):
141                 # TODO: fix error handling
142                 mp = self.tryOpenMP()
143                 if mp is None:
144                         return (False, "mediaplayer not installed")
145
146                 ref = eServiceReference(file)
147                 if not ref.valid():
148                         if not os_path.isfile(file):
149                                 return (False, "%s is neither a valid reference nor a valid file" % file)
150                         ref = eServiceReference(4097, 0, file)
151
152                 serviceRefList = mp.playlist.getServiceRefList()
153                 i = 0
154                 for mpref in serviceRefList:
155                         if mpref == ref:
156                                 mp.playlist.deleteFile(i)
157                                 mp.playlist.updateList()
158                                 return (True, "%s removed from playlist" % file)
159                         i += 1
160
161                 return (False, "%s not found in playlist" % file)
162
163         def writePlaylist(self, param):
164                 filename = "playlist/%s.e2pls" % param
165                 from Tools.Directories import resolveFilename, SCOPE_CONFIG
166
167                 # TODO: fix error handling
168                 mp = self.tryOpenMP()
169                 if mp is None:
170                         return (False, "mediaplayer not installed")
171
172                 fullPath = resolveFilename(SCOPE_CONFIG, filename)
173                 mp.playlistIOInternal.save(resolveFilename(SCOPE_CONFIG, filename))
174                 return (True, "playlist saved to %s" % fullPath)
175
176         def command(self, param):
177                 # TODO: fix error handling
178                 noCreate = True if param == "exit" else False
179                 mp = self.tryOpenMP(noCreate=noCreate)
180                 if mp is None:
181                         return (False, "mediaplayer not installed")
182                 elif mp is False:
183                         return (True, "mediaplayer was not active")
184
185                 if param == "previous":
186                         mp.previousMarkOrEntry()
187                 elif param == "play":
188                         mp.playEntry()
189                 elif param == "pause":
190                         mp.pauseEntry()
191                 elif param == "next":
192                         mp.nextEntry()
193                 elif param == "stop":
194                         mp.stopEntry()
195                 elif param == "exit":
196                         mp.exit()
197                 else:
198                         return (False, "unknown parameter %s" % param)
199                 return (True, "executed %s" % param)
200
201         list = property(lambda self: self.result)
202         lut = {
203                 "ServiceReference": 0,
204                 "IsDirectory": 1,
205                 "Root": 2,
206         }