commit python-fanficfare for openSUSE:Factory
Hello community, here is the log from the commit of package python-fanficfare for openSUSE:Factory checked in at 2019-05-03 22:47:26 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-fanficfare (Old) and /work/SRC/openSUSE:Factory/.python-fanficfare.new.5148 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "python-fanficfare" Fri May 3 22:47:26 2019 rev:8 rq:700318 version:3.7.6 Changes: -------- --- /work/SRC/openSUSE:Factory/python-fanficfare/python-fanficfare.changes 2019-04-28 20:15:41.750334864 +0200 +++ /work/SRC/openSUSE:Factory/.python-fanficfare.new.5148/python-fanficfare.changes 2019-05-03 22:47:26.915909991 +0200 @@ -1,0 +2,15 @@ +Fri May 3 08:45:55 CEST 2019 - Matej Cepl <mcepl@suse.com> + +- Update to 3.7.6: + - Fix CLI Upload to have correct version. + - Fix for BS halping with string conversions on PI update from + Saved Meta Column. + - More improvements for adapter_asianfanficscom, including + auto_sub feature, thanks oh45454545 + - Improvements for adapter_asianfanficscom, thanks oh45454545 + - Update adapter_asianfanficscom to fetch chapter texts from + JSON url. + - Ad wall indicator has changed for adapter_webnovelcom. + - Fix use_archived_author in AO3. + +------------------------------------------------------------------- Old: ---- FanFicFare-3.7.0.tar.gz New: ---- FanFicFare-3.7.6.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-fanficfare.spec ++++++ --- /var/tmp/diff_new_pack.slTqOD/_old 2019-05-03 22:47:27.411911130 +0200 +++ /var/tmp/diff_new_pack.slTqOD/_new 2019-05-03 22:47:27.415911139 +0200 @@ -20,7 +20,7 @@ %define modnamedown fanficfare %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-fanficfare -Version: 3.7.0 +Version: 3.7.6 Release: 0 Summary: Tool for making eBooks from stories on fanfiction and other web sites License: GPL-3.0-only ++++++ FanFicFare-3.7.0.tar.gz -> FanFicFare-3.7.6.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FanFicFare-3.7.0/calibre-plugin/__init__.py new/FanFicFare-3.7.6/calibre-plugin/__init__.py --- old/FanFicFare-3.7.0/calibre-plugin/__init__.py 2019-04-19 21:08:56.000000000 +0200 +++ new/FanFicFare-3.7.6/calibre-plugin/__init__.py 2019-04-24 05:29:17.000000000 +0200 @@ -33,7 +33,7 @@ from calibre.customize import InterfaceActionBase # pulled out from FanFicFareBase for saving in prefs.py -__version__ = (3, 7, 0) +__version__ = (3, 7, 6) ## 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.7.0/calibre-plugin/plugin-defaults.ini new/FanFicFare-3.7.6/calibre-plugin/plugin-defaults.ini --- old/FanFicFare-3.7.0/calibre-plugin/plugin-defaults.ini 2019-04-19 21:08:56.000000000 +0200 +++ new/FanFicFare-3.7.6/calibre-plugin/plugin-defaults.ini 2019-04-24 05:29:17.000000000 +0200 @@ -2133,10 +2133,11 @@ [www.asianfanfics.com] ## Unlike most sites, asianfanfics.com, instead of denying access to -## 'adult' content, will censor the text of stories to remove the -## 'adult' words. FanFicFare cannot detect when this happens, but if -## you set your username and password, FFF will log you in to prevent -## that. +## 'adult' or subscriber-only content, will censor the text of stories +## to remove 'adult' words or entire portions of the text. This is why +## an account is required to download stories from this site. It is +## also strongly recommended to consider enabling auto_sub in order to +## further avoid this from happening. #username:YourName #password:yourpassword @@ -2163,6 +2164,14 @@ ## chapter_start to remove the standard chapter title, as shown below. inject_chapter_title:false +## This website removes certain HTML tags and portions of the story +## from subscriber-only stories. It is strongly recommended to turn +## this option on. This will automatically subscribe you to such +## stories in order to acquire the unaltered text. You can +## unsubscribe manually on the website after the story has been +## downloaded. +auto_sub:false + [www.bdsmlibrary.com] ## Some sites also require the user to confirm they are adult for ## adult content. Uncomment by removing '#' in front of is_adult. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FanFicFare-3.7.0/fanficfare/adapters/adapter_archiveofourownorg.py new/FanFicFare-3.7.6/fanficfare/adapters/adapter_archiveofourownorg.py --- old/FanFicFare-3.7.0/fanficfare/adapters/adapter_archiveofourownorg.py 2019-04-19 21:08:56.000000000 +0200 +++ new/FanFicFare-3.7.6/fanficfare/adapters/adapter_archiveofourownorg.py 2019-04-24 05:29:17.000000000 +0200 @@ -225,8 +225,7 @@ # Hope Roy [archived by <a href="/users/ssa_archivist/pseuds/ssa_archivist" rel="author">ssa_archivist</a>] # </h3> # stripped:"Hope Roy [archived by ssa_archivist]" - - m = re.match(r'(?P<author>.*) \[archived by (?P<archivist>.*)\]',stripHTML(byline)) + m = re.match(r'(?P<author>.*) \[archived by ?(?P<archivist>.*)\]',stripHTML(byline)) if( m and len(alist) == 1 and self.getConfig('use_archived_author') ): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FanFicFare-3.7.0/fanficfare/adapters/adapter_asianfanficscom.py new/FanFicFare-3.7.6/fanficfare/adapters/adapter_asianfanficscom.py --- old/FanFicFare-3.7.0/fanficfare/adapters/adapter_asianfanficscom.py 2019-04-19 21:08:56.000000000 +0200 +++ new/FanFicFare-3.7.6/fanficfare/adapters/adapter_asianfanficscom.py 2019-04-24 05:29:17.000000000 +0200 @@ -4,6 +4,7 @@ import logging logger = logging.getLogger(__name__) import re +import json from ..htmlcleanup import stripHTML from .. import exceptions as exceptions @@ -70,45 +71,40 @@ else: params['username'] = self.getConfig("username") params['password'] = self.getConfig("password") + + if not params['username']: + raise exceptions.FailedToLogin(url,params['username']) + params['from_url'] = url params['csrf_aff_token'] = soup.find('input',{'name':'csrf_aff_token'})['value'] + if not params['csrf_aff_token']: + raise exceptions.FailedToDownload('Error when logging in. This usually means a change in the website code.') + loginUrl = 'https://' + self.getSiteDomain() + '/login/index' logger.info("Will now login to URL (%s) as (%s)" % (loginUrl, params['username'])) - d = self._postUrl(loginUrl, params, usecache=False) - - if params['username'] not in d: # check if username is mentioned in output (logged in as, var visitorName, etc.) - logger.info("Failed to login to URL %s as %s" % (loginUrl, params['username'])) + data = self._postUrl(loginUrl, params) + soup = self.make_soup(data) + if self.loginNeededCheck(soup): + logger.info('Failed to login to URL %s as %s' % (loginUrl, params['username'])) raise exceptions.FailedToLogin(url,params['username']) - return False - else: - return True - def doAdultCheck(self, url, soup): - check = soup.find('form',{'action':'/account/toggle_age'}) - if check: - logger.debug("Found adult check") - if self.is_adult or self.getConfig("is_adult"): - contentFilter = check.find('a',{'href':'/account/mark_over_18'}) #two different types of adult checks - if contentFilter: - loginUrl = 'https://' + self.getSiteDomain() + '/account/mark_over_18' - self._fetchUrl(loginUrl) - else: - params = {} - params['csrf_aff_token'] = check.find('input',{'name':'csrf_aff_token'})['value'] - params['is_of_age'] = '1' - params['current_url'] = '/story/view/' + self.story.getMetadata('storyId') - loginUrl = 'https://' + self.getSiteDomain() + '/account/toggle_age' - self._postUrl(loginUrl,params) - - data = self._fetchUrl(url,usecache=False) - soup = self.make_soup(data) - if "Are you over 18 years old" in data: - raise exceptions.FailedToDownload("Error downloading Chapter: %s! Missing required element!" % url) - else: - return soup + def loginNeededCheck(self,soup): + return soup.find('div',{'id':'login'}) != None + + def doStorySubscribe(self, url, soup): + subHref = soup.find('a',{'id':'subscribe'}) + if subHref: + #does not work when using https - 403 + subUrl = 'http://' + self.getSiteDomain() + subHref['href'] + self._fetchUrl(subUrl) + data = self._fetchUrl(url,usecache=False) + soup = self.make_soup(data) + check = soup.find('div',{'class':'click-to-read-full'}) + if check: + return False else: - raise exceptions.AdultCheckRequired(self.url) + return soup else: return False @@ -123,7 +119,6 @@ def doExtractChapterUrlsAndMetadata(self,get_cover=True): url = self.url logger.info("url: "+url) - try: data = self._fetchUrl(url) @@ -136,18 +131,23 @@ # use BeautifulSoup HTML parser to make everything easier to find. soup = self.make_soup(data) - # it is best to log in whenever possible, unless already logged in from cache.. - if self.password or self.getConfig("password") and "Logout" not in data: + if self.loginNeededCheck(soup): + # always login if not already to avoid lots of headaches self.performLogin(url,soup) + # refresh website after logging in data = self._fetchUrl(url,usecache=False) soup = self.make_soup(data) - elif "Logout" not in data: - logger.info('Note: Logging in is highly recommended, as this website censors text if not logged in.') - # adult check - self.checkSoup = self.doAdultCheck(url,soup) - if self.checkSoup: - soup = self.checkSoup + # subscription check + subCheck = soup.find('div',{'class':'click-to-read-full'}) + if subCheck and self.getConfig("auto_sub"): + subSoup = self.doStorySubscribe(url,soup) + if subSoup: + soup = subSoup + else: + raise exceptions.FailedToDownload("Error when subscribing to story. This usually means a change in the website code.") + elif subCheck and not self.getConfig("auto_sub"): + raise exceptions.FailedToDownload("This story is only available to subscribers. You can subscribe manually on the web site, or set auto_sub:true in personal.ini.") ## Title a = soup.find('h1', {'id': 'story-title'}) @@ -171,6 +171,7 @@ for index, chapter in enumerate(chapters): if chapter.text != 'Foreword': # skip the foreword self.add_chapter(chapter.text,'https://' + self.getSiteDomain() + chapter['value']) # note: AFF cuts off chapter names in list. this gets kind of fixed later on + # find timestamp a = soup.find('span', text='Updated') if a == None: @@ -189,7 +190,10 @@ self.story.setMetadata('status', 'In-Progress') # story description - a = soup.find('div', {'id':'story-description'}) + jsonlink = soup.find('link',href=re.compile(r'/api/forewords/[0-9]+/foreword_[0-9a-z]+.json')) + fore_json = json.loads(self._fetchUrl(jsonlink['href'])) + content = self.make_soup(fore_json['post']).find('body') # BS4 adds <html><body> if not present. + a = content.find('div', {'id':'story-description'}) if a: self.setDescription(url,a) @@ -216,6 +220,12 @@ a = a.parent.find('time') self.story.setMetadata('dateUpdated', makeDate(a['datetime'], self.dateformat)) + # word count + a = soup.find('span', text='Total Word Count') + if a: + a = a.find_next('span') + self.story.setMetadata('numWords', int(a.text.split()[0])) + # upvote, subs, and views a = soup.find('div',{'class':'title-meta'}) spans = a.findAll('span', recursive=False) @@ -241,22 +251,21 @@ data = self._fetchUrl(url) soup = self.make_soup(data) - # have to do adult check here as well because individual chapters can be marked as mature - if not self.checkSoup: - self.checkSoup = self.doAdultCheck(url,soup) - if self.checkSoup: - soup = self.checkSoup - - # grab contents - content = soup.find('div', {'id': 'user-submitted-body'}) - if content: + try: + # https://www.asianfanfics.com/api/chapters/4791923/chapter_46d32e413d1a702a26... + jsonlink = soup.find('link',href=re.compile(r'/api/chapters/[0-9]+/chapter_[0-9a-z]+.json')) + chap_json = json.loads(self._fetchUrl(jsonlink['href'])) + content = self.make_soup(chap_json['post']).find('body') # BS4 adds <html><body> if not present. + content.name='div' # change body to a div. if self.getConfig('inject_chapter_title'): + # the dumbest workaround ever for the abbreviated chapter titles from before logger.debug("Injecting full-length chapter title") newTitle = soup.find('h1', {'id' : 'chapter-title'}).text - newTitle = self.make_soup('<h3>%s</h3>' % (newTitle)) # the dumbest workaround ever for the abbreviated chapter titles from before + newTitle = self.make_soup('<h3>%s</h3>' % (newTitle)).find('body') # BS4 adds <html><body> if not present. + newTitle.name='div' # change body to a div. newTitle.append(content) return self.utf8FromSoup(url,newTitle) else: return self.utf8FromSoup(url,content) - else: - raise exceptions.FailedToDownload("Error downloading Chapter: %s! Missing required element!" % url) + except Exception as e: + raise exceptions.FailedToDownload("Error downloading Chapter: %s %s!" % (url,e)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FanFicFare-3.7.0/fanficfare/adapters/adapter_webnovelcom.py new/FanFicFare-3.7.6/fanficfare/adapters/adapter_webnovelcom.py --- old/FanFicFare-3.7.0/fanficfare/adapters/adapter_webnovelcom.py 2019-04-19 21:08:56.000000000 +0200 +++ new/FanFicFare-3.7.6/fanficfare/adapters/adapter_webnovelcom.py 2019-04-24 05:29:17.000000000 +0200 @@ -179,11 +179,9 @@ for volume in jsondata["data"]["volumeItems"]: for chap in volume["chapterItems"]: # Only allow free and VIP type 1 chapters - if chap['isVip'] not in [0]: # removed VIP type 1 - # chapter (ad-wall'ed) - # because the ad-wall - # bypass code stopped - # working. --JM + if chap['isAuth'] not in [1]: # Ad wall indicator + # seems to have changed + # --JM continue chap_title = 'Chapter ' + unicode(chap['index']) + ' - ' + chap['name'] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FanFicFare-3.7.0/fanficfare/cli.py new/FanFicFare-3.7.6/fanficfare/cli.py --- old/FanFicFare-3.7.0/fanficfare/cli.py 2019-04-19 21:08:56.000000000 +0200 +++ new/FanFicFare-3.7.6/fanficfare/cli.py 2019-04-24 05:29:17.000000000 +0200 @@ -39,7 +39,7 @@ def pickle_load(f): return pickle.load(f,encoding="bytes") -version="3.7.0" +version="3.7.6" os.environ['CURRENT_VERSION_ID']=version global_cache = 'global_cache' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FanFicFare-3.7.0/fanficfare/configurable.py new/FanFicFare-3.7.6/fanficfare/configurable.py --- old/FanFicFare-3.7.0/fanficfare/configurable.py 2019-04-19 21:08:56.000000000 +0200 +++ new/FanFicFare-3.7.6/fanficfare/configurable.py 2019-04-24 05:29:17.000000000 +0200 @@ -244,6 +244,8 @@ 'inject_chapter_title':(['asianfanfics.com'],None,boollist), + 'auto_sub':(['asianfanfics.com'],None,boollist), + # eFiction Base adapters allow bulk_load # kept forgetting to add them, so now it's automatic. 'bulk_load':(adapters.get_bulk_load_sites(), @@ -441,6 +443,7 @@ 'conditionals_use_lists', 'description_in_chapter', 'inject_chapter_title', + 'auto_sub', 'titlepage_end', 'titlepage_entries', 'titlepage_entry', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FanFicFare-3.7.0/fanficfare/defaults.ini new/FanFicFare-3.7.6/fanficfare/defaults.ini --- old/FanFicFare-3.7.0/fanficfare/defaults.ini 2019-04-19 21:08:56.000000000 +0200 +++ new/FanFicFare-3.7.6/fanficfare/defaults.ini 2019-04-24 05:29:17.000000000 +0200 @@ -2167,10 +2167,11 @@ [www.asianfanfics.com] ## Unlike most sites, asianfanfics.com, instead of denying access to -## 'adult' content, will censor the text of stories to remove the -## 'adult' words. FanFicFare cannot detect when this happens, but if -## you set your username and password, FFF will log you in to prevent -## that. +## 'adult' or subscriber-only content, will censor the text of stories +## to remove 'adult' words or entire portions of the text. This is why +## an account is required to download stories from this site. It is +## also strongly recommended to consider enabling auto_sub in order to +## further avoid this from happening. #username:YourName #password:yourpassword @@ -2197,6 +2198,14 @@ ## chapter_start to remove the standard chapter title, as shown below. inject_chapter_title:false +## This website removes certain HTML tags and portions of the story +## from subscriber-only stories. It is strongly recommended to turn +## this option on. This will automatically subscribe you to such +## stories in order to acquire the unaltered text. You can +## unsubscribe manually on the website after the story has been +## downloaded. +auto_sub:false + [www.bdsmlibrary.com] ## Some sites also require the user to confirm they are adult for ## adult content. Uncomment by removing '#' in front of is_adult. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FanFicFare-3.7.0/fanficfare/story.py new/FanFicFare-3.7.6/fanficfare/story.py --- old/FanFicFare-3.7.0/fanficfare/story.py 2019-04-19 21:08:56.000000000 +0200 +++ new/FanFicFare-3.7.6/fanficfare/story.py 2019-04-24 05:29:17.000000000 +0200 @@ -703,7 +703,10 @@ elif 'list' in tag['class']: val = [] for i in tag.find_all('li'): - val.append(i.string) + # keeps & but removes <li></li> because BS4 + # halps by converting NavigableString to string + # (losing entities) + val.append(unicode(i)[4:-5]) elif 'int' in tag['class']: # Python reports true when asked isinstance(<bool>, (int)) # bools now converted to unicode when set. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FanFicFare-3.7.0/setup.py new/FanFicFare-3.7.6/setup.py --- old/FanFicFare-3.7.0/setup.py 2019-04-19 21:08:56.000000000 +0200 +++ new/FanFicFare-3.7.6/setup.py 2019-04-24 05:29:17.000000000 +0200 @@ -27,7 +27,7 @@ name=package_name, # Versions should comply with PEP440. - version="3.7.0", + version="3.7.6", 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.7.0/webservice/app.yaml new/FanFicFare-3.7.6/webservice/app.yaml --- old/FanFicFare-3.7.0/webservice/app.yaml 2019-04-19 21:08:56.000000000 +0200 +++ new/FanFicFare-3.7.6/webservice/app.yaml 2019-04-24 05:29:17.000000000 +0200 @@ -1,6 +1,6 @@ # ffd-retief-hrd fanficfare application: fanficfare -version: 3-7-0 +version: 3-7-6 runtime: python27 api_version: 1 threadsafe: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FanFicFare-3.7.0/webservice/index.html new/FanFicFare-3.7.6/webservice/index.html --- old/FanFicFare-3.7.0/webservice/index.html 2019-04-19 21:08:56.000000000 +0200 +++ new/FanFicFare-3.7.6/webservice/index.html 2019-04-24 05:29:17.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-6-0.fanficfare.appspot.com">previous version</a> + <a href="https://3-7-0.fanficfare.appspot.com">previous version</a> is also available for you to use if necessary. </p> <div id='error'>
participants (1)
-
root