From 4b50654ef2ec7e28dae0426d9a07d7c745e067d0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 15 Jun 2010 10:26:10 -0600 Subject: [PATCH 1/5] Fix #5845 (Updated recipe for Danas) --- resources/recipes/danas.recipe | 56 +++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/resources/recipes/danas.recipe b/resources/recipes/danas.recipe index d82928e323..159553370a 100644 --- a/resources/recipes/danas.recipe +++ b/resources/recipes/danas.recipe @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- __license__ = 'GPL v3' __copyright__ = '2008-2010, Darko Miletic ' ''' @@ -23,7 +22,14 @@ class Danas(BasicNewsRecipe): language = 'sr' publication_type = 'newspaper' remove_empty_feeds = True - 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)} .article_description,body,.lokacija{font-family: Tahoma,Arial,Helvetica,sans1,sans-serif} .nadNaslov,h1,.preamble{font-family: Georgia,"Times New Roman",Times,serif1,serif} .antrfileText{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; margin-bottom: 0; margin-top: 0} h2,.datum,.lokacija,.autor{font-size: small} .antrfileNaslov{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; font-weight:bold; margin-bottom: 0; margin-top: 0} img{margin-bottom: 0.8em} ' + 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)} + .article_description,body,.lokacija{font-family: Tahoma,Arial,Helvetica,sans1,sans-serif} + .nadNaslov,h1,.preamble{font-family: Georgia,"Times New Roman",Times,serif1,serif} + .antrfileText{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; + margin-bottom: 0; margin-top: 0} h2,.datum,.lokacija,.autor{font-size: small} + .antrfileNaslov{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; + font-weight:bold; margin-bottom: 0; margin-top: 0} img{margin-bottom: 0.8em} """ conversion_options = { 'comment' : description @@ -42,19 +48,32 @@ class Danas(BasicNewsRecipe): ] feeds = [ - (u'Politika' , u'http://www.danas.rs/rss/rss.asp?column_id=27') - ,(u'Hronika' , u'http://www.danas.rs/rss/rss.asp?column_id=2' ) - ,(u'Dru\xc5\xa1tvo', u'http://www.danas.rs/rss/rss.asp?column_id=24') - ,(u'Dijalog' , u'http://www.danas.rs/rss/rss.asp?column_id=1' ) - ,(u'Ekonomija', u'http://www.danas.rs/rss/rss.asp?column_id=6' ) - ,(u'Svet' , u'http://www.danas.rs/rss/rss.asp?column_id=25') - ,(u'Srbija' , u'http://www.danas.rs/rss/rss.asp?column_id=28') - ,(u'Kultura' , u'http://www.danas.rs/rss/rss.asp?column_id=5' ) - ,(u'Sport' , u'http://www.danas.rs/rss/rss.asp?column_id=13') - ,(u'Scena' , u'http://www.danas.rs/rss/rss.asp?column_id=42') - ,(u'Feljton' , u'http://www.danas.rs/rss/rss.asp?column_id=19') - ,(u'Periskop' , u'http://www.danas.rs/rss/rss.asp?column_id=4' ) - ,(u'Famozno' , u'http://www.danas.rs/rss/rss.asp?column_id=47') + (u'Politika' , u'http://www.danas.rs/rss/rss.asp?column_id=27') + ,(u'Hronika' , u'http://www.danas.rs/rss/rss.asp?column_id=2' ) + ,(u'Drustvo' , u'http://www.danas.rs/rss/rss.asp?column_id=24') + ,(u'Dijalog' , u'http://www.danas.rs/rss/rss.asp?column_id=1' ) + ,(u'Ekonomija' , u'http://www.danas.rs/rss/rss.asp?column_id=6' ) + ,(u'Svet' , u'http://www.danas.rs/rss/rss.asp?column_id=25') + ,(u'Srbija' , u'http://www.danas.rs/rss/rss.asp?column_id=28') + ,(u'Kultura' , u'http://www.danas.rs/rss/rss.asp?column_id=5' ) + ,(u'Sport' , u'http://www.danas.rs/rss/rss.asp?column_id=13') + ,(u'Scena' , u'http://www.danas.rs/rss/rss.asp?column_id=42') + ,(u'Feljton' , u'http://www.danas.rs/rss/rss.asp?column_id=19') + ,(u'Periskop' , u'http://www.danas.rs/rss/rss.asp?column_id=4' ) + ,(u'Famozno' , u'http://www.danas.rs/rss/rss.asp?column_id=47') + ,(u'Sluzbena beleska' , u'http://www.danas.rs/rss/rss.asp?column_id=48') + ,(u'Suocavanja' , u'http://www.danas.rs/rss/rss.asp?column_id=49') + ,(u'Moj Izbor' , u'http://www.danas.rs/rss/rss.asp?column_id=50') + ,(u'Direktno' , u'http://www.danas.rs/rss/rss.asp?column_id=51') + ,(u'I tome slicno' , u'http://www.danas.rs/rss/rss.asp?column_id=52') + ,(u'No longer and not yet', u'http://www.danas.rs/rss/rss.asp?column_id=53') + ,(u'Resetovanje' , u'http://www.danas.rs/rss/rss.asp?column_id=54') + ,(u'Iza scene' , u'http://www.danas.rs/rss/rss.asp?column_id=60') + ,(u'Drustvoslovlje' , u'http://www.danas.rs/rss/rss.asp?column_id=55') + ,(u'Zvaka u pepeljari' , u'http://www.danas.rs/rss/rss.asp?column_id=56') + ,(u'Vostani Serbie' , u'http://www.danas.rs/rss/rss.asp?column_id=57') + ,(u'Med&Jad-a' , u'http://www.danas.rs/rss/rss.asp?column_id=58') + ,(u'Svetlosti pozornice' , u'http://www.danas.rs/rss/rss.asp?column_id=59') ] def preprocess_html(self, soup): @@ -65,3 +84,10 @@ class Danas(BasicNewsRecipe): def print_version(self, url): return url + '&action=print' + def get_cover_url(self): + cover_url = None + soup = self.index_to_soup('http://www.danas.rs/') + for citem in soup.findAll('img'): + if citem['src'].endswith('naslovna.jpg'): + return 'http://www.danas.rs' + citem['src'] + return cover_url From 60219fe54cd83e3ce53ebd21ca985b6aa62f044b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 15 Jun 2010 10:37:27 -0600 Subject: [PATCH 2/5] Add author_sort_map to MetaInformation --- src/calibre/ebooks/metadata/__init__.py | 7 ++++++- src/calibre/ebooks/metadata/book/__init__.py | 2 ++ src/calibre/ebooks/metadata/book/base.py | 1 + src/calibre/library/database2.py | 6 +++++- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index c633e5149b..8caca1f261 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -223,6 +223,7 @@ class MetaInformation(object): 'isbn', 'tags', 'cover_data', 'application_id', 'guide', 'manifest', 'spine', 'toc', 'cover', 'language', 'book_producer', 'timestamp', 'lccn', 'lcc', 'ddc', + 'author_sort_map', 'pubdate', 'rights', 'publication_type', 'uuid'): if hasattr(mi, attr): setattr(ans, attr, getattr(mi, attr)) @@ -244,6 +245,7 @@ class MetaInformation(object): self.tags = getattr(mi, 'tags', []) #: mi.cover_data = (ext, data) self.cover_data = getattr(mi, 'cover_data', (None, None)) + self.author_sort_map = getattr(mi, 'author_sort_map', {}) for x in ('author_sort', 'title_sort', 'comments', 'category', 'publisher', 'series', 'series_index', 'rating', 'isbn', 'language', @@ -258,7 +260,7 @@ class MetaInformation(object): 'series', 'series_index', 'tags', 'rating', 'isbn', 'language', 'application_id', 'manifest', 'toc', 'spine', 'guide', 'cover', 'book_producer', 'timestamp', 'lccn', 'lcc', 'ddc', 'pubdate', - 'rights', 'publication_type', 'uuid' + 'rights', 'publication_type', 'uuid', 'author_sort_map' ): prints(x, getattr(self, x, 'None')) @@ -288,6 +290,9 @@ class MetaInformation(object): self.tags += mi.tags self.tags = list(set(self.tags)) + if mi.author_sort_map: + self.author_sort_map.update(mi.author_sort_map) + if getattr(mi, 'cover_data', False): other_cover = mi.cover_data[-1] self_cover = self.cover_data[-1] if self.cover_data else '' diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index 8483c2bddb..c3b95f1188 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -35,6 +35,8 @@ PUBLICATION_METADATA_FIELDS = frozenset([ 'title_sort', # Ordered list of authors. Must never be None, can be [_('Unknown')] 'authors', + # Map of sort strings for each author + 'author_sort_map', # Pseudo field that can be set, but if not set is auto generated # from authors and languages 'author_sort', diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index ad5dd17ace..ba34f04f95 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -16,6 +16,7 @@ NULL_VALUES = { 'classifiers' : {}, 'languages' : [], 'device_collections': [], + 'author_sort_map': {}, 'authors' : [_('Unknown')], 'title' : _('Unknown'), } diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 321a5fce17..c7830187df 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -433,7 +433,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if aum: aum = [a.strip().replace('|', ',') for a in aum.split(',')] mi = MetaInformation(self.title(idx, index_is_id=index_is_id), aum) mi.author_sort = self.author_sort(idx, index_is_id=index_is_id) - mi.authors_sort_strings = self.authors_sort_strings(idx, index_is_id) + if mi.authors: + mi.author_sort_map = {} + for name, sort in zip(mi.authors, self.authors_sort_strings(idx, + index_is_id)): + mi.author_sort_map[name] = sort mi.comments = self.comments(idx, index_is_id=index_is_id) mi.publisher = self.publisher(idx, index_is_id=index_is_id) mi.timestamp = self.timestamp(idx, index_is_id=index_is_id) From 6d80e2093cee088427e2d5fd50099f2fdc0bacb4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 15 Jun 2010 11:03:19 -0600 Subject: [PATCH 3/5] Thai Rath and The Nation (Thailand) by Anat Ruangrassamee --- resources/recipes/thairath.recipe | 58 ++++++++++++++++++++++++ resources/recipes/the_nation_thai.recipe | 44 ++++++++++++++++++ src/calibre/utils/localization.py | 1 + 3 files changed, 103 insertions(+) create mode 100644 resources/recipes/thairath.recipe create mode 100644 resources/recipes/the_nation_thai.recipe diff --git a/resources/recipes/thairath.recipe b/resources/recipes/thairath.recipe new file mode 100644 index 0000000000..6ebb84f3a5 --- /dev/null +++ b/resources/recipes/thairath.recipe @@ -0,0 +1,58 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1271637235(BasicNewsRecipe): + + title = u'Thairath' + __author__ = 'Anat R.' + language = 'th' + + oldest_article = 7 + + max_articles_per_feed = 100 + no_stylesheets = True + + remove_javascript = True + + use_embedded_content = False + feeds = [(u'News', +u'http://www.thairath.co.th/rss/news.xml'), (u'Politics', +u'http://www.thairath.co.th/rss/pol.xml'), (u'Economy', +u'http://www.thairath.co.th/rss/eco.xml'), (u'International', +u'http://www.thairath.co.th/rss/oversea.xml'), (u'Sports', +u'http://www.thairath.co.th/rss/sport.xml'), (u'Life', +u'http://www.thairath.co.th/rss/life.xml'), (u'Education', +u'http://www.thairath.co.th/rss/edu.xml'), (u'Tech', +u'http://www.thairath.co..th/rss/tech.xml'), (u'Entertainment', +u'http://www.thairath.co.th/rss/ent.xml')] + keep_only_tags = [] + + keep_only_tags.append(dict(name = 'h1', attrs = {'id' : 'title'})) + + keep_only_tags.append(dict(name = 'ul', attrs = {'class' : +'detail-info'})) + + keep_only_tags.append(dict(name = 'img', attrs = {'class' : +'detail-image'})) + + keep_only_tags.append(dict(name = 'div', attrs = {'class' : +'entry'})) + remove_tags = [] + remove_tags.append(dict(name = 'div', attrs = {'id': +'menu-holder'})) + + remove_tags.append(dict(name = 'div', attrs = {'class': +'addthis_toolbox addthis_default_style'})) + + remove_tags.append(dict(name = 'div', attrs = {'class': 'box top-item'})) + + remove_tags.append(dict(name = 'div', attrs = {'class': 'column-200 column-margin-430'})) + + remove_tags.append(dict(name = 'div', attrs = {'id': +'detail-related'})) + + remove_tags.append(dict(name = 'div', attrs = {'id': 'related'})) + + remove_tags.append(dict(name = 'id', attrs = {'class': 'footer'})) + + remove_tags.append(dict(name = "ul",attrs = +{'id':'banner-highlights-images'})) diff --git a/resources/recipes/the_nation_thai.recipe b/resources/recipes/the_nation_thai.recipe new file mode 100644 index 0000000000..a33a16e0a5 --- /dev/null +++ b/resources/recipes/the_nation_thai.recipe @@ -0,0 +1,44 @@ + +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1271596863(BasicNewsRecipe): + + title = u'The Nation' + __author__ = 'Anat R.' + language = 'en_TH' + + oldest_article = 7 + + max_articles_per_feed = 100 + no_stylesheets = True + + remove_javascript = True + + use_embedded_content = False + feeds = [(u'Topstory', +u'http://www.nationmultimedia.com/home/rss/topstories.rss'), +(u'National', u'http://www.nationmultimedia.com/home/rss/national.rss'), + (u'Politics', +u'http://www.nationmultimedia.com/home/rss/politics.rss'), (u'Business', + u'http://www.nationmultimedia.com/home/rss/business.rss'), +(u'Regional', u'http://www.nationmultimedia.com/home/rss/regional.rss'), + (u'Sports', u'http://www.nationmultimedia.com/home/rss/sport.rss'), +(u'Travel', u'http://www.nationmultimedia.com/home/rss/travel.rss'), +(u'Life', u'http://www.nationmultimedia.com/home/rss/life.rss')] + keep_only_tags = [] + + keep_only_tags.append(dict(name = 'div', attrs = {'class' : +'pd10'})) + remove_tags = [] + + remove_tags.append(dict(name = 'div', attrs = {'class': +'WrapperHeaderCol2-2'})) + + remove_tags.append(dict(name = 'div', attrs = {'class': +'LayoutMenu2'})) + + remove_tags.append(dict(name = 'div', attrs = {'class': +'TextHeaderRight'})) + + remove_tags.append(dict(name = "ul",attrs = {'id':'toolZoom'})) + diff --git a/src/calibre/utils/localization.py b/src/calibre/utils/localization.py index 026547ee2e..e60a3233c6 100644 --- a/src/calibre/utils/localization.py +++ b/src/calibre/utils/localization.py @@ -103,6 +103,7 @@ _extra_lang_codes = { 'en_TH' : _('English (Thailand)'), 'en_CY' : _('English (Cyprus)'), 'en_PK' : _('English (Pakistan)'), + 'en_IL' : _('English (Israel)'), 'en_SG' : _('English (Singapore)'), 'en_YE' : _('English (Yemen)'), 'en_IE' : _('English (Ireland)'), From 9e31b075da56b77217eda794ce39b5415f4ccf41 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 15 Jun 2010 11:06:21 -0600 Subject: [PATCH 4/5] Click to open in book details on device view now opens the actual file instead of the folder containing it --- src/calibre/gui2/book_details.py | 5 +---- src/calibre/gui2/status.py | 3 +-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 75c045d011..8cf726420c 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -258,8 +258,7 @@ class BookDetails(QWidget): id_, fmt = val.split(':') self.view_specific_format.emit(int(id_), fmt) elif typ == 'devpath': - path = os.path.dirname(val) - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) + QDesktopServices.openUrl(QUrl.fromLocalFile(val)) def mouseReleaseEvent(self, ev): @@ -275,8 +274,6 @@ class BookDetails(QWidget): self.setToolTip('

