mirror of
				https://github.com/kovidgoyal/calibre.git
				synced 2025-11-04 03:27:00 -05:00 
			
		
		
		
	First iteration of waterstones store plugin
This commit is contained in:
		
							parent
							
								
									5398c0fc64
								
							
						
					
					
						commit
						335b933c2b
					
				@ -1179,11 +1179,17 @@ class StoreSmashwordsStore(StoreBase):
 | 
				
			|||||||
    description = _('Your ebook. Your way.')
 | 
					    description = _('Your ebook. Your way.')
 | 
				
			||||||
    actual_plugin = 'calibre.gui2.store.smashwords_plugin:SmashwordsStore'
 | 
					    actual_plugin = 'calibre.gui2.store.smashwords_plugin:SmashwordsStore'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class StoreWaterstonesUKStore(StoreBase):
 | 
				
			||||||
 | 
					    name = 'Waterstones UK'
 | 
				
			||||||
 | 
					    description = _('Feel every word')
 | 
				
			||||||
 | 
					    actual_plugin = 'calibre.gui2.store.waterstones_uk_plugin:WaterstonesUKStore'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
plugins += [StoreAmazonKindleStore, StoreAmazonUKKindleStore,
 | 
					plugins += [StoreAmazonKindleStore, StoreAmazonUKKindleStore,
 | 
				
			||||||
    StoreBaenWebScriptionStore, StoreBNStore,
 | 
					    StoreBaenWebScriptionStore, StoreBNStore,
 | 
				
			||||||
    StoreBeWriteStore, StoreDieselEbooksStore, StoreEbookscomStore,
 | 
					    StoreBeWriteStore, StoreDieselEbooksStore, StoreEbookscomStore,
 | 
				
			||||||
    StoreEHarlequinStoretore,
 | 
					    StoreEHarlequinStoretore,
 | 
				
			||||||
    StoreFeedbooksStore, StoreGutenbergStore, StoreKoboStore, StoreManyBooksStore,
 | 
					    StoreFeedbooksStore, StoreGutenbergStore, StoreKoboStore, StoreManyBooksStore,
 | 
				
			||||||
    StoreMobileReadStore, StoreOpenLibraryStore, StoreSmashwordsStore]
 | 
					    StoreMobileReadStore, StoreOpenLibraryStore, StoreSmashwordsStore,
 | 
				
			||||||
 | 
					    StoreWaterstonesUKStore]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# }}}
 | 
					# }}}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										73
									
								
								src/calibre/gui2/store/waterstones_uk_plugin.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								src/calibre/gui2/store/waterstones_uk_plugin.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,73 @@
 | 
				
			|||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from __future__ import (unicode_literals, division, absolute_import, print_function)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__license__ = 'GPL 3'
 | 
				
			||||||
 | 
					__copyright__ = '2011, John Schember <john@nachtimwald.com>'
 | 
				
			||||||
 | 
					__docformat__ = 'restructuredtext en'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import random
 | 
				
			||||||
 | 
					import re
 | 
				
			||||||
 | 
					import urllib2
 | 
				
			||||||
 | 
					from contextlib import closing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from lxml import html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from PyQt4.Qt import QUrl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from calibre import browser, url_slash_cleaner
 | 
				
			||||||
 | 
					from calibre.gui2 import open_url
 | 
				
			||||||
 | 
					from calibre.gui2.store import StorePlugin
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class WaterstonesUKStore(BasicStoreConfig, StorePlugin):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def open(self, parent=None, detail_item=None, external=False):
 | 
				
			||||||
 | 
					        url = 'http://clkuk.tradedoubler.com/click?p=51196&a=1951604&g=19333484'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if external or self.config.get('open_external', False):
 | 
				
			||||||
 | 
					            if detail_item:
 | 
				
			||||||
 | 
					                url = url + detail_item
 | 
				
			||||||
 | 
					            open_url(QUrl(url_slash_cleaner(url)))
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            detail_url = None
 | 
				
			||||||
 | 
					            if detail_item:
 | 
				
			||||||
 | 
					                detail_url = url + detail_item
 | 
				
			||||||
 | 
					            d = WebStoreDialog(self.gui, url, parent, detail_url)
 | 
				
			||||||
 | 
					            d.setWindowTitle(self.name)
 | 
				
			||||||
 | 
					            d.set_tags(self.config.get('tags', ''))
 | 
				
			||||||
 | 
					            d.exec_()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def search(self, query, max_results=10, timeout=60):
 | 
				
			||||||
 | 
					        url = 'http://www.waterstones.com/waterstonesweb/advancedSearch.do?buttonClicked=1&format=3757&bookkeywords=' + 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[contains(@class, "results-pane")]'):
 | 
				
			||||||
 | 
					                print('here')
 | 
				
			||||||
 | 
					                if counter <= 0:
 | 
				
			||||||
 | 
					                    break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                cover_url = ''.join(data.xpath('.//div[@class="image"]/a/img/@src'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                title = ''.join(data.xpath('./div/div/h2/a/text()'))
 | 
				
			||||||
 | 
					                author = ', '.join(data.xpath('.//p[@class="byAuthor"]/a/text()'))
 | 
				
			||||||
 | 
					                price = ''.join(data.xpath('.//p[@class="price"]/span[@class="priceStandard"]/text()'))
 | 
				
			||||||
 | 
					                print(title, author, price)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                counter -= 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                s = SearchResult()
 | 
				
			||||||
 | 
					                s.cover_url = cover_url
 | 
				
			||||||
 | 
					                s.title = title.strip()
 | 
				
			||||||
 | 
					                s.author = author.strip()
 | 
				
			||||||
 | 
					                s.price = price
 | 
				
			||||||
 | 
					                s.drm = SearchResult.DRM_LOCKED
 | 
				
			||||||
 | 
					                s.formats = 'EPUB'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                yield s
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user