Screensaver added
authorRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sun, 8 Apr 2007 19:39:48 +0000 (19:39 +0000)
committerRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sun, 8 Apr 2007 19:39:48 +0000 (19:39 +0000)
fix Streamplayerevents

lastfm/CONTROL/control
lastfm/src/LastFM.py
lastfm/src/LastFMConfig.py
lastfm/src/StreamPlayer.py
lastfm/src/httpclient.py
lastfm/src/plugin.py

index 05286be..31bbdad 100755 (executable)
@@ -1,5 +1,5 @@
 Package: enigma2-plugin-extensions-lastfm
-Version: 0.3-20070408-r0
+Version: 0.4-20070408-r0
 Description: a client to use last.fm, the social music revolution 
 Architecture: mipsel
 Section: extra
index db0ad86..0ec21e6 100755 (executable)
@@ -7,6 +7,24 @@ import time
 import urllib\r
 import xml.dom.minidom\r
 \r
+\r
+\r
+class LastFMEventRegister:\r
+    def __init__(self):\r
+        self.onMetadataChangedList = []\r
+    \r
+    def addOnMetadataChanged(self,callback):\r
+        self.onMetadataChangedList.append(callback)\r
+\r
+    def removeOnMetadataChanged(self,callback):\r
+        self.onMetadataChangedList.remove(callback)\r
+    \r
+    def onMetadataChanged(self,metad):\r
+        for i in self.onMetadataChangedList:\r
+            i(metadata=metad)\r
+\r
+lastfm_event_register = LastFMEventRegister()\r
+            \r
 class LastFMHandler:\r
     def __init__(self):\r
         pass\r
@@ -143,6 +161,7 @@ class LastFM(LastFMHandler):
                 self.metadatatime = time.time()\r
                 self.metadataage = str(int(time.time() - self.metadatatime))\r
                 self.onMetadataLoaded(self.metadata)\r
+                lastfm_event_register.onMetadataChanged(self.metadata)\r
         else:\r
             self.onCommandFailed("Error while parsing Metadata")\r
 \r
@@ -165,7 +184,7 @@ class LastFM(LastFMHandler):
     def onTrackBanedCB(self,response):\r
         res = self._parselines(response)\r
         if res["response"] == "OK":\r
-            self.onTrackLoved("Track baned")\r
+            self.onTrackBanned("Track baned")\r
         else:\r
             self.onCommandFailed("Server returned FALSE")\r
 \r
index 7741594..c78df37 100755 (executable)
@@ -23,6 +23,13 @@ class LastFMConfigScreen(ConfigListScreen,Screen):
         self.list.append(getConfigListEntry(_("Timeout Statustext (Seconds)"), config.plugins.LastFM.timeoutstatustext))
         self.list.append(getConfigListEntry(_("Timeout to select a Tab (Seconds)"), config.plugins.LastFM.timeouttabselect))
         self.list.append(getConfigListEntry(_("Interval to refresh Metadata (Seconds)"), config.plugins.LastFM.metadatarefreshinterval))
+
+        self.list.append(getConfigListEntry(_("use Screensaver"), config.plugins.LastFM.sreensaver.use))
+        self.list.append(getConfigListEntry(_("wait before Screensaver"), config.plugins.LastFM.sreensaver.wait))
+        self.list.append(getConfigListEntry(_("show Coverart in Screensaver"), config.plugins.LastFM.sreensaver.showcoverart))
+        self.list.append(getConfigListEntry(_("do Coverartanimation in Screensaver"), config.plugins.LastFM.sreensaver.coverartanimation))
+        self.list.append(getConfigListEntry(_("Speed for Coverartanimation"), config.plugins.LastFM.sreensaver.coverartspeed))
+        self.list.append(getConfigListEntry(_("Interval for Coverartanimation"), config.plugins.LastFM.sreensaver.coverartinterval))
         
         ConfigListScreen.__init__(self, self.list)
         self["buttonred"] = Label(_("cancel"))
index a073e24..332ec09 100755 (executable)
@@ -31,7 +31,7 @@ class StreamPlayer:
 #                sref = eServiceReference(4097,0,stream )
 #                sref = eServiceReference("4097:0:0:0:0:0:0:0:0:0:%s"%stream.replace(":","&colon;"))
 #                self.session.nav.playService(sref)
-                self.targetfile = "/tmp/streamtarget.mp3"
+                self.targetfile = "/tmp/lastfm.mp3"
                 os.system("mknod %s p" %self.targetfile)
                 os.system("wget %s -O- > %s&" %(stream,self.targetfile))
                 self.session.nav.playService(eServiceReference("4097:0:0:0:0:0:0:0:0:0:%s"%self.targetfile))
