# 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)

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)
