From 2e2042d1fbeb92cc36647ee23d6daf735e2f187b Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 20 Mar 2012 13:59:05 +0100 Subject: [PATCH 01/13] Maintenance on amazon Europe to account for UTF8 and site changes. Maintenance on Waterstones and Foyles to account for site changes. Waterstones said that they would not pay commissions on ebooks, but they are in fact paying them. Turn on the affiliate flag. --- src/calibre/customize/builtins.py | 1 + src/calibre/gui2/store/stores/amazon_de_plugin.py | 8 +++++--- src/calibre/gui2/store/stores/amazon_es_plugin.py | 8 +++++--- src/calibre/gui2/store/stores/amazon_fr_plugin.py | 6 +++--- src/calibre/gui2/store/stores/amazon_it_plugin.py | 8 +++++--- src/calibre/gui2/store/stores/amazon_uk_plugin.py | 7 ++++--- src/calibre/gui2/store/stores/foyles_uk_plugin.py | 4 ---- src/calibre/gui2/store/stores/waterstones_uk_plugin.py | 2 +- 8 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 55742b3ee3..13cc2a6a33 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -1538,6 +1538,7 @@ class StoreWaterstonesUKStore(StoreBase): headquarters = 'UK' formats = ['EPUB', 'PDF'] + affiliate = True class StoreWeightlessBooksStore(StoreBase): name = 'Weightless Books' diff --git a/src/calibre/gui2/store/stores/amazon_de_plugin.py b/src/calibre/gui2/store/stores/amazon_de_plugin.py index ea92839268..c42c7392a1 100644 --- a/src/calibre/gui2/store/stores/amazon_de_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_de_plugin.py @@ -41,7 +41,9 @@ class AmazonDEKindleStore(StorePlugin): counter = max_results with closing(br.open(url, timeout=timeout)) as f: - doc = html.fromstring(f.read().decode('latin-1', 'replace')) + # doc = html.fromstring(f.read().decode('latin-1', 'replace')) + # Apparently amazon Europe is responding in UTF-8 now + doc = html.fromstring(f.read()) data_xpath = '//div[contains(@class, "result") and contains(@class, "product")]' format_xpath = './/span[@class="format"]/text()' @@ -65,8 +67,8 @@ class AmazonDEKindleStore(StorePlugin): cover_url = ''.join(data.xpath(cover_xpath)) - title = ''.join(data.xpath('.//div[@class="title"]/a/text()')) - price = ''.join(data.xpath('.//div[@class="newPrice"]/span/text()')) + title = ''.join(data.xpath('.//a[@class="title"]/text()')) + price = ''.join(data.xpath('.//span[@class="price"]/text()')) author = ''.join(data.xpath('.//div[@class="title"]/span[@class="ptBrand"]/text()')) if author.startswith('von '): diff --git a/src/calibre/gui2/store/stores/amazon_es_plugin.py b/src/calibre/gui2/store/stores/amazon_es_plugin.py index d89c051d87..97abab61ed 100644 --- a/src/calibre/gui2/store/stores/amazon_es_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_es_plugin.py @@ -37,7 +37,9 @@ class AmazonESKindleStore(StorePlugin): counter = max_results with closing(br.open(url, timeout=timeout)) as f: - doc = html.fromstring(f.read().decode('latin-1', 'replace')) + # doc = html.fromstring(f.read().decode('latin-1', 'replace')) + # Apparently amazon Europe is responding in UTF-8 now + doc = html.fromstring(f.read()) data_xpath = '//div[contains(@class, "result") and contains(@class, "product")]' format_xpath = './/span[@class="format"]/text()' @@ -61,8 +63,8 @@ class AmazonESKindleStore(StorePlugin): cover_url = ''.join(data.xpath(cover_xpath)) - title = ''.join(data.xpath('.//div[@class="title"]/a/text()')) - price = ''.join(data.xpath('.//div[@class="newPrice"]/span/text()')) + title = ''.join(data.xpath('.//a[@class="title"]/text()')) + price = ''.join(data.xpath('.//span[@class="price"]/text()')) author = unicode(''.join(data.xpath('.//div[@class="title"]/span[@class="ptBrand"]/text()'))) if author.startswith('de '): author = author[3:] diff --git a/src/calibre/gui2/store/stores/amazon_fr_plugin.py b/src/calibre/gui2/store/stores/amazon_fr_plugin.py index ea4c80e50d..b98ba06117 100644 --- a/src/calibre/gui2/store/stores/amazon_fr_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_fr_plugin.py @@ -39,7 +39,7 @@ class AmazonFRKindleStore(StorePlugin): counter = max_results with closing(br.open(url, timeout=timeout)) as f: # doc = html.fromstring(f.read().decode('latin-1', 'replace')) - # Apparently amazon.fr is responding in UTF-8 now + # Apparently amazon Europe is responding in UTF-8 now doc = html.fromstring(f.read()) data_xpath = '//div[contains(@class, "result") and contains(@class, "product")]' @@ -64,8 +64,8 @@ class AmazonFRKindleStore(StorePlugin): cover_url = ''.join(data.xpath(cover_xpath)) - title = ''.join(data.xpath('.//div[@class="title"]/a/text()')) - price = ''.join(data.xpath('.//div[@class="newPrice"]/span/text()')) + title = ''.join(data.xpath('.//a[@class="title"]/text()')) + price = ''.join(data.xpath('.//span[@class="price"]/text()')) author = unicode(''.join(data.xpath('.//div[@class="title"]/span[@class="ptBrand"]/text()'))) if author.startswith('de '): author = author[3:] diff --git a/src/calibre/gui2/store/stores/amazon_it_plugin.py b/src/calibre/gui2/store/stores/amazon_it_plugin.py index c62273deeb..23cde51555 100644 --- a/src/calibre/gui2/store/stores/amazon_it_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_it_plugin.py @@ -37,7 +37,9 @@ class AmazonITKindleStore(StorePlugin): counter = max_results with closing(br.open(url, timeout=timeout)) as f: - doc = html.fromstring(f.read().decode('latin-1', 'replace')) + # doc = html.fromstring(f.read().decode('latin-1', 'replace')) + # Apparently amazon Europe is responding in UTF-8 now + doc = html.fromstring(f.read()) data_xpath = '//div[contains(@class, "result") and contains(@class, "product")]' format_xpath = './/span[@class="format"]/text()' @@ -61,8 +63,8 @@ class AmazonITKindleStore(StorePlugin): cover_url = ''.join(data.xpath(cover_xpath)) - title = ''.join(data.xpath('.//div[@class="title"]/a/text()')) - price = ''.join(data.xpath('.//div[@class="newPrice"]/span/text()')) + title = ''.join(data.xpath('.//a[@class="title"]/text()')) + price = ''.join(data.xpath('.//span[@class="price"]/text()')) author = unicode(''.join(data.xpath('.//div[@class="title"]/span[@class="ptBrand"]/text()'))) if author.startswith('di '): author = author[3:] diff --git a/src/calibre/gui2/store/stores/amazon_uk_plugin.py b/src/calibre/gui2/store/stores/amazon_uk_plugin.py index ef15951d50..0d063a4a6e 100644 --- a/src/calibre/gui2/store/stores/amazon_uk_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_uk_plugin.py @@ -38,7 +38,8 @@ class AmazonUKKindleStore(StorePlugin): counter = max_results with closing(br.open(url, timeout=timeout)) as f: - doc = html.fromstring(f.read().decode('latin-1', 'replace')) + # Apparently amazon Europe is responding in UTF-8 now + doc = html.fromstring(f.read()) data_xpath = '//div[contains(@class, "result") and contains(@class, "product")]' format_xpath = './/span[@class="format"]/text()' @@ -62,8 +63,8 @@ class AmazonUKKindleStore(StorePlugin): cover_url = ''.join(data.xpath(cover_xpath)) - title = ''.join(data.xpath('.//div[@class="title"]/a/text()')) - price = ''.join(data.xpath('.//div[@class="newPrice"]/span/text()')) + title = ''.join(data.xpath('.//a[@class="title"]/text()')) + price = ''.join(data.xpath('.//span[@class="price"]/text()')) author = ''.join(data.xpath('.//div[@class="title"]/span[@class="ptBrand"]/text()')) if author.startswith('by '): diff --git a/src/calibre/gui2/store/stores/foyles_uk_plugin.py b/src/calibre/gui2/store/stores/foyles_uk_plugin.py index 0e5ccfad01..c7c236d200 100644 --- a/src/calibre/gui2/store/stores/foyles_uk_plugin.py +++ b/src/calibre/gui2/store/stores/foyles_uk_plugin.py @@ -60,10 +60,6 @@ class FoylesUKStore(BasicStoreConfig, StorePlugin): continue cover_url = ''.join(data.xpath('.//a[@class="Jacket"]/img/@src')) - if cover_url: - cover_url = 'http://www.foyles.co.uk' + cover_url - #print(cover_url) - title = ''.join(data.xpath('.//a[@class="Title"]/text()')) author = ', '.join(data.xpath('.//span[@class="Author"]/text()')) price = ''.join(data.xpath('./ul/li[@class="Strong"]/text()')) diff --git a/src/calibre/gui2/store/stores/waterstones_uk_plugin.py b/src/calibre/gui2/store/stores/waterstones_uk_plugin.py index a5065128ba..df17372d0a 100644 --- a/src/calibre/gui2/store/stores/waterstones_uk_plugin.py +++ b/src/calibre/gui2/store/stores/waterstones_uk_plugin.py @@ -57,7 +57,7 @@ class WaterstonesUKStore(BasicStoreConfig, StorePlugin): 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()')) + price = ''.join(data.xpath('.//p[@class="price"]/span[@class="priceRed2"]/text()')) drm = data.xpath('boolean(.//td[@headers="productFormat" and contains(., "DRM")])') pdf = data.xpath('boolean(.//td[@headers="productFormat" and contains(., "PDF")])') epub = data.xpath('boolean(.//td[@headers="productFormat" and contains(., "EPUB")])') From b5e519b560e32156bab0e7ef1e27e77b9c458fb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20D=C5=82ugosz?= Date: Tue, 20 Mar 2012 21:53:29 +0100 Subject: [PATCH 02/13] empik no longer declines its participation in Calibre --- src/calibre/gui2/store/declined.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/calibre/gui2/store/declined.txt b/src/calibre/gui2/store/declined.txt index bd2aa296bd..b109d30d50 100644 --- a/src/calibre/gui2/store/declined.txt +++ b/src/calibre/gui2/store/declined.txt @@ -5,4 +5,3 @@ or asked not to be included in the store integration. * Indigo (http://www.chapters.indigo.ca/). * Libraria Rizzoli (http://libreriarizzoli.corriere.it/). * EPubBuy DE: reason: too much traffic for too little sales -* Empik (http://empik.com.pl). From 36de96f3fa02456f00b1fcc3f33000984a81fe6e Mon Sep 17 00:00:00 2001 From: John Schember Date: Tue, 20 Mar 2012 21:08:33 -0400 Subject: [PATCH 03/13] Store: Fix B&N and Diesel. Enhance Kobo. Remove Wizards Tower as they removed search from their site. --- src/calibre/customize/builtins.py | 10 -- src/calibre/gui2/store/stores/bn_plugin.py | 2 +- .../gui2/store/stores/diesel_ebooks_plugin.py | 39 +++--- src/calibre/gui2/store/stores/kobo_plugin.py | 2 +- .../stores/wizards_tower_books_plugin.py | 118 ------------------ 5 files changed, 18 insertions(+), 153 deletions(-) delete mode 100644 src/calibre/gui2/store/stores/wizards_tower_books_plugin.py diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 55742b3ee3..db56bf351f 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -1557,15 +1557,6 @@ class StoreWHSmithUKStore(StoreBase): headquarters = 'UK' formats = ['EPUB', 'PDF'] -class StoreWizardsTowerBooksStore(StoreBase): - name = 'Wizards Tower Books' - description = u'A science fiction and fantasy publisher. Concentrates mainly on making out-of-print works available once more as e-books, and helping other small presses exploit the e-book market. Also publishes a small number of limited-print-run anthologies with a view to encouraging diversity in the science fiction and fantasy field.' - actual_plugin = 'calibre.gui2.store.stores.wizards_tower_books_plugin:WizardsTowerBooksStore' - - drm_free_only = True - headquarters = 'UK' - formats = ['EPUB', 'MOBI'] - class StoreWoblinkStore(StoreBase): name = 'Woblink' author = u'Tomasz Długosz' @@ -1636,7 +1627,6 @@ plugins += [ StoreWaterstonesUKStore, StoreWeightlessBooksStore, StoreWHSmithUKStore, - StoreWizardsTowerBooksStore, StoreWoblinkStore, XinXiiStore, StoreZixoStore diff --git a/src/calibre/gui2/store/stores/bn_plugin.py b/src/calibre/gui2/store/stores/bn_plugin.py index aa30ffe677..ab3d39264f 100644 --- a/src/calibre/gui2/store/stores/bn_plugin.py +++ b/src/calibre/gui2/store/stores/bn_plugin.py @@ -62,7 +62,7 @@ class BNStore(BasicStoreConfig, StorePlugin): title = ''.join(data.xpath('.//p[@class="title"]//span[@class="name"]/text()')) author = ', '.join(data.xpath('.//ul[@class="contributors"]//li[position()>1]//a/text()')) - price = ''.join(data.xpath('.//table[@class="displayed-formats"]//a[@class="subtle"]/text()')) + price = ''.join(data.xpath('.//table[@class="displayed-formats"]//a[contains(@class, "bn-price")]/text()')) counter -= 1 diff --git a/src/calibre/gui2/store/stores/diesel_ebooks_plugin.py b/src/calibre/gui2/store/stores/diesel_ebooks_plugin.py index a6876f8840..ba2ba28475 100644 --- a/src/calibre/gui2/store/stores/diesel_ebooks_plugin.py +++ b/src/calibre/gui2/store/stores/diesel_ebooks_plugin.py @@ -7,7 +7,8 @@ __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' import random -import urllib2 +import re +import urllib from contextlib import closing from lxml import html @@ -33,7 +34,7 @@ class DieselEbooksStore(BasicStoreConfig, StorePlugin): detail_url = None if detail_item: - detail_url = url + detail_item + aff_id + detail_url = detail_item + aff_id url = url + aff_id if external or self.config.get('open_external', False): @@ -45,33 +46,36 @@ class DieselEbooksStore(BasicStoreConfig, StorePlugin): d.exec_() def search(self, query, max_results=10, timeout=60): - url = 'http://www.diesel-ebooks.com/index.php?page=seek&id[m]=&id[c]=scope%253Dinventory&id[q]=' + urllib2.quote(query) + url = 'http://www.diesel-ebooks.com/index.php?page=seek&id[m]=&id[c]=scope%253Dinventory&id[q]=' + urllib.quote_plus(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[@class="item clearfix"]'): - data = html.fromstring(html.tostring(data)) + for data in doc.xpath('//div[contains(@class, "item")]'): if counter <= 0: break id = ''.join(data.xpath('div[@class="cover"]/a/@href')) if not id or '/item/' not in id: continue - a, b, id = id.partition('/item/') cover_url = ''.join(data.xpath('div[@class="cover"]//img/@src')) - title = ''.join(data.xpath('.//div[@class="content"]//h2/text()')) - author = ''.join(data.xpath('//div[@class="content"]//div[@class="author"]/a/text()')) + title = ''.join(data.xpath('.//div[@class="content"]//h2/a/text()')) + author = ''.join(data.xpath('.//div[@class="content"]/span//a/text()')) price = '' - price_elem = data.xpath('//td[@class="price"]/text()') + price_elem = data.xpath('.//div[@class="price_fat"]//h1/text()') if price_elem: price = price_elem[0] - formats = ', '.join(data.xpath('.//td[@class="format"]/text()')) + formats = ', '.join(data.xpath('.//div[@class="book-info"]//text()')).strip() + a, b, formats = formats.partition('Format:') + drm = SearchResult.DRM_LOCKED + if 'drm free' not in formats.lower(): + drm = SearchResult.DRM_UNLOCKED + counter -= 1 @@ -80,19 +84,8 @@ class DieselEbooksStore(BasicStoreConfig, StorePlugin): s.title = title.strip() s.author = author.strip() s.price = price.strip() - s.detail_item = '/item/' + id.strip() + s.detail_item = id.strip() s.formats = formats + s.drm = drm yield s - - def get_details(self, search_result, timeout): - url = 'http://www.diesel-ebooks.com/item/' - - br = browser() - with closing(br.open(url + search_result.detail_item, timeout=timeout)) as nf: - idata = html.fromstring(nf.read()) - if idata.xpath('boolean(//table[@class="format-info"]//tr[contains(th, "DRM") and contains(td, "No")])'): - search_result.drm = SearchResult.DRM_UNLOCKED - else: - search_result.drm = SearchResult.DRM_LOCKED - return True diff --git a/src/calibre/gui2/store/stores/kobo_plugin.py b/src/calibre/gui2/store/stores/kobo_plugin.py index 9ec0e4b786..249d59ec5c 100644 --- a/src/calibre/gui2/store/stores/kobo_plugin.py +++ b/src/calibre/gui2/store/stores/kobo_plugin.py @@ -68,7 +68,7 @@ class KoboStore(BasicStoreConfig, StorePlugin): cover_url = ''.join(data.xpath('.//div[@class="SearchImageContainer"]//img[1]/@src')) title = ''.join(data.xpath('.//div[@class="SCItemHeader"]/h1/a[1]/text()')) - author = ''.join(data.xpath('.//div[@class="SCItemSummary"]/span/a[1]/text()')) + author = ', '.join(data.xpath('.//div[@class="SCItemSummary"]//span//a/text()')) drm = data.xpath('boolean(.//span[@class="SCAvailibilityFormatsText" and contains(text(), "DRM")])') counter -= 1 diff --git a/src/calibre/gui2/store/stores/wizards_tower_books_plugin.py b/src/calibre/gui2/store/stores/wizards_tower_books_plugin.py deleted file mode 100644 index 90966fc06a..0000000000 --- a/src/calibre/gui2/store/stores/wizards_tower_books_plugin.py +++ /dev/null @@ -1,118 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import (unicode_literals, division, absolute_import, print_function) - -__license__ = 'GPL 3' -__copyright__ = '2011, John Schember ' -__docformat__ = 'restructuredtext en' - -import urllib -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 WizardsTowerBooksStore(BasicStoreConfig, StorePlugin): - - url = 'http://www.wizardstowerbooks.com/' - - def open(self, parent=None, detail_item=None, external=False): - if detail_item: - detail_item = self.url + detail_item - - if external or self.config.get('open_external', False): - open_url(QUrl(url_slash_cleaner(detail_item))) - else: - d = WebStoreDialog(self.gui, self.url, parent, detail_item) - 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.wizardstowerbooks.com/search.html?for=' + urllib.quote(query) - - br = browser() - - counter = max_results - with closing(br.open(url, timeout=timeout)) as f: - doc = html.fromstring(f.read()) - 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() - - 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()) - - formats = ', '.join(idata.xpath('//select[@id="N1_"]//option//text()')) - search_result.formats = formats.upper() - - return True From 632ae65855f1c14b75b74e0812c9a875d19af6c5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 21 Mar 2012 08:52:11 +0530 Subject: [PATCH 04/13] Updated various Polish recipes --- recipes/android_com_pl.recipe | 1 + recipes/cgm_pl.recipe | 13 ++++++++----- recipes/elektroda_pl.recipe | 16 ++++++++++++++++ recipes/film_web.recipe | 2 +- recipes/gram_pl.recipe | 36 ++++++++++++++++++++++++++++++++--- recipes/naczytniki.recipe | 6 +++--- recipes/overclock_pl.recipe | 23 +++++----------------- recipes/palmtop_pl.recipe | 4 +++- recipes/pc_arena.recipe | 36 +++++++++++++++-------------------- recipes/pc_centre_pl.recipe | 35 +++++++--------------------------- recipes/tablety_pl.recipe | 7 ++++--- recipes/wnp.recipe | 9 +++++++-- 12 files changed, 103 insertions(+), 85 deletions(-) diff --git a/recipes/android_com_pl.recipe b/recipes/android_com_pl.recipe index a44d5e560a..c7a4a97d3c 100644 --- a/recipes/android_com_pl.recipe +++ b/recipes/android_com_pl.recipe @@ -6,6 +6,7 @@ class Android_com_pl(BasicNewsRecipe): description = 'Android.com.pl - biggest polish Android site' category = 'Android, mobile' language = 'pl' + use_embedded_content=True cover_url =u'http://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Android_robot.svg/220px-Android_robot.svg.png' oldest_article = 8 max_articles_per_feed = 100 diff --git a/recipes/cgm_pl.recipe b/recipes/cgm_pl.recipe index 673a9f940b..4ab4402c3a 100644 --- a/recipes/cgm_pl.recipe +++ b/recipes/cgm_pl.recipe @@ -1,4 +1,5 @@ from calibre.web.feeds.news import BasicNewsRecipe +from calibre.ebooks.BeautifulSoup import BeautifulSoup class CGM(BasicNewsRecipe): title = u'CGM' @@ -17,9 +18,9 @@ class CGM(BasicNewsRecipe): remove_tags_before=dict(id='mainContent') remove_tags_after=dict(name='div', attrs={'class':'fbContainer'}) remove_tags=[dict(name='div', attrs={'class':'fbContainer'}), - dict(name='p', attrs={'class':['tagCloud', 'galleryAuthor']}), - dict(id=['movieShare', 'container'])] - feeds = [(u'Informacje', u'http://www.cgm.pl/rss.xml'), (u'Polecamy', u'http://www.cgm.pl/rss,4,news.xml'), + dict(name='p', attrs={'class':['tagCloud', 'galleryAuthor']}), + dict(id=['movieShare', 'container'])] + feeds = [(u'Informacje', u'http://www.cgm.pl/rss.xml'), (u'Polecamy', u'http://www.cgm.pl/rss,4,news.xml'), (u'Recenzje', u'http://www.cgm.pl/rss,1,news.xml')] @@ -33,10 +34,12 @@ class CGM(BasicNewsRecipe): img='http://www.cgm.pl'+img[img.find('url(')+4:img.find(')')] gallery.contents[1].name='img' gallery.contents[1]['src']=img + pos = len(gallery.contents) + gallery.insert(pos, BeautifulSoup('
')) for item in soup.findAll(style=True): del item['style'] ad=soup.findAll('a') for r in ad: - if 'www.hustla.pl' in r['href'] or 'www.ebilet.pl' in r['href']: + if 'www.hustla.pl' in r['href'] or 'www.ebilet.pl' in r['href']: r.extract() - return soup \ No newline at end of file + return soup diff --git a/recipes/elektroda_pl.recipe b/recipes/elektroda_pl.recipe index c2123cb8cf..55858020ad 100644 --- a/recipes/elektroda_pl.recipe +++ b/recipes/elektroda_pl.recipe @@ -1,4 +1,5 @@ from calibre.web.feeds.news import BasicNewsRecipe +from calibre.ebooks.BeautifulSoup import BeautifulSoup class Elektroda(BasicNewsRecipe): title = u'Elektroda' @@ -13,3 +14,18 @@ class Elektroda(BasicNewsRecipe): remove_tags_after=dict(name='td', attrs={'class':'spaceRow'}) remove_tags=[dict(name='a', attrs={'href':'#top'})] feeds = [(u'Elektroda', u'http://www.elektroda.pl/rtvforum/rss.php')] + + + def preprocess_html(self, soup): + tag=soup.find('span', attrs={'class':'postbody'}) + if tag: + pos = len(tag.contents) + tag.insert(pos, BeautifulSoup('
')) + return soup + + def parse_feeds (self): + feeds = BasicNewsRecipe.parse_feeds(self) + for feed in feeds: + for article in feed.articles[:]: + article.title=article.title[article.title.find("::")+3:] + return feeds diff --git a/recipes/film_web.recipe b/recipes/film_web.recipe index 0671deec6c..877d4472bc 100644 --- a/recipes/film_web.recipe +++ b/recipes/film_web.recipe @@ -13,7 +13,7 @@ class Filmweb_pl(BasicNewsRecipe): remove_empty_feeds=True extra_css = '.hdrBig {font-size:22px;} ul {list-style-type:none; padding: 0; margin: 0;}' remove_tags= [dict(name='div', attrs={'class':['recommendOthers']}), dict(name='ul', attrs={'class':'fontSizeSet'})] - keep_only_tags= [dict(name='h1', attrs={'class':'hdrBig'}), dict(name='div', attrs={'class':['newsInfo', 'reviewContent fontSizeCont description']})] + keep_only_tags= [dict(name='h1', attrs={'class':['hdrBig', 'hdrEntity']}), dict(name='div', attrs={'class':['newsInfo', 'newsInfoSmall', 'reviewContent description']})] feeds = [(u'Wszystkie newsy', u'http://www.filmweb.pl/feed/news/latest'), (u'News / Filmy w produkcji', 'http://www.filmweb.pl/feed/news/category/filminproduction'), (u'News / Festiwale, nagrody i przeglądy', u'http://www.filmweb.pl/feed/news/category/festival'), diff --git a/recipes/gram_pl.recipe b/recipes/gram_pl.recipe index c8655dc9cd..07927796c0 100644 --- a/recipes/gram_pl.recipe +++ b/recipes/gram_pl.recipe @@ -9,12 +9,12 @@ class Gram_pl(BasicNewsRecipe): oldest_article = 8 max_articles_per_feed = 100 no_stylesheets= True - extra_css = 'h2 {font-style: italic; font-size:20px;}' + extra_css = 'h2 {font-style: italic; font-size:20px;} .picbox div {float: left;}' cover_url=u'http://www.gram.pl/www/01/img/grampl_zima.png' remove_tags= [dict(name='p', attrs={'class':['extraText', 'must-log-in']}), dict(attrs={'class':['el', 'headline', 'post-info']}), dict(name='div', attrs={'class':['twojaOcena', 'comment-body', 'comment-author vcard', 'comment-meta commentmetadata', 'tw_button']}), dict(id=['igit_rpwt_css', 'comments', 'reply-title', 'igit_title'])] keep_only_tags= [dict(name='div', attrs={'class':['main', 'arkh-postmetadataheader', 'arkh-postcontent', 'post', 'content', 'news_header', 'news_subheader', 'news_text']}), dict(attrs={'class':['contentheading', 'contentpaneopen']})] - feeds = [(u'gram.pl - informacje', u'http://www.gram.pl/feed_news.asp'), - (u'gram.pl - publikacje', u'http://www.gram.pl/feed_news.asp?type=articles')] + feeds = [(u'Informacje', u'http://www.gram.pl/feed_news.asp'), + (u'Publikacje', u'http://www.gram.pl/feed_news.asp?type=articles')] def parse_feeds (self): feeds = BasicNewsRecipe.parse_feeds(self) @@ -23,3 +23,33 @@ class Gram_pl(BasicNewsRecipe): if 'REKLAMA SKLEP' in article.title.upper() or u'ARTYKUŁ:' in article.title.upper(): feed.articles.remove(article) return feeds + + def append_page(self, soup, appendtag): + nexturl = appendtag.find('a', attrs={'class':'cpn'}) + while nexturl: + soup2 = self.index_to_soup('http://www.gram.pl'+ nexturl['href']) + r=appendtag.find(id='pgbox') + if r: + r.extract() + pagetext = soup2.find(attrs={'class':'main'}) + r=pagetext.find('h1') + if r: + r.extract() + r=pagetext.find('h2') + if r: + r.extract() + for r in pagetext.findAll('script'): + r.extract() + pos = len(appendtag.contents) + appendtag.insert(pos, pagetext) + nexturl = appendtag.find('a', attrs={'class':'cpn'}) + r=appendtag.find(id='pgbox') + if r: + r.extract() + + def preprocess_html(self, soup): + self.append_page(soup, soup.body) + tag=soup.findAll(name='div', attrs={'class':'picbox'}) + for t in tag: + t['style']='float: left;' + return soup \ No newline at end of file diff --git a/recipes/naczytniki.recipe b/recipes/naczytniki.recipe index 2ae6bc391e..3d1a8b6095 100644 --- a/recipes/naczytniki.recipe +++ b/recipes/naczytniki.recipe @@ -7,12 +7,12 @@ class naczytniki(BasicNewsRecipe): cover_url = 'http://naczytniki.pl/wp-content/uploads/2010/08/logo_nc28.png' language = 'pl' description ='everything about e-readers' - category='readers' + category='e-readers' no_stylesheets=True + use_embedded_content=False oldest_article = 7 max_articles_per_feed = 100 preprocess_regexps = [(re.compile(ur'


