diff --git a/server/djrandom/metadata_fixer/metadata_fixer.py b/server/djrandom/metadata_fixer/metadata_fixer.py index bd04913703542232d612a4173b8cae9601db0722..9fc62b99cdde7876871f8a7ccef90b5257d09b6c 100644 --- a/server/djrandom/metadata_fixer/metadata_fixer.py +++ b/server/djrandom/metadata_fixer/metadata_fixer.py @@ -11,6 +11,7 @@ from djrandom import utils from djrandom.model.mp3 import MP3 from djrandom.database import Session, init_db from djrandom.scanner import metadata +from djrandom.scanner import indexer log = logging.getLogger(__name__) @@ -23,8 +24,9 @@ class MetadataFixer(object): ECHONEST_API_URL = 'http://developer.echonest.com/api/v4/song/identify' - def __init__(self, echonest_api_key): + def __init__(self, solr_url, echonest_api_key): self.api_key = echonest_api_key + self.idx = indexer.Indexer(solr_url) def identify_song(self, mp3): json_fp = mp3.get_fingerprint() @@ -38,6 +40,7 @@ class MetadataFixer(object): try: result = json.loads(urllib2.urlopen(req).read()) response = result['response'] + logging.debug('response:\n%s' % str(response)) if response['status']['code'] != 0: log.error('EchoNest API replied with code %d: %s' % ( response['status']['code'], @@ -58,39 +61,50 @@ class MetadataFixer(object): mp3.title = metadata.normalize_string(info['title']) mp3.artist = metadata.normalize_string(info['artist_name']) - def scan(self, run_once): + def scan(self): """Scan the database for new files.""" - while True: - mp3 = MP3.get_with_bad_metadata().limit(1).first() - if not mp3: - if run_once: - break - Session.remove() - time.sleep(600) - continue + n_bad = n_ok = n_err = 0 + for mp3 in MP3.get_with_bad_metadata(): + n_bad += 1 log.info('searching metadata for %s' % mp3.sha1) try: self.process(mp3) - #mp3.state = MP3.READY + mp3.state = MP3.READY + self.idx.add_mp3(mp3) + log.info('found: %s / %s' % (mp3.artist, mp3.title)) + n_ok += 1 + except NoMetadataError: + n_err += 1 except Exception, e: log.error(traceback.format_exc()) + n_err += 1 #mp3.state = MP3.ERROR - #Session.add(mp3) - Session.commit() + Session.add(mp3) + Session.commit() + self.idx.commit() + log.debug('total: %d songs, found: %d' % (n_bad, n_ok)) + def run(self, run_once): + while True: + self.scan() + if run_once: + break + Session.remove() + time.sleep(600) -def run_fixer(echonest_api_key, db_url, run_once): +def run_fixer(solr_url, echonest_api_key, db_url, run_once): socket.setdefaulttimeout(300) init_db(db_url) - fixer = MetadataFixer(echonest_api_key) - fixer.scan(run_once) + fixer = MetadataFixer(solr_url, echonest_api_key) + fixer.run(run_once) def main(): parser = optparse.OptionParser() parser.add_option('--once', action='store_true') + parser.add_option('--solr_url', default='http://localhost:8080/solr') parser.add_option('--echonest_api_key') parser.add_option('--db_url') daemonize.add_standard_options(parser) @@ -108,7 +122,8 @@ def main(): opts.foreground = True daemonize.daemonize(opts, run_fixer, - (opts.echonest_api_key, opts.db_url, opts.once)) + (opts.solr_url, opts.echonest_api_key, + opts.db_url, opts.once)) if __name__ == '__main__':