diff --git a/src/calibre/gui2/store/stores/smashwords_plugin.py b/src/calibre/gui2/store/stores/smashwords_plugin.py index 6afad19265..3b28142e7f 100644 --- a/src/calibre/gui2/store/stores/smashwords_plugin.py +++ b/src/calibre/gui2/store/stores/smashwords_plugin.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import (unicode_literals, division, absolute_import, print_function) -store_version = 2 # Needed for dynamic plugin loading +store_version = 3 # Needed for dynamic plugin loading __license__ = 'GPL 3' __copyright__ = '2011, John Schember ' @@ -23,6 +23,54 @@ from calibre.gui2.store.basic_config import BasicStoreConfig from calibre.gui2.store.search_result import SearchResult from calibre.gui2.store.web_store_dialog import WebStoreDialog +def search(query, max_results=10, timeout=60): + url = 'http://www.smashwords.com/books/search?query=' + urllib2.quote(query) + + br = browser() + + counter = max_results + with closing(br.open(url, timeout=timeout)) as f: + doc = html.fromstring(f.read()) + for data in doc.xpath('//div[@id="pageContent"]//div[@class="library-book"]'): + if counter <= 0: + break + data = html.fromstring(html.tostring(data)) + + id = None + id_a = ''.join(data.xpath('//a[contains(@class, "library-title")]/@href')) + if id_a: + id = id_a.split('/')[-1] + if not id: + continue + + cover_url = ''.join(data.xpath('//img[contains(@class, "book-list-image")]/@src')) + + title = ''.join(data.xpath('.//a[contains(@class, "library-title")]/text()')) + author = ''.join(data.xpath('.//a[@itemprop="author"]//text()')) + + price = ''.join(data.xpath('.//div[@class="subnote"]//text()')) + if 'Price:' in price: + try: + price = price.partition('Price:')[2] + price = re.sub('\s', ' ', price).strip() + price = price.split(' ')[0].strip() + except Exception: + price = 'Unknown' + if price == 'Free!': + price = '$0.00' + + counter -= 1 + + s = SearchResult() + s.cover_url = cover_url + s.title = title.strip() + s.author = author.strip() + s.price = price + s.detail_item = '/books/view/' + id.strip() + s.drm = SearchResult.DRM_UNLOCKED + + yield s + class SmashwordsStore(BasicStoreConfig, StorePlugin): def open(self, parent=None, detail_item=None, external=False): @@ -47,51 +95,8 @@ class SmashwordsStore(BasicStoreConfig, StorePlugin): d.exec_() def search(self, query, max_results=10, timeout=60): - url = 'http://www.smashwords.com/books/search?query=' + urllib2.quote(query) - - br = browser() - - counter = max_results - with closing(br.open(url, timeout=timeout)) as f: - doc = html.fromstring(f.read()) - for data in doc.xpath('//div[@id="pageCenterContent"]//div[@class="library-book"]'): - if counter <= 0: - break - data = html.fromstring(html.tostring(data)) - - id = None - id_a = ''.join(data.xpath('//a[contains(@class, "library-title")]/@href')) - if id_a: - id = id_a.split('/')[-1] - if not id: - continue - - cover_url = ''.join(data.xpath('//img[contains(@class, "book-list-image")]/@src')) - - title = ''.join(data.xpath('.//a[contains(@class, "library-title")]/text()')) - author = ''.join(data.xpath('.//div[@class="subnote"]//a[1]//text()')) - - price = ''.join(data.xpath('.//div[@class="subnote"]//text()')) - if 'Price:' in price: - try: - price = price.partition('Price:')[2] - price = re.sub('\s', ' ', price).strip() - price = price.split(' ')[0] - price = price.strip() - except: - price = 'Unknown' - - counter -= 1 - - s = SearchResult() - s.cover_url = cover_url - s.title = title.strip() - s.author = author.strip() - s.price = price.strip() - s.detail_item = '/books/view/' + id.strip() - s.drm = SearchResult.DRM_UNLOCKED - - yield s + for a in search(query, max_results=max_results, timeout=timeout): + yield a def get_details(self, search_result, timeout): url = 'http://www.smashwords.com/' @@ -101,3 +106,8 @@ class SmashwordsStore(BasicStoreConfig, StorePlugin): idata = html.fromstring(nf.read()) search_result.formats = ', '.join(list(set(idata.xpath('//p//abbr//text()')))) return True + +if __name__ == '__main__': + import sys + for r in search(sys.argv[-1]): + print(r)