index e6e2e33..47fc4e6 100755 (executable)
@@ -1,7 +1,6 @@
 from twisted.internet import reactor\r
 from twisted.internet.protocol import ClientFactory,connectionDone\r
 from twisted.web2.client.http import HTTPClientProtocol\r
-\r
 from twisted.internet import error \r
 \r
 import socket\r
index 699c633..d5bb906 100755 (executable)
@@ -6,7 +6,7 @@ from Screens.Screen import Screen
 from Screens.MessageBox import MessageBox\r
 from Screens.HelpMenu import HelpableScreen , HelpMenu              \r
 \r
-from Components.Pixmap import Pixmap\r
+from Components.Pixmap import Pixmap,MovingPixmap\r
 from Components.Label import Label\r
 from Components.MenuList import MenuList\r
 from Components.ActionMap import ActionMap, NumberActionMap\r
@@ -20,17 +20,20 @@ from Plugins.Plugin import PluginDescriptor
 \r
 from StreamPlayer import StreamPlayer\r
 from LastFMConfig import LastFMConfigScreen\r
-from LastFM import LastFM\r
+from LastFM import LastFM, lastfm_event_register\r
 import httpclient\r
 import os\r
 import urllib\r
+\r
+import random\r
+\r
 ###############################################################################        \r
 plugin_path = ""\r
 \r
 ###############################################################################        \r
 \r
 config.plugins.LastFM = ConfigSubsection()\r
-config.plugins.LastFM.showcoverart = ConfigYesNo(default = False)\r
+config.plugins.LastFM.showcoverart = ConfigYesNo(default = True)\r
 config.plugins.LastFM.username = ConfigText("user",fixed_size=False)\r
 config.plugins.LastFM.password = ConfigText("passwd",fixed_size=False)\r
 config.plugins.LastFM.timeoutstatustext = ConfigInteger(3,limits = (0, 10))\r
@@ -38,6 +41,14 @@ config.plugins.LastFM.timeouttabselect = ConfigInteger(2,limits = (0, 10))
 config.plugins.LastFM.metadatarefreshinterval = ConfigInteger(5,limits = (0, 100))\r
 config.plugins.LastFM.recommendedlevel = ConfigInteger(3,limits = (0, 100))\r
 \r
+config.plugins.LastFM.sreensaver = ConfigSubsection()\r
+config.plugins.LastFM.sreensaver.use = ConfigYesNo(default = True)\r
+config.plugins.LastFM.sreensaver.wait = ConfigInteger(30,limits = (0, 1000))\r
+config.plugins.LastFM.sreensaver.showcoverart = ConfigYesNo(default = True)\r
+config.plugins.LastFM.sreensaver.coverartanimation = ConfigYesNo(default = True)\r
+config.plugins.LastFM.sreensaver.coverartspeed = ConfigInteger(10,limits = (0, 100))\r
+config.plugins.LastFM.sreensaver.coverartinterval = ConfigInteger(10,limits = (0, 100))\r
+\r
 ###############################################################################        \r
 def main(session,**kwargs):\r
     session.open(LastFMScreenMain)    \r
@@ -84,8 +95,10 @@ class LastFMScreenMain(Screen,HelpableScreen,LastFM):
         LastFM.__init__(self)\r
         self.session = session\r
         self.streamplayer = StreamPlayer(session)\r
-        self.imageconverter = ImageConverter(self.setCoverArt)\r
+        self.streamplayer.onStateChanged.append(self.updateGUI)\r
+        self.imageconverter = ImageConverter(116,116,self.setCoverArt)\r
         Screen.__init__(self, session)\r
