#!/usr/bin/python

import os,time
import musicbrainz2.disc as md
import musicbrainz2.webservice as ws
import errno
from smurf import Cf

q1 = ws.Query()
q2 = ws.Query()

def do_incoming(arg, dirname, fnames):
	while fnames:
		f = fnames.pop()
		if os.path.islink(f):
			jobl(f)
			continue
		if not os.path.isdir:
			continue
		if not f.endswith("-"):
			continue
		job(f)

def jobl(n):
	f = os.readlink(n)
	if not os.path.isdir(f):
		print "dead link:",n
		return
	if " - " in n:
		artist,title = n.split(" - ")
	else:
		title = n
		artist = "Various"
	
def job(f):
	#d = md.Disk()
	#d.setId(f)
	dly=2.0
	if f.startswith("mb_"):
		id=f[3:]
	else:
		id=f
	while True:
		try:
			filter = ws.ReleaseFilter(discId=id)
			res = q1.getReleases(filter)
			break
		except ws.WebServiceError,e:
			print "Error:", e
			time.sleep(dly)
			dly = dly * 1.6
	if not res:
		print id,"-- not found :-("
		return
	if len(res) > 1:
		print id,"-- more than one!"
	res = res[0].release
	p = res.artist.name.replace("/","-")
	try: os.mkdir(p)
	except OSError: pass
	p = os.path.join(p,res.title.replace("/"," - "))
	try: os.mkdir(p)
	except OSError: pass
	print f,p,res.getId()

	while True:
		try:
			inc = ws.ReleaseIncludes(artist=True, tracks=True, releaseEvents=True)
			res = q2.getReleaseById(res.getId(), inc)
			break
		except ws.WebServiceError, e:
			print "Error:", e
			time.sleep(dly)
			dly = dly * 1.6


# Now display the returned data.
#
	isSingleArtist = res.isSingleArtistRelease()

	print "%s - %s" % (res.artist.name, res.title)
	try:
		os.rename(os.path.join(f,".id"),os.path.join(p,".id"))
	except OSError,e:
		pass

	i = 0
	for t in res.tracks:
		i+=1
		if isSingleArtist or t.artist is None:
			title = t.title
		else:
			title = t.artist.name + ' - ' +  t.title

		(minutes, seconds) = t.getDurationSplit()
		print "%2d %s (%d:%02d)" % (i, title, minutes, seconds)
		title = title.replace("/"," - ")
		of = os.path.join(f,"track%02d.cdda.ogg" % (i,))
		nf = os.path.join(p,"%02d %s.ogg" % (i,title))
		try:
			os.rename(of,nf)
		except OSError,e:
			if e.errno == errno.ENOENT:
				if os.path.exists(nf):
					continue
			raise
	idset(p,"mbid",id,True)
	try:
		os.remove(os.path.join(f,"track00.cdda.ogg"))
	except OSError:
		pass
	os.rmdir(f)

def idset(p,key,val, multi=False):
	id = os.path.join(p,".id")
	found = False
	try:
		idf = open(id,"r")
	except IOError,e:
		if e.errno != errno.ENOENT:
			raise
	else:
		for l in idf:
			l=l.rstrip()
			a,b=l.split(None,1)
			if a == key:
				if multi:
					if b == val:
						found = True
				else:
					if b != val:
						print "Data MISMATCH:",key,b,val
						return

		idf.close()
	if not found:
		idf = open(id,"a")
		print >>idf,key,val
		idf.close()


from sys import argv
if len(argv) > 1:
	for f in argv[1:]:
		if os.path.islink(f):
			jobl(f)
		else:
			job(f)
else:
	os.path.walk(".", doit, None)
