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