From 37098e6ddffb2c1b4d69759404fe0538c0690668 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 15 Oct 2011 05:30:00 +0530 Subject: [PATCH 1/7] ... --- recipes/dallas.recipe | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/recipes/dallas.recipe b/recipes/dallas.recipe index d46427caa9..ae97dd44a3 100644 --- a/recipes/dallas.recipe +++ b/recipes/dallas.recipe @@ -8,11 +8,7 @@ class DallasNews(BasicNewsRecipe): no_stylesheets = True use_embedded_content = False - remove_tags_before = dict(name='h1') - keep_only_tags = {'class':lambda x: x and 'article' in x} - remove_tags = [ - {'class':['DMNSocialTools', 'article ', 'article first ', 'article premium']}, - ] + auto_cleanup = True feeds = [ ('Local News', From ec2bcf9eddc9abda3fffd1d48af2cde246b792fe Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 15 Oct 2011 05:39:04 +0530 Subject: [PATCH 2/7] Fix typo that broke stopping selected jobs in 0.8.22 --- src/calibre/gui2/jobs.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index 3ebfed6743..07b05afdc3 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -500,7 +500,8 @@ class JobsDialog(QDialog, Ui_JobsDialog): def kill_job(self, *args): rows = [index.row() for index in self.jobs_view.selectionModel().selectedRows()] - return error_dialog(self, _('No job'), + if not rows: + return error_dialog(self, _('No job'), _('No job selected'), show=True) if question_dialog(self, _('Are you sure?'), ngettext('Do you really want to stop the selected job?', From 318342b941852374c8c5acd1b37b20fbdf5b3962 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 15 Oct 2011 06:04:38 +0530 Subject: [PATCH 3/7] Update Helsingin Sanomat --- recipes/helsingin_sanomat.recipe | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/recipes/helsingin_sanomat.recipe b/recipes/helsingin_sanomat.recipe index 6099a1fda8..76c6b3fb08 100644 --- a/recipes/helsingin_sanomat.recipe +++ b/recipes/helsingin_sanomat.recipe @@ -3,7 +3,7 @@ from calibre.web.feeds.news import BasicNewsRecipe class AdvancedUserRecipe1298137661(BasicNewsRecipe): title = u'Helsingin Sanomat' __author__ = 'oneillpt' - language = 'fi' + language = 'fi' oldest_article = 7 max_articles_per_feed = 100 no_stylesheets = True @@ -11,21 +11,12 @@ class AdvancedUserRecipe1298137661(BasicNewsRecipe): conversion_options = { 'linearize_tables' : True } - remove_tags = [ - dict(name='a', attrs={'id':'articleCommentUrl'}), - dict(name='p', attrs={'class':'newsSummary'}), - dict(name='div', attrs={'class':'headerTools'}) - ] + keep_only_tags = [dict(name='div', attrs={'id':'main-content'}), + dict(name='div', attrs={'class':'contentNewsArticle'})] - feeds = [(u'Uutiset - HS.fi', u'http://www.hs.fi/uutiset/rss/'), (u'Politiikka - HS.fi', u'http://www.hs.fi/politiikka/rss/'), + feeds = [(u'Uutiset - HS.fi', u'http://www.hs.fi/uutiset/rss/') +, (u'Politiikka - HS.fi', u'http://www.hs.fi/politiikka/rss/'), (u'Ulkomaat - HS.fi', u'http://www.hs.fi/ulkomaat/rss/'), (u'Kulttuuri - HS.fi', u'http://www.hs.fi/kulttuuri/rss/'), (u'Kirjat - HS.fi', u'http://www.hs.fi/kulttuuri/kirjat/rss/'), (u'Elokuvat - HS.fi', u'http://www.hs.fi/kulttuuri/elokuvat/rss/') ] - def print_version(self, url): - j = url.rfind("/") - s = url[j:] - i = s.rfind("?ref=rss") - if i > 0: - s = s[:i] - return "http://www.hs.fi/tulosta" + s From dcf45ce7975818cedb58391aba27601a8af7a0bd Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 15 Oct 2011 06:13:04 +0530 Subject: [PATCH 4/7] Update various German recipes --- recipes/brand_eins.recipe | 5 +++-- recipes/ftd.recipe | 28 ++++++++++++++-------------- recipes/sueddeutsche.recipe | 6 +++--- recipes/telepolis.recipe | 9 ++------- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/recipes/brand_eins.recipe b/recipes/brand_eins.recipe index e6fe57b334..277af4d789 100644 --- a/recipes/brand_eins.recipe +++ b/recipes/brand_eins.recipe @@ -110,8 +110,10 @@ class BrandEins(BasicNewsRecipe): selected_issue = issue_map[selected_issue_key] url = selected_issue.get('href', False) # Get the title for the magazin - build it out of the title of the cover - take the issue and year; - self.title = "brand eins " + selected_issue_key[4:] + "/" + selected_issue_key[0:4] + # self.title = "brand eins " + selected_issue_key[4:] + "/" + selected_issue_key[0:4] + # Get the alternative title for the magazin - build it out of the title of the cover - without the issue and year; url = 'http://brandeins.de/'+url + self.timefmt = ' ' + selected_issue_key[4:] + '/' + selected_issue_key[:4] # url = "http://www.brandeins.de/archiv/magazin/tierisch.html" titles_and_articles = self.brand_eins_parse_issue(url) @@ -163,4 +165,3 @@ class BrandEins(BasicNewsRecipe): current_articles.append({'title': title, 'url': url, 'description': description, 'date':''}) titles_and_articles.append([chapter_title, current_articles]) return titles_and_articles - diff --git a/recipes/ftd.recipe b/recipes/ftd.recipe index bdd084c329..1bda3dacfb 100644 --- a/recipes/ftd.recipe +++ b/recipes/ftd.recipe @@ -16,7 +16,7 @@ class FTDe(BasicNewsRecipe): use_embedded_content = False timefmt = ' [%d %b %Y]' language = 'de' - max_articles_per_feed = 40 + max_articles_per_feed = 30 no_stylesheets = True remove_tags = [dict(id='navi_top'), @@ -84,19 +84,19 @@ class FTDe(BasicNewsRecipe): dict(name='div', attrs={'class':'artikelsplitfaq'})] #remove_tags_after = [dict(name='a', attrs={'class':'more'})] - feeds = [ ('Finanzen', 'http://www.ftd.de/rss2/finanzen/maerkte'), - ('Meinungshungrige', 'http://www.ftd.de/rss2/meinungshungrige'), - ('Unternehmen', 'http://www.ftd.de/rss2/unternehmen'), - ('Politik', 'http://www.ftd.de/rss2/politik'), - ('Karriere_Management', 'http://www.ftd.de/rss2/karriere-management'), - ('IT_Medien', 'http://www.ftd.de/rss2/it-medien'), - ('Wissen', 'http://www.ftd.de/rss2/wissen'), - ('Sport', 'http://www.ftd.de/rss2/sport'), - ('Auto', 'http://www.ftd.de/rss2/auto'), - ('Lifestyle', 'http://www.ftd.de/rss2/lifestyle') - - ] + feeds = [ + ('Unternehmen', 'http://www.ftd.de/rss2/unternehmen'), + ('Finanzen', 'http://www.ftd.de/rss2/finanzen/maerkte'), + ('Meinungen', 'http://www.ftd.de/rss2/meinungshungrige'), + ('Politik', 'http://www.ftd.de/rss2/politik'), + ('Management & Karriere', 'http://www.ftd.de/rss2/karriere-management'), + ('IT & Medien', 'http://www.ftd.de/rss2/it-medien'), + ('Wissen', 'http://www.ftd.de/rss2/wissen'), + ('Sport', 'http://www.ftd.de/rss2/sport'), + ('Auto', 'http://www.ftd.de/rss2/auto'), + ('Lifestyle', 'http://www.ftd.de/rss2/lifestyle') + ] def print_version(self, url): - return url.replace('.html', '.html?mode=print') + return url.replace('.html', '.html?mode=print') \ No newline at end of file diff --git a/recipes/sueddeutsche.recipe b/recipes/sueddeutsche.recipe index c3863c6584..e0dc6742a1 100644 --- a/recipes/sueddeutsche.recipe +++ b/recipes/sueddeutsche.recipe @@ -10,7 +10,7 @@ from calibre.web.feeds.news import BasicNewsRecipe class Sueddeutsche(BasicNewsRecipe): - title = u'Süddeutsche' + title = u'sueddeutsche.de' description = 'News from Germany' __author__ = 'Oliver Niesner and Armin Geller' use_embedded_content = False @@ -62,7 +62,7 @@ class Sueddeutsche(BasicNewsRecipe): (u'Sport', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5ESport%24?output=rss'), (u'Leben', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5ELeben%24?output=rss'), (u'Karriere', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EKarriere%24?output=rss'), - (u'München&Region', u'http://www.sueddeutsche.de/app/service/rss/ressort/muenchen/rss.xml'), + (u'München & Region', u'http://www.sueddeutsche.de/app/service/rss/ressort/muenchen/rss.xml'), (u'Bayern', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EBayern%24?output=rss'), (u'Medien', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EMedien%24?output=rss'), (u'Digital', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EDigital%24?output=rss'), @@ -75,7 +75,7 @@ class Sueddeutsche(BasicNewsRecipe): (u'Job', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EJob%24?output=rss'), # sometimes only (u'Service', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EService%24?output=rss'), # sometimes only (u'Verlag', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EVerlag%24?output=rss'), # sometimes only - ] + ] def print_version(self, url): main, sep, id = url.rpartition('/') diff --git a/recipes/telepolis.recipe b/recipes/telepolis.recipe index 3611ebc642..3bc39014d5 100644 --- a/recipes/telepolis.recipe +++ b/recipes/telepolis.recipe @@ -3,7 +3,7 @@ from calibre.web.feeds.news import BasicNewsRecipe class TelepolisNews(BasicNewsRecipe): - title = u'Telepolis (News+Artikel)' + title = u'Telepolis' __author__ = 'syntaxis' publisher = 'Heise Zeitschriften Verlag GmbH & Co KG' description = 'News from Telepolis' @@ -15,11 +15,8 @@ class TelepolisNews(BasicNewsRecipe): encoding = "utf-8" language = 'de' - remove_empty_feeds = True - - keep_only_tags = [dict(name = 'div',attrs={'class':'head'}),dict(name = 'div',attrs={'class':'leftbox'}),dict(name='td',attrs={'class':'strict'})] remove_tags = [ dict(name='td',attrs={'class':'blogbottom'}), dict(name='div',attrs={'class':'forum'}), dict(name='div',attrs={'class':'social'}),dict(name='div',attrs={'class':'blog-letter p-news'}), @@ -28,7 +25,6 @@ class TelepolisNews(BasicNewsRecipe): remove_tags_after = [dict(name='span', attrs={'class':['breadcrumb']})] - feeds = [(u'News', u'http://www.heise.de/tp/news-atom.xml')] html2lrf_options = [ @@ -39,8 +35,7 @@ class TelepolisNews(BasicNewsRecipe): html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"' - def preprocess_html(self, soup): mtag = '' soup.head.insert(0,mtag) - return soup + return soup \ No newline at end of file From 51b819f6387286d921d56eecebd0c17b644b24c0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 15 Oct 2011 06:15:28 +0530 Subject: [PATCH 5/7] Fix 874643 --- recipes/icons/la_republica.png | Bin 0 -> 868 bytes recipes/la_republica.recipe | 56 ++++++++++++++++++--------------- 2 files changed, 30 insertions(+), 26 deletions(-) create mode 100644 recipes/icons/la_republica.png diff --git a/recipes/icons/la_republica.png b/recipes/icons/la_republica.png new file mode 100644 index 0000000000000000000000000000000000000000..e24405b6d4511c7b54d9e4b61b7bd922926527b5 GIT binary patch literal 868 zcmV-q1DpJbP)0009kNklY@O^)~-M(b8VzKDDZnavi z*Xy}l?j<^t31l*vm#p-FX0sUtL8VgB)br;Rn^D1RHiIczt=9Q`*3pwpAe+tVEbttl zQ79DF>$S3mWCHDWTUk4U%jE)7L{X&nIF&~6hQcsB91gr*#4ExS>Fablk&jHLQ-zl$ zr~{=^iR6IY@Av!oZ+JQUgn0_Sy4h@yrpW!o5Cn0z+a)FMQ{?C8XRTIao`NrdEx(@_ z0s_jFXfm0QlCW^U-xn#jkw(EBS)UXhkH;eAmg+#G(I6$^NTQ5niGZl$&gXMp*b)JR zHBu8PEUIhvS_!^;gBS5??Ge!L+rEXMkioL3`HW<_Tt-QH_!0SWI2@8|@w-Z`8+`)s z=Y{PN;Kw>q#e7Esq@%{LM_{+xk&+lVd9{`Z;PsQq5uKlCT((4juT6Z<8^aO-vd2XJ zk(LV^1khlTa~XyQsdD245WD2-$4IF#au^|ikj1{^N!s%~CVbTfV#iP`Ap%BWc#bG_ z-XrB!qSxykk4NR*JLwWY&KV2_nunxm5gI7z6xamh#!UW0U~jSEAKhEEa037$ks5 z$mjEDT zS7qc=-jR|CU@J(^zVGv2JwOuj4@n*KJNdYCvlz)C;amuFx955M!ViGkVBeiiC;pfJ zZXyOkf4N*f|9T?90-C1=h{*d(Uy%`6K*IK^gwzO$NFV_J<8Ro% u0x|F~-NOi?TAMi5{eTZ&-yFXL(#AhWQgd%jDdNEZ0000', re.DOTALL|re.IGNORECASE), lambda match: ''), + (re.compile(r'.*?', re.DOTALL|re.IGNORECASE), lambda match: '<head><title>'), + (re.compile(r'.*?', re.DOTALL|re.IGNORECASE), lambda match: '') + ] + def get_article_url(self, article): link = article.get('id', article.get('guid', None)) if link is None: return article return link - - keep_only_tags = [dict(name='div', attrs={'class':'articolo'}), - dict(name='div', attrs={'class':'body-text'}), -# dict(name='div', attrs={'class':'page-content'}), + + keep_only_tags = [ + dict(attrs={'class':'articolo'}), + dict(attrs={'class':'body-text'}), dict(name='p', attrs={'class':'disclaimer clearfix'}), - dict(name='div', attrs={'id':'contA'}) + dict(attrs={'id':'contA'}) ] remove_tags = [ - dict(name=['object','link']), + dict(name=['object','link','meta']), dict(name='span',attrs={'class':'linkindice'}), dict(name='div', attrs={'class':'bottom-mobile'}), dict(name='div', attrs={'id':['rssdiv','blocco']}), From 75a7f77b6b4dae5a8a364ac5981ac2bc02818087 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 15 Oct 2011 09:29:06 +0530 Subject: [PATCH 6/7] Fix #874753 (Pandigital Novel not recognized) --- src/calibre/devices/misc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/misc.py b/src/calibre/devices/misc.py index f25c41d073..6db97370d6 100644 --- a/src/calibre/devices/misc.py +++ b/src/calibre/devices/misc.py @@ -84,7 +84,7 @@ class PDNOVEL(USBMS): FORMATS = ['epub', 'pdf'] VENDOR_ID = [0x18d1] - PRODUCT_ID = [0xb004] + PRODUCT_ID = [0xb004, 0xa004] BCD = [0x224] VENDOR_NAME = 'ANDROID' From 34d2468e56af9ce13241b18d597f78a41241d191 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 15 Oct 2011 10:00:04 +0530 Subject: [PATCH 7/7] Fix #874689 (Add Remove Cover to book cover) --- src/calibre/gui2/book_details.py | 12 ++++++++++++ src/calibre/gui2/init.py | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index e8968b7cf5..fc05c86531 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -204,6 +204,7 @@ def render_data(mi, use_roman_numbers=True, all_fields=False): class CoverView(QWidget): # {{{ cover_changed = pyqtSignal(object, object) + cover_removed = pyqtSignal(object) def __init__(self, vertical, parent=None): QWidget.__init__(self, parent) @@ -289,10 +290,12 @@ class CoverView(QWidget): # {{{ cm = QMenu(self) paste = cm.addAction(_('Paste Cover')) copy = cm.addAction(_('Copy Cover')) + remove = cm.addAction(_('Remove Cover')) if not QApplication.instance().clipboard().mimeData().hasImage(): paste.setEnabled(False) copy.triggered.connect(self.copy_to_clipboard) paste.triggered.connect(self.paste_from_clipboard) + remove.triggered.connect(self.remove_cover) cm.exec_(ev.globalPos()) def copy_to_clipboard(self): @@ -315,6 +318,13 @@ class CoverView(QWidget): # {{{ self.cover_changed.emit(id_, pixmap_to_data(pmap)) + def remove_cover(self): + id_ = self.data.get('id', None) + self.pixmap = self.default_pixmap + self.do_layout() + self.update() + if id_ is not None: + self.cover_removed.emit(id_) # }}} @@ -457,6 +467,7 @@ class BookDetails(QWidget): # {{{ remote_file_dropped = pyqtSignal(object, object) files_dropped = pyqtSignal(object, object) cover_changed = pyqtSignal(object, object) + cover_removed = pyqtSignal(object) # Drag 'n drop {{{ DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS+BOOK_EXTENSIONS @@ -514,6 +525,7 @@ class BookDetails(QWidget): # {{{ self.cover_view = CoverView(vertical, self) self.cover_view.cover_changed.connect(self.cover_changed.emit) + self.cover_view.cover_removed.connect(self.cover_removed.emit) self._layout.addWidget(self.cover_view) self.book_info = BookInfo(vertical, self) self._layout.addWidget(self.book_info) diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index 1700a9aced..cccf76e713 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -261,6 +261,8 @@ class LayoutMixin(object): # {{{ self.book_details.files_dropped.connect(self.iactions['Add Books'].files_dropped_on_book) self.book_details.cover_changed.connect(self.bd_cover_changed, type=Qt.QueuedConnection) + self.book_details.cover_removed.connect(self.bd_cover_removed, + type=Qt.QueuedConnection) self.book_details.remote_file_dropped.connect( self.iactions['Add Books'].remote_file_dropped_on_book, type=Qt.QueuedConnection) @@ -279,6 +281,12 @@ class LayoutMixin(object): # {{{ if self.cover_flow: self.cover_flow.dataChanged() + def bd_cover_removed(self, id_): + self.library_view.model().db.remove_cover(id_, commit=True, + notify=False) + if self.cover_flow: + self.cover_flow.dataChanged() + def save_layout_state(self): for x in ('library', 'memory', 'card_a', 'card_b'): getattr(self, x+'_view').save_state()