/usr/share/pyshared/screenlets/plugins/LastFMProxy.py is in screenlets 0.1.2-8.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | #!/usr/bin/env python
# This application is released under the GNU General Public License
# v3 (or, at your option, any later version). You can find the full
# text of the license under http://www.gnu.org/licenses/gpl.txt.
# By using, editing and/or distributing this software you agree to
# the terms and conditions of this license.
# Thank you for using free software!
# LastFMProxy API by atie
import os
import string
import gobject
import mpdclient2
import urllib2
from GenericPlayer import GenericAPI
class LastFMProxyAPI(GenericAPI):
__name__ = 'LastFMProxy API'
__version__ = '0.0'
__author__ = 'atie'
__desc__ = 'LastFMProxy API to a Music Player'
playerAPI = None
__timeout = None
__interval = 3
callbackFn = False
__curplaying = None
def __init__(self, session_bus):
# Ignore the session_bus. Initialize a mpdclient connection
GenericAPI.__init__(self, session_bus)
# Check if the player is active : Returns Boolean
# A handle to the dbus interface is passed in : doesn't need to be used
def is_active(self, dbus_iface):
app = mpdclient2.connect()
if not app: return False
else:
proc = os.popen("""ps axo "%p,%a" | grep "last" | grep -v grep|cut -d',' -f1""").read()
procs = proc.split('\n')
if len(procs) > 1:
return True
else:
return False
# Make a connection to the Player
def connect(self):
self.playerAPI = mpdclient2.connect()
# Get LastFMProxy dump
def getdump(self):
try:
dump = urllib2.urlopen('http://localhost:1881/np').read()
except urllib2.HTTPError, e:
print "Cannot retrieve URL: HTTP Error Code", e.code
except urllib2.URLError, e:
print "Cannot retrieve URL: " + e.reason[1]
return dump
def getBetween(self, dump, first, last):
x = len(first)
begin = dump.find(first) +x
end = dump.find(last, begin)
return dump[begin:end]
# The following return Strings
# FIXME, maybe.
def get_title(self):
#return getattr(self.playerAPI.currentsong(), 'np_title = ', ';')
dump = self.getdump()
return self.getBetween(dump, 'np_title = \'', '\';')
# FIXME if necessary
def get_album(self):
dump = self.getdump()
return self.getBetween(dump, 'np_album = \'', '\';')
# FIXME if necessary
def get_artist(self):
dump = self.getdump()
return self.getBetween(dump, 'np_creator = \'', '\';')
# FIXME, if necessary, currently by the amazoncoverartsearch
def get_cover_path(self):
#return os.environ['HOME']+"/.covers/"+self.get_artist()+\
# " - "+self.get_album()+".jpg"
#return ""
# No need to search Amazon, one image file for now playing
#path = os.environ['HOME']+"/.covers/image_by_lfproxy.jpg"
path = os.environ['HOME']+"/.covers/"+self.get_artist()+\
" - "+self.get_album()+".jpg"
dump = self.getdump()
f = open(path, 'wb')
image = urllib2.urlopen(self.getBetween(dump, 'np_image = \'',
'\'')).read()
f.write(image)
f.close()
return path
# Returns Boolean
def is_playing(self):
if self.playerAPI.status().state in ['play']:
return True
else: return False
# The following do not return any values
def play_pause(self):
self.playerAPI.pause(1)
def next(self):
self.playerAPI.next()
def previous(self):
self.playerAPI.previous()
def register_change_callback(self, fn):
self.callback_fn = fn
# Could not find a callback signal for mpd, so just calling after some time interval
if self.__timeout:
gobject.source_remove(self.__timeout)
self.__timeout = gobject.timeout_add(self.__interval * 1000, self.info_changed)
#self.playerAPI.connect_to_signal("playingUriChanged", self.info_changed)
def info_changed(self, signal=None):
# Only call the callback function if Data has changed
if self.__curplaying != getattr(self.playerAPI.currentsong(),
'title', ''):
self.__curplaying = getattr(self.playerAPI.currentsong(), 'title', '')
self.callback_fn()
if self.__timeout:
gobject.source_remove(self.__timeout)
self.__timeout = gobject.timeout_add(self.__interval * 1000, self.info_changed)
|