diff --git a/calibre-plugin/dialogs.py b/calibre-plugin/dialogs.py index ffa4c8e5..0758c128 100644 --- a/calibre-plugin/dialogs.py +++ b/calibre-plugin/dialogs.py @@ -133,7 +133,7 @@ class RejectUrlEntry: if addreasontext: self.note = self.note + ' - ' + addreasontext - if normalize: + if normalize and self.url: self.url = getNormalStoryURL(self.url) self.valid = self.url != None diff --git a/fanficfare/adapters/__init__.py b/fanficfare/adapters/__init__.py index e112211c..a33ff700 100644 --- a/fanficfare/adapters/__init__.py +++ b/fanficfare/adapters/__init__.py @@ -250,13 +250,13 @@ def getNormalStoryURLSite(url): ## Originally defined for INI [storyUrl] sections where story URL ## contains a title that can change, now also used for reject list. +## waaaay faster with classmethod. def get_section_url(url): - with lightweight_adapter(url) as adapter: - if adapter: - return adapter.get_section_url(url) - else: - logger.debug("WTF? no adapter?") - return None + cls = _get_class_for(url)[0] + if cls: + return cls.get_section_url(url) + else: + return None def getAdapter(config,url,anyurl=False): diff --git a/fanficfare/adapters/adapter_fanfictionnet.py b/fanficfare/adapters/adapter_fanfictionnet.py index 1264bc08..507bc8e5 100644 --- a/fanficfare/adapters/adapter_fanfictionnet.py +++ b/fanficfare/adapters/adapter_fanfictionnet.py @@ -69,19 +69,26 @@ class FanFictionNetSiteAdapter(BaseSiteAdapter): self._setURL("https://"+self.getSiteDomain()\ +"/s/"+self.story.getMetadata('storyId')+"/1/"+self.urltitle) - def get_section_url(self,url): + ## here so getSiteURLPattern and get_section_url(class method) can + ## both use it. Note adapter_fictionpresscom has one too. + @classmethod + def _get_site_url_pattern(cls): + return r"https?://(www|m)?\.fanfiction\.net/s/(?P\d+)(/\d+)?(/(?P[^/]+))?/?$" + + @classmethod + def get_section_url(cls,url): ## minimal URL used for section names in INI and reject list ## for comparison # logger.debug("pre--url:%s"%url) - m = re.match(self.getSiteURLPattern(),url) + m = re.match(cls._get_site_url_pattern(),url) if m: - url = "https://"+self.getSiteDomain()\ + url = "https://"+cls.getSiteDomain()\ +"/s/"+m.group('id')+"/1/" # logger.debug("post-url:%s"%url) return url def getSiteURLPattern(self): - return r"https?://(www|m)?\.fanfiction\.net/s/(?P<id>\d+)(/\d+)?(/(?P<title>[^/]+))?/?$" + return self._get_site_url_pattern() def _fetchUrl(self,url,parameters=None,extrasleep=1.0,usecache=True): ## ffnet(and, I assume, fpcom) tends to fail more if hit too diff --git a/fanficfare/adapters/adapter_fictionpresscom.py b/fanficfare/adapters/adapter_fictionpresscom.py index 692dd201..7faad36b 100644 --- a/fanficfare/adapters/adapter_fictionpresscom.py +++ b/fanficfare/adapters/adapter_fictionpresscom.py @@ -44,8 +44,9 @@ class FictionPressComSiteAdapter(FanFictionNetSiteAdapter): def getSiteExampleURLs(cls): return "https://www.fictionpress.com/s/1234/1/ https://www.fictionpress.com/s/1234/12/ http://www.fictionpress.com/s/1234/1/Story_Title http://m.fictionpress.com/s/1234/1/" - def getSiteURLPattern(self): - return r"https?://(www|m)?\.fictionpress\.com/s/(?P<id>\d+)(/\d+)?(/(?P<title>[^/]+))?/?$" + @classmethod + def _get_site_url_pattern(cls): + return r"https?://(www|m)?\.fanfiction\.net/s/(?P<id>\d+)(/\d+)?(/(?P<title>[^/]+))?/?$" def getClass(): return FictionPressComSiteAdapter diff --git a/fanficfare/adapters/base_adapter.py b/fanficfare/adapters/base_adapter.py index 94eac635..1628683f 100644 --- a/fanficfare/adapters/base_adapter.py +++ b/fanficfare/adapters/base_adapter.py @@ -119,7 +119,8 @@ class BaseSiteAdapter(Configurable): ''' return False - def get_section_url(self,url): + @classmethod + def get_section_url(cls,url): ''' For adapters that have story URLs that can change. This is applied both to the story URL (saved to metadata as diff --git a/fanficfare/adapters/base_xenforoforum_adapter.py b/fanficfare/adapters/base_xenforoforum_adapter.py index f699b692..5b59a6fe 100644 --- a/fanficfare/adapters/base_xenforoforum_adapter.py +++ b/fanficfare/adapters/base_xenforoforum_adapter.py @@ -182,12 +182,13 @@ class BaseXenForoForumAdapter(BaseSiteAdapter): return (is_chapter_url,url) - def get_section_url(self,url): + @classmethod + def get_section_url(cls,url): ## domain is checked in configuration loop. Can't check for ## storyId, because this is called before story url has been ## parsed. # logger.debug("pre--url:%s"%url) - url = re.sub(re.escape(self.getPathPrefix())+r'threads/.*\.(?P<id>[0-9]+)/',self.getPathPrefix()+r'threads/\g<id>/',url) + url = re.sub(re.escape(cls.getPathPrefix())+r'threads/.*\.(?P<id>[0-9]+)/',cls.getPathPrefix()+r'threads/\g<id>/',url) # logger.debug("post-url:%s"%url) return url