Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-fanficfare for 
openSUSE:Factory checked in at 2021-08-26 23:15:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-fanficfare (Old)
 and      /work/SRC/openSUSE:Factory/.python-fanficfare.new.1899 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-fanficfare"

Thu Aug 26 23:15:14 2021 rev:35 rq:914387 version:4.5.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-fanficfare/python-fanficfare.changes      
2021-07-21 19:08:08.683475490 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-fanficfare.new.1899/python-fanficfare.changes
    2021-08-26 23:16:30.144189052 +0200
@@ -1,0 +2,18 @@
+Thu Aug 26 10:10:28 UTC 2021 - Matej Cepl <mc...@suse.com>
+
+- Update to 4.5.0:
+  - (Known issue: #729 - wuxiaworld.site has changed)
+  - Update translations.
+  - Fix for lazyload images in base_xenforoforum_adapter
+  - Keep existing series/anthology URL during update for config
+    purposes.
+  - Allow chapter URLs for adapter_webnovelcom.
+  - Shift adapter_fictionmaniatv to http, problems with https
+    server?
+  - Change blockfilecache to save uint32 addrs instead of
+    original cache key. Hashing cache key proved unreliable in
+    some cases.
+  - Allow fictionpress.com with use_browser_cache--user still
+    needs to configure in personal.ini Closes #716
+
+-------------------------------------------------------------------

Old:
----
  FanFicFare-4.4.0.tar.gz

New:
----
  FanFicFare-4.5.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-fanficfare.spec ++++++
--- /var/tmp/diff_new_pack.lmVy2o/_old  2021-08-26 23:16:30.676188602 +0200
+++ /var/tmp/diff_new_pack.lmVy2o/_new  2021-08-26 23:16:30.680188599 +0200
@@ -21,7 +21,7 @@
 %define skip_python2 1
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-fanficfare
-Version:        4.4.0
+Version:        4.5.0
 Release:        0
 Summary:        Tool for making eBooks from stories on fanfiction and other 
web sites
 License:        GPL-3.0-only

++++++ FanFicFare-4.4.0.tar.gz -> FanFicFare-4.5.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/calibre-plugin/__init__.py 
new/FanFicFare-4.5.0/calibre-plugin/__init__.py
--- old/FanFicFare-4.4.0/calibre-plugin/__init__.py     2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/calibre-plugin/__init__.py     2021-08-25 
16:09:46.000000000 +0200
@@ -33,7 +33,7 @@
 from calibre.customize import InterfaceActionBase
 
 # pulled out from FanFicFareBase for saving in prefs.py
-__version__ = (4, 4, 0)
+__version__ = (4, 5, 0)
 
 ## Apparently the name for this class doesn't matter--it was still
 ## 'demo' for the first few versions.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/calibre-plugin/dialogs.py 
new/FanFicFare-4.5.0/calibre-plugin/dialogs.py
--- old/FanFicFare-4.4.0/calibre-plugin/dialogs.py      2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/calibre-plugin/dialogs.py      2021-08-25 
16:09:46.000000000 +0200
@@ -501,6 +501,7 @@
                 retval['updatemeta']=True
                 retval['collision']=ADDNEW
 
+        
logger.debug("self.extraoptions['anthology_url']:%s"%self.extraoptions.get('anthology_url','NOT
 FOUND'))
         retval.update(self.extraoptions)
         return retval
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/calibre-plugin/fff_plugin.py 
new/FanFicFare-4.5.0/calibre-plugin/fff_plugin.py
--- old/FanFicFare-4.4.0/calibre-plugin/fff_plugin.py   2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/calibre-plugin/fff_plugin.py   2021-08-25 
16:09:46.000000000 +0200
@@ -864,6 +864,7 @@
         Both new individual stories and new anthologies are created here.
         Expected extraoptions entries: anthology_url, add_tag, frompage
         '''
+        
logger.debug("extraoptions['anthology_url']:%s"%extraoptions.get('anthology_url','NOT
 FOUND'))
         self.check_valid_collision(extraoptions)
 
         if not url_list_text:
@@ -955,7 +956,8 @@
         # and anthologies, and for updating existing anthologies.
         # make a copy before adding to avoid changing passed param
         eo = dict(extraoptions)
-        eo.update({'frompage':frompage,
+        eo.update({'anthology_url':mergebook['url'],
+                   'frompage':frompage,
                    'tdir':tdir,
                    'mergebook':mergebook})
         self.add_new_dialog.show_dialog(url_list_text,
@@ -2793,6 +2795,8 @@
         serieslist=[]
         serieslists=[]
 
+        
logger.debug("options['anthology_url']:%s"%options.get('anthology_url','NOT 
FOUND'))
+
         # copy list top level
         for b in book_list:
             if b['series']:
@@ -2900,7 +2904,7 @@
         else:
             book['comments'] += '\n'.join( [ mkbooktitle(x) for x in book_list 
] )
         book['comments'] += '</div>'
-        logger.debug(book['comments'])
+        # logger.debug(book['comments'])
 
         configuration = get_fff_config(book['url'],options['fileform'])
         if existingbook:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/calibre-plugin/plugin-defaults.ini 
new/FanFicFare-4.5.0/calibre-plugin/plugin-defaults.ini
--- old/FanFicFare-4.4.0/calibre-plugin/plugin-defaults.ini     2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/calibre-plugin/plugin-defaults.ini     2021-08-25 
16:09:46.000000000 +0200
@@ -892,6 +892,11 @@
 ## treat both threadmarks *and* first post links as chapter links.
 #always_include_first_post_chapters:false
 
+## When reveal_invisible_text is set true, adapter will search for
+## <span style="color:transparent"> tags and remove the style
+## attribute.
+#reveal_invisible_text:false
+
 [base_xenforoforum:epub]
 
 ## See remove_spoilers above for more about 'spoilers'.  This example
@@ -2047,20 +2052,6 @@
 #username:YourName
 #password:yourpassword
 
-[harrypotterfanfiction.com]
-use_basic_cache:true
-slow_down_sleep_time:1
-extra_valid_entries:reviews,era
-
-## Site dedicated to these categories/characters/ships
-extracategories:Harry Potter
-
-## dateUpdated/datePublished don't usually have time, but they do on this site.
-## http://docs.python.org/library/datetime.html#strftime-strptime-behavior
-## Note that ini format requires % to be escaped as %%.
-dateUpdated_format:%%Y-%%m-%%d %%H:%%M:%%S
-datePublished_format:%%Y-%%m-%%d %%H:%%M:%%S
-
 [hlfiction.net]
 ## Site dedicated to these categories/characters/ships
 extracategories:Highlander
@@ -2146,6 +2137,9 @@
 ## Add the chapter description at the start of each chapter.
 description_in_chapter: false
 
+## Clear FanFiction from defaults, site is original fiction.
+extratags:Erotica
+
 [lumos.sycophanthex.com]
 ## Some sites do not require a login, but do require the user to
 ## confirm they are adult for adult content.  In commandline version,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/calibre-plugin/plugin-example.ini 
new/FanFicFare-4.5.0/calibre-plugin/plugin-example.ini
--- old/FanFicFare-4.4.0/calibre-plugin/plugin-example.ini      2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/calibre-plugin/plugin-example.ini      2021-08-25 
16:09:46.000000000 +0200
@@ -95,9 +95,6 @@
 [www.fictionalley.org]
 #is_adult:true
 
-[www.harrypotterfanfiction.com]
-#is_adult:true
-
 [www.fimfiction.net]
 #is_adult:true
 #fail_on_password: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/calibre-plugin/translations/ca.po 
new/FanFicFare-4.5.0/calibre-plugin/translations/ca.po
--- old/FanFicFare-4.4.0/calibre-plugin/translations/ca.po      2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/calibre-plugin/translations/ca.po      2021-08-25 
16:09:46.000000000 +0200
@@ -2,7 +2,7 @@
 # Copyright (C) YEAR ORGANIZATION
 # 
 # Translators:
-# Adolfo Jayme Barrientos, 2014
+# Adolfo Jayme-Barrientos, 2014
 # Joan Montan??, 2014
 # Queralt Iglesias <queralt.i...@gmail.com>, 2016
 # Robert Antoni Buj i Gelonch <r...@fedoraproject.org>, 2016-2017
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/calibre-plugin/translations/de.po 
new/FanFicFare-4.5.0/calibre-plugin/translations/de.po
--- old/FanFicFare-4.4.0/calibre-plugin/translations/de.po      2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/calibre-plugin/translations/de.po      2021-08-25 
16:09:46.000000000 +0200
@@ -6,6 +6,7 @@
 # ILB, 2014-2017,2020-2021
 # Johannes Sch??pp <m...@jschpp.de>, 2020
 # jumo, 2016
+# Martin Ponweiser <m.ponwei...@gmail.com>, 2021
 # Patrick Wacker <crayzy...@gmail.com>, 2019
 # Sebastian Keller <hagg...@gmx.de>, 2015
 # Simon Sch??tte, 2014-2016
@@ -16,8 +17,8 @@
 msgstr ""
 "Project-Id-Version: calibre-plugins\n"
 "POT-Creation-Date: 2021-02-12 13:32-0600\n"
-"PO-Revision-Date: 2021-02-12 22:21+0000\n"
-"Last-Translator: Transifex Bot <>\n"
+"PO-Revision-Date: 2021-07-28 17:26+0000\n"
+"Last-Translator: Martin Ponweiser <m.ponwei...@gmail.com>\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"
@@ -2388,7 +2389,7 @@
 
 #: jobs.py:110
 msgid "%(count)d of %(total)d stories finished downloading"
-msgstr "%(count)dvon %(total)dStories haben den Download fertig"
+msgstr "%(count)d von %(total)d Stories fertig heruntergeladen"
 
 #: jobs.py:145
 msgid "Download Results:"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/calibre-plugin/translations/es.po 
new/FanFicFare-4.5.0/calibre-plugin/translations/es.po
--- old/FanFicFare-4.4.0/calibre-plugin/translations/es.po      2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/calibre-plugin/translations/es.po      2021-08-25 
16:09:46.000000000 +0200
@@ -2,7 +2,7 @@
 # Copyright (C) YEAR ORGANIZATION
 # 
 # Translators:
-# Adolfo Jayme Barrientos, 2014
+# Adolfo Jayme-Barrientos, 2014
 # Albert, 2016
 # Dar??o Here????, 2015-2016,2018
 # Dar??o Here????, 2018
@@ -10,7 +10,7 @@
 # Jellby <jel...@yahoo.com>, 2014-2021
 # Antonio Mireles <anto...@mirelesindependent.com>, 2016
 # Juan Jaramillo <juanda...@protonmail.ch>, 2016
-# JimmXinu <retiefj...@gmail.com>, 2015
+# JimmXinu, 2015
 msgid ""
 msgstr ""
 "Project-Id-Version: calibre-plugins\n"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/calibre-plugin/translations/nb.po 
new/FanFicFare-4.5.0/calibre-plugin/translations/nb.po
--- old/FanFicFare-4.4.0/calibre-plugin/translations/nb.po      2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/calibre-plugin/translations/nb.po      2021-08-25 
16:09:46.000000000 +0200
@@ -5,7 +5,7 @@
 # Andreas Dreyer Hysing, 2016
 # John Henningsen <henningsen.tekn...@gmail.com>, 2016
 # Kurt-H??kon Eilertsen <k...@kheds.com>, 2014
-# JimmXinu <retiefj...@gmail.com>, 2017
+# JimmXinu, 2017
 msgid ""
 msgstr ""
 "Project-Id-Version: calibre-plugins\n"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/calibre-plugin/translations/nl.po 
new/FanFicFare-4.5.0/calibre-plugin/translations/nl.po
--- old/FanFicFare-4.4.0/calibre-plugin/translations/nl.po      2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/calibre-plugin/translations/nl.po      2021-08-25 
16:09:46.000000000 +0200
@@ -3,12 +3,17 @@
 # 
 # Translators:
 # Alex, 2016
+# Alex, 2016
 # erkfuizfeuadjfjzefzfuzeff gbhygsregfges 
<erkfuizfeuadjfjzefzfuz...@gmail.com>, 2017
 # Gideon van Melle <translati...@gvmelle.com>, 2020
 # Herman L.M. van der Vaart <vaartt...@gmail.com>, 2018
 # Herman L.M. van der Vaart <vaartt...@gmail.com>, 2018
+# JimmXinu, 2021
+# JimmXinu, 2021
 # Mario Moens <marimo.i...@gmail.com>, 2017
 # M. de Boer <de.boer.me...@gmail.com>, 2018-2020
+# Meteor0id, 2019
+# Nathan Follens, 2015-2016
 # Nathan Follens, 2015
 # Nathan Follens, 2016
 # Meteor0id, 2019
@@ -19,8 +24,8 @@
 msgstr ""
 "Project-Id-Version: calibre-plugins\n"
 "POT-Creation-Date: 2021-02-12 13:32-0600\n"
-"PO-Revision-Date: 2021-02-12 22:21+0000\n"
-"Last-Translator: Transifex Bot <>\n"
+"PO-Revision-Date: 2021-08-24 23:17+0000\n"
+"Last-Translator: JimmXinu\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"
@@ -49,11 +54,11 @@
 
 #: common_utils.py:483
 msgid "Prefs Viewer dialog"
-msgstr "voorkeuren dialoogvenster"
+msgstr "Voorkeuren dialoogvenster"
 
 #: common_utils.py:484
 msgid "Preferences for: "
-msgstr "Voorkeuren voor:"
+msgstr "Voorkeuren voor: "
 
 #: common_utils.py:516
 msgid "Clear"
@@ -240,7 +245,7 @@
 
 #: config.py:528
 msgid "Keep Existing Tags when Updating Metadata?"
-msgstr "Bestaande Tags behouden wanneer Metagegevens wordt ge??pdatet? "
+msgstr "Bestaande Tags behouden bij Updaten Metagegevens?"
 
 #: config.py:529
 msgid ""
@@ -305,33 +310,33 @@
 "Mark added/updated books when finished.  Use with option below.\n"
 "You can also manually search for 'marked:fff_success'.\n"
 "'marked:fff_failed' and 'marked:fff_chapter_error' are also available, or 
search 'marked:fff' for all."
-msgstr ""
+msgstr "Markeer toegevoegde/ge??date boeken indien klaar. Gebruik met optie 
onder.\nU kan ook manueel zoeken naar 
'marked:fff_success'.\n'marked:fff_failed' en 'marked:fff_chapter_error' zijn 
ook beschikbaar, of zoek 'marked:fff' voor alles."
 
 #: config.py:571
 msgid "Success"
-msgstr ""
+msgstr "Gelukt"
 
 #: config.py:572
 msgid "Mark successfully downloaded or updated books."
-msgstr ""
+msgstr "Markeer succesvol gedownloade of ge??pdate boeken."
 
 #: config.py:577
 msgid "Failed"
-msgstr ""
+msgstr "Mislukt"
 
 #: config.py:578
 msgid "Mark failed downloaded or updated books."
-msgstr ""
+msgstr "Markeer mislukte gedownloade of ge??pdate boeken."
 
 #: config.py:583
 msgid "Chapter Error"
-msgstr ""
+msgstr "Hoofdstuk Fout"
 
 #: config.py:584
 msgid ""
 "Mark downloaded or updated books with chapter errors (only when "
 "<i>continue_on_chapter_error:true</i>)."
-msgstr ""
+msgstr "Markeer gedownloade of ge??pdate boeken met hoofdstukfouten (enkel als 
<i>continue_on_chapter_error:true<i>)."
 
 #: config.py:596
 msgid "Show Marked books when finished?"
@@ -342,7 +347,7 @@
 "Show Marked added/updated books only when finished.\n"
 "You can also manually search for 'marked:fff_success'.\n"
 "'marked:fff_failed' and 'marked:fff_chapter_error' are also available, or 
search 'marked:fff' for all."
-msgstr ""
+msgstr "Toon Gemarkeerde toegevoegde/ge??date boeken alleen indien klaar.\nU 
kan ook manueel zoeken naar 'marked:fff_success'.\n'marked:fff_failed' en 
'marked:fff_chapter_error' zijn ook beschikbaar, of zoek 'marked:fff' voor 
alles."
 
 #: config.py:601
 msgid "Smarten Punctuation (EPUB only)"
@@ -374,7 +379,7 @@
 "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 " Automatisch aanroepen van calibre Convert voor 
nieuwe/update-boeken.\nConverteert naar het huidige uitvoerformaat zoals 
gekozen in Calibre's\nVoorkeuren-> Gedragsinstellingen."
+msgstr "Automatisch aanroepen van calibre Convert voor 
nieuwe/update-boeken.\nConverteert naar het huidige uitvoerformaat zoals 
gekozen in calibre's\nVoorkeuren-> Gedragsinstellingen."
 
 #: config.py:629
 msgid "GUI Options"
@@ -641,7 +646,7 @@
 
 #: config.py:959
 msgid "\"Send to Device\" Reading Lists"
-msgstr "Leeslijst(en) van \"Verzenden naar apparaat\"."
+msgstr "\"Verzenden naar apparaat\" Leeslijsten "
 
 #: config.py:960 config.py:963 config.py:977 config.py:980
 msgid ""
@@ -811,7 +816,7 @@
 msgid ""
 "Will overwrite word count from FanFicFare metadata if set to update the same"
 " custom column."
-msgstr "Overschrijft het aantal woorden uit FanFicFare metagegevens als deze 
is ingesteld om dezelfde aangepaste kolom bij te werken"
+msgstr "Overschrijft aantal woorden uit FanFicFare metadata als ingesteld om 
dezelfde aangepaste kolom bij te werken."
 
 #: config.py:1242
 msgid ""
@@ -1188,7 +1193,7 @@
 
 #: config.py:1616
 msgid "Include Books' Comments in Anthology Comments?"
-msgstr "Gebruik de commentaren van de Anthologie? "
+msgstr "Gebruik de commentaren van de Anthologie?"
 
 #: config.py:1617
 msgid ""
@@ -1296,7 +1301,7 @@
 
 #: config.py:1710
 msgid "Download from Email Immediately"
-msgstr "Onmiddellijk downloaden van e-mail."
+msgstr "Onmiddellijk downloaden van e-mail"
 
 #: config.py:1711
 msgid ""
@@ -1337,7 +1342,7 @@
 msgid ""
 "These comments about the series will be included in the Comments of the new "
 "book."
-msgstr ""
+msgstr "Deze commentaren over de series worden toegevoegd in de Commentaren 
van het nieuwe boek."
 
 #: dialogs.py:256 dialogs.py:842
 msgid "Show Download Options"
@@ -1374,11 +1379,11 @@
 
 #: dialogs.py:387
 msgid "(%s URLs found)"
-msgstr ""
+msgstr "(%s URLs gevonden)"
 
 #: dialogs.py:388
 msgid "Story URLs for anthology, one per line:"
-msgstr "Verhaal URLs for anthologie, ????n per lijn"
+msgstr "Verhaal URLs for anthologie, ????n per lijn:"
 
 #: dialogs.py:389
 msgid ""
@@ -1398,7 +1403,7 @@
 
 #: dialogs.py:414
 msgid "Story URLs, one per line:"
-msgstr "Verhaal URLs, ????n per lijn"
+msgstr "Verhaal URLs, ????n per lijn:"
 
 #: dialogs.py:415
 msgid ""
@@ -1423,7 +1428,7 @@
 
 #: dialogs.py:549
 msgid "Get URLs and go to dialog for individual story downloads."
-msgstr "Haal de URLs op en ga naar het download dialoogvenster van individuele 
verhalen"
+msgstr "Haal URLs op en ga naar dialoog van individuele verhalendownloads."
 
 #: dialogs.py:554
 msgid "For Anthology Epub"
@@ -1555,7 +1560,7 @@
 "control to you quicker while updating, but you won't be asked for "
 "username/passwords or if you are an adult--stories that need those will just"
 " fail."
-msgstr "Verzamel metagegevens van sites 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"
+msgstr "Verzamel metagegevens van sites 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."
 
 #: dialogs.py:973 fff_plugin.py:1687 fff_plugin.py:1923 fff_plugin.py:1941
 msgid "Comment"
@@ -1613,7 +1618,7 @@
 
 #: dialogs.py:1353
 msgid "Search for string in edit box."
-msgstr "Zoek naar text in het zoekvenster"
+msgstr "Zoek naar text in het zoekvenster."
 
 #: dialogs.py:1356
 msgid "Find:"
@@ -1659,7 +1664,7 @@
 
 #: dialogs.py:1629
 msgid "Show this confirmation again"
-msgstr ""
+msgstr "Deze bevestiging terug tonen"
 
 #: fff_plugin.py:152 fff_plugin.py:183
 msgid "FanFicFare"
@@ -1695,7 +1700,7 @@
 
 #: fff_plugin.py:316
 msgid "Anthology Options"
-msgstr ""
+msgstr " Anthologie Opties"
 
 #: fff_plugin.py:317
 msgid "Make Anthology Epub from Web Page"
@@ -1723,7 +1728,7 @@
 
 #: fff_plugin.py:346
 msgid "Reading List Options"
-msgstr ""
+msgstr "Leeslijst Opties"
 
 #: fff_plugin.py:349
 msgid "Mark Unread: Add to \"To Read\" and \"Send to Device\" Lists"
@@ -1747,27 +1752,27 @@
 
 #: fff_plugin.py:362
 msgid "Add to Lists Not Configured"
-msgstr ""
+msgstr "Toevoegen aan Lijst Niet-geconfigureerd"
 
 #: fff_plugin.py:372
 msgid "Remove from Lists Not Configured"
-msgstr ""
+msgstr "Verwijderen van Lijst Niet-geconfigureerd"
 
 #: fff_plugin.py:381
 msgid "Actions by Update Modes"
-msgstr ""
+msgstr "Acties volgens Update Modi"
 
 #: fff_plugin.py:414
 msgid "Update Existing FanFiction Books"
-msgstr ""
+msgstr "Update Bestaande FanFictie Boeken"
 
 #: fff_plugin.py:422
 msgid "Get FanFiction Story URLs from Email"
-msgstr ""
+msgstr "Haal de FanFictie Verhalen URL's op van E-mail"
 
 #: fff_plugin.py:430
 msgid "Get FanFiction Story URLs from Web Page"
-msgstr ""
+msgstr "Haal de FanFictie Verhalen URL's op van Wagpagina"
 
 #: fff_plugin.py:443
 msgid "Remove \"New\" Chapter Marks from Selected books"
@@ -1795,11 +1800,11 @@
 
 #: fff_plugin.py:538
 msgid "FanFicFare Saved Metadata Column not configured."
-msgstr ""
+msgstr "FanFicFare Opgeslagen Metadata Kolom niet geconfigureerd."
 
 #: fff_plugin.py:544 fff_plugin.py:1254
 msgid "Cannot update non-epub format."
-msgstr "Kan "
+msgstr "Kan non-epub formaat niet updaten."
 
 #: fff_plugin.py:551
 msgid "FanFicFare Email Settings are not configured."
@@ -1826,7 +1831,7 @@
 #: fff_plugin.py:618 fff_plugin.py:1904 fff_plugin.py:2521 fff_plugin.py:2533
 #: fff_plugin.py:2544 fff_plugin.py:2550 fff_plugin.py:2563
 msgid "Warning"
-msgstr ""
+msgstr "Waarschuwing"
 
 #: fff_plugin.py:626
 msgid "(%d Story URLs Skipped, on Rejected URL List)"
@@ -1838,7 +1843,7 @@
 
 #: fff_plugin.py:629
 msgid "Get Story URLs from Email"
-msgstr "Haal de verhaal URL's op van e-mail."
+msgstr "Haal de verhaal URL's op van e-mail"
 
 #: fff_plugin.py:653
 msgid "Fetching Story URLs from Page..."
@@ -2027,7 +2032,7 @@
 
 #: fff_plugin.py:1162
 msgid "Click '<b>Yes</b>' to Reject."
-msgstr "klik '<b>Ja</b>' om te verwerpen"
+msgstr "Klik '<b>Ja</b>' om te Verwerpen."
 
 #: fff_plugin.py:1163 fff_plugin.py:1367
 msgid "Click '<b>No</b>' to download anyway."
@@ -2131,11 +2136,11 @@
 msgid ""
 "<b>%(title)s</b> by <b>%(author)s</b> is already in your library with a "
 "different source URL:"
-msgstr ""
+msgstr "<b>%(title)s</b> door <b>%(author)s</b> bestaat al in uw bibliotheek 
met een ander bron URL:"
 
 #: fff_plugin.py:1488
 msgid "In library: <a href=\"%(liburl)s\">%(liburl)s</a>"
-msgstr "in bibliotheek: <a href=\"%(liburl)s\">%(liburl)s</a>"
+msgstr "In bibliotheek: <a href=\"%(liburl)s\">%(liburl)s</a>"
 
 #: fff_plugin.py:1489 fff_plugin.py:1505
 msgid "New URL: <a href=\"%(newurl)s\">%(newurl)s</a>"
@@ -2157,7 +2162,7 @@
 msgid ""
 "<b>%(title)s</b> by <b>%(author)s</b> is already in your library with a "
 "different source URL."
-msgstr ""
+msgstr "<b>%(title)s</b> door <b>%(author)s</b> bestaat al in uw bibliotheek 
met een ander bron URL:"
 
 #: fff_plugin.py:1504
 msgid ""
@@ -2231,7 +2236,7 @@
 
 #: fff_plugin.py:1782
 msgid "The ebook has been updated, but the metadata has not."
-msgstr " Het e-boek is bijgewerkt, maar de metagegevens niet."
+msgstr "Het e-boek is bijgewerkt, maar de metagegevens niet."
 
 #: fff_plugin.py:1845 fff_plugin.py:1846
 msgid "Finished Adding/Updating %d books."
@@ -2245,15 +2250,15 @@
 msgid ""
 "Some of the stories downloaded have chapters errors.  Click View Log in the "
 "next dialog to see which."
-msgstr ""
+msgstr "Sommige gedownloade verhalen hebben hoofdstukfouten.  Klik Log 
Bekijken in de volgende dialoog om te zien welke."
 
 #: fff_plugin.py:1905
 msgid "<b>%s</b> good stories contain chapter errors."
-msgstr ""
+msgstr "<b>%s</b> goede verhalen bevatten hoofdstukfouten."
 
 #: fff_plugin.py:1908
 msgid "FanFicFare: "
-msgstr ""
+msgstr "FanFicFare: "
 
 #: fff_plugin.py:1908
 msgid "No Good Stories for Anthology"
@@ -2319,11 +2324,11 @@
 
 #: fff_plugin.py:2101
 msgid "Update calibre for BAD FanFiction stories"
-msgstr "Caliber updaten voor BAD FanFiction-verhalen ..."
+msgstr "caliber updaten voor BAD FanFiction-verhalen"
 
 #: fff_plugin.py:2146
 msgid "Adding format to book failed for some reason..."
-msgstr "Het toevoegen "
+msgstr "Toevoegen formaat aan boek mislukt wegens..."
 
 #: fff_plugin.py:2520
 msgid ""
@@ -2371,11 +2376,11 @@
 
 #: fff_plugin.py:2870
 msgid "%(title)s by %(author)s"
-msgstr ""
+msgstr "%(title)s door %(author)s"
 
 #: fff_plugin.py:2934
 msgid " Anthology"
-msgstr "Antologie"
+msgstr " Antologie"
 
 #: fff_plugin.py:2982
 msgid "(was set, removed for security)"
@@ -2383,7 +2388,7 @@
 
 #: jobs.py:73
 msgid "Launch background process for site %s:"
-msgstr ""
+msgstr "Start achtergrondproces voor site %s:"
 
 #: jobs.py:90
 msgid "Downloading FanFiction Stories"
@@ -2391,7 +2396,7 @@
 
 #: jobs.py:110
 msgid "%(count)d of %(total)d stories finished downloading"
-msgstr ""
+msgstr "%(count)d van %(total)d verhalen klaar met downloaden"
 
 #: jobs.py:145
 msgid "Download Results:"
@@ -2405,11 +2410,11 @@
 msgid ""
 "Download %(fileform)s completed, %(failed)s failed chapters, %(total)s total"
 " chapters."
-msgstr ""
+msgstr "Download %(fileform)s voltooid, %(failed)s mislukte hoofdstukken, 
%(total)s totaal hoofdstukken."
 
 #: jobs.py:323
 msgid "Download %(fileform)s completed, %(total)s chapters."
-msgstr ""
+msgstr "Download %(fileform)s compleet, %(total)s hoofdstukken."
 
 #: jobs.py:352
 msgid "Already contains %d chapters.  Reuse as is."
@@ -2419,12 +2424,12 @@
 msgid ""
 "Update %(fileform)s completed, added %(added)s chapters, %(failed)s failed "
 "chapters, for %(total)s total."
-msgstr ""
+msgstr "Update %(fileform)s compleet, toegevoegd %(added)s hoofdstukken, 
%(failed)s mislukte hoofdstukken, voor %(total)s totaal."
 
 #: jobs.py:385
 msgid ""
 "Update %(fileform)s completed, added %(added)s chapters for %(total)s total."
-msgstr ""
+msgstr "Update %(fileform)s compleet, toegevoegd %(added)s hoofdstukken voor 
%(total)s totaal."
 
 #: prefs.py:26
 msgid "Skip"
@@ -2456,24 +2461,24 @@
 
 #: prefs.py:33
 msgid "Update Calibre Metadata from Saved Metadata Column"
-msgstr ""
+msgstr "Update calibre Metadata van Opgeslagen Metadata Kolom"
 
 #: prefs.py:79
 msgid "Yes, Always"
-msgstr ""
+msgstr "Ja, Altijd"
 
 #: prefs.py:81
 msgid "Yes, if EPUB has a cover image"
-msgstr ""
+msgstr "Ja, als EPUB een omslagafbeelding heeft"
 
 #: prefs.py:83
 msgid "Yes, unless FanFicFare found a cover image"
-msgstr ""
+msgstr "Ja, tenzij FanFicFare een omslagafbeelding vond"
 
 #: prefs.py:85
 msgid "Yes, unless found on site"
-msgstr ""
+msgstr "Ja, tenzij op de site gevonden"
 
 #: prefs.py:87
 msgid "No"
-msgstr ""
+msgstr "Nee"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/fanficfare/adapters/__init__.py 
new/FanFicFare-4.5.0/fanficfare/adapters/__init__.py
--- old/FanFicFare-4.4.0/fanficfare/adapters/__init__.py        2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/fanficfare/adapters/__init__.py        2021-08-25 
16:09:46.000000000 +0200
@@ -153,7 +153,6 @@
 from . import adapter_wwwnovelallcom
 from . import adapter_wuxiaworldco
 from . import adapter_novelupdatescc
-from . import adapter_harrypotterfanfictioncom
 from . import adapter_hentaifoundrycom
 from . import adapter_mugglenetfanfictioncom
 from . import adapter_swiorgru
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-4.4.0/fanficfare/adapters/adapter_fictionmaniatv.py 
new/FanFicFare-4.5.0/fanficfare/adapters/adapter_fictionmaniatv.py
--- old/FanFicFare-4.4.0/fanficfare/adapters/adapter_fictionmaniatv.py  
2021-07-13 18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/fanficfare/adapters/adapter_fictionmaniatv.py  
2021-08-25 16:09:46.000000000 +0200
@@ -23,7 +23,7 @@
     SITE_ABBREVIATION = 'fmt'
     SITE_DOMAIN = 'fictionmania.tv'
 
-    BASE_URL = 'https://' + SITE_DOMAIN + '/stories/'
+    BASE_URL = 'http://' + SITE_DOMAIN + '/stories/'
     READ_TEXT_STORY_URL_TEMPLATE = BASE_URL + 'readtextstory.html?storyID=%s'
     DETAILS_URL_TEMPLATE = BASE_URL + 'details.html?storyID=%s'
 
@@ -53,7 +53,7 @@
         return cls.READ_TEXT_STORY_URL_TEMPLATE % 1234
 
     def getSiteURLPattern(self):
-        return r'https?' + re.escape(self.BASE_URL[len('https'):]) + 
r'(readtextstory|readhtmlstory|readxstory|details)\.html\?storyID=\d+$'
+        return r'https?' + re.escape(self.BASE_URL[len('http'):]) + 
r'(readtextstory|readhtmlstory|readxstory|details)\.html\?storyID=\d+$'
 
     def extractChapterUrlsAndMetadata(self):
         url = self.DETAILS_URL_TEMPLATE % self.story.getMetadata('storyId')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-4.4.0/fanficfare/adapters/adapter_harrypotterfanfictioncom.py 
new/FanFicFare-4.5.0/fanficfare/adapters/adapter_harrypotterfanfictioncom.py
--- 
old/FanFicFare-4.4.0/fanficfare/adapters/adapter_harrypotterfanfictioncom.py    
    2021-07-13 18:18:19.000000000 +0200
+++ 
new/FanFicFare-4.5.0/fanficfare/adapters/adapter_harrypotterfanfictioncom.py    
    1970-01-01 01:00:00.000000000 +0100
@@ -1,169 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2011 Fanficdownloader team, 2018 FanFicFare team
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-from __future__ import absolute_import
-import logging
-logger = logging.getLogger(__name__)
-import re
-from ..htmlcleanup import stripHTML
-from .. import exceptions as exceptions
-
-# py2 vs py3 transition
-
-from .base_adapter import BaseSiteAdapter,  makeDate
-
-class HarryPotterFanFictionComSiteAdapter(BaseSiteAdapter):
-
-    def __init__(self, config, url):
-        BaseSiteAdapter.__init__(self, config, url)
-        self.story.setMetadata('siteabbrev','hp')
-        self.is_adult=False
-
-        # get storyId from url--url validation guarantees query is only 
psid=1234
-        self.story.setMetadata('storyId',self.parsedUrl.query.split('=',)[1])
-
-        # The date format will vary from site to site.
-        # 
http://docs.python.org/library/datetime.html#strftime-strptime-behavior
-        self.dateformat = "%Y-%m-%d %H:%M%p"
-
-        # normalized story URL.
-        self._setURL('https://' + self.getSiteDomain() + 
'/viewstory.php?psid='+self.story.getMetadata('storyId'))
-
-
-    @staticmethod
-    def getSiteDomain():
-        return 'harrypotterfanfiction.com'
-
-    @classmethod
-    def getSiteExampleURLs(cls):
-        return "https://harrypotterfanfiction.com/viewstory.php?psid=1234";
-
-    def getSiteURLPattern(self):
-        return 
r"https?"+re.escape("://")+r"(www\.)?"+re.escape("harrypotterfanfiction.com/viewstory.php?psid=")+r"\d+$"
-
-    def extractChapterUrlsAndMetadata(self):
-
-        url = self.url
-        if self.is_adult or self.getConfig("is_adult"):
-            url = url+'&showRestricted'
-        logger.debug("URL: "+url)
-
-        data = self.get_request(url)
-
-        if "This story may contain chapters not appropriate for a general 
audience." in data and not (self.is_adult or self.getConfig("is_adult")):
-            raise exceptions.AdultCheckRequired(self.url)
-
-        ## Don't know if these still apply
-        # if "Access denied. This story has not been validated by the 
adminstrators of this site." in data:
-        #     raise exceptions.AccessDenied(self.getSiteDomain() +" says: 
Access denied. This story has not been validated by the adminstrators of this 
site.")
-        # elif "ERROR locating story meta for psid" in data:
-        #     raise exceptions.StoryDoesNotExist(self.url)
-
-        soup = self.make_soup(data)
-
-        ## Title
-        h2 = soup.find('h2')
-        h2.find('i').extract() # remove author
-        self.story.setMetadata('title',stripHTML(h2))
-
-        # 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','https://'+self.host+'/'+a['href'])
-        self.story.setMetadata('author',a.string[3:]) # remove 'by '
-
-        ## hpcom doesn't always give us total words--but it does give
-        ## us words/chapter.  I'd rather add than fetch and parse
-        ## another page.
-        chapter_words=0
-        for tr in 
soup.find('table',{'class':'table-chapters'}).find('tbody').findAll('tr'):
-            tdstr = tr.findAll('td')[2].string
-            chapter = tr.find('a')
-            chpt=re.sub(r'^.*?(\?chapterid=\d+).*?',r'\1',chapter['href'])
-            added = 
self.add_chapter(chapter,'https://'+self.host+'/viewstory.php'+chpt)
-            if added and tdstr and tdstr.isdigit():
-                chapter_words+=int(tdstr)
-                ## used below if total words from site not found
-
-        # fetch author page to get story description.
-        authorsoup = 
self.make_soup(self.get_request(self.story.getMetadata('authorUrl')))
-
-        for story in authorsoup.find_all('article',class_='story-summary'):
-            storya = 
story.find('h3').find('a',href=re.compile(r"^/viewstory.php\?psid="+self.story.getMetadata('storyId')))
-            if storya:
-                storydiv = storya.find_parent('div')
-                break
-
-        desc = storydiv.find('div',class_='story-summary__summary')
-        self.setDescription(url,desc)
-
-        # <div class='entry'>
-        # <div class='entry__key'>Rating</div>
-        # <div class='entry__value'>Mature</div>
-        # </div>
-
-        meta_key_map = {
-            'Rating':'rating',
-            'Words':'numWords',
-            'Characters':'characters',
-            'Primary Relationship':'ships',
-            'Secondary Relationship(s)':'ships',
-            'Genre(s)':'genre',
-            'Era':'era',
-            'Advisory':'warnings',
-            'Story Reviews':'reviews',
-#            'Status':'', # Status is treated special
-            'First Published':'datePublished',
-            'Last Updated':'dateUpdated',
-            }
-        for key in soup.find_all('div',{'class':'entry__key'}):
-            value = stripHTML(key.find_next('div',{'class':'entry__value'}))
-            key = stripHTML(key)
-            meta = meta_key_map.get(key,None)
-            if meta:
-                if meta.startswith('date'):
-                    value = makeDate(value,self.dateformat)
-                if meta in ('characters','genre','ships'):
-                    self.story.extendList(meta,value.split(','))
-                else:
-                    self.story.setMetadata(meta,value)
-            if key == 'Status':
-                if value == 'WIP':
-                    value = 'In-Progress'
-                elif value == 'COMPLETED':
-                    value = 'Completed'
-                # 'Abandoned' and other possible values used as-is
-                self.story.setMetadata('status',value)
-
-        # older stories don't present total words, use sum from chapters.
-        if not self.story.getMetadata('numWords'):
-            self.story.setMetadata('numWords',chapter_words)
-
-    def getChapterText(self, url):
-
-        logger.debug('Getting chapter text from: %s' % url)
-
-        data = self.get_request(url)
-        soup = self.make_soup(data)
-        div = soup.find('div', {'class' : 'storytext-container'})
-        if None == div:
-            raise exceptions.FailedToDownload("Error downloading Chapter: %s!  
Missing required element!" % url)
-
-        return self.utf8FromSoup(url,div)
-
-def getClass():
-    return HarryPotterFanFictionComSiteAdapter
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-4.4.0/fanficfare/adapters/adapter_test1.py 
new/FanFicFare-4.5.0/fanficfare/adapters/adapter_test1.py
--- old/FanFicFare-4.4.0/fanficfare/adapters/adapter_test1.py   2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/fanficfare/adapters/adapter_test1.py   2021-08-25 
16:09:46.000000000 +0200
@@ -403,7 +403,7 @@
 </style>
 <p>chapter URL:'''+url+'''</p>
 <p 
style="color:blue;">Timestamp:'''+datetime.datetime.now().strftime("%Y-%m-%d 
%H:%M:%S")+'''</p>
-<p>Lorem '''+self.crazystring+u''' <i>italics</i>, <b>bold</b>, 
<u>underline</u> consectetur adipisicing elit, sed do eiusmod tempor incididunt 
ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud 
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute 
irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat 
nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa 
qui officia deserunt mollit anim id est laborum.</p>
+<p>Lorem '''+self.crazystring+u''' <i>italics</i>, <b>bold</b>, 
<u>underline</u>, <s>Strike through</s> consectetur adipisicing elit, sed do 
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim 
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
 br breaks<br><br>
 Puella Magi Madoka Magica/?????????????????????????????????
 <!-- a 
href="http://code.google.com/p/fanficdownloader/wiki/FanFictionDownLoaderPluginWithReadingList";
 title="Tilt-a-Whirl by Jim &amp; Sarah, on Flickr"><img 
src="http://i.imgur.com/bo8eD.png";></a --><br/>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-4.4.0/fanficfare/adapters/adapter_webnovelcom.py 
new/FanFicFare-4.5.0/fanficfare/adapters/adapter_webnovelcom.py
--- old/FanFicFare-4.4.0/fanficfare/adapters/adapter_webnovelcom.py     
2021-07-13 18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/fanficfare/adapters/adapter_webnovelcom.py     
2021-08-25 16:09:46.000000000 +0200
@@ -77,11 +77,12 @@
 
     def getSiteURLPattern(self):
         # 
https://www.webnovel.com/book/game-of-thrones%3A-the-prideful-one._17509790806343405
-        return r'https://' + re.escape(self.getSiteDomain()) + 
r'/book/(?P<title>.*_)?(?P<id>\d+)'
+        return r'https://' + re.escape(self.getSiteDomain()) + 
r'/book/(?P<title>.*?_)?(?P<id>\d+)'
 
     # Getting the chapter list and the meta data, plus 'is adult' checking.
     def doExtractChapterUrlsAndMetadata(self, get_cover=True):
-        url = self.url
+        url = self.story.getMetadata('storyUrl') #self.url
+        logger.debug(url)
 
         data = self.get_request(url)
         # logger.debug("\n"+data)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-4.4.0/fanficfare/adapters/base_xenforoforum_adapter.py 
new/FanFicFare-4.5.0/fanficfare/adapters/base_xenforoforum_adapter.py
--- old/FanFicFare-4.4.0/fanficfare/adapters/base_xenforoforum_adapter.py       
2021-07-13 18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/fanficfare/adapters/base_xenforoforum_adapter.py       
2021-08-25 16:09:46.000000000 +0200
@@ -232,10 +232,11 @@
             # logger.debug("img:%s"%img)
             ## SV at least has started using data-url instead of
             ## data-src, notably for <img> inside <noscript>?
-            if 'data-src' in img:
+            if img.has_attr('data-src'):
                 img['src'] = img['data-src']
-            if 'data-url' in img:
+            if img.has_attr('data-url'):
                 img['src'] = img['data-url']
+            # logger.debug("\n\nimg:%s\n"%img)
 
         ## after lazy load images, there are noscript blocks also
         ## containing <img> tags.  The problem comes in when they hit
@@ -767,6 +768,10 @@
                 div.button.extract()
 
     def 
_do_utf8FromSoup(self,url,soup,fetch=None,allow_replace_br_with_p=True):
+        if self.getConfig('reveal_invisible_text'):
+            ## when set, remove style='color:transparent'.
+            for span in soup.find_all('span',style='color:transparent'):
+                del span['style']
         if self.getConfig('replace_failed_smilies_with_alt_text'):
             for img in 
soup.find_all('img',src=re.compile(r'(^data:image|(failedtoload|clear.png)$)')):
                 # logger.debug("replace_failed_smilies_with_alt_text img: 
%s"%img)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-4.4.0/fanficfare/browsercache/basebrowsercache.py 
new/FanFicFare-4.5.0/fanficfare/browsercache/basebrowsercache.py
--- old/FanFicFare-4.4.0/fanficfare/browsercache/basebrowsercache.py    
2021-07-13 18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/fanficfare/browsercache/basebrowsercache.py    
2021-08-25 16:09:46.000000000 +0200
@@ -146,7 +146,7 @@
         '''
         url=ensure_text(url)
         url = url.split('?')[0]
-        if 'www.fanfiction.net/s/' in url:
+        if 'www.fanfiction.net/s/' in url or 'www.fictionpress.com/s/' in url:
             # remove title too.
             url = '/'.join(url.split('/')[:6])+'/'
         if 'ficbook.net/readfic/' in url:
@@ -160,12 +160,9 @@
         '''
         if self.age_comp_time > cached_time:
             return
-        if 'fanfiction.net/' in cache_url or 'ficbook.net/' in cache_url:
+        if 'fanfiction.net/' in cache_url or 'fictionpress.com/' in cache_url 
or 'ficbook.net/' in cache_url:
             minurl = self.minimal_url(self.cache_key_to_url(cache_url))
-            # if 'ficbook.net/' in cache_url:
-            #     
logger.debug("add:\n%s\n%s\n%s\n%s"%(cache_url,minurl,key,self.make_datetime(cached_time)))
-            # if '13425439/4/' in cache_url:
-            #     
logger.debug("add:\nurl:%s\nminurl:%s\nkey:%s\ncached_time:%s\ndatetime:%s\nnow:%s"%(cache_url,minurl,key,cached_time,self.make_datetime(cached_time),time.gmtime()))
+            # logger.debug("%s -> %s"%(minurl,key))
             (existing_key,existing_time) = 
self.key_mapping.get(minurl,(None,None))
             if( existing_key is None
                 or existing_time is None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-4.4.0/fanficfare/browsercache/blockfilecache.py 
new/FanFicFare-4.5.0/fanficfare/browsercache/blockfilecache.py
--- old/FanFicFare-4.4.0/fanficfare/browsercache/blockfilecache.py      
2021-07-13 18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/fanficfare/browsercache/blockfilecache.py      
2021-08-25 16:09:46.000000000 +0200
@@ -59,7 +59,12 @@
         return True
 
     def map_cache_keys(self):
-        """Scan index file and cache entries to save entries in this cache"""
+        """
+        Scan index file and cache entries to save entries in this cache.
+
+        Saving uint32 address as key--hashing to find key later proved
+        unreliable.
+        """
         with share_open(os.path.join(self.cache_dir, "index"), 'rb') as index:
             # Skipping Header
             index.seek(92*4)
@@ -67,30 +72,43 @@
             for key in range(self.cacheBlock.tableSize):
                 raw = struct.unpack('I', index.read(4))[0]
                 if raw != 0:
-                    entry = CacheEntry(CacheAddress(raw, path=self.cache_dir))
+                    ## 0 == unused hash index slot.  I think.
+                    cacheaddr = CacheAddress(raw, path=self.cache_dir)
+                    # logger.debug("cacheaddr? %s"%cacheaddr)
+                    entry = CacheEntry(cacheaddr)
                     # Checking if there is a next item in the bucket because
                     # such entries are not stored in the Index File so they 
will
                     # be ignored during iterative lookup in the hash table
                     while entry.next != 0:
+                        # logger.debug("spinning on entry linked list?")
                         self.add_key_mapping_entry(entry)
-                        entry = CacheEntry(CacheAddress(entry.next, 
path=self.cache_dir))
+                        cacheaddr = CacheAddress(entry.next, 
path=self.cache_dir)
+                        # logger.debug("cacheaddr? %s"%cacheaddr)
+                        entry = CacheEntry(cacheaddr)
                     self.add_key_mapping_entry(entry)
 
     def add_key_mapping_entry(self,entry):
+        # if '/8096183/69/' in entry.keyToStr():
+        #     logger.debug(entry)
+        #     logger.debug("data length:%s"%len(entry.data))
         self.add_key_mapping(entry.keyToStr(),
-                             entry.keyToStr(),
+                             entry.address.addr,
                              entry.creationTime)
 
-    def get_data_key(self,url):
-        """ Return decoded data for specified key (a URL string) or None """
-        entry = self.get_cache_entry(url)
+    def get_data_key(self,addr):
+        """ Return decoded data for specified key (a binary addr) or None """
+        entry = self.get_cache_entry(addr)
+        # logger.debug("get_data_key(%s)->%s"%(addr,entry))
         if entry:
-            # entry = self.hash_cache[url]
+            # logger.debug("has entry")
             for i in range(len(entry.data)):
+                # logger.debug("data loop i:%s"%i)
+                # logger.debug("entry.data[i].type:%s"%entry.data[i].type)
                 if entry.data[i].type == CacheData.UNKNOWN:
                     # Extracting data into a file
                     data = entry.data[i].data()
-
+                    # logger.debug("type = UNKNOWN, data len:%s"%len(data))
+                    # logger.debug("entry.httpHeader:%s"%entry.httpHeader)
                     if entry.httpHeader != None and \
                        b'content-encoding' in entry.httpHeader.headers:
                         encoding = 
entry.httpHeader.headers.get(b'content-encoding','')
@@ -98,27 +116,9 @@
                     return data
         return None
 
-    def get_cache_entry(self,url):
-        url = ensure_binary(url,'utf8')
-        # Compute the key and seeking to it
-        # print("url:%s"%url)
-        hash = SuperFastHash.superFastHash(url)
-        # print("superFastHash:%s"%hash)
-        key = hash & (self.cacheBlock.tableSize - 1)
-        with share_open(os.path.join(self.cache_dir, "index"), 'rb') as index:
-            index.seek(92*4 + key*4)
-
-            addr = struct.unpack('I', index.read(4))[0]
-            # Checking if the address is initialized (i.e. used)
-            if addr & 0x80000000 == 0:
-                pass
-                # print("%s is not in the cache" % url, file=sys.stderr)
-
-            # Follow the chained list in the bucket
-            else:
-                entry = CacheEntry(CacheAddress(addr, path=self.cache_dir))
-                while entry.hash != hash and entry.next != 0:
-                    entry = CacheEntry(CacheAddress(entry.next, 
path=self.cache_dir))
-                if entry.hash == hash:
-                    return entry
-
+    def get_cache_entry(self,addr):
+        cacheaddr = CacheAddress(addr, path=self.cache_dir)
+        # logger.debug("cacheaddr? %s"%cacheaddr)
+        entry = CacheEntry(cacheaddr)
+        # logger.debug("entry? %s"%entry)
+        return entry
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-4.4.0/fanficfare/browsercache/chromagnon/cacheEntry.py 
new/FanFicFare-4.5.0/fanficfare/browsercache/chromagnon/cacheEntry.py
--- old/FanFicFare-4.4.0/fanficfare/browsercache/chromagnon/cacheEntry.py       
2021-07-13 18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/fanficfare/browsercache/chromagnon/cacheEntry.py       
2021-08-25 16:09:46.000000000 +0200
@@ -44,6 +44,9 @@
 
 from ..share_open import share_open
 
+import logging
+logger = logging.getLogger(__name__)
+
 class CacheEntry():
     """
     See /net/disk_cache/disk_format.h for details.
@@ -57,6 +60,7 @@
         Parse a Chrome Cache Entry at the given address
         """
         self.httpHeader = None
+        self.address = address
         with share_open(os.path.join(address.path,address.fileSelector), 'rb') 
as block:
 
             # Going to the right entry
@@ -89,7 +93,9 @@
                     addr = cacheAddress.CacheAddress(addr, address.path)
                     self.data.append(cacheData.CacheData(addr, dataSize[index],
                                                          True))
-                except cacheAddress.CacheAddressError:
+                except cacheAddress.CacheAddressError as e:
+                    # this happens tons? unused slots probably?
+                    # logger.debug("CacheEntry CacheAddressError:%s 
%s"%(address,e))
                     pass
 
             # Find the HTTP header if there is one
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/fanficfare/cli.py 
new/FanFicFare-4.5.0/fanficfare/cli.py
--- old/FanFicFare-4.4.0/fanficfare/cli.py      2021-07-13 18:18:19.000000000 
+0200
+++ new/FanFicFare-4.5.0/fanficfare/cli.py      2021-08-25 16:09:46.000000000 
+0200
@@ -28,7 +28,7 @@
 import os, sys, platform
 
 
-version="4.4.0"
+version="4.5.0"
 os.environ['CURRENT_VERSION_ID']=version
 
 global_cache = 'global_cache'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/fanficfare/configurable.py 
new/FanFicFare-4.5.0/fanficfare/configurable.py
--- old/FanFicFare-4.4.0/fanficfare/configurable.py     2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/fanficfare/configurable.py     2021-08-25 
16:09:46.000000000 +0200
@@ -201,8 +201,8 @@
                ## currently, browser_cache_path is assumed to be
                ## shared and only ffnet uses it so far
                'browser_cache_path':(['defaults'],None,None),
-               
'use_browser_cache':(['fanfiction.net','ficbook.net'],None,boollist),
-               
'use_browser_cache_only':(['fanfiction.net','ficbook.net'],None,boollist),
+               
'use_browser_cache':(['fanfiction.net','fictionpress.com','ficbook.net'],None,boollist),
+               
'use_browser_cache_only':(['fanfiction.net','fictionpress.com','ficbook.net'],None,boollist),
 
                'continue_on_chapter_error':(None,None,boollist),
                'conditionals_use_lists':(None,None,boollist),
@@ -281,6 +281,7 @@
                'use_threadmark_wordcounts':(base_xenforo_list,None,boollist),
                
'always_include_first_post_chapters':(base_xenforo_list,None,boollist),
                'order_threadmarks_by_date':(base_xenforo_list,None,boollist),
+               'reveal_invisible_text':(base_xenforo_list,None,boollist),
                
'use_threadmarks_description':(base_xenforo2_list,None,boollist),
                'use_threadmarks_status':(base_xenforo2_list,None,boollist),
                'use_threadmarks_cover':(base_xenforo2_list,None,boollist),
@@ -520,6 +521,7 @@
                  'use_threadmark_wordcounts',
                  'always_include_first_post_chapters',
                  'order_threadmarks_by_date',
+                 'reveal_invisible_text',
                  'use_threadmarks_description',
                  'use_threadmarks_status',
                  'use_threadmarks_cover',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/fanficfare/defaults.ini 
new/FanFicFare-4.5.0/fanficfare/defaults.ini
--- old/FanFicFare-4.4.0/fanficfare/defaults.ini        2021-07-13 
18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/fanficfare/defaults.ini        2021-08-25 
16:09:46.000000000 +0200
@@ -910,6 +910,11 @@
 ## treat both threadmarks *and* first post links as chapter links.
 #always_include_first_post_chapters:false
 
+## When reveal_invisible_text is set true, adapter will search for
+## <span style="color:transparent"> tags and remove the style
+## attribute.
+#reveal_invisible_text:false
+
 [base_xenforoforum:epub]
 
 ## See remove_spoilers above for more about 'spoilers'.  This example
@@ -2069,20 +2074,6 @@
 #username:YourName
 #password:yourpassword
 
-[harrypotterfanfiction.com]
-use_basic_cache:true
-slow_down_sleep_time:1
-extra_valid_entries:reviews,era
-
-## Site dedicated to these categories/characters/ships
-extracategories:Harry Potter
-
-## dateUpdated/datePublished don't usually have time, but they do on this site.
-## http://docs.python.org/library/datetime.html#strftime-strptime-behavior
-## Note that ini format requires % to be escaped as %%.
-dateUpdated_format:%%Y-%%m-%%d %%H:%%M:%%S
-datePublished_format:%%Y-%%m-%%d %%H:%%M:%%S
-
 [hlfiction.net]
 ## Site dedicated to these categories/characters/ships
 extracategories:Highlander
@@ -2168,6 +2159,9 @@
 ## Add the chapter description at the start of each chapter.
 description_in_chapter: false
 
+## Clear FanFiction from defaults, site is original fiction.
+extratags:Erotica
+
 [lumos.sycophanthex.com]
 ## Some sites do not require a login, but do require the user to
 ## confirm they are adult for adult content.  In commandline version,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-4.4.0/setup.py 
new/FanFicFare-4.5.0/setup.py
--- old/FanFicFare-4.4.0/setup.py       2021-07-13 18:18:19.000000000 +0200
+++ new/FanFicFare-4.5.0/setup.py       2021-08-25 16:09:46.000000000 +0200
@@ -26,7 +26,7 @@
     name=package_name,
 
     # Versions should comply with PEP440.
-    version="4.4.0",
+    version="4.5.0",
 
     description='A tool for downloading fanfiction to eBook formats',
     long_description=long_description,

Reply via email to