From 3065cbbe913ac54884b60147dd96fa5be0a68e93 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 27 Oct 2010 17:12:21 -0600 Subject: [PATCH] Amazon metadata download plugin: Use the xisbn service to search for all related ISBNs on Amazon --- src/calibre/ebooks/metadata/amazon.py | 45 ++++++++++++++++++++------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/calibre/ebooks/metadata/amazon.py b/src/calibre/ebooks/metadata/amazon.py index 0a3ab95fc2..10590b8cff 100644 --- a/src/calibre/ebooks/metadata/amazon.py +++ b/src/calibre/ebooks/metadata/amazon.py @@ -26,15 +26,7 @@ def find_asin(br, isbn): if revs: return revs[0] - -def get_social_metadata(title, authors, publisher, isbn): - mi = Metadata(title, authors) - if not isbn: - return mi - isbn = check_isbn(isbn) - if not isbn: - return mi - br = browser() +def to_asin(br, isbn): if len(isbn) == 13: try: asin = find_asin(br, isbn) @@ -44,15 +36,36 @@ def get_social_metadata(title, authors, publisher, isbn): asin = None else: asin = isbn + return asin + +def get_social_metadata(title, authors, publisher, isbn): + mi = Metadata(title, authors) + if not isbn: + return mi + isbn = check_isbn(isbn) + if not isbn: + return mi + br = browser() + asin = to_asin(br, isbn) if asin: if get_metadata(br, asin, mi): return mi - # TODO: Use xisbn to search over all isbns + from calibre.ebooks.metadata.xisbn import xisbn + for i in xisbn.get_associated_isbns(isbn): + asin = to_asin(br, i) + if get_metadata(br, asin, mi): + return mi return mi def get_metadata(br, asin, mi): q = 'http://amzn.com/'+asin - raw = br.open_novisit(q).read() + try: + raw = br.open_novisit(q).read() + except Exception, e: + if callable(getattr(e, 'getcode', None)) and \ + e.getcode() == 404: + return False + raise if '404 - ' in raw: return False raw = xml_to_unicode(raw, strip_encoding_pats=True, @@ -86,11 +99,19 @@ def get_metadata(br, asin, mi): desc = re.sub(r'(?s)<!--.*?-->', '', desc) mi.comments = desc + return True + def main(args=sys.argv): + # Test xisbn + print get_social_metadata('Learning Python', None, None, '8324616489') + print + + # Test sophisticated comment formatting print get_social_metadata('Swan Thieves', None, None, '9780316065795') print - return 0 + + # Random tests print get_social_metadata('Star Trek: Destiny: Mere Mortals', None, None, '9781416551720') print print get_social_metadata('The Great Gatsby', None, None, '0743273567')