mirror of
https://github.com/JimmXinu/FanFicFare.git
synced 2025-12-06 08:52:55 +01:00
commit
8a6e627bbb
11 changed files with 167 additions and 48 deletions
|
|
@ -33,7 +33,7 @@ except NameError:
|
||||||
from calibre.customize import InterfaceActionBase
|
from calibre.customize import InterfaceActionBase
|
||||||
|
|
||||||
# pulled out from FanFicFareBase for saving in prefs.py
|
# pulled out from FanFicFareBase for saving in prefs.py
|
||||||
__version__ = (4, 48, 1)
|
__version__ = (4, 48, 7)
|
||||||
|
|
||||||
## Apparently the name for this class doesn't matter--it was still
|
## Apparently the name for this class doesn't matter--it was still
|
||||||
## 'demo' for the first few versions.
|
## 'demo' for the first few versions.
|
||||||
|
|
|
||||||
|
|
@ -673,6 +673,15 @@ browser_cache_age_limit:4.0
|
||||||
## an error message in the ebook for that chapter.
|
## an error message in the ebook for that chapter.
|
||||||
continue_on_chapter_error:false
|
continue_on_chapter_error:false
|
||||||
|
|
||||||
|
## When continue_on_chapter_error:true, after
|
||||||
|
## continue_on_chapter_error_try_limit chapters have failed, continue
|
||||||
|
## processing, but stop trying to download chapters. Mark all such
|
||||||
|
## chapters with chapter_title_error_mark, but chapter text will
|
||||||
|
## explain that no download attempt was made because
|
||||||
|
## continue_on_chapter_error_try_limit was exceeded. Set to -1 for
|
||||||
|
## infinite chapter errors.
|
||||||
|
continue_on_chapter_error_try_limit:5
|
||||||
|
|
||||||
## Append this to chapter titles that errored. Only used with
|
## Append this to chapter titles that errored. Only used with
|
||||||
## continue_on_chapter_error:true
|
## continue_on_chapter_error:true
|
||||||
## Set empty to not mark failed chapters.
|
## Set empty to not mark failed chapters.
|
||||||
|
|
@ -1634,7 +1643,8 @@ extra_titlepage_entries:eroticatags,disclaimer
|
||||||
## series04,series04Url etc.
|
## series04,series04Url etc.
|
||||||
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
||||||
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
||||||
hits, bookmarks, collections, byline, bookmarked, bookmarktags,
|
hits, bookmarks, collections, collectionsUrl, collectionsHTML,
|
||||||
|
byline, bookmarked, bookmarktags,
|
||||||
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
||||||
markedforlater, restricted, series00, series01, series02, series03,
|
markedforlater, restricted, series00, series01, series02, series03,
|
||||||
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
||||||
|
|
@ -1649,6 +1659,7 @@ chapterstotal_label:Total Chapters
|
||||||
kudos_label:Kudos
|
kudos_label:Kudos
|
||||||
hits_label:Hits
|
hits_label:Hits
|
||||||
collections_label:Collections
|
collections_label:Collections
|
||||||
|
collectionsHTML_label:Collections
|
||||||
## Count of bookmarks on story by all users
|
## Count of bookmarks on story by all users
|
||||||
bookmarks_label:Bookmarks
|
bookmarks_label:Bookmarks
|
||||||
## Tags & Summary from *your* bookmark on the story. Only collected
|
## Tags & Summary from *your* bookmark on the story. Only collected
|
||||||
|
|
@ -1666,9 +1677,13 @@ series01HTML_label:Additional Series
|
||||||
series02HTML_label:Additional Series
|
series02HTML_label:Additional Series
|
||||||
series03HTML_label:Additional Series
|
series03HTML_label:Additional Series
|
||||||
|
|
||||||
|
## have to keep in order for name and URL to line up.
|
||||||
|
keep_in_order_collections:true
|
||||||
|
keep_in_order_collectionsUrl:true
|
||||||
|
|
||||||
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
||||||
## make entryHTML.
|
## make entryHTML.
|
||||||
make_linkhtml_entries:series00,series01,series02,series03
|
make_linkhtml_entries:series00,series01,series02,series03,collections
|
||||||
|
|
||||||
## AO3 doesn't have anything it calls 'genre'. The adapter used to be
|
## AO3 doesn't have anything it calls 'genre'. The adapter used to be
|
||||||
## hardcoded to include the site specific metadata freeformtags &
|
## hardcoded to include the site specific metadata freeformtags &
|
||||||
|
|
@ -2583,7 +2598,8 @@ extracategories:Buffy the Vampire Slayer
|
||||||
## series04,series04Url etc.
|
## series04,series04Url etc.
|
||||||
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
||||||
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
||||||
hits, bookmarks, collections, byline, bookmarked, bookmarktags,
|
hits, bookmarks, collections, collectionsUrl, collectionsHTML,
|
||||||
|
byline, bookmarked, bookmarktags,
|
||||||
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
||||||
markedforlater, restricted, series00, series01, series02, series03,
|
markedforlater, restricted, series00, series01, series02, series03,
|
||||||
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
||||||
|
|
@ -2598,6 +2614,7 @@ chapterstotal_label:Total Chapters
|
||||||
kudos_label:Kudos
|
kudos_label:Kudos
|
||||||
hits_label:Hits
|
hits_label:Hits
|
||||||
collections_label:Collections
|
collections_label:Collections
|
||||||
|
collectionsHTML_label:Collections
|
||||||
## Count of bookmarks on story by all users
|
## Count of bookmarks on story by all users
|
||||||
bookmarks_label:Bookmarks
|
bookmarks_label:Bookmarks
|
||||||
## Tags & Summary from *your* bookmark on the story. Only collected
|
## Tags & Summary from *your* bookmark on the story. Only collected
|
||||||
|
|
@ -2615,9 +2632,13 @@ series01HTML_label:Additional Series
|
||||||
series02HTML_label:Additional Series
|
series02HTML_label:Additional Series
|
||||||
series03HTML_label:Additional Series
|
series03HTML_label:Additional Series
|
||||||
|
|
||||||
|
## have to keep in order for name and URL to line up.
|
||||||
|
keep_in_order_collections:true
|
||||||
|
keep_in_order_collectionsUrl:true
|
||||||
|
|
||||||
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
||||||
## make entryHTML.
|
## make entryHTML.
|
||||||
make_linkhtml_entries:series00,series01,series02,series03
|
make_linkhtml_entries:series00,series01,series02,series03,collections
|
||||||
|
|
||||||
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
||||||
## hardcoded to include the site specific metadata freeformtags &
|
## hardcoded to include the site specific metadata freeformtags &
|
||||||
|
|
@ -2884,7 +2905,8 @@ cover_exclusion_regexp:/css/bir.png
|
||||||
## series04,series04Url etc.
|
## series04,series04Url etc.
|
||||||
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
||||||
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
||||||
hits, bookmarks, collections, byline, bookmarked, bookmarktags,
|
hits, bookmarks, collections, collectionsUrl, collectionsHTML,
|
||||||
|
byline, bookmarked, bookmarktags,
|
||||||
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
||||||
markedforlater, restricted, series00, series01, series02, series03,
|
markedforlater, restricted, series00, series01, series02, series03,
|
||||||
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
||||||
|
|
@ -2899,6 +2921,7 @@ chapterstotal_label:Total Chapters
|
||||||
kudos_label:Kudos
|
kudos_label:Kudos
|
||||||
hits_label:Hits
|
hits_label:Hits
|
||||||
collections_label:Collections
|
collections_label:Collections
|
||||||
|
collectionsHTML_label:Collections
|
||||||
## Count of bookmarks on story by all users
|
## Count of bookmarks on story by all users
|
||||||
bookmarks_label:Bookmarks
|
bookmarks_label:Bookmarks
|
||||||
## Tags & Summary from *your* bookmark on the story. Only collected
|
## Tags & Summary from *your* bookmark on the story. Only collected
|
||||||
|
|
@ -2916,9 +2939,13 @@ series01HTML_label:Additional Series
|
||||||
series02HTML_label:Additional Series
|
series02HTML_label:Additional Series
|
||||||
series03HTML_label:Additional Series
|
series03HTML_label:Additional Series
|
||||||
|
|
||||||
|
## have to keep in order for name and URL to line up.
|
||||||
|
keep_in_order_collections:true
|
||||||
|
keep_in_order_collectionsUrl:true
|
||||||
|
|
||||||
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
||||||
## make entryHTML.
|
## make entryHTML.
|
||||||
make_linkhtml_entries:series00,series01,series02,series03
|
make_linkhtml_entries:series00,series01,series02,series03,collections
|
||||||
|
|
||||||
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
||||||
## hardcoded to include the site specific metadata freeformtags &
|
## hardcoded to include the site specific metadata freeformtags &
|
||||||
|
|
@ -3257,7 +3284,8 @@ extracategories:Star Trek
|
||||||
## series04,series04Url etc.
|
## series04,series04Url etc.
|
||||||
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
||||||
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
||||||
hits, bookmarks, collections, byline, bookmarked, bookmarktags,
|
hits, bookmarks, collections, collectionsUrl, collectionsHTML,
|
||||||
|
byline, bookmarked, bookmarktags,
|
||||||
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
||||||
markedforlater, restricted, series00, series01, series02, series03,
|
markedforlater, restricted, series00, series01, series02, series03,
|
||||||
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
||||||
|
|
@ -3272,6 +3300,7 @@ chapterstotal_label:Total Chapters
|
||||||
kudos_label:Kudos
|
kudos_label:Kudos
|
||||||
hits_label:Hits
|
hits_label:Hits
|
||||||
collections_label:Collections
|
collections_label:Collections
|
||||||
|
collectionsHTML_label:Collections
|
||||||
## Count of bookmarks on story by all users
|
## Count of bookmarks on story by all users
|
||||||
bookmarks_label:Bookmarks
|
bookmarks_label:Bookmarks
|
||||||
## Tags & Summary from *your* bookmark on the story. Only collected
|
## Tags & Summary from *your* bookmark on the story. Only collected
|
||||||
|
|
@ -3289,9 +3318,13 @@ series01HTML_label:Additional Series
|
||||||
series02HTML_label:Additional Series
|
series02HTML_label:Additional Series
|
||||||
series03HTML_label:Additional Series
|
series03HTML_label:Additional Series
|
||||||
|
|
||||||
|
## have to keep in order for name and URL to line up.
|
||||||
|
keep_in_order_collections:true
|
||||||
|
keep_in_order_collectionsUrl:true
|
||||||
|
|
||||||
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
||||||
## make entryHTML.
|
## make entryHTML.
|
||||||
make_linkhtml_entries:series00,series01,series02,series03
|
make_linkhtml_entries:series00,series01,series02,series03,collections
|
||||||
|
|
||||||
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
||||||
## hardcoded to include the site specific metadata freeformtags &
|
## hardcoded to include the site specific metadata freeformtags &
|
||||||
|
|
@ -3523,7 +3556,8 @@ keep_style_attr: false
|
||||||
## series04,series04Url etc.
|
## series04,series04Url etc.
|
||||||
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
||||||
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
||||||
hits, bookmarks, collections, byline, bookmarked, bookmarktags,
|
hits, bookmarks, collections, collectionsUrl, collectionsHTML,
|
||||||
|
byline, bookmarked, bookmarktags,
|
||||||
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
||||||
markedforlater, restricted, series00, series01, series02, series03,
|
markedforlater, restricted, series00, series01, series02, series03,
|
||||||
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
||||||
|
|
@ -3538,6 +3572,7 @@ chapterstotal_label:Total Chapters
|
||||||
kudos_label:Kudos
|
kudos_label:Kudos
|
||||||
hits_label:Hits
|
hits_label:Hits
|
||||||
collections_label:Collections
|
collections_label:Collections
|
||||||
|
collectionsHTML_label:Collections
|
||||||
## Count of bookmarks on story by all users
|
## Count of bookmarks on story by all users
|
||||||
bookmarks_label:Bookmarks
|
bookmarks_label:Bookmarks
|
||||||
## Tags & Summary from *your* bookmark on the story. Only collected
|
## Tags & Summary from *your* bookmark on the story. Only collected
|
||||||
|
|
@ -3555,9 +3590,13 @@ series01HTML_label:Additional Series
|
||||||
series02HTML_label:Additional Series
|
series02HTML_label:Additional Series
|
||||||
series03HTML_label:Additional Series
|
series03HTML_label:Additional Series
|
||||||
|
|
||||||
|
## have to keep in order for name and URL to line up.
|
||||||
|
keep_in_order_collections:true
|
||||||
|
keep_in_order_collectionsUrl:true
|
||||||
|
|
||||||
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
||||||
## make entryHTML.
|
## make entryHTML.
|
||||||
make_linkhtml_entries:series00,series01,series02,series03
|
make_linkhtml_entries:series00,series01,series02,series03,collections
|
||||||
|
|
||||||
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
||||||
## hardcoded to include the site specific metadata freeformtags &
|
## hardcoded to include the site specific metadata freeformtags &
|
||||||
|
|
|
||||||
|
|
@ -132,7 +132,7 @@ class LiteroticaSiteAdapter(BaseSiteAdapter):
|
||||||
#logger.debug(data)
|
#logger.debug(data)
|
||||||
## looking for /series/se URL to indicate this is a
|
## looking for /series/se URL to indicate this is a
|
||||||
## chapter.
|
## chapter.
|
||||||
if not soup.select_one('div.page__aside') and not soup.select_one('div.sidebar'):
|
if not soup.select_one('div.page__aside') and not soup.select_one('div.sidebar') and not soup.select_one('div[class^="_sidebar_"]'):
|
||||||
raise exceptions.FailedToDownload("Missing Story Info block, Beta turned off?")
|
raise exceptions.FailedToDownload("Missing Story Info block, Beta turned off?")
|
||||||
|
|
||||||
storyseriestag = soup.select_one('a.bn_av')
|
storyseriestag = soup.select_one('a.bn_av')
|
||||||
|
|
@ -385,6 +385,8 @@ class LiteroticaSiteAdapter(BaseSiteAdapter):
|
||||||
pages = page_soup.select_one('div._pagination_h0sum_1')
|
pages = page_soup.select_one('div._pagination_h0sum_1')
|
||||||
if not pages:
|
if not pages:
|
||||||
pages = page_soup.select_one('div.clearfix.panel._pagination_1400x_1')
|
pages = page_soup.select_one('div.clearfix.panel._pagination_1400x_1')
|
||||||
|
if not pages:
|
||||||
|
pages = page_soup.select_one('div[class^="panel clearfix _pagination_"]')
|
||||||
# logger.debug(pages)
|
# logger.debug(pages)
|
||||||
|
|
||||||
fullhtml = ""
|
fullhtml = ""
|
||||||
|
|
|
||||||
|
|
@ -366,7 +366,7 @@ Some more longer description. "I suck at summaries!" "Better than it sounds!"
|
||||||
<br />
|
<br />
|
||||||
</div>
|
</div>
|
||||||
'''
|
'''
|
||||||
elif self.story.getMetadata('storyId') == '667' and "chapter=2" in url:
|
elif self.story.getMetadata('storyId') == '667' and ("chapter=2" in url or "chapter=3" in url or "chapter=4" in url):
|
||||||
raise exceptions.FailedToDownload("Error downloading Chapter: %s!" % url)
|
raise exceptions.FailedToDownload("Error downloading Chapter: %s!" % url)
|
||||||
elif self.getSiteDomain() not in url:
|
elif self.getSiteDomain() not in url:
|
||||||
## for chapter_urls setting.
|
## for chapter_urls setting.
|
||||||
|
|
|
||||||
|
|
@ -230,6 +230,21 @@ class BaseSiteAdapter(Requestable):
|
||||||
percent = 0.0
|
percent = 0.0
|
||||||
per_step = 1.0/self.story.getChapterCount()
|
per_step = 1.0/self.story.getChapterCount()
|
||||||
# logger.debug("self.story.getChapterCount():%s per_step:%s"%(self.story.getChapterCount(),per_step))
|
# logger.debug("self.story.getChapterCount():%s per_step:%s"%(self.story.getChapterCount(),per_step))
|
||||||
|
continue_on_chapter_error_try_limit = 5
|
||||||
|
try:
|
||||||
|
continue_on_chapter_error_try_limit = int(self.getConfig('continue_on_chapter_error_try_limit',
|
||||||
|
continue_on_chapter_error_try_limit))
|
||||||
|
except:
|
||||||
|
logger.warning('Parsing continue_on_chapter_error_try_limit:%s failed, using %s'%(
|
||||||
|
self.getConfig('continue_on_chapter_error_try_limit'),
|
||||||
|
continue_on_chapter_error_try_limit))
|
||||||
|
|
||||||
|
def do_error_chapter(txt,title):
|
||||||
|
data = self.make_soup(txt)
|
||||||
|
title = title+self.getConfig("chapter_title_error_mark","(CHAPTER ERROR)")
|
||||||
|
url="chapter url removed due to failure"
|
||||||
|
return data, title, url
|
||||||
|
|
||||||
for index, chap in enumerate(self.chapterUrls):
|
for index, chap in enumerate(self.chapterUrls):
|
||||||
title = chap['title']
|
title = chap['title']
|
||||||
url = chap['url']
|
url = chap['url']
|
||||||
|
|
@ -263,9 +278,21 @@ class BaseSiteAdapter(Requestable):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if not data:
|
if not data:
|
||||||
data = self.getChapterTextNum(url,index)
|
if( self.getConfig('continue_on_chapter_error') and
|
||||||
# if had to fetch and has existing chapters
|
continue_on_chapter_error_try_limit > 0 and # for -1 == infinite
|
||||||
newchap = bool(self.oldchapters or self.oldchaptersmap)
|
self.story.chapter_error_count >= continue_on_chapter_error_try_limit ):
|
||||||
|
data, title, url = do_error_chapter("""<div>
|
||||||
|
<p><b>Error</b></p>
|
||||||
|
<p>FanFicFare didn't try to download this chapter, due to earlier chapter errors.</p><p>
|
||||||
|
Because <b>continue_on_chapter_error:true</b> is set, processing continued, but because
|
||||||
|
<b>continue_on_chapter_error_try_limit</b>(%s) has been exceeded, this chapter did not
|
||||||
|
try to download.</p>
|
||||||
|
<p>Chapter URL:<br><a href="%s">%s</a></p>
|
||||||
|
</div>"""%(continue_on_chapter_error_try_limit,url,url),title)
|
||||||
|
else:
|
||||||
|
data = self.getChapterTextNum(url,index)
|
||||||
|
# if had to fetch and has existing chapters
|
||||||
|
newchap = bool(self.oldchapters or self.oldchaptersmap)
|
||||||
|
|
||||||
if index == 0 and self.getConfig('always_reload_first_chapter'):
|
if index == 0 and self.getConfig('always_reload_first_chapter'):
|
||||||
data = self.getChapterTextNum(url,index)
|
data = self.getChapterTextNum(url,index)
|
||||||
|
|
@ -275,17 +302,15 @@ class BaseSiteAdapter(Requestable):
|
||||||
newchap = False
|
newchap = False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if self.getConfig('continue_on_chapter_error',False):
|
if self.getConfig('continue_on_chapter_error',False):
|
||||||
data = self.make_soup("""<div>
|
data, title, url = do_error_chapter("""<div>
|
||||||
<p><b>Error</b></p>
|
<p><b>Error</b></p>
|
||||||
<p>FanFicFare failed to download this chapter. Because
|
<p>FanFicFare failed to download this chapter. Because
|
||||||
<b>continue_on_chapter_error</b> is set to <b>true</b>, the download continued.</p>
|
<b>continue_on_chapter_error</b> is set to <b>true</b>, the download continued.</p>
|
||||||
<p>Chapter URL:<br><a href="%s">%s</a></p>
|
<p>Chapter URL:<br><a href="%s">%s</a></p>
|
||||||
<p>Error:<br><pre>%s</pre></p>
|
<p>Error:<br><pre>%s</pre></p>
|
||||||
</div>"""%(url,url,traceback.format_exc().replace("&","&").replace(">",">").replace("<","<")))
|
</div>"""%(url,url,traceback.format_exc().replace("&","&").replace(">",">").replace("<","<")),title)
|
||||||
title = title+self.getConfig("chapter_title_error_mark","(CHAPTER ERROR)")
|
|
||||||
logger.info("continue_on_chapter_error: (%s) %s"%(url,e))
|
logger.info("continue_on_chapter_error: (%s) %s"%(url,e))
|
||||||
logger.debug(traceback.format_exc())
|
logger.debug(traceback.format_exc())
|
||||||
url="chapter url removed due to failure"
|
|
||||||
self.story.chapter_error_count += 1
|
self.story.chapter_error_count += 1
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
|
|
||||||
|
|
@ -349,6 +349,7 @@ class BaseOTWAdapter(BaseSiteAdapter):
|
||||||
collections = a.find_all('a')
|
collections = a.find_all('a')
|
||||||
for collection in collections:
|
for collection in collections:
|
||||||
self.story.addToList('collections',collection.string)
|
self.story.addToList('collections',collection.string)
|
||||||
|
self.story.addToList('collectionsUrl','https://'+self.host+collection['href'])
|
||||||
|
|
||||||
stats = metasoup.find('dl',{'class':'stats'})
|
stats = metasoup.find('dl',{'class':'stats'})
|
||||||
dt = stats.find_all('dt')
|
dt = stats.find_all('dt')
|
||||||
|
|
|
||||||
|
|
@ -38,8 +38,8 @@ class SimpleCacheException(BrowserCacheException):
|
||||||
SIMPLE_EOF = struct.Struct('<QLLLL') # magic_number, flags, crc32, stream_size, padding
|
SIMPLE_EOF = struct.Struct('<QLLLL') # magic_number, flags, crc32, stream_size, padding
|
||||||
SIMPLE_EOF_SIZE = SIMPLE_EOF.size
|
SIMPLE_EOF_SIZE = SIMPLE_EOF.size
|
||||||
FLAG_HAS_SHA256 = 2
|
FLAG_HAS_SHA256 = 2
|
||||||
ENTRY_MAGIC_NUMBER = 0xfcfb6d1ba7725c30
|
ENTRY_MAGIC_NUMBER = 0xfcfb6d1ba7725c30 # 305c 72a7 1b6d fbfc
|
||||||
EOF_MAGIC_NUMBER = 0xf4fa6f45970d41d8
|
EOF_MAGIC_NUMBER = 0xf4fa6f45970d41d8 # d841 0d97 456f faf4
|
||||||
THE_REAL_INDEX_MAGIC_NUMBER = 0x656e74657220796f
|
THE_REAL_INDEX_MAGIC_NUMBER = 0x656e74657220796f
|
||||||
|
|
||||||
class SimpleCache(BaseChromiumCache):
|
class SimpleCache(BaseChromiumCache):
|
||||||
|
|
@ -163,6 +163,12 @@ def _validate_entry_file(path):
|
||||||
def _read_entry_file(path,entry_file):
|
def _read_entry_file(path,entry_file):
|
||||||
"""Validate that a file is a cache entry file, return the URL (key) if valid"""
|
"""Validate that a file is a cache entry file, return the URL (key) if valid"""
|
||||||
# read from path into SimpleFileHeader, use key_length field to determine size of key, return key as byte string
|
# read from path into SimpleFileHeader, use key_length field to determine size of key, return key as byte string
|
||||||
|
key = _read_entry_file_key(entry_file)
|
||||||
|
if _key_hash(key) != os.path.basename(path).split('_')[0]:
|
||||||
|
return None # key in file does not match the hash, something is wrong
|
||||||
|
return key.decode('utf-8')
|
||||||
|
|
||||||
|
def _read_entry_file_key(entry_file):
|
||||||
shformat = struct.Struct('<QLLLL')
|
shformat = struct.Struct('<QLLLL')
|
||||||
shformat_size = shformat.size
|
shformat_size = shformat.size
|
||||||
data = entry_file.read(shformat_size)
|
data = entry_file.read(shformat_size)
|
||||||
|
|
@ -170,23 +176,28 @@ def _read_entry_file(path,entry_file):
|
||||||
if magic != ENTRY_MAGIC_NUMBER:
|
if magic != ENTRY_MAGIC_NUMBER:
|
||||||
return None # path is not a cache entry file, wrong magic number
|
return None # path is not a cache entry file, wrong magic number
|
||||||
key = entry_file.read(key_length)
|
key = entry_file.read(key_length)
|
||||||
if _key_hash(key) != os.path.basename(path).split('_')[0]:
|
return key
|
||||||
return None # key in file does not match the hash, something is wrong
|
|
||||||
return key.decode('utf-8')
|
|
||||||
|
|
||||||
|
|
||||||
def _skip_to_start_of_stream(entry_file):
|
def _skip_to_start_of_stream(entry_file):
|
||||||
"""Assuming reader is at end of a stream back up to beginning of stream, returning size of data in stream"""
|
"""Assuming reader is at end of a stream back up to beginning of stream, returning size of data in stream"""
|
||||||
entry_file.seek(-SIMPLE_EOF_SIZE, os.SEEK_CUR)
|
entry_file.seek(-SIMPLE_EOF_SIZE, os.SEEK_CUR)
|
||||||
|
start_eof_header = entry_file.tell()
|
||||||
data = entry_file.read(SIMPLE_EOF_SIZE)
|
data = entry_file.read(SIMPLE_EOF_SIZE)
|
||||||
(magic, flags, crc32, stream_size, padding) = SIMPLE_EOF.unpack(data)
|
(magic, flags, crc32, stream_size, padding) = SIMPLE_EOF.unpack(data)
|
||||||
|
# logger.debug((magic, flags, crc32, stream_size, padding))
|
||||||
if magic != EOF_MAGIC_NUMBER:
|
if magic != EOF_MAGIC_NUMBER:
|
||||||
raise SimpleCacheException("Supposed cache entry file did not end with EOF header with correct magic "
|
raise SimpleCacheException("Supposed cache entry file did not end with EOF header with correct magic "
|
||||||
"number: '%s'" % entry_file.name)
|
"number: '%s'" % entry_file.name)
|
||||||
seek_back = stream_size + SIMPLE_EOF_SIZE
|
if stream_size == 0:
|
||||||
if flags & FLAG_HAS_SHA256:
|
logger.debug(">>>Stream size == 0")
|
||||||
seek_back += 32
|
entry_file.seek(0, os.SEEK_SET)
|
||||||
entry_file.seek(-seek_back, os.SEEK_CUR)
|
_read_entry_file_key(entry_file)
|
||||||
|
stream_size = start_eof_header - entry_file.tell()
|
||||||
|
else:
|
||||||
|
seek_back = stream_size + SIMPLE_EOF_SIZE
|
||||||
|
if flags & FLAG_HAS_SHA256:
|
||||||
|
seek_back += 32
|
||||||
|
entry_file.seek(-seek_back, os.SEEK_CUR)
|
||||||
return stream_size
|
return stream_size
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -199,8 +210,8 @@ def _get_data_from_entry_file(path):
|
||||||
def _read_data_from_entry(entry_file):
|
def _read_data_from_entry(entry_file):
|
||||||
""" Read the contents portion (stream 1 data) from the instance's cache entry. Return a byte string """
|
""" Read the contents portion (stream 1 data) from the instance's cache entry. Return a byte string """
|
||||||
entry_file.seek(0, os.SEEK_END)
|
entry_file.seek(0, os.SEEK_END)
|
||||||
_skip_to_start_of_stream(entry_file)
|
_skip_to_start_of_stream(entry_file) # skip to start of LAST stream
|
||||||
stream_size = _skip_to_start_of_stream(entry_file)
|
stream_size = _skip_to_start_of_stream(entry_file) # to start of FIRST stream
|
||||||
ret = entry_file.read(stream_size)
|
ret = entry_file.read(stream_size)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
@ -233,8 +244,9 @@ def _read_meta_headers(entry_file):
|
||||||
# uint32 info_size, uint32 flags, uint32 extra_flags, uint64 request_time, uint64 response_time, uint64 orig_response_time, uint32 header_size
|
# uint32 info_size, uint32 flags, uint32 extra_flags, uint64 request_time, uint64 response_time, uint64 orig_response_time, uint32 header_size
|
||||||
PRE_META_HEADER = struct.Struct('<LLL')
|
PRE_META_HEADER = struct.Struct('<LLL')
|
||||||
predata = entry_file.read(PRE_META_HEADER.size)
|
predata = entry_file.read(PRE_META_HEADER.size)
|
||||||
logger.debug(predata)
|
# logger.debug("predata:")
|
||||||
logger.debug(PRE_META_HEADER.unpack(predata))
|
# logger.debug(predata)
|
||||||
|
# logger.debug(PRE_META_HEADER.unpack(predata))
|
||||||
extra_flags = PRE_META_HEADER.unpack(predata)[2]
|
extra_flags = PRE_META_HEADER.unpack(predata)[2]
|
||||||
RESPONSE_EXTRA_INFO_HAS_ORIGINAL_RESPONSE_TIME = 1 << 2
|
RESPONSE_EXTRA_INFO_HAS_ORIGINAL_RESPONSE_TIME = 1 << 2
|
||||||
if ((extra_flags & RESPONSE_EXTRA_INFO_HAS_ORIGINAL_RESPONSE_TIME) != 0):
|
if ((extra_flags & RESPONSE_EXTRA_INFO_HAS_ORIGINAL_RESPONSE_TIME) != 0):
|
||||||
|
|
@ -245,8 +257,8 @@ def _read_meta_headers(entry_file):
|
||||||
META_HEADER = struct.Struct('<QQL')
|
META_HEADER = struct.Struct('<QQL')
|
||||||
|
|
||||||
data = entry_file.read(META_HEADER.size)
|
data = entry_file.read(META_HEADER.size)
|
||||||
logger.debug(data)
|
# logger.debug(data)
|
||||||
logger.debug(META_HEADER.unpack(data))
|
# logger.debug(META_HEADER.unpack(data))
|
||||||
(request_time, response_time) = META_HEADER.unpack(data)[:2]
|
(request_time, response_time) = META_HEADER.unpack(data)[:2]
|
||||||
# not using original_response_time at this time.
|
# not using original_response_time at this time.
|
||||||
header_size = META_HEADER.unpack(data)[-1]
|
header_size = META_HEADER.unpack(data)[-1]
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ import string
|
||||||
import os, sys, platform
|
import os, sys, platform
|
||||||
|
|
||||||
|
|
||||||
version="4.48.1"
|
version="4.48.7"
|
||||||
os.environ['CURRENT_VERSION_ID']=version
|
os.environ['CURRENT_VERSION_ID']=version
|
||||||
|
|
||||||
global_cache = 'global_cache'
|
global_cache = 'global_cache'
|
||||||
|
|
|
||||||
|
|
@ -568,6 +568,7 @@ def get_valid_keywords():
|
||||||
'capitalize_forumtags',
|
'capitalize_forumtags',
|
||||||
'continue_on_chapter_error',
|
'continue_on_chapter_error',
|
||||||
'chapter_title_error_mark',
|
'chapter_title_error_mark',
|
||||||
|
'continue_on_chapter_error_try_limit',
|
||||||
'minimum_threadmarks',
|
'minimum_threadmarks',
|
||||||
'first_post_title',
|
'first_post_title',
|
||||||
'always_include_first_post',
|
'always_include_first_post',
|
||||||
|
|
|
||||||
|
|
@ -631,6 +631,15 @@ browser_cache_age_limit:4.0
|
||||||
## an error message in the ebook for that chapter.
|
## an error message in the ebook for that chapter.
|
||||||
continue_on_chapter_error:false
|
continue_on_chapter_error:false
|
||||||
|
|
||||||
|
## When continue_on_chapter_error:true, after
|
||||||
|
## continue_on_chapter_error_try_limit chapters have failed, continue
|
||||||
|
## processing, but stop trying to download chapters. Mark all such
|
||||||
|
## chapters with chapter_title_error_mark, but chapter text will
|
||||||
|
## explain that no download attempt was made because
|
||||||
|
## continue_on_chapter_error_try_limit was exceeded. Set to -1 for
|
||||||
|
## infinite chapter errors.
|
||||||
|
continue_on_chapter_error_try_limit:5
|
||||||
|
|
||||||
## Append this to chapter titles that errored. Only used with
|
## Append this to chapter titles that errored. Only used with
|
||||||
## continue_on_chapter_error:true
|
## continue_on_chapter_error:true
|
||||||
## Set empty to not mark failed chapters.
|
## Set empty to not mark failed chapters.
|
||||||
|
|
@ -1627,7 +1636,8 @@ extra_titlepage_entries:eroticatags,disclaimer
|
||||||
## series04,series04Url etc.
|
## series04,series04Url etc.
|
||||||
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
||||||
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
||||||
hits, bookmarks, collections, byline, bookmarked, bookmarktags,
|
hits, bookmarks, collections, collectionsUrl, collectionsHTML,
|
||||||
|
byline, bookmarked, bookmarktags,
|
||||||
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
||||||
markedforlater, restricted, series00, series01, series02, series03,
|
markedforlater, restricted, series00, series01, series02, series03,
|
||||||
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
||||||
|
|
@ -1642,6 +1652,7 @@ chapterstotal_label:Total Chapters
|
||||||
kudos_label:Kudos
|
kudos_label:Kudos
|
||||||
hits_label:Hits
|
hits_label:Hits
|
||||||
collections_label:Collections
|
collections_label:Collections
|
||||||
|
collectionsHTML_label:Collections
|
||||||
## Count of bookmarks on story by all users
|
## Count of bookmarks on story by all users
|
||||||
bookmarks_label:Bookmarks
|
bookmarks_label:Bookmarks
|
||||||
## Tags & Summary from *your* bookmark on the story. Only collected
|
## Tags & Summary from *your* bookmark on the story. Only collected
|
||||||
|
|
@ -1659,9 +1670,13 @@ series01HTML_label:Additional Series
|
||||||
series02HTML_label:Additional Series
|
series02HTML_label:Additional Series
|
||||||
series03HTML_label:Additional Series
|
series03HTML_label:Additional Series
|
||||||
|
|
||||||
|
## have to keep in order for name and URL to line up.
|
||||||
|
keep_in_order_collections:true
|
||||||
|
keep_in_order_collectionsUrl:true
|
||||||
|
|
||||||
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
||||||
## make entryHTML.
|
## make entryHTML.
|
||||||
make_linkhtml_entries:series00,series01,series02,series03
|
make_linkhtml_entries:series00,series01,series02,series03,collections
|
||||||
|
|
||||||
## AO3 doesn't have anything it calls 'genre'. The adapter used to be
|
## AO3 doesn't have anything it calls 'genre'. The adapter used to be
|
||||||
## hardcoded to include the site specific metadata freeformtags &
|
## hardcoded to include the site specific metadata freeformtags &
|
||||||
|
|
@ -2576,7 +2591,8 @@ extracategories:Buffy the Vampire Slayer
|
||||||
## series04,series04Url etc.
|
## series04,series04Url etc.
|
||||||
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
||||||
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
||||||
hits, bookmarks, collections, byline, bookmarked, bookmarktags,
|
hits, bookmarks, collections, collectionsUrl, collectionsHTML,
|
||||||
|
byline, bookmarked, bookmarktags,
|
||||||
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
||||||
markedforlater, restricted, series00, series01, series02, series03,
|
markedforlater, restricted, series00, series01, series02, series03,
|
||||||
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
||||||
|
|
@ -2591,6 +2607,7 @@ chapterstotal_label:Total Chapters
|
||||||
kudos_label:Kudos
|
kudos_label:Kudos
|
||||||
hits_label:Hits
|
hits_label:Hits
|
||||||
collections_label:Collections
|
collections_label:Collections
|
||||||
|
collectionsHTML_label:Collections
|
||||||
## Count of bookmarks on story by all users
|
## Count of bookmarks on story by all users
|
||||||
bookmarks_label:Bookmarks
|
bookmarks_label:Bookmarks
|
||||||
## Tags & Summary from *your* bookmark on the story. Only collected
|
## Tags & Summary from *your* bookmark on the story. Only collected
|
||||||
|
|
@ -2608,9 +2625,13 @@ series01HTML_label:Additional Series
|
||||||
series02HTML_label:Additional Series
|
series02HTML_label:Additional Series
|
||||||
series03HTML_label:Additional Series
|
series03HTML_label:Additional Series
|
||||||
|
|
||||||
|
## have to keep in order for name and URL to line up.
|
||||||
|
keep_in_order_collections:true
|
||||||
|
keep_in_order_collectionsUrl:true
|
||||||
|
|
||||||
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
||||||
## make entryHTML.
|
## make entryHTML.
|
||||||
make_linkhtml_entries:series00,series01,series02,series03
|
make_linkhtml_entries:series00,series01,series02,series03,collections
|
||||||
|
|
||||||
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
||||||
## hardcoded to include the site specific metadata freeformtags &
|
## hardcoded to include the site specific metadata freeformtags &
|
||||||
|
|
@ -2877,7 +2898,8 @@ cover_exclusion_regexp:/css/bir.png
|
||||||
## series04,series04Url etc.
|
## series04,series04Url etc.
|
||||||
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
||||||
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
||||||
hits, bookmarks, collections, byline, bookmarked, bookmarktags,
|
hits, bookmarks, collections, collectionsUrl, collectionsHTML,
|
||||||
|
byline, bookmarked, bookmarktags,
|
||||||
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
||||||
markedforlater, restricted, series00, series01, series02, series03,
|
markedforlater, restricted, series00, series01, series02, series03,
|
||||||
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
||||||
|
|
@ -2892,6 +2914,7 @@ chapterstotal_label:Total Chapters
|
||||||
kudos_label:Kudos
|
kudos_label:Kudos
|
||||||
hits_label:Hits
|
hits_label:Hits
|
||||||
collections_label:Collections
|
collections_label:Collections
|
||||||
|
collectionsHTML_label:Collections
|
||||||
## Count of bookmarks on story by all users
|
## Count of bookmarks on story by all users
|
||||||
bookmarks_label:Bookmarks
|
bookmarks_label:Bookmarks
|
||||||
## Tags & Summary from *your* bookmark on the story. Only collected
|
## Tags & Summary from *your* bookmark on the story. Only collected
|
||||||
|
|
@ -2909,9 +2932,13 @@ series01HTML_label:Additional Series
|
||||||
series02HTML_label:Additional Series
|
series02HTML_label:Additional Series
|
||||||
series03HTML_label:Additional Series
|
series03HTML_label:Additional Series
|
||||||
|
|
||||||
|
## have to keep in order for name and URL to line up.
|
||||||
|
keep_in_order_collections:true
|
||||||
|
keep_in_order_collectionsUrl:true
|
||||||
|
|
||||||
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
||||||
## make entryHTML.
|
## make entryHTML.
|
||||||
make_linkhtml_entries:series00,series01,series02,series03
|
make_linkhtml_entries:series00,series01,series02,series03,collections
|
||||||
|
|
||||||
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
||||||
## hardcoded to include the site specific metadata freeformtags &
|
## hardcoded to include the site specific metadata freeformtags &
|
||||||
|
|
@ -3250,7 +3277,8 @@ extracategories:Star Trek
|
||||||
## series04,series04Url etc.
|
## series04,series04Url etc.
|
||||||
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
||||||
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
||||||
hits, bookmarks, collections, byline, bookmarked, bookmarktags,
|
hits, bookmarks, collections, collectionsUrl, collectionsHTML,
|
||||||
|
byline, bookmarked, bookmarktags,
|
||||||
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
||||||
markedforlater, restricted, series00, series01, series02, series03,
|
markedforlater, restricted, series00, series01, series02, series03,
|
||||||
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
||||||
|
|
@ -3265,6 +3293,7 @@ chapterstotal_label:Total Chapters
|
||||||
kudos_label:Kudos
|
kudos_label:Kudos
|
||||||
hits_label:Hits
|
hits_label:Hits
|
||||||
collections_label:Collections
|
collections_label:Collections
|
||||||
|
collectionsHTML_label:Collections
|
||||||
## Count of bookmarks on story by all users
|
## Count of bookmarks on story by all users
|
||||||
bookmarks_label:Bookmarks
|
bookmarks_label:Bookmarks
|
||||||
## Tags & Summary from *your* bookmark on the story. Only collected
|
## Tags & Summary from *your* bookmark on the story. Only collected
|
||||||
|
|
@ -3282,9 +3311,13 @@ series01HTML_label:Additional Series
|
||||||
series02HTML_label:Additional Series
|
series02HTML_label:Additional Series
|
||||||
series03HTML_label:Additional Series
|
series03HTML_label:Additional Series
|
||||||
|
|
||||||
|
## have to keep in order for name and URL to line up.
|
||||||
|
keep_in_order_collections:true
|
||||||
|
keep_in_order_collectionsUrl:true
|
||||||
|
|
||||||
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
||||||
## make entryHTML.
|
## make entryHTML.
|
||||||
make_linkhtml_entries:series00,series01,series02,series03
|
make_linkhtml_entries:series00,series01,series02,series03,collections
|
||||||
|
|
||||||
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
||||||
## hardcoded to include the site specific metadata freeformtags &
|
## hardcoded to include the site specific metadata freeformtags &
|
||||||
|
|
@ -3516,7 +3549,8 @@ keep_style_attr: false
|
||||||
## series04,series04Url etc.
|
## series04,series04Url etc.
|
||||||
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
extra_valid_entries:fandoms, freeformtags, freefromtags,
|
||||||
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
ao3categories, comments, chapterslashtotal, chapterstotal, kudos,
|
||||||
hits, bookmarks, collections, byline, bookmarked, bookmarktags,
|
hits, bookmarks, collections, collectionsUrl, collectionsHTML,
|
||||||
|
byline, bookmarked, bookmarktags,
|
||||||
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
bookmarksummary, bookmarkprivate, bookmarkrec, subscribed,
|
||||||
markedforlater, restricted, series00, series01, series02, series03,
|
markedforlater, restricted, series00, series01, series02, series03,
|
||||||
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
series00Url, series01Url, series02Url, series03Url, series00HTML,
|
||||||
|
|
@ -3531,6 +3565,7 @@ chapterstotal_label:Total Chapters
|
||||||
kudos_label:Kudos
|
kudos_label:Kudos
|
||||||
hits_label:Hits
|
hits_label:Hits
|
||||||
collections_label:Collections
|
collections_label:Collections
|
||||||
|
collectionsHTML_label:Collections
|
||||||
## Count of bookmarks on story by all users
|
## Count of bookmarks on story by all users
|
||||||
bookmarks_label:Bookmarks
|
bookmarks_label:Bookmarks
|
||||||
## Tags & Summary from *your* bookmark on the story. Only collected
|
## Tags & Summary from *your* bookmark on the story. Only collected
|
||||||
|
|
@ -3548,9 +3583,13 @@ series01HTML_label:Additional Series
|
||||||
series02HTML_label:Additional Series
|
series02HTML_label:Additional Series
|
||||||
series03HTML_label:Additional Series
|
series03HTML_label:Additional Series
|
||||||
|
|
||||||
|
## have to keep in order for name and URL to line up.
|
||||||
|
keep_in_order_collections:true
|
||||||
|
keep_in_order_collectionsUrl:true
|
||||||
|
|
||||||
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
## Assume entryUrl, apply to "<a class='%slink' href='%s'>%s</a>" to
|
||||||
## make entryHTML.
|
## make entryHTML.
|
||||||
make_linkhtml_entries:series00,series01,series02,series03
|
make_linkhtml_entries:series00,series01,series02,series03,collections
|
||||||
|
|
||||||
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
## OTW doesn't have anything it calls 'genre'. The adapter used to be
|
||||||
## hardcoded to include the site specific metadata freeformtags &
|
## hardcoded to include the site specific metadata freeformtags &
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ name = "FanFicFare" # Required
|
||||||
#
|
#
|
||||||
# For a discussion on single-sourcing the version, see
|
# For a discussion on single-sourcing the version, see
|
||||||
# https://packaging.python.org/guides/single-sourcing-package-version/
|
# https://packaging.python.org/guides/single-sourcing-package-version/
|
||||||
version = "4.48.1"
|
version = "4.48.7"
|
||||||
|
|
||||||
# This is a one-line description or tagline of what your project does. This
|
# This is a one-line description or tagline of what your project does. This
|
||||||
# corresponds to the "Summary" metadata field:
|
# corresponds to the "Summary" metadata field:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue