Hello community,

here is the log from the commit of package python-fanficfare for 
openSUSE:Factory checked in at 2019-04-28 20:15:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-fanficfare (Old)
 and      /work/SRC/openSUSE:Factory/.python-fanficfare.new.5536 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-fanficfare"

Sun Apr 28 20:15:27 2019 rev:7 rq:698710 version:3.7.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-fanficfare/python-fanficfare.changes      
2019-03-26 22:31:45.241715462 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-fanficfare.new.5536/python-fanficfare.changes
    2019-04-28 20:15:41.750334864 +0200
@@ -1,0 +2,27 @@
+Sun Apr 28 07:26:14 CEST 2019 - Matej Cepl <[email protected]>
+
+- Update to 3.7.0:
+  - Update translations
+  - Revert "Remove defunct site www.destinysgateway.com"
+  - Recognize destinysgateway.com and www.destinysgateway.com
+  - Remove ncisfic.com -- moved to AO3.
+  - Fix date format for adapter_gluttonyfictioncom
+  - Comment out some old debugs.
+  - Add debug output for encoding used.
+  - Fix some comments.
+  - Add another StoryDoesNotExist string for
+    adapter_fanfictionnet
+  - Closes #390 - RoyalRoad click link in emails.
+  - Update a comment link in setup.py.
+  - Include status 'Hiatus' for adapter_royalroadcom.
+  - Correct a comment in defaults.ini.
+  - Fix for saved custom column metadata and boolean values.
+  - Add bookmarked site specific metadata for
+    adapter_archiveofourownorg.
+  - Fix for PI saved metadata not reading False & empty strings.
+  - More fixing for bool metadata values--convert to string when
+    set.
+  - Add remove_authorfootnotes_on_update feature for AO3.
+  - Update Translations.
+
+-------------------------------------------------------------------

Old:
----
  FanFicFare-3.6.0.tar.gz

New:
----
  FanFicFare-3.7.0.tar.gz

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

Other differences:
------------------
++++++ python-fanficfare.spec ++++++
--- /var/tmp/diff_new_pack.qF54RS/_old  2019-04-28 20:15:42.186334593 +0200
+++ /var/tmp/diff_new_pack.qF54RS/_new  2019-04-28 20:15:42.186334593 +0200
@@ -20,7 +20,7 @@
 %define modnamedown fanficfare
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-fanficfare
-Version:        3.6.0
+Version:        3.7.0
 Release:        0
 Summary:        Tool for making eBooks from stories on fanfiction and other 
web sites
 License:        GPL-3.0-only

++++++ FanFicFare-3.6.0.tar.gz -> FanFicFare-3.7.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/calibre-plugin/__init__.py 
new/FanFicFare-3.7.0/calibre-plugin/__init__.py
--- old/FanFicFare-3.6.0/calibre-plugin/__init__.py     2019-03-12 
16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/calibre-plugin/__init__.py     2019-04-19 
21:08:56.000000000 +0200
@@ -33,7 +33,7 @@
 from calibre.customize import InterfaceActionBase
 
 # pulled out from FanFicFareBase for saving in prefs.py
-__version__ = (3, 6, 0)
+__version__ = (3, 7, 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-3.6.0/calibre-plugin/fff_plugin.py 
new/FanFicFare-3.7.0/calibre-plugin/fff_plugin.py
--- old/FanFicFare-3.6.0/calibre-plugin/fff_plugin.py   2019-03-12 
16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/calibre-plugin/fff_plugin.py   2019-04-19 
21:08:56.000000000 +0200
@@ -2139,15 +2139,15 @@
                                 val = unicode(val).replace(",","")
                         else:
                             val = val
+                        if coldef['datatype'] == 'bool':
+                            if val.lower() in ('t','true','1','yes','y'):
+                                val = True
+                            elif val.lower() in ('f','false','0','no','n'):
+                                val = False
+                            else:
+                                val = None # for tri-state 'booleans'. 
Yes/No/Null
+                        # logger.debug("setting 'r' or 'added':meta:%s 
label:%s val:%s"%(meta,label,val))
                         if val != '':
-                            if coldef['datatype'] == 'bool':
-                                if val.lower() in ('t','true','1','yes','y'):
-                                    val = True
-                                elif val.lower() in ('f','false','0','no','n'):
-                                    val = False
-                                else:
-                                    val = None # for tri-state 'booleans'. 
Yes/No/Null
-                            #print("setting 'r' or 'added':%s"%val)
                             self.set_custom(db, book_id, meta, val, 
label=label, commit=False)
 
                     if flag == 'a':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/calibre-plugin/jobs.py 
new/FanFicFare-3.7.0/calibre-plugin/jobs.py
--- old/FanFicFare-3.6.0/calibre-plugin/jobs.py 2019-03-12 16:28:29.000000000 
+0100
+++ new/FanFicFare-3.7.0/calibre-plugin/jobs.py 2019-04-19 21:08:56.000000000 
+0200
@@ -117,8 +117,8 @@
 
     from calibre_plugins.fanficfare_plugin import FanFicFareBase
     fffbase = FanFicFareBase(options['plugin_path'])
-    with fffbase:
-
+    with fffbase: # so the sys.path was modified while loading the
+                  # plug impl.
         from calibre_plugins.fanficfare_plugin.dialogs import 
(NotGoingToDownload,
                 OVERWRITE, OVERWRITEALWAYS, UPDATE, UPDATEALWAYS, ADDNEW, 
SKIP, CALIBREONLY, CALIBREONLYSAVECOL)
         from calibre_plugins.fanficfare_plugin.fanficfare import adapters, 
writers, exceptions
@@ -128,7 +128,7 @@
 
         try:
             ## No need to download at all.  Can happen now due to
-            ## collision moving into bookfor CALIBREONLY changing to
+            ## collision moving into book for CALIBREONLY changing to
             ## ADDNEW when story URL not in library.
             if book['collision'] in (CALIBREONLY, CALIBREONLYSAVECOL):
                 logger.info("Skipping CALIBREONLY 'update' down inside worker")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/calibre-plugin/plugin-defaults.ini 
new/FanFicFare-3.7.0/calibre-plugin/plugin-defaults.ini
--- old/FanFicFare-3.6.0/calibre-plugin/plugin-defaults.ini     2019-03-12 
16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/calibre-plugin/plugin-defaults.ini     2019-04-19 
21:08:56.000000000 +0200
@@ -192,7 +192,7 @@
 ## calibre_author: calibre_author_LIST=>^(.{,100}).*$=>\1
 ##
 ## You can 'split' one list item into multiple list entries by using
-## \' in the replacement string.
+## \, in the replacement string.
 ##
 ## Examples:
 #replace_metadata:
@@ -1120,7 +1120,7 @@
 ## entry) as the composite offreeformtags, ao3categories in
 ## include_in_genre.  If there's ever more than 4 series, add
 ## series04,series04Url etc.
-extra_valid_entries:fandoms,freeformtags,freefromtags,ao3categories,comments,kudos,hits,bookmarks,collections,byline,bookmarktags,bookmarksummary,bookmarkprivate,bookmarkrec,series00,series01,series02,series03,series00Url,series01Url,series02Url,series03Url,series00HTML,series01HTML,series02HTML,series03HTML
+extra_valid_entries:fandoms,freeformtags,freefromtags,ao3categories,comments,kudos,hits,bookmarks,collections,byline,bookmarked,bookmarktags,bookmarksummary,bookmarkprivate,bookmarkrec,series00,series01,series02,series03,series00Url,series01Url,series02Url,series03Url,series00HTML,series01HTML,series02HTML,series03HTML
 fandoms_label:Fandoms
 freeformtags_label:Freeform Tags
 freefromtags_label:Freeform Tags
@@ -1133,6 +1133,7 @@
 bookmarks_label:Bookmarks
 ## Tags & Summary from *your* bookmark on the story.  Only collected
 ## if always_login:true
+bookmarked_label:I Bookmarked Story
 bookmarktags_label:My Bookmark Tags
 bookmarksummary_label:My Bookmark Summary
 bookmarkprivate_label:My Bookmark Private
@@ -1163,7 +1164,7 @@
 include_in_freefromtags:freeformtags
 
 ## adds to titlepage_entries instead of replacing it.
-#extra_titlepage_entries: 
fandoms,freeformtags,ao3categories,comments,kudos,hits,bookmarks,bookmarktags,bookmarksummary,series01HTML,series02HTML,series03HTML,byline
+#extra_titlepage_entries: 
fandoms,freeformtags,ao3categories,comments,kudos,hits,bookmarks,bookmarked,bookmarktags,bookmarksummary,series01HTML,series02HTML,series03HTML,byline
 
 ## adds to include_subject_tags instead of replacing it.
 #extra_subject_tags:fandoms,freeformtags,ao3categories
@@ -1174,6 +1175,17 @@
 ## personal.ini and list the ones you don't want.
 
#exclude_notes:authorheadnotes,chaptersummary,chapterheadnotes,chapterfootnotes,authorfootnotes,inspiredlinks
 
+## AO3 authorfootnotes and inspiredlinks end up in the 'last' chapter,
+## but if updated, then there's a new 'last' chapter, leaving multiple
+## copies.  This option applies the 'skip_on_ffdl_update' class to
+## those tags which means they will be removed during epub reading for
+## update.  This will only effect chapters added after turning the
+## setting on.
+## Result: Only the last chapter will have end notes.
+## Side-effect: An 'Update Always' that doesn't add a new last
+## chapter will also remove the end notes.
+#remove_authorfootnotes_on_update:false
+
 ## AO3 is blocking people more aggressively.  If you download fewer
 ## stories less often you can likely get by with reducing this sleep.
 slow_down_sleep_time:2
@@ -1742,12 +1754,6 @@
 ## Site dedicated to these categories/characters/ships
 extracategories:The Office
 
-[ncisfic.com]
-## Site dedicated to these categories/characters/ships
-extracategories:NCIS
-
-website_encodings:Windows-1252,utf8
-
 [nfacommunity.com]
 ## Some sites do not require a login, but do require the user to
 ## confirm they are adult for adult content.  In commandline version,
@@ -2173,6 +2179,14 @@
 ## Some sites do not require a login, but do require the user to
 ## confirm they are adult for adult content.  In commandline version,
 ## this should go in your personal.ini, not defaults.ini.
+#is_adult:true
+
+website_encodings:Windows-1252,utf8
+
+[www.destinysgateway.com]
+## Some sites do not require a login, but do require the user to
+## confirm they are adult for adult content.  In commandline version,
+## this should go in your personal.ini, not defaults.ini.
 #is_adult:true
 
 website_encodings:Windows-1252,utf8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/calibre-plugin/translations/ca.po 
new/FanFicFare-3.7.0/calibre-plugin/translations/ca.po
--- old/FanFicFare-3.6.0/calibre-plugin/translations/ca.po      2019-03-12 
16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/calibre-plugin/translations/ca.po      2019-04-19 
21:08:56.000000000 +0200
@@ -2,7 +2,7 @@
 # Copyright (C) YEAR ORGANIZATION
 # 
 # Translators:
-# Adolfo Jayme-Barrientos, 2014
+# Fito JB, 2014
 # jmontane, 2014
 # Queralt Iglesias <[email protected]>, 2016
 # Robert Antoni Buj Gelonch <[email protected]>, 2016-2017
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/calibre-plugin/translations/de.po 
new/FanFicFare-3.7.0/calibre-plugin/translations/de.po
--- old/FanFicFare-3.6.0/calibre-plugin/translations/de.po      2019-03-12 
16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/calibre-plugin/translations/de.po      2019-04-19 
21:08:56.000000000 +0200
@@ -5,6 +5,7 @@
 # Ettore Atalan <[email protected]>, 2014-2016,2018
 # ILB, 2014-2017
 # jumo, 2016
+# Patrick Wacker <[email protected]>, 2019
 # Sebastian Keller <[email protected]>, 2015
 # Simon_Schuette <[email protected]>, 2014-2016
 # Simon S, 2015
@@ -14,8 +15,8 @@
 msgstr ""
 "Project-Id-Version: calibre-plugins\n"
 "POT-Creation-Date: 2018-12-25 23:36+Central Standard Time\n"
-"PO-Revision-Date: 2018-12-26 19:43+0000\n"
-"Last-Translator: Ettore Atalan <[email protected]>\n"
+"PO-Revision-Date: 2019-04-04 23:23+0000\n"
+"Last-Translator: Patrick Wacker <[email protected]>\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"
@@ -72,21 +73,21 @@
 
 #: common_utils.py:527
 msgid "Save setting for this plugin"
-msgstr ""
+msgstr "Speichern Sie die Einstellung für dieses Plugin"
 
 #: common_utils.py:555
 msgid ""
 "Are you sure you want to edit settings in this library for this plugin?"
-msgstr ""
+msgstr "Möchten Sie die Einstellungen in dieser Bibliothek für dieses Plugin 
wirklich bearbeiten?"
 
 #: common_utils.py:556
 msgid "The FanFicFare team does not support hand edited configurations."
-msgstr ""
+msgstr "Das FanFicFare-Team unterstützt keine von Hand bearbeiteten 
Konfigurationen."
 
 #: common_utils.py:564
 msgid ""
 "Are you sure you want to save this setting in this library for this plugin?"
-msgstr ""
+msgstr "Möchten Sie diese Einstellung in dieser Bibliothek wirklich für dieses 
Plugin speichern?"
 
 #: common_utils.py:565 common_utils.py:593
 msgid ""
@@ -100,7 +101,7 @@
 
 #: common_utils.py:574
 msgid "All settings for this plugin in this library have been saved."
-msgstr ""
+msgstr "Alle Einstellungen für dieses Plugin in dieser Bibliothek wurden 
gespeichert."
 
 #: common_utils.py:575 common_utils.py:604
 msgid "Please restart calibre now."
@@ -275,7 +276,7 @@
 msgid ""
 "Warn you if an update will change the URL of an existing book(normally 
automatic and silent).\n"
 "URLs may be changed from http to https silently if the site changed."
-msgstr ""
+msgstr "Warnt Sie, wenn ein Update die URL eines vorhandenen Buchs ändert 
(normalerweise automatisch und stumm).\nURLs können unbemerkt von http in https 
geändert werden, wenn sich die Seite geändert hat."
 
 #: config.py:519
 msgid "Search inside ebooks for Story URL?"
@@ -408,7 +409,7 @@
 "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 "Beim Überprüfen, <i>ob die Story bereits vorhanden ist</i>, wird 
FanFicFare zuerst anhand der URL-Kennung abgeglichen. Wird er nicht gefunden, 
können vorhandene Bücher auch nach Titel und Autor (en) durchsucht werden."
 
 #: config.py:604
 msgid "Reject List"
@@ -640,7 +641,7 @@
 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 "Die Menüoption zum Entfernen aus \"To Read\" -Listen entfernt auch 
\"(neu)\" Kapitelmarkierung, die mit der Einstellung \"personal.ini 
mark_new_chapters\" erstellt wurden."
 
 #: config.py:947
 msgid ""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/calibre-plugin/translations/es.po 
