Merge remote-tracking branch 'refs/remotes/JimmXinu/master'

master
FaceDeer 2018-03-04 23:06:34 -07:00
commit e940fa7202
23 changed files with 202 additions and 149 deletions

View File

@ -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, 23, 0)
## Apparently the name for this class doesn't matter--it was still
## 'demo' for the first few versions.

View File

@ -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)

View File

@ -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,

View File

@ -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,15 @@ 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 'fandoms', FFF historically calls
## '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
@ -2981,4 +2992,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

View File

@ -2,7 +2,7 @@
# Copyright (C) YEAR ORGANIZATION
#
# Translators:
# Adolfo Jayme Barrientos, 2014
# Adolfo Jayme-Barrientos, 2014
# jmontane, 2014
# Queralt Iglesias <queralt.ig92@gmail.com>, 2016
# Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>, 2016-2017

View File

@ -3,7 +3,7 @@
#
# Translators:
# Ettore Atalan <atalanttore@googlemail.com>, 2014-2016
# ILB, 2014-2016
# ILB, 2014-2017
# jumo, 2016
# Sebastian Keller <Haggard@gmx.de>, 2015
# Simon_Schuette <simonschuette@arcor.de>, 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 <kovid@kovidgoyal.net>\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.<br>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.<br>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.<br "
"/>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.<br>Otherwise they will appear and you will see the"
" normal Reject URL dialog.<br>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.<br>Otherwise all story URLs, new and existing,"
" will be used.<br>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.<br>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"

View File

@ -2,7 +2,7 @@
# Copyright (C) YEAR ORGANIZATION
#
# Translators:
# Adolfo Jayme Barrientos, 2014
# Adolfo Jayme-Barrientos, 2014
# Albert, 2016
# dario hereñu <magallania@gmail.com>, 2015-2016
# Enrique Medina <medina9304@gmail.com>, 2016

View File

@ -4,6 +4,7 @@
# Translators:
# Alex, 2016
# erkfuizfeuadjfjzefzfuzeff gbhygsregfges <erkfuizfeuadjfjzefzfuzeff@gmail.com>, 2017
# Herman van der Vaart <vaarttuig@gmail.com>, 2018
# Mario Moens <marimo.it4u@gmail.com>, 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 <marimo.it4u@gmail.com>\n"
"PO-Revision-Date: 2018-02-26 15:13+0000\n"
"Last-Translator: Herman van der Vaart <vaarttuig@gmail.com>\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. <br "
"/>This sets whether that will default to on or off. <br />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. <br />Hiermee wordt de standaard ingesteld op aan of uit.<br /> 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"
" <i>inside</i> the EPUB from the web site when the EPUB is updated.<br "
"/>This sets whether that will default to on or off."
msgstr ""
msgstr "Bij elke download biedt FanFicFare de optie om de boekomslag<i> in </i>de EPUB vanaf de website bij te werken wanneer de EPUB wordt bijgewerkt.<br /> 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.<br />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.<br /> 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.<br /> 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 <i>If Story Already Exists</i> 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<i> of verhaal al bestaat</i>, 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: <b>http://...,note</b> or <b>http://...,title by "
"author - note</b><br>Invalid story URLs will be ignored."
msgstr ""
msgstr "Voeg te weigeren URL's toe. Gebruik:<b> http: //...,note</b> of <b>http: //...,title by author - note</b><br> Ongeldige verhaal-URL's worden genegeerd."
#: config.py:671
msgid ""
"One URL per line:\n"
"<b>http://...,note</b>\n"
"<b>http://...,title by author - note</b>"
msgstr ""
msgstr "Een URL per regel:\n<b>http://...,note</b>\n<b>http://...,title by author - note</b>"
#: 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.<br>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. <br> 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.<br>This will show you the columns available by name."
msgstr ""
msgstr "FanFicFare kan de Calibre kolommen doorgeven aan het download / update-proces.<br> 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 <i>mark_new_chapters</i> setting."
msgstr ""
msgstr "Menuoptie om te verwijderen uit \"Te Lezen\" -lijsten zal ook \"(nieuw)\" hoofdstukmarkeringen verwijderen die zijn aangemaakt door de instelling <i>mark_new_chapters</i> in personal.ini."
#: config.py:925
msgid ""

View File

@ -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 <i> 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))

View File

@ -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'):

View File

@ -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:

View File

@ -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)

View File

@ -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 "<h2>Story Not Found</h2>" 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)

View File

@ -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)

View File

@ -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']

View File

@ -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:

View File

@ -30,7 +30,7 @@ import sys
import pickle
import cookielib as cl
version="2.20.0"
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.')
@ -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)

View File

@ -2536,6 +2536,15 @@ 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 'fandoms', FFF historically calls
## '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
@ -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

View File

@ -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.

View File

@ -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")

View File

@ -21,7 +21,7 @@ setup(
name="FanFicFare",
# Versions should comply with PEP440.
version="2.20.0",
version="2.23.0",
description='A tool for downloading fanfiction to eBook formats',
long_description=long_description,

View File

@ -1,6 +1,6 @@
# ffd-retief-hrd fanficfare
application: fanficfare
version: 2-20-0
version: 2-23-0
runtime: python27
api_version: 1
threadsafe: true

View File

@ -35,7 +35,7 @@
If you have any problems with this application, please
report them in
the <a href="http://groups.google.com/group/fanfic-downloader">FanFicFare Google Group</a>. The
<a href="http://2-19-0.fanficfare.appspot.com">previous version
<a href="http://2-22-0.fanficfare.appspot.com">previous version
</a> is also available for you to use if necessary.
</p>
<div id='error'>