Zobacz także:

.*?', re.DOTALL), lambda match: '') ] - remove_tags_after= dict(name='div', attrs={'class':'sociable'}) keep_only_tags=[dict(name='div', attrs={'class':'post'})] remove_tags=[dict(name='span', attrs={'class':'comments'}), dict(name='div', attrs={'class':'sociable'})] - feeds = [(u'Wpisy', u'http://naczytniki.pl/?feed=rss2')] + feeds = [(u'Wpisy', u'http://naczytniki.pl/?feed=rss2')] \ No newline at end of file diff --git a/recipes/overclock_pl.recipe b/recipes/overclock_pl.recipe index d7f4c8093d..953dee67eb 100644 --- a/recipes/overclock_pl.recipe +++ b/recipes/overclock_pl.recipe @@ -17,21 +17,8 @@ class Overclock_pl(BasicNewsRecipe): remove_tags=[dict(name='span', attrs={'class':'info'}), dict(attrs={'class':'shareit'})] feeds = [(u'Aktualno\u015bci', u'http://www.overclock.pl/rss.news.xml'), (u'Testy i recenzje', u'http://www.overclock.pl/rss.articles.xml')] - - def append_page(self, soup, appendtag): - tag=soup.find(id='navigation') - if tag: - nexturl=tag.findAll('option') - tag.extract() - for nextpage in nexturl[2:]: - soup2 = self.index_to_soup(nextpage['value']) - pagetext = soup2.find(id='content') - pos = len(appendtag.contents) - appendtag.insert(pos, pagetext) - rem=appendtag.find(attrs={'alt':'Pierwsza'}) - if rem: - rem.parent.extract() - - def preprocess_html(self, soup): - self.append_page(soup, soup.body) - return soup \ No newline at end of file + def print_version(self, url): + if 'articles/show' in url: + return url.replace('show', 'showall') + else: + return url \ No newline at end of file diff --git a/recipes/palmtop_pl.recipe b/recipes/palmtop_pl.recipe index ace772e7e7..87da5d0d1c 100644 --- a/recipes/palmtop_pl.recipe +++ b/recipes/palmtop_pl.recipe @@ -10,5 +10,7 @@ class palmtop_pl(BasicNewsRecipe): oldest_article = 7 max_articles_per_feed = 100 no_stylesheets = True - + use_embedded_content=True + #remove_tags_before=dict(name='h2') + #remove_tags_after=dict(attrs={'class':'entry clearfix'}) feeds = [(u'Newsy', u'http://palmtop.pl/feed/atom/')] diff --git a/recipes/pc_arena.recipe b/recipes/pc_arena.recipe index faefeb25c0..952db30c3e 100644 --- a/recipes/pc_arena.recipe +++ b/recipes/pc_arena.recipe @@ -1,31 +1,25 @@ from calibre.web.feeds.news import BasicNewsRecipe class PC_Arena(BasicNewsRecipe): title = u'PCArena' - oldest_article = 18300 + oldest_article = 7 max_articles_per_feed = 100 __author__ = 'fenuks' description = u'Najnowsze informacje z branży IT - testy, recenzje, aktualności, rankingi, wywiady. Twoje źródło informacji o sprzęcie komputerowym.' category = 'IT' language = 'pl' - masthead_url='http://pcarena.pl/public/design/frontend/images/logo.gif' - cover_url= 'http://pcarena.pl/public/design/frontend/images/logo.gif' + masthead_url='http://pcarena.pl/pcarena/img/logo.png' + cover_url= 'http://pcarena.pl/pcarena/img/logo.png' no_stylesheets = True - keep_only_tags=[dict(attrs={'class':['artHeader', 'art']})] - remove_tags=[dict(attrs={'class':'pages'})] - feeds = [(u'Newsy', u'http://pcarena.pl/misc/rss/news'), (u'Artyku\u0142y', u'http://pcarena.pl/misc/rss/articles')] + remove_empty_feeds=True + #keep_only_tags=[dict(attrs={'class':['artHeader', 'art']})] + #remove_tags=[dict(attrs={'class':'pages'})] + feeds = [(u'Aktualności', u'http://pcarena.pl/aktualnosci/feeds.rss'), (u'Testy', u'http://pcarena.pl/testy/feeds.rss'), (u'Software', u'http://pcarena.pl/oprogramowanie/feeds.rss'), (u'Poradniki', u'http://pcarena.pl/poradniki/feeds.rss'), (u'Mobile', u'http://pcarena.pl/mobile/feeds.rss')] + + def print_version(self, url): + return url.replace('show', 'print') - def append_page(self, soup, appendtag): - tag=soup.find(name='div', attrs={'class':'pagNum'}) - if tag: - nexturl=tag.findAll('a') - tag.extract() - for nextpage in nexturl[1:]: - nextpage= 'http://pcarena.pl' + nextpage['href'] - soup2 = self.index_to_soup(nextpage) - pagetext = soup2.find(attrs={'class':'artBody'}) - pos = len(appendtag.contents) - appendtag.insert(pos, pagetext) - - def preprocess_html(self, soup): - self.append_page(soup, soup.body) - return soup \ No newline at end of file + def image_url_processor(self, baseurl, url): + if 'http' not in url: + return 'http://pcarena.pl' + url + else: + return url \ No newline at end of file diff --git a/recipes/pc_centre_pl.recipe b/recipes/pc_centre_pl.recipe index 68a17888ce..f4eccd70a0 100644 --- a/recipes/pc_centre_pl.recipe +++ b/recipes/pc_centre_pl.recipe @@ -10,32 +10,11 @@ class PC_Centre(BasicNewsRecipe): masthead_url= 'http://pccentre.pl/views/images/logo.gif' cover_url= 'http://pccentre.pl/views/images/logo.gif' no_stylesheets = True - keep_only_tags= [dict(id='content')] - remove_tags=[dict(attrs={'class':['ikony r', 'list_of_content', 'dot accordion']}), dict(id='comments')] - feeds = [(u'Publikacje', u'http://pccentre.pl/backend.php?mode=a'), (u'Aktualno\u015bci', u'http://pccentre.pl/backend.php'), (u'Sprz\u0119t komputerowy', u'http://pccentre.pl/backend.php?mode=n§ion=2'), (u'Oprogramowanie', u'http://pccentre.pl/backend.php?mode=n§ion=3'), (u'Gry komputerowe i konsole', u'http://pccentre.pl/backend.php?mode=n§ion=4'), (u'Internet', u'http://pccentre.pl/backend.php?mode=n§ion=7'), (u'Bezpiecze\u0144stwo', u'http://pccentre.pl/backend.php?mode=n§ion=5'), (u'Multimedia', u'http://pccentre.pl/backend.php?mode=n§ion=6'), (u'Biznes', u'http://pccentre.pl/backend.php?mode=n§ion=9')] + remove_empty_feeds = True + #keep_only_tags= [dict(id='content')] + #remove_tags=[dict(attrs={'class':['ikony r', 'list_of_content', 'dot accordion']}), dict(id='comments')] + remove_tags=[dict(attrs={'class':'logo_print'})] + feeds = [(u'Aktualno\u015bci', u'http://pccentre.pl/backend.php'), (u'Publikacje', u'http://pccentre.pl/backend.php?mode=a'), (u'Sprz\u0119t komputerowy', u'http://pccentre.pl/backend.php?mode=n§ion=2'), (u'Oprogramowanie', u'http://pccentre.pl/backend.php?mode=n§ion=3'), (u'Gry komputerowe i konsole', u'http://pccentre.pl/backend.php?mode=n§ion=4'), (u'Internet', u'http://pccentre.pl/backend.php?mode=n§ion=7'), (u'Bezpiecze\u0144stwo', u'http://pccentre.pl/backend.php?mode=n§ion=5'), (u'Multimedia', u'http://pccentre.pl/backend.php?mode=n§ion=6'), (u'Biznes', u'http://pccentre.pl/backend.php?mode=n§ion=9')] - - def append_page(self, soup, appendtag): - tag=soup.find(name='div', attrs={'class':'pages'}) - if tag: - nexturl=tag.findAll('a') - tag.extract() - for nextpage in nexturl[:-1]: - nextpage= 'http://pccentre.pl' + nextpage['href'] - soup2 = self.index_to_soup(nextpage) - pagetext = soup2.find(id='content') - rem=pagetext.findAll(attrs={'class':['subtitle', 'content_info', 'list_of_content', 'pages', 'social2', 'pcc_acc', 'pcc_acc_na']}) - for r in rem: - r.extract() - rem=pagetext.findAll(id='comments') - for r in rem: - r.extract() - rem=pagetext.findAll('h1') - for r in rem: - r.extract() - pos = len(appendtag.contents) - appendtag.insert(pos, pagetext) - - def preprocess_html(self, soup): - self.append_page(soup, soup.body) - return soup \ No newline at end of file + def print_version(self, url): + return url.replace('show', 'print') \ No newline at end of file diff --git a/recipes/tablety_pl.recipe b/recipes/tablety_pl.recipe index f4c1efa9b8..1c3f46f967 100644 --- a/recipes/tablety_pl.recipe +++ b/recipes/tablety_pl.recipe @@ -8,10 +8,11 @@ class Tablety_pl(BasicNewsRecipe): cover_url = 'http://www.tablety.pl/wp-content/themes/kolektyw/img/logo.png' category = 'IT' language = 'pl' + use_embedded_content=True oldest_article = 8 max_articles_per_feed = 100 preprocess_regexps = [(re.compile(ur'

