From 2f77bd9e979fe7e7f15b64ced749aaf1e53a2892 Mon Sep 17 00:00:00 2001 From: kilandra <99921002+kilandra@users.noreply.github.com> Date: Wed, 1 Oct 2025 02:54:51 +0200 Subject: [PATCH] Spiritfanfiction login, closes #1247 Add login functionality to Spiritfanfiction.com --- calibre-plugin/plugin-defaults.ini | 7 +++ .../adapters/adapter_spiritfanfictioncom.py | 51 ++++++++++++++++++- fanficfare/defaults.ini | 7 +++ 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/calibre-plugin/plugin-defaults.ini b/calibre-plugin/plugin-defaults.ini index a92ae269..a248d4ee 100644 --- a/calibre-plugin/plugin-defaults.ini +++ b/calibre-plugin/plugin-defaults.ini @@ -4306,6 +4306,13 @@ extraships:Harry Potter/Ginny Weasley website_encodings:Windows-1252,utf8 [www.spiritfanfiction.com] +## Some sites require login (or login for some rated stories) The +## program can prompt you, or you can save it in config. In +## commandline version, this should go in your personal.ini, not +## defaults.ini. +#username:YourName +#password:yourpassword + use_basic_cache:true extra_valid_entries: freeformtags,bookmarks,comments,hits,kudos diff --git a/fanficfare/adapters/adapter_spiritfanfictioncom.py b/fanficfare/adapters/adapter_spiritfanfictioncom.py index 7de02038..0bf26fdb 100644 --- a/fanficfare/adapters/adapter_spiritfanfictioncom.py +++ b/fanficfare/adapters/adapter_spiritfanfictioncom.py @@ -76,6 +76,43 @@ class SpiritFanfictionComAdapter(BaseSiteAdapter): return 'spirit' + # Login + def needToLoginCheck(self, data): + if 'nao-logado' in data or 'Acessar sua Conta' in data: + return True + return False + + + def performLogin(self, url, data): + + params = {} + params['Usuario'] = self.getConfig("username") + params['Senha'] = self.getConfig("password") + params['Login'] = 'Fazer Login' + + login_url = 'https://' + self.getSiteDomain() + '/login' + logger.info("Will now login to URL (%s) as (%s)" % (login_url, + params['Usuario'])) + + login_page_html = self.get_request(login_url, usecache=False) + login_page_soup = self.make_soup(login_page_html) + + session_input = login_page_soup.find('input', {'name': "SessionHash"}) + params['SessionHash'] = session_input['value'] if session_input else "" + + return_url_input = login_page_soup.find('input', {'name': 'ReturnUrl'}) + params['ReturnUrl'] = return_url_input['value'] if return_url_input else "" + + response_html = self.post_request(login_url, params) + + if 'nao-logado' in response_html or "Acessar sua Conta" in response_html: + logger.info("Failed to login to URL %s as %s" % (login_url, + params['Usuario'])) + raise exceptions.FailedToLogin(login_url,params['Usuario']) + else: + return True + + def getStoryId(self, url): # get storyId from url--url validation guarantees query correct @@ -89,9 +126,11 @@ class SpiritFanfictionComAdapter(BaseSiteAdapter): def extractChapterUrlsAndMetadata(self): data = self.get_request(self.url) - # use BeautifulSoup HTML parser to make everything easier to find. + if self.needToLoginCheck(data): + self.performLogin(self.url, data) + data = self.get_request(self.url,usecache=False) + soup = self.make_soup(data) - # Now go hunting for all the meta data and the chapter list. # Title title = soup.find('h1', {'class':'tituloPrincipal'}) @@ -344,3 +383,11 @@ class SpiritFanfictionComAdapter(BaseSiteAdapter): element.string = decoded_email return unicode(html_text) + + def before_get_urls_from_page(self,url,normalize): + + if self.getConfig("username"): + + data = self.get_request(url) + if self.needToLoginCheck(data): + self.performLogin(url, data) diff --git a/fanficfare/defaults.ini b/fanficfare/defaults.ini index dbb59508..ee53abed 100644 --- a/fanficfare/defaults.ini +++ b/fanficfare/defaults.ini @@ -4279,6 +4279,13 @@ extraships:Harry Potter/Ginny Weasley website_encodings:Windows-1252,utf8 [www.spiritfanfiction.com] +## Some sites require login (or login for some rated stories) The +## program can prompt you, or you can save it in config. In +## commandline version, this should go in your personal.ini, not +## defaults.ini. +#username:YourName +#password:yourpassword + use_basic_cache:true extra_valid_entries: freeformtags,bookmarks,comments,hits,kudos