new/FanFicFare-3.7.0/calibre-plugin/translations/es.po
--- old/FanFicFare-3.6.0/calibre-plugin/translations/es.po      2019-03-12 
16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/calibre-plugin/translations/es.po      2019-04-19 
21:08:56.000000000 +0200
@@ -2,7 +2,7 @@
 # Copyright (C) YEAR ORGANIZATION
 # 
 # Translators:
-# Adolfo Jayme-Barrientos, 2014
+# Fito JB, 2014
 # Albert, 2016
 # Darío Hereñú <[email protected]>, 2015-2016,2018
 # Darío Hereñú <[email protected]>, 2018
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/calibre-plugin/translations/et.po 
new/FanFicFare-3.7.0/calibre-plugin/translations/et.po
--- old/FanFicFare-3.6.0/calibre-plugin/translations/et.po      2019-03-12 
16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/calibre-plugin/translations/et.po      2019-04-19 
21:08:56.000000000 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: calibre-plugins\n"
 "POT-Creation-Date: 2018-12-25 23:36+Central Standard Time\n"
-"PO-Revision-Date: 2019-03-03 19:13+0000\n"
+"PO-Revision-Date: 2019-04-13 19:57+0000\n"
 "Last-Translator: Maidur\n"
 "Language-Team: Estonian 