Przeczytaj także.*?

', re.DOTALL), lambda match: ''), (re.compile(ur'

Przeczytaj koniecznie.*?

', re.DOTALL), lambda match: '')] - remove_tags_before=dict(name="h1", attrs={'class':'entry-title'}) - remove_tags_after=dict(name="div", attrs={'class':'snap_nopreview sharing robots-nocontent'}) - remove_tags=[dict(name='div', attrs={'class':'snap_nopreview sharing robots-nocontent'})] + #remove_tags_before=dict(name="h1", attrs={'class':'entry-title'}) + #remove_tags_after=dict(name="footer", attrs={'class':'entry-footer clearfix'}) + #remove_tags=[dict(name='footer', attrs={'class':'entry-footer clearfix'}), dict(name='div', attrs={'class':'entry-comment-counter'})] feeds = [(u'Najnowsze posty', u'http://www.tablety.pl/feed/')] diff --git a/recipes/wnp.recipe b/recipes/wnp.recipe index e53e4cc66b..ee87112437 100644 --- a/recipes/wnp.recipe +++ b/recipes/wnp.recipe @@ -1,5 +1,5 @@ from calibre.web.feeds.news import BasicNewsRecipe - +import re class AdvancedUserRecipe1312886443(BasicNewsRecipe): title = u'WNP' @@ -8,10 +8,11 @@ class AdvancedUserRecipe1312886443(BasicNewsRecipe): description = u'Wirtualny Nowy Przemysł' category = 'economy' language = 'pl' + preprocess_regexps = [(re.compile(ur'Czytaj też:.*?', re.DOTALL), lambda match: ''), (re.compile(ur'Czytaj więcej:.*?', re.DOTALL), lambda match: '')] oldest_article = 8 max_articles_per_feed = 100 no_stylesheets= True - keep_only_tags = dict(name='div', attrs={'id':'contentText'}) + remove_tags=[dict(attrs={'class':'printF'})] feeds = [(u'Wiadomości gospodarcze', u'http://www.wnp.pl/rss/serwis_rss.xml'), (u'Serwis Energetyka - Gaz', u'http://www.wnp.pl/rss/serwis_rss_1.xml'), (u'Serwis Nafta - Chemia', u'http://www.wnp.pl/rss/serwis_rss_2.xml'), @@ -19,3 +20,7 @@ class AdvancedUserRecipe1312886443(BasicNewsRecipe): (u'Serwis Górnictwo', u'http://www.wnp.pl/rss/serwis_rss_4.xml'), (u'Serwis Logistyka', u'http://www.wnp.pl/rss/serwis_rss_5.xml'), (u'Serwis IT', u'http://www.wnp.pl/rss/serwis_rss_6.xml')] + + + def print_version(self, url): + return 'http://wnp.pl/drukuj/' +url[url.find(',')+1:] \ No newline at end of file From f7a9a9b2ff69e61096cb1f5d79fa3ec5ca3c5cfc Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 21 Mar 2012 08:55:54 +0530 Subject: [PATCH 05/13] ... --- .../gui2/store/stores/diesel_ebooks_plugin.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/calibre/gui2/store/stores/diesel_ebooks_plugin.py b/src/calibre/gui2/store/stores/diesel_ebooks_plugin.py index ba2ba28475..1d410e2c38 100644 --- a/src/calibre/gui2/store/stores/diesel_ebooks_plugin.py +++ b/src/calibre/gui2/store/stores/diesel_ebooks_plugin.py @@ -7,7 +7,6 @@ __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' import random -import re import urllib from contextlib import closing @@ -23,7 +22,7 @@ from calibre.gui2.store.search_result import SearchResult from calibre.gui2.store.web_store_dialog import WebStoreDialog class DieselEbooksStore(BasicStoreConfig, StorePlugin): - + def open(self, parent=None, detail_item=None, external=False): url = 'http://www.diesel-ebooks.com/' @@ -47,9 +46,9 @@ class DieselEbooksStore(BasicStoreConfig, StorePlugin): def search(self, query, max_results=10, timeout=60): url = 'http://www.diesel-ebooks.com/index.php?page=seek&id[m]=&id[c]=scope%253Dinventory&id[q]=' + urllib.quote_plus(query) - + br = browser() - + counter = max_results with closing(br.open(url, timeout=timeout)) as f: doc = html.fromstring(f.read()) @@ -75,10 +74,10 @@ class DieselEbooksStore(BasicStoreConfig, StorePlugin): drm = SearchResult.DRM_LOCKED if 'drm free' not in formats.lower(): drm = SearchResult.DRM_UNLOCKED - + counter -= 1 - + s = SearchResult() s.cover_url = cover_url s.title = title.strip() @@ -87,5 +86,5 @@ class DieselEbooksStore(BasicStoreConfig, StorePlugin): s.detail_item = id.strip() s.formats = formats s.drm = drm - + yield s From 3454185378cd08693ccdbc0542af197247bf11bb Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 21 Mar 2012 09:34:55 +0530 Subject: [PATCH 06/13] Update shipped liberation fonts --- .../fonts/liberation/LiberationMono-Bold.ttf | Bin 105308 -> 105616 bytes .../liberation/LiberationMono-BoldItalic.ttf | Bin 118144 -> 118652 bytes .../liberation/LiberationMono-Italic.ttf | Bin 124064 -> 124376 bytes .../liberation/LiberationMono-Regular.ttf | Bin 108020 -> 108476 bytes .../fonts/liberation/LiberationSans-Bold.ttf | Bin 136536 -> 137260 bytes .../liberation/LiberationSans-BoldItalic.ttf | Bin 134444 -> 135420 bytes .../liberation/LiberationSans-Italic.ttf | Bin 161356 -> 162336 bytes .../liberation/LiberationSans-Regular.ttf | Bin 138908 -> 139644 bytes .../fonts/liberation/LiberationSerif-Bold.ttf | Bin 146532 -> 146896 bytes .../liberation/LiberationSerif-BoldItalic.ttf | Bin 150200 -> 150692 bytes .../liberation/LiberationSerif-Italic.ttf | Bin 143816 -> 144308 bytes .../liberation/LiberationSerif-Regular.ttf | Bin 151868 -> 152280 bytes 12 files changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/fonts/liberation/LiberationMono-Bold.ttf b/resources/fonts/liberation/LiberationMono-Bold.ttf index 42941e57b165ed1cf21bb187e5c97e19360845d5..11b3f56fb408e49ce389b98f0585cecb6f1ea9f9 100644 GIT binary patch delta 3235 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 Ro%f6Rha#Q#QE%0me*?@tS``2Q diff --git a/resources/fonts/liberation/LiberationMono-BoldItalic.ttf b/resources/fonts/liberation/LiberationMono-BoldItalic.ttf index 4682e4de1fcf4564e6a7645431f3d0f81f6919e4..3e81a5965180e5db05b6e16db4640646f3bd2e2a 100644 GIT binary patch delta 3430 zcmb_fc~p~E7QgRh17tG=L1Zv21*#YjWhtT}n^sX!EYss~su;p1gfxUjMS@CI7MBtr z6e!A4R5l^d#v*if+=S?~f6PB~=F9os_q)sc-TQ97 zy!%pE%XwPQkpTe!E)GoKMMiGjxF!0LBarJmQ0urhJR*|b1UDepdQtXV8xtKXI4e1d z_7IeLYhzyz&5RdaM7tX0ozb!0zE52CBm$5#DDMztB#7gV21NjH-T+|V7UW2IG5Z9C z0QTkpG%!h=EX&CH!nF&)(g&Sb$q89vmDzzgmEDX5rJN!ci4P;g7hkmhAu$nucf1c0?EJyVb{^wiT5z#$yvbr}hHVpahQ zUC9v~c%pz#$VfSvp$q60`U%xA3K%7fGDZXAnmmWoPe2}MqLS4; zOaHduTdwYr?l;{--LJX_y6<%NbUK|@H=(P}Pb<)~uZ6+R1=q4s6!Y2GDJT$Lq)@fF2f;F#d{58uoUYeIRP8vH6 zQ~k60NA(Zt`|5wFzfym$9#@aLs7KU;>htOk)E(*u^(OTO^?LOZ^l*|W-~K}>?II`01_dE+CmPT1QDcB50FACT?2=png+vLG>nEr5@b_98b|}k zQMwv-!5)$WEm#>D?1T)uf`rfz>JRC#m(IiL6~aNNBwX?mHKC@|n$D%>)B;rW09+t} z)QP%M2dtu;R+v#6$fcH)OYM5@S{$~Lm1VU^L#5lKH>G!^-(*9!Np@dOT+WZV>|Ac{ zqTJS8Wu9Z6Tb@_mRNlkgPxh4WEs7~Be>>>y(6^@#H6P|54nI77QvR`s!4^J z!dD?xC>2xHfz@NxPu>l#5!d9^6xJwfWZK&J+N9c|IUMm-d(RpX%=&FdIl2s2{jB$R8{iiXVD>q50yxi&Y;p zKQ8+C_AqxiW%!p%RU`b7ppio(XGZRh($TrR(Sp(O%R!fKTnV}I<(R|Rjh^&{9VsNJ z$KgmnwW^yQz`e_zI(-jwIrOCbZplj24bJNB=ymVOeM(=ps-M0*tMfDX^(2<|FC+>% zug!zh^sH-(FeSC}W4(T;8tL^Qik_)n4~l|~3I%zvVN6slBk%T9t4j3-w?1$5+S<3) z6otA=`Y9uq0w_8>9p%hftoRaliJ2J)pI*UCXGU|~Ar8Z{sY1UWqP}x_1#1Z_0uxur z`Jdb2?8wgp{8%m4Y&aqp9k){zv&jIPe5i=DAa0Am30uau>?Ugu2%GsCenzjQdYT!{ z%oJ-o`z+U;Tmb#Ls#WVrCC&~}!={iKUEn;?xL=Vw<(3 z@-P4SDpdO5jf(S$WHZ)XK3n&vvr2m*Sz~o-`n^9XQ}oJ)=_|9!dV{CxypWtD~ICKK5X7&dIKm>F1+Fe9cghwL(92Dp<^BWA(^ik;uEFcw(SH;tGL^J#+- zb6^jn+lWoTh8btXreMh|HsU$p$h@h?GNdvGK5L`VU;&xzcq6uiRh;$uhQ>5SuZwuk zVggRY)rcv~Be6!zfGCn{#7yufQ%1}JM;cJ^2!n%_o zN^*qE3&8il7a&e3$x6)>@s{#^0{Fh5&?$+n>P8Rwoi2z%3IPbQrDfrmh(y_l6A?=k zWh&wGQF1)?rk4dCrG`&@?+X+I&_ex^%B8fjb3IU>01wv7lFp-xnN)$?X(i9;tDs`t& zk|5QuHZoHr&Eloc`grlOghF15R4UF2^7c*=CT23)}SI}U(lCFX>x*Cr=YiOwcXhb7uBwb6_(bwpDx&e<&QBVW#!cTM~ybtAc6OD#C zI1R^X3@|F7QjtGMBxbaPmeMkM6h2Zs9wf`n=^1*Kw$e7*PCHayLqx(h;be2?|Be?8v363{L)jx VC&iiA0s#hdirw_j&!V4Q{x>R%6*>R_ delta 2806 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 diff --git a/resources/fonts/liberation/LiberationSans-Bold.ttf b/resources/fonts/liberation/LiberationSans-Bold.ttf index b29a5640e414580a6ba51b4d21b4699f35f1d796..ee978ce0292651c57dc767a32413c4e2c48cdb5c 100644 GIT binary patch delta 9675 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 X!(Z0oA7cUR;Q_r_G&u9z%mM!kxJ^(J delta 8974 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 diff --git a/resources/fonts/liberation/LiberationSans-BoldItalic.ttf b/resources/fonts/liberation/LiberationSans-BoldItalic.ttf index 0b0bf94a57744c9646335dbc83df85eac0135974..10002b8763bdc292a2716cd724067c35b343c16e 100644 GIT binary patch delta 9132 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 DP+9LG delta 8615 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 diff --git a/resources/fonts/liberation/LiberationSans-Italic.ttf b/resources/fonts/liberation/LiberationSans-Italic.ttf index 4a430cdddd17c108f269f917be9454e32a5196ed..1d287ee9f6d1cde51287746d93dcfb2959eef784 100644 GIT binary patch delta 10023 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 BN2LG& delta 9356 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 H{+#~-ML8Q1 delta 8969 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 I^{cJ_4c16^u>b%7 delta 8413 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 diff --git a/resources/fonts/liberation/LiberationSerif-BoldItalic.ttf b/resources/fonts/liberation/LiberationSerif-BoldItalic.ttf index ad754700fdef383e77e091333c8b83873a6dfa60..84a9cb4f7844b01b6f62c0ff88e94a4e73b4f3bb 100644 GIT binary patch delta 8715 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 LU$`)5<(U5gbl6fG delta 8122 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 U@Ux*1B|}!+p{u^~+2u|D094wG5&!@I delta 8307 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 PHu}%}TN9{%e&c@u$-nS7 diff --git a/resources/fonts/liberation/LiberationSerif-Regular.ttf b/resources/fonts/liberation/LiberationSerif-Regular.ttf index 155675f711ce8b0d3ca44bf8b33303c84d842a28..d934d218b19e88bd4f15997cae714db3d95efb2f 100644 GIT binary patch delta 8641 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 Y3LR;S+{|y6s$tPr Date: Wed, 21 Mar 2012 23:00:47 +0100 Subject: [PATCH 07/13] fix Woblink store, up to 30 items [Bat once --- src/calibre/customize/builtins.py | 2 +- .../gui2/store/stores/woblink_plugin.py | 26 +++++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 2908444665..d50a86e24a 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -1574,7 +1574,7 @@ class StoreWoblinkStore(StoreBase): actual_plugin = 'calibre.gui2.store.stores.woblink_plugin:WoblinkStore' headquarters = 'PL' - formats = ['EPUB', 'PDF', 'WOBLINK'] + formats = ['EPUB', 'MOBI', 'PDF', 'WOBLINK'] class XinXiiStore(StoreBase): name = 'XinXii' diff --git a/src/calibre/gui2/store/stores/woblink_plugin.py b/src/calibre/gui2/store/stores/woblink_plugin.py index 9992c80eb9..022f48b95e 100644 --- a/src/calibre/gui2/store/stores/woblink_plugin.py +++ b/src/calibre/gui2/store/stores/woblink_plugin.py @@ -3,7 +3,7 @@ from __future__ import (unicode_literals, division, absolute_import, print_function) __license__ = 'GPL 3' -__copyright__ = '2011, Tomasz Długosz ' +__copyright__ = '2011-2012, Tomasz Długosz ' __docformat__ = 'restructuredtext en' import re @@ -41,6 +41,11 @@ class WoblinkStore(BasicStoreConfig, StorePlugin): def search(self, query, max_results=10, timeout=60): url = 'http://woblink.com/publication?query=' + urllib.quote_plus(query.encode('utf-8')) + if max_results > 10: + if max_results > 20: + url += '&limit=' + str(30) + else: + url += '&limit=' + str(20) br = browser() @@ -58,15 +63,14 @@ class WoblinkStore(BasicStoreConfig, StorePlugin): cover_url = ''.join(data.xpath('.//td[@class="w10 va-t"]/a[1]/img/@src')) title = ''.join(data.xpath('.//h2[@class="title"]/a[1]/text()')) author = ', '.join(data.xpath('.//p[@class="author"]/a/text()')) - price = ''.join(data.xpath('.//div[@class="prices"]/p[1]/span/text()')) - price = re.sub('PLN', ' zł', price) + price = ''.join(data.xpath('.//div[@class="prices"]/span[1]/span/text()')) price = re.sub('\.', ',', price) - formats = ', '.join(data.xpath('.//p[3]/img/@src')) - formats = formats[8:-4].upper() - if formats == 'EPUB': - formats = 'WOBLINK' + formats = [ form[8:-4].split('_')[0] for form in data.xpath('.//p[3]/img/@src')] + if 'epub' in formats: + formats.remove('epub') + formats.append('WOBLINK') if 'E Ink' in data.xpath('.//div[@class="prices"]/img/@title'): - formats += ', EPUB' + formats.insert(0, 'EPUB') counter -= 1 @@ -74,9 +78,9 @@ class WoblinkStore(BasicStoreConfig, StorePlugin): s.cover_url = 'http://woblink.com' + cover_url s.title = title.strip() s.author = author.strip() - s.price = price + s.price = price + ' zł' s.detail_item = id.strip() - s.drm = SearchResult.DRM_LOCKED - s.formats = formats + s.drm = SearchResult.DRM_UNKNOWN if 'MOBI' in formats else SearchResult.DRM_LOCKED + s.formats = ', '.join(formats) yield s From 33d00175e03448c44e7eed85ab868016bab3d033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20D=C5=82ugosz?= Date: Wed, 21 Mar 2012 23:15:12 +0100 Subject: [PATCH 08/13] fix 'pdf' casing in the list --- src/calibre/gui2/store/stores/woblink_plugin.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/gui2/store/stores/woblink_plugin.py b/src/calibre/gui2/store/stores/woblink_plugin.py index 022f48b95e..e9696b39a6 100644 --- a/src/calibre/gui2/store/stores/woblink_plugin.py +++ b/src/calibre/gui2/store/stores/woblink_plugin.py @@ -71,6 +71,8 @@ class WoblinkStore(BasicStoreConfig, StorePlugin): formats.append('WOBLINK') if 'E Ink' in data.xpath('.//div[@class="prices"]/img/@title'): formats.insert(0, 'EPUB') + if 'pdf' in formats: + formats[formats.index('pdf')] = 'PDF' counter -= 1 From ce5375db54a1889a524d3a0b8a312a61279b879e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 22 Mar 2012 09:27:27 +0530 Subject: [PATCH 09/13] Update b92. Fixes #961211 (Updated recipe for B92) --- recipes/b92.recipe | 20 +++++++++++++------- recipes/icons/b92.png | Bin 413 -> 1559 bytes 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/recipes/b92.recipe b/recipes/b92.recipe index 7181419682..c4520b37fc 100644 --- a/recipes/b92.recipe +++ b/recipes/b92.recipe @@ -1,6 +1,6 @@ __license__ = 'GPL v3' -__copyright__ = '2008-2011, Darko Miletic ' +__copyright__ = '2008-2012, Darko Miletic ' ''' b92.net ''' @@ -20,13 +20,13 @@ class B92(BasicNewsRecipe): encoding = 'cp1250' language = 'sr' publication_type = 'newsportal' - masthead_url = 'http://www.b92.net/images/fp/logo.gif' + masthead_url = 'http://b92s.net/v4/img/new-logo.png' extra_css = """ - @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: Arial,Helvetica,sans1,sans-serif} - .articledescription{font-family: serif1, serif} .article-info2,.article-info1{text-transform: uppercase; font-size: small} + img{display: block} + .sms{font-weight: bold} """ conversion_options = { @@ -37,11 +37,17 @@ class B92(BasicNewsRecipe): , 'linearize_tables' : True } - preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')] + preprocess_regexps = [ + (re.compile(u'\u0110'), lambda match: u'\u00D0'), + (re.compile(r'', re.DOTALL|re.IGNORECASE), lambda match: 'something') + ] keep_only_tags = [dict(attrs={'class':['article-info1','article-text']})] - remove_attributes = ['width','height','align','hspace','vspace','border'] - remove_tags = [dict(name=['embed','link','base','meta'])] + remove_attributes = ['width','height','align','hspace','vspace','border','lang','xmlns:fb'] + remove_tags = [ + dict(name=['embed','link','base','meta','iframe']) + ,dict(attrs={'id':'social'}) + ] feeds = [ (u'Vesti' , u'http://www.b92.net/info/rss/vesti.xml' ) diff --git a/recipes/icons/b92.png b/recipes/icons/b92.png index 864c2e4e8ebb324087ab828d8d00e3268409a76b..bd02fd88ae9c3b347ac4ff0a4c889c5c0c5b848e 100644 GIT binary patch literal 1559 zcmV+y2I%>TP)zv3m112=cc^T6Tn9yLCvN$TJyLw!h+G&ARgjU5y=*3Z<8*ZbE8 zRnM}2y?(d679qG~@%h}ynQ}$APoJZyI@G`Cm0rv((WtfXP&CwSCCMUfYy}xP$#xD_ zl@)bMX6|cgZZ|Rsg2RrU7aE%oF0kMmA}%j`l#+C$=0SZ|m(F9LkldOUX+4d70&P%ot3Yr_+;wJ5BYHWL>kFHCnR%`V< zX!HdCwP{oMrY28on~!G{s8kv{yCjPRcVu$+>2V=&S$L&lMf{I?K9-YM=-^~SMc_ut zhPlUn91iUp*D9CCq*KAerK=zgP%?6p;M}RwT*@tlGd0ZX8MB%i+KLJ)Z!4=I(~+~} z%hpaX;c@=DRlPp(=eAZ=cQAC6hk9+<7X$60Yn4f{>A*nhNS%)4@wt$Wof@QodF09tOX z2LdO1!64cKa42Qj5nG|fj)SpQHpb|w;G5N}7ye{o!dbm}a!`nrO|T6`YBXIx?7EPd zew9TPH5}9j(aRh>&plS0l~H)&)#v!3f-7flt2-$hMD~`>V&TJkPf!1H!}v-B@pv48 zfG-dA3<#DOp@DHO=ayYKbqnc9P?+aBy+eWnXA-S#&7r8{$M0=wc+uSfvLNxYPuUga z=4lT#o3<*eIKR@;$}~vfA$AwB39Kx1T_n`+n2!RWeedtujY~5lW(7}+3xVpXy7Q#) zj|#1(t7p7ctE;(RUz}gn`n-cGFtBBm*9OQD0HxDlK09!@ zBxO&Onc&Sg%p1O*hu{s_=;cn$MjdUPr!xMmf6`*48)Wn1$&&UK6@d^Gti7X^K^l@( zRsJL=^9Cg0ZrS5Yr%UzkDT4w4u%DoJ>JJBgLEj|^wrqrSbfkZuvw7awekr^3R^ffR zD#3u@Fwb#OGA@tPo2IV1>FhCORe2qKX=!a5HqlR}aOW79K>Lf%yrad+{C}X0#`~mF z_vrUB-7ut=0s6yuaQ9BuJ*@GOdvrk)eZMpo_tu3b`EFvG0TYTC^cB+#n9yXu%}g_3 zLQ@8(G0lJpP4nNvGy^6S<-e6_225y1z&55CFrnxnJD6s`gk}%f$ut8dG$-&K1DY$_ z#WVvZ6eruwGy^6SAGC*Q225yv&|an)FrmfrZ~y0?%G(r4{s#|BOuO%FJjVb4002ov JPDHLkV1lls>@@%Y literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zK-vS0-A-oPfdtD69Mgd`SU*F|v9*VRoMWCYjv*GOmrnBLJ8Zz=GJo|w?K@`*jBAW` zd3Zebzp_g9BzONu24+=-AI$x)kBTvVTid|6!pWt+;h9}w=X0;CUW}nxYZ-QM*d4ht zwV~rpzq^?6>vyqD%&NXyls9Z`>sEM|bNd==|4qgd=R}fPR=tbmzjIYHX`8OqMgHY6 z-xbs+#^oq&kBQy7VAcCe%7^Zr7n{`Gv2Ih|M5EItVaBVp)^7b-_~!cE?`OD$&v)hd z`b^(^r#ZTI4$GIk7-c)Z#E2Q9<*w=)XKop%Gd;=VeZFO Qtw0S7p00i_>zopr0C+o;%m4rY From 93f98ee19c2324107abb9ff79e3a0cdbe244a01b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 22 Mar 2012 10:15:06 +0530 Subject: [PATCH 10/13] Copy to Library: If books were auto merged by the copy to library process, popup a message telling the user about it, as otherwise some people forget they have turned on auto merge and accuse calibre of losing their books. --- src/calibre/gui2/actions/copy_to_library.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/actions/copy_to_library.py b/src/calibre/gui2/actions/copy_to_library.py index dd25b83d50..abc10c2d76 100644 --- a/src/calibre/gui2/actions/copy_to_library.py +++ b/src/calibre/gui2/actions/copy_to_library.py @@ -13,7 +13,8 @@ from contextlib import closing from PyQt4.Qt import QToolButton from calibre.gui2.actions import InterfaceAction -from calibre.gui2 import error_dialog, Dispatcher, warning_dialog, gprefs +from calibre.gui2 import (error_dialog, Dispatcher, warning_dialog, gprefs, + info_dialog) from calibre.gui2.dialogs.progress import ProgressDialog from calibre.utils.config import prefs, tweaks from calibre.utils.date import now @@ -30,6 +31,7 @@ class Worker(Thread): # {{{ self.progress = progress self.done = done self.delete_after = delete_after + self.auto_merged_ids = {} def run(self): try: @@ -79,6 +81,8 @@ class Worker(Thread): # {{{ if prefs['add_formats_to_existing']: identical_book_list = newdb.find_identical_books(mi) if identical_book_list: # books with same author and nearly same title exist in newdb + self.auto_merged_ids[x] = _('%s by %s')%(mi.title, + mi.format_field('authors')[1]) automerged = True seen_fmts = set() for identical_book in identical_book_list: @@ -196,6 +200,15 @@ class CopyToLibraryAction(InterfaceAction): self.gui.status_bar.show_message( _('Copied %(num)d books to %(loc)s') % dict(num=len(ids), loc=loc), 2000) + if self.worker.auto_merged_ids: + books = '\n'.join(self.worker.auto_merged_ids.itervalues()) + info_dialog(self.gui, _('Auto merged'), + _('Some books were automatically merged into existing ' + 'records in the target library. Click Show ' + 'details to see which ones. This behavior is ' + 'controlled by the Auto merge option in ' + 'Preferences->Adding books.'), det_msg=books, + show=True) if delete_after and self.worker.processed: v = self.gui.library_view ci = v.currentIndex() From 99eb7bf591fac7e870e18ca353cf8882c13ddae4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 22 Mar 2012 10:32:13 +0530 Subject: [PATCH 11/13] ... --- src/calibre/gui2/viewer/main.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index c1cb89aeb6..ef3fdfedd8 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -507,6 +507,10 @@ class EbookViewer(MainWindow, Ui_EbookViewer): def toc_clicked(self, index): item = self.toc_model.itemFromIndex(index) if item.abspath is not None: + if not os.path.exists(item.abspath): + return error_dialog(self, _('No such location'), + _('The location pointed to by this item' + ' does not exist.'), show=True) url = QUrl.fromLocalFile(item.abspath) if item.fragment: url.setFragment(item.fragment) From 91fb0462b1e1edfced67b35bb721d9b266cc8c3f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 22 Mar 2012 11:47:36 +0530 Subject: [PATCH 12/13] Try to preserve the current position when toggling fullscreen mode in the ebook viewer --- src/calibre/gui2/viewer/main.py | 23 +++++++++++++++++++++-- src/calibre/gui2/viewer/position.py | 10 +++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index ef3fdfedd8..8ff496dfea 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -301,6 +301,8 @@ class EbookViewer(MainWindow, Ui_EbookViewer): _('Press Esc to quit')), self) self.full_screen_label.setVisible(False) + self.window_mode_toggle_timer = QTimer(self) + self.window_mode_toggle_timer.timeout.connect(self.handle_window_mode_toggle) self.full_screen_label.setStyleSheet(''' QLabel { text-align: center; @@ -311,6 +313,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer): border-radius: 20px; } ''') + self.window_mode_changed = None self.toggle_toolbar_action = QAction(_('Show/hide controls'), self) self.toggle_toolbar_action.triggered.connect(self.toggle_toolbars) self.addAction(self.toggle_toolbar_action) @@ -441,6 +444,8 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.showFullScreen() def showFullScreen(self): + self.view.document.page_position.save() + self.window_mode_changed = 'fullscreen' self.tool_bar.setVisible(False) self.tool_bar2.setVisible(False) self._original_frame_margins = ( @@ -450,7 +455,6 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.centralwidget.layout().setContentsMargins(0, 0, 0, 0) super(EbookViewer, self).showFullScreen() - QTimer.singleShot(10, self.show_full_screen_label) def show_full_screen_label(self): f = self.full_screen_label @@ -469,6 +473,8 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.view.document.switch_to_fullscreen_mode() def showNormal(self): + self.view.document.page_position.save() + self.window_mode_changed = 'normal' self.esc_full_screen_action.setEnabled(False) self.tool_bar.setVisible(True) self.tool_bar2.setVisible(True) @@ -478,7 +484,16 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.centralwidget.layout().setContentsMargins(om[0]) self.frame.layout().setContentsMargins(om[1]) super(EbookViewer, self).showNormal() - self.view.document.switch_to_window_mode() + + def handle_window_mode_toggle(self): + if self.window_mode_changed: + fs = self.window_mode_changed == 'fullscreen' + self.window_mode_changed = None + if fs: + self.show_full_screen_label() + else: + self.view.document.switch_to_window_mode() + self.view.document.page_position.restore() def goto(self, ref): if ref: @@ -679,6 +694,10 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.view.load_path(path, pos=pos) def viewport_resized(self, frac): + if self.window_mode_changed: + # Soak up extra window resize events + self.window_mode_toggle_timer.start(15) + return new_page = self.pos.value() if self.current_page is not None: try: diff --git a/src/calibre/gui2/viewer/position.py b/src/calibre/gui2/viewer/position.py index 53b0a8f11c..5eb44ec687 100644 --- a/src/calibre/gui2/viewer/position.py +++ b/src/calibre/gui2/viewer/position.py @@ -57,12 +57,20 @@ class PagePosition(object): return ans def __enter__(self): - self._cpos = self.current_pos + self.save() def __exit__(self, *args): + self.restore() + + def save(self): + self._cpos = self.current_pos + + def restore(self): + if self._cpos is None: return if isinstance(self._cpos, (int, float)): self.document.scroll_fraction = self._cpos else: self.scroll_to_cfi(self._cpos) self._cpos = None + From 3fa649358b4b283d6c77fc92598c163e44212a03 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 22 Mar 2012 13:12:51 +0530 Subject: [PATCH 13/13] E-book viewer: Try to preserve page position when the window is resized --- src/calibre/gui2/viewer/documentview.py | 27 ++++-------------- src/calibre/gui2/viewer/main.py | 38 ++++++++++++++++--------- 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py index 7999458004..3dee673150 100644 --- a/src/calibre/gui2/viewer/documentview.py +++ b/src/calibre/gui2/viewer/documentview.py @@ -8,7 +8,7 @@ import os, math, re, glob, sys, zipfile from base64 import b64encode from functools import partial -from PyQt4.Qt import (QSize, QSizePolicy, QUrl, SIGNAL, Qt, QTimer, +from PyQt4.Qt import (QSize, QSizePolicy, QUrl, SIGNAL, Qt, QPainter, QPalette, QBrush, QFontDatabase, QDialog, QColor, QPoint, QImage, QRegion, QVariant, QIcon, QFont, pyqtSignature, QAction, QByteArray, QMenu, @@ -184,12 +184,10 @@ class Document(QWebPage): # {{{ self.misc_config() self.after_load() - def __init__(self, shortcuts, parent=None, resize_callback=lambda: None, - debug_javascript=False): + def __init__(self, shortcuts, parent=None, debug_javascript=False): QWebPage.__init__(self, parent) self.setObjectName("py_bridge") self.debug_javascript = debug_javascript - self.resize_callback = resize_callback self.current_language = None self.loaded_javascript = False self.js_loader = JavaScriptLoader( @@ -259,12 +257,6 @@ class Document(QWebPage): # {{{ if self.loaded_javascript: return self.loaded_javascript = True - self.javascript( - ''' - window.onresize = function(event) { - window.py_bridge.window_resized(); - } - ''') self.loaded_lang = self.js_loader(self.mainFrame().evaluateJavaScript, self.current_language, self.hyphenate_default_lang) @@ -310,10 +302,6 @@ class Document(QWebPage): # {{{ def debug(self, msg): prints(msg) - @pyqtSignature('') - def window_resized(self): - self.resize_callback() - def reference_mode(self, enable): self.javascript(('enter' if enable else 'leave')+'_reference_mode()') @@ -444,7 +432,7 @@ class Document(QWebPage): # {{{ def scroll_fraction(self): def fget(self): try: - return float(self.ypos)/(self.height-self.window_height) + return abs(float(self.ypos)/(self.height-self.window_height)) except ZeroDivisionError: return 0. def fset(self, val): @@ -516,7 +504,6 @@ class DocumentView(QWebView): # {{{ self.initial_pos = 0.0 self.to_bottom = False self.document = Document(self.shortcuts, parent=self, - resize_callback=self.viewport_resized, debug_javascript=debug_javascript) self.setPage(self.document) self.manager = None @@ -1035,13 +1022,9 @@ class DocumentView(QWebView): # {{{ return handled def resizeEvent(self, event): - ret = QWebView.resizeEvent(self, event) - QTimer.singleShot(10, self.initialize_scrollbar) - return ret - - def viewport_resized(self): if self.manager is not None: - self.manager.viewport_resized(self.scroll_fraction) + self.manager.viewport_resize_started(event) + return QWebView.resizeEvent(self, event) def event(self, ev): if ev.type() == ev.Gesture: diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 8ff496dfea..413916fb81 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -224,6 +224,10 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.toc.setVisible(False) self.action_quit = QAction(self) self.addAction(self.action_quit) + self.view_resized_timer = QTimer(self) + self.view_resized_timer.timeout.connect(self.viewport_resize_finished) + self.view_resized_timer.setSingleShot(True) + self.resize_in_progress = False qs = [Qt.CTRL+Qt.Key_Q] if isosx: qs += [Qt.CTRL+Qt.Key_W] @@ -301,8 +305,6 @@ class EbookViewer(MainWindow, Ui_EbookViewer): _('Press Esc to quit')), self) self.full_screen_label.setVisible(False) - self.window_mode_toggle_timer = QTimer(self) - self.window_mode_toggle_timer.timeout.connect(self.handle_window_mode_toggle) self.full_screen_label.setStyleSheet(''' QLabel { text-align: center; @@ -693,20 +695,28 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.open_progress_indicator(_('Laying out %s')%self.current_title) self.view.load_path(path, pos=pos) - def viewport_resized(self, frac): + def viewport_resize_started(self, event): + if not self.resize_in_progress: + # First resize, so save the current page position + self.resize_in_progress = True + if not self.window_mode_changed: + # The special handling for window mode changed will already + # have saved page position, so only save it if this is not a + # mode change + self.view.document.page_position.save() + + if self.resize_in_progress: + self.view_resized_timer.start(75) + + def viewport_resize_finished(self): + # There hasn't been a resize event for some time + # restore the current page position. + self.resize_in_progress = False if self.window_mode_changed: - # Soak up extra window resize events - self.window_mode_toggle_timer.start(15) - return - new_page = self.pos.value() - if self.current_page is not None: - try: - frac = float(new_page-self.current_page.start_page)/(self.current_page.pages-1) - except ZeroDivisionError: - frac = 0 - self.view.scroll_to(frac, notify=False) + # This resize is part of a window mode change, special case it + self.handle_window_mode_toggle() else: - self.set_page_number(frac) + self.view.document.page_position.restore() def close_progress_indicator(self): self.pi.stop()