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
23 from urllib import FancyURLopener
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'
29 class ConfigTextWithGoogleSuggestions(ConfigText):
30 class SuggestionsThread(Thread):
31 def __init__(self, suggestionsService):
33 self.suggestionsService = suggestionsService
36 self.condition = Condition()
40 self.condition.acquire()
41 if self.value is None:
45 self.condition.release()
47 self.suggestionsService.getSuggestions(value)
51 self.condition.acquire()
52 self.condition.notify()
53 self.condition.release()
56 def getSuggestions(self, value):
57 self.condition.acquire()
59 self.condition.notify()
60 self.condition.release()
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
69 def propagateSuggestions(self, suggestionsList):
70 if self.suggestionsWindow:
71 self.suggestionsWindow.update(suggestionsList)
73 def getSuggestions(self):
74 if self.suggestionsThread is not None:
75 self.suggestionsThread.getSuggestions(self.value)
77 self.suggestions.getSuggestions(self.value)
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]:
85 def onSelect(self, session):
87 if self.suggestionsThread is not None:
88 self.suggestionsThread.stop()
89 self.suggestionsThread = ConfigTextWithGoogleSuggestions.SuggestionsThread(self.suggestions)
90 self.suggestionsThread.start()
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)
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
108 def suggestionListUp(self):
109 if self.suggestionsWindow.getlistlenght() > 0:
110 self.value = self.suggestionsWindow.up()
112 def suggestionListDown(self):
113 if self.suggestionsWindow.getlistlenght() > 0:
114 self.value = self.suggestionsWindow.down()
116 def suggestionListPageDown(self):
117 if self.suggestionsWindow.getlistlenght() > 0:
118 self.value = self.suggestionsWindow.pageDown()
120 def suggestionListPageUp(self):
121 if self.suggestionsWindow.getlistlenght() > 0:
122 self.value = self.suggestionsWindow.pageUp()
124 def activateSuggestionList(self):
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
134 def deactivateSuggestionList(self):
136 if self.suggestionsWindow is not None:
137 self.suggestionsWindow.deactivate()
138 self.getSuggestions()
139 self.allmarked = True
140 self.suggestionsListActivated = False
144 def cancelSuggestionList(self):
145 self.value = self.tmpValue
146 return self.deactivateSuggestionList()
148 def enableSuggestionSelection(self,value):
149 if self.suggestionsWindow is not None:
150 self.suggestionsWindow.enableSelection(value)
153 config.plugins.mytube = ConfigSubsection()
154 config.plugins.mytube.search = ConfigSubsection()
156 config.plugins.mytube.search.searchTerm = ConfigTextWithGoogleSuggestions("", False, threaded = True)
157 config.plugins.mytube.search.orderBy = ConfigSelection(
159 ("relevance", _("Relevance")),
160 ("viewCount", _("View Count")),
161 ("published", _("Published")),
162 ("rating", _("Rating"))
164 config.plugins.mytube.search.time = ConfigSelection(
166 ("all_time", _("All Time")),
167 ("this_month", _("This Month")),
168 ("this_week", _("This Week")),
169 ("today", _("Today"))
171 config.plugins.mytube.search.racy = ConfigSelection(
173 ("include", _("Yes")),
176 config.plugins.mytube.search.categories = ConfigSelection(
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"))
196 config.plugins.mytube.search.lr = ConfigSelection(
199 ("au", _("Australia")),
202 ("cz", _("Czech Republic")),
204 ("de", _("Germany")),
205 ("gb", _("Great Britain")),
206 ("au", _("Australia")),
207 ("nl", _("Holland")),
208 ("hk", _("Hong Kong")),
210 ("ie", _("Ireland")),
215 ("nz", _("New Zealand")),
218 ("kr", _("South Korea")),
222 ("us", _("United States"))
224 config.plugins.mytube.search.sortOrder = ConfigSelection(
226 ("ascending", _("Ascending")),
227 ("descending", _("Descending"))
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(
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"))
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")) ])
249 config.plugins.mytube.general.on_exit = ConfigSelection(default = "ask", choices = [
250 ("ask", _("Ask user")), ("quit", _("Return to movie list"))])
253 default = resolveFilename(SCOPE_HDD)
254 tmp = config.movielist.videodirs.value
255 if default not in tmp:
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)
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)
265 class MyTubeSuggestionsListScreen(Screen):
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">
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
275 "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
282 def __init__(self, session, configTextWithGoogleSuggestion):
283 Screen.__init__(self, session)
284 self.activeState = False
286 self.suggestlist = []
287 self["suggestionslist"] = List(self.list)
288 self.configTextWithSuggestion = configTextWithGoogleSuggestion
290 def update(self, suggestions):
291 if suggestions and len(suggestions[1]) > 0:
296 self.suggestlist = []
297 suggests = suggestions[1]
298 for suggestion in suggests:
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)
313 def getlistlenght(self):
314 return len(self.list)
318 if self.list and len(self.list) > 0:
319 self["suggestionslist"].selectPrevious()
320 return self.getSelection()
324 if self.list and len(self.list) > 0:
325 self["suggestionslist"].selectNext()
326 return self.getSelection()
330 if self.list and len(self.list) > 0:
331 self["suggestionslist"].selectPrevious()
332 return self.getSelection()
336 if self.list and len(self.list) > 0:
337 self["suggestionslist"].selectNext()
338 return self.getSelection()
342 self.activeState = True
343 return self.getSelection()
345 def deactivate(self):
347 self.activeState = False
348 return self.getSelection()
350 def getSelection(self):
351 if self["suggestionslist"].getCurrent() is None:
353 print self["suggestionslist"].getCurrent()[0]
354 return self["suggestionslist"].getCurrent()[0]
356 def enableSelection(self,value):
357 self["suggestionslist"].selectionEnabled(value)
360 class MyTubeSettingsScreen(Screen, ConfigListScreen):
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" />
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" />
374 def __init__(self, session, plugin_path):
375 Screen.__init__(self, session)
376 self.skin_path = plugin_path
377 self.session = session
379 self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "MediaPlayerActions"],
382 "back": self.keyCancel,
383 "red": self.keyCancel,
384 "green": self.keySave,
386 "down": self.keyDown,
387 "left": self.keyLeft,
388 "right": self.keyRight,
391 self["key_red"] = Button(_("Close"))
392 self["key_green"] = Button(_("Save"))
393 self["title"] = Label()
395 self.searchContextEntries = []
396 self.ProxyEntry = None
397 self.loadFeedEntry = None
398 self.VideoDirname = None
399 ConfigListScreen.__init__(self, self.searchContextEntries, session)
401 self.onLayoutFinish.append(self.layoutFinished)
402 self.onShown.append(self.setWindowTitle)
404 def layoutFinished(self):
405 self["title"].setText(_("MyTubePlayer settings"))
407 def setWindowTitle(self):
408 self.setTitle(_("MyTubePlayer settings"))
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))
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)
438 def selectionChanged(self):
439 current = self["config"].getCurrent()
442 print "newConfig", self["config"].getCurrent()
443 if self["config"].getCurrent() == self.loadFeedEntry:
447 cur = self["config"].getCurrent()
448 if config.usage.setup_level.index >= 2 and cur == self.VideoDirname:
449 self.session.openWithCallback(
452 _("Choose target folder"),
453 config.plugins.mytube.general.videodir.value,
454 minFree = 100 # We require at least 100MB free space
459 def pathSelected(self, res):
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
466 self["config"].instance.moveSelection(self["config"].instance.moveUp)
469 self["config"].instance.moveSelection(self["config"].instance.moveDown)
472 ConfigListScreen.keyRight(self)
476 ConfigListScreen.keyLeft(self)
481 for x in self["config"].list:
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:
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
513 self.myopener = MyOpener()
514 urllib.urlopen = MyOpener().open"""
518 class MyTubeTasksScreen(Screen):
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">
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
531 "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
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" />
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)
548 self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "MediaPlayerActions"],
551 "back": self.keyCancel,
552 "red": self.keyCancel,
555 self["key_red"] = Button(_("Close"))
556 self["title"] = Label()
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)
567 def layoutFinished(self):
568 self["title"].setText(_("MyTubePlayer active video downloads"))
569 self.Timer.startLongTimer(2)
573 self.rebuildTaskList()
575 def rebuildTaskList(self):
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)
583 def setWindowTitle(self):
584 self.setTitle(_("MyTubePlayer active video downloads"))
587 current = self["tasklist"].getCurrent()
591 from Screens.TaskView import JobView
592 self.session.openWithCallback(self.JobViewCB, JobView, job)
594 def JobViewCB(self, why):
604 class MyTubeHistoryScreen(Screen):
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">
611 MultiContentEntryText(pos = (0, 1), size = (340, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
613 "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
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
630 self.activeState = True
631 self.history = config.plugins.mytube.general.history.value.split(',')
632 if 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)
641 def deactivate(self):
643 self.activeState = False
646 print self.activeState
647 return self.activeState
649 def getSelection(self):
650 if self["historylist"].getCurrent() is None:
652 print self["historylist"].getCurrent()[0]
653 return self["historylist"].getCurrent()[0]
657 self["historylist"].selectPrevious()
658 return self.getSelection()
662 self["historylist"].selectNext()
663 return self.getSelection()
667 self["historylist"].selectPrevious()
668 return self.getSelection()
672 self["historylist"].selectNext()
673 return self.getSelection()