Compare commits

...
8 Commits
Author SHA1 Message Date
Jim Miller 6ff1ed4ba9 Correct index.html change list. 2015-06-08 20:16:23 -05:00
Jim Miller ea1bbc0be0 Update translations. 2015-06-08 20:00:38 -05:00
Jim Miller 6b45689377 Bump version to v2.2.7 2015-06-08 19:58:57 -05:00
Jim Miller 2a174f1762 Normalize story URLs from email before comparing to Reject List. 2015-05-30 16:23:12 -05:00
Jim Miller 50095a3b74 Merge pull request #102 from cryzed/master
Prevent duplicated story URLs even without normalization
2015-05-30 10:29:13 -05:00
Jim Miller 495bfb36b3 Fix dump_html_metadata for non-string values. 2015-05-30 10:16:16 -05:00
Jim Miller d6d08345b7 Fix add_genre_when_multi_category when genre is empty. 2015-05-30 09:30:41 -05:00
cryzed f9573e2061 Prevent duplicated story URLs even without normalization 2015-05-30 15:27:05 +02:00
9 changed files with 119 additions and 127 deletions
+1 -1
View File
@@ -42,7 +42,7 @@ class FanFicFareBase(InterfaceActionBase):
description = _('UI plugin to download FanFiction stories from various sites.')
supported_platforms = ['windows', 'osx', 'linux']
author = 'Jim Miller'
version = (2, 2, 6)
version = (2, 2, 7)
minimum_calibre_version = (1, 48, 0)
#: This field defines the GUI plugin class that contains all the code
+2 -1
View File
@@ -447,7 +447,8 @@ class FanFicFarePlugin(InterfaceAction):
prefs['imapmarkread'],)
reject_list=set()
if prefs['auto_reject_from_email']:
reject_list = set([x for x in url_list if rejecturllist.check(x)])
# need to normalize for reject list.
reject_list = set([x for x in url_list if rejecturllist.check(adapters.getNormalStoryURLSite(x)[0])])
url_list = url_list - reject_list
self.gui.status_bar.show_message(_('Finished Fetching Story URLs from Email.'),3000)
+28 -27
View File
@@ -2,6 +2,7 @@
# Copyright (C) YEAR ORGANIZATION
#
# Translators:
# Xotes <alois.glibert@gmail.com>, 2015
# Franck, 2015
# Ptitprince <leporello1791@gmail.com>, 2014-2015
# sengian <sengian1@gmail.com>, 2015
@@ -9,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: calibre-plugins\n"
"POT-Creation-Date: 2015-05-21 10:12+Central Daylight Time\n"
"PO-Revision-Date: 2015-05-22 18:01+0000\n"
"Last-Translator: Ptitprince <leporello1791@gmail.com>\n"
"PO-Revision-Date: 2015-06-07 19:55+0000\n"
"Last-Translator: Xotes <alois.glibert@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/projects/p/calibre-plugins/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -346,7 +347,7 @@ msgstr "Liste des rejets"
#: config.py:524
msgid "Edit Reject URL List"
msgstr "Editer la Liste de Rejet URL"
msgstr "Éditer la Liste de Rejet URL"
#: config.py:525
msgid "Edit list of URLs FanFicFare will automatically Reject."
@@ -358,7 +359,7 @@ msgstr "Ajouter des URLs rejetées"
#: config.py:530
msgid "Add additional URLs to Reject as text."
msgstr "Ajoute des URLs additionnelle à rejeter comme texte."
msgstr "Ajoute des URLs additionnelles à rejeter comme texte."
#: config.py:534
msgid "Edit Reject Reasons List"
@@ -378,7 +379,7 @@ msgstr "Toujours rejeter les URLs dans la Liste de Rejet sans interruption ni qu
#: config.py:574
msgid "Edit Reject URLs List"
msgstr "Editer la liste des URLs rejetées"
msgstr "Éditer la liste des URLs rejetées"
#: config.py:588
msgid "Reject Reasons"
@@ -561,14 +562,14 @@ msgstr "Utiliser l'extension pour créer des couvertures. Les paramètres additi
#: config.py:863
msgid "Calibre Generate Cover"
msgstr ""
msgstr "Générer une couverture calibre"
#: config.py:864
msgid ""
"Call Calibre's Edit Metadata Generate cover feature to create a random cover"
" each time a story is downloaded or updated.<br />Right click or long click "
"the 'Generate cover' button in Calibre's Edit Metadata to customize."
msgstr ""
msgstr "Appeler la fonction calibre modifier les métadonnées génération de couverture pour créer une couverture aléatoire à chaque fois qu'une histoire est téléchargée ou mise à jour. <br /> Faîtes un clic droit ou cliquez sur le bouton \"Générer couverture\" dans Modifier les métadonnées de Calibre pour le personnaliser."
#: config.py:878
msgid "Generate Covers Only for New Books"
@@ -578,18 +579,18 @@ msgstr "Générer les Couvertures Seulement pour les Nouveaux Livres"
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 "C'est configuré par défaut pour générer une couverture chaque fois que les métadonnées de calibre sont mises à jour. <br \\> C'est utilisé à la fois pour Calibre et les couvertures générés par des extensions."
#: config.py:885
msgid "Inject/update the cover inside EPUB"
msgstr ""
msgstr "Injecter / mettre à jour la couverture à l'intérieur du fichier EPUB"
#: config.py:886
msgid ""
"Calibre's Polish feature will be used to inject or update the generated "
"cover into the EPUB ebook file.<br \\>Used for both Calibre and Plugin "
"generated covers."
msgstr ""
msgstr "La fonction polissage de Calibre sera utilisé pour injecter ou mettre à jour la couverture générée dans le fichier de livre numérique EPUB. <br \\> C'est utilisé à la fois pour Calibre et les couvertures générées par extensions."
#: config.py:892
msgid "%(gc)s(Plugin) Settings"
@@ -601,7 +602,7 @@ msgid ""
"(including existing cover image). If you have %(gc)s installed, FanFicFare "
"can run %(gc)s on new downloads and metadata updates. Pick a %(gc)s setting"
" by site and/or one to use by Default."
msgstr ""
msgstr "L'extension %(gc)s peut créer des images de couverture de livres en utilisant différentes métadonnées (y compris l'image de couverture existante). Si vous avez installé %(gc)s, FanFicFare peut exécuter %(gc)s sur les nouveaux téléchargements et mises à jour de métadonnées. Choisissez un réglage %(gc)s par site et / ou utiliser celui par défaut."
#: config.py:918 config.py:922 config.py:935
msgid "Default"
@@ -611,11 +612,11 @@ msgstr "Par défaut"
msgid ""
"On Metadata update, run %(gc)s with this setting, if there isn't a more "
"specific setting below."
msgstr ""
msgstr "À la mise à jour des métadonnées, exécutez %(gc)s avec ce paramètre, s'il n'y a pas un réglage plus spécifique ci-dessous."
#: config.py:926
msgid "On Metadata update, run %(gc)s with this setting for %(site)s stories."
msgstr "A la mise à jour de métadonnées, exécute %(gc)s avec ces paramètres pour des %(site)s de récits."
msgstr "À la mise à jour de métadonnées, exécute %(gc)s avec ces paramètres pour des %(site)s de récits."
#: config.py:949
msgid "Allow %(gcset)s from %(pini)s to override"
@@ -626,7 +627,7 @@ msgid ""
"The %(pini)s parameter %(gcset)s allows you to choose a %(gc)s setting based"
" on metadata rather than site, but it's much more complex.<br \\>%(gcset)s "
"is ignored when this is off."
msgstr ""
msgstr "Le paramètre %(pini)s %(gcset)s vous permet de choisir un réglage %(gc)s basé sur les métadonnées plutôt que sur un site, mais il est beaucoup plus complexe. <br \\>%(gcset)s est ignoré lorsque c'est éteint."
#: config.py:988
msgid ""
@@ -870,7 +871,7 @@ msgstr "Lorsque la mise à jour ou l'écrasement d'un récit existant échoue, e
#: config.py:1247
msgid "Saved Metadata Column:"
msgstr ""
msgstr "Colonne de Métadonnée Sauvée :"
#: config.py:1248
msgid ""
@@ -878,7 +879,7 @@ msgid ""
"the book is downloaded or updated.<br/>The metadata from this column can "
"later be used to update custom columns without having to request the "
"metadata from the server again.<br/>(Long Text columns only.)"
msgstr ""
msgstr "Si paramétré, FanFicFare sauvera une copie de toutes ses métadonnées dans cette colonne lorsque le livre est télécharger ou mis à jour. <br/> Les métadonnées de cette colonne peuvent ensuite être utilisées pour actualiser des colonnes personnalisées sans devoir requérir à nouveau les métadonnées à partir du serveur. <br/> (Colonne de Long Texte uniquement.)"
#: config.py:1274
msgid "Author(s)"
@@ -992,7 +993,7 @@ msgstr "Si coché, les courriels seront marqués comme lus s'ils contiennent des
#: config.py:1380
msgid "Discard URLs on Reject List"
msgstr ""
msgstr "Effacer les URLs de la Liste de Rejet"
#: config.py:1381
msgid ""
@@ -1000,7 +1001,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 "Si coché, FanFicFare écartera silencieusement toutes les URLs des e-mails qui sont sur votre Liste de Rejet URL.<br> Sinon, elles apparaitront et vous verrez la boite de dialogue de Rejet URL habituelle<br> Les e-mails seront toujours marqués comme lu si configuré pour."
#: config.py:1386
msgid ""
@@ -1036,11 +1037,11 @@ msgstr "Ecraser toujours"
#: dialogs.py:82
msgid "Update Calibre Metadata from Web Site"
msgstr ""
msgstr "Mettre à Jour les Métadonnées de calibre à Partir d'un Site Web"
#: dialogs.py:83
msgid "Update Calibre Metadata from Saved Metadata Column"
msgstr ""
msgstr "Mettre à Jour les Métadonnées de calibre à Partir d'une Colonne de Métadonnées"
#: dialogs.py:267 dialogs.py:776
msgid "Show Download Options"
@@ -1437,11 +1438,11 @@ msgstr "Les paramètres de Courriel FanFicFare ne sont pas configurés."
#: fff_plugin.py:442
msgid "Fetching Story URLs from Email..."
msgstr ""
msgstr "Récupération des URLs d'Histoires à partir d'e-mail..."
#: fff_plugin.py:453
msgid "Finished Fetching Story URLs from Email."
msgstr ""
msgstr "A Fini de Récupérer les URLs d'Histoires à partir d'e-mail."
#: fff_plugin.py:460
msgid "No Valid Story URLs Found in Unread Emails."
@@ -1449,7 +1450,7 @@ msgstr "Aucune URL d'histoire valide trouvée dans les courriels non lus"
#: fff_plugin.py:462
msgid "(%d Story URLs Skipped, on Rejected URL List)"
msgstr ""
msgstr "(%d URLs d'Histoires ignoré, selon la Liste de Rejet d'URL)"
#: fff_plugin.py:463
msgid "Get Story URLs from Email"
@@ -1457,11 +1458,11 @@ msgstr "Obtenir des URL d'histoires à partir du Courriel"
#: fff_plugin.py:486
msgid "Fetching Story URLs from Page..."
msgstr ""
msgstr "Récupération des URLs d'Histoires sur la Page..."
#: fff_plugin.py:490
msgid "Finished Fetching Story URLs from Page."
msgstr ""
msgstr "A Fini de Récupéré les URLs d'Histoires sur la Page."
#: fff_plugin.py:496 fff_plugin.py:548
msgid "List of Story URLs"
@@ -1544,11 +1545,11 @@ msgstr "Le livre n'est pas une Anthologie FanFicFare ou contient un/des livre(s)
#: fff_plugin.py:678
msgid "Fetching Story URLs for Series..."
msgstr ""
msgstr "Récupération des URLs d'Histoires pour les Séries..."
#: fff_plugin.py:688
msgid "Finished Fetching Story URLs for Series."
msgstr ""
msgstr "A Fini de Récupéré les URLs d'Histoires pour les Séries."
#: fff_plugin.py:735
msgid ""
+60 -60
View File
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: calibre-plugins\n"
"POT-Creation-Date: 2015-05-21 10:12+Central Daylight Time\n"
"PO-Revision-Date: 2015-05-22 08:36+0000\n"
"Last-Translator: Kovid Goyal <kovid@kovidgoyal.net>\n"
"PO-Revision-Date: 2015-05-30 12:20+0000\n"
"Last-Translator: W.P.M.E. Hofland <wpme.hofland@gmail.com>\n"
"Language-Team: Dutch (http://www.transifex.com/projects/p/calibre-plugins/language/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -51,7 +51,7 @@ msgstr "Wis"
#: common_utils.py:499
msgid "Clear all settings for this plugin"
msgstr ""
msgstr "Wis alle instellingen van deze plugin"
#: common_utils.py:526
msgid ""
@@ -71,11 +71,11 @@ msgstr "U dient calibre achteraf te herstarten."
#: common_utils.py:537
msgid "All settings for this plugin in this library have been cleared."
msgstr ""
msgstr "Alle instellingen voor de plugin in deze bibliotheek zijn gewist."
#: common_utils.py:538
msgid "Please restart calibre now."
msgstr ""
msgstr "Herstart calibre nu alstublieft."
#: common_utils.py:540
msgid "Restart calibre now"
@@ -131,7 +131,7 @@ msgstr ""
#: config.py:385
msgid "Default Output &Format:"
msgstr ""
msgstr "Standaard uitvoer &formaat:"
#: config.py:400
msgid ""
@@ -172,7 +172,7 @@ msgstr "Calibre opties bijwerken"
#: config.py:432
msgid "Delete other existing formats?"
msgstr ""
msgstr "Wis andere aanwezige formaten?"
#: config.py:433
msgid ""
@@ -256,7 +256,7 @@ msgstr ""
#: config.py:472
msgid "Show Marked books when finished?"
msgstr ""
msgstr "Gemarkeerde boeken achteraf tonen?"
#: config.py:473
msgid ""
@@ -288,7 +288,7 @@ msgstr ""
#: config.py:487
msgid "GUI Options"
msgstr ""
msgstr "GUI instellingen"
#: config.py:491
msgid "Take URLs from Clipboard?"
@@ -320,15 +320,15 @@ msgstr ""
#: config.py:506
msgid "Show estimated time left?"
msgstr ""
msgstr "Toon verwachte resterende tijd?"
#: config.py:507
msgid "When a Progress Bar is shown, show a rough estimate of the time left."
msgstr ""
msgstr "Als een voortgangsbalk wordt getoond, geef een ruw geschatte resterende tijd weer."
#: config.py:511
msgid "Misc Options"
msgstr ""
msgstr "Diverse opties"
#: config.py:515
msgid "Inject calibre Series when none found?"
@@ -342,11 +342,11 @@ msgstr ""
#: config.py:520
msgid "Reject List"
msgstr ""
msgstr "Afgewezen lijst"
#: config.py:524
msgid "Edit Reject URL List"
msgstr ""
msgstr "Bewerk afgewezen URL lijst"
#: config.py:525
msgid "Edit list of URLs FanFicFare will automatically Reject."
@@ -354,7 +354,7 @@ msgstr ""
#: config.py:529 config.py:600
msgid "Add Reject URLs"
msgstr ""
msgstr "Voeg afgewezen URL's toe"
#: config.py:530
msgid "Add additional URLs to Reject as text."
@@ -362,7 +362,7 @@ msgstr ""
#: config.py:534
msgid "Edit Reject Reasons List"
msgstr ""
msgstr "Bewerk afwijs-redenen lijst"
#: config.py:535 config.py:590
msgid "Customize the Reasons presented when Rejecting URLs"
@@ -370,7 +370,7 @@ msgstr ""
#: config.py:539
msgid "Reject Without Confirmation?"
msgstr ""
msgstr "Afwijzen zonder bevestiging?"
#: config.py:540
msgid "Always reject URLs on the Reject List without stopping and asking."
@@ -378,23 +378,23 @@ msgstr ""
#: config.py:574
msgid "Edit Reject URLs List"
msgstr ""
msgstr "Bewerk afgewezen URL's lijst"
#: config.py:588
msgid "Reject Reasons"
msgstr ""
msgstr "Redenen afwijzing"
#: config.py:589
msgid "Customize Reject List Reasons"
msgstr ""
msgstr "Lijst met afwijs-redenen personaliseren"
#: config.py:598
msgid "Reason why I rejected it"
msgstr ""
msgstr "Reden waarom ik dit heb afgewezen"
#: config.py:598
msgid "Title by Author"
msgstr ""
msgstr "Titel door auteur"
#: config.py:601
msgid ""
@@ -447,7 +447,7 @@ msgstr ""
#: config.py:658
msgid "Show Calibre Column Names"
msgstr ""
msgstr "Toon calibre kolomnamen"
#: config.py:659
msgid ""
@@ -457,7 +457,7 @@ msgstr ""
#: config.py:670
msgid "Plugin Defaults"
msgstr ""
msgstr "Plugin standaarden"
#: config.py:671
msgid "Plugin Defaults (%s) (Read-Only)"
@@ -538,7 +538,7 @@ msgstr ""
#: config.py:806
msgid "Update Calibre Cover (from EPUB):"
msgstr ""
msgstr "Calibre omslag bijwerken (uit EPUB):"
#: config.py:824
msgid ""
@@ -549,7 +549,7 @@ msgstr ""
#: config.py:828
msgid "Generate Calibre Cover:"
msgstr ""
msgstr "Genereer calibre omslag:"
#: config.py:855
msgid "Plugin %(gc)s"
@@ -671,11 +671,11 @@ msgstr "Sneltoetsen..."
#: config.py:1056
msgid "Edit the keyboard shortcuts associated with this plugin"
msgstr ""
msgstr "Bewerk de sneltoetsen voor deze plugin"
#: config.py:1060
msgid "Reset disabled &confirmation dialogs"
msgstr ""
msgstr "Uitgeschakelde &bevestigins-meldingen weer tonen"
#: config.py:1061
msgid "Reset all show me again dialogs for the FanFicFare plugin"
@@ -813,7 +813,7 @@ msgstr "Site-afkorting"
#: config.py:1154
msgid "FanFicFare Version"
msgstr ""
msgstr "FanFicFare versie"
#: config.py:1169
msgid ""
@@ -1020,23 +1020,23 @@ msgstr "Nieuw boek toevoegen"
#: dialogs.py:78
msgid "Update EPUB if New Chapters"
msgstr ""
msgstr "EPUB bijwerken bij nieuwe hoofdstukken"
#: dialogs.py:79
msgid "Update EPUB Always"
msgstr ""
msgstr "EPUB altijd bijwerken"
#: dialogs.py:80
msgid "Overwrite if Newer"
msgstr ""
msgstr "Overschrijven indien nieuwer"
#: dialogs.py:81
msgid "Overwrite Always"
msgstr ""
msgstr "Altijd overschrijven"
#: dialogs.py:82
msgid "Update Calibre Metadata from Web Site"
msgstr ""
msgstr "Calibre metadata bijwerken vanaf website"
#: dialogs.py:83
msgid "Update Calibre Metadata from Saved Metadata Column"
@@ -1048,7 +1048,7 @@ msgstr "Downloadopties weergeven"
#: dialogs.py:286 dialogs.py:793
msgid "Output &Format:"
msgstr ""
msgstr "Uitvoer &Formaat:"
#: dialogs.py:294 dialogs.py:801
msgid ""
@@ -1057,7 +1057,7 @@ msgstr ""
#: dialogs.py:322 dialogs.py:818
msgid "Update Calibre &Metadata?"
msgstr ""
msgstr "Calibre &Metadata bijwerken?"
#: dialogs.py:323 dialogs.py:819
msgid ""
@@ -1180,7 +1180,7 @@ msgstr "Metadata opgehaald voor"
#: dialogs.py:628
msgid " - %s estimated until done"
msgstr ""
msgstr " - %s geschat tot einde"
#: dialogs.py:678
msgid "%d day"
@@ -1220,7 +1220,7 @@ msgstr "minder dan 1 seconde"
#: dialogs.py:713 fff_plugin.py:358 fff_plugin.py:361
msgid "About FanFicFare"
msgstr ""
msgstr "Over FanFicFare"
#: dialogs.py:767
msgid "Remove selected books from the list"
@@ -1265,7 +1265,7 @@ msgstr ""
#: dialogs.py:1049
msgid "List of Books to Reject"
msgstr ""
msgstr "Lijst met boeken om af te wijzen"
#: dialogs.py:1062
msgid ""
@@ -1313,7 +1313,7 @@ msgstr ""
#: dialogs.py:1310
msgid "Go back to fix errors?"
msgstr ""
msgstr "Terug gaan om fouten te herstellen?"
#: dialogs.py:1422
msgid "Click an error below to return to Editing directly on that line:"
@@ -1321,11 +1321,11 @@ msgstr ""
#: dialogs.py:1434
msgid "Click to go to line %s"
msgstr ""
msgstr "Klik om naar lijn %s te gaan"
#: dialogs.py:1450
msgid "Return to Editing"
msgstr ""
msgstr "Terug naar bewerken"
#: dialogs.py:1454
msgid "Save Anyway"
@@ -1333,11 +1333,11 @@ msgstr "Toch opslaan"
#: dialogs.py:1483
msgid "Enter Email Password for %s:"
msgstr ""
msgstr "Voer E-mail wachtwoord in voor %s:"
#: fff_plugin.py:114 fff_plugin.py:145
msgid "FanFicFare"
msgstr ""
msgstr "FanFicFare"
#: fff_plugin.py:115
msgid "Download FanFiction stories from various web sites"
@@ -1413,15 +1413,15 @@ msgstr ""
#: fff_plugin.py:344
msgid "Reject Selected Books"
msgstr ""
msgstr "Geselecteerde boeken afwijzen"
#: fff_plugin.py:352
msgid "&Configure FanFicFare"
msgstr ""
msgstr "FanFicFare &instellen"
#: fff_plugin.py:355
msgid "Configure FanFicFare"
msgstr ""
msgstr "FanFicFare instellen"
#: fff_plugin.py:410
msgid "Cannot Update Reading Lists from Device View"
@@ -1465,7 +1465,7 @@ msgstr ""
#: fff_plugin.py:496 fff_plugin.py:548
msgid "List of Story URLs"
msgstr ""
msgstr "Lijst van verhaal-URL's"
#: fff_plugin.py:497
msgid "No Valid Story URLs found on given page."
@@ -1481,7 +1481,7 @@ msgstr "Bezig met verzamelen van URL's voor verhalen..."
#: fff_plugin.py:531
msgid "Get URLs for stories"
msgstr ""
msgstr "Verzamel URL's voor verhalen"
#: fff_plugin.py:532 fff_plugin.py:579 fff_plugin.py:772
msgid "URL retrieved"
@@ -1509,7 +1509,7 @@ msgstr ""
#: fff_plugin.py:613
msgid "Proceed to Remove?"
msgstr ""
msgstr "Doorgaan met verwijderen?"
#: fff_plugin.py:613
msgid ""
@@ -1566,11 +1566,11 @@ msgstr "Toch bijwerken?"
#: fff_plugin.py:739
msgid "Stories Removed"
msgstr ""
msgstr "Verhalen verwijderd"
#: fff_plugin.py:756
msgid "No Selected Books to Update"
msgstr ""
msgstr "Geen boeken geselecteerd om bij te werken"
#: fff_plugin.py:770
msgid "Collecting stories for update..."
@@ -1582,7 +1582,7 @@ msgstr ""
#: fff_plugin.py:781
msgid "Update Existing List"
msgstr ""
msgstr "Bestaande lijst bijwerken"
#: fff_plugin.py:839
msgid "Started fetching metadata for %s stories."
@@ -1594,7 +1594,7 @@ msgstr ""
#: fff_plugin.py:870 fff_plugin.py:876
msgid "Reject URL?"
msgstr ""
msgstr "URL afwijzen?"
#: fff_plugin.py:877 fff_plugin.py:895
msgid "<b>%s</b> is on your Reject URL list:"
@@ -1618,7 +1618,7 @@ msgstr "Afgewezen"
#: fff_plugin.py:888
msgid "Remove Reject URL?"
msgstr ""
msgstr "Verwijder afgewezen URL?"
#: fff_plugin.py:894
msgid "Remove URL from Reject List?"
@@ -1648,7 +1648,7 @@ msgstr ""
#: fff_plugin.py:998
msgid "Skip Story?"
msgstr ""
msgstr "Verhaal overslaan?"
#: fff_plugin.py:1004
msgid "Skip Anthology Story?"
@@ -1798,7 +1798,7 @@ msgstr ""
#: fff_plugin.py:1312 fff_plugin.py:1548
msgid "FanFicFare log"
msgstr ""
msgstr "FanFicFare logboek"
#: fff_plugin.py:1332
msgid "Download FanFiction Book"
@@ -1874,7 +1874,7 @@ msgstr ""
#: fff_plugin.py:1548
msgid "FanFicFare download complete"
msgstr ""
msgstr "FanFicFare download compleet"
#: fff_plugin.py:1561
msgid "Merging %s books."
@@ -1954,7 +1954,7 @@ msgstr "Slechte URL"
#: fff_plugin.py:2270 fff_plugin.py:2273
msgid "Anthology containing:"
msgstr ""
msgstr "Bloemlezing bevat:"
#: fff_plugin.py:2271
msgid "%s by %s"
@@ -1970,7 +1970,7 @@ msgstr "(was ingesteld, voor veiligheid verwijderd)"
#: jobs.py:60
msgid "Downloading FanFiction Stories"
msgstr ""
msgstr "FanFiction verhalen downloaden"
#: jobs.py:82
msgid "Successful:"
+20 -30
View File
@@ -15,12 +15,12 @@
# limitations under the License.
#
import re
import urlparse
import urllib2 as u2
import imaplib
import collections
import email
import imaplib
import re
import urllib2 as u2
import urlparse
from BeautifulSoup import BeautifulSoup
from gziphttp import GZipProcessor
@@ -74,10 +74,8 @@ def get_urls_from_page(url,configuration=None,normalize=False):
return get_urls_from_html(data,url,configuration,normalize,restrictsearch)
def get_urls_from_html(data,url=None,configuration=None,normalize=False,restrictsearch=None):
urls = collections.defaultdict(list)
normalized = [] # normalized url
retlist = [] # orig urls.
if not configuration:
configuration = Configuration("test1.com","EPUB")
@@ -93,7 +91,6 @@ def get_urls_from_html(data,url=None,configuration=None,normalize=False,restrict
#print("1 urlhref:%s"%href)
# this (should) catch normal story links, some javascript
# 'are you old enough' links, and 'Report This' links.
# The 'normalized' set prevents duplicates.
if 'story.php' in a['href']:
#print("trying:%s"%a['href'])
m = re.search(r"(?P<sid>(view)?story\.php\?(sid|psid|no|story|stid)=\d+)",a['href'])
@@ -106,31 +103,26 @@ def get_urls_from_html(data,url=None,configuration=None,normalize=False,restrict
#print("2 urlhref:%s"%href)
adapter = adapters.getAdapter(configuration,href)
#print("found adapter")
if adapter.story.getMetadata('storyUrl') not in normalized:
normalized.append(adapter.story.getMetadata('storyUrl'))
retlist.append(href)
urls[adapter.story.getMetadata('storyUrl')].append(href)
except Exception, e:
#print e
pass
if normalize:
return normalized
else:
return retlist
# Simply return the longest URL with the assumption that it contains the
# most user readable metadata, if not normalized
return urls.keys() if normalize else [max(value, key=len) for key, value in urls.items()]
def get_urls_from_text(data,configuration=None,normalize=False):
normalized = [] # normalized url
retlist = [] # orig urls.
urls = collections.defaultdict(list)
data=unicode(data)
if not configuration:
configuration = Configuration("test1.com","EPUB")
for href in re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', data):
# this (should) catch normal story links, some javascript
# 'are you old enough' links, and 'Report This' links.
# The 'normalized' set prevents duplicates.
if 'story.php' in href:
m = re.search(r"(?P<sid>(view)?story\.php\?(sid|psid|no|story|stid)=\d+)",href)
if m != None:
@@ -138,16 +130,14 @@ def get_urls_from_text(data,configuration=None,normalize=False):
try:
href = href.replace('&index=1','')
adapter = adapters.getAdapter(configuration,href)
if adapter.story.getMetadata('storyUrl') not in normalized:
normalized.append(adapter.story.getMetadata('storyUrl'))
retlist.append(href)
urls[adapter.story.getMetadata('storyUrl')].append(href)
except:
pass
if normalize:
return normalized
else:
return retlist
# Simply return the longest URL with the assumption that it contains the
# most user readable metadata, if not normalized
return urls.keys() if normalize else [max(value, key=len) for key, value in urls.items()]
def form_url(parenturl,url):
url = url.strip() # ran across an image with a space in the
@@ -216,9 +206,9 @@ def get_urls_from_imap(srv,user,passwd,folder,markread=True):
try:
#print("part mime:%s"%part.get_content_type())
if part.get_content_type() == 'text/plain':
urllist.extend(get_urls_from_text(part.get_payload(decode=True),normalize=True))
urllist.extend(get_urls_from_text(part.get_payload(decode=True)))
if part.get_content_type() == 'text/html':
urllist.extend(get_urls_from_html(part.get_payload(decode=True),normalize=True))
urllist.extend(get_urls_from_html(part.get_payload(decode=True)))
except Exception as e:
print("Failed to read email content: %s"%e)
#print "urls:%s"%get_urls_from_text(get_first_text_block(email_message))
+4 -1
View File
@@ -563,7 +563,8 @@ class Story(Configurable):
if None in v:
v.remove(None)
#logger.debug("k:%s v:%s"%(k,v))
val = "<ul>\n<li>%s</li>\n</ul>"%"</li>\n<li>".join(v)
# force ints/floats to strings.
val = "<ul>\n<li>%s</li>\n</ul>" % "</li>\n<li>".join([ "%s"%x for x in v ])
elif isinstance(v, (int)):
classes.append("int")
val = v
@@ -765,6 +766,8 @@ class Story(Configurable):
doreplacements=doreplacements)]
else:
retlist = self.getMetadataRaw(listname)
if retlist is None:
retlist = []
if retlist:
if doreplacements:
+1 -1
View File
@@ -25,7 +25,7 @@ setup(
# Versions should comply with PEP440. For a discussion on single-sourcing
# the version across setup.py and the project code, see
# https://packaging.python.org/en/latest/single_source_version.html
version="2.2.6",
version="2.2.7",
description='A tool for downloading fanfiction to eBook formats',
long_description=long_description,
+1 -1
View File
@@ -1,6 +1,6 @@
# ffd-retief-hrd fanfictiondownloader fanficfare
application: fanficfare
version: 2-2-6
version: 2-2-7
runtime: python27
api_version: 1
threadsafe: true
+2 -5
View File
@@ -46,10 +46,7 @@
</p>
<h3>Changes:</h3>
<ul>
<li>Fixes for storiesonline -- Thanks, davidfor.</li>
<li>Update html5lib to 0.99999.</li>
<li>Fix add_genre_when_multi_category for AO3 changes to genre/category.</li>
<li>Change AO3 genre & category to fill with freeformtags, ao3categories & fandoms from defaults.ini instead of by hardcode.</li>
<li>Fix add_genre_when_multi_category when genre is empty.</li>
</ul>
<p>
Questions? Check out our
@@ -59,7 +56,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-2-5.fanficfare.appspot.com">previous version
<a href="http://2-2-6.fanficfare.appspot.com">previous version
</a> is also available for you to use if necessary.
</p>
<div id='error'>