From b7302ac35d9f1a1c13824f6290ae4f27158bc4d4 Mon Sep 17 00:00:00 2001 From: ale <ale@incal.net> Date: Sat, 21 Jan 2012 15:06:01 +0000 Subject: [PATCH] add a frontend for the timbre feature extraction processor --- server/djrandom/mood/mood_scanner.py | 61 ++++++++++++++++++++++++++++ server/setup.py | 2 +- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 server/djrandom/mood/mood_scanner.py diff --git a/server/djrandom/mood/mood_scanner.py b/server/djrandom/mood/mood_scanner.py new file mode 100644 index 0000000..ba1afe5 --- /dev/null +++ b/server/djrandom/mood/mood_scanner.py @@ -0,0 +1,61 @@ +import os +import optparse +import logging +import subprocess +import time +import traceback +from djrandom import daemonize +from djrandom import utils +from djrandom.model.mp3 import MP3 +from djrandom.database import Session, init_db +from djrandom.model import processor +from djrandom.mood import feature_extraction +from djrandom.mood import marsyas_utils + +log = logging.getLogger(__name__) + + +class TimbreFeatureExtractor(processor.Processor): + + def process(self, mp3): + log.info('extracting features from %s' % mp3.sha1) + try: + timbre_vector = feature_extraction.vector_from_file(mp3.path) + vector_str = marsyas_utils.serialize_realvec(timbre_vector) + except Exception, e: + log.error('error processing %s: %s' % (mp3.sha1, e)) + return + mp3.set_features(timbre_vector=vector_str) + + def query(self): + return MP3.get_with_no_features() + + +def run_feature_extractor(db_url, run_once): + init_db(db_url) + scanner = TimbreFeatureExtractor() + scanner.loop(run_once=run_once) + + +def main(): + parser = optparse.OptionParser() + parser.add_option('--once', action='store_true') + parser.add_option('--db_url') + daemonize.add_standard_options(parser) + utils.read_config_defaults( + parser, os.getenv('DJRANDOM_CONF', '/etc/djrandom.conf')) + opts, args = parser.parse_args() + if not opts.db_url: + parser.error('Must provide --db_url') + if args: + parser.error('Too many arguments') + + if opts.once: + opts.foreground = True + + daemonize.daemonize(opts, run_feature_extractor, + (opts.db_url, opts.once)) + + +if __name__ == '__main__': + main() diff --git a/server/setup.py b/server/setup.py index 7dedd58..f17a9b3 100644 --- a/server/setup.py +++ b/server/setup.py @@ -32,7 +32,7 @@ setup( "djrandom-update-markov = djrandom.model.markov:main", "djrandom-metadata-fixer = djrandom.metadata_fixer.metadata_fixer:main", "djrandom-solr-fixer = djrandom.model.verify:main", - "djrandom-extract-features = djrandom.mood.extract_features:main", + "djrandom-mood-scanner = djrandom.mood.mood_scanner:main", ], }, ) -- GitLab