diff --git a/server/djrandom/mood/mood_scanner.py b/server/djrandom/mood/mood_scanner.py
new file mode 100644
index 0000000000000000000000000000000000000000..ba1afe575376019890c9f700f4ca4e72d308c77b
--- /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 7dedd582f113432975b5cf46aee174ec338cc5d4..f17a9b3e94863b79f8438d699b7490fc87e1febf 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",
     ],
   },
   )