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