diff --git a/calibre-plugin/plugin-defaults.ini b/calibre-plugin/plugin-defaults.ini
index 04aec785..5996da4c 100644
--- a/calibre-plugin/plugin-defaults.ini
+++ b/calibre-plugin/plugin-defaults.ini
@@ -1,4 +1,4 @@
-# Copyright 2015 Fanficdownloader team, 2019 FanFicFare team
+# Copyright 2015 Fanficdownloader team, 2020 FanFicFare team
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -1874,17 +1874,6 @@ website_encodings:Windows-1252,utf8
## Site dedicated to these categories/characters/ships
extracategories:The Office
-[nfacommunity.com]
-## Some sites do not require a login, but do require the user to
-## confirm they are adult for adult content. In commandline version,
-## this should go in your personal.ini, not defaults.ini.
-#is_adult:true
-
-## Site dedicated to these categories/characters/ships
-extracategories:NCIS
-
-website_encodings:Windows-1252,utf8
-
[nha.magical-worlds.us]
## Site dedicated to these categories/characters/ships
extracategories:Buffy: The Vampire Slayer
diff --git a/fanficfare/adapters/__init__.py b/fanficfare/adapters/__init__.py
index c56a0d2f..378db018 100644
--- a/fanficfare/adapters/__init__.py
+++ b/fanficfare/adapters/__init__.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright 2011 Fanficdownloader team, 2019 FanFicFare team
+# Copyright 2011 Fanficdownloader team, 2020 FanFicFare team
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -48,7 +48,6 @@ from . import adapter_whoficcom
from . import adapter_siyecouk
from . import adapter_archiveofourownorg
from . import adapter_ficbooknet
-from . import adapter_nfacommunitycom
from . import adapter_midnightwhispers
from . import adapter_ksarchivecom
from . import adapter_archiveskyehawkecom
diff --git a/fanficfare/adapters/adapter_nfacommunitycom.py b/fanficfare/adapters/adapter_nfacommunitycom.py
deleted file mode 100644
index e7da293b..00000000
--- a/fanficfare/adapters/adapter_nfacommunitycom.py
+++ /dev/null
@@ -1,289 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2011 Fanficdownloader team, 2018 FanFicFare team
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# Software: eFiction
-from __future__ import absolute_import
-import logging
-logger = logging.getLogger(__name__)
-import re
-from ..htmlcleanup import stripHTML
-from .. import exceptions as exceptions
-
-# py2 vs py3 transition
-from ..six import text_type as unicode
-from ..six.moves.urllib.error import HTTPError
-
-from .base_adapter import BaseSiteAdapter, makeDate
-
-# Search for XXX comments--that's where things are most likely to need changing.
-
-# This function is called by the downloader in all adapter_*.py files
-# in this dir to register the adapter class. So it needs to be
-# updated to reflect the class below it. That, plus getSiteDomain()
-# take care of 'Registering'.
-def getClass():
- return NfaCommunityComAdapter # XXX
-
-# Class name has to be unique. Our convention is camel case the
-# sitename with Adapter at the end. www is skipped.
-class NfaCommunityComAdapter(BaseSiteAdapter): # XXX
-
- def __init__(self, config, url):
- BaseSiteAdapter.__init__(self, config, url)
-
- self.is_adult=False
-
- # get storyId from url--url validation guarantees query is only sid=1234
- self.story.setMetadata('storyId',self.parsedUrl.query.split('=',)[1])
-
-
- # normalized story URL.
- # XXX Most sites don't have the /fanfic part. Replace all to remove it usually.
- self._setURL('http://' + self.getSiteDomain() + '/viewstory.php?sid='+self.story.getMetadata('storyId'))
-
- # Each adapter needs to have a unique site abbreviation.
- self.story.setMetadata('siteabbrev','nfa') # XXX
-
- # The date format will vary from site to site.
- # http://docs.python.org/library/datetime.html#strftime-strptime-behavior
- self.dateformat = "%m/%d/%Y" # XXX
-
- @classmethod
- def getAcceptDomains(cls):
- return ['www.nfacommunity.com','nfacommunity.com']
-
- @staticmethod # must be @staticmethod, don't remove it.
- def getSiteDomain():
- # The site domain. Does have www here, if it uses it.
- return 'nfacommunity.com' # XXX
-
- @classmethod
- def getSiteExampleURLs(cls):
- return "http://"+cls.getSiteDomain()+"/viewstory.php?sid=1234"
-
- def getSiteURLPattern(self):
- return "http://(www.)?"+re.escape(self.getSiteDomain()+"/viewstory.php?sid=")+r"\d+$"
-
- ## Getting the chapter list and the meta data, plus 'is adult' checking.
- def extractChapterUrlsAndMetadata(self):
-
- if self.is_adult or self.getConfig("is_adult"):
- # Weirdly, different sites use different warning numbers.
- # If the title search below fails, there's a good chance
- # you need a different number. print data at that point
- # and see what the 'click here to continue' url says.
-
- # Furthermore, there's a couple sites now with more than
- # one warning level for different ratings. And they're
- # fussy about it. nfacommunity has two: 4 & 5.
- # we'll try 5 first.
- addurl = "&ageconsent=ok&warning=5" # XXX
- else:
- addurl=""
-
- # index=1 makes sure we see the story chapter index. Some
- # sites skip that for one-chapter stories.
- url = self.url+'&index=1'+addurl
- logger.debug("URL: "+url)
-
- try:
- data = self._fetchUrl(url)
- except HTTPError as e:
- if e.code == 404:
- raise exceptions.StoryDoesNotExist(self.url)
- else:
- raise e
-
- # The actual text that is used to announce you need to be an
- # adult varies from site to site. Again, print data before
- # the title search to troubleshoot.
-
- # Since the warning text can change by warning level, let's
- # look for the warning pass url. nfacommunity uses
- # &warning= -- actually, so do other sites. Must be an
- # eFiction book.
-
- # viewstory.php?sid=1882&warning=4
- # viewstory.php?sid=1654&ageconsent=ok&warning=5
- #print data
- #m = re.search(r"'viewstory.php\?sid=1882(&warning=4)'",data)
- m = re.search(r"'viewstory.php\?sid=\d+((?:&ageconsent=ok)?&warning=\d+)'",data)
- if m != None:
- if self.is_adult or self.getConfig("is_adult"):
- # We tried the default and still got a warning, so
- # let's pull the warning number from the 'continue'
- # link and reload data.
- addurl = m.group(1)
- # correct stupid & error in url.
- addurl = addurl.replace("&","&")
- url = self.url+'&index=1'+addurl
- logger.debug("URL 2nd try: "+url)
-
- try:
- data = self._fetchUrl(url)
- except HTTPError as e:
- if e.code == 404:
- raise exceptions.StoryDoesNotExist(self.url)
- else:
- raise e
- else:
- raise exceptions.AdultCheckRequired(self.url)
-
- if "Access denied. This story has not been validated by the adminstrators of this site." in data:
- raise exceptions.AccessDenied(self.getSiteDomain() +" says: Access denied. This story has not been validated by the adminstrators of this site.")
-
- # use BeautifulSoup HTML parser to make everything easier to find.
- soup = self.make_soup(data)
-
- # Now go hunting for all the meta data and the chapter list.
-
- ## Title
- a = soup.find('a', href=re.compile(r'viewstory.php\?sid='+self.story.getMetadata('storyId')+"$"))
- self.story.setMetadata('title',stripHTML(a))
-
- # Find authorid and URL from... author url.
- a = soup.find('a', href=re.compile(r"viewuser.php\?uid=\d+"))
- self.story.setMetadata('authorId',a['href'].split('=')[1])
- self.story.setMetadata('authorUrl','http://'+self.host+'/'+a['href'])
- self.story.setMetadata('author',a.string)
-
- # Find the chapters:
- for chapter in soup.findAll('a', href=re.compile(r'viewstory.php\?sid='+self.story.getMetadata('storyId')+"&chapter=\d+$")):
- # just in case there's tags, like in chapter titles.
- self.add_chapter(chapter,'http://'+self.host+'/'+chapter['href']+addurl)
-
-
-
-
- # eFiction sites don't help us out a lot with their meta data
- # formating, so it's a little ugly.
-
- # utility method
- def defaultGetattr(d,k):
- try:
- return d[k]
- except:
- return ""
-
- # Rated: NC-17
etc
- labels = soup.findAll('span',{'class':'label'})
- for labelspan in labels:
- value = labelspan.nextSibling
- label = labelspan.string
-
- if 'Summary' in label:
- ## Everything until the next span class='label'
- svalue = ""
- while 'label' not in defaultGetattr(value,'class'):
- svalue += unicode(value)
- # poor HTML(unclosed
for one) can cause run on - # over the next label. - if '' in svalue: - svalue = svalue[0:svalue.find('')] - break - else: - value = value.nextSibling - self.setDescription(url,svalue) - - if 'Rated' in label: - self.story.setMetadata('rating', value) - - if 'Word count' in label: - self.story.setMetadata('numWords', value) - - if 'Categories' in label: - cats = labelspan.parent.findAll('a',href=re.compile(r'browse.php\?type=categories')) - catstext = [cat.string for cat in cats] - for cat in catstext: - self.story.addToList('category',cat.string) - - if 'Characters' in label: - chars = labelspan.parent.findAll('a',href=re.compile(r'browse.php\?type=characters')) - charstext = [char.string for char in chars] - for char in charstext: - self.story.addToList('characters',char.string) - - ## Not all sites use Genre, but there's no harm to - ## leaving it in. Check to make sure the type_id number - ## is correct, though--it's site specific. - if 'Genre' in label: - genres = labelspan.parent.findAll('a',href=re.compile(r'browse.php\?type=class&type_id=2')) # XXX - genrestext = [genre.string for genre in genres] - self.genre = ', '.join(genrestext) - for genre in genrestext: - self.story.addToList('genre',genre.string) - - ## Not all sites use Warnings, but there's no harm to - ## leaving it in. Check to make sure the type_id number - ## is correct, though--it's site specific. - if 'Warnings' in label: - warnings = labelspan.parent.findAll('a',href=re.compile(r'browse.php\?type=class&type_id=2')) # XXX - warningstext = [warning.string for warning in warnings] - self.warning = ', '.join(warningstext) - for warning in warningstext: - self.story.addToList('warnings',warning.string) - - if 'Completed' in label: - if 'Yes' in value: - self.story.setMetadata('status', 'Completed') - else: - self.story.setMetadata('status', 'In-Progress') - - if 'Published' in label: - self.story.setMetadata('datePublished', makeDate(stripHTML(value), self.dateformat)) - - if 'Updated' in label: - # there's a stray [ at the end. - #value = value[0:-1] - self.story.setMetadata('dateUpdated', makeDate(stripHTML(value), self.dateformat)) - - try: - # Find Series name from series URL. - a = soup.find('a', href=re.compile(r"viewseries.php\?seriesid=\d+")) - series_name = a.string - series_url = 'http://'+self.host+'/'+a['href'] - - # use BeautifulSoup HTML parser to make everything easier to find. - seriessoup = self.make_soup(self._fetchUrl(series_url)) - storyas = seriessoup.findAll('a', href=re.compile(r'viewstory.php\?sid=\d+')) - i=1 - for a in storyas: - # skip 'report this' and 'TOC' links - if 'contact.php' not in a['href'] and 'index' not in a['href']: - if a['href'] == ('viewstory.php?sid='+self.story.getMetadata('storyId')): - self.setSeries(series_name, i) - self.story.setMetadata('seriesUrl',series_url) - break - i+=1 - - except: - # I find it hard to care if the series parsing fails - pass - - # grab the text for an individual chapter. - def getChapterText(self, url): - - logger.debug('Getting chapter text from: %s' % url) - - soup = self.make_soup(self._fetchUrl(url)) - - div = soup.find('div', {'id' : 'story'}) - - if None == div: - raise exceptions.FailedToDownload("Error downloading Chapter: %s! Missing required element!" % url) - - return self.utf8FromSoup(url,div) diff --git a/fanficfare/defaults.ini b/fanficfare/defaults.ini index 51f219db..508cf793 100644 --- a/fanficfare/defaults.ini +++ b/fanficfare/defaults.ini @@ -1,4 +1,4 @@ -# Copyright 2015 Fanficdownloader team, 2019 FanFicFare team +# Copyright 2015 Fanficdownloader team, 2020 FanFicFare team # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -1910,17 +1910,6 @@ website_encodings:Windows-1252,utf8 ## Site dedicated to these categories/characters/ships extracategories:The Office -[nfacommunity.com] -## Some sites do not require a login, but do require the user to -## confirm they are adult for adult content. In commandline version, -## this should go in your personal.ini, not defaults.ini. -#is_adult:true - -## Site dedicated to these categories/characters/ships -extracategories:NCIS - -website_encodings:Windows-1252,utf8 - [nha.magical-worlds.us] ## Site dedicated to these categories/characters/ships extracategories:Buffy: The Vampire Slayer