From c69f4420607ba0b7165ed3c1e342eb77643406c9 Mon Sep 17 00:00:00 2001 From: John Schember Date: Mon, 16 May 2011 18:48:14 -0400 Subject: [PATCH] Store: Fix Wizards Press store when it returns an exact match by loading the detail page. --- .../gui2/store/wizards_tower_books_plugin.py | 88 +++++++++++++------ 1 file changed, 59 insertions(+), 29 deletions(-) diff --git a/src/calibre/gui2/store/wizards_tower_books_plugin.py b/src/calibre/gui2/store/wizards_tower_books_plugin.py index c17ea2ca64..90966fc06a 100644 --- a/src/calibre/gui2/store/wizards_tower_books_plugin.py +++ b/src/calibre/gui2/store/wizards_tower_books_plugin.py @@ -44,40 +44,70 @@ class WizardsTowerBooksStore(BasicStoreConfig, StorePlugin): counter = max_results with closing(br.open(url, timeout=timeout)) as f: doc = html.fromstring(f.read()) - for data in doc.xpath('//table[@class="gridp"]//td'): - if counter <= 0: - break - - id = ''.join(data.xpath('.//span[@class="prti"]/a/@href')) - id = id.strip() - if not id: - continue - - cover_url = ''.join(data.xpath('.//div[@class="prim"]/a/img/@src')) - cover_url = url_slash_cleaner(self.url + cover_url.strip()) - - price = ''.join(data.xpath('.//font[@class="selling_price"]//text()')) - price = price.strip() - if not price: - continue - - title = ''.join(data.xpath('.//span[@class="prti"]/a/b/text()')) - author = ''.join(data.xpath('.//p[@class="last"]/text()')) - a, b, author = author.partition(' by ') - - counter -= 1 - + if 'search.html' in f.geturl(): + for data in doc.xpath('//table[@class="gridp"]//td'): + if counter <= 0: + break + + id = ''.join(data.xpath('.//span[@class="prti"]/a/@href')) + id = id.strip() + if not id: + continue + + cover_url = ''.join(data.xpath('.//div[@class="prim"]/a/img/@src')) + cover_url = url_slash_cleaner(self.url + cover_url.strip()) + + price = ''.join(data.xpath('.//font[@class="selling_price"]//text()')) + price = price.strip() + if not price: + continue + + title = ''.join(data.xpath('.//span[@class="prti"]/a/b/text()')) + author = ''.join(data.xpath('.//p[@class="last"]/text()')) + a, b, author = author.partition(' by ') + + counter -= 1 + + s = SearchResult() + s.cover_url = cover_url + s.title = title.strip() + s.author = author.strip() + s.price = price.strip() + s.detail_item = id.strip() + s.drm = SearchResult.DRM_UNLOCKED + + yield s + # Exact match brought us to the books detail page. + else: s = SearchResult() - s.cover_url = cover_url - s.title = title.strip() - s.author = author.strip() - s.price = price.strip() - s.detail_item = id.strip() + + cover_url = ''.join(doc.xpath('//div[@id="image"]/a/img[@title="Zoom"]/@src')).strip() + s.cover_url = url_slash_cleaner(self.url + cover_url.strip()) + + s.title = ''.join(doc.xpath('//form[@name="details"]/h1/text()')).strip() + + authors = doc.xpath('//p[contains(., "Author:")]//text()') + author_index = None + for i, a in enumerate(authors): + if 'author' in a.lower(): + author_index = i + 1 + break + if author_index is not None and len(authors) > author_index: + a = authors[author_index] + a = a.replace(u'\xa0', '') + s.author = a.strip() + + s.price = ''.join(doc.xpath('//span[@id="price_selling"]//text()')).strip() + s.detail_item = f.geturl().replace(self.url, '').strip() + s.formats = ', '.join(doc.xpath('//select[@id="N1_"]//option//text()')) s.drm = SearchResult.DRM_UNLOCKED - + yield s def get_details(self, search_result, timeout): + if search_result.formats: + return False + br = browser() with closing(br.open(url_slash_cleaner(self.url + search_result.detail_item), timeout=timeout)) as nf: idata = html.fromstring(nf.read())