Reformed channel selection, and added location and tag filter to movie list
[vuplus_dvbapp-plugin] / webinterface / src / WebComponents / Sources / Movie.py
1 from enigma import eServiceReference, iServiceInformation, eServiceCenter
2 from Components.Sources.Source import Source
3 from Components.config import config
4 from ServiceReference import ServiceReference
5 from Tools.Directories import resolveFilename, SCOPE_HDD
6 from Tools.FuzzyDate import FuzzyTime
7
8 from os import stat as os_stat
9
10 class Movie( Source):
11         LIST = 0
12         DEL = 1
13         TAGS = 2
14         
15         def __init__(self, session, movielist, func = LIST):
16                 Source.__init__(self)
17                 self.func = func
18                 self.session = session
19                 self.tagfilter = []
20                 self.root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + resolveFilename(SCOPE_HDD))
21                 self.movielist = movielist #MovieList(self.root)
22                 self.movielist.load(self.root, None)
23                 self.cmd = ""
24                 self.result = False, "Missing or Wrong Argument"
25         
26         def handleCommand(self, cmd):
27                 if cmd is not None:
28                         self.cmd = cmd
29                         if self.func is self.DEL:
30                                 self.result = self.delMovie(cmd)
31                         elif self.func is self.LIST:
32                                 self.root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + cmd['dirname'])
33                                 self.tagfilter = cmd['tag'] and [cmd['tag']] or []
34                    
35         def delMovie(self, param):
36 #               print "[WebComponents.delMovie] %s" %param
37                 
38                 if param is None:
39                         return False, "Missing Parameter: sRef"
40                 
41                 service = ServiceReference(param)
42                 result = False
43                 
44                 if service is not None:
45                         #mostly copied from Screens.MovieSelection
46                         serviceHandler = eServiceCenter.getInstance()
47                         offline = serviceHandler.offlineOperations(service.ref)
48                         info = serviceHandler.info(service.ref)
49                         name = info and info.getName(service.ref) or "this recording"
50                         
51                         if offline is not None:
52                                 if not offline.deleteFromDisk(0):
53                                         result = True
54                                 
55                         if result == False:
56                                 return result, "Could not delete Movie '%s'" %name
57                         else: 
58                                 return result, "Movie '%s' deleted" %name
59                 
60                 return result, "Illegal Parameter Value: sRef - '%s'" %param  
61                 
62                 
63
64    
65         def command(self):
66                 self.movielist.reload(root=self.root,filter_tags = self.tagfilter)
67                 list=[]
68
69                 for (serviceref, info, begin, unknown) in self.movielist.list:
70                         movie = []
71                         movie.append(serviceref.toString())
72                         movie.append(ServiceReference(serviceref).getServiceName())
73                         movie.append(info.getInfoString(serviceref, iServiceInformation.sDescription))
74                         rtime = info.getInfo(serviceref, iServiceInformation.sTimeCreate)
75                         movie.append(rtime)
76                         
77                         if rtime > 0:
78                                 t = FuzzyTime(rtime)
79                                 begin_string = t[0] + ", " + t[1]
80                         else:
81                                 begin_string = "undefined"
82                         movie.append(begin_string)
83                         
84                         
85                         if config.plugins.Webinterface.loadmovielength.value:
86                                 len =  info.getLength(serviceref)
87                                 if len > 0:
88                                         len = "%d:%02d" % (len / 60, len % 60)
89                                 else:
90                                         len = "?:??"
91                         else:
92                                 len="disabled"
93                         movie.append(len)
94                         
95                         sourceERef =info.getInfoString(serviceref, iServiceInformation.sServiceref)
96                         sourceRef= ServiceReference(sourceERef)
97                         
98                         movie.append(sourceRef.getServiceName())
99                         movie.append(info.getInfoString(serviceref, iServiceInformation.sTags))
100                         event = info.getEvent(serviceref)
101                         if event is not None:
102                                 text = event.getEventName()
103                                 short = event.getShortDescription()
104                                 ext = event.getExtendedDescription()
105                                 movie.append(ext)
106                         else:
107                                 movie.append("")
108                         filename = "/"+"/".join(serviceref.toString().split("/")[1:])
109                         movie.append(filename)
110                         movie.append(os_stat(filename)[6])
111                         tag = self.cmd['tag'].lower()
112                         if not tag or info.getInfoString(serviceref, iServiceInformation.sTags).lower().find(tag)>=0:
113                                 """ add movie only to list, if a given tag is applied to the movie """
114                                 list.append(movie)
115                 return list
116
117         def getText(self):
118                 if self.func is self.DEL: 
119                         (result, text) = self.result
120                         xml  = "<e2simplexmlresult>\n"
121                         if result:
122                                 xml += "<e2state>True</e2state>\n"
123                         else:
124                                 xml += "<e2state>False</e2state>\n"                     
125                         xml += "<e2statetext>%s</e2statetext>\n" % text
126                         xml += "</e2simplexmlresult>\n"
127                         return xml
128                 elif self.func is self.TAGS:
129                         xml = "<e2movietags>\n"
130                         for tag in self.movielist.tags:
131                                 xml += "<e2movietag>%s</e2movietag>\n"%tag
132                         xml += "</e2movietags>\n"
133                         return xml
134                         
135         text = property(getText)                
136         
137         list = property(command)
138         lut = {"ServiceReference": 0
139                    ,"Title": 1
140                    ,"Description": 2
141                    ,"Time": 3
142                    ,"TimeString": 4
143                    ,"Length": 5
144                    ,"ServiceName": 6
145                    ,"Tags": 7
146                    ,"DescriptionExtended": 8
147                    ,"Filename": 9
148                    ,"Filesize": 10
149                    }