diff --git a/resources/images/news/biggovernment.png b/resources/images/news/biggovernment.png new file mode 100644 index 0000000000..d5c2442ebb Binary files /dev/null and b/resources/images/news/biggovernment.png differ diff --git a/resources/images/news/eluniversal.png b/resources/images/news/eluniversal.png new file mode 100644 index 0000000000..cd970ab9e5 Binary files /dev/null and b/resources/images/news/eluniversal.png differ diff --git a/resources/images/news/propublica.png b/resources/images/news/propublica.png new file mode 100644 index 0000000000..02954be4ea Binary files /dev/null and b/resources/images/news/propublica.png differ diff --git a/resources/recipes/biggovernment.recipe b/resources/recipes/biggovernment.recipe new file mode 100644 index 0000000000..ccb4e64678 --- /dev/null +++ b/resources/recipes/biggovernment.recipe @@ -0,0 +1,27 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class BigGovernmentRecipe(BasicNewsRecipe): + __license__ = 'GPL v3' + __author__ = 'kwetal' + language = 'en_US' + version = 1 + + title = u'Big Government' + publisher = u'Andrew Breitbart' + category = u'Political blog' + description = u'Political news from the USA' + + oldest_article = 30 + max_articles_per_feed = 100 + use_embedded_content = True + + feeds = [(u'Big Government', u'http://feeds.feedburner.com/BigGovernment')] + + conversion_options = {'comments': description, 'tags': category, 'language': 'en', + 'publisher': publisher} + + extra_css = ''' + body{font-family:verdana,arial,helvetica,geneva,sans-serif;} + img {float: left; margin-right: 0.5em;} + ''' + diff --git a/resources/recipes/cyprus_weekly.recipe b/resources/recipes/cyprus_weekly.recipe new file mode 100644 index 0000000000..d8762609a2 --- /dev/null +++ b/resources/recipes/cyprus_weekly.recipe @@ -0,0 +1,108 @@ +from calibre.web.feeds.news import BasicNewsRecipe +from datetime import datetime, timedelta + +class CyNewsLiveRecipe(BasicNewsRecipe): + __license__ = 'GPL v3' + __author__ = 'kwetal' + language = 'en_CY' + version = 1 + + title = u'Cyprus Weekly' + publisher = u'The Cyprus Weekly' + category = u'News, Newspaper' + description = u'News from Cyprus' + + use_embedded_content = False + remove_empty_feeds = True + oldest_article = 7 + max_articles_per_feed = 100 + + no_stylesheets = True + remove_javascript = True + + pubTime = None + minTime = None + articleCount = 0 + + INDEX = 'http://www.cyprusweekly.com.cy/main/default.aspx' + + feeds = [] + feeds.append(('News: Cyprus', 'http://www.cyprusweekly.com.cy/main/92,0,0,0-CYPRUS.aspx')) + feeds.append(('News: World', 'http://www.cyprusweekly.com.cy/main/78,0,0,0-UKWORLD.aspx')) + feeds.append(('Sport: Football', 'http://www.cyprusweekly.com.cy/main/82,0,0,0-FOOTBALL.aspx')) + feeds.append(('Sport: Rugby', 'http://www.cyprusweekly.com.cy/main/83,0,0,0-RUGBY.aspx')) + feeds.append(('Sport: Cricket', 'http://www.cyprusweekly.com.cy/main/85,0,0,0-CRICKET.aspx')) + feeds.append(('Sport: Tennis', 'http://www.cyprusweekly.com.cy/main/84,0,0,0-TENNIS.aspx')) + feeds.append(('Sport: Other', 'http://www.cyprusweekly.com.cy/main/86,0,0,0-OTHER.aspx')) + feeds.append(('Business: Local', 'http://www.cyprusweekly.com.cy/main/100,0,0,0-LOCAL.aspx')) + feeds.append(('Business: Foreign', 'http://www.cyprusweekly.com.cy/main/101,0,0,0-FOREIGN.aspx')) + feeds.append(('Whats On: Places of Interest', 'http://www.cyprusweekly.com.cy/main/123,0,0,0-PLACES-OF-INTEREST.aspx')) + feeds.append(('Whats On: Going Out', 'http://www.cyprusweekly.com.cy/main/153,0,0,0-GOING-OUT.aspx')) + feeds.append(('Whats On: Arts & Entertainment', 'http://www.cyprusweekly.com.cy/main/135,0,0,0-ARTS--and-ENTERTAINMENT.aspx')) + feeds.append(('Whats On: Things To Do', 'http://www.cyprusweekly.com.cy/main/136,0,0,0-THINGS-TO-DO.aspx')) + feeds.append(('Whats On: Shopping Guide', 'http://www.cyprusweekly.com.cy/main/142,0,0,0-SHOPPING-GUIDE.aspx')) + feeds.append(('Culture', 'http://www.cyprusweekly.com.cy/main/208,0,0,0-CULTURE.aspx')) + feeds.append(('Environment', 'http://www.cyprusweekly.com.cy/main/93,0,0,0-ENVIRONMENT.aspx')) + feeds.append(('Info', 'http://www.cyprusweekly.com.cy/main/91,0,0,0-INFO.aspx')) + + keep_only_tags = [] + keep_only_tags.append(dict(name = 'div', attrs = {'class': 'ArticleCategories'})) + + extra_css = ''' + body{font-family:verdana,arial,helvetica,geneva,sans-serif ;} + ''' + + def parse_index(self): + answer = [] + for feed in self.feeds: + self.articleCount = 0 + articles = [] + soup = self.index_to_soup(feed[1]) + + table = soup.find('table', attrs = {'id': 'ctl00_cp_ctl01_listp'}) + if table: + self.pubTime = datetime.now() + self.minTime = self.pubTime - timedelta(days = self.oldest_article) + + self.find_articles(table, articles) + + answer.append((feed[0], articles)) + + return answer + + def postprocess_html(self, soup, first): + for el in soup.findAll(attrs = {'style': True}): + del el['style'] + + for el in soup.findAll('font'): + el.name = 'div' + for attr, value in el: + del el[attr] + + return soup + + def find_articles(self, table, articles): + for div in table.findAll('div', attrs = {'class': 'ListArticle'}): + el = div.find('div', attrs = {'class': 'ListArticle_T'}) + title = self.tag_to_string(el.a) + url = self.INDEX + el.a['href'] + + description = self.tag_to_string(div.find('div', attrs = {'class': 'ListArticle_BODY300'})) + + el = div.find('div', attrs = {'class': 'ListArticle_D'}) + if el: + dateParts = self.tag_to_string(el).split(' ') + monthNames = {'January': 1, 'February': 2, 'March': 3, 'April': 4, 'May': 5, 'June': 6, + 'July': 7, 'August': 8, 'September': 9, 'October': 10, 'November': 11, + 'December': 12} + timeParts = dateParts[3].split(':') + self.pubTime = datetime(year = int(dateParts[2]), month = int(monthNames[dateParts[1]]), + day = int(dateParts[0]), hour = int(timeParts[0]), + minute = int(timeParts[1])) + + if self.pubTime >= self.minTime and self.articleCount <= self.max_articles_per_feed: + articles.append({'title': title, 'date': self.pubTime, 'url': url, 'description': description}) + self.articleCount += 1 + else: + return + diff --git a/resources/recipes/denver_post.recipe b/resources/recipes/denver_post.recipe new file mode 100644 index 0000000000..fe7ead9de7 --- /dev/null +++ b/resources/recipes/denver_post.recipe @@ -0,0 +1,57 @@ +from calibre.web.feeds.news import BasicNewsRecipe +from calibre.ebooks.BeautifulSoup import BeautifulSoup + +class DenverPost(BasicNewsRecipe): + title = u'Denver Post' + language = 'en' + __author__ = 'Krittika Goyal' + oldest_article = 1 #days + max_articles_per_feed = 20 + + conversion_options = {'linearize_tables':True} + + no_stylesheets = True + #remove_tags_before = dict(name='h1', attrs={'class':'heading'}) + #remove_tags_after = dict(name='td', attrs={'class':'newptool1'}) + remove_tags = [ + dict(name='iframe'), + dict(name='img', src=lambda x: not x or '/tracking/' in x), + dict(name='span', attrs={'fd-id':True}), + dict(name='div', attrs={'class':['articleOptions', 'articlePosition2']}), + #dict(name='div', attrs={'id':['qrformdiv', 'inSection', 'alpha-inner']}), + #dict(name='ul', attrs={'class':'article-tools'}), + #dict(name='ul', attrs={'class':'articleTools'}), + ] + + feeds = [ +('Top Stories', + 'http://feeds.denverpost.com/dp-news-topstories'), +('Business', + 'http://feeds.denverpost.com/dp-business'), +('Sports', + 'http://feeds.denverpost.com/dp-sports'), +('Lifestyles', + 'http://feeds.denverpost.com/dp-lifestyles'), +('Politics', + 'http://feeds.denverpost.com/dp-politics'), +('Entertainment', + 'http://feeds.denverpost.com/dp-entertainment'), + +] + + def preprocess_html(self, soup): + story = soup.find(name='td', attrs={'class':'articleBox'}) + #td = heading.findParent(name='td') + #td.extract() + story.extract() + soup = BeautifulSoup('
'+_('The template %s is invalid:')%tmpl + \
- ' '+_('The template %s is invalid:')%tmpl + \
+ ' There was an error reading from file: Search the list of books by title, author, publisher, tags, comments, etc. The database of books on the reader is corrupted. Try the following:\n"
@@ -5413,277 +5421,281 @@ msgid ""
" "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:895
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:892
msgid "How many empty books?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:896
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:893
msgid "How many empty books should be added?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:940
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:987
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:937
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:984
msgid "Uploading books to device."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:948
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:945
msgid "EPUB Books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:949
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:946
msgid "LRF Books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:950
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:947
msgid "HTML Books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:951
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:948
msgid "LIT Books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:952
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:949
msgid "MOBI Books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:953
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:950
msgid "Text books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:954
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:951
msgid "PDF Books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:955
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:952
msgid "Comics"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:956
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:953
msgid "Archives"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:960
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:957
msgid "Supported books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:996
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:993
msgid "Failed to read metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:997
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:994
msgid "Failed to read metadata from the following"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1016
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1013
msgid "Cannot delete"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1019
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1507
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1526
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1016
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1504
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1523
msgid "No book selected"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1029
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1026
msgid "Choose formats to be deleted"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1045
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1042
msgid "Choose formats not to be deleted"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1081
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1078
msgid "The selected books will be permanently deleted and the files removed from your computer. Are you sure?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1108
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1105
msgid "Deleting books from device."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1139
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1136
msgid "Cannot download metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1140
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1197
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1230
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1255
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1368
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1137
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1194
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1227
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1252
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1365
msgid "No books selected"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1155
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1152
msgid "social metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1157
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1154
msgid "covers"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1157
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1154
msgid "metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1159
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1156
msgid "Downloading %s for %d book(s)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1181
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1178
msgid "Failed to download some metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1182
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1179
msgid "Failed to download metadata for the following:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1185
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1182
msgid "Failed to download metadata:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1196
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1229
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1193
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1226
msgid "Cannot edit metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1254
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1251
msgid "Cannot save to disk"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1257
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1254
msgid "Choose destination directory"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1284
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1281
msgid "Error while saving"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1285
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1282
msgid "There was an error while saving."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1292
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1293
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1289
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1290
msgid "Could not save some books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1294
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1291
msgid "Click the show details button to see which ones."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1313
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1310
msgid "Fetching news from "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1327
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1324
msgid " fetched."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1367
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1364
msgid "Cannot convert"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1396
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1393
msgid "Starting conversion of %d book(s)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1507
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1563
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1504
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1560
msgid "Cannot view"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1525
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1522
msgid "Cannot open folder"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1547
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1544
msgid "Multiple Books Selected"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1548
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1545
msgid "You are attempting to open %d books. Opening too many books at once can be slow and have a negative effect on the responsiveness of your computer. Once started the process cannot be stopped until complete. Do you wish to continue?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1564
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1561
msgid "%s has no available formats."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1605
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1602
msgid "Cannot configure"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1606
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1603
msgid "Cannot configure while there are running jobs."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1649
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1646
msgid "No detailed info available"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1650
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1647
msgid "No detailed information is available for books on the device."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1705
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1702
msgid "Error talking to device"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1706
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1703
msgid "There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1729
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1747
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1726
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1754
msgid "Conversion Error"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1730
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1727
msgid " Could not convert: %s It is a DRMed book. You must first remove the DRM using third party tools."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1748
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1740
+msgid "Recipe Disabled"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1755
msgid "Failed"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1776
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1783
msgid "Invalid library location"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1777
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1784
msgid "Could not access %s. Using %s as the library."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1825
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1832
msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1850
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1857
msgid "There are active jobs. Are you sure you want to quit?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1853
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1860
msgid ""
" is communicating with the device! An invalid library already exists at %s, delete it before trying to move the existing library.
'+str(err), show=True)
- return False
- return True
+ return self.save_template.validate() and self.send_template.validate()
def save_settings(self):
if not self.validate():
@@ -79,12 +58,13 @@ class AddSave(QTabWidget, Ui_TabWidget):
for x in ('asciiize', 'update_metadata', 'save_cover', 'write_opf',
'replace_whitespace', 'to_lowercase'):
c.set(x, getattr(self, 'opt_'+x).isChecked())
- for x in ('formats', 'template', 'timefmt'):
+ for x in ('formats', 'timefmt'):
val = unicode(getattr(self, 'opt_'+x).text()).strip()
if x == 'formats' and not val:
val = 'all'
c.set(x, val)
- self.opt_template.save_history('save_to_disk_template_history')
+ self.save_template.save_settings(c, 'template')
+ self.send_template.save_settings(c, 'send_template')
prefs['read_file_metadata'] = not bool(self.opt_read_metadata_from_filename.isChecked())
pattern = self.filename_pattern.commit()
prefs['filename_pattern'] = pattern
diff --git a/src/calibre/gui2/dialogs/config/add_save.ui b/src/calibre/gui2/dialogs/config/add_save.ui
index 806f77dade..fbf9ceaf2a 100644
--- a/src/calibre/gui2/dialogs/config/add_save.ui
+++ b/src/calibre/gui2/dialogs/config/add_save.ui
@@ -141,38 +141,6 @@
'%
+ (var, FORMAT_ARG_DESCS[var]))
+ table = u'%s %s %s
'%(u'\n'.join(rows))
+ self.template_variables.setText(table)
+
+ self.opt_template.initialize(name+'_template_history',
+ default, help)
+ self.option_name = name
+
+ def validate(self):
+ tmpl = preprocess_template(self.opt_template.text())
+ fa = {}
+ for x in FORMAT_ARG_DESCS.keys():
+ fa[x]=''
+ try:
+ tmpl.format(**fa)
+ except Exception, err:
+ error_dialog(self, _('Invalid template'),
+ '
'+str(err), show=True)
+ return False
+ return True
+
+ def save_settings(self, config, name):
+ val = unicode(self.opt_template.text())
+ config.set(name, val)
+ self.opt_template.save_history(self.option_name+'_template_history')
+
+
+
+
+
diff --git a/src/calibre/gui2/dialogs/config/save_template.ui b/src/calibre/gui2/dialogs/config/save_template.ui
new file mode 100644
index 0000000000..02506891bb
--- /dev/null
+++ b/src/calibre/gui2/dialogs/config/save_template.ui
@@ -0,0 +1,60 @@
+
+
"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:176
+#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:124
msgid " is not a valid picture"
msgstr ""
@@ -2795,7 +2803,7 @@ msgid "RB Output"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1513
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1510
msgid "Choose the format to view"
msgstr ""
@@ -3300,7 +3308,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:216
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:350
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:93
-#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132
msgid "Formats"
msgstr ""
@@ -3403,7 +3411,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:475
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:819
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:158
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1186
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1183
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53
msgid "Error"
msgstr ""
@@ -3473,12 +3481,12 @@ msgid "Access log:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:674
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:635
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:634
msgid "Failed to start content server"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:698
-#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:520
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:549
msgid "Select location for books"
msgstr ""
@@ -3612,7 +3620,7 @@ msgid "&Saving books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:499
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:368
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:366
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:173
msgid "Preferences"
msgstr ""
@@ -4067,7 +4075,7 @@ msgid "Choose formats for "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:947
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:944
msgid "Books"
msgstr ""
@@ -4967,135 +4975,135 @@ msgstr ""
msgid "try deleting the file"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:333
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:331
msgid "calibre"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:335
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:333
msgid "Advanced search"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:337
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:335
msgid "Alt+S"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:338
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:336
msgid "&Search:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:339
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:340
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:337
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:338
msgid "
Words separated by spaces are ANDed"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:341
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:339
msgid "Reset Quick Search"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:343
-msgid "Match any"
-msgstr ""
-
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:344
-msgid "Match all"
-msgstr ""
-
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:345
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:341
msgid "Sort by &popularity"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:346
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:342
+msgid "Match any"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:343
+msgid "Match all"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:344
msgid "Add books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:347
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:345
msgid "A"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:348
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:349
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:346
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:347
msgid "Remove books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:350
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:348
msgid "Del"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:351
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:349
msgid "Edit meta information"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:352
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:350
msgid "E"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:353
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:351
msgid "Send to device"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:354
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:352
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:304
msgid "Save to disk"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:355
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:353
msgid "S"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:356
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:354
msgid "Fetch news"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:357
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:355
msgid "F"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:358
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:356
msgid "Convert E-books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:359
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:357
msgid "C"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:360
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:358
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:314
msgid "View"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:361
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:359
msgid "V"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:362
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:360
msgid "Open containing folder"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:363
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:361
msgid "Show book details"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:364
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:362
msgid "Books by same author"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:365
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:363
msgid "Books in this series"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:366
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:364
msgid "Books by this publisher"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:367
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:365
msgid "Books with the same tags"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:369
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:367
msgid "Configure calibre"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:370
+#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:368
msgid "Ctrl+P"
msgstr ""
@@ -5207,11 +5215,11 @@ msgstr ""
msgid "Click to browse books by tags"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132
msgid "Authors"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:125
+#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132
msgid "Publishers"
msgstr ""
@@ -5327,7 +5335,7 @@ msgid "Save to disk in a single directory"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:306
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1621
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1618
msgid "Save only %s format to disk"
msgstr ""
@@ -5373,36 +5381,36 @@ msgid "Bad database location"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:471
-#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:528
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:557
msgid "Calibre Library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:481
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1767
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1774
msgid "Choose a location for your ebook library."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:678
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:677
msgid "Browse by covers"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:795
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:792
msgid "Device: "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:797
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:794
msgid " detected."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:821
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:818
msgid "Connected "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:833
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:830
msgid "Device database corrupted"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:834
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:831
msgid ""
"\n"
"
\n"
" Quitting may cause corruption on the device.
\n"
" Are you sure you want to quit?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1857
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1864
msgid "WARNING: Active jobs"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1909
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1916
msgid "will keep running in the system tray. To close it, choose Quit in the context menu of the system tray."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1928
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1935
msgid "Latest version: %s"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1936
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1943
msgid "Update available"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1937
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1944
msgid "%s has been updated to version %s. See the new features. Visit the download page?"
msgstr ""
@@ -6138,40 +6150,40 @@ msgstr ""
msgid "Title Case"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:301
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:330
msgid "If you use the WordPlayer e-book app on your Android phone, you can access your calibre book collection directly on the device. To do this you have to turn on the content server."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:305
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:334
msgid "Remember to leave calibre running as the server only runs as long as calibre is running."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:307
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:336
msgid "You have to add the URL http://myhostname:8080 as your calibre library in WordPlayer. Here myhostname should be the fully qualified hostname or the IP address of the computer calibre is running on."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:384
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:413
msgid "Moving library..."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:400
-#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:401
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:429
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:430
msgid "Failed to move library"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:455
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:484
msgid "Invalid database"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:456
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:485
msgid "
Error: %s"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:467
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:496
msgid "Could not move library"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:595
+#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:624
msgid "welcome wizard"
msgstr ""
@@ -6719,6 +6731,10 @@ msgid ""
"Start the calibre content server."
msgstr ""
+#: /home/kovid/work/calibre/src/calibre/library/server.py:858
+msgid "Path to the library folder to serve with the content server"
+msgstr ""
+
#: /home/kovid/work/calibre/src/calibre/utils/config.py:48
msgid ""
"%sUsage%s: %s\n"
@@ -6837,14 +6853,18 @@ msgid "English (CY)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:104
-msgid "German (AT)"
+msgid "English (PK)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:105
-msgid "Dutch (NL)"
+msgid "German (AT)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:106
+msgid "Dutch (NL)"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/utils/localization.py:107
msgid "Dutch (BE)"
msgstr ""
@@ -6878,99 +6898,99 @@ msgstr ""
msgid "Untitled article"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:18
+#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:21
msgid "Download periodical content from the internet"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:33
+#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:36
msgid "Useful for recipe development. Forces max_articles_per_feed to 2 and downloads at most 2 feeds."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:36
+#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:39
msgid "Username for sites that require a login to access content."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:39
+#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:42
msgid "Password for sites that require a login to access content."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:43
-msgid "Download latest version of builtin recipes"
+#: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:46
+msgid "Do not download latest version of builtin recipes from the calibre server"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:40
msgid "Unknown News Source"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:513
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:520
msgid "The \"%s\" recipe needs a username and password."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:599
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:606
msgid "Download finished"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:601
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:608
msgid "Failed to download the following articles:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:607
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:614
msgid "Failed to download parts of the following articles:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:609
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:616
msgid " from "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:611
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:618
msgid "\tFailed links:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:692
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699
msgid "Could not fetch article. Run with -vv to see the reason"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:713
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:720
msgid "Fetching feeds..."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:725
msgid "Got feeds from index page"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:724
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:731
msgid "Trying to download cover..."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:782
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:789
msgid "Starting download [%d thread(s)]..."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:798
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:805
msgid "Feeds downloaded to %s"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:808
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:815
msgid "Could not download cover: %s"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:815
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:827
msgid "Downloading cover from %s"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:941
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:962
msgid "Untitled Article"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1012
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1033
msgid "Article downloaded: %s"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1023
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1044
msgid "Article download failed: %s"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1040
+#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1061
msgid "Fetching feed"
msgstr ""
diff --git a/src/calibre/web/feeds/news.py b/src/calibre/web/feeds/news.py
index 789710d764..60943de806 100644
--- a/src/calibre/web/feeds/news.py
+++ b/src/calibre/web/feeds/news.py
@@ -819,10 +819,24 @@ class BasicNewsRecipe(Recipe):
if '?' in ext:
ext = ''
ext = ext.lower() if ext else 'jpg'
- self.report_progress(1, _('Downloading cover from %s')%cu)
cpath = os.path.join(self.output_dir, 'cover.'+ext)
- with nested(open(cpath, 'wb'), closing(self.browser.open(cu))) as (cfile, r):
- cfile.write(r.read())
+ if os.access(cu, os.R_OK):
+ with open(cpath, 'wb') as cfile:
+ cfile.write(open(cu, 'rb').read())
+ else:
+ self.report_progress(1, _('Downloading cover from %s')%cu)
+ with nested(open(cpath, 'wb'), closing(self.browser.open(cu))) as (cfile, r):
+ cfile.write(r.read())
+ if ext.lower() == 'pdf':
+ from calibre.ebooks.metadata.pdf import get_metadata
+ stream = open(cpath, 'rb')
+ mi = get_metadata(stream)
+ cpath = None
+ if mi.cover_data and mi.cover_data[1]:
+ cpath = os.path.join(self.output_dir,
+ 'cover.'+mi.cover_data[0])
+ with open(cpath, 'wb') as f:
+ f.write(mi.cover_data[1])
self.cover_path = cpath