5 from Components.ActionMap import ActionMap
6 from Components.AVSwitch import AVSwitch
7 from Components.config import config, ConfigInteger, ConfigSelection, ConfigSubsection, ConfigYesNo, getConfigListEntry
\r
8 from Components.ConfigList import ConfigListScreen
9 from Components.Console import Console
10 from Components.Label import Label
11 from Components.Language import language
12 from Components.MenuList import MenuList
13 from Components.MovieList import MovieList
14 from Components.Pixmap import Pixmap
15 from Components.ServiceEventTracker import InfoBarBase
16 from Components.VideoWindow import VideoWindow
17 from enigma import ePicLoad, ePoint, eServiceReference, eSize, eTimer, getDesktop
18 from os import environ, listdir
19 from Plugins.Plugin import PluginDescriptor
20 from Screens.InfoBarGenerics import InfoBarSeek, InfoBarCueSheetSupport
21 from Screens.MessageBox import MessageBox
22 from Screens.MovieSelection import MovieSelection
23 from Screens.Screen import Screen
24 from Tools.Directories import fileExists, resolveFilename, SCOPE_LANGUAGE, SCOPE_PLUGINS
25 import gettext, random
27 ##############################################################################
29 config.plugins.MovielistPreview = ConfigSubsection()
30 config.plugins.MovielistPreview.enabled = ConfigYesNo(default=True)
31 config.plugins.MovielistPreview.position_x = ConfigInteger(default=100)
32 config.plugins.MovielistPreview.position_y = ConfigInteger(default=100)
33 config.plugins.MovielistPreview.size = ConfigSelection(choices=["250x200", "200x160", "150x120", "100x80"], default="250x200")
35 ##############################################################################
38 lang = language.getLanguage()
39 environ["LANGUAGE"] = lang[:2]
40 gettext.bindtextdomain("enigma2", resolveFilename(SCOPE_LANGUAGE))
41 gettext.textdomain("enigma2")
42 gettext.bindtextdomain("MovielistPreview", "%s%s" % (resolveFilename(SCOPE_PLUGINS), "Extensions/MovielistPreview/locale/"))
45 t = gettext.dgettext("MovielistPreview", txt)
47 t = gettext.gettext(txt)
51 language.addCallback(localeInit)
53 ##############################################################################
56 <screen position="0,0" size="250,200" zPosition="10" flags="wfNoBorder" backgroundColor="#FF000000" >
57 <widget name="background" position="0,0" size="250,200" zPosition="1" backgroundColor="#00000000" />
58 <widget name="preview" position="0,0" size="250,200" zPosition="2" />
61 ##############################################################################
63 class MovielistPreviewScreen(Screen):
64 def __init__(self, session):
65 Screen.__init__(self, session)
67 self["background"] = Label("")
68 self["preview"] = Pixmap()
69 self.onShow.append(self.movePosition)
71 def movePosition(self):
73 self.instance.move(ePoint(config.plugins.MovielistPreview.position_x.value, config.plugins.MovielistPreview.position_y.value))
74 size = config.plugins.MovielistPreview.size.value.split("x")
75 self.instance.resize(eSize(int(size[0]), int(size[1])))
76 self["background"].instance.resize(eSize(int(size[0]), int(size[1])))
77 self["preview"].instance.resize(eSize(int(size[0]), int(size[1])))
79 ##############################################################################
81 class MovielistPreview():
87 def gotSession(self, session):
89 self.dialog = session.instantiateDialog(MovielistPreviewScreen)
91 def changeVisibility(self):
92 if config.plugins.MovielistPreview.enabled.value:
93 config.plugins.MovielistPreview.enabled.value = False
95 config.plugins.MovielistPreview.enabled.value = True
96 config.plugins.MovielistPreview.enabled.save()
98 def showPreview(self, movie):
99 if self.working == False:
101 if movie and self.mayShow and config.plugins.MovielistPreview.enabled.value:
102 png = movie + "_mp.jpg"
105 sc = AVSwitch().getFramebufferScale()
106 self.picload = ePicLoad()
107 self.picload.PictureData.get().append(self.showPreviewCallback)
108 size = config.plugins.MovielistPreview.size.value.split("x")
109 self.picload.setPara((int(size[0]), int(size[1]), sc[0], sc[1], False, 1, "#00000000"))
110 self.picload.startDecode(png)
112 def showPreviewCallback(self, picInfo=None):
114 ptr = self.picload.getData()
116 self.dialog["preview"].instance.setPixmap(ptr)
120 def hideDialog(self):
124 def showDialog(self):
127 movielistpreview = MovielistPreview()
129 ##############################################################################
131 class MovielistPreviewPositionerCoordinateEdit(ConfigListScreen, Screen):
\r
133 <screen position="center,center" size="560,110" title="%s">
\r
134 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />
\r
135 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />
\r
136 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />
\r
137 <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />
\r
138 <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
\r
139 <widget name="config" position="0,45" size="560,60" scrollbarMode="showOnDemand" />
\r
140 </screen>""" % _("Movielist Preview")
142 def __init__(self, session, x, y, w, h):
\r
143 Screen.__init__(self, session)
145 self["key_green"] = Label(_("OK"))
147 self.xEntry = ConfigInteger(default=x, limits=(0, w))
148 self.yEntry = ConfigInteger(default=y, limits=(0, h))
\r
149 ConfigListScreen.__init__(self, [
150 getConfigListEntry("x position:", self.xEntry),
151 getConfigListEntry("y position:", self.yEntry)])
153 self["actions"] = ActionMap(["OkCancelActions", "ColorActions"],
160 self.close([self.xEntry.value, self.yEntry.value])
162 ##############################################################################
164 class MovielistPreviewPositioner(Screen):
165 def __init__(self, session):
166 Screen.__init__(self, session)
168 self["background"] = Label("")
169 self["preview"] = Pixmap()
171 self["actions"] = ActionMap(["EPGSelectActions", "MenuActions", "WizardActions"],
179 "menu": self.editCoordinates,
180 "nextBouquet": self.bigger,
181 "prevBouquet": self.smaller
184 desktop = getDesktop(0)
185 self.desktopWidth = desktop.size().width()
186 self.desktopHeight = desktop.size().height()
188 self.moveTimer = eTimer()
189 self.moveTimer.callback.append(self.movePosition)
190 self.moveTimer.start(50, 1)
192 self.onShow.append(self.__onShow)
196 size = config.plugins.MovielistPreview.size.value.split("x")
197 self.instance.resize(eSize(int(size[0]), int(size[1])))
198 self["background"].instance.resize(eSize(int(size[0]), int(size[1])))
199 self["preview"].instance.resize(eSize(int(size[0]), int(size[1])))
201 def movePosition(self):
202 self.instance.move(ePoint(config.plugins.MovielistPreview.position_x.value, config.plugins.MovielistPreview.position_y.value))
203 self.moveTimer.start(50, 1)
206 value = config.plugins.MovielistPreview.position_x.value
210 config.plugins.MovielistPreview.position_x.value = value
213 value = config.plugins.MovielistPreview.position_y.value
217 config.plugins.MovielistPreview.position_y.value = value
220 value = config.plugins.MovielistPreview.position_x.value
222 if value > self.desktopWidth:
223 value = self.desktopWidth
224 config.plugins.MovielistPreview.position_x.value = value
227 value = config.plugins.MovielistPreview.position_y.value
229 if value > self.desktopHeight:
230 value = self.desktopHeight
231 config.plugins.MovielistPreview.position_y.value = value
234 config.plugins.MovielistPreview.position_x.save()
235 config.plugins.MovielistPreview.position_y.save()
239 config.plugins.MovielistPreview.position_x.cancel()
240 config.plugins.MovielistPreview.position_y.cancel()
243 def editCoordinates(self):
244 self.session.openWithCallback(self.editCoordinatesCallback, MovielistPreviewPositionerCoordinateEdit, config.plugins.MovielistPreview.position_x.value, config.plugins.MovielistPreview.position_y.value, self.desktopWidth, self.desktopHeight)
246 def editCoordinatesCallback(self, callback=None):
248 config.plugins.MovielistPreview.position_x.value = callback[0]
249 config.plugins.MovielistPreview.position_y.value = callback[1]
252 if config.plugins.MovielistPreview.size.value == "200x160":
253 config.plugins.MovielistPreview.size.value = "250x200"
254 elif config.plugins.MovielistPreview.size.value == "150x120":
255 config.plugins.MovielistPreview.size.value = "200x160"
256 elif config.plugins.MovielistPreview.size.value == "100x80":
257 config.plugins.MovielistPreview.size.value = "150x120"
258 config.plugins.MovielistPreview.size.save()
262 if config.plugins.MovielistPreview.size.value == "150x120":
263 config.plugins.MovielistPreview.size.value = "100x80"
264 elif config.plugins.MovielistPreview.size.value == "200x160":
265 config.plugins.MovielistPreview.size.value = "150x120"
266 elif config.plugins.MovielistPreview.size.value == "250x200":
267 config.plugins.MovielistPreview.size.value = "200x160"
268 config.plugins.MovielistPreview.size.save()
271 ##############################################################################
273 class PreviewCreator:
276 self.Console = Console()
278 def grab(self, file):
280 self.Console = Console()
281 self.Console.ePopen('/usr/bin/grab -v -r 250 -l -j 100 "%s"'%file, self.grabDone)
283 def grabDone(self, result, retval, extra_args):
288 previewcreator = PreviewCreator()
290 ##############################################################################
292 class MovielistPreviewManualCreator(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport):
294 <screen position="center,center" size="560,380" title="%s">
295 <widget name="video" position="100,20" size="360,288" backgroundColor="transparent" />
296 <widget source="session.CurrentService" render="PositionGauge" position="145,330" size="270,10" pointer="skin_default/position_pointer.png:540,0" transparent="1" foregroundColor="#20224f">
297 <convert type="ServicePosition">Gauge</convert>
299 <widget name="seekState" position="40,320" size="60,25" halign="right" font="Regular;18" valign="center" />
300 <ePixmap pixmap="skin_default/icons/mp_buttons.png" position="225,350" size="109,13" alphatest="on" />
301 </screen>""" % _("Movielist Preview")
303 def __init__(self, session, service):
304 Screen.__init__(self, session)
305 InfoBarSeek.__init__(self)
306 InfoBarCueSheetSupport.__init__(self)
307 InfoBarBase.__init__(self, steal_current_service=True)
309 self.session = session
310 self.service = service
312 self.oldService = self.session.nav.getCurrentlyPlayingServiceReference()
313 self.session.nav.playService(service)
314 previewcreator.callback = self.grabDone
316 desktopSize = getDesktop(0).size()
317 self["video"] = VideoWindow(decoder=0, fb_width=desktopSize.width(), fb_height=desktopSize.height())
318 self["seekState"] = Label()
320 self.onPlayStateChanged.append(self.updateStateLabel)
321 self.updateStateLabel(self.seekstate)
323 self["actions"] = ActionMap(["OkCancelActions"],
329 def checkSkipShowHideLock(self):
332 def updateStateLabel(self, state):
333 self["seekState"].setText(state[3].strip())
338 png = self.service.getPath() + "_mp.jpg"
339 previewcreator.grab(png)
343 self.session.open(MessageBox,_("Preview created."), MessageBox.TYPE_INFO, timeout=5)
347 self.session.nav.playService(self.oldService)
350 ##############################################################################
352 class MovielistPreviewAutoCreator(Screen):
354 <screen position="center,center" size="420,105" title="%s">
355 <widget name="label" position="10,10" size="400,85" transparent="1" font="Regular;20" halign="center" valign="center" />
356 </screen>""" % _("Movielist Preview")
358 def __init__(self, session):
359 Screen.__init__(self, session)
361 self.session = session
367 self.dir = config.movielist.last_videodir.value
368 previewcreator.callback = self.grabDone
369 self.playable = ["avi", "dat", "divx", "m2ts", "m4a", "mkv", "mp4", "mov", "mpg", "ts", "vob"]
370 self.oldService = self.session.nav.getCurrentlyPlayingServiceReference()
372 self["label"] = Label()
374 self.timer = eTimer()
375 self.timer.callback.append(self.seekAndCreatePreview)
377 self["actions"] = ActionMap(["OkCancelActions"], {"cancel": self.exit}, -1)
379 self.onLayoutFinish.append(self.createPreviews)
382 if self.working == False:
383 self.session.nav.playService(self.oldService)
388 def getExtension(self, name):
390 if name.__contains__("."):
391 tmp = name.split(".")
395 def createPreviews(self):
397 files = listdir(self.dir)
401 ext = self.getExtension(file)
402 if ext and (ext.lower() in self.playable):
403 self.files.append(file)
404 self.filescount = len(self.files)
405 if self.filescount == 0:
406 self["label"].setText(_("Could not find any movie!"))
408 self.createNextPreview()
410 def createNextPreview(self):
413 movie = ("%s/%s" % (self.dir, file)).replace("//", "/")
414 png = movie + "_mp.jpg"
418 counter = "%d / %d" % (self.current, self.filescount)
419 self["label"].setText(_("%s - creating preview for movie %s") % (counter, movie))
420 if movie.endswith(".ts"):
421 ref = eServiceReference(1, 0, movie)
423 ref = eServiceReference(4097, 0, movie)
424 self.session.nav.playService(ref)
426 self.timer.start(5000, 1)
428 self["label"].setText(_("Everything done ;)"))
431 def seekAndCreatePreview(self):
432 service = self.session.nav.getCurrentService()
434 cue = service and service.cueSheet()
436 cue.setCutListEnable(0)
437 seek = service.seek()
439 length = int(seek.getLength()[1])
440 seek.seekTo(random.randint(0, length))
441 previewcreator.grab(self.png)
449 self["label"].setText(_("Autocreate of previews aborted due user!"))
452 self.createNextPreview()
454 ##############################################################################
456 class MovielistPreviewMenu(Screen):
458 <screen position="center,center" size="420,105" title="%s">
459 <widget name="list" position="5,5" size="410,100" />
460 </screen>""" % _("Movielist Preview")
462 def __init__(self, session, service):
463 Screen.__init__(self, session)
464 self.session = session
465 self.service = service
466 self["list"] = MenuList([])
467 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.okClicked, "cancel": self.close}, -1)
468 self.onLayoutFinish.append(self.showMenu)
472 if config.plugins.MovielistPreview.enabled.value:
473 list.append(_("Deactivate Movielist Preview"))
475 list.append(_("Activate Movielist Preview"))
476 list.append(_("Create preview"))
477 list.append(_("Autocreate of missing previews"))
478 list.append(_("Change Movielist Preview position"))
479 self["list"].setList(list)
482 idx = self["list"].getSelectionIndex()
483 if movielistpreview.dialog is None:
484 movielistpreview.gotSession(self.session)
486 movielistpreview.changeVisibility()
489 movielistpreview.dialog.hide()
490 self.session.open(MovielistPreviewManualCreator, self.service)
492 movielistpreview.dialog.hide()
493 self.session.open(MovielistPreviewAutoCreator)
495 movielistpreview.dialog.hide()
496 self.session.open(MovielistPreviewPositioner)
498 ##############################################################################
502 self.movieListInstance = None
503 self.movieList2Instance = None
504 instancecache = InstanceCache()
506 ##############################################################################
508 SelectionChanged = MovieList.selectionChanged
509 def selectionChanged(instance):
510 if not instancecache.movieListInstance:
511 instancecache.movieListInstance = instance
512 SelectionChanged(instance)
513 curr = instance.getCurrent()
515 if isinstance(curr, eServiceReference):
516 movielistpreview.showPreview(curr.getPath())
517 MovieList.selectionChanged = selectionChanged
519 Hide = MovieSelection.hide
520 def hideMovieSelection(instance):
522 movielistpreview.hideDialog()
523 MovieSelection.hide = hideMovieSelection
525 Show = MovieSelection.show
526 def showMovieSelection(instance):
528 movielistpreview.showDialog()
529 if instancecache.movieListInstance:
530 selectionChanged(instancecache.movieListInstance)
531 MovieSelection.show = showMovieSelection
533 ##############################################################################
535 def selectionChanged2(instance):
536 if not instancecache.movieList2Instance:
537 instancecache.movieList2Instance = instance
538 SelectionChanged2(instance)
539 curr = instance.getCurrent()
541 if isinstance(curr, eServiceReference):
542 movielistpreview.showPreview(curr.getPath())
544 def hideMovieSelection2(instance):
546 movielistpreview.hideDialog()
548 def showMovieSelection2(instance):
550 movielistpreview.showDialog()
551 if instancecache.movieList2Instance:
552 selectionChanged2(instancecache.movieList2Instance)
555 from Plugins.Extensions.Suomipoeka.MovieList import MovieList as MovieList2
556 from Plugins.Extensions.Suomipoeka.MovieSelection import MovieSelectionSP
557 SelectionChanged2 = MovieList2.selectionChanged
558 MovieList2.selectionChanged = selectionChanged2
559 Hide2 = MovieSelectionSP.hide
560 MovieSelectionSP.hide = hideMovieSelection2
561 Show2 = MovieSelectionSP.show
562 MovieSelectionSP.show = showMovieSelection2
564 print "[Movielist Preview] Could not import Suomipoeka Plugin, maybe not installed or too old version?"
566 ##############################################################################
568 def sessionstart(reason, **kwargs):
570 movielistpreview.gotSession(kwargs["session"])
572 def main(session, service):
573 session.open(MovielistPreviewMenu, service)
575 ##############################################################################
577 def Plugins(**kwargs):
579 PluginDescriptor(where=[PluginDescriptor.WHERE_SESSIONSTART], fnc=sessionstart),
580 PluginDescriptor(name=_("Movielist Preview"), description=_("Movielist Preview"), where=PluginDescriptor.WHERE_MOVIELIST, fnc=main)]