From 0ed828ec3b3dad986d6710dc561fd8c0bf16debe Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Sun, 17 Jan 2021 13:45:16 -0600 Subject: [PATCH] Clear metadata cache after adapter metadata fetch. Cached metadata values may not be replace_metadata processed if fetched before their conditional dependencies. Revealed by AO3 one-shots using title for chapter name. --- fanficfare/adapters/base_adapter.py | 12 ++++++++++++ fanficfare/story.py | 6 +++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/fanficfare/adapters/base_adapter.py b/fanficfare/adapters/base_adapter.py index d609533a..63db009a 100644 --- a/fanficfare/adapters/base_adapter.py +++ b/fanficfare/adapters/base_adapter.py @@ -296,6 +296,18 @@ class BaseSiteAdapter(Configurable): def getStoryMetadataOnly(self,get_cover=True): if not self.metadataDone: self.doExtractChapterUrlsAndMetadata(get_cover=get_cover) + ## Due to some adapters calling getMetadata()etc, values + ## may have been cached during metadata collection and + ## *before* other values that their replace_metadata + ## depends on. + ## + ## Re-arranging the collection order isn't a good + ## solution--title could depend on category just as easily + ## as category on title. + ## + ## This clears the cache before title page etc and Calibre + ## at least. + self.story.clear_processed_metadata_cache() if not self.story.getMetadataRaw('dateUpdated'): if self.story.getMetadataRaw('datePublished'): diff --git a/fanficfare/story.py b/fanficfare/story.py index 02285057..9eb8a2bc 100644 --- a/fanficfare/story.py +++ b/fanficfare/story.py @@ -477,7 +477,7 @@ class Story(Configurable): self.replacements_prepped = False self.chapter_error_count = 0 - + def prepare_replacements(self): if not self.replacements_prepped and not self.is_lightweight(): # logger.debug("prepare_replacements") @@ -504,6 +504,10 @@ class Story(Configurable): self.in_ex_cludes[ie] = set_in_ex_clude(ies) self.replacements_prepped = True + def clear_processed_metadata_cache(self): + self.processed_metadata_cache = {} + self.processed_metadata_list_cache = {} + def set_chapters_range(self,first=None,last=None): self.chapter_first=first self.chapter_last=last