+        \r
         self.tabs=[("personal Stations",self.loadPersonalStations)\r
                    ,("Global Tags",self.loadGlobalTags)\r
                    ,("Top Tracks",self.loadTopTracks)\r
@@ -119,7 +132,7 @@ class LastFMScreenMain(Screen,HelpableScreen,LastFM):
         self["button_blue"] = Label(_("ban"))\r
         self["infolabel"] = Label("")\r
         \r
-        self["actions"] = ActionMap(["InfobarChannelSelection","WizardActions", "DirectionActions","MenuActions","ShortcutActions","GlobalActions","HelpActions"], \r
+        self["actions"] = ActionMap(["InfobarChannelSelection","WizardActions", "DirectionActions","MenuActions","ShortcutActions","GlobalActions","HelpActions","NumberActions"], \r
             {\r
              "ok": self.action_ok,\r
              "back": self.action_exit,\r
@@ -132,6 +145,7 @@ class LastFMScreenMain(Screen,HelpableScreen,LastFM):
              \r
              "menu": self.action_menu,\r
              }, -1)\r
+        \r
         self.helpList.append((self["actions"], "WizardActions", [("ok", _("switch to selected Station"))]))\r
         self.helpList.append((self["actions"], "WizardActions", [("back", _("quit Last.FM"))]))\r
 \r
@@ -158,6 +172,10 @@ class LastFMScreenMain(Screen,HelpableScreen,LastFM):
         self.infolabelcleartimer = eTimer()\r
         self.infolabelcleartimer.timeout.get().append(self.clearInfoLabel)\r
 \r
+        self.screensavertimer = eTimer()\r
+        self.screensavertimer.timeout.get().append(self.startScreensaver)\r
+        self.onShown.append(self.startScreensaverTimer)\r
+\r
     def initLastFM(self):\r
         self.setInfoLabel("loggin into last.fm")\r
         self.connect(config.plugins.LastFM.username.value,config.plugins.LastFM.password.value)\r
@@ -227,18 +245,33 @@ class LastFMScreenMain(Screen,HelpableScreen,LastFM):
     def tabchangedtimerFired(self):\r
         self.tablist.getCurrent()[1][1]()\r
         self.tabchangetimer.stop()\r
+\r
+    def startScreensaverTimer(self):\r
+        if config.plugins.LastFM.sreensaver.use.value:\r
+            self.screensavertimer.start(config.plugins.LastFM.sreensaver.wait.value*1000)\r
+\r
+    def resetScreensaverTimer(self):\r
+        self.screensavertimer.stop()\r
+        self.screensavertimer.start(config.plugins.LastFM.sreensaver.wait.value*1000)\r
         \r
+    def startScreensaver(self):\r
+        self.screensavertimer.stop()\r
+        self.session.openWithCallback(self.updateGUI, LastFMSaveScreen,self.metadata)\r
+           \r
     def action_nextTab(self):\r
         self.tablist.down()\r
-            \r
+        self.resetScreensaverTimer()\r
+        \r
     def action_prevTab(self):\r
         self.tablist.up()\r
+        self.resetScreensaverTimer()\r
 \r
     def action_menu(self):\r
         self.session.open(LastFMConfigScreen)\r
+        self.resetScreensaverTimer()\r
 \r
     def action_exit(self):\r
-        print "action_exit"\r
+        self.screensavertimer.stop()\r
         self.guiupdatetimer.stop()\r
         self.streamplayer.stop()\r
         self.close()\r
@@ -246,8 +279,10 @@ class LastFMScreenMain(Screen,HelpableScreen,LastFM):
     def action_ok(self):\r
         selectedTag = self["streamlist"].l.getCurrentSelection()[1]\r
         self.changeStation(selectedTag)\r
-        \r
+        self.resetScreensaverTimer()\r
+\r
     def action_startstop(self):\r
+        self.resetScreensaverTimer()\r
         if self.streamplayer.is_playing:\r
             self.streamplayer.stop()\r
             self.metadata = {}\r
@@ -269,7 +304,7 @@ class LastFMScreenMain(Screen,HelpableScreen,LastFM):
         self["infolabel"].setText("")\r
         \r
     def updateGUI(self):\r
-        if self.streamplayer.is_playing is not True:\r
+        if self.streamplayer.is_playing is not True or self.shown is not True:\r
             return None\r
         print "updateGUI"\r
         if self.streamplayer.is_playing:\r
@@ -312,7 +347,7 @@ class LastFMScreenMain(Screen,HelpableScreen,LastFM):
             self["info_artist"].setText("N/A")\r
             self["info_album"].setText("N/A")\r
             self["info_track"].setText("N/A")\r
-            \r
+        \r
     def setCoverArt(self,pixmap=None):\r
         if pixmap is None:\r
             self["info_cover"].instance.setPixmapFromFile(self.noCoverArtPNG)            \r
@@ -353,7 +388,6 @@ class LastFMScreenMain(Screen,HelpableScreen,LastFM):
             x["stationurl"] = self.getArtistGroup()\r
             tags.append(x)\r
         \r
-\r
         self.buildMenuList(tags)\r
         \r
     def loadGlobalTags(self):\r
@@ -390,27 +424,99 @@ class LastFMScreenMain(Screen,HelpableScreen,LastFM):
             menuliste.append((i['_display'],i['stationurl']))\r
         self["streamlist"].l.setList(menuliste) \r
 \r
+class LastFMSaveScreen(Screen):\r
+    skin = """<screen position="0,0" size="720,576" flags="wfNoBorder" title="LastFMSaveScreen" >\r
+                <widget name="cover" position="50,50" size="200,200" />          \r
+              </screen>"""\r
+    noCoverArtPNG = "/usr/share/enigma2/no_coverArt.png"\r
+    coverartsize= [200,200]\r
+    def __init__(self,session,initialMetadata):\r
+        self.skin = """<screen position="0,0" size="720,576" flags="wfNoBorder" title="LastFMSaveScreen" >\r
+                <widget name="cover" position="50,50" size="%i,%i" />          \r
+              </screen>"""%(self.coverartsize[0],self.coverartsize[1])\r
+    \r
+        Screen.__init__(self,session)\r
+        self.imageconverter = ImageConverter(self.coverartsize[0],self.coverartsize[1],self.setCoverArt)\r
+        self.session = session\r
+        self.initialMetadata = initialMetadata\r
+        self["cover"] = MovingPixmap()\r
+        self["actions"] = ActionMap(["InfobarChannelSelection","WizardActions", "DirectionActions","MenuActions","ShortcutActions","GlobalActions","HelpActions"], \r
+            {\r
+             "ok": self.action_exit,\r
+             "back": self.action_exit,\r
+             }, -1)\r
+        \r
+        self.onLayoutFinish.append(self.update)\r
+        self.onLayoutFinish.append(self.registerToMetadataUpdates)\r
+        \r
+        if config.plugins.LastFM.sreensaver.coverartanimation.value:\r
+            self.startmovingtimer = eTimer()\r
+            self.startmovingtimer.timeout.get().append(self.movePixmap)\r
+            self.startmovingtimer.start(config.plugins.LastFM.sreensaver.coverartinterval.value*1000)\r
+        \r
+    def action_ok(self):\r
+        pass\r
+    \r
+    def action_exit(self):\r
+        lastfm_event_register.removeOnMetadataChanged(self.update)\r
+        self.close()\r
+        \r
+    def setCoverArt(self,pixmap=None):\r
+        if pixmap is None:\r
+            self["cover"].instance.setPixmapFromFile(self.noCoverArtPNG)            \r
+        else:\r
+            self["cover"].instance.setPixmap(pixmap.__deref__())\r
+            \r
+    def registerToMetadataUpdates(self):\r
+        lastfm_event_register.addOnMetadataChanged(self.update)#added here, to make shure that is called after onLayoutFinished\r
+        \r
+    \r
+    def update(self,metadata=None):\r
+        \r
+        if metadata is None:\r
+            metadata = self.initialMetadata\r
+            \r
+        if config.plugins.LastFM.sreensaver.showcoverart.value is not True:\r
+            pass#do nothing\r
+        elif metadata.has_key("albumcover_large") and config.plugins.LastFM.showcoverart.value:\r
+            self.imageconverter.convert(metadata["albumcover_large"])\r
+        elif metadata.has_key("albumcover_medium") and config.plugins.LastFM.showcoverart.value:\r
+            self.imageconverter.convert(metadata["albumcover_medium"])\r
+        elif metadata.has_key("albumcover_small") and config.plugins.LastFM.showcoverart.value:\r
+            self.imageconverter.convert(metadata["albumcover_small"],self.setCoverArt)\r
+        else:\r
+            self.setCoverArt()\r
+\r
+    def movePixmap(self):\r
+        self.startmovingtimer.stop() \r
+        newX = random.randrange(720-self.coverartsize[0]-1)\r
+        newY = random.randrange(576-self.coverartsize[1]-1)\r
+        self["cover"].moveTo(newX, newY, time = config.plugins.LastFM.sreensaver.coverartspeed.value)\r
+        self["cover"].startMoving()\r
+        self.startmovingtimer.start(config.plugins.LastFM.sreensaver.coverartinterval.value*1000)\r
 \r
 class ImageConverter:\r
     \r
-    targetfile= "/tmp/coverart"\r
-    lastURL =""\r
+    lastURL = ""\r
 \r
-    def __init__(self,callBack):\r
+    def __init__(self,width,height,callBack):\r
         self.callBack = callBack\r
-\r
+        self.width = width\r
+        self.height = height\r
+        self.targetfile= "/tmp/coverart"+str(random.randrange(5000))\r
+    \r
+        \r
     def convert(self,sourceURL):\r
         if self.lastURL != sourceURL:\r
             extension = sourceURL.split(".")[-1]\r
             self.tmpfile = self.targetfile+"."+extension\r
             host = sourceURL.split("/")[2]\r
             path = "/"+"/".join(sourceURL.split("/")[3:])\r
-            print host,path\r
             httpclient.getFile(self.tmpfile,host,80,path,callback=self.onImageLoaded)\r
             self.lastURL = sourceURL\r
 \r
     def onImageLoaded(self):\r
-            self.currPic = loadPic(self.tmpfile, 116, 116, 0,0, 0,1)\r
+            self.currPic = loadPic(self.tmpfile, self.width, self.height, 0,1, 0,1)\r
             os.remove(self.tmpfile)\r
             self.callBack(pixmap=self.currPic)\r
             
\ No newline at end of file