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