(http://www.transifex.com/calibre/calibre-plugins/language/et/)\n"
 "MIME-Version: 1.0\n"
@@ -19,7 +19,7 @@
 
 #: __init__.py:51
 msgid "UI plugin to download FanFiction stories from various sites."
-msgstr "Kasutajaliidese plugin mitmetelt saitidelt 'FanFiction'-juttude 
allalaadimiseks."
+msgstr "Kasutajaliidese plugin mitmetelt saitidelt fännikirjanduse juttude 
allalaadimiseks."
 
 #: __init__.py:124
 msgid ""
@@ -149,7 +149,7 @@
 msgid ""
 "These settings control the basic features of the plugin--downloading "
 "FanFiction."
-msgstr "Need sätted juhivad plugina põhilisi funktsioone -- FanFictioni 
allalaadimist."
+msgstr "Need sätted juhivad plugina põhilisi funktsioone -- fännikirjanduse 
allalaadimist."
 
 #: config.py:432
 msgid "Defaults Options on Download"
@@ -1511,7 +1511,7 @@
 
 #: dialogs.py:1175
 msgid "Delete Books (including books without FanFiction URLs)?"
-msgstr "Kustutada raamatud (k.a ilma FanFiction URLita raamatud)?"
+msgstr "Kustutada raamatud (k.a ilma fännikirjanduse URLita raamatud)?"
 
 #: dialogs.py:1176
 msgid "Delete the selected books after adding them to the Rejected URLs list."
@@ -1569,7 +1569,7 @@
 
 #: fff_plugin.py:138
 msgid "Download FanFiction stories from various web sites"
-msgstr "Laadi erinevatelt veebisaitidelt alla FanFiction-jutte"
+msgstr "Laadi erinevatelt veebisaitidelt alla fännikirjanduse jutte"
 
 #: fff_plugin.py:299
 msgid "&Download from URLs"
@@ -1577,11 +1577,11 @@
 
 #: fff_plugin.py:301
 msgid "Download FanFiction Books from URLs"
-msgstr "Laadi FanFiction-raamatuid alla URLidelt"
+msgstr "Laadi fännikirjanduse raamatuid alla URLidelt"
 
 #: fff_plugin.py:304
 msgid "&Update Existing FanFiction Books"
-msgstr "Uuenda olemasolevaid FanFiction-raamatuid"
+msgstr "Uuenda olemasolevaid fännikirjanduse raamatuid"
 
 #: fff_plugin.py:309
 msgid "Get Story URLs from &Email"
@@ -1597,7 +1597,7 @@
 
 #: fff_plugin.py:321
 msgid "Make FanFiction Anthology Epub from URLs"
-msgstr "Loo URLidest FanFiction antoloogia EPUB"
+msgstr "Loo URLidest fännikirjanduse antoloogia EPUB"
 
 #: fff_plugin.py:324
 msgid "Make Anthology Epub from Web Page"
@@ -1605,7 +1605,7 @@
 
 #: fff_plugin.py:326
 msgid "Make FanFiction Anthology Epub from Web Page"
-msgstr "Loo FanFiction antoloogia EPUB veebilehelt"
+msgstr "Loo fännikirjanduse antoloogia EPUB veebilehelt"
 
 #: fff_plugin.py:329
 msgid "Update Anthology Epub"
@@ -1613,7 +1613,7 @@
 
 #: fff_plugin.py:331
 msgid "Update FanFiction Anthology Epub"
-msgstr "Uuenda FanFictioni antoloogia EPUBi"
+msgstr "Uuenda fännikirjanduse antoloogia EPUBi"
 
 #: fff_plugin.py:338
 msgid "Mark Unread: Add to \"To Read\" and \"Send to Device\" Lists"
@@ -2068,7 +2068,7 @@
 
 #: fff_plugin.py:1545
 msgid "Download %s FanFiction Book(s)"
-msgstr "Laadi alla %s FanFiction raamat(ut)"
+msgstr "Laadi alla %s fännikirjanduse raamat(ut)"
 
 #: fff_plugin.py:1552
 msgid "Starting %d FanFicFare Downloads"
@@ -2236,7 +2236,7 @@
 
 #: jobs.py:74
 msgid "Downloading FanFiction Stories"
-msgstr "FanFiction-juttude allalaadimine"
+msgstr "Fännikirjanduse juttude allalaadimine"
 
 #: jobs.py:90
 msgid "%d of %d stories finished downloading"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-3.6.0/calibre-plugin/translations/pt_BR.po 
new/FanFicFare-3.7.0/calibre-plugin/translations/pt_BR.po
--- old/FanFicFare-3.6.0/calibre-plugin/translations/pt_BR.po   2019-03-12 
16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/calibre-plugin/translations/pt_BR.po   2019-04-19 
21:08:56.000000000 +0200
@@ -6,13 +6,14 @@
 # Paulo_Neto <[email protected]>, 2014-2015,2017
 # Patricia Tufanetto <[email protected]>, 2018
 # Paulo Márcio da Hora <[email protected]>, 2019
+# Thiago Feldhaus <[email protected]>, 2019
 # Wagner Marques <[email protected]>, 2015
 msgid ""
 msgstr ""
 "Project-Id-Version: calibre-plugins\n"
 "POT-Creation-Date: 2018-12-25 23:36+Central Standard Time\n"
-"PO-Revision-Date: 2019-01-10 08:31+0000\n"
-"Last-Translator: Paulo Márcio da Hora <[email protected]>\n"
+"PO-Revision-Date: 2019-04-10 16:02+0000\n"
+"Last-Translator: Thiago Feldhaus <[email protected]>\n"
 "Language-Team: Portuguese (Brazil) 
(http://www.transifex.com/calibre/calibre-plugins/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -69,7 +70,7 @@
 
 #: common_utils.py:527
 msgid "Save setting for this plugin"
-msgstr ""
+msgstr "Salvar configuração para este plugin"
 
 #: common_utils.py:555
 msgid ""
@@ -493,7 +494,7 @@
 
 #: config.py:718
 msgid "personal.ini"
-msgstr ""
+msgstr "personal.ini"
 
 #: config.py:725 config.py:829 config.py:830
 msgid "Edit personal.ini"
@@ -517,7 +518,7 @@
 
 #: config.py:749
 msgid "defaults.ini"
-msgstr ""
+msgstr "defaults.ini"
 
 #: config.py:754
 msgid ""
@@ -531,7 +532,7 @@
 
 #: config.py:766
 msgid "Calibre Columns"
-msgstr ""
+msgstr "Calibre Colunas"
 
 #: config.py:773
 msgid ""
@@ -552,7 +553,7 @@
 
 #: config.py:788
 msgid "Show Calibre Column Names"
-msgstr ""
+msgstr "Mostrar nome de Colunas Calibre"
 
 #: config.py:797
 msgid ""
@@ -671,7 +672,7 @@
 
 #: config.py:1009
 msgid "Plugin %(gc)s"
-msgstr ""
+msgstr "Plugin %(gc)s"
 
 #: config.py:1010
 msgid "Use plugin to create covers.  Additional settings are below."
@@ -711,7 +712,7 @@
 
 #: config.py:1046
 msgid "%(gc)s(Plugin) Settings"
-msgstr ""
+msgstr "%(gc)s(Plugin) Configurações"
 
 #: config.py:1054
 msgid ""
@@ -988,7 +989,7 @@
 
 #: config.py:1398
 msgid "Save All Errors"
-msgstr ""
+msgstr "Salvar Todos os Erros"
 
 #: config.py:1399
 msgid "If unchecked, these errors will not be saved: %s"
@@ -1577,7 +1578,7 @@
 
 #: fff_plugin.py:299
 msgid "&Download from URLs"
-msgstr ""
+msgstr "&Download de URLs"
 
 #: fff_plugin.py:301
 msgid "Download FanFiction Books from URLs"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/fanficfare/adapters/__init__.py 
new/FanFicFare-3.7.0/fanficfare/adapters/__init__.py
--- old/FanFicFare-3.6.0/fanficfare/adapters/__init__.py        2019-03-12 
16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/fanficfare/adapters/__init__.py        2019-04-19 
21:08:56.000000000 +0200
@@ -65,10 +65,10 @@
 from . import adapter_dokugacom
 from . import adapter_iketernalnet
 from . import adapter_storiesofardacom
+from . import adapter_destinysgatewaycom
 from . import adapter_ncisfictioncom
 from . import adapter_fanfiktionde
 from . import adapter_ponyfictionarchivenet
-from . import adapter_ncisficcom
 from . import adapter_themasquenet
 from . import adapter_pretendercentrecom
 from . import adapter_darksolaceorg
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-3.6.0/fanficfare/adapters/adapter_archiveofourownorg.py 
new/FanFicFare-3.7.0/fanficfare/adapters/adapter_archiveofourownorg.py
--- old/FanFicFare-3.6.0/fanficfare/adapters/adapter_archiveofourownorg.py      
2019-03-12 16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/fanficfare/adapters/adapter_archiveofourownorg.py      
2019-04-19 21:08:56.000000000 +0200
@@ -189,6 +189,10 @@
             # actual login so we don't have a case where these show up
             # for a user only when they get user-restricted stories.
             try:
+                # is bookmarked if has update /bookmarks/ form --
+                # create bookmark form uses different url
+                self.story.setMetadata('bookmarked',
+                                       None != 
metasoup.find('form',action=re.compile(r'^/bookmarks/')))
                 self.story.extendList('bookmarktags',
                                       
metasoup.find('input',id='bookmark_tag_string')['value'].split(', '))
                 self.story.setMetadata('bookmarkprivate',
@@ -418,6 +422,7 @@
             new_tag = save_chapter_soup.new_tag(tag)
             new_tag.string=string
             elem.append(new_tag)
+            return new_tag
 
         ## These are the over-all work's 'Notes at the beginning'.
         ## They only appear on the first chapter in individual chapter
@@ -472,6 +477,7 @@
                 append_tag(save_chapter,'b',"Notes for the Chapter:")
                 save_chapter.append(chapfoot)
 
+        skip_on_update_tags = []
         ## These are the over-all work's 'Notes at the end'.
         ## They only appear on the last chapter in individual chapter
         ## pages and after chapter-# div.  Appending removes
@@ -482,9 +488,15 @@
             if footnotes != None:
                 footnotes = footnotes.find('blockquote')
                 if footnotes:
-                    append_tag(save_chapter,'b',"Author's Note:")
+                    b = append_tag(save_chapter,'b',"Author's Note:")
+                    skip_on_update_tags.append(b)
+                    skip_on_update_tags.append(footnotes)
                     save_chapter.append(footnotes)
 
+        ## It looks like 'Inspired by' links now all appear in the ul
+        ## class=associations tag in authorheadnotes.  This code is
+        ## left in case I'm wrong and there are still stories with div
+        ## id=children inspired links at the end.
         if 'inspiredlinks' not in exclude_notes and index+1 == 
self.num_chapters():
             inspiredlinks = whole_dl_soup.find('div', {'id' : "children"})
             if inspiredlinks != None:
@@ -494,6 +506,22 @@
                     for alink in inspiredlinks.find_all('a'):
                         if 'http' not in alink['href']:
                             alink['href']='https://' + self.getSiteDomain() + 
alink['href']
+                    skip_on_update_tags.append(inspiredlinks)
                     save_chapter.append(inspiredlinks)
 
+        ## AO3 story end notes end up in the 'last' chapter, but if
+        ## updated, then there's a new 'last' chapter.  This option
+        ## applies the 'skip_on_ffdl_update' class to those tags which
+        ## means they will be removed during epub reading for update.
+        ## Results: only the last chapter will have end notes.
+        ## Side-effect: An 'Update Always' that doesn't add a new
+        ## lasts chapter will remove the end notes.
+        if self.getConfig("remove_authorfootnotes_on_update"):
+            for skip_tag in skip_on_update_tags:
+                if skip_tag.has_attr('class'):
+                    skip_tag['class'].append('skip_on_ffdl_update')
+                else:
+                    skip_tag['class']=['skip_on_ffdl_update']
+                # logger.debug(skip_tag)
+
         return self.utf8FromSoup(url,save_chapter)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-3.6.0/fanficfare/adapters/adapter_destinysgatewaycom.py 
new/FanFicFare-3.7.0/fanficfare/adapters/adapter_destinysgatewaycom.py
--- old/FanFicFare-3.6.0/fanficfare/adapters/adapter_destinysgatewaycom.py      
1970-01-01 01:00:00.000000000 +0100
+++ new/FanFicFare-3.7.0/fanficfare/adapters/adapter_destinysgatewaycom.py      
2019-04-19 21:08:56.000000000 +0200
@@ -0,0 +1,238 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2012 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.
+#
+
+# Software: eFiction
+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 ..six import text_type as unicode
+from ..six.moves.urllib.error import HTTPError
+
+from .base_adapter import BaseSiteAdapter,  makeDate
+
+def getClass():
+    return DestinysGatewayComAdapter
+
+# Class name has to be unique.  Our convention is camel case the
+# sitename with Adapter at the end.  www is skipped.
+class DestinysGatewayComAdapter(BaseSiteAdapter):
+
+    def __init__(self, config, url):
+        BaseSiteAdapter.__init__(self, config, url)
+
+        self.username = "NoneGiven" # if left empty, site doesn't return any 
message at all.
+        self.password = ""
+        self.is_adult=False
+
+        # get storyId from url--url validation guarantees query is only 
sid=1234
+        self.story.setMetadata('storyId',self.parsedUrl.query.split('=',)[1])
+
+
+        # normalized story URL.
+        self._setURL('http://' + self.getSiteDomain() + 
'/viewstory.php?sid='+self.story.getMetadata('storyId'))
+
+        # Each adapter needs to have a unique site abbreviation.
+        self.story.setMetadata('siteabbrev','dgrfa')
+
+        # The date format will vary from site to site.
+        # 
http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+        self.dateformat = "%b %d %Y"
+
+    @staticmethod # must be @staticmethod, don't remove it.
+    def getSiteDomain():
+        # The site domain.  Does have www here, if it uses it.
+        return 'www.destinysgateway.com'
+
+    @classmethod
+    def getSiteExampleURLs(cls):
+        return "http://"+cls.getSiteDomain()+"/viewstory.php?sid=1234"
+
+    def getSiteURLPattern(self):
+        return 
re.escape("http://"+self.getSiteDomain()+"/viewstory.php?sid=").replace("www\.",r"(www\.)?")+r"\d+$"
+
+
+    ## Getting the chapter list and the meta data, plus 'is adult' checking.
+    def extractChapterUrlsAndMetadata(self):
+
+        if self.is_adult or self.getConfig("is_adult"):
+            # Weirdly, different sites use different warning numbers.
+            # If the title search below fails, there's a good chance
+            # you need a different number.  print data at that point
+            # and see what the 'click here to continue' url says.
+            addurl = "&warning=4"
+        else:
+            addurl=""
+
+        # index=1 makes sure we see the story chapter index.  Some
+        # sites skip that for one-chapter stories.
+        url = self.url+'&index=1'+addurl
+        logger.debug("URL: "+url)
+
+        try:
+            data = self._fetchUrl(url)
+        except HTTPError as e:
+            if e.code == 404:
+                raise exceptions.StoryDoesNotExist(self.url)
+            else:
+                raise e
+
+        m = 
re.search(r"'viewstory.php\?sid=\d+((?:&amp;ageconsent=ok)?&amp;warning=\d+)'",data)
+        if m != None:
+            if self.is_adult or self.getConfig("is_adult"):
+                # We tried the default and still got a warning, so
+                # let's pull the warning number from the 'continue'
+                # link and reload data.
+                addurl = m.group(1)
+                # correct stupid &amp; error in url.
+                addurl = addurl.replace("&amp;","&")
+                url = self.url+'&index=1'+addurl
+                logger.debug("URL 2nd try: "+url)
+
+                try:
+                    data = self._fetchUrl(url)
+                except HTTPError as e:
+                    if e.code == 404:
+                        raise exceptions.StoryDoesNotExist(self.url)
+                    else:
+                        raise e
+            else:
+                raise exceptions.AdultCheckRequired(self.url)
+
+        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.")
+
+        # use BeautifulSoup HTML parser to make everything easier to find.
+        soup = self.make_soup(data)
+        # print data
+
+        # Now go hunting for all the meta data and the chapter list.
+
+        ## Title
+        a = soup.find('a', 
href=re.compile(r'viewstory.php\?sid='+self.story.getMetadata('storyId')+"$"))
+        self.story.setMetadata('title',stripHTML(a))
+
+        # 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('author',a.string)
+
+        # Find the chapters:
+        for chapter in soup.findAll('a', 
href=re.compile(r'viewstory.php\?sid='+self.story.getMetadata('storyId')+"&chapter=\d+$")):
+            # just in case there's tags, like <i> in chapter titles.
+            
self.add_chapter(chapter,'http://'+self.host+'/'+chapter['href']+addurl)
+
+
+        # eFiction sites don't help us out a lot with their meta data
+        # formating, so it's a little ugly.
+
+        # utility method
+        def defaultGetattr(d,k):
+            try:
+                return d[k]
+            except:
+                return ""
+
+        # <span class="label">Rated:</span> NC-17<br /> etc
+        labels = soup.findAll('span',{'class':'label'})
+        for labelspan in labels:
+            value = labelspan.nextSibling
+            label = labelspan.string
+
+            if 'Summary' in label:
+                ## Everything until the next span class='label'
+                svalue = ""
+                while value and 'label' not in defaultGetattr(value,'class'):
+                    svalue += unicode(value)
+                    value = value.nextSibling
+                self.setDescription(url,svalue)
+                #self.story.setMetadata('description',stripHTML(svalue))
+
+            if 'Rated' in label:
+                self.story.setMetadata('rating', value)
+
+            if 'Word count' in label:
+                self.story.setMetadata('numWords', value)
+
+            if 'Categories' in label:
+                cats = 
labelspan.parent.findAll('a',href=re.compile(r'browse.php\?type=categories'))
+                for cat in cats:
+                    self.story.addToList('category',cat.string)
+
+            if 'Genre' in label:
+                genres = 
labelspan.parent.findAll('a',href=re.compile(r'browse.php\?type=class&type_id=1'))
+                for genre in genres:
+                    self.story.addToList('genre',genre.string)
+
+            if 'Warnings' in label:
+                warnings = 
labelspan.parent.findAll('a',href=re.compile(r'browse.php\?type=class&type_id=2'))
+                for warning in warnings:
+                    self.story.addToList('warnings',warning.string)
+
+            if 'Completed' in label:
+                if 'Yes' in value:
+                    self.story.setMetadata('status', 'Completed')
+                else:
+                    self.story.setMetadata('status', 'In-Progress')
+
+            if 'Published' in label:
+                self.story.setMetadata('datePublished', 
makeDate(stripHTML(value), self.dateformat))
+
+            if 'Updated' in label:
+                # there's a stray [ at the end.
+                #value = value[0:-1]
+                self.story.setMetadata('dateUpdated', 
makeDate(stripHTML(value), self.dateformat))
+
+        try:
+            # Find Series name from series URL.
+            a = soup.find('a', 
href=re.compile(r"viewseries.php\?seriesid=\d+"))
+            series_name = a.string
+            series_url = 'http://'+self.host+'/'+a['href']
+
+            # use BeautifulSoup HTML parser to make everything easier to find.
+            seriessoup = self.make_soup(self._fetchUrl(series_url))
+            storyas = seriessoup.findAll('a', 
href=re.compile(r'^viewstory.php\?sid=\d+$'))
+            i=1
+            for a in storyas:
+                if a['href'] == 
('viewstory.php?sid='+self.story.getMetadata('storyId')):
+                    self.setSeries(series_name, i)
+                    self.story.setMetadata('seriesUrl',series_url)
+                    break
+                i+=1
+
+        except:
+            # I find it hard to care if the series parsing fails
+            pass
+
+    # grab the text for an individual chapter.
+    def getChapterText(self, url):
+
+        logger.debug('Getting chapter text from: %s' % url)
+
+        soup = self.make_soup(self._fetchUrl(url))
+
+        div = soup.find('div', {'id' : 'story'})
+
+        if None == div:
+            raise exceptions.FailedToDownload("Error downloading Chapter: %s!  
Missing required element!" % url)
+
+        return self.utf8FromSoup(url,div)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-3.6.0/fanficfare/adapters/adapter_fanficauthorsnet.py 
new/FanFicFare-3.7.0/fanficfare/adapters/adapter_fanficauthorsnet.py
--- old/FanFicFare-3.6.0/fanficfare/adapters/adapter_fanficauthorsnet.py        
2019-03-12 16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/fanficfare/adapters/adapter_fanficauthorsnet.py        
2019-04-19 21:08:56.000000000 +0200
@@ -240,15 +240,15 @@
             # Status: Completed - Rating: Everyone - Chapters: 1 - Word count: 
876 - Genre: Sorrow
             # Status: In progress - Rating: Mature - Chapters: 39 - Word 
count: 314,544 - Genre: Drama - Romance
             div = soup.find('div',{'class':'well'})
-            logger.debug(div.find_all('p')[1])
+            # logger.debug(div.find_all('p')[1])
             metaline = re.sub(r' +',' 
',stripHTML(div.find_all('p')[1]).replace('\n',' '))
-            logger.debug(metaline)
+            # logger.debug(metaline)
             match = re.match(r"Status: (?P<status>.+?) - Rating: 
(?P<rating>.+?) - Chapters: [0-9,]+ - Word count: (?P<numWords>[0-9,]+?) - 
Genre: (?P<genre>.+?)$",metaline)
             if match:
-                logger.debug(match.group('status'))
-                logger.debug(match.group('rating'))
-                logger.debug(match.group('numWords'))
-                logger.debug(match.group('genre'))
+                # logger.debug(match.group('status'))
+                # logger.debug(match.group('rating'))
+                # logger.debug(match.group('numWords'))
+                # logger.debug(match.group('genre'))
                 if "Completed" in match.group('status'):
                     self.story.setMetadata('status',"Completed")
                 else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-3.6.0/fanficfare/adapters/adapter_fanfictionnet.py 
new/FanFicFare-3.7.0/fanficfare/adapters/adapter_fanfictionnet.py
--- old/FanFicFare-3.6.0/fanficfare/adapters/adapter_fanfictionnet.py   
2019-03-12 16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/fanficfare/adapters/adapter_fanfictionnet.py   
2019-04-19 21:08:56.000000000 +0200
@@ -110,7 +110,7 @@
             else:
                 raise e
 
-        if "Unable to locate story" in data:
+        if "Unable to locate story" in data or "Story Not Found" in data:
             raise exceptions.StoryDoesNotExist(url)
 
         # some times "Chapter not found...", sometimes "Chapter text
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-3.6.0/fanficfare/adapters/adapter_gluttonyfictioncom.py 
new/FanFicFare-3.7.0/fanficfare/adapters/adapter_gluttonyfictioncom.py
--- old/FanFicFare-3.6.0/fanficfare/adapters/adapter_gluttonyfictioncom.py      
2019-03-12 16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/fanficfare/adapters/adapter_gluttonyfictioncom.py      
2019-04-19 21:08:56.000000000 +0200
@@ -38,7 +38,7 @@
     def getDateFormat(self):
         # The date format will vary from site to site.
         # 
http://docs.python.org/library/datetime.html#strftime-strptime-behavior
-        return "%m/%d/%Y"
+        return "%d/%m/%Y"
 
 
##################################################################################
 ### The Efiction Base Adapter uses the Bulk story to retrieve the metadata, but
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-3.6.0/fanficfare/adapters/adapter_ncisficcom.py 
new/FanFicFare-3.7.0/fanficfare/adapters/adapter_ncisficcom.py
--- old/FanFicFare-3.6.0/fanficfare/adapters/adapter_ncisficcom.py      
2019-03-12 16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/fanficfare/adapters/adapter_ncisficcom.py      
1970-01-01 01:00:00.000000000 +0100
@@ -1,213 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2012 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.
-#
-
-# Software: eFiction
-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 ..six import text_type as unicode
-from ..six.moves.urllib.error import HTTPError
-
-from .base_adapter import BaseSiteAdapter,  makeDate
-
-def getClass():
-    return NCISFicComAdapter
-
-# Class name has to be unique.  Our convention is camel case the
-# sitename with Adapter at the end.  www is skipped.
-class NCISFicComAdapter(BaseSiteAdapter):
-
-    def __init__(self, config, url):
-        BaseSiteAdapter.__init__(self, config, url)
-
-        self.username = "NoneGiven" # if left empty, site doesn't return any 
message at all.
-        self.password = ""
-        self.is_adult=False
-
-        # get storyId from url--url validation guarantees query is only 
storyid=1234
-        self.story.setMetadata('storyId',self.parsedUrl.query.split('=',)[1])
-
-
-        # normalized story URL.
-        self._setURL('http://' + self.getSiteDomain() + 
'/viewstory.php?storyid='+self.story.getMetadata('storyId'))
-
-        # Each adapter needs to have a unique site abbreviation.
-        self.story.setMetadata('siteabbrev','ncisf')
-
-        # The date format will vary from site to site.
-        # 
http://docs.python.org/library/datetime.html#strftime-strptime-behavior
-        self.dateformat = "%m-%d-%y"
-
-    @staticmethod # must be @staticmethod, don't remove it.
-    def getSiteDomain():
-        return 'ncisfic.com'
-
-    @classmethod
-    def getAcceptDomains(cls):
-        return ['www.ncisfic.com','ncisfic.com']
-
-    @classmethod
-    def getSiteExampleURLs(cls):
-        return "http://"+cls.getSiteDomain()+"/viewstory.php?storyid=1234"
-
-    def getSiteURLPattern(self):
-        return 
re.escape("http://";)+"(www\.)?"+re.escape(self.getSiteDomain()+"/viewstory.php?storyid=")+r"\d+$"
-
-
-    ## Getting the chapter list and the meta data, plus 'is adult' checking.
-    def extractChapterUrlsAndMetadata(self):
-
-        # index=1 makes sure we see the story chapter index.  Some
-        # sites skip that for one-chapter stories.
-        url = self.url
-        logger.debug("URL: "+url)
-
-        try:
-            data = self._fetchUrl(url)
-        except HTTPError as e:
-            if e.code == 404:
-                raise exceptions.StoryDoesNotExist(self.url)
-            else:
-                raise e
-
-        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.")
-
-        # use BeautifulSoup HTML parser to make everything easier to find.
-        soup = self.make_soup(data)
-        # print data
-
-        # Now go hunting for all the meta data and the chapter list.
-
-        ## Title
-        a = soup.find('h1')
-        self.story.setMetadata('title',stripHTML(a))
-
-        # Find authorid and URL from... author url.
-        a = soup.find('a', href=re.compile(r"authorresults.php\?author=\d+"))
-        self.story.setMetadata('authorId',a['href'].split('=')[1])
-        self.story.setMetadata('authorUrl','http://'+self.host+'/'+a['href'])
-        self.story.setMetadata('author',a.string)
-
-        # Find the chapters:
-        for p in soup.findAll('p'):
-            chapters = p.findAll('a', 
href=re.compile(r'viewstory.php\?storyid='+self.story.getMetadata('storyId')+"&chapnum=\d+$"))
-            if len(chapters) > 0:
-                for chapter in chapters:
-                    # just in case there's tags, like <i> in chapter titles.
-                    
self.add_chapter(chapter,'http://'+self.host+'/'+chapter['href'])
-                break
-
-        self.story.setMetadata('status', 'Completed')
-
-        # <span class="label">Rated:</span> NC-17<br /> etc
-        labels = soup.findAll('b')
-        for x in range(2,len(labels)):
-            value = labels[x].nextSibling
-            label = labels[x].string
-
-            if 'Summary' in label:
-                self.setDescription(url,value)
-                #self.story.setMetadata('description',stripHTML(svalue))
-
-            if 'Rating' in label:
-                self.story.setMetadata('rating', stripHTML(value.nextSibling))
-
-            if 'Word Count' in label:
-                self.story.setMetadata('numWords', value.string)
-
-            if 'Category' in label:
-                for cat in value.string.split(', '):
-                    self.story.addToList('category',cat)
-            if 'Crossover Shows' in label:
-                for cat in value.string.split(', '):
-                    if "No Show" not in cat:
-                        self.story.addToList('category',cat)
-
-            if 'Character' in label:
-                for char in value.string.split(', '):
-                    self.story.addToList('characters',char)
-
-            if 'Pairing' in label:
-                for char in value.string.split(', '):
-                    self.story.addToList('ships',char)
-
-            if 'Warnings' in label:
-                for warning in value.string.split(', '):
-                    self.story.addToList('warnings',warning)
-
-            if 'Published' in label:
-                self.story.setMetadata('datePublished', 
makeDate(stripHTML(value), self.dateformat))
-
-            if 'Series' in label:
-                if "No Series" not in value.nextSibling.string:
-                    self.setSeries(stripHTML(value.nextSibling), 
value.nextSibling.nextSibling.string[2:])
-                    
self.story.setMetadata('seriesUrl','http://'+self.host+'/'+value.nextSibling['href'])
-
-        asoup = 
self.make_soup(self._fetchUrl(self.story.getMetadata('authorUrl')))
-        story=asoup.find('a', 
href=re.compile(r'viewstory.php\?storyid='+self.story.getMetadata('storyId')))
-
-        a=story.findNext('font')
-        if 'Complete' in a.string:
-            self.story.setMetadata('status', 'Completed')
-        else:
-            self.story.setMetadata('status', 'In-Progress')
-
-        
a=story.findNext(text=re.compile('Genre')).parent.nextSibling.string.split(', ')
-        for genre in a:
-            self.story.setMetadata('genre', genre)
-
-        a=story.findNext(text=re.compile('Archived'))
-        self.story.setMetadata('datePublished', 
makeDate(stripHTML(a.parent.nextSibling), self.dateformat))
-        self.story.setMetadata('dateUpdated', 
makeDate(stripHTML(a.parent.nextSibling), self.dateformat))
-
-    # grab the text for an individual chapter.
-    def getChapterText(self, url):
-
-        logger.debug('Getting chapter text from: %s' % url)
-
-        soup = self.make_soup(self._fetchUrl(url))
-
-        div = soup.find('div')
-
-        # bit messy since higly inconsistent
-        for p in soup.findAll('p', {'align' : 'center'}):
-            p.extract()
-        p = soup.findAll('p')
-        for x in range(0,3):
-            p[x].extract()
-        if "Chapters: " in stripHTML(p[3]):
-            p[3].extract()
-        for x in range(len(p)-2,len(p)-1):
-            p[x].extract()
-
-        for p in soup.findAll('h1'):
-            p.extract()
-        for p in soup.findAll('h3'):
-            p.extract()
-        for p in soup.findAll('a'):
-            p.extract()
-
-        if None == div:
-            raise exceptions.FailedToDownload("Error downloading Chapter: %s!  
Missing required element!" % url)
-
-        return self.utf8FromSoup(url,div)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/FanFicFare-3.6.0/fanficfare/adapters/adapter_royalroadcom.py 
new/FanFicFare-3.7.0/fanficfare/adapters/adapter_royalroadcom.py
--- old/FanFicFare-3.6.0/fanficfare/adapters/adapter_royalroadcom.py    
2019-03-12 16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/fanficfare/adapters/adapter_royalroadcom.py    
2019-04-19 21:08:56.000000000 +0200
@@ -207,8 +207,10 @@
         for label in [stripHTML(a) for a in soup.find_all('span', 
{'class':'label'})]:
             if 'COMPLETED' == label:
                 self.story.setMetadata('status', 'Completed')
-            elif ('ONGOING' == label) or ('HIATUS' == label):
+            elif 'ONGOING' == label:
                 self.story.setMetadata('status', 'In-Progress')
+            elif 'HIATUS' == label:
+                self.story.setMetadata('status', 'Hiatus')
             elif 'Fan Fiction' == label:
                 self.story.addToList('category', 'FanFiction')
             elif 'Original' == label:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/fanficfare/cli.py 
new/FanFicFare-3.7.0/fanficfare/cli.py
--- old/FanFicFare-3.6.0/fanficfare/cli.py      2019-03-12 16:28:29.000000000 
+0100
+++ new/FanFicFare-3.7.0/fanficfare/cli.py      2019-04-19 21:08:56.000000000 
+0200
@@ -39,7 +39,7 @@
     def pickle_load(f):
         return pickle.load(f,encoding="bytes")
 
-version="3.6.0"
+version="3.7.0"
 os.environ['CURRENT_VERSION_ID']=version
 
 global_cache = 'global_cache'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/fanficfare/configurable.py 
new/FanFicFare-3.7.0/fanficfare/configurable.py
--- old/FanFicFare-3.6.0/fanficfare/configurable.py     2019-03-12 
16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/fanficfare/configurable.py     2019-04-19 
21:08:56.000000000 +0200
@@ -227,6 +227,7 @@
                
'always_login':(['archiveofourown.org']+base_xenforo_list,None,boollist),
                'use_archived_author':(['archiveofourown.org'],None,boollist),
                'use_view_full_work':(['archiveofourown.org'],None,boollist),
+               
'remove_authorfootnotes_on_update':(['archiveofourown.org'],None,boollist),
 
                'force_login':(['phoenixsong.net'],None,boollist),
                'non_breaking_spaces':(['fictionmania.tv'],None,boollist),
@@ -359,6 +360,7 @@
                  'use_view_full_work',
                  'always_login',
                  'exclude_notes',
+                 'remove_authorfootnotes_on_update',
                  'exclude_editor_signature',
                  'extra_logpage_entries',
                  'extra_subject_tags',
@@ -978,7 +980,7 @@
                                              "iso-8859-1"])
         for code in decode:
             try:
-                #print(code)
+                logger.debug("Encoding:%s"%code)
                 errors=None
                 if ':' in code:
                     (code,errors)=code.split(':')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/fanficfare/defaults.ini 
new/FanFicFare-3.7.0/fanficfare/defaults.ini
--- old/FanFicFare-3.6.0/fanficfare/defaults.ini        2019-03-12 
16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/fanficfare/defaults.ini        2019-04-19 
21:08:56.000000000 +0200
@@ -248,7 +248,7 @@
 ## calibre_author: calibre_author_LIST=>^(.{,100}).*$=>\1
 ##
 ## You can 'split' one list item into multiple list entries by using
-## \' in the replacement string.
+## \, in the replacement string.
 ##
 ## Examples:
 #replace_metadata:
@@ -1154,7 +1154,7 @@
 ## entry) as the composite offreeformtags, ao3categories in
 ## include_in_genre.  If there's ever more than 4 series, add
 ## series04,series04Url etc.
-extra_valid_entries:fandoms,freeformtags,freefromtags,ao3categories,comments,kudos,hits,bookmarks,collections,byline,bookmarktags,bookmarksummary,bookmarkprivate,bookmarkrec,series00,series01,series02,series03,series00Url,series01Url,series02Url,series03Url,series00HTML,series01HTML,series02HTML,series03HTML
+extra_valid_entries:fandoms,freeformtags,freefromtags,ao3categories,comments,kudos,hits,bookmarks,collections,byline,bookmarked,bookmarktags,bookmarksummary,bookmarkprivate,bookmarkrec,series00,series01,series02,series03,series00Url,series01Url,series02Url,series03Url,series00HTML,series01HTML,series02HTML,series03HTML
 fandoms_label:Fandoms
 freeformtags_label:Freeform Tags
 freefromtags_label:Freeform Tags
@@ -1167,6 +1167,7 @@
 bookmarks_label:Bookmarks
 ## Tags & Summary from *your* bookmark on the story.  Only collected
 ## if always_login:true
+bookmarked_label:I Bookmarked Story
 bookmarktags_label:My Bookmark Tags
 bookmarksummary_label:My Bookmark Summary
 bookmarkprivate_label:My Bookmark Private
@@ -1197,7 +1198,7 @@
 include_in_freefromtags:freeformtags
 
 ## adds to titlepage_entries instead of replacing it.
-#extra_titlepage_entries: 
fandoms,freeformtags,ao3categories,comments,kudos,hits,bookmarks,bookmarktags,bookmarksummary,series01HTML,series02HTML,series03HTML,byline
+#extra_titlepage_entries: 
fandoms,freeformtags,ao3categories,comments,kudos,hits,bookmarks,bookmarked,bookmarktags,bookmarksummary,series01HTML,series02HTML,series03HTML,byline
 
 ## adds to include_subject_tags instead of replacing it.
 #extra_subject_tags:fandoms,freeformtags,ao3categories
@@ -1208,6 +1209,17 @@
 ## personal.ini and list the ones you don't want.
 
#exclude_notes:authorheadnotes,chaptersummary,chapterheadnotes,chapterfootnotes,authorfootnotes,inspiredlinks
 
+## AO3 authorfootnotes and inspiredlinks end up in the 'last' chapter,
+## but if updated, then there's a new 'last' chapter, leaving multiple
+## copies.  This option applies the 'skip_on_ffdl_update' class to
+## those tags which means they will be removed during epub reading for
+## update.  This will only effect chapters added after turning the
+## setting on.
+## Result: Only the last chapter will have end notes.
+## Side-effect: An 'Update Always' that doesn't add a new last
+## chapter will also remove the end notes.
+#remove_authorfootnotes_on_update:false
+
 ## AO3 is blocking people more aggressively.  If you download fewer
 ## stories less often you can likely get by with reducing this sleep.
 slow_down_sleep_time:2
@@ -1776,12 +1788,6 @@
 ## Site dedicated to these categories/characters/ships
 extracategories:The Office
 
-[ncisfic.com]
-## Site dedicated to these categories/characters/ships
-extracategories:NCIS
-
-website_encodings:Windows-1252,utf8
-
 [nfacommunity.com]
 ## Some sites do not require a login, but do require the user to
 ## confirm they are adult for adult content.  In commandline version,
@@ -2207,6 +2213,14 @@
 ## Some sites do not require a login, but do require the user to
 ## confirm they are adult for adult content.  In commandline version,
 ## this should go in your personal.ini, not defaults.ini.
+#is_adult:true
+
+website_encodings:Windows-1252,utf8
+
+[www.destinysgateway.com]
+## Some sites do not require a login, but do require the user to
+## confirm they are adult for adult content.  In commandline version,
+## this should go in your personal.ini, not defaults.ini.
 #is_adult:true
 
 website_encodings:Windows-1252,utf8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/fanficfare/geturls.py 
new/FanFicFare-3.7.0/fanficfare/geturls.py
--- old/FanFicFare-3.6.0/fanficfare/geturls.py  2019-03-12 16:28:29.000000000 
+0100
+++ new/FanFicFare-3.7.0/fanficfare/geturls.py  2019-04-19 21:08:56.000000000 
+0200
@@ -192,7 +192,7 @@
         ## only sent for thread updates, I believe.  Email only so
         ## get_urls_from_page can still get post URLs.
         href = re.sub(r"/(unread|page-\d+)?(#post-\d+)?",r"/",href)
-    elif 'clicktracker.royalroad' in href:
+    elif 'click' in href and 'royalroad' in href: # they've changed the domain 
at least once
         logger.debug(href)
         from .six.moves.urllib.request import build_opener
         opener = build_opener()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/fanficfare/story.py 
new/FanFicFare-3.7.0/fanficfare/story.py
--- old/FanFicFare-3.6.0/fanficfare/story.py    2019-03-12 16:28:29.000000000 
+0100
+++ new/FanFicFare-3.7.0/fanficfare/story.py    2019-04-19 21:08:56.000000000 
+0200
@@ -502,9 +502,13 @@
 
     def setMetadata(self, key, value, condremoveentities=True):
 
-        # delete
+        # delete cached replace'd value.
         if key in self.processed_metadata_cache:
             del self.processed_metadata_cache[key]
+        # Fixing everything downstream to handle bool primatives is a
+        # pain.
+        if isinstance(value,bool):
+            value = unicode(value)
         # keep as list type, but set as only value.
         if self.isList(key):
             
self.addToList(key,value,condremoveentities=condremoveentities,clear=True)
@@ -587,7 +591,9 @@
         retlist = [value]
         for replaceline in self.replacements:
             (repl_line,metakeys,regexp,replacement,cond_match) = replaceline
-            #print("replacement tuple:%s"%replaceline)
+            # logger.debug("replacement tuple:%s"%replaceline)
+            # logger.debug("key:%s value:%s"%(key,value))
+            # logger.debug("value class:%s"%value.__class__.__name__)
             if (metakeys == None or key in metakeys) \
                     and isinstance(value,basestring) \
                     and regexp.search(value):
@@ -649,6 +655,7 @@
     def dump_html_metadata(self):
         lines=[]
         for k,v in sorted(six.iteritems(self.metadata)):
+            #logger.debug("k:%s v:%s"%(k,v))
             classes=['metadata']
             if isinstance(v, (datetime.date, datetime.datetime, 
datetime.time)):
                 classes.append("datetime")
@@ -698,12 +705,17 @@
                 for i in tag.find_all('li'):
                     val.append(i.string)
             elif 'int' in tag['class']:
-                val = int(tag.string)
+                # Python reports true when asked isinstance(<bool>, (int))
+                # bools now converted to unicode when set.
+                if tag.string in ('True','False'):
+                    val = tag.string
+                else:
+                    val = int(tag.string)
             else:
                 val = unicode("\n".join([ unicode(c) for c in tag.contents ]))
 
             #logger.debug("key(%s)=val(%s)"%(tag['id'],val))
-            if val:
+            if val != None:
                 self.metadata[tag['id']]=val
 
         # self.metadata = json.loads(s, object_hook=datetime_decoder)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/setup.py 
new/FanFicFare-3.7.0/setup.py
--- old/FanFicFare-3.6.0/setup.py       2019-03-12 16:28:29.000000000 +0100
+++ new/FanFicFare-3.7.0/setup.py       2019-04-19 21:08:56.000000000 +0200
@@ -3,7 +3,7 @@
 """A setuptools based setup module.
 
 See:
-https://packaging.python.org/en/latest/distributing.html
+https://packaging.python.org/guides/distributing-packages-using-setuptools/
 https://github.com/pypa/sampleproject
 """
 
@@ -27,7 +27,7 @@
     name=package_name,
 
     # Versions should comply with PEP440.
-    version="3.6.0",
+    version="3.7.0",
 
     description='A tool for downloading fanfiction to eBook formats',
     long_description=long_description,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/webservice/app.yaml 
new/FanFicFare-3.7.0/webservice/app.yaml
--- old/FanFicFare-3.6.0/webservice/app.yaml    2019-03-12 16:28:29.000000000 
+0100
+++ new/FanFicFare-3.7.0/webservice/app.yaml    2019-04-19 21:08:56.000000000 
+0200
@@ -1,6 +1,6 @@
 # ffd-retief-hrd fanficfare
 application: fanficfare
-version: 3-6-0
+version: 3-7-0
 runtime: python27
 api_version: 1
 threadsafe: true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FanFicFare-3.6.0/webservice/index.html 
new/FanFicFare-3.7.0/webservice/index.html
--- old/FanFicFare-3.6.0/webservice/index.html  2019-03-12 16:28:29.000000000 
+0100
+++ new/FanFicFare-3.7.0/webservice/index.html  2019-04-19 21:08:56.000000000 
+0200
@@ -84,7 +84,7 @@
             If you have any problems with this application, please
             report them in
             the <a 
href="https://groups.google.com/group/fanfic-downloader";>FanFicFare Google 
Group</a>.  The
-            <a href="https://3-5-0.fanficfare.appspot.com";>previous version</a>
+            <a href="https://3-6-0.fanficfare.appspot.com";>previous version</a>
             is also available for you to use if necessary.
           </p>
           <div id='error'>


Reply via email to