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