From 2fec4aa6c3719767d52c8e4558697dbc4f088ebb Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 24 May 2011 13:33:52 -0600 Subject: [PATCH 1/3] ... --- src/calibre/library/server/base.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/calibre/library/server/base.py b/src/calibre/library/server/base.py index 862e724809..319feefa44 100644 --- a/src/calibre/library/server/base.py +++ b/src/calibre/library/server/base.py @@ -221,7 +221,12 @@ class LibraryServer(ContentServer, MobileServer, XMLServer, OPDSServer, Cache, if not ip or ip.startswith('127.'): raise cherrypy.log('Trying to bind to single interface: '+ip) + # Change the host we listen on cherrypy.config.update({'server.socket_host' : ip}) + # This ensures that the change is actually applied + cherrypy.server.socket_host = ip + cherrypy.server.httpserver = cherrypy.server.instance = None + cherrypy.engine.start() self.is_running = True @@ -231,6 +236,8 @@ class LibraryServer(ContentServer, MobileServer, XMLServer, OPDSServer, Cache, cherrypy.engine.block() except Exception as e: self.exception = e + import traceback + traceback.print_exc() finally: self.is_running = False try: From 3a78a875afe7c980aae8497d89e1a1d784335c2f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 24 May 2011 15:18:47 -0600 Subject: [PATCH 2/3] Amazon metadata download: Use separate identifiers for country specific downloads so that the links to Amazon in the Book details panel work when downloading metadata from country specific amazon websites. Fixes #786146 (German Amazon Metadata) --- src/calibre/ebooks/metadata/sources/amazon.py | 63 +++++++++++++------ 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/src/calibre/ebooks/metadata/sources/amazon.py b/src/calibre/ebooks/metadata/sources/amazon.py index f291959475..7da37ce5af 100644 --- a/src/calibre/ebooks/metadata/sources/amazon.py +++ b/src/calibre/ebooks/metadata/sources/amazon.py @@ -29,7 +29,7 @@ class Worker(Thread): # Get details {{{ Get book details from amazons book page in a separate thread ''' - def __init__(self, url, result_queue, browser, log, relevance, plugin, timeout=20): + def __init__(self, url, result_queue, browser, log, relevance, domain, plugin, timeout=20): Thread.__init__(self) self.daemon = True self.url, self.result_queue = url, result_queue @@ -37,7 +37,7 @@ class Worker(Thread): # Get details {{{ self.relevance, self.plugin = relevance, plugin self.browser = browser.clone_browser() self.cover_url = self.amazon_id = self.isbn = None - self.domain = self.plugin.domain + self.domain = domain months = { 'de': { @@ -199,7 +199,8 @@ class Worker(Thread): # Get details {{{ return mi = Metadata(title, authors) - mi.set_identifier('amazon', asin) + idtype = 'amazon' if self.domain == 'com' else 'amazon_'+self.domain + mi.set_identifier(idtype, asin) self.amazon_id = asin try: @@ -404,12 +405,30 @@ class Amazon(Source): 'country\'s Amazon website.'), choices=AMAZON_DOMAINS), ) + def get_domain_and_asin(self, identifiers): + for key, val in identifiers.iteritems(): + key = key.lower() + if key in ('amazon', 'asin'): + return 'com', val + if key.startswith('amazon_'): + domain = key.split('_')[-1] + if domain and domain in self.AMAZON_DOMAINS: + return domain, val + return None, None + def get_book_url(self, identifiers): # {{{ - asin = identifiers.get('amazon', None) - if asin is None: - asin = identifiers.get('asin', None) - if asin: - return ('amazon', asin, 'http://amzn.com/%s'%asin) + domain, asin = self.get_domain_and_asin(identifiers) + if domain and asin: + url = None + if domain == 'com': + url = 'http://amzn.com/'+asin + elif domain == 'uk': + url = 'http://www.amazon.co.uk/dp/'+asin + else: + url = 'http://www.amazon.%s/dp/%s'%(domain, asin) + if url: + idtype = 'amazon' if self.domain == 'com' else 'amazon_'+self.domain + return (idtype, asin, url) # }}} @property @@ -420,8 +439,14 @@ class Amazon(Source): return domain - def create_query(self, log, title=None, authors=None, identifiers={}): # {{{ - domain = self.domain + def create_query(self, log, title=None, authors=None, identifiers={}, # {{{ + domain=None): + if domain is None: + domain = self.domain + + idomain, asin = self.get_domain_and_asin(identifiers) + if idomain is not None: + domain = idomain # See the amazon detailed search page to get all options q = { 'search-alias' : 'aps', @@ -433,7 +458,6 @@ class Amazon(Source): else: q['sort'] = 'relevancerank' - asin = identifiers.get('amazon', None) isbn = check_isbn(identifiers.get('isbn', None)) if asin is not None: @@ -456,23 +480,22 @@ class Amazon(Source): if not ('field-keywords' in q or 'field-isbn' in q or ('field-title' in q)): # Insufficient metadata to make an identify query - return None + return None, None latin1q = dict([(x.encode('latin1', 'ignore'), y.encode('latin1', 'ignore')) for x, y in q.iteritems()]) + udomain = domain if domain == 'uk': - domain = 'co.uk' - url = 'http://www.amazon.%s/s/?'%domain + urlencode(latin1q) - return url + udomain = 'co.uk' + url = 'http://www.amazon.%s/s/?'%udomain + urlencode(latin1q) + return url, domain # }}} def get_cached_cover_url(self, identifiers): # {{{ url = None - asin = identifiers.get('amazon', None) - if asin is None: - asin = identifiers.get('asin', None) + domain, asin = self.get_domain_and_asin(identifiers) if asin is None: isbn = identifiers.get('isbn', None) if isbn is not None: @@ -489,7 +512,7 @@ class Amazon(Source): Note this method will retry without identifiers automatically if no match is found with identifiers. ''' - query = self.create_query(log, title=title, authors=authors, + query, domain = self.create_query(log, title=title, authors=authors, identifiers=identifiers) if query is None: log.error('Insufficient metadata to construct query') @@ -571,7 +594,7 @@ class Amazon(Source): log.error('No matches found with query: %r'%query) return - workers = [Worker(url, result_queue, br, log, i, self) for i, url in + workers = [Worker(url, result_queue, br, log, i, domain, self) for i, url in enumerate(matches)] for w in workers: From 1395c6d5d814349102d23d9cdfb26af8689b4bb0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 24 May 2011 15:48:27 -0600 Subject: [PATCH 3/3] EPUB Output: Change any white-space:pre declarations in the CSS to pre-wrap to accomodate readers that cannot scroll horizontally. Fixes #786722 (chm to epub conversion fails to reflow text in
 tag)

---
 src/calibre/ebooks/epub/output.py | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/calibre/ebooks/epub/output.py b/src/calibre/ebooks/epub/output.py
index 0ed6d7e222..bea90eeba8 100644
--- a/src/calibre/ebooks/epub/output.py
+++ b/src/calibre/ebooks/epub/output.py
@@ -413,6 +413,13 @@ class EPUBOutput(OutputFormatPlugin):
                             rule.style.removeProperty('margin-left')
                             # padding-left breaks rendering in webkit and gecko
                             rule.style.removeProperty('padding-left')
+                # Change whitespace:pre to pre-line to accommodate readers that
+                # cannot scroll horizontally
+                for rule in stylesheet.data.cssRules.rulesOfType(CSSRule.STYLE_RULE):
+                    style = rule.style
+                    ws = style.getPropertyValue('white-space')
+                    if ws == 'pre':
+                        style.setProperty('white-space', 'pre-wrap')
 
     # }}}