d0198cdd1a
I may change this to something that has to be requested by the front end, rather than always fetching it. We'll see.
101 lines
2.2 KiB
Python
101 lines
2.2 KiB
Python
# Bryan Schumaker (10/24/2010)
|
|
|
|
import libsaria
|
|
from libsaria import sources
|
|
from libsaria import web
|
|
from libsaria import xm
|
|
from libsaria import callbacks
|
|
from libsaria import threads
|
|
|
|
file_id = libsaria.path.file_id
|
|
cache = libsaria.cache
|
|
pref_attr = xm.find_preferred_attribute
|
|
|
|
pref_sizes = ["extralarge", "large", "medium", "small"]
|
|
|
|
APIROOT = "http://ws.audioscrobbler.com/2.0/"
|
|
APIKEY = "2c76f85a6704efd74b5a358821284ef9"
|
|
SECRET = "3a6012bfb627b60a884cf33fc044885c"
|
|
|
|
|
|
class LastFmRequest(dict):
|
|
def __init__(self, method):
|
|
self.method = method
|
|
|
|
def print_file(self, file):
|
|
for line in file:
|
|
print line.strip()
|
|
file.seek(0)
|
|
|
|
def place(self, printfile=False):
|
|
url = web.Url(APIROOT + "?method=" + self.method)
|
|
url["api_key"] = APIKEY
|
|
for param in self:
|
|
url[param] = self[param]
|
|
try:
|
|
file = url.open()
|
|
except:
|
|
return None
|
|
if file == None:
|
|
return None
|
|
if printfile==True:
|
|
self.print_file(file)
|
|
doc = xm.parse( file )
|
|
lfm = xm.child(doc)
|
|
if xm.attributes(lfm)["status"] == "ok":
|
|
return xm.child(lfm)
|
|
else:
|
|
return None
|
|
|
|
def lfm_cache_album(file, artist, album):
|
|
req = LastFmRequest("album.getInfo")
|
|
req["album"] = album
|
|
req["artist"] = artist
|
|
doc = req.place()
|
|
if doc == None:
|
|
return False
|
|
node = pref_attr(doc, "image", "size", pref_sizes)
|
|
node = xm.child(node)
|
|
if node == None:
|
|
return
|
|
try:
|
|
url = web.Url(node.data)
|
|
for line in url.open():
|
|
file.write(line)
|
|
return True
|
|
except:
|
|
pass
|
|
return False
|
|
|
|
def set_art_from_file(file, path):
|
|
try:
|
|
fin = open(path)
|
|
file.write(fin.read())
|
|
fin.close()
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
def get_artwork_tags(artist, album):
|
|
cached = cache[artist]
|
|
file = cached.get("%s.jpg" % album, lfm_cache_album, artist, album)
|
|
return file
|
|
|
|
def set_artwork_tags(artist, album, path):
|
|
cached = cache[artist]
|
|
cached.delete("%s.jpg" % album)
|
|
file = cached.get("%s.jpg" % album, set_art_from_file, path)
|
|
libsaria.event.start("POSTSETART", file)
|
|
|
|
def get_artwork_id(id):
|
|
artist, album = sources.get_attrs("artist", "album")
|
|
return get_artwork_tags(artist, album)
|
|
|
|
def get_artwork_bg(file):
|
|
id = sources.get_attrs("id")
|
|
file = get_artwork_id(id)
|
|
callbacks.get_art(file, id)
|
|
|
|
def get_artwork(file):
|
|
threads.background(get_artwork_bg, file)
|