diff --git a/src/calibre/ebooks/metadata/library_thing.py b/src/calibre/ebooks/metadata/library_thing.py index ef41d5e937..0f46c72c75 100644 --- a/src/calibre/ebooks/metadata/library_thing.py +++ b/src/calibre/ebooks/metadata/library_thing.py @@ -4,13 +4,15 @@ __copyright__ = '2008, Kovid Goyal ' Fetch cover from LibraryThing.com based on ISBN number. ''' -import sys, socket, os, re, mechanize +import sys, socket, os, re from calibre import browser as _browser from calibre.utils.config import OptionParser -from calibre.ebooks.BeautifulSoup import BeautifulSoup +from calibre.ebooks.BeautifulSoup import BeautifulSoup browser = None +OPENLIBRARY = 'http://covers.openlibrary.org/b/isbn/%s-L.jpg?default=false' + class LibraryThingError(Exception): pass @@ -30,15 +32,21 @@ def login(username, password, force=True): browser['formusername'] = username browser['formpassword'] = password browser.submit() - -def cover_from_isbn(isbn, timeout=5.): + +def cover_from_isbn(isbn, timeout=5., username=None, password=None): global browser if browser is None: browser = _browser() _timeout = socket.getdefaulttimeout() socket.setdefaulttimeout(timeout) - src = None + src = None + try: + return browser.open(OPENLIBRARY%isbn).read(), 'jpg' + except: + pass # Cover not found + if username and password: + login(username, password, force=False) try: src = browser.open('http://www.librarything.com/isbn/'+isbn).read().decode('utf-8', 'replace') except Exception, err: @@ -55,7 +63,7 @@ def cover_from_isbn(isbn, timeout=5.): url = url.find('img') if url is None: raise LibraryThingError(_('LibraryThing.com server error. Try again later.')) - url = re.sub(r'_SX\d+', '', url['src']) + url = re.sub(r'_S[XY]\d+', '', url['src']) cover_data = browser.open(url).read() return cover_data, url.rpartition('.')[-1] finally: @@ -68,9 +76,9 @@ _(''' Fetch a cover image for the book identified by ISBN from LibraryThing.com ''')) - parser.add_option('-u', '--username', default=None, + parser.add_option('-u', '--username', default=None, help='Username for LibraryThing.com') - parser.add_option('-p', '--password', default=None, + parser.add_option('-p', '--password', default=None, help='Password for LibraryThing.com') return parser @@ -81,13 +89,8 @@ def main(args=sys.argv): parser.print_help() return 1 isbn = args[1] - if opts.username and opts.password: - try: - login(opts.username, opts.password) - except mechanize.FormNotFoundError: - raise LibraryThingError(_('LibraryThing.com server error. Try again later.')) - - cover_data, ext = cover_from_isbn(isbn) + cover_data, ext = cover_from_isbn(isbn, username=opts.username, + password=opts.password) if not ext: ext = 'jpg' oname = os.path.abspath(isbn+'.'+ext) @@ -96,4 +99,4 @@ def main(args=sys.argv): return 0 if __name__ == '__main__': - sys.exit(main()) \ No newline at end of file + sys.exit(main()) diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 4a74c87097..1a2f2d3129 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -20,7 +20,7 @@ from calibre.gui2.dialogs.password import PasswordDialog from calibre.gui2.widgets import ProgressIndicator from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata import authors_to_sort_string, string_to_authors, authors_to_string -from calibre.ebooks.metadata.library_thing import login, cover_from_isbn +from calibre.ebooks.metadata.library_thing import cover_from_isbn from calibre import islinux from calibre.ebooks.metadata.meta import get_metadata from calibre.utils.config import prefs @@ -60,9 +60,8 @@ class CoverFetcher(QThread): return self.isbn = results[0] - if self.username and self.password: - login(self.username, self.password, force=False) - self.cover_data = cover_from_isbn(self.isbn, timeout=self.timeout)[0] + self.cover_data = cover_from_isbn(self.isbn, timeout=self.timeout, + username=self.username, password=self.password)[0] except Exception, e: self.exception = e self.traceback = traceback.format_exc() diff --git a/src/calibre/gui2/dialogs/metadata_single.ui b/src/calibre/gui2/dialogs/metadata_single.ui index 6e96c8d741..5772609de6 100644 --- a/src/calibre/gui2/dialogs/metadata_single.ui +++ b/src/calibre/gui2/dialogs/metadata_single.ui @@ -589,7 +589,7 @@ - Fetch &cover image from server + Download &cover image diff --git a/src/calibre/web/feeds/news.py b/src/calibre/web/feeds/news.py index 2494951ccd..bb3610343e 100644 --- a/src/calibre/web/feeds/news.py +++ b/src/calibre/web/feeds/news.py @@ -265,7 +265,7 @@ class BasicNewsRecipe(object, LoggingInterface): def get_feeds(self): ''' - Return a list of :term:RSS feeds to fetch for this profile. Each element of the list + Return a list of :term:`RSS` feeds to fetch for this profile. Each element of the list must be a 2-element tuple of the form (title, url). If title is None or an empty string, the title from the feed is used. This method is useful if your recipe needs to do some processing to figure out the list of feeds to download. If