'+_('Click to open Book Details window') + '

' + _('Path') + ': ' + data.get(_('Path'), '')) - - def reset_info(self): self.show_data({}) diff --git a/src/calibre/gui2/status.py b/src/calibre/gui2/status.py index 90426f8021..9aa9b8262c 100644 --- a/src/calibre/gui2/status.py +++ b/src/calibre/gui2/status.py @@ -239,8 +239,7 @@ class StatusBar(QStatusBar, StatusBarInterface, BookDetailsInterface): id_, fmt = val.split(':') self.view_specific_format.emit(int(id_), fmt) elif typ == 'devpath': - path = os.path.dirname(val) - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) + QDesktopServices.openUrl(QUrl.fromLocalFile(val)) def resizeEvent(self, ev): From 6db976e5aaf973ffa72b6a6a0dac5fe6748a6258 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 15 Jun 2010 11:16:09 -0600 Subject: [PATCH 5/5] Fix #5843 (Book covers not displaying when in device view) --- src/calibre/gui2/book_details.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 8cf726420c..a397ab903d 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -109,7 +109,7 @@ class CoverView(QWidget): # {{{ def show_data(self, data): self.animation.stop() - if data.get('id', None) == self.data.get('id', None): + if data.get('id', True) == self.data.get('id', False): return self.data = {'id':data.get('id', None)} if data.has_key('cover'):