ocarina/libsaria/path/lastfm.py
Bryan Schumaker 904b475363 libsaria: Began new cache functions
I think the new cache will be more generic, and should work for just
about anything.  We'll see.
2011-05-07 15:58:33 -04:00

102 lines
2.3 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
from libsaria import storage
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, title):
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, title):
storage.cache.get_item(artist, album, title, "Folder.jpg", lfm_cache_album)
cached = cache[artist]
file = cached.get("%s.jpg" % album, lfm_cache_album, artist, album, title)
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)
def get_artwork_id(id):
artist, album, title = sources.get_attrs("artist", "album", "title")
return get_artwork_tags(artist, album, title)
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)