Mercurial > hg > audiodb
changeset 733:4c89dccdd4a9
Initial commit of adbserver: combines metadata, adb search, playback
author | mas01mj |
---|---|
date | Wed, 15 Sep 2010 11:05:12 +0000 |
parents | 3a0b9700b3d2 |
children | 35bfc91b67d3 |
files | bindings/python/examples/adbserver.py |
diffstat | 1 files changed, 114 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bindings/python/examples/adbserver.py Wed Sep 15 11:05:12 2010 +0000 @@ -0,0 +1,114 @@ +#!/usr/bin/python + +import sqlite3 +import csv +import sys +import urllib +import web +from pyadb import * +import simplejson as json +import tempfile +import subprocess + +# For now + +featureFile = "AWAL2010.adb" +trackFile = "awal_id32.csv" +audioDir = "/home/mjewell/Music/mp3s/" + +urls = ( + '/track/(.*)', 'trackSearch', + '/audio/(.*)', 'audioPlay', + '/search/(.*)', 'segmentSearch', + '/crossdomain.xml', 'crossDomain' +) + +app = web.application(urls, globals()) +db = Pyadb(path = featureFile, mode = "r") +dbfile = tempfile.NamedTemporaryFile(suffix = ".db") +mdb = web.database(dbn='sqlite', db="metadata.db") + + + +def buildDatabase(csvfile): + print "Build DB" + mdb._db_cursor().connection.text_factory=str + mdb._db_cursor().connection.execute('DROP TABLE IF EXISTS media') + mdb._db_cursor().connection.execute('CREATE TABLE media (uid TEXT NOT NULL PRIMARY KEY, artist TEXT, album TEXT, track TEXT, tracknum INTEGER, filename TEXT, seconds INTEGER)') + + trackReader = csv.reader(open(csvfile)) + head = True + for row in trackReader: + if head: + head = False + continue + mdb.insert('media', uid=row[0], filename=row[1], artist=row[2], track=row[3], album=row[4], tracknum=row[5], seconds=row[6]) + + +def retrieveTrackData(trackID): + results = mdb.select('media', dict(uid=trackID), where='uid = $uid') + res = dict() + try: + result = results[0] + except IndexError: + return False + for key in result.keys(): + res[key] = result[key] + + return res + +class trackSearch: + def GET(self, trackID): + data = retrieveTrackData(trackID) + if data: + return json.dumps(dict(status = "ok", data = data)) + else: + return json.dumps(dict(status = "error", message=str("Invalid key"))) + +class crossDomain: + def GET(self): + return """<?xml version="1.0"?> +<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> +<cross-domain-policy> + <allow-access-from domain="*" /> +</cross-domain-policy> """ + +class audioPlay: + def GET(self, trackID): + web.header("Content-Type", "audio/mpeg") + user_data = web.input() + track_data = retrieveTrackData(trackID) + tempMp3 = tempfile.NamedTemporaryFile(suffix = ".mp3") + tempWav = tempfile.NamedTemporaryFile(suffix = ".wav") + subprocess.call(["sox", audioDir+track_data['filename'], tempWav.name, "trim", user_data['start'], user_data['length'], "fade", "0.3", user_data['length']]) + subprocess.call(["lame", "--quiet", tempWav.name, tempMp3.name]) + + return tempMp3.read() + +class segmentSearch: + def GET(self, trackID): + params = web.input(db="AWAL",key="", ntracks=20, seqStart=0, seqLength=16, npoints=1, radius=1.0, hopSize=1, exhaustive=False, falsePositives=False, accumulation="track", distance="eucNorm", absThres=-6, relThres=10, durRatio=0, includeKeys=[], excludeKeys=[], resFmt="dict") + + db.configQuery["ntracks"] = int(params.ntracks) + db.configQuery["npoints"] = int(params.npoints) + db.configQuery["seqStart"] = int(params.seqStart) + db.configQuery["seqLength"] = int(params.seqLength) + db.configQuery["hopSize"] = int(params.hopSize) + db.configQuery["radius"] = float(params.radius) + db.configQuery["absThres"] = float(params.absThres) + db.configQuery["relThres"] = float(params.relThres) + db.configQuery["durRatio"] = float(params.durRatio) + db.configQuery["resFmt"] = "list"; + #db.configQuery["includeKeys"] = ["AWAL2000", "AWAL500", "AWAL1000"] + + results = dict() + try: + results = db.query(key = trackID) + return json.dumps(dict(status = "ok", data = results.rawData)) + except Exception: + return json.dumps(dict(status = "error", message=str("Fix inst"))) + +if __name__ == "__main__": + # Uncomment to rebuild the db at start + #buildDatabase(trackFile) + app.run()