From 9a45ad364131e2bfded61c165c42afe38ee347e4 Mon Sep 17 00:00:00 2001 From: FaceDeer Date: Wed, 20 Dec 2017 10:27:52 -0700 Subject: [PATCH 01/26] fimfiction adapter: add new tag types, fix groups (#259) * missed the "st" ordinal case when parsing dates * add option to collect Fimfiction author's notes * fimfiction adapter: views/total_views being read incorrectly * Add new tag types to fimfiction adapter and fix groups metadata --- fanficfare/adapters/adapter_fimfictionnet.py | 26 ++++++++++++-------- fanficfare/defaults.ini | 7 +++--- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/fanficfare/adapters/adapter_fimfictionnet.py b/fanficfare/adapters/adapter_fimfictionnet.py index 3ddbbef..fe37413 100644 --- a/fanficfare/adapters/adapter_fimfictionnet.py +++ b/fanficfare/adapters/adapter_fimfictionnet.py @@ -252,11 +252,13 @@ class FimFictionNetSiteAdapter(BaseSiteAdapter): self.story.addToList("characters", stripHTML(character)) for genre in tags.find_all("a", {"class":"tag-genre"}): self.story.addToList("genre", stripHTML(genre)) - # only two warnings I've seen, each with their own class(and color) - for gore in tags.find_all("a", {"class":"tag-gore"}): - self.story.addToList("warnings", stripHTML(gore)) - for sex in tags.find_all("a", {"class":"tag-sex"}): - self.story.addToList("warnings", stripHTML(sex)) + for series in tags.find_all("a", {"class":"tag-series"}): + #using 'fandoms' as the identifier to standardize with archiveofourown.org + self.story.addToList("fandoms", stripHTML(series)) + for warning in tags.find_all("a", {"class":"tag-warning"}): + self.story.addToList("warnings", stripHTML(warning)) + for content in tags.find_all("a", {"class":"tag-content"}): + self.story.addToList("content", stripHTML(content)) # Likes and dislikes storyToolbar = soup.find('div', {'class':'story-top-toolbar'}) @@ -282,8 +284,8 @@ class FimFictionNetSiteAdapter(BaseSiteAdapter): self.story.setMetadata("short_description", stripHTML(descriptionMeta['content'])) #groups - groupDiv = soup.find('div', {'class':'groups'}) - if groupDiv != None and groupDiv.find('div').find('button'): + groupButton = soup.find('button', {'data-click':'showAll'}) + if groupButton != None and groupButton.find('i', {'class':'fa-search-plus'}): groupResponse = self._fetchUrl("https://www.fimfiction.net/ajax/stories/%s/groups" % (self.story.getMetadata("storyId"))) groupData = json.loads(groupResponse) groupList = self.make_soup(groupData["content"]) @@ -291,9 +293,13 @@ class FimFictionNetSiteAdapter(BaseSiteAdapter): groupList = soup.find('ul', {'id':'story-groups-list'}) if not (groupList == None): - for groupName in groupList.find_all('a'): - self.story.addToList("groupsUrl", 'https://'+self.host+groupName["href"]) - self.story.addToList("groups",stripHTML(groupName).replace(',', ';')) + for groupContent in groupList.find_all('a'): + self.story.addToList("groupsUrl", 'https://'+self.host+groupContent["href"]) + groupName = groupContent.find('span', {"class":"group-name"}) + if groupName != None: + self.story.addToList("groups",stripHTML(groupName).replace(',', ';')) + else: + self.story.addToList("groups",stripHTML(groupContent).replace(',', ';')) #sequels for header in soup.find_all('h1', {'class':'header-stories'}): diff --git a/fanficfare/defaults.ini b/fanficfare/defaults.ini index e3c1ada..8b7f0d7 100644 --- a/fanficfare/defaults.ini +++ b/fanficfare/defaults.ini @@ -1065,13 +1065,12 @@ website_encodings:Windows-1252,utf8 ## extra_titlepage_entries, logpage_entries, extra_logpage_entries, ## and include_in_* config items. You can also add additional entries ## here to build up composite metadata entries. -## archiveofourown.org.org, for example, fills genre (a standard +## archiveofourown.org, for example, fills genre (a standard ## entry) as the composite offreeformtags, ao3categories in ## include_in_genre. If there's ever more than 4 series, add ## series04,series04Url etc. extra_valid_entries:fandoms,freeformtags,freefromtags,ao3categories,comments,kudos,hits,bookmarks,collections,byline,bookmarktags,bookmarksummary,series00,series01,series02,series03,series00Url,series01Url,series02Url,series03Url,series00HTML,series01HTML,series02HTML,series03HTML fandoms_label:Fandoms -freeformtags_label:Freeform Tags freefromtags_label:Freeform Tags ao3categories_label:AO3 Categories comments_label:Comments @@ -2505,7 +2504,7 @@ extracategories:My Little Pony: Friendship is Magic ## Extra metadata that this adapter knows about. See [archiveofourown.org] ## for examples of how to use them. -extra_valid_entries:likes,dislikes,views,total_views,short_description,groups,groupsUrl,groupsHTML,prequel,prequelUrl,prequelHTML,sequels,sequelsUrl,sequelsHTML,comment_count,coverSource,coverSourceUrl,coverSourceHTML,authorLastLogin +extra_valid_entries:likes,dislikes,views,total_views,short_description,groups,groupsUrl,groupsHTML,prequel,prequelUrl,prequelHTML,sequels,sequelsUrl,sequelsHTML,comment_count,coverSource,coverSourceUrl,coverSourceHTML,authorLastLogin,content,fandoms likes_label:Likes dislikes_label:Dislikes views_label:Highest Single Chapter Views @@ -2525,6 +2524,8 @@ coverSource_label:Cover Source coverSourceUrl_label:Cover Source URL coverSourceHTML_label:Cover Source authorLastLogin_label:Author Last Logged In +content_label:Content +fandoms_label:Fandoms keep_in_order_sequels:true keep_in_order_sequelsUrl:true From abea5c17d784d612a5bdc2b5e105b52035126a57 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Wed, 20 Dec 2017 11:28:50 -0600 Subject: [PATCH 02/26] Bump Test Version 2.21.1 --- calibre-plugin/__init__.py | 2 +- fanficfare/cli.py | 2 +- setup.py | 2 +- webservice/app.yaml | 2 +- webservice/index.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/calibre-plugin/__init__.py b/calibre-plugin/__init__.py index 90a9dfa..d90543f 100644 --- a/calibre-plugin/__init__.py +++ b/calibre-plugin/__init__.py @@ -33,7 +33,7 @@ except NameError: from calibre.customize import InterfaceActionBase # pulled out from FanFicFareBase for saving in prefs.py -__version__ = (2, 20, 0) +__version__ = (2, 21, 1) ## Apparently the name for this class doesn't matter--it was still ## 'demo' for the first few versions. diff --git a/fanficfare/cli.py b/fanficfare/cli.py index f67a06d..996b9c0 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -30,7 +30,7 @@ import sys import pickle import cookielib as cl -version="2.20.0" +version="2.21.1" if sys.version_info < (2, 5) or sys.version_info > (3,0): print('This program requires Python 2.5 or newer. Python 3 is not supported.') diff --git a/setup.py b/setup.py index 22d715c..01892b8 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setup( name="FanFicFare", # Versions should comply with PEP440. - version="2.20.0", + version="2.21.1", description='A tool for downloading fanfiction to eBook formats', long_description=long_description, diff --git a/webservice/app.yaml b/webservice/app.yaml index 3c33cdd..d39946f 100644 --- a/webservice/app.yaml +++ b/webservice/app.yaml @@ -1,6 +1,6 @@ # ffd-retief-hrd fanficfare application: fanficfare -version: 2-20-0 +version: 2-21-1 runtime: python27 api_version: 1 threadsafe: true diff --git a/webservice/index.html b/webservice/index.html index 67b1f85..558266d 100644 --- a/webservice/index.html +++ b/webservice/index.html @@ -35,7 +35,7 @@ If you have any problems with this application, please report them in the FanFicFare Google Group. The - previous version + previous version is also available for you to use if necessary.

From efb6365b90ad6ebfa56709f5e22f15f1306b9767 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Thu, 28 Dec 2017 11:26:03 -0600 Subject: [PATCH 03/26] Set siteabbrev for adapter_wattpadcom --- fanficfare/adapters/adapter_wattpadcom.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fanficfare/adapters/adapter_wattpadcom.py b/fanficfare/adapters/adapter_wattpadcom.py index 8402567..ab61eef 100644 --- a/fanficfare/adapters/adapter_wattpadcom.py +++ b/fanficfare/adapters/adapter_wattpadcom.py @@ -36,6 +36,7 @@ class WattpadComAdapter(BaseSiteAdapter): def __init__(self, config, url): BaseSiteAdapter.__init__(self, config, url) self.storyId = unicode(self.getStoryId(url)) + self.story.setMetadata('siteabbrev',self.getSiteAbbrev()) self.story.setMetadata('storyId', self.storyId) self._setURL('https://www.wattpad.com/story/%s' % self.storyId) From 4b89d917b4fa69cbbc38f6040c4b43a4d1a2d712 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Wed, 3 Jan 2018 11:37:46 -0600 Subject: [PATCH 04/26] Skip date from first chapter if not there (adapter_ficbooknet) --- fanficfare/adapters/adapter_ficbooknet.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fanficfare/adapters/adapter_ficbooknet.py b/fanficfare/adapters/adapter_ficbooknet.py index eac6b9d..16de87d 100644 --- a/fanficfare/adapters/adapter_ficbooknet.py +++ b/fanficfare/adapters/adapter_ficbooknet.py @@ -114,6 +114,7 @@ class FicBookNetAdapter(BaseSiteAdapter): logger.debug("Author: (%s)"%self.story.getMetadata('author')) # Find the chapters: + pubdate = None chapters = soup.find('ul', {'class' : 'table-of-contents'}) if chapters != None: chapters=chapters.findAll('a', href=re.compile(r'/readfic/'+self.story.getMetadata('storyId')+"/\d+#part_content$")) @@ -122,7 +123,8 @@ class FicBookNetAdapter(BaseSiteAdapter): chapter=chapters[x] churl='https://'+self.host+chapter['href'] self.chapterUrls.append((stripHTML(chapter),churl)) - if x == 0: + ## First chapter doesn't always have a date, skip it. + if pubdate == None and chapter.parent.find('span'): pubdate = translit.translit(stripHTML(chapter.parent.find('span'))) # pubdate = translit.translit(stripHTML(self.make_soup(self._fetchUrl(churl)).find('div', {'class' : 'part_added'}).find('span'))) if x == len(chapters)-1: From 271ed9a7f17d215e1d8e8f497945c15c1f581730 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Wed, 3 Jan 2018 11:41:45 -0600 Subject: [PATCH 05/26] first_chapter/last_chapter experimental/unsupported feature --- fanficfare/adapters/base_adapter.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fanficfare/adapters/base_adapter.py b/fanficfare/adapters/base_adapter.py index 322329b..a21518f 100644 --- a/fanficfare/adapters/base_adapter.py +++ b/fanficfare/adapters/base_adapter.py @@ -124,6 +124,10 @@ class BaseSiteAdapter(Configurable): # Limit chapters to download. Input starts at 1, list starts at 0 def setChaptersRange(self,first=None,last=None): + if not first: + first = self.getConfig("first_chapter",default=None) + if not last: + last = self.getConfig("last_chapter",default=None) if first: self.chapterFirst=int(first)-1 if last: From 72f6a858f6ddf5d230b52b5dd2450c2a853beb99 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Thu, 4 Jan 2018 20:23:52 -0600 Subject: [PATCH 06/26] Bump Test Version 2.21.2 --- calibre-plugin/__init__.py | 2 +- fanficfare/cli.py | 2 +- setup.py | 2 +- webservice/app.yaml | 2 +- webservice/index.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/calibre-plugin/__init__.py b/calibre-plugin/__init__.py index d90543f..1f236ef 100644 --- a/calibre-plugin/__init__.py +++ b/calibre-plugin/__init__.py @@ -33,7 +33,7 @@ except NameError: from calibre.customize import InterfaceActionBase # pulled out from FanFicFareBase for saving in prefs.py -__version__ = (2, 21, 1) +__version__ = (2, 21, 2) ## Apparently the name for this class doesn't matter--it was still ## 'demo' for the first few versions. diff --git a/fanficfare/cli.py b/fanficfare/cli.py index 996b9c0..d37f878 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -30,7 +30,7 @@ import sys import pickle import cookielib as cl -version="2.21.1" +version="2.21.2" if sys.version_info < (2, 5) or sys.version_info > (3,0): print('This program requires Python 2.5 or newer. Python 3 is not supported.') diff --git a/setup.py b/setup.py index 01892b8..27a2267 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setup( name="FanFicFare", # Versions should comply with PEP440. - version="2.21.1", + version="2.21.2", description='A tool for downloading fanfiction to eBook formats', long_description=long_description, diff --git a/webservice/app.yaml b/webservice/app.yaml index d39946f..0cd0f3a 100644 --- a/webservice/app.yaml +++ b/webservice/app.yaml @@ -1,6 +1,6 @@ # ffd-retief-hrd fanficfare application: fanficfare -version: 2-21-1 +version: 2-21-2 runtime: python27 api_version: 1 threadsafe: true diff --git a/webservice/index.html b/webservice/index.html index 558266d..ba8aab0 100644 --- a/webservice/index.html +++ b/webservice/index.html @@ -35,7 +35,7 @@ If you have any problems with this application, please report them in the FanFicFare Google Group. The - previous version + previous version is also available for you to use if necessary.

From f6dcac829ceecfacf70f9a8dc709c2883bd4b344 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Fri, 19 Jan 2018 17:36:31 -0600 Subject: [PATCH 07/26] Tweak 'Chapter not found...' check for ffnet for changed/new text. --- fanficfare/adapters/adapter_fanfictionnet.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fanficfare/adapters/adapter_fanfictionnet.py b/fanficfare/adapters/adapter_fanfictionnet.py index e93b894..6f46893 100644 --- a/fanficfare/adapters/adapter_fanfictionnet.py +++ b/fanficfare/adapters/adapter_fanfictionnet.py @@ -109,8 +109,9 @@ class FanFictionNetSiteAdapter(BaseSiteAdapter): if "Unable to locate story" in data: raise exceptions.StoryDoesNotExist(url) - # some times "Chapter not found...", sometimes "Chapter text not found..." - if "not found. Please check to see you are not using an outdated url." in data: + # some times "Chapter not found...", sometimes "Chapter text + # not found..." or "Story does not have any chapters" + if "Please check to see you are not using an outdated url." in data: raise exceptions.FailedToDownload("Error downloading Chapter: %s! 'Chapter not found. Please check to see you are not using an outdated url.'" % url) if self.getConfig('check_next_chapter'): From 2e0412d2d298eca6147f8b4e4aa416058200513f Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Sat, 20 Jan 2018 11:03:56 -0600 Subject: [PATCH 08/26] Bump Test Version 2.21.3 --- calibre-plugin/__init__.py | 2 +- fanficfare/cli.py | 2 +- setup.py | 2 +- webservice/app.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/calibre-plugin/__init__.py b/calibre-plugin/__init__.py index 1f236ef..ae8af42 100644 --- a/calibre-plugin/__init__.py +++ b/calibre-plugin/__init__.py @@ -33,7 +33,7 @@ except NameError: from calibre.customize import InterfaceActionBase # pulled out from FanFicFareBase for saving in prefs.py -__version__ = (2, 21, 2) +__version__ = (2, 21, 3) ## Apparently the name for this class doesn't matter--it was still ## 'demo' for the first few versions. diff --git a/fanficfare/cli.py b/fanficfare/cli.py index d37f878..fbeb86d 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -30,7 +30,7 @@ import sys import pickle import cookielib as cl -version="2.21.2" +version="2.21.3" if sys.version_info < (2, 5) or sys.version_info > (3,0): print('This program requires Python 2.5 or newer. Python 3 is not supported.') diff --git a/setup.py b/setup.py index 27a2267..d049806 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setup( name="FanFicFare", # Versions should comply with PEP440. - version="2.21.2", + version="2.21.3", description='A tool for downloading fanfiction to eBook formats', long_description=long_description, diff --git a/webservice/app.yaml b/webservice/app.yaml index 0cd0f3a..93068c8 100644 --- a/webservice/app.yaml +++ b/webservice/app.yaml @@ -1,6 +1,6 @@ # ffd-retief-hrd fanficfare application: fanficfare -version: 2-21-2 +version: 2-21-3 runtime: python27 api_version: 1 threadsafe: true From 65931d97856234e8b4f68432a10f9ebe82751882 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Tue, 23 Jan 2018 10:21:09 -0600 Subject: [PATCH 09/26] Update translations. --- calibre-plugin/translations/ca.po | 2 +- calibre-plugin/translations/de.po | 50 +++++++++++++++---------------- calibre-plugin/translations/es.po | 2 +- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/calibre-plugin/translations/ca.po b/calibre-plugin/translations/ca.po index 1df001c..270c8c0 100644 --- a/calibre-plugin/translations/ca.po +++ b/calibre-plugin/translations/ca.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR ORGANIZATION # # Translators: -# Adolfo Jayme Barrientos, 2014 +# Adolfo Jayme-Barrientos, 2014 # jmontane, 2014 # Queralt Iglesias , 2016 # Robert Antoni Buj Gelonch , 2016-2017 diff --git a/calibre-plugin/translations/de.po b/calibre-plugin/translations/de.po index 60fec75..676fa50 100644 --- a/calibre-plugin/translations/de.po +++ b/calibre-plugin/translations/de.po @@ -3,7 +3,7 @@ # # Translators: # Ettore Atalan , 2014-2016 -# ILB, 2014-2016 +# ILB, 2014-2017 # jumo, 2016 # Sebastian Keller , 2015 # Simon_Schuette , 2014-2016 @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: calibre-plugins\n" "POT-Creation-Date: 2017-05-09 11:44+Central Daylight Time\n" -"PO-Revision-Date: 2017-09-20 06:01+0000\n" -"Last-Translator: Kovid Goyal \n" +"PO-Revision-Date: 2018-01-18 17:51+0000\n" +"Last-Translator: ILB\n" "Language-Team: German (http://www.transifex.com/calibre/calibre-plugins/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -265,13 +265,13 @@ msgstr "Sie werden gewarnt, wenn eine Aktualisierung die URL eines vorhandenen B #: config.py:496 msgid "Search inside ebooks for Story URL?" -msgstr "" +msgstr "Soll im ebook nach der StoryURL gesucht werden?" #: config.py:497 msgid "" "Look for first valid story URL inside EPUB, ZIP(HTML) or TXT ebook formats if not found in metadata.\n" "Somewhat risky, could find wrong URL depending on ebook content." -msgstr "" +msgstr "Sucht nach der ersten gültigen Story-URL in EPUB-, ZIP- (HTML) oder TXT-E-Book-Formaten, wenn sie nicht in Metadaten gefunden werden\nEtwas riskant, es könnte je nach E-Book-Inhalt eine falsche URL gefunden werden." #: config.py:501 msgid "Post Processing Options" @@ -430,11 +430,11 @@ msgstr "Generell URLs die auf Ablehnungsliste stehen zurückweisen, ohne nachzuf #: config.py:605 msgid "Delete on Reject by Default?" -msgstr "" +msgstr "Automatisch löschen, wenn standardmäßig abgelehnt wird?" #: config.py:606 msgid "Should the checkbox to delete Rejected books be checked by default?" -msgstr "" +msgstr "Soll das Kontrollkästchen zum Löschen abgelehnter Bücher standardmäßig aktiviert werden?" #: config.py:643 msgid "Edit Reject URLs List" @@ -520,24 +520,24 @@ msgstr "Ansicht der Standardeinstellungen" #: config.py:744 msgid "Calibre Columns" -msgstr "Calible Spalten" +msgstr "Calibre-Spalten" #: config.py:751 msgid "" "If checked, when updating/overwriting an existing book, FanFicFare will have" " the Calibre Columns available to use in replace_metadata, title_page, " "etc.
Click the button below to see the Calibre Column names." -msgstr "" +msgstr "Wenn diese Option aktiviert ist, verfügt FanFicFare beim Aktualisieren / Überschreiben eines vorhandenen Buchs über die Calibre-Spalten, die in replace_metadata, title_page usw. verwendet werden können.\nKlicken Sie auf die Schaltfläche, um die Calibre-Spalten-Namen anzuzeigen." #: config.py:752 msgid "Pass Calibre Columns into FanFicFare on Update/Overwrite" -msgstr "" +msgstr " Calibre Spalten in FanFicFare beim Updaten/Überschreiben verwenden" #: config.py:765 msgid "" "FanFicFare can pass the Calibre Columns into the download/update " "process.
This will show you the columns available by name." -msgstr "" +msgstr "FanFicFare kann die Calibre Spalten in den Download/Update-Prozess weitergeben.\nDies zeigt Ihnen die verfügbaren Spalten nach Namen." #: config.py:766 msgid "Show Calibre Column Names" @@ -685,7 +685,7 @@ msgstr "Erstellt Cover nur für Neue Bücher" msgid "" "Default is to generate a cover any time the calibre metadata is updated.
Used for both Calibre and Plugin generated covers." -msgstr "" +msgstr "Standardmäßig wird jedes Mal, wenn die Calibre-Metadaten aktualisiert werden, ein Cover generiert.\nWird für Calibre- und Plugin-generierte Cover verwendet." #: config.py:1017 msgid "Inject/update the cover inside EPUB" @@ -1005,13 +1005,13 @@ msgstr "" #: config.py:1406 msgid "Last Checked Column:" -msgstr "" +msgstr "Zuletzt überprüfte Spalte:" #: config.py:1407 msgid "" "Record the last time FanFicFare updated or checked for updates.\n" "(Date columns only.)" -msgstr "" +msgstr "Erfasst, wann FanFicFare das letzte Mal aktualisiert oder auf Updates überprüft wurde\n(Nur Datumsspalten.)" #: config.py:1436 msgid "Author(s)" @@ -1072,13 +1072,13 @@ msgstr "" #: config.py:1482 msgid "Include Books' Comments in Anthology Comments?" -msgstr "" +msgstr "Bücher-Kommentare in Anthology-Kommentare einbeziehen?" #: config.py:1483 msgid "" "Include all the merged books' comments in the new book's comments.\n" "Default is a list of included titles only." -msgstr "" +msgstr "Fügt alle Kommentare der zusammengeführten Bücher in den Kommentar des neuen Buches ein." #: config.py:1488 msgid "Set Anthology Comments only for new books" @@ -1095,7 +1095,7 @@ msgid "" "These settings will allow FanFicFare to fetch story URLs from your email " "account. It will only look for story URLs in unread emails in the folder " "specified below." -msgstr "" +msgstr "Diese Einstellungen ermöglichen es FanFicFare URLs aus Ihrem E-Mail-Konto abzurufen. Es wird nur nach Story-URLs in ungelesenen E-Mails in dem unten angegebenen Ordner gesucht." #: config.py:1511 msgid "IMAP Server Name" @@ -1157,7 +1157,7 @@ msgstr "Wenn aktiviert, werden eMails als gelesen markiert, wenn sie irgendwelch #: config.py:1564 msgid "Discard URLs on Reject List" -msgstr "" +msgstr "URLs in der Ablehnungsliste werden abgewiesen." #: config.py:1565 msgid "" @@ -1165,7 +1165,7 @@ msgid "" " on your Reject URL List.
Otherwise they will appear and you will see the" " normal Reject URL dialog.
The Emails will still be marked Read if " "configured to." -msgstr "" +msgstr "Wenn diese Option aktiviert ist, verwirft FanFicFare die URLs (aus E-Mails) von Storys automatisch, die sich auf der Liste der abgelehnten URLs befinden. Andernfalls werden sie angezeigt und Sie sehen den normalen Reject-URL-Dialog. Die E-Mails werden weiterhin als gelesen markiert angezeigt." #: config.py:1570 msgid "Update Existing Books Only" @@ -1176,7 +1176,7 @@ msgid "" "If checked, FanFicFare will silently discard story URLs from emails that are" " not already in your library.
Otherwise all story URLs, new and existing," " will be used.
The Emails will still be marked Read if configured to." -msgstr "" +msgstr "Wenn diese Option aktiviert ist, verwirft FanFicFare die URLs (aus Mails) von Storys automatisch, die sich noch niAndernfalls werden alle neuen und bestehenden Story-URLs verwendet. Die E-Mails werden weiterhin als gelesen markiert angezeigt." #: config.py:1576 msgid "Download from Email Immediately" @@ -1186,7 +1186,7 @@ msgstr "Aus E-Mail sofort herunterladen" msgid "" "If checked, FanFicFare will start downloading story URLs from emails " "immediately.
Otherwise the usual Download from URLs dialog will appear." -msgstr "" +msgstr "Wenn diese Option aktiviert ist, startet FanFicFare sofort mit dem Herunterladen von Story-URLs aus E-Mails. Andernfalls wird das übliche Dialogfeld Download von URLs angezeigt." #: config.py:1582 msgid "" @@ -1619,15 +1619,15 @@ msgstr "Es wurden keine gültigen StoryURLs in den ungelesenen eMails gefunden." #: fff_plugin.py:512 msgid "Finished Fetching Story URLs from Email." -msgstr "" +msgstr "Das Abrufen der StoryURL´s aus den Mails ist abgeschlossen." #: fff_plugin.py:520 msgid "(%d Story URLs Skipped, on Rejected URL List)" -msgstr "" +msgstr "(%d StoryURLs´ wurden übersprungen, da auf der Ablehnungsliste)" #: fff_plugin.py:522 msgid "(%d Story URLs Skipped, no Existing Book in Library)" -msgstr "" +msgstr "(%d Story URLs übersprungen, kein vorhandenes Buch in der Bibliothek) " #: fff_plugin.py:523 msgid "Get Story URLs from Email" @@ -1898,7 +1898,7 @@ msgstr "Doppelte Story überspringen." msgid "" "More than one identical book by Identifier URL or title/author(s)--can't " "tell which book to update/overwrite." -msgstr "" +msgstr "Mehr als ein identisches Buch mit ID-URL oder Titel / Autor (en) - es kann nicht festgestellt werden, welches Buch aktualisiert / überschrieben werden soll." #: fff_plugin.py:1271 msgid "Update" diff --git a/calibre-plugin/translations/es.po b/calibre-plugin/translations/es.po index 5e62574..3e8ca37 100644 --- a/calibre-plugin/translations/es.po +++ b/calibre-plugin/translations/es.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR ORGANIZATION # # Translators: -# Adolfo Jayme Barrientos, 2014 +# Adolfo Jayme-Barrientos, 2014 # Albert, 2016 # dario hereñu , 2015-2016 # Enrique Medina , 2016 From beb33d82dff10ceb60b7ad33fc686dff8d34f163 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Tue, 23 Jan 2018 10:20:15 -0600 Subject: [PATCH 10/26] Bump Release Version 2.22.0 --- calibre-plugin/__init__.py | 2 +- fanficfare/cli.py | 2 +- setup.py | 2 +- webservice/app.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/calibre-plugin/__init__.py b/calibre-plugin/__init__.py index ae8af42..46c1f85 100644 --- a/calibre-plugin/__init__.py +++ b/calibre-plugin/__init__.py @@ -33,7 +33,7 @@ except NameError: from calibre.customize import InterfaceActionBase # pulled out from FanFicFareBase for saving in prefs.py -__version__ = (2, 21, 3) +__version__ = (2, 22, 0) ## Apparently the name for this class doesn't matter--it was still ## 'demo' for the first few versions. diff --git a/fanficfare/cli.py b/fanficfare/cli.py index fbeb86d..8bae52d 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -30,7 +30,7 @@ import sys import pickle import cookielib as cl -version="2.21.3" +version="2.22.0" if sys.version_info < (2, 5) or sys.version_info > (3,0): print('This program requires Python 2.5 or newer. Python 3 is not supported.') diff --git a/setup.py b/setup.py index d049806..5207e74 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setup( name="FanFicFare", # Versions should comply with PEP440. - version="2.21.3", + version="2.22.0", description='A tool for downloading fanfiction to eBook formats', long_description=long_description, diff --git a/webservice/app.yaml b/webservice/app.yaml index 93068c8..6796e73 100644 --- a/webservice/app.yaml +++ b/webservice/app.yaml @@ -1,6 +1,6 @@ # ffd-retief-hrd fanficfare application: fanficfare -version: 2-21-3 +version: 2-22-0 runtime: python27 api_version: 1 threadsafe: true From f73e73e807ef602d8d5cd3fa79981c939633d15a Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Fri, 26 Jan 2018 13:08:40 -0600 Subject: [PATCH 11/26] Tweak FimF settings so 'genre' also contains 'content' tags and 'category' contains 'fandom' tags. --- calibre-plugin/plugin-defaults.ini | 15 ++++++++++++--- fanficfare/defaults.ini | 11 +++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/calibre-plugin/plugin-defaults.ini b/calibre-plugin/plugin-defaults.ini index 1c0fc44..650b38e 100644 --- a/calibre-plugin/plugin-defaults.ini +++ b/calibre-plugin/plugin-defaults.ini @@ -1031,7 +1031,7 @@ website_encodings:Windows-1252,utf8 ## extra_titlepage_entries, logpage_entries, extra_logpage_entries, ## and include_in_* config items. You can also add additional entries ## here to build up composite metadata entries. -## archiveofourown.org.org, for example, fills genre (a standard +## archiveofourown.org, for example, fills genre (a standard ## entry) as the composite offreeformtags, ao3categories in ## include_in_genre. If there's ever more than 4 series, add ## series04,series04Url etc. @@ -2477,7 +2477,7 @@ extracategories:My Little Pony: Friendship is Magic ## Extra metadata that this adapter knows about. See [archiveofourown.org] ## for examples of how to use them. -extra_valid_entries:likes,dislikes,views,total_views,short_description,groups,groupsUrl,groupsHTML,prequel,prequelUrl,prequelHTML,sequels,sequelsUrl,sequelsHTML,comment_count,coverSource,coverSourceUrl,coverSourceHTML,authorLastLogin +extra_valid_entries:likes,dislikes,views,total_views,short_description,groups,groupsUrl,groupsHTML,prequel,prequelUrl,prequelHTML,sequels,sequelsUrl,sequelsHTML,comment_count,coverSource,coverSourceUrl,coverSourceHTML,authorLastLogin,content,fandoms likes_label:Likes dislikes_label:Dislikes views_label:Highest Single Chapter Views @@ -2497,6 +2497,8 @@ coverSource_label:Cover Source coverSourceUrl_label:Cover Source URL coverSourceHTML_label:Cover Source authorLastLogin_label:Author Last Logged In +content_label:Content +fandoms_label:Fandoms keep_in_order_sequels:true keep_in_order_sequelsUrl:true @@ -2507,6 +2509,14 @@ keep_in_order_groupsUrl:true ## make entryHTML. make_linkhtml_entries:prequel,sequels,groups,coverSource +## What are now content tags used to be included in genre. Copy to +## genre by default. +include_in_genre:genre,content + +## What fimfiction.net has labeled 'fandom', FFF historically calls +## 'category'. +include_in_category:fandom + [www.fireflyfans.net] website_encodings:Windows-1252,utf8,iso-8859-1 @@ -2981,4 +2991,3 @@ website_encodings:Windows-1252,utf8 ## uncommon for there to be links to chapters that haven't been ## uploaded yet. continue_on_chapter_error:true - diff --git a/fanficfare/defaults.ini b/fanficfare/defaults.ini index 8b7f0d7..6f882f2 100644 --- a/fanficfare/defaults.ini +++ b/fanficfare/defaults.ini @@ -1071,6 +1071,7 @@ website_encodings:Windows-1252,utf8 ## series04,series04Url etc. extra_valid_entries:fandoms,freeformtags,freefromtags,ao3categories,comments,kudos,hits,bookmarks,collections,byline,bookmarktags,bookmarksummary,series00,series01,series02,series03,series00Url,series01Url,series02Url,series03Url,series00HTML,series01HTML,series02HTML,series03HTML fandoms_label:Fandoms +freeformtags_label:Freeform Tags freefromtags_label:Freeform Tags ao3categories_label:AO3 Categories comments_label:Comments @@ -2536,6 +2537,14 @@ keep_in_order_groupsUrl:true ## make entryHTML. make_linkhtml_entries:prequel,sequels,groups,coverSource +## What are now content tags used to be included in genre. Copy to +## genre by default. +include_in_genre:genre,content + +## What fimfiction.net has labeled 'fandom', FFF historically calls +## 'category'. +include_in_category:fandom + [www.fireflyfans.net] website_encodings:Windows-1252,utf8,iso-8859-1 @@ -3010,5 +3019,3 @@ website_encodings:Windows-1252,utf8 ## uncommon for there to be links to chapters that haven't been ## uploaded yet. continue_on_chapter_error:true - - From 286da2be9de00995f3ef7eb2b36875d7e0db21bf Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Fri, 26 Jan 2018 13:09:31 -0600 Subject: [PATCH 12/26] Bump Test Version 2.22.1 --- calibre-plugin/__init__.py | 2 +- fanficfare/cli.py | 2 +- setup.py | 2 +- webservice/app.yaml | 2 +- webservice/index.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/calibre-plugin/__init__.py b/calibre-plugin/__init__.py index 46c1f85..3225785 100644 --- a/calibre-plugin/__init__.py +++ b/calibre-plugin/__init__.py @@ -33,7 +33,7 @@ except NameError: from calibre.customize import InterfaceActionBase # pulled out from FanFicFareBase for saving in prefs.py -__version__ = (2, 22, 0) +__version__ = (2, 22, 1) ## Apparently the name for this class doesn't matter--it was still ## 'demo' for the first few versions. diff --git a/fanficfare/cli.py b/fanficfare/cli.py index 8bae52d..c85905a 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -30,7 +30,7 @@ import sys import pickle import cookielib as cl -version="2.22.0" +version="2.22.1" if sys.version_info < (2, 5) or sys.version_info > (3,0): print('This program requires Python 2.5 or newer. Python 3 is not supported.') diff --git a/setup.py b/setup.py index 5207e74..21ecff4 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setup( name="FanFicFare", # Versions should comply with PEP440. - version="2.22.0", + version="2.22.1", description='A tool for downloading fanfiction to eBook formats', long_description=long_description, diff --git a/webservice/app.yaml b/webservice/app.yaml index 6796e73..39cdab1 100644 --- a/webservice/app.yaml +++ b/webservice/app.yaml @@ -1,6 +1,6 @@ # ffd-retief-hrd fanficfare application: fanficfare -version: 2-22-0 +version: 2-22-1 runtime: python27 api_version: 1 threadsafe: true diff --git a/webservice/index.html b/webservice/index.html index ba8aab0..964ccc0 100644 --- a/webservice/index.html +++ b/webservice/index.html @@ -35,7 +35,7 @@ If you have any problems with this application, please report them in the FanFicFare Google Group. The - previous version + previous version is also available for you to use if necessary.

From c5105b158056c78245a3a8615417585df144fa24 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Fri, 2 Feb 2018 13:10:56 -0600 Subject: [PATCH 13/26] Tweak FimF settings so 'genre' also contains 'content' tags and 'category' contains 'fandom' tags. --- calibre-plugin/plugin-defaults.ini | 4 ++-- fanficfare/defaults.ini | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/calibre-plugin/plugin-defaults.ini b/calibre-plugin/plugin-defaults.ini index 650b38e..01b8e67 100644 --- a/calibre-plugin/plugin-defaults.ini +++ b/calibre-plugin/plugin-defaults.ini @@ -2513,9 +2513,9 @@ make_linkhtml_entries:prequel,sequels,groups,coverSource ## genre by default. include_in_genre:genre,content -## What fimfiction.net has labeled 'fandom', FFF historically calls +## What fimfiction.net has labeled 'fandoms', FFF historically calls ## 'category'. -include_in_category:fandom +include_in_category:category,fandoms [www.fireflyfans.net] website_encodings:Windows-1252,utf8,iso-8859-1 diff --git a/fanficfare/defaults.ini b/fanficfare/defaults.ini index 6f882f2..745588d 100644 --- a/fanficfare/defaults.ini +++ b/fanficfare/defaults.ini @@ -2541,9 +2541,9 @@ make_linkhtml_entries:prequel,sequels,groups,coverSource ## genre by default. include_in_genre:genre,content -## What fimfiction.net has labeled 'fandom', FFF historically calls +## What fimfiction.net has labeled 'fandoms', FFF historically calls ## 'category'. -include_in_category:fandom +include_in_category:category,fandoms [www.fireflyfans.net] website_encodings:Windows-1252,utf8,iso-8859-1 From e4f35d883f5f54fe2ac609b024e029f4ffb979e7 Mon Sep 17 00:00:00 2001 From: Chris Braun Date: Sun, 4 Feb 2018 21:58:12 +0100 Subject: [PATCH 14/26] Handle new VIP chapter types in adapter_webnovelcom (#263) --- fanficfare/adapters/adapter_webnovelcom.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fanficfare/adapters/adapter_webnovelcom.py b/fanficfare/adapters/adapter_webnovelcom.py index 4cdf3ac..5f70e0e 100644 --- a/fanficfare/adapters/adapter_webnovelcom.py +++ b/fanficfare/adapters/adapter_webnovelcom.py @@ -84,7 +84,7 @@ class WWWWebNovelComAdapter(BaseSiteAdapter): self.story.setMetadata('storyId', self.parsedUrl.path.split('/')[2]) # normalized story URL. - self._setURL('https://' + self.getSiteDomain() + '/book/'+self.story.getMetadata('storyId')) + self._setURL('https://' + self.getSiteDomain() + '/book/' + self.story.getMetadata('storyId')) # Each adapter needs to have a unique site abbreviation. self.story.setMetadata('siteabbrev', 'wncom') @@ -169,6 +169,10 @@ class WWWWebNovelComAdapter(BaseSiteAdapter): "https://" + self.getSiteDomain() + "/apiajax/chapter/GetChapterList?_csrfToken=" + csrf_token + "&bookId=" + self.story.getMetadata( 'storyId'))) for chap in jsondata["data"]["chapterItems"]: + # Only allow free and VIP type 1 chapters + if chap['isVip'] not in {0, 1}: + continue + chap_title = 'Chapter ' + unicode(chap['chapterIndex']) + ' - ' + chap['chapterName'] chap_Url = url.rstrip('/') + '/' + chap['chapterId'] self.chapterUrls.append((chap_title, chap_Url)) @@ -200,8 +204,8 @@ class WWWWebNovelComAdapter(BaseSiteAdapter): self.getSiteDomain(), self._csrf_token, book_id, chapter_id, time.time() * 1000) chapter_info = json.loads(self._fetchUrl(content_url))['data']['chapterInfo'] - # Check if chapter is marked as VIP (requires an ad to be watched) - if chapter_info['isVip']: + # Check if chapter is marked as VIP type 1 (requires an ad to be watched) + if chapter_info['isVip'] == 1: content_token_url = 'https://%s/apiajax/chapter/GetChapterContentToken?_csrfToken=%s&bookId=%s&chapterId=%s' % ( self.getSiteDomain(), self._csrf_token, self.story.getMetadata('storyId'), chapter_id) content_token = json.loads(self._fetchUrl(content_token_url))['data']['token'] From e18f52086bf612c7f06beae5de8eeb67a6801c7c Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Sun, 4 Feb 2018 16:18:24 -0600 Subject: [PATCH 15/26] *Don't* include fandoms in category for fimfiction.net by default. --- calibre-plugin/plugin-defaults.ini | 5 +++-- fanficfare/defaults.ini | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/calibre-plugin/plugin-defaults.ini b/calibre-plugin/plugin-defaults.ini index 01b8e67..ecb3a38 100644 --- a/calibre-plugin/plugin-defaults.ini +++ b/calibre-plugin/plugin-defaults.ini @@ -2514,8 +2514,9 @@ make_linkhtml_entries:prequel,sequels,groups,coverSource include_in_genre:genre,content ## What fimfiction.net has labeled 'fandoms', FFF historically calls -## 'category'. -include_in_category:category,fandoms +## 'category'. Commented out by default due to "My Little Pony: +## Friendship is Magic" from extracategories vs "MLP: FiM" in fandoms. +#include_in_category:category,fandoms [www.fireflyfans.net] website_encodings:Windows-1252,utf8,iso-8859-1 diff --git a/fanficfare/defaults.ini b/fanficfare/defaults.ini index 745588d..fc19957 100644 --- a/fanficfare/defaults.ini +++ b/fanficfare/defaults.ini @@ -2542,8 +2542,9 @@ make_linkhtml_entries:prequel,sequels,groups,coverSource include_in_genre:genre,content ## What fimfiction.net has labeled 'fandoms', FFF historically calls -## 'category'. -include_in_category:category,fandoms +## 'category'. Commented out by default due to "My Little Pony: +## Friendship is Magic" from extracategories vs "MLP: FiM" in fandoms. +#include_in_category:category,fandoms [www.fireflyfans.net] website_encodings:Windows-1252,utf8,iso-8859-1 From a6c79e40575c90df3e8ca8ba17f7ca79c25bee9a Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Sun, 4 Feb 2018 16:18:50 -0600 Subject: [PATCH 16/26] Bump Test Version 2.22.2 --- calibre-plugin/__init__.py | 2 +- fanficfare/cli.py | 2 +- setup.py | 2 +- webservice/app.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/calibre-plugin/__init__.py b/calibre-plugin/__init__.py index 3225785..7d82745 100644 --- a/calibre-plugin/__init__.py +++ b/calibre-plugin/__init__.py @@ -33,7 +33,7 @@ except NameError: from calibre.customize import InterfaceActionBase # pulled out from FanFicFareBase for saving in prefs.py -__version__ = (2, 22, 1) +__version__ = (2, 22, 2) ## Apparently the name for this class doesn't matter--it was still ## 'demo' for the first few versions. diff --git a/fanficfare/cli.py b/fanficfare/cli.py index c85905a..7f4ecfa 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -30,7 +30,7 @@ import sys import pickle import cookielib as cl -version="2.22.1" +version="2.22.2" if sys.version_info < (2, 5) or sys.version_info > (3,0): print('This program requires Python 2.5 or newer. Python 3 is not supported.') diff --git a/setup.py b/setup.py index 21ecff4..9d15d78 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setup( name="FanFicFare", # Versions should comply with PEP440. - version="2.22.1", + version="2.22.2", description='A tool for downloading fanfiction to eBook formats', long_description=long_description, diff --git a/webservice/app.yaml b/webservice/app.yaml index 39cdab1..0bdd894 100644 --- a/webservice/app.yaml +++ b/webservice/app.yaml @@ -1,6 +1,6 @@ # ffd-retief-hrd fanficfare application: fanficfare -version: 2-22-1 +version: 2-22-2 runtime: python27 api_version: 1 threadsafe: true From 02bc486ff7c02cd15456b7736daf1069cf7ed66c Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Wed, 14 Feb 2018 16:01:47 -0600 Subject: [PATCH 17/26] Update adapter_efpfanficnet to use https and remove www. by default. --- fanficfare/adapters/adapter_efpfanficnet.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/fanficfare/adapters/adapter_efpfanficnet.py b/fanficfare/adapters/adapter_efpfanficnet.py index 487f4e2..dea1787 100644 --- a/fanficfare/adapters/adapter_efpfanficnet.py +++ b/fanficfare/adapters/adapter_efpfanficnet.py @@ -47,7 +47,7 @@ class EFPFanFicNet(BaseSiteAdapter): # normalized story URL. - self._setURL('http://' + self.getSiteDomain() + '/viewstory.php?sid='+self.story.getMetadata('storyId')) + self._setURL('https://' + self.getSiteDomain() + '/viewstory.php?sid='+self.story.getMetadata('storyId')) # Each adapter needs to have a unique site abbreviation. self.story.setMetadata('siteabbrev','efp') @@ -59,14 +59,14 @@ class EFPFanFicNet(BaseSiteAdapter): @staticmethod # must be @staticmethod, don't remove it. def getSiteDomain(): # The site domain. Does have www here, if it uses it. - return 'www.efpfanfic.net' + return 'efpfanfic.net' @classmethod def getSiteExampleURLs(cls): - return "http://"+cls.getSiteDomain()+"/viewstory.php?sid=1234" + return "https://"+cls.getSiteDomain()+"/viewstory.php?sid=1234" def getSiteURLPattern(self): - return re.escape("http://"+self.getSiteDomain()+"/viewstory.php?sid=")+r"\d+$" + return r"https?://(www\.)?"+re.escape(self.getSiteDomain()+"/viewstory.php?sid=")+r"\d+$" ## Login seems to be reasonably standard across eFiction sites. def needToLoginCheck(self, data): @@ -88,7 +88,7 @@ class EFPFanFicNet(BaseSiteAdapter): params['cookiecheck'] = '1' params['submit'] = 'Invia' - loginUrl = 'http://' + self.getSiteDomain() + '/user.php?sid='+self.story.getMetadata('storyId') + loginUrl = 'https://' + self.getSiteDomain() + '/user.php?sid='+self.story.getMetadata('storyId') logger.debug("Will now login to URL (%s) as (%s)" % (loginUrl, params['penname'])) @@ -137,7 +137,7 @@ class EFPFanFicNet(BaseSiteAdapter): # Find authorid and URL from... author url. a = soup.find('a', href=re.compile(r"viewuser.php\?uid=\d+")) self.story.setMetadata('authorId',a['href'].split('=')[1]) - self.story.setMetadata('authorUrl','http://'+self.host+'/'+a['href']) + self.story.setMetadata('authorUrl','https://'+self.host+'/'+a['href']) self.story.setMetadata('author',a.string) # Find the chapter selector @@ -149,7 +149,7 @@ class EFPFanFicNet(BaseSiteAdapter): else: allOptions = select.findAll('option', {'value' : re.compile(r'viewstory')}) for o in allOptions: - url = u'http://%s/%s' % ( self.getSiteDomain(), + url = u'https://%s/%s' % ( self.getSiteDomain(), o['value']) # just in case there's tags, like in chapter titles. title = stripHTML(o) @@ -179,7 +179,7 @@ class EFPFanFicNet(BaseSiteAdapter): # no storya, but do have authsoup--we're looping on author pages. if authsoup != None: # last author link with offset should be the 'next' link. - authurl = u'http://%s/%s' % ( self.getSiteDomain(), + authurl = u'https://%s/%s' % ( self.getSiteDomain(), authsoup.findAll('a',href=re.compile(r'viewuser\.php\?uid=\d+&catid=&offset='))[-1]['href'] ) # Need author page for most of the metadata. @@ -268,7 +268,7 @@ class EFPFanFicNet(BaseSiteAdapter): # Find Series name from series URL. a = soup.find('a', href=re.compile(r"viewseries.php\?ssid=\d+&i=1")) series_name = a.string - series_url = 'http://'+self.host+'/'+a['href'] + series_url = 'https://'+self.host+'/'+a['href'] # use BeautifulSoup HTML parser to make everything easier to find. seriessoup = self.make_soup(self._fetchUrl(series_url)) From f2a617ba4ee13e3bca0b2ec3e8fe0b159b1ea0e1 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Wed, 14 Feb 2018 16:02:21 -0600 Subject: [PATCH 18/26] Bump Test Version 2.22.3 --- calibre-plugin/__init__.py | 2 +- fanficfare/cli.py | 2 +- setup.py | 2 +- webservice/app.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/calibre-plugin/__init__.py b/calibre-plugin/__init__.py index 7d82745..0cdb672 100644 --- a/calibre-plugin/__init__.py +++ b/calibre-plugin/__init__.py @@ -33,7 +33,7 @@ except NameError: from calibre.customize import InterfaceActionBase # pulled out from FanFicFareBase for saving in prefs.py -__version__ = (2, 22, 2) +__version__ = (2, 22, 3) ## Apparently the name for this class doesn't matter--it was still ## 'demo' for the first few versions. diff --git a/fanficfare/cli.py b/fanficfare/cli.py index 7f4ecfa..fb5f31e 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -30,7 +30,7 @@ import sys import pickle import cookielib as cl -version="2.22.2" +version="2.22.3" if sys.version_info < (2, 5) or sys.version_info > (3,0): print('This program requires Python 2.5 or newer. Python 3 is not supported.') diff --git a/setup.py b/setup.py index 9d15d78..96a9e3b 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setup( name="FanFicFare", # Versions should comply with PEP440. - version="2.22.2", + version="2.22.3", description='A tool for downloading fanfiction to eBook formats', long_description=long_description, diff --git a/webservice/app.yaml b/webservice/app.yaml index 0bdd894..c2a0f29 100644 --- a/webservice/app.yaml +++ b/webservice/app.yaml @@ -1,6 +1,6 @@ # ffd-retief-hrd fanficfare application: fanficfare -version: 2-22-2 +version: 2-22-3 runtime: python27 api_version: 1 threadsafe: true From 03845d08c0866674521618fd685bbfde5c6a5d32 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Thu, 15 Feb 2018 20:25:47 -0600 Subject: [PATCH 19/26] Fix rating, warnings, add ships to adapter_harrypotterfanfictioncom --- .../adapter_harrypotterfanfictioncom.py | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/fanficfare/adapters/adapter_harrypotterfanfictioncom.py b/fanficfare/adapters/adapter_harrypotterfanfictioncom.py index 9885f25..d0ac0b6 100644 --- a/fanficfare/adapters/adapter_harrypotterfanfictioncom.py +++ b/fanficfare/adapters/adapter_harrypotterfanfictioncom.py @@ -133,16 +133,6 @@ class HarryPotterFanFictionComSiteAdapter(BaseSiteAdapter): table = soup.find('table',{'class':'storymaininfo'}) if table: metastr = stripHTML(unicode(table)).replace('\n',' ').replace('\t',' ') - # Rating: 12+ Story Reviews: 3 - # Chapters: 3 - # Characters: Andromeda, Ted, Bellatrix, R. Lestrange, Lucius, Narcissa, OC - # Genre(s): Fluff, Romance, Young Adult Era: OtherPairings: Other Pairing, Lucius/Narcissa - # Status: Completed - # First Published: 2010.09.02 - # Last Published Chapter: 2010.09.28 - # Last Updated: 2010.09.28 - # Favorite Story Of: 1 users - # Warnings: Scenes of a Mild Sexual Nature m = re.match(r".*?Status: Completed.*?",metastr) if m: @@ -150,7 +140,7 @@ class HarryPotterFanFictionComSiteAdapter(BaseSiteAdapter): else: self.story.setMetadata('status','In-Progress') - m = re.match(r".*?Rating: (.+?) Story Reviews.*?",metastr) + m = re.match(r".*?Rating: (.+?)Story",metastr) if m: self.story.setMetadata('rating', m.group(1)) @@ -164,9 +154,14 @@ class HarryPotterFanFictionComSiteAdapter(BaseSiteAdapter): for g in m.group(1).split(','): self.story.addToList('characters',g) - m = re.match(r".*?Warnings: (.+).*?",metastr) + m = re.match(r".*?Pairings: (.+?) +Status",metastr) if m: - for w in m.group(1).split(','): + for g in m.group(1).split(','): + self.story.addToList('ships',g) + + m = re.match(r".*?(Warnings|Advisory): (.+).*?",metastr) + if m: + for w in m.group(2).split(','): if w != 'Now Warnings': self.story.addToList('warnings',w) From ab0d8279c7d86b7c3d710b8fac1951c36385d743 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Thu, 15 Feb 2018 20:27:20 -0600 Subject: [PATCH 20/26] Bump Test Version 2.22.4 --- calibre-plugin/__init__.py | 2 +- fanficfare/cli.py | 2 +- setup.py | 2 +- webservice/app.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/calibre-plugin/__init__.py b/calibre-plugin/__init__.py index 0cdb672..130cd67 100644 --- a/calibre-plugin/__init__.py +++ b/calibre-plugin/__init__.py @@ -33,7 +33,7 @@ except NameError: from calibre.customize import InterfaceActionBase # pulled out from FanFicFareBase for saving in prefs.py -__version__ = (2, 22, 3) +__version__ = (2, 22, 4) ## Apparently the name for this class doesn't matter--it was still ## 'demo' for the first few versions. diff --git a/fanficfare/cli.py b/fanficfare/cli.py index fb5f31e..caaff03 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -30,7 +30,7 @@ import sys import pickle import cookielib as cl -version="2.22.3" +version="2.22.4" if sys.version_info < (2, 5) or sys.version_info > (3,0): print('This program requires Python 2.5 or newer. Python 3 is not supported.') diff --git a/setup.py b/setup.py index 96a9e3b..eb9604b 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setup( name="FanFicFare", # Versions should comply with PEP440. - version="2.22.3", + version="2.22.4", description='A tool for downloading fanfiction to eBook formats', long_description=long_description, diff --git a/webservice/app.yaml b/webservice/app.yaml index c2a0f29..d9ddf53 100644 --- a/webservice/app.yaml +++ b/webservice/app.yaml @@ -1,6 +1,6 @@ # ffd-retief-hrd fanficfare application: fanficfare -version: 2-22-3 +version: 2-22-4 runtime: python27 api_version: 1 threadsafe: true From 11e8126cfd181c0c476803606aa49f269bced528 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Thu, 22 Feb 2018 17:12:58 -0600 Subject: [PATCH 21/26] Make Get URLs from Page work better with TtH is_adult. --- fanficfare/adapters/adapter_tthfanficorg.py | 33 +++++++++++++-------- fanficfare/geturls.py | 9 ++++-- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/fanficfare/adapters/adapter_tthfanficorg.py b/fanficfare/adapters/adapter_tthfanficorg.py index 15bf531..05d77a0 100644 --- a/fanficfare/adapters/adapter_tthfanficorg.py +++ b/fanficfare/adapters/adapter_tthfanficorg.py @@ -115,6 +115,25 @@ class TwistingTheHellmouthSiteAdapter(BaseSiteAdapter): else: return True + def setSiteMaxRating(self,url,data=None,soup=None): + if not data: + data = self._fetchUrl(url) + soup = self.make_soup(data) + + if self.is_adult or self.getConfig("is_adult"): + form = soup.find('form', {'id':'sitemaxratingform'}) + # if is_adult and rating isn't already set to FR21, set it so. + if not form.find('option',{'value':'5'}).get('selected'): + params={'ctkn':form.find('input', {'name':'ctkn'})['value'], + 'sitemaxrating':'5'} + logger.info("Attempting to get rating cookie for %s" % url) + data = self._postUrl("https://"+self.getSiteDomain()+'/setmaxrating.php',params) + # refetch story page. + ## XXX - needs cache invalidate? Or at least check that it this needs doing... + data = self._fetchUrl(url,usecache=False) + soup = self.make_soup(data) + return (data,soup) + def extractChapterUrlsAndMetadata(self): # fetch the chapter. From that we will get almost all the # metadata and chapter list @@ -143,18 +162,8 @@ class TwistingTheHellmouthSiteAdapter(BaseSiteAdapter): if "

Story Not Found

" in data: raise exceptions.StoryDoesNotExist(url) - if self.is_adult or self.getConfig("is_adult"): - form = soup.find('form', {'id':'sitemaxratingform'}) - # if is_adult and rating isn't already set to FR21, set it so. - if not form.find('option',{'value':'5'}).get('selected'): - params={'ctkn':form.find('input', {'name':'ctkn'})['value'], - 'sitemaxrating':'5'} - logger.info("Attempting to get rating cookie for %s" % url) - data = self._postUrl("https://"+self.getSiteDomain()+'/setmaxrating.php',params) - # refetch story page. - ## XXX - needs cache invalidate? Or at least check that it this needs doing... - data = self._fetchUrl(url,usecache=False) - soup = self.make_soup(data) + ## conditionally set sitemaxrating + (data,soup) = self.setSiteMaxRating(url,data,soup) if "NOTE: This story is rated FR21 which is above your chosen filter level." in data: raise exceptions.AdultCheckRequired(self.url) diff --git a/fanficfare/geturls.py b/fanficfare/geturls.py index 95e64af..711f927 100644 --- a/fanficfare/geturls.py +++ b/fanficfare/geturls.py @@ -65,8 +65,13 @@ def get_urls_from_page(url,configuration=None,normalize=False): data = adapter._fetchUrl(url) adapter.set_adult_cookie() - # this way it uses User-Agent or other special settings. Only AO3 - # is doing login. + if 'tthfanfic.org' in url and adapter.getConfig("is_adult"): + ## Simple fetch works in testing, but actual pages use a + ## POST and has a 'ctkn' value, so we do too. + # adapter._fetchUrl("https://www.tthfanfic.org/setmaxrating.php?sitemaxrating=5") + adapter.setSiteMaxRating(url) + + # this way it uses User-Agent or other special settings. data = adapter._fetchUrl(url,usecache=False) except UnknownSite: # no adapter with anyurl=True, must be a random site. From 51db9d2f483500ea84b4d9b8ea24295f88cd1a32 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Thu, 22 Feb 2018 17:17:36 -0600 Subject: [PATCH 22/26] Bump Test Version 2.22.5 --- calibre-plugin/__init__.py | 2 +- fanficfare/cli.py | 2 +- setup.py | 2 +- webservice/app.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/calibre-plugin/__init__.py b/calibre-plugin/__init__.py index 130cd67..769db4b 100644 --- a/calibre-plugin/__init__.py +++ b/calibre-plugin/__init__.py @@ -33,7 +33,7 @@ except NameError: from calibre.customize import InterfaceActionBase # pulled out from FanFicFareBase for saving in prefs.py -__version__ = (2, 22, 4) +__version__ = (2, 22, 5) ## Apparently the name for this class doesn't matter--it was still ## 'demo' for the first few versions. diff --git a/fanficfare/cli.py b/fanficfare/cli.py index caaff03..ded05e7 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -30,7 +30,7 @@ import sys import pickle import cookielib as cl -version="2.22.4" +version="2.22.5" if sys.version_info < (2, 5) or sys.version_info > (3,0): print('This program requires Python 2.5 or newer. Python 3 is not supported.') diff --git a/setup.py b/setup.py index eb9604b..5d441d6 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setup( name="FanFicFare", # Versions should comply with PEP440. - version="2.22.4", + version="2.22.5", description='A tool for downloading fanfiction to eBook formats', long_description=long_description, diff --git a/webservice/app.yaml b/webservice/app.yaml index d9ddf53..9fbb6af 100644 --- a/webservice/app.yaml +++ b/webservice/app.yaml @@ -1,6 +1,6 @@ # ffd-retief-hrd fanficfare application: fanficfare -version: 2-22-4 +version: 2-22-5 runtime: python27 api_version: 1 threadsafe: true From 1dde324b513bf9bbcdcb1ce550ce82df100d1b74 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Mon, 26 Feb 2018 09:25:38 -0600 Subject: [PATCH 23/26] Calculate number of chapters using start-end range when doing updates. --- calibre-plugin/fff_plugin.py | 4 +++- calibre-plugin/jobs.py | 4 +++- fanficfare/cli.py | 2 ++ fanficfare/story.py | 10 +++++++++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/calibre-plugin/fff_plugin.py b/calibre-plugin/fff_plugin.py index 5de4266..5f97f13 100644 --- a/calibre-plugin/fff_plugin.py +++ b/calibre-plugin/fff_plugin.py @@ -1333,7 +1333,9 @@ class FanFicFarePlugin(InterfaceAction): (epuburl,chaptercount) = \ get_dcsource_chaptercount(StringIO(db.format(book_id,'EPUB', index_is_id=True))) - urlchaptercount = int(story.getMetadata('numChapters').replace(',','')) + #urlchaptercount = int(story.getMetadata('numChapters').replace(',','')) + # returns int adjusted for start-end range. + urlchaptercount = story.getChapterCount() if chaptercount == urlchaptercount: if collision == UPDATE: raise NotGoingToDownload(_("Already contains %d chapters.")%chaptercount,'edit-undo.png',showerror=False) diff --git a/calibre-plugin/jobs.py b/calibre-plugin/jobs.py index bd197be..b728925 100644 --- a/calibre-plugin/jobs.py +++ b/calibre-plugin/jobs.py @@ -233,7 +233,9 @@ def do_download_for_worker(book,options,merge,notification=lambda x,y:x): # update now handled by pre-populating the old images and # chapters in the adapter rather than merging epubs. - urlchaptercount = int(story.getMetadata('numChapters').replace(',','')) + #urlchaptercount = int(story.getMetadata('numChapters').replace(',','')) + # returns int adjusted for start-end range. + urlchaptercount = story.getChapterCount() (url, chaptercount, adapter.oldchapters, diff --git a/fanficfare/cli.py b/fanficfare/cli.py index ded05e7..ee1bc6b 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -385,6 +385,8 @@ def do_download(arg, if options.update and not options.force: urlchaptercount = int(adapter.getStoryMetadataOnly().getMetadata('numChapters').replace(',','')) + # returns int adjusted for start-end range. + urlchaptercount = adapter.getStoryMetadataOnly().getChapterCount() if chaptercount == urlchaptercount and not options.metaonly: print '%s already contains %d chapters.' % (output_filename, chaptercount) diff --git a/fanficfare/story.py b/fanficfare/story.py index 98724e0..a3bae5c 100644 --- a/fanficfare/story.py +++ b/fanficfare/story.py @@ -679,6 +679,15 @@ class Story(Configurable): # self.metadata = json.loads(s, object_hook=datetime_decoder) + def getChapterCount(self): + ## returns chapter count adjusted for start-end range. + url_chapters = value = int(self.getMetadata("numChapters").replace(',','')) + if self.chapter_first: + value = url_chapters - (int(self.chapter_first) - 1) + if self.chapter_last: + value = value - (url_chapters - int(self.chapter_last)) + return value + def getMetadataRaw(self,key): if self.isValidMetaEntry(key) and self.metadata.has_key(key): return self.metadata[key] @@ -717,7 +726,6 @@ class Story(Configurable): if isinstance(value, (datetime.date, datetime.datetime, datetime.time)) and self.hasConfig(key+"_format"): # logger.info("DATE: %s"%key) value = value.strftime(self.getConfig(key+"_format")) - if key == "title" and (self.chapter_first or self.chapter_last) and self.getConfig("title_chapter_range_pattern"): first = self.chapter_first or "1" last = self.chapter_last or self.getMetadata("numChapters") From bfb211e7cc63d0a79cc9402f96140451db0431e9 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Mon, 26 Feb 2018 09:26:51 -0600 Subject: [PATCH 24/26] Update translations. --- calibre-plugin/translations/nl.po | 135 +++++++++++++++--------------- 1 file changed, 68 insertions(+), 67 deletions(-) diff --git a/calibre-plugin/translations/nl.po b/calibre-plugin/translations/nl.po index 8494d1a..2221e1c 100644 --- a/calibre-plugin/translations/nl.po +++ b/calibre-plugin/translations/nl.po @@ -4,6 +4,7 @@ # Translators: # Alex, 2016 # erkfuizfeuadjfjzefzfuzeff gbhygsregfges , 2017 +# Herman van der Vaart , 2018 # Mario Moens , 2017 # Nathan Follens, 2015 # Nathan Follens, 2016 @@ -14,8 +15,8 @@ msgid "" msgstr "" "Project-Id-Version: calibre-plugins\n" "POT-Creation-Date: 2017-05-09 11:44+Central Daylight Time\n" -"PO-Revision-Date: 2017-09-20 06:01+0000\n" -"Last-Translator: Mario Moens \n" +"PO-Revision-Date: 2018-02-26 15:13+0000\n" +"Last-Translator: Herman van der Vaart \n" "Language-Team: Dutch (http://www.transifex.com/calibre/calibre-plugins/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -158,7 +159,7 @@ msgid "" "(title, author, URL, tags, custom columns, etc) from the web site.
This sets whether that will default to on or off.
Columns set to " "'New Only' in the column tabs will only be set for new books." -msgstr "" +msgstr "Bij elke download biedt FanFicFare een optie om Calibre metadata (titel, auteur, URL, tags, aangepaste kolommen, enz.) van de website bij te werken.
Hiermee wordt de standaard ingesteld op aan of uit.
Kolommen die zijn ingesteld als 'Alleen Nieuw' in de kolomtabs, worden alleen ingesteld voor nieuwe boeken." #: config.py:442 msgid "Default Update EPUB Cover when Updating EPUB?" @@ -169,7 +170,7 @@ msgid "" "On each download, FanFicFare offers an option to update the book cover image" " inside the EPUB from the web site when the EPUB is updated.
This sets whether that will default to on or off." -msgstr "" +msgstr "Bij elke download biedt FanFicFare de optie om de boekomslag in de EPUB vanaf de website bij te werken wanneer de EPUB wordt bijgewerkt.
Hiermee wordt ingesteld of dit standaard wordt in- of uitgeschakeld." #: config.py:447 msgid "Default Background Metadata?" @@ -183,7 +184,7 @@ msgid "" "adult--stories that need those will just fail.
Only available for " "Update/Overwrite of existing books in case URL given isn't canonical or " "matches to existing book by Title/Author." -msgstr "" +msgstr "Bij elke download biedt FanFicFare een optie om metagegevens van sites te verzamelen in een achtergrondproces.
Dit geeft u sneller controle terug tijdens het bijwerken, maar u wordt niet gevraagd om gebruikersnaam / wachtwoorden of als u een volwassene bent - zullen verhalen die dit nodig hebben, gewoon falen.
Alleen beschikbaar voor het bijwerken / overschrijven van bestaande boeken in het geval de gegeven URL niet canoniek is of overeenkomt met titel / auteur van bestaand boek." #: config.py:454 msgid "Updating Calibre Options" @@ -197,7 +198,7 @@ msgstr "Wis andere aanwezige formaten?" msgid "" "Check this to automatically delete all other ebook formats when updating an existing book.\n" "Handy if you have both a Nook(epub) and Kindle(mobi), for example." -msgstr "" +msgstr "Selecteer dit om alle andere e-boekformaten automatisch te verwijderen bij het bijwerken van een bestaand boek.\nHandig als je zowel een Nook (epub) als Kindle (mobi) hebt, bijvoorbeeld." #: config.py:463 msgid "Keep Existing Tags when Updating Metadata?" @@ -209,7 +210,7 @@ msgid "" "%(cmplt)s and %(inprog)s tags will be still be updated, if known.\n" "%(lul)s tags will be updated if %(lus)s in %(is)s.\n" "(If Tags is set to 'New Only' in the Standard Columns tab, this has no effect.)" -msgstr "" +msgstr "Bestaande tags zullen worden bewaard en nieuwe tags toegevoegd. \n%(cmplt)sen%(inprog)s tags, indien bekend, zullen nog steeds worden bijgewerkt. \n%(lul)sTags worden bijgewerkt als%(lus)s in%(is)s. \n(Als Tags is ingesteld op 'Alleen Nieuw' op het tabblad Standaardkolommen, heeft dit geen effect.)" #: config.py:468 msgid "Force Author into Author Sort?" @@ -219,7 +220,7 @@ msgstr "Forceer auteur naar auteursortering?" msgid "" "If checked, the author(s) as given will be used for the Author Sort, too.\n" "If not checked, calibre will apply it's built in algorithm which makes 'Bob Smith' sort as 'Smith, Bob', etc." -msgstr "" +msgstr "Indien aangevinkt, zal de auteur (s) zoals gegeven ook worden gebruikt voor het Auteur Sorteren.\nIndien niet aangevinkt, zal calibre het ingebouwde algoritme toepassen waardoor 'Bob Smith' sorteert als 'Smith, Bob', etc." #: config.py:473 msgid "Force Title into Title Sort?" @@ -229,7 +230,7 @@ msgstr "Forceer titel naar titelsortering?" msgid "" "If checked, the title as given will be used for the Title Sort, too.\n" "If not checked, calibre will apply it's built in algorithm which makes 'The Title' sort as 'Title, The', etc." -msgstr "" +msgstr "Indien aangevinkt, zal de titel zoals gegeven ook worden gebruikt voor het Titel Sorteren. \nAls dit niet is aangevinkt, zal calibre het ingebouwde algoritme toepassen waardoor 'De Titel' sorteert als 'Titel, De', etc." #: config.py:478 msgid "Check for existing Series Anthology books?" @@ -240,7 +241,7 @@ msgid "" "Check for existing Series Anthology books using each new story's series URL before downloading.\n" "Offer to skip downloading if a Series Anthology is found.\n" "Doesn't work when Collect Metadata in Background is selected." -msgstr "" +msgstr "Controleer voor bestaande series bloemlezing-boeken de URL van elk nieuw verhaal voordat je het downloadt. \nAanbieden om het downloaden over te slaan als een bloemlezing serie is gevonden.\nWerkt niet wanneer Collect Metadata in achtergrond is geselecteerd." #: config.py:483 config.py:600 msgid "Reject Without Confirmation?" @@ -251,7 +252,7 @@ msgid "" "Automatically reject storys with existing Series Anthology books.\n" "Only works if 'Check for existing Series Anthology books' is on.\n" "Doesn't work when Collect Metadata in Background is selected." -msgstr "" +msgstr "Verwerp automatisch verhalen met bestaande series bloemlezing-boeken.\n Werkt alleen als 'Zoeken naar bestaande bloemlezing boeken' is ingeschakeld. \nWerkt niet wanneer Collect Metadata in achtergrond is geselecteerd." #: config.py:491 msgid "Check for changed Story URL?" @@ -261,32 +262,32 @@ msgstr "Controleer veranderd verhaal URL?" msgid "" "Warn you if an update will change the URL of an existing book.\n" "fanfiction.net URLs will change from http to https silently." -msgstr "" +msgstr "Waarschuwt u als een update de URL van een bestaand boek zal wijzigen.\nfanfiction.net URL's veranderen geruisloos van http naar https." #: config.py:496 msgid "Search inside ebooks for Story URL?" -msgstr "" +msgstr "Zoeken in e-boeken naar Story URL?" #: config.py:497 msgid "" "Look for first valid story URL inside EPUB, ZIP(HTML) or TXT ebook formats if not found in metadata.\n" "Somewhat risky, could find wrong URL depending on ebook content." -msgstr "" +msgstr "Zoek naar de eerste geldige Story-URL in EPUB-, ZIP (HTML) of TXT ebook-formaten indien niet gevonden in metadata.\nEnigszins riskant, zou een verkeerde URL kunnen vinden afhankelijk van de inhoud van het e-boek." #: config.py:501 msgid "Post Processing Options" -msgstr "" +msgstr "Postverwerkingsopties" #: config.py:505 msgid "Mark added/updated books when finished?" -msgstr "" +msgstr "Markeer toegevoegde / bijgewerkte boeken na beëindiging?" #: config.py:506 msgid "" "Mark added/updated books when finished. Use with option below.\n" "You can also manually search for 'marked:fff_success'.\n" "'marked:fff_failed' is also available, or search 'marked:fff' for both." -msgstr "" +msgstr "Markeer toegevoegde/bijgewerkte boeken na beëindiging. Gebruik met de onderstaande optie.\nU kunt ook handmatig zoeken naar 'marked: fff_success'. \n'gemarkeerd: fff_failed' is ook beschikbaar, of zoek 'gemarkeerd: fff' voor beide." #: config.py:510 msgid "Show Marked books when finished?" @@ -297,7 +298,7 @@ msgid "" "Show Marked added/updated books only when finished.\n" "You can also manually search for 'marked:fff_success'.\n" "'marked:fff_failed' is also available, or search 'marked:fff' for both." -msgstr "" +msgstr "Toon gemarkeerde toegevoegde/bijgewerkte boeken alleen na beëindiging.\n U kunt ook handmatig zoeken naar 'marked: fff_success'. \n'gemarkeerd: fff_failed' is ook beschikbaar, of zoek 'gemarkeerd: fff' voor beide." #: config.py:515 msgid "Smarten Punctuation (EPUB only)" @@ -307,14 +308,14 @@ msgstr "Slimme interpunctie (enkel EPUB)" msgid "" "Run Smarten Punctuation from Calibre's Polish Book feature on each EPUB " "download and update." -msgstr "" +msgstr "Voer slimme-interpunctie uit vanuit Calibre's \"Polijst boek\" functie op elke EPUB-download en update." #: config.py:521 msgid "" "Calculate Word Counts using Calibre internal methods.\n" "Many sites include Word Count, but many do not.\n" "This will count the words in each book and include it as if it came from the site." -msgstr "" +msgstr "Bereken woordtellingen met behulp van de interne methoden van Calibre.\nVeel sites bevatten Word Count, maar veel ook niet.\nDit telt de woorden in elk boek en neemt het op alsof het van de site komt." #: config.py:525 msgid "Calculate Word Count:" @@ -329,7 +330,7 @@ msgid "" "Automatically call calibre's Convert for new/update books.\n" "Converts to the current output format as chosen in calibre's\n" "Preferences->Behavior settings." -msgstr "" +msgstr " Automatisch aanroepen van calibre Convert voor nieuwe/update-boeken.\nConverteert naar het huidige uitvoerformaat zoals gekozen in Calibre's\nVoorkeuren-> Gedragsinstellingen." #: config.py:543 msgid "GUI Options" @@ -341,27 +342,27 @@ msgstr "URLs overnemen van klembord?" #: config.py:548 msgid "Prefill URLs from valid URLs in Clipboard when Adding New." -msgstr "" +msgstr "Vooraf invullen URL's van geldige URL's in het klembord bij het toevoegen van nieuw." #: config.py:552 msgid "Default to Update when books selected?" -msgstr "" +msgstr "Standaard updaten wanneer boeken zijn geselecteerd?" #: config.py:553 msgid "" "The top FanFicFare plugin button will start Update if\n" "books are selected. If unchecked, it will always bring up 'Add New'." -msgstr "" +msgstr "De bovenste knop van de FanFicFare plug-in start Update als\nboeken zijn geselecteerd. Indien niet aangevinkt, wordt altijd 'Nieuw toevoegen' weergegeven." #: config.py:557 msgid "Keep 'Add New from URL(s)' dialog on top?" -msgstr "" +msgstr "De dialoog 'Nieuw toevoegen van URL(' s) ' bovenaan houden?" #: config.py:558 msgid "" "Instructs the OS and Window Manager to keep the 'Add New from URL(s)'\n" "dialog on top of all other windows. Useful for dragging URLs onto it." -msgstr "" +msgstr "Instrueert het OS en vensterbeheerder de dialoog 'Nieuw toevoegen van URL(' s) '\nboven alle andere vensters te houden. Handig om URL's naartoe te slepen." #: config.py:562 msgid "Show estimated time left?" @@ -377,24 +378,24 @@ msgstr "Diverse opties" #: config.py:571 msgid "Inject calibre Series when none found?" -msgstr "" +msgstr "Calibre serie toevoegen als er geen gevonden is?" #: config.py:572 msgid "" "If no series is found, inject the calibre series (if there is one) so \n" "it appears on the FanFicFare title page(not cover)." -msgstr "" +msgstr "Als er geen serie wordt gevonden, voeg dan de Calibre serie toe (als die er is)\nzodat deze op de titelpagina van FanFicFare verschijnt (niet de omslag)." #: config.py:576 msgid "Search by Title/Author(s) for If Story Already Exists?" -msgstr "" +msgstr "Zoeken op titel/auteur(s) voor het geval verhaal al bestaat?" #: config.py:577 msgid "" "When checking If Story Already Exists FanFicFare will first match by " "URL Identifier. But if not found, it can also search existing books by " "Title and Author(s)." -msgstr "" +msgstr "Bij de controle of verhaal al bestaat, zal FanFicFare eerst vergelijken op URL-identificatie. Maar als het niet wordt gevonden, kan het ook naar bestaande boeken zoeken op titel en auteur(s)." #: config.py:581 msgid "Reject List" @@ -406,7 +407,7 @@ msgstr "Bewerk afgewezen URL lijst" #: config.py:586 msgid "Edit list of URLs FanFicFare will automatically Reject." -msgstr "" +msgstr "Bewerk lijst met URL's die FanFicFare automatisch weigert." #: config.py:590 config.py:669 msgid "Add Reject URLs" @@ -414,7 +415,7 @@ msgstr "Voeg afgewezen URL's toe" #: config.py:591 msgid "Add additional URLs to Reject as text." -msgstr "" +msgstr "Voeg extra te weigeren URL's toe als tekst." #: config.py:595 msgid "Edit Reject Reasons List" @@ -422,19 +423,19 @@ msgstr "Bewerk afwijs-redenen lijst" #: config.py:596 config.py:659 msgid "Customize the Reasons presented when Rejecting URLs" -msgstr "" +msgstr "Pas de voorgestelde redenen aan voor het verwerpen van URL's" #: config.py:601 msgid "Always reject URLs on the Reject List without stopping and asking." -msgstr "" +msgstr "Altijd URL's op de lijst met afwijzingen verwerpen zonder te stoppen en te vragen." #: config.py:605 msgid "Delete on Reject by Default?" -msgstr "" +msgstr "Standaard wissen bij weigering?" #: config.py:606 msgid "Should the checkbox to delete Rejected books be checked by default?" -msgstr "" +msgstr "Moet het selectievakje om verworpen boeken te verwijderen standaard worden aangevinkt?" #: config.py:643 msgid "Edit Reject URLs List" @@ -460,29 +461,29 @@ msgstr "Titel door auteur" msgid "" "Add Reject URLs. Use: http://...,note or http://...,title by " "author - note
Invalid story URLs will be ignored." -msgstr "" +msgstr "Voeg te weigeren URL's toe. Gebruik: http: //...,note of http: //...,title by author - note
Ongeldige verhaal-URL's worden genegeerd." #: config.py:671 msgid "" "One URL per line:\n" "http://...,note\n" "http://...,title by author - note" -msgstr "" +msgstr "Een URL per regel:\nhttp://...,note\nhttp://...,title by author - note" #: config.py:673 dialogs.py:1126 msgid "Add this reason to all URLs added:" -msgstr "" +msgstr "Voeg deze reden toe aan alle toegevoegde URL's:" #: config.py:689 msgid "" "These settings provide more detailed control over what metadata will be " "displayed inside the ebook as well as let you set %(isa)s and %(u)s/%(p)s " "for different sites." -msgstr "" +msgstr "Deze instellingen bieden meer gedetailleerde controle over welke metagegevens in het e-boek worden getoond en laten u ook%(isa)s en%(u)s / %(p)s voor verschillende sites instellen." #: config.py:696 msgid "personal.ini" -msgstr "" +msgstr "personal.ini" #: config.py:703 config.py:807 config.py:808 msgid "Edit personal.ini" @@ -492,27 +493,27 @@ msgstr "Bewerk personal.ini" msgid "" "FanFicFare now includes find, color coding, and error checking for " "personal.ini editing. Red generally indicates errors." -msgstr "" +msgstr "FanFicFare bevat nu zoeken, kleurcodering en foutcontrole voor het bewerken van personal.ini. Rood geeft over het algemeen fouten aan." #: config.py:716 msgid "View \"Safe\" personal.ini" -msgstr "" +msgstr "Bekijk \"Safe\" personal.ini" #: config.py:721 config.py:798 msgid "" "View your personal.ini with usernames and passwords removed. For safely " "sharing your personal.ini settings with others." -msgstr "" +msgstr "Bekijk uw personal.ini met verwijderde gebruikersnamen en wachtwoorden. Voor het veilig delen van uw persoonlijke.ini-instellingen met anderen." #: config.py:727 msgid "defaults.ini" -msgstr "" +msgstr "defaults.ini" #: config.py:732 msgid "" "View all of the plugin's configurable settings\n" "and their default settings." -msgstr "" +msgstr "Bekijk alle te wijzigen instellingen van de plug-in en hun standaardwaarden." #: config.py:733 msgid "View Defaults" @@ -520,24 +521,24 @@ msgstr "Toon standaarden" #: config.py:744 msgid "Calibre Columns" -msgstr "" +msgstr "Calibre kolommen" #: config.py:751 msgid "" "If checked, when updating/overwriting an existing book, FanFicFare will have" " the Calibre Columns available to use in replace_metadata, title_page, " "etc.
Click the button below to see the Calibre Column names." -msgstr "" +msgstr "Indien aangevinkt, zal FanFicFare bij het bijwerken / overschrijven van een bestaand boek de Calibre kolommen beschikbaar hebben om te gebruiken in replace_metadata, title_page, etc.
Klik op de knop hieronder om de Calibre kolomnamen te zien." #: config.py:752 msgid "Pass Calibre Columns into FanFicFare on Update/Overwrite" -msgstr "" +msgstr "Voeg kolommen van Caliber in in FanFicFare bij bijwerken / overschrijven" #: config.py:765 msgid "" "FanFicFare can pass the Calibre Columns into the download/update " "process.
This will show you the columns available by name." -msgstr "" +msgstr "FanFicFare kan de Calibre kolommen doorgeven aan het download / update-proces.
Dit toont je ​​de kolommen die op naam beschikbaar zijn." #: config.py:766 msgid "Show Calibre Column Names" @@ -546,7 +547,7 @@ msgstr "Toon calibre kolomnamen" #: config.py:775 msgid "" "Changes will only be saved if you click 'OK' to leave Customize FanFicFare." -msgstr "" +msgstr "Wijzigingen worden alleen opgeslagen wanneer u op 'OK' klikt bij het verlaten van aanpassen FanFicFare ." #: config.py:785 msgid "Plugin Defaults" @@ -554,79 +555,79 @@ msgstr "Plugin standaarden" #: config.py:786 msgid "Plugin Defaults (%s) (Read-Only)" -msgstr "" +msgstr "Plugin standaarden (%s) (alleen-lezen)" #: config.py:797 msgid "View 'Safe' personal.ini" -msgstr "" +msgstr "Bekijk 'Veilig' personal.ini" #: config.py:831 msgid "Calibre Column Entry Names" -msgstr "" +msgstr "Calibre kolominvoernamen" #: config.py:832 msgid "Label (entry_name)" -msgstr "" +msgstr "Label (invoernaam)" #: config.py:852 msgid "" "These settings provide integration with the %(rl)s Plugin. %(rl)s can " "automatically send to devices and change custom columns. You have to create" " and configure the lists in %(rl)s to be useful." -msgstr "" +msgstr "Deze instellingen bieden integratie met de %(rl)s plug-in. %(rl)s kan automatisch naar apparaten verzenden en aangepaste kolommen wijzigen. Om bruikbaar te zijn, moet je de lijsten in %(rl)s maken en configureren." #: config.py:857 msgid "Add new/updated stories to \"Send to Device\" Reading List(s)." -msgstr "" +msgstr "Voeg nieuwe / bijgewerkte verhalen toe aan de leeslijst(en) van \"Verzenden naar apparaat\"." #: config.py:858 msgid "" "Automatically add new/updated stories to these lists in the %(rl)s plugin." -msgstr "" +msgstr "Voeg automatisch nieuwe / bijgewerkte verhalen toe aan deze lijsten in de %(rl)splug-in." #: config.py:863 msgid "\"Send to Device\" Reading Lists" -msgstr "" +msgstr "Leeslijst(en) van \"Verzenden naar apparaat\"." #: config.py:864 config.py:867 config.py:881 config.py:884 msgid "" "When enabled, new/updated stories will be automatically added to these " "lists." -msgstr "" +msgstr "Indien ingeschakeld, worden nieuwe / bijgewerkte verhalen automatisch aan deze lijsten toegevoegd." #: config.py:874 msgid "Add new/updated stories to \"To Read\" Reading List(s)." -msgstr "" +msgstr "Voeg nieuwe / bijgewerkte verhalen toe aan de leeslijst(en) van \"Te Lezen\"." #: config.py:875 msgid "" "Automatically add new/updated stories to these lists in the %(rl)s plugin.\n" "Also offers menu option to remove stories from the \"To Read\" lists." -msgstr "" +msgstr "Voeg automatisch nieuwe / bijgewerkte verhalen toe aan deze lijsten in de %(rl)splug-in.\nBiedt ook een menuoptie om verhalen uit de lijsten \"Te lezen\" te verwijderen." #: config.py:880 msgid "\"To Read\" Reading Lists" -msgstr "" +msgstr "\"Te lezen\" leeslijst" #: config.py:891 msgid "Add stories back to \"Send to Device\" Reading List(s) when marked \"Read\"." -msgstr "" +msgstr "Plaats verhalen, die zijn gemarkeerd als \"Gelezen\", terug op de leeslijst(en) van \"Verzenden naar apparaat\"." #: config.py:892 msgid "" "Menu option to remove from \"To Read\" lists will also add stories back to " "\"Send to Device\" Reading List(s)" -msgstr "" +msgstr "Menu-optie om te verwijderen uit \"Te Lezen\" -lijsten zal ook verhalen terugplaatsen op \"Verzenden naar apparaat\" Leeslijst (en)" #: config.py:896 msgid "Automatically run Remove \"New\" Chapter Marks when marking books \"Read\"." -msgstr "" +msgstr "Automatisch verwijderen van \"Nieuw\" hoofdstukmarkeringen bij het markeren van boeken \"Gelezen\"." #: config.py:897 msgid "" "Menu option to remove from \"To Read\" lists will also remove \"(new)\" " "chapter marks created by personal.ini mark_new_chapters setting." -msgstr "" +msgstr "Menuoptie om te verwijderen uit \"Te Lezen\" -lijsten zal ook \"(nieuw)\" hoofdstukmarkeringen verwijderen die zijn aangemaakt door de instelling mark_new_chapters in personal.ini." #: config.py:925 msgid "" From 86d796e08aec95dd127bce708ac38f5d3189c14c Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Mon, 26 Feb 2018 19:17:28 -0600 Subject: [PATCH 25/26] Bump Test Version 2.22.6 --- calibre-plugin/__init__.py | 2 +- fanficfare/cli.py | 2 +- setup.py | 2 +- webservice/app.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/calibre-plugin/__init__.py b/calibre-plugin/__init__.py index 769db4b..dc6aa7a 100644 --- a/calibre-plugin/__init__.py +++ b/calibre-plugin/__init__.py @@ -33,7 +33,7 @@ except NameError: from calibre.customize import InterfaceActionBase # pulled out from FanFicFareBase for saving in prefs.py -__version__ = (2, 22, 5) +__version__ = (2, 22, 6) ## Apparently the name for this class doesn't matter--it was still ## 'demo' for the first few versions. diff --git a/fanficfare/cli.py b/fanficfare/cli.py index ee1bc6b..aad7e60 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -30,7 +30,7 @@ import sys import pickle import cookielib as cl -version="2.22.5" +version="2.22.6" if sys.version_info < (2, 5) or sys.version_info > (3,0): print('This program requires Python 2.5 or newer. Python 3 is not supported.') diff --git a/setup.py b/setup.py index 5d441d6..7e0bb5d 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setup( name="FanFicFare", # Versions should comply with PEP440. - version="2.22.5", + version="2.22.6", description='A tool for downloading fanfiction to eBook formats', long_description=long_description, diff --git a/webservice/app.yaml b/webservice/app.yaml index 9fbb6af..3315837 100644 --- a/webservice/app.yaml +++ b/webservice/app.yaml @@ -1,6 +1,6 @@ # ffd-retief-hrd fanficfare application: fanficfare -version: 2-22-5 +version: 2-22-6 runtime: python27 api_version: 1 threadsafe: true From 2eb5e6401d454e17cf63b768a7fdaa92bb5440c0 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Wed, 28 Feb 2018 10:29:19 -0600 Subject: [PATCH 26/26] Bump Release Version 2.23.0 --- calibre-plugin/__init__.py | 2 +- fanficfare/cli.py | 2 +- setup.py | 2 +- webservice/app.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/calibre-plugin/__init__.py b/calibre-plugin/__init__.py index dc6aa7a..c25aa05 100644 --- a/calibre-plugin/__init__.py +++ b/calibre-plugin/__init__.py @@ -33,7 +33,7 @@ except NameError: from calibre.customize import InterfaceActionBase # pulled out from FanFicFareBase for saving in prefs.py -__version__ = (2, 22, 6) +__version__ = (2, 23, 0) ## Apparently the name for this class doesn't matter--it was still ## 'demo' for the first few versions. diff --git a/fanficfare/cli.py b/fanficfare/cli.py index aad7e60..12a197e 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -30,7 +30,7 @@ import sys import pickle import cookielib as cl -version="2.22.6" +version="2.23.0" if sys.version_info < (2, 5) or sys.version_info > (3,0): print('This program requires Python 2.5 or newer. Python 3 is not supported.') diff --git a/setup.py b/setup.py index 7e0bb5d..493d985 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setup( name="FanFicFare", # Versions should comply with PEP440. - version="2.22.6", + version="2.23.0", description='A tool for downloading fanfiction to eBook formats', long_description=long_description, diff --git a/webservice/app.yaml b/webservice/app.yaml index 3315837..508b38a 100644 --- a/webservice/app.yaml +++ b/webservice/app.yaml @@ -1,6 +1,6 @@ # ffd-retief-hrd fanficfare application: fanficfare -version: 2-22-6 +version: 2-23-0 runtime: python27 api_version: 1 threadsafe: true