mas01mj@733: #!/usr/bin/python mas01mj@733: mas01mj@733: import sqlite3 mas01mj@733: import csv mas01mj@733: import sys mas01mj@733: import urllib mas01mj@733: import web mas01mj@733: from pyadb import * mas01mj@733: import simplejson as json mas01mj@733: import tempfile mas01mj@733: import subprocess mas01mj@733: mas01mj@733: # For now mas01mj@733: mas01mj@733: featureFile = "AWAL2010.adb" mas01mj@733: trackFile = "awal_id32.csv" mas01mj@733: audioDir = "/home/mjewell/Music/mp3s/" mas01mj@733: mas01mj@733: urls = ( mas01mj@733: '/track/(.*)', 'trackSearch', mas01mj@733: '/audio/(.*)', 'audioPlay', mas01mj@733: '/search/(.*)', 'segmentSearch', mas01mj@733: '/crossdomain.xml', 'crossDomain' mas01mj@733: ) mas01mj@733: mas01mj@733: app = web.application(urls, globals()) mas01mj@733: db = Pyadb(path = featureFile, mode = "r") mas01mj@733: dbfile = tempfile.NamedTemporaryFile(suffix = ".db") mas01mj@733: mdb = web.database(dbn='sqlite', db="metadata.db") mas01mj@733: mas01mj@733: mas01mj@733: mas01mj@733: def buildDatabase(csvfile): mas01mj@733: print "Build DB" mas01mj@733: mdb._db_cursor().connection.text_factory=str mas01mj@733: mdb._db_cursor().connection.execute('DROP TABLE IF EXISTS media') mas01mj@733: 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)') mas01mj@733: mas01mj@733: trackReader = csv.reader(open(csvfile)) mas01mj@733: head = True mas01mj@733: for row in trackReader: mas01mj@733: if head: mas01mj@733: head = False mas01mj@733: continue mas01mj@733: mdb.insert('media', uid=row[0], filename=row[1], artist=row[2], track=row[3], album=row[4], tracknum=row[5], seconds=row[6]) mas01mj@733: mas01mj@733: mas01mj@733: def retrieveTrackData(trackID): mas01mj@733: results = mdb.select('media', dict(uid=trackID), where='uid = $uid') mas01mj@733: res = dict() mas01mj@733: try: mas01mj@733: result = results[0] mas01mj@733: except IndexError: mas01mj@733: return False mas01mj@733: for key in result.keys(): mas01mj@733: res[key] = result[key] mas01mj@733: mas01mj@733: return res mas01mj@733: mas01mj@733: class trackSearch: mas01mj@733: def GET(self, trackID): mas01mj@733: data = retrieveTrackData(trackID) mas01mj@733: if data: mas01mj@733: return json.dumps(dict(status = "ok", data = data)) mas01mj@733: else: mas01mj@733: return json.dumps(dict(status = "error", message=str("Invalid key"))) mas01mj@733: mas01mj@733: class crossDomain: mas01mj@733: def GET(self): mas01mj@733: return """ mas01mj@733: mas01mj@733: mas01mj@733: mas01mj@733: """ mas01mj@733: mas01mj@733: class audioPlay: mas01mj@733: def GET(self, trackID): mas01mj@733: web.header("Content-Type", "audio/mpeg") mas01mj@733: user_data = web.input() mas01mj@733: track_data = retrieveTrackData(trackID) mas01mj@733: tempMp3 = tempfile.NamedTemporaryFile(suffix = ".mp3") mas01mj@733: tempWav = tempfile.NamedTemporaryFile(suffix = ".wav") mas01mj@733: subprocess.call(["sox", audioDir+track_data['filename'], tempWav.name, "trim", user_data['start'], user_data['length'], "fade", "0.3", user_data['length']]) mas01mj@733: subprocess.call(["lame", "--quiet", tempWav.name, tempMp3.name]) mas01mj@733: mas01mj@733: return tempMp3.read() mas01mj@733: mas01mj@733: class segmentSearch: mas01mj@733: def GET(self, trackID): mas01mj@733: 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") mas01mj@733: mas01mj@733: db.configQuery["ntracks"] = int(params.ntracks) mas01mj@733: db.configQuery["npoints"] = int(params.npoints) mas01mj@733: db.configQuery["seqStart"] = int(params.seqStart) mas01mj@733: db.configQuery["seqLength"] = int(params.seqLength) mas01mj@733: db.configQuery["hopSize"] = int(params.hopSize) mas01mj@733: db.configQuery["radius"] = float(params.radius) mas01mj@733: db.configQuery["absThres"] = float(params.absThres) mas01mj@733: db.configQuery["relThres"] = float(params.relThres) mas01mj@733: db.configQuery["durRatio"] = float(params.durRatio) mas01mj@733: db.configQuery["resFmt"] = "list"; mas01mj@733: #db.configQuery["includeKeys"] = ["AWAL2000", "AWAL500", "AWAL1000"] mas01mj@733: mas01mj@733: results = dict() mas01mj@733: try: mas01mj@733: results = db.query(key = trackID) mas01mj@733: return json.dumps(dict(status = "ok", data = results.rawData)) mas01mj@733: except Exception: mas01mj@733: return json.dumps(dict(status = "error", message=str("Fix inst"))) mas01mj@733: mas01mj@733: if __name__ == "__main__": mas01mj@733: # Uncomment to rebuild the db at start mas01mj@733: #buildDatabase(trackFile) mas01mj@733: app.run()