from gevent import monkey monkey.patch_all() import sys import os import optparse import logging from djrandom import daemonize from djrandom import utils from djrandom.database import init_db from djrandom.frontend import app, svcs from djrandom.frontend.mailer import Mailer from djrandom.frontend.search import Searcher from djrandom.model.markov import MarkovModel from djrandom.model.external import AlbumImageRetriever from werkzeug.contrib.cache import SimpleCache, MemcachedCache from gevent.wsgi import WSGIServer log = logging.getLogger(__name__) def run_frontend(opts): init_db(opts.db_url, opts.solr_url) svcs['searcher'] = Searcher(opts.solr_url) svcs['album_images'] = AlbumImageRetriever( opts.lastfm_api_key, opts.album_art_dir) svcs['mailer'] = Mailer(opts.email_sender) if opts.memcached_url: svcs['cache'] = MemcachedCache([opts.memcached_url]) else: svcs['cache'] = SimpleCache() svcs['markov'] = MarkovModel() try: svcs['markov'].load(opts.markov_data) except IOError, e: log.error('Could not read Markov data from %s: %s' % ( opts.markov_data, str(e))) # Start the WSGI profiling middleware, if requested. if opts.profile: from djrandom.frontend.latency import LatencyProfilerMiddleware app.wsgi_app = LatencyProfilerMiddleware( app.wsgi_app, ['/json/album', '/json/song', '/album_image', '/json/playlist/get', '/json/playlist/by_title', '/json/playlist/list', '/user/activate', '/dl']) from repoze.profile.profiler import AccumulatingProfileMiddleware app.wsgi_app = AccumulatingProfileMiddleware( app.wsgi_app, log_filename='/var/tmp/djrandom-profile.log', cachegrind_filename='/var/tmp/djrandom-profile.cachegrind', discard_first_request=True, flush_at_shutdown=True, path='/__profile__' ) # Set some configuration options in the Flask global config. app.config.from_pyfile(opts.app_config, silent=True) http_server = WSGIServer((opts.bind_address, opts.port), app) http_server.serve_forever() def main(): parser = optparse.OptionParser() parser.add_option('--solr_url', default='http://localhost:8080/solr') parser.add_option('--bind_address', default='127.0.0.1') parser.add_option('--port', type='int', default=3003) parser.add_option('--db_url') parser.add_option('--lastfm_api_key') parser.add_option('--email_sender', default='djrandom@localhost') parser.add_option('--album_art_dir', default='/var/tmp/album-image-cache') parser.add_option('--markov_data', default='/var/lib/djrandom/djrandom-markov.dat') parser.add_option('--memcached_url') parser.add_option('--profile', action='store_true') parser.add_option('--app_config') 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 not opts.app_config: parser.error('Must provide --app_config') if args: parser.error('Too many arguments') daemonize.daemonize(opts, run_frontend, (opts,), support_gevent=True) if __name__ == '__main__': main()