update de translation
[vuplus_dvbapp-plugin] / mytube / src / MyTubeSearch.py
1 from __init__ import _
2 from MyTubeService import GoogleSuggestions
3 from Screens.Screen import Screen
4 from Screens.LocationBox import MovieLocationBox
5 from Components.config import config, Config, ConfigSelection, ConfigText, getConfigListEntry, ConfigSubsection, ConfigYesNo, ConfigIP, ConfigNumber,ConfigLocations
6 from Components.ConfigList import ConfigListScreen
7 from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT
8 from Components.ActionMap import ActionMap
9 from Components.Button import Button
10 from Components.Label import Label
11 from Components.ScrollLabel import ScrollLabel
12 from Components.Sources.List import List
13 from Components.Pixmap import Pixmap
14 from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
15 from Components.Task import Task, Job, job_manager
16 from enigma import eListboxPythonMultiContent, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, gFont, eListbox,ePoint,eTimer
17 from Components.Task import job_manager
18 from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_HDD
19 from threading import Thread
20 from threading import Condition
21
22
23 import urllib
24 from urllib import FancyURLopener
25
26 class MyOpener(FancyURLopener):
27         version = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12'
28
29
30 class ConfigTextWithGoogleSuggestions(ConfigText):
31         class SuggestionsThread(Thread):
32                 def __init__(self, suggestionsService):
33                         Thread.__init__(self)
34                         self.suggestionsService = suggestionsService
35                         self.value = None
36                         self.running = True
37                         self.condition = Condition()
38
39                 def run(self):
40                         while self.running:
41                                 self.condition.acquire()
42                                 if self.value is None:
43                                         self.condition.wait()
44                                 value = self.value
45                                 self.value = None
46                                 self.condition.release()
47                                 if value is not None:
48                                         self.suggestionsService.getSuggestions(value)
49
50                 def stop(self):
51                         self.running = False
52                         self.condition.acquire()
53                         self.condition.notify()
54                         self.condition.release()
55                         self.join()
56
57                 def getSuggestions(self, value):
58                         self.condition.acquire()
59                         self.value = value
60                         self.condition.notify()
61                         self.condition.release()
62
63         def __init__(self, default = "", fixed_size = True, visible_width = False, threaded = False):
64                 ConfigText.__init__(self, default, fixed_size, visible_width)
65                 self.suggestions = GoogleSuggestions(self.propagateSuggestions, ds = "yt", hl = "en")
66                 self.suggestionsThread = None
67                 self.threaded = threaded
68                 self.suggestionsListActivated = False
69
70         def propagateSuggestions(self, suggestionsList):
71                 if self.suggestionsWindow:
72                         self.suggestionsWindow.update(suggestionsList)
73
74         def getSuggestions(self):
75                 if self.suggestionsThread is not None:
76                         self.suggestionsThread.getSuggestions(self.value)
77                 else:
78                         self.suggestions.getSuggestions(self.value)
79
80         def handleKey(self, key):
81                 if not self.suggestionsListActivated:
82                         ConfigText.handleKey(self, key)
83                         if key in [KEY_DELETE, KEY_BACKSPACE, KEY_ASCII, KEY_TIMEOUT]:
84                                 self.getSuggestions()
85
86         def onSelect(self, session):
87                 if self.threaded:
88                         if self.suggestionsThread is not None:
89                                 self.suggestionsThread.stop()
90                         self.suggestionsThread = ConfigTextWithGoogleSuggestions.SuggestionsThread(self.suggestions)
91                         self.suggestionsThread.start()
92                 else:
93                         self.suggestionsThread = None
94                 ConfigText.onSelect(self, session)
95                 if session is not None:
96                         self.suggestionsWindow = session.instantiateDialog(MyTubeSuggestionsListScreen, self)
97                         self.suggestionsWindow.deactivate()
98                         self.suggestionsWindow.hide()
99                 self.suggestions.getSuggestions(self.value)
100
101         def onDeselect(self, session):
102                 if self.suggestionsThread is not None:
103                         self.suggestionsThread.stop()
104                 ConfigText.onDeselect(self, session)
105                 if self.suggestionsWindow:
106                         session.deleteDialog(self.suggestionsWindow)
107                         self.suggestionsWindow = None
108
109         def suggestionListUp(self):
110                 if self.suggestionsWindow.getlistlenght() > 0:
111                         self.value = self.suggestionsWindow.up()
112
113         def suggestionListDown(self):
114                 if self.suggestionsWindow.getlistlenght() > 0:
115                         self.value = self.suggestionsWindow.down()
116
117         def suggestionListPageDown(self):
118                 if self.suggestionsWindow.getlistlenght() > 0:
119                         self.value = self.suggestionsWindow.pageDown()
120
121         def suggestionListPageUp(self):
122                 if self.suggestionsWindow.getlistlenght() > 0:
123                         self.value = self.suggestionsWindow.pageUp()
124
125         def activateSuggestionList(self):
126                 ret = False
127                 if self.suggestionsWindow is not None and self.suggestionsWindow.shown:
128                         self.tmpValue = self.value
129                         self.value = self.suggestionsWindow.activate()
130                         self.allmarked = False
131                         #self.marked_pos = -1
132                         self.suggestionsListActivated = True
133                         ret = True
134                 return ret
135
136         def deactivateSuggestionList(self):
137                 ret = False
138                 if self.suggestionsWindow is not None:
139                         self.suggestionsWindow.deactivate()
140                         self.getSuggestions()
141                         self.allmarked = True
142                         self.suggestionsListActivated = False
143                         ret = True
144                 return ret
145
146         def cancelSuggestionList(self):
147                 self.value = self.tmpValue
148                 return self.deactivateSuggestionList()
149
150         def enableSuggestionSelection(self,value):
151                 if self.suggestionsWindow is not None:
152                         self.suggestionsWindow.enableSelection(value)
153
154
155 config.plugins.mytube = ConfigSubsection()
156 config.plugins.mytube.search = ConfigSubsection()
157
158 config.plugins.mytube.search.searchTerm = ConfigTextWithGoogleSuggestions("", False, threaded = True)
159 config.plugins.mytube.search.orderBy = ConfigSelection(
160                                 [
161                                  ("relevance", _("Relevance")),
162                                  ("viewCount", _("View Count")),
163                                  ("published", _("Published")),
164                                  ("rating", _("Rating"))
165                                 ], "relevance")
166 config.plugins.mytube.search.time = ConfigSelection(
167                                 [
168                                  ("all_time", _("All Time")),
169                                  ("this_month", _("This Month")),
170                                  ("this_week", _("This Week")),
171                                  ("today", _("Today"))
172                                 ], "all_time")
173 config.plugins.mytube.search.racy = ConfigSelection(
174                                 [
175                                  ("include", _("Yes")),
176                                  ("exclude", _("No"))
177                                 ], "include")
178 config.plugins.mytube.search.categories = ConfigSelection(
179                                 [
180                                  (None, _("All")),
181                                  ("Film", _("Film & Animation")),
182                                  ("Autos", _("Autos & Vehicles")),
183                                  ("Music", _("Music")),
184                                  ("Animals", _("Pets & Animals")),
185                                  ("Sports", _("Sports")),
186                                  ("Travel", _("Travel & Events")),
187                                  ("Shortmov", _("Short Movies")),
188                                  ("Games", _("Gaming")),
189                                  ("Comedy", _("Comedy")),
190                                  ("People", _("People & Blogs")),
191                                  ("News", _("News & Politics")),
192                                  ("Entertainment", _("Entertainment")),
193                                  ("Education", _("Education")),
194                                  ("Howto", _("Howto & Style")),
195                                  ("Nonprofit", _("Nonprofits & Activism")),
196                                  ("Tech", _("Science & Technology"))
197                                 ], None)
198 config.plugins.mytube.search.lr = ConfigSelection(
199                                 [
200                                  (None, _("All")),
201                                  ("au", _("Australia")),
202                                  ("br", _("Brazil")),                            
203                                  ("ca", _("Canada")),
204                                  ("cz", _("Czech Republic")),
205                                  ("fr", _("France")),
206                                  ("de", _("Germany")),
207                                  ("gb", _("Great Britain")),
208                                  ("au", _("Australia")),
209                                  ("nl", _("Holland")),
210                                  ("hk", _("Hong Kong")),
211                                  ("in", _("India")),
212                                  ("ie", _("Ireland")),
213                                  ("il", _("Israel")),
214                                  ("it", _("Italy")),
215                                  ("jp", _("Japan")),
216                                  ("mx", _("Mexico")),
217                                  ("nz", _("New Zealand")),
218                                  ("pl", _("Poland")),
219                                  ("ru", _("Russia")),
220                                  ("kr", _("South Korea")),
221                                  ("es", _("Spain")),
222                                  ("se", _("Sweden")),
223                                  ("tw", _("Taiwan")),
224                                  ("us", _("United States")) 
225                                 ], None)
226 config.plugins.mytube.search.sortOrder = ConfigSelection(
227                                 [
228                                  ("ascending", _("Ascending")),
229                                  ("descending", _("Descending"))
230                                 ], "ascending")
231
232 config.plugins.mytube.general = ConfigSubsection()
233 config.plugins.mytube.general.showHelpOnOpen = ConfigYesNo(default = True)
234 config.plugins.mytube.general.loadFeedOnOpen = ConfigYesNo(default = True)
235 config.plugins.mytube.general.startFeed = ConfigSelection(
236                                 [
237                                  ("hd", _("HD videos")),
238                                  ("most_viewed", _("Most viewed")),
239                                  ("top_rated", _("Top rated")),
240                                  ("recently_featured", _("Recently featured")),
241                                  ("most_discussed", _("Most discussed")),
242                                  ("top_favorites", _("Top favorites")),
243                                  ("most_linked", _("Most linked")),
244                                  ("most_responded", _("Most responded")),
245                                  ("most_recent", _("Most recent"))
246                                 ], "most_viewed")
247
248 config.plugins.mytube.general.on_movie_stop = ConfigSelection(default = "ask", choices = [
249         ("ask", _("Ask user")), ("quit", _("Return to movie list")), ("playnext", _("Play next video")), ("playagain", _("Play video again")) ])
250
251 config.plugins.mytube.general.on_exit = ConfigSelection(default = "ask", choices = [
252         ("ask", _("Ask user")), ("quit", _("Return to movie list"))])
253
254
255 default = resolveFilename(SCOPE_HDD)
256 tmp = config.movielist.videodirs.value
257 if default not in tmp:
258         tmp.append(default)
259 config.plugins.mytube.general.videodir = ConfigSelection(default = default, choices = tmp)
260 config.plugins.mytube.general.history = ConfigText(default="")
261 config.plugins.mytube.general.clearHistoryOnClose = ConfigYesNo(default = False)
262
263 #config.plugins.mytube.general.useHTTPProxy = ConfigYesNo(default = False)
264 #config.plugins.mytube.general.ProxyIP = ConfigIP(default=[0,0,0,0])
265 #config.plugins.mytube.general.ProxyPort = ConfigNumber(default=8080)
266
267 class MyTubeSuggestionsListScreen(Screen):
268         skin = """
269                 <screen name="MyTubeSuggestionsListScreen" position="60,93" zPosition="6" size="610,160" flags="wfNoBorder" >
270                         <ePixmap position="0,0" zPosition="-1" size="610,160" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MyTube/suggestions_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
271                         <widget source="suggestionslist" render="Listbox" position="10,5" zPosition="7" size="580,150" scrollbarMode="showOnDemand" transparent="1" >
272                                 <convert type="TemplatedMultiContent">
273                                         {"template": [
274                                                         MultiContentEntryText(pos = (0, 1), size = (340, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
275                                                         MultiContentEntryText(pos = (350, 1), size = (180, 24), font=1, flags = RT_HALIGN_RIGHT, text = 1), # index 1 are the rtesults
276                                                 ],
277                                         "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
278                                         "itemHeight": 25
279                                         }
280                                 </convert>
281                         </widget>
282                 </screen>"""
283                 
284         def __init__(self, session, configTextWithGoogleSuggestion):
285                 Screen.__init__(self, session)
286                 self.activeState = False
287                 self.list = []
288                 self.suggestlist = []
289                 self["suggestionslist"] = List(self.list)
290                 self.configTextWithSuggestion = configTextWithGoogleSuggestion
291
292         def update(self, suggestions):
293                 if suggestions and len(suggestions[1]) > 0:
294                         if not self.shown:
295                                 self.show()
296                         if suggestions:
297                                 self.list = []
298                                 self.suggestlist = []
299                                 suggests = suggestions[1]
300                                 for suggestion in suggests:
301                                         name = suggestion[0]
302                                         results = suggestion[1].replace(" results", "")
303                                         numresults = results.replace(",", "")
304                                         self.suggestlist.append((name, numresults ))
305                                 if len(self.suggestlist):
306                                         self.suggestlist.sort(key=lambda x: int(x[1]))
307                                         self.suggestlist.reverse()
308                                         for entry in self.suggestlist:
309                                                 self.list.append((entry[0], entry[1] + _(" Results") ))
310                                         self["suggestionslist"].setList(self.list)
311                                         self["suggestionslist"].setIndex(0)
312                 else:
313                         self.hide()
314
315         def getlistlenght(self):
316                 return len(self.list)
317
318         def up(self):
319                 print "up"
320                 if self.list and len(self.list) > 0:
321                         self["suggestionslist"].selectPrevious()
322                         return self.getSelection()
323
324         def down(self):
325                 print "down"
326                 if self.list and len(self.list) > 0:
327                         self["suggestionslist"].selectNext()
328                         return self.getSelection()
329         
330         def pageUp(self):
331                 print "up"
332                 if self.list and len(self.list) > 0:
333                         self["suggestionslist"].selectPrevious()
334                         return self.getSelection()
335
336         def pageDown(self):
337                 print "down"
338                 if self.list and len(self.list) > 0:
339                         self["suggestionslist"].selectNext()
340                         return self.getSelection()
341
342         def activate(self):
343                 print "activate"
344                 self.activeState = True
345                 return self.getSelection()
346
347         def deactivate(self):
348                 print "deactivate"
349                 self.activeState = False
350                 return self.getSelection()
351
352         def getSelection(self):
353                 if self["suggestionslist"].getCurrent() is None:
354                         return None
355                 print self["suggestionslist"].getCurrent()[0]
356                 return self["suggestionslist"].getCurrent()[0]
357
358         def enableSelection(self,value):
359                 self["suggestionslist"].selectionEnabled(value)
360
361
362 class MyTubeSettingsScreen(Screen, ConfigListScreen):
363         skin = """
364                 <screen name="MyTubeSettingsScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
365                         <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
366                         <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
367                         <widget name="config" zPosition="2" position="60,120" size="610,370" scrollbarMode="showOnDemand" transparent="1" />
368
369                         <ePixmap position="100,500" size="100,40" zPosition="0" pixmap="~/plugin.png" alphatest="on" transparent="1" />
370                         <ePixmap position="220,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
371                         <ePixmap position="360,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
372                         <widget name="key_red" position="220,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
373                         <widget name="key_green" position="360,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
374                 </screen>"""
375
376         def __init__(self, session, plugin_path):
377                 Screen.__init__(self, session)
378                 self.skin_path = plugin_path
379                 self.session = session
380
381                 self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "MediaPlayerActions"],
382                 {
383                         "ok": self.keyOK,
384                         "back": self.keyCancel,
385                         "red": self.keyCancel,
386                         "green": self.keySave,
387                         "up": self.keyUp,
388                         "down": self.keyDown,
389                         "left": self.keyLeft,
390                         "right": self.keyRight,
391                 }, -1)
392                 
393                 self["key_red"] = Button(_("Close"))
394                 self["key_green"] = Button(_("Save"))
395                 self["title"] = Label()
396                 
397                 self.searchContextEntries = []
398                 self.ProxyEntry = None
399                 self.loadFeedEntry = None
400                 self.VideoDirname = None
401                 ConfigListScreen.__init__(self, self.searchContextEntries, session)
402                 self.createSetup()
403                 self.onLayoutFinish.append(self.layoutFinished)
404                 self.onShown.append(self.setWindowTitle)
405
406         def layoutFinished(self):
407                 self["title"].setText(_("MyTubePlayer settings"))
408
409         def setWindowTitle(self):
410                 self.setTitle(_("MyTubePlayer settings"))
411
412         def createSetup(self):
413                 self.searchContextEntries = []
414                 self.searchContextEntries.append(getConfigListEntry(_("Display search results by:"), config.plugins.mytube.search.orderBy))
415                 self.searchContextEntries.append(getConfigListEntry(_("Search restricted content:"), config.plugins.mytube.search.racy))
416                 self.searchContextEntries.append(getConfigListEntry(_("Search category:"), config.plugins.mytube.search.categories))
417                 self.searchContextEntries.append(getConfigListEntry(_("Search region:"), config.plugins.mytube.search.lr))
418                 self.loadFeedEntry = getConfigListEntry(_("Load feed on startup:"), config.plugins.mytube.general.loadFeedOnOpen)
419                 self.searchContextEntries.append(self.loadFeedEntry)
420                 if config.plugins.mytube.general.loadFeedOnOpen.value:
421                         self.searchContextEntries.append(getConfigListEntry(_("Start with following feed:"), config.plugins.mytube.general.startFeed))
422                 self.searchContextEntries.append(getConfigListEntry(_("Videoplayer stop/exit behavior:"), config.plugins.mytube.general.on_movie_stop))
423                 self.searchContextEntries.append(getConfigListEntry(_("Videobrowser exit behavior:"), config.plugins.mytube.general.on_exit))
424                 """self.ProxyEntry = getConfigListEntry(_("Use HTTP Proxy Server:"), config.plugins.mytube.general.useHTTPProxy)
425                 self.searchContextEntries.append(self.ProxyEntry)
426                 if config.plugins.mytube.general.useHTTPProxy.value:
427                         self.searchContextEntries.append(getConfigListEntry(_("HTTP Proxy Server IP:"), config.plugins.mytube.general.ProxyIP))
428                         self.searchContextEntries.append(getConfigListEntry(_("HTTP Proxy Server Port:"), config.plugins.mytube.general.ProxyPort))"""
429                 # disabled until i have time for some proper tests      
430                 self.VideoDirname = getConfigListEntry(_("Download location"), config.plugins.mytube.general.videodir)
431                 if config.usage.setup_level.index >= 2: # expert+
432                         self.searchContextEntries.append(self.VideoDirname)
433                 self.searchContextEntries.append(getConfigListEntry(_("Clear history on Exit:"), config.plugins.mytube.general.clearHistoryOnClose))
434
435                 self["config"].list = self.searchContextEntries
436                 self["config"].l.setList(self.searchContextEntries)
437                 if not self.selectionChanged in self["config"].onSelectionChanged:
438                         self["config"].onSelectionChanged.append(self.selectionChanged)
439
440         def selectionChanged(self):
441                 current = self["config"].getCurrent()
442                 #print current
443
444         def newConfig(self):
445                 print "newConfig", self["config"].getCurrent()
446                 if self["config"].getCurrent() == self.loadFeedEntry:
447                         self.createSetup()
448
449         def keyOK(self):
450                 cur = self["config"].getCurrent()
451                 if config.usage.setup_level.index >= 2 and cur == self.VideoDirname:
452                         self.session.openWithCallback(
453                                 self.pathSelected,
454                                 MovieLocationBox,
455                                 _("Choose target folder"),
456                                 config.plugins.mytube.general.videodir.value,
457                                 minFree = 100 # We require at least 100MB free space
458                         )
459                 else:
460                         self.keySave()
461
462         def pathSelected(self, res):
463                 if res is not None:
464                         if config.movielist.videodirs.value != config.plugins.mytube.general.videodir.choices:
465                                 config.plugins.mytube.general.videodir.setChoices(config.movielist.videodirs.value, default=res)
466                         config.plugins.mytube.general.videodir.value = res
467
468         def keyUp(self):
469                 self["config"].instance.moveSelection(self["config"].instance.moveUp)
470
471         def keyDown(self):
472                 self["config"].instance.moveSelection(self["config"].instance.moveDown)
473
474         def keyRight(self):
475                 ConfigListScreen.keyRight(self)
476                 self.newConfig()
477
478         def keyLeft(self):
479                 ConfigListScreen.keyLeft(self)
480                 self.newConfig()
481
482         def keyCancel(self):
483                 print "cancel"
484                 for x in self["config"].list:
485                         x[1].cancel()
486                 self.close()    
487
488         def keySave(self):
489                 print "saving"
490                 config.plugins.mytube.search.orderBy.save()
491                 config.plugins.mytube.search.racy.save()
492                 config.plugins.mytube.search.categories.save()
493                 config.plugins.mytube.search.lr.save()
494                 config.plugins.mytube.general.loadFeedOnOpen.save()
495                 config.plugins.mytube.general.startFeed.save()
496                 config.plugins.mytube.general.on_movie_stop.save()
497                 config.plugins.mytube.general.on_exit.save()
498                 config.plugins.mytube.general.videodir.save()
499                 config.plugins.mytube.general.clearHistoryOnClose.save()
500                 if config.plugins.mytube.general.clearHistoryOnClose.value:
501                         config.plugins.mytube.general.history.value = ""
502                         config.plugins.mytube.general.history.save()
503                 #config.plugins.mytube.general.useHTTPProxy.save()
504                 #config.plugins.mytube.general.ProxyIP.save()
505                 #config.plugins.mytube.general.ProxyPort.save()
506                 for x in self["config"].list:
507                         x[1].save()
508                 config.plugins.mytube.general.save()
509                 config.plugins.mytube.search.save()
510                 config.plugins.mytube.save()
511                 """if config.plugins.mytube.general.useHTTPProxy.value is True:
512                         proxy = {'http': 'http://'+str(config.plugins.mytube.general.ProxyIP.getText())+':'+str(config.plugins.mytube.general.ProxyPort.value)}
513                         self.myopener = MyOpener(proxies=proxy)
514                         urllib.urlopen = MyOpener(proxies=proxy).open
515                 else:
516                         self.myopener = MyOpener()
517                         urllib.urlopen = MyOpener().open"""
518                 self.close()
519
520
521 class MyTubeTasksScreen(Screen):
522         skin = """
523                 <screen name="MyTubeTasksScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
524                         <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
525                         <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
526                         <widget source="tasklist" render="Listbox" position="60,120" size="610,370" zPosition="7" scrollbarMode="showOnDemand" transparent="1" >
527                                 <convert type="TemplatedMultiContent">
528                                         {"template": [
529                                                         MultiContentEntryText(pos = (0, 1), size = (200, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the name
530                                                         MultiContentEntryText(pos = (210, 1), size = (150, 24), font=1, flags = RT_HALIGN_RIGHT, text = 2), # index 2 is the state
531                                                         MultiContentEntryProgress(pos = (370, 1), size = (100, 24), percent = -3), # index 3 should be progress 
532                                                         MultiContentEntryText(pos = (480, 1), size = (100, 24), font=1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 is the percentage
533                                                 ],
534                                         "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
535                                         "itemHeight": 25
536                                         }
537                                 </convert>
538                         </widget>
539                         <ePixmap position="100,500" size="100,40" zPosition="0" pixmap="~/plugin.png" alphatest="on" transparent="1" />
540                         <ePixmap position="220,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
541                         <widget name="key_red" position="220,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
542                 </screen>"""
543
544         def __init__(self, session, plugin_path, tasklist):
545                 Screen.__init__(self, session)
546                 self.skin_path = plugin_path
547                 self.session = session
548                 self.tasklist = tasklist
549                 self["tasklist"] = List(self.tasklist)
550                 
551                 self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "MediaPlayerActions"],
552                 {
553                         "ok": self.keyOK,
554                         "back": self.keyCancel,
555                         "red": self.keyCancel,
556                 }, -1)
557                 
558                 self["key_red"] = Button(_("Close"))
559                 self["title"] = Label()
560                 
561                 self.onLayoutFinish.append(self.layoutFinished)
562                 self.onShown.append(self.setWindowTitle)
563                 self.onClose.append(self.__onClose)
564                 self.Timer = eTimer()
565                 self.Timer.callback.append(self.TimerFire)
566                 
567         def __onClose(self):
568                 del self.Timer
569
570         def layoutFinished(self):
571                 self["title"].setText(_("MyTubePlayer active video downloads"))
572                 self.Timer.startLongTimer(2)
573                 #self.Timer.start(1000)
574
575         def TimerFire(self):
576                 self.Timer.stop()
577                 self.rebuildTaskList()
578         
579         def rebuildTaskList(self):
580                 self.tasklist = []
581                 for job in job_manager.getPendingJobs():
582                         self.tasklist.append((job,job.name,job.getStatustext(),int(100*job.progress/float(job.end)) ,str(100*job.progress/float(job.end)) + "%" ))
583                 self['tasklist'].setList(self.tasklist)
584                 self['tasklist'].updateList(self.tasklist)
585                 self.Timer.startLongTimer(2)
586
587         def setWindowTitle(self):
588                 self.setTitle(_("MyTubePlayer active video downloads"))
589
590         def keyOK(self):
591                 current = self["tasklist"].getCurrent()
592                 print current
593                 if current:
594                         job = current[0]
595                         from Screens.TaskView import JobView
596                         self.session.openWithCallback(self.JobViewCB, JobView, job)
597         
598         def JobViewCB(self, why):
599                 print "WHY---",why
600
601         def keyCancel(self):
602                 self.close()    
603
604         def keySave(self):
605                 self.close()
606
607
608 class MyTubeHistoryScreen(Screen):
609         skin = """
610                 <screen name="MyTubeHistoryScreen" position="60,93" zPosition="6" size="610,160" flags="wfNoBorder" >
611                         <ePixmap position="0,0" zPosition="-1" size="610,160" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MyTube/suggestions_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
612                         <widget source="historylist" render="Listbox" position="10,5" zPosition="7" size="580,150" scrollbarMode="showOnDemand" transparent="1" >
613                                 <convert type="TemplatedMultiContent">
614                                         {"template": [
615                                                         MultiContentEntryText(pos = (0, 1), size = (340, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
616                                                 ],
617                                         "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
618                                         "itemHeight": 25
619                                         }
620                                 </convert>
621                         </widget>
622                 </screen>"""
623
624         def __init__(self, session):
625                 Screen.__init__(self, session)
626                 self.session = session
627                 self.historylist = []
628                 print "self.historylist",self.historylist
629                 self["historylist"] = List(self.historylist)
630                 self.activeState = False
631                 
632         def activate(self):
633                 print "activate"
634                 self.activeState = True
635                 self.history = config.plugins.mytube.general.history.value.split(',')
636                 if self.history[0] == '':
637                         del self.history[0]
638                 print "self.history",self.history
639                 self.historylist = []
640                 for entry in self.history:
641                         self.historylist.append(( str(entry),))
642                 self["historylist"].setList(self.historylist)
643                 self["historylist"].updateList(self.historylist)
644
645         def deactivate(self):
646                 print "deactivate"
647                 self.activeState = False
648
649         def status(self):
650                 print self.activeState
651                 return self.activeState
652         
653         def getSelection(self):
654                 if self["historylist"].getCurrent() is None:
655                         return None
656                 print self["historylist"].getCurrent()[0]
657                 return self["historylist"].getCurrent()[0]
658
659         def up(self):
660                 print "up"
661                 self["historylist"].selectPrevious()
662                 return self.getSelection()
663
664         def down(self):
665                 print "down"
666                 self["historylist"].selectNext()
667                 return self.getSelection()
668         
669         def pageUp(self):
670                 print "up"
671                 self["historylist"].selectPrevious()
672                 return self.getSelection()
673
674         def pageDown(self):
675                 print "down"
676                 self["historylist"].selectNext()
677                 return self.getSelection()
678
679