diff --git a/resources/content_server/browse/browse.js b/resources/content_server/browse/browse.js index 29b84ac2d7..5e3cee14c0 100644 --- a/resources/content_server/browse/browse.js +++ b/resources/content_server/browse/browse.js @@ -109,7 +109,7 @@ function toplevel_layout() { var last = $(".toplevel li").last(); var title = $('.toplevel h3').first(); var bottom = last.position().top + last.height() - title.position().top; - $("#main").height(Math.max(200, bottom)); + $("#main").height(Math.max(200, bottom+75)); } function toplevel() { diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 6ada31418a..0ae15b0caa 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -365,6 +365,8 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{ except: olddb = None db = LibraryDatabase2(newloc) + if self.content_server is not None: + self.content_server.set_database(db) self.library_path = newloc self.book_on_device(None, reset=True) db.set_book_on_device_func(self.book_on_device) diff --git a/src/calibre/library/server/base.py b/src/calibre/library/server/base.py index f6d8e68a04..84e748a949 100644 --- a/src/calibre/library/server/base.py +++ b/src/calibre/library/server/base.py @@ -10,6 +10,7 @@ import logging from logging.handlers import RotatingFileHandler import cherrypy +from cherrypy.process.plugins import SimplePlugin from calibre.constants import __appname__, __version__ from calibre.utils.date import fromtimestamp @@ -54,16 +55,43 @@ class DispatchController(object): # {{{ # }}} +class BonJour(SimplePlugin): + + def __init__(self, engine, port=8080): + SimplePlugin.__init__(self, engine) + self.port = port + + def start(self): + try: + publish_zeroconf('Books in calibre', '_stanza._tcp', + self.port, {'path':'/stanza'}) + except: + import traceback + cherrypy.log.error('Failed to start BonJour:') + cherrypy.log.error(traceback.format_exc()) + + start.priority = 90 + + def stop(self): + try: + stop_zeroconf() + except: + import traceback + cherrypy.log.error('Failed to stop BonJour:') + cherrypy.log.error(traceback.format_exc()) + + + stop.priority = 10 + +cherrypy.engine.bonjour = BonJour(cherrypy.engine) + + class LibraryServer(ContentServer, MobileServer, XMLServer, OPDSServer, Cache, BrowseServer): server_name = __appname__ + '/' + __version__ def __init__(self, db, opts, embedded=False, show_tracebacks=True): - self.db = db - for item in self.db: - item - break self.opts = opts self.embedded = embedded self.state_callback = None @@ -71,7 +99,14 @@ class LibraryServer(ContentServer, MobileServer, XMLServer, OPDSServer, Cache, map(int, self.opts.max_cover.split('x')) path = P('content_server') self.build_time = fromtimestamp(os.stat(path).st_mtime) - self.default_cover = open(P('content_server/default_cover.jpg'), 'rb').read() + self.default_cover = open(P('content_server/default_cover.jpg'), 'rb').read() + + cherrypy.engine.bonjour.port = opts.port + + Cache.__init__(self) + + self.set_database(db) + cherrypy.config.update({ 'log.screen' : opts.develop, 'engine.autoreload_on' : opts.develop, @@ -97,18 +132,27 @@ class LibraryServer(ContentServer, MobileServer, XMLServer, OPDSServer, Cache, 'tools.digest_auth.users' : {opts.username.strip():opts.password.strip()}, } - sr = getattr(opts, 'restriction', None) - sr = db.prefs.get('cs_restriction', '') if sr is None else sr - self.set_search_restriction(sr) self.is_running = False self.exception = None + self.setup_loggers() + cherrypy.engine.bonjour.subscribe() + + def set_database(self, db): + self.db = db + sr = getattr(self.opts, 'restriction', None) + sr = db.prefs.get('cs_restriction', '') if sr is None else sr + self.set_search_restriction(sr) + + def graceful(self): + cherrypy.engine.graceful() def set_search_restriction(self, restriction): if restriction: self.search_restriction = 'search:"%s"'%restriction else: self.search_restriction = '' + self.reset_caches() def setup_loggers(self): access_file = log_access_file @@ -140,7 +184,6 @@ class LibraryServer(ContentServer, MobileServer, XMLServer, OPDSServer, Cache, root_conf['request.dispatch'] = d.dispatcher self.config['/'] = root_conf - self.setup_loggers() cherrypy.tree.mount(root=None, config=self.config) try: try: @@ -154,24 +197,14 @@ class LibraryServer(ContentServer, MobileServer, XMLServer, OPDSServer, Cache, cherrypy.engine.start() self.is_running = True - try: - publish_zeroconf('Books in calibre', '_stanza._tcp', - self.opts.port, {'path':'/stanza'}) - except: - import traceback - cherrypy.log.error('Failed to start BonJour:') - cherrypy.log.error(traceback.format_exc()) + #if hasattr(cherrypy.engine, 'signal_handler'): + # cherrypy.engine.signal_handler.subscribe() + cherrypy.engine.block() except Exception, e: self.exception = e finally: self.is_running = False - try: - stop_zeroconf() - except: - import traceback - cherrypy.log.error('Failed to stop BonJour:') - cherrypy.log.error(traceback.format_exc()) try: if callable(self.state_callback): self.state_callback(self.is_running) diff --git a/src/calibre/library/server/cache.py b/src/calibre/library/server/cache.py index 29602a114c..cc4f7a3886 100644 --- a/src/calibre/library/server/cache.py +++ b/src/calibre/library/server/cache.py @@ -10,7 +10,10 @@ from calibre.utils.ordered_dict import OrderedDict class Cache(object): - def add_routes(self, c): + def __init__(self): + self.reset_caches() + + def reset_caches(self): self._category_cache = OrderedDict() self._search_cache = OrderedDict() diff --git a/src/calibre/utils/mdns.py b/src/calibre/utils/mdns.py index 74547b9573..b7cc8757d3 100644 --- a/src/calibre/utils/mdns.py +++ b/src/calibre/utils/mdns.py @@ -58,11 +58,12 @@ def publish(desc, type, port, properties=None, add_hostname=True): ''' port = int(port) server = start_server() + try: + hostname = socket.gethostname().partition('.')[0] + except: + hostname = 'Unknown' + if add_hostname: - try: - hostname = socket.gethostname().partition('.')[0] - except: - hostname = 'Unknown' desc += ' (on %s)'%hostname local_ip = get_external_ip() type = type+'.local.'