#!/usr/bin/env python2.4

import os
import cgi

from PyLucene import QueryParser, IndexSearcher, StandardAnalyzer, FSDirectory

class MetaSearch(object):
	def asXML(self, hits, maxhits):
		'''
		Output result from metasearch as XML
		'''
		out = "\t<track-list>\n"
		for i in xrange(min(hits.length(), maxhits)):
			doc = hits.doc(i)
			out += "\t\t<track id=\"%s\" ext:score=\"%d\">\n" % (self.escape(doc.get("trackid")), (hits.score(i) * 100))
			out += "\t\t\t<title>%s</title>\n" % self.escape(doc.get("track"))
			out += "\t\t\t<duration>%s</duration>\n" % self.escape(doc.get("tracklength"))
			out += "\t\t\t<artist id=\"%s\">\n" % self.escape(doc.get("artistid"))
			out += "\t\t\t\t<name>%s</name>\n" % self.escape(doc.get("artist"))
			out += "\t\t\t\t<sort-name>%s</sort-name>\n" % self.escape(doc.get("artistsortname"))
			out += "\t\t\t</artist>\n"
			out += "\t\t\t<release-list>\n"
			out += "\t\t\t\t<release id=\"%s\">\n" % self.escape(doc.get("albumid"))
			out += "\t\t\t\t\t<title>%s</title>\n" % self.escape(doc.get("album"))
			out += "\t\t\t\t\t<track-list offset=\"%d\"/>\n" % (int(self.escape(doc.get("tracknum"))) - 1)
			out += "\t\t\t\t\t<artist id=\"%s\">\n" % self.escape(doc.get("albumartistid"))
			out += "\t\t\t\t\t\t<name>%s</name>\n" % self.escape(doc.get("albumartist"))
			out += "\t\t\t\t\t\t<sort-name>%s</sort-name>\n" % self.escape(doc.get("albumartistsortname"))
			out += "\t\t\t\t\t</artist>\n"
			out += "\t\t\t\t</release>\n"
			out += "\t\t\t</release-list>\n"
			out += "\t\t</track>\n"
		out += "\t</track-list>"
		return out

	def escape(self, text):
		'''
		Escape XML/HTML entities and convert output to utf-8
		'''
		return (text.replace(u'&', u'&amp;').replace(u'<', u'&lt;').replace(u'>', u'&gt;')).encode('utf-8', 'replace')


if __name__ == "__main__":
	maxhits = 50
	input = cgi.parse_qs(os.environ["QUERY_STRING"])
	if input.get("max", [""])[0].isdigit():
		limit = int(input.get("max", [25])[0])
	else:
	    	limit = 25
	if limit <= 0:
		limit = 1
	if limit > maxhits:
		limit = maxhits
	search = input.get("query", [""])[0]

	if search == "":
		print "Content-type: text/html\n"
		print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11-strict.dtd\">"
		print "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">"
		print "<head>"
		print "<title>Error</title>"
		print "</head>"
		print "<body>"
		print "<h4>Hi there, apparently you're new to this :)</h4>"
		print "<p>You'll have to specify the parameters, the valid ones are:</p>"
		print "<ul>"
		print "<li>max (results returned, 1 to 50)</li>"
		print "<li>query (your lucene formated query)</li>"
		print "</ul>"
		print "<p>Valid fields in the document:</p>"
		print "<ul>"
		print "<li>content (default field, contains what you need ;)</li>"
		print "<li>albumid</li>"
		print "<li>artistid</li>"
		print "<li>trackid</li>"
		print "<li>tracklengthsec</li>"
		print "<li>tracknum</li>"
		print "</ul>"
		print "<p>Brief example:</p>"
		print "<p><a href=\"http://mb.samfundet.no/?query=europe countdown\">http://mb.samfundet.no/?query=europe countdown</a></p>"
		print "</body>"
		print "</html>"
	else:
		directory = FSDirectory.getDirectory("index", False)
		searcher = IndexSearcher(directory)
		analyzer = StandardAnalyzer([])
		query = QueryParser("content", analyzer).parse(search)
		hits = searcher.search(query)

		ms = MetaSearch()
		print "Content-type: text/xml\n"
		print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		print "<metadata xmlns=\"http://musicbrainz.org/ns/mmd-1.0#\" xmlns:ext=\"http://musicbrainz.org/ns/ext-1.0#\">"

		print ms.asXML(hits, limit)

		print "</metadata>"
		searcher.close()
