diff --git a/client/djrandom_client/client.py b/client/djrandom_client/client.py index 003bf472ad9a2ed0c6b6843687f47d970021155d..5ed5d392053a7bc8240749ab2a14f8dd5fb0bff3 100644 --- a/client/djrandom_client/client.py +++ b/client/djrandom_client/client.py @@ -15,13 +15,13 @@ from djrandom_client import utils from djrandom_client import throttle # Detect platform and selectively enable inotify/fsevents watchers. -enable_watcher = True +watcher_support = True if platform.system() == 'Darwin': import djrandom_client.osx_watcher as watcher elif platform.system() == 'Linux': import djrandom_client.linux_watcher as watcher else: - enable_watcher = False + watcher_support = False log = logging.getLogger(__name__) @@ -29,35 +29,44 @@ log = logging.getLogger(__name__) class FullScan(threading.Thread): """Do a recursive directory scan when starting.""" - def __init__(self, basedir, queue, exit_when_done=False): + def __init__(self, basedir, queue, base_delay, exit_when_done=False): threading.Thread.__init__(self) self.basedir = basedir + self.base_delay = base_delay self.queue = queue self.exit_when_done = exit_when_done def run(self): while True: - # Do a full scan every 3 days. - delay = 86400 * 3 + delay = self.base_delay try: filescan.recursive_scan(self.basedir, self.queue) except Exception, e: log.error('Error in file scan: %s' % e) - delay = 3600 + # Retry 30 minutes after an error. + delay = 1800 if self.exit_when_done: self.queue.put(None) break time.sleep(delay) -def run_client(server_url, music_dir, api_key, run_once, bwlimit): +def run_client(server_url, music_dir, api_key, run_once, bwlimit, enable_watcher): if bwlimit: throttle.set_rate_limit(bwlimit) + if enable_watcher and not watcher_support: + log.warn('inotify/fsevents support not enabled on this platform') + enable_watcher = False + upl = upload.Uploader(server_url.rstrip('/'), api_key) # Start the full filesystem scan in the background. - scan = FullScan(music_dir, upl.queue, run_once) + if enable_watcher: + scan_delay = 3 * 86400 + else: + scan_delay = 9600 + scan = FullScan(music_dir, upl.queue, scan_delay, run_once) scan.setDaemon(True) scan.start() @@ -71,8 +80,6 @@ def run_client(server_url, music_dir, api_key, run_once, bwlimit): # Start the live filesystem watcher. if enable_watcher: wtch = watcher.Watcher(music_dir, upl.queue) - else: - log.warn('inotify/fsevents support not enabled on this platform') # Install termination signal handlers. def _cleanup(signum, frame): @@ -102,6 +109,9 @@ def main(): help='URL to the API endpoint') parser.add_option('--bwlimit', type='int', help='Bandwidth limit (in KBps, default unlimited)') + parser.add_option('--realtime_watch', action='store_true', + default=True, + help='Monitor music_dir in realtime') daemonize.add_standard_options(parser) utils.read_config_defaults( parser, os.path.join(os.getenv('HOME'), '.djrandom.conf')) @@ -115,9 +125,15 @@ def main(): if args: parser.error('Too many arguments') + # Reading from the configuration file will set this variable to + # a string, convert it back into boolean. + do_realtime = opts.realtime_watch + if isinstance(do_realtime, basestring): + do_realtime = (do_realtime.lower() in ('true', 'on', 'yes')) + daemonize.daemonize(opts, run_client, (opts.server_url, opts.music_dir, opts.api_key, - opts.once, opts.bwlimit)) + opts.once, opts.bwlimit, do_realtime)) if __name__ == '__main__':