Deprecate underscore-prefixed parent classes

This is trying to strike a balance between updating as much existing
classes as possible, but not making the diff too big...
This commit is contained in:
Tobias Gruetzmacher 2022-06-06 12:08:32 +02:00
parent a640580826
commit 8e1e398a8d
65 changed files with 442 additions and 441 deletions

View file

@ -8,7 +8,7 @@ from re import compile, escape, MULTILINE
from ..util import tagre
from ..scraper import _BasicScraper, _ParserScraper
from ..helpers import regexNamer, bounceStarter, indirectStarter
from .common import _WordPressScraper, _WPNavi, _WPWebcomic
from .common import WordPressScraper, WordPressNavi, WordPressWebcomic
class AbstruseGoose(_ParserScraper):
@ -88,7 +88,7 @@ class AdventuresOfFifne(_ParserScraper):
return super(AdventuresOfFifne, self).getPrevUrl(url, data)
class AfterStrife(_WPNavi):
class AfterStrife(WordPressNavi):
baseUrl = 'http://afterstrife.com/'
stripUrl = baseUrl + '?p=%s'
url = stripUrl % '262'
@ -117,11 +117,11 @@ class AhoiPolloi(_ParserScraper):
help = 'Index format: yyyymmdd'
class AhoyEarth(_WPNavi):
class AhoyEarth(WordPressNavi):
url = 'http://www.ahoyearth.com/'
class AirForceBlues(_WordPressScraper):
class AirForceBlues(WordPressScraper):
url = 'http://farvatoons.com/'
firstStripUrl = url + 'comic/in-texas-there-are-texans/'
@ -136,7 +136,7 @@ class ALessonIsLearned(_BasicScraper):
help = 'Index format: nnn'
class Alice(_WordPressScraper):
class Alice(WordPressScraper):
url = 'https://web.archive.org/web/20210115132313/http://www.alicecomics.com/'
latestSearch = '//a[text()="Latest Alice!"]'
starter = indirectStarter
@ -153,12 +153,12 @@ class AlienLovesPredator(_BasicScraper):
help = 'Index format: yyyy/mm/dd/name'
class AlienShores(_WordPressScraper):
class AlienShores(WordPressScraper):
url = 'http://alienshores.com/alienshores_band/'
firstStripUrl = url + 'AScomic/updated-cover/'
class AllTheGrowingThings(_WordPressScraper):
class AllTheGrowingThings(WordPressScraper):
url = ('https://web.archive.org/web/20160611212229/'
'http://growingthings.typodmary.com/')
stripUrl = url + '%s/'
@ -239,7 +239,7 @@ class AmbersNoBrainers(_ParserScraper):
return self.stripUrl % str(pageNum - 1)
class Amya(_WordPressScraper):
class Amya(WordPressScraper):
url = 'http://www.amyachronicles.com/'
@ -343,7 +343,7 @@ class ARedTailsDream(_BasicScraper):
help = 'Index format: nn'
class ArtificialIncident(_WPWebcomic):
class ArtificialIncident(WordPressWebcomic):
url = 'https://www.artificialincident.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'issue-one-life-changing'
@ -370,12 +370,12 @@ class AstronomyPOTD(_ParserScraper):
image_url.split('/')[-1].split('.')[0])
class ATaleOfTails(_WordPressScraper):
class ATaleOfTails(WordPressScraper):
url = 'http://www.feretta.net/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'a-tale-of-tails-1-0'
adult = True
class AxeCop(_WordPressScraper):
class AxeCop(WordPressScraper):
url = 'http://axecop.com/comic/season-two/'

View file

@ -1,16 +1,16 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2019 Tobias Gruetzmacher
from ..scraper import _ParserScraper
# Copyright (C) 2015-2022 Tobias Gruetzmacher
from ..scraper import ParserScraper
class Arcamax(_ParserScraper):
class Arcamax(ParserScraper):
imageSearch = '//img[@id="comic-zoom"]'
prevSearch = '//a[@class="prev"]'
def __init__(self, name, path):
super(Arcamax, self).__init__('Arcamax/' + name)
super().__init__('Arcamax/' + name)
self.url = 'http://www.arcamax.com/thefunnies/' + path + '/'
@classmethod

View file

@ -8,10 +8,10 @@ from re import compile, escape
from ..util import tagre
from ..scraper import _BasicScraper, _ParserScraper
from ..helpers import indirectStarter
from .common import _ComicControlScraper, _WordPressScraper, _WPNavi, _WPWebcomic
from .common import ComicControlScraper, WordPressScraper, WordPressNavi, WordPressWebcomic
class BackOffice(_WPNavi):
class BackOffice(WordPressNavi):
url = 'https://rawrtacular.com/bo/'
stripUrl = url + '?comic=%s'
firstStripUrl = stripUrl % 'back-office'
@ -37,7 +37,7 @@ class BadMachinery(_ParserScraper):
help = 'Index format: yyyymmdd'
class BalderDash(_ComicControlScraper):
class BalderDash(ComicControlScraper):
url = 'http://www.balderdashcomic.com/'
@ -52,7 +52,7 @@ class BallerinaMafia(_ParserScraper):
endOfLife = True
class Bardsworth(_WordPressScraper):
class Bardsworth(WordPressScraper):
url = 'http://www.bardsworth.com/'
latestSearch = '//a[@rel="bookmark"]'
starter = indirectStarter
@ -68,7 +68,7 @@ class Baroquen(_BasicScraper):
help = 'Index format: yyyy/mm/dd/strip-name'
class Bearmageddon(_WordPressScraper):
class Bearmageddon(WordPressScraper):
url = 'http://bearmageddon.com/bearmo/page-1/'
firstStripUrl = url
latestSearch = '//a[d:class("comic-nav-last")]'
@ -98,7 +98,7 @@ class Beetlebum(_BasicScraper):
return name + '_' + image_url.split('/')[-1]
class Bethellium(_WPWebcomic):
class Bethellium(WordPressWebcomic):
url = 'https://bethellium.darkbluecomics.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'cover'
@ -114,14 +114,14 @@ class BetterDays(_ParserScraper):
endOfLife = True
class BetweenFailures(_WPWebcomic):
class BetweenFailures(WordPressWebcomic):
url = 'https://betweenfailures.com/'
stripUrl = url + 'comics1/%s'
firstStripUrl = stripUrl % 'every-story-has-to-start-somewhere'
help = 'Index format: stripname'
class BeyondTheVeil(_WordPressScraper):
class BeyondTheVeil(WordPressScraper):
url = 'https://web.archive.org/web/20201009235642/http://beyondtheveilcomic.com/'
stripUrl = url + '?comic=%s'
firstStripUrl = stripUrl % '01252010'
@ -154,7 +154,7 @@ class BillyTheDunce(_ParserScraper):
endOfLife = True
class BirdBoy(_WordPressScraper):
class BirdBoy(WordPressScraper):
url = 'https://bird-boy.com/'
stripUrl = url + 'comic/{0}-{1}/'
firstStripUrl = stripUrl.format('volume-i', 'the-sword-of-mali-mani')
@ -214,12 +214,12 @@ class BlondeSunrise(_ParserScraper):
prevSearch = '//a[img[contains(@src, "previous")]]'
class BloodBound(_WordPressScraper):
class BloodBound(WordPressScraper):
url = 'http://bloodboundcomic.com/'
firstStripUrl = 'http://bloodboundcomic.com/comic/06112006/'
class Bloodline(_WordPressScraper):
class Bloodline(WordPressScraper):
url = 'http://w0lfmare.xepher.net/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'pg-1-2'
@ -230,7 +230,7 @@ class Bloodline(_WordPressScraper):
return imageUrl.rsplit('/', 1)[-1].replace('gen-6', 'Bloodline')
class BloomingFaeries(_WordPressScraper):
class BloomingFaeries(WordPressScraper):
adult = True
url = 'http://www.bloomingfaeries.com/'
firstStripUrl = url + 'comic/public/pit-stop/'
@ -255,7 +255,7 @@ class BobWhite(_ParserScraper):
prevSearch = '//a[@rel="previous"]'
class BookOfBiff(_WordPressScraper):
class BookOfBiff(WordPressScraper):
url = 'https://thebookofbiff.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % '4'
@ -271,18 +271,18 @@ class BoredAndEvil(_ParserScraper):
help = 'Index format: yyyy-mm-dd'
class BratHalla(_WordPressScraper):
class BratHalla(WordPressScraper):
url = 'http://brat-halla.com/'
class Brink(_WordPressScraper):
class Brink(WordPressScraper):
stripUrl = 'https://paperfangs.com/brink/?comic=%s'
firstStripUrl = stripUrl % 'chapter1coversmall'
url = stripUrl % 'brink639small'
endOfLife = True
class Buni(_WordPressScraper):
class Buni(WordPressScraper):
url = 'http://www.bunicomic.com/'
@ -293,7 +293,7 @@ class BusinessCat(_ParserScraper):
endOfLife = True
class ButImACatPerson(_WordPressScraper):
class ButImACatPerson(WordPressScraper):
url = 'https://www.bicatperson.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = 'sketches-1'
@ -330,7 +330,7 @@ class ButterSafe(_ParserScraper):
help = 'Index format: yyyy/mm/dd/stripname'
class ByTheBook(_WordPressScraper):
class ByTheBook(WordPressScraper):
url = 'http://www.btbcomic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'chapter-1-page-0'

View file

@ -9,7 +9,7 @@ from typing import List
from ..scraper import _BasicScraper, _ParserScraper
from ..helpers import bounceStarter, indirectStarter, joinPathPartsNamer
from ..util import tagre
from .common import _WordPressScraper, _WPNavi, _WPWebcomic
from .common import WordPressScraper, WordPressNavi, WordPressWebcomic
class CampComic(_ParserScraper):
@ -117,7 +117,7 @@ class CatAndGirl(_ParserScraper):
prevSearch = '//a[d:class("pager--prev")]'
class CatenaCafe(_WordPressScraper):
class CatenaCafe(WordPressScraper):
name = 'CatenaManor/CatenaCafe'
url = 'https://catenamanor.com/'
stripUrl = url + 'comic/%s/'
@ -153,20 +153,20 @@ class CatenaManor(_ParserScraper):
return self.strips.pop(0)
class CatNine(_WordPressScraper):
class CatNine(WordPressScraper):
url = 'https://classic.cat-nine.net/'
firstStripUrl = url + 'comic/day-first'
imageSearch = '//div[@id="comic"]//img/@data-src-img'
endOfLife = True
class CatNineTakeTwo(_WordPressScraper):
class CatNineTakeTwo(WordPressScraper):
name = 'CatNine/TakeTwo'
url = 'https://cat-nine.net/'
firstStripUrl = url + 'comic/episode-1/1-first-day-for-everything/'
class CatsAndCameras(_WordPressScraper):
class CatsAndCameras(WordPressScraper):
url = 'https://catsncameras.com/cnc/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'cnc-begins'
@ -181,7 +181,7 @@ class CatVersusHuman(_ParserScraper):
starter = indirectStarter
class CavesAndCritters(_WPWebcomic):
class CavesAndCritters(WordPressWebcomic):
url = 'https://cavesandcritters.com/?ao_confirm'
stripUrl = 'https://cavesandcritters.com/cnc_webcomic/%s/'
firstStripUrl = stripUrl % '01_000'
@ -205,7 +205,7 @@ class Centralia2050(_ParserScraper):
return page + '.' + ext
class ChannelAte(_WPNavi):
class ChannelAte(WordPressNavi):
url = 'http://www.channelate.com/'
@ -218,7 +218,7 @@ class ChasingTheSunset(_BasicScraper):
help = 'Index format: n'
class Chester5000XYV(_WordPressScraper):
class Chester5000XYV(WordPressScraper):
url = 'http://jessfink.com/Chester5000XYV/'
stripUrl = url + '?p=%s'
firstStripUrl = stripUrl % '34'
@ -233,7 +233,7 @@ class Chester5000XYV(_WordPressScraper):
return tourl
class Chisuji(_WordPressScraper):
class Chisuji(WordPressScraper):
url = 'http://www.chisuji.com/'
stripUrl = url + '?p=%s'
firstStripUrl = stripUrl % '266'
@ -249,7 +249,7 @@ class CigarroAndCerveja(_ParserScraper):
prevSearch = '//a[contains(text()," Prev")]'
class ClanOfTheCats(_WordPressScraper):
class ClanOfTheCats(WordPressScraper):
url = 'http://www.cotclassic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'coming-home-2'
@ -259,7 +259,7 @@ class ClanOfTheCats(_WordPressScraper):
return tourl.replace('/2954/', '/2002-06-22/')
class ClanOfTheCatsReunion(_WordPressScraper):
class ClanOfTheCatsReunion(WordPressScraper):
name = 'ClanOfTheCats/Reunion'
url = 'http://www.clanofthecats.com/'
stripUrl = url + 'comic/%s/'
@ -295,7 +295,7 @@ class Comedity(_BasicScraper):
help = 'Index format: n (no padding)'
class CommanderKitty(_WPNavi):
class CommanderKitty(WordPressNavi):
url = 'http://www.commanderkitty.com/'
stripUrl = url + '%s/'
firstStripUrl = stripUrl % '2009/01/03/good-to-be-back'
@ -358,13 +358,13 @@ class CorydonCafe(_ParserScraper):
multipleImagesPerStrip = True
class CourtingDisaster(_WordPressScraper):
class CourtingDisaster(WordPressScraper):
url = 'https://web.archive.org/web/20201127150157/http://www.courting-disaster.com/'
firstStripUrl = 'http://www.courting-disaster.com/comic/courting-disaster-17/'
endOfLife = True
class CraftedFables(_WordPressScraper):
class CraftedFables(WordPressScraper):
url = 'https://web.archive.org/web/20191126025641/http://www.caf-fiends.net/comicpress/'
prevSearch = '//a[@rel="prev"]'
endOfLife = True
@ -387,7 +387,7 @@ class CrimsonFlag(_ParserScraper):
prevSearch = '//a[contains(@class, "prev")]'
class CritterCoven(_WordPressScraper):
class CritterCoven(WordPressScraper):
url = 'http://crittercoven.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'critter-coven'
@ -403,14 +403,14 @@ class CrossTimeCafe(_ParserScraper):
endOfLife = True
class CSectionComics(_WordPressScraper):
class CSectionComics(WordPressScraper):
url = 'https://www.csectioncomics.com/'
firstStripUrl = url + 'comics/one-day-in-country'
namer = joinPathPartsNamer((), (-3, -2, -1))
multipleImagesPerStrip = True
class CucumberQuest(_WPWebcomic):
class CucumberQuest(WordPressWebcomic):
baseUrl = 'http://cucumber.gigidigi.com/'
stripUrl = baseUrl + 'cq/%s/'
firstStripUrl = stripUrl % 'page-1'
@ -419,7 +419,7 @@ class CucumberQuest(_WPWebcomic):
help = 'Index format: stripname'
class Curtailed(_WordPressScraper):
class Curtailed(WordPressScraper):
url = 'https://www.curtailedcomic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % '001-sneeze'

View file

@ -1,13 +1,13 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2020 Tobias Gruetzmacher
# Copyright (C) 2015-2022 Tobias Gruetzmacher
from ..helpers import indirectStarter
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
from ..util import getQueryParams
class CloneManga(_ParserScraper):
class CloneManga(ParserScraper):
baseUrl = 'http://manga.clone-army.org'
imageSearch = '//div[d:class("subsectionContainer")]//img'
prevSearch = '//a[span[text()="<<"]]'
@ -16,7 +16,7 @@ class CloneManga(_ParserScraper):
help = 'Index format: n'
def __init__(self, name, shortName, endOfLife=False):
super(CloneManga, self).__init__('CloneManga/' + name)
super().__init__('CloneManga/' + name)
self.stripUrl = '%s/viewer.php?page=%%s&lang=&series=%s&HUDoff=' % (
self.baseUrl, shortName)
self.url = self.stripUrl % '1'

View file

@ -5,14 +5,14 @@
# Copyright (C) 2019-2020 Daniel Ring
import os
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
from ..helpers import bounceStarter
XPATH_LINK = '//a[d:class("%s") and contains(text(), "%s")]'
XPATH_IMG = '//div[d:class("comicnav")]//a[img[contains(@alt, "%s")]]'
class ComicFury(_ParserScraper):
class ComicFury(ParserScraper):
imageSearch = (
'//img[@id="comicimage"]',
'//div[@id="comicimagewrap"]//embed',
@ -56,7 +56,7 @@ class ComicFury(_ParserScraper):
starter = bounceStarter
def __init__(self, name, sub, lang=None, adult=False, endOfLife=False, segmented=False):
super(ComicFury, self).__init__('ComicFury/' + name)
super().__init__('ComicFury/' + name)
self.prefix = name
self.url = 'https://%s.webcomic.ws/comics/' % sub
self.stripUrl = self.url + '%s'

View file

@ -1,15 +1,15 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2020 Tobias Gruetzmacher
# Copyright (C) 2015-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
# Comicgenesis has a lot of comics, but most of them are disallowed by
# robots.txt
class ComicGenesis(_ParserScraper):
class ComicGenesis(ParserScraper):
multipleImagesPerStrip = True
imageSearch = '//img[contains(@src, "/comics/")]'
prevSearch = (
@ -19,7 +19,7 @@ class ComicGenesis(_ParserScraper):
help = 'Index format: yyyymmdd'
def __init__(self, name, sub=None, last=None, baseUrl=None, lang=None):
super(ComicGenesis, self).__init__('ComicGenesis/' + name)
super().__init__('ComicGenesis/' + name)
if sub:
baseUrl = 'http://%s.comicgenesis.com/' % sub

View file

@ -4,10 +4,10 @@
from importlib.resources import path as get_path
from ..helpers import bounceStarter, joinPathPartsNamer
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
class ComicsKingdom(_ParserScraper):
class ComicsKingdom(ParserScraper):
imageSearch = '//img[@id="theComicImage"]'
prevSearch = '//a[./img[contains(@alt, "Previous")]]'
nextSearch = '//a[./img[contains(@alt, "Next")]]'

View file

@ -5,43 +5,51 @@
# Copyright (C) 2019-2020 Daniel Ring
from typing import Sequence, Union
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
# Common base classes for comics with the same structure (same hosting
# software, for example) go here. Since those are shared by many modules,
# please don't use lists of expression, as that makes it hard to track which
# expression is for which comics.
__all__ = (
'ComicControlScraper',
'WordPressNavi',
'WordPressNaviIn',
'WordPressScraper',
'WordPressSpliced',
'WordPressWebcomic',
)
class _WordPressScraper(_ParserScraper):
class ComicControlScraper(ParserScraper):
imageSearch: Union[Sequence[str], str] = '//img[@id="cc-comic"]'
prevSearch = '//a[@rel="prev"]'
nextSearch = '//a[@rel="next"]'
latestSearch = '//a[@rel="last"]'
class WordPressScraper(ParserScraper):
imageSearch = '//div[@id="comic"]//img'
prevSearch = '//a[d:class("comic-nav-previous")]'
nextSearch = '//a[d:class("comic-nav-next")]'
latestSearch = '//a[d:class("comic-nav-last")]'
class _WordPressSpliced(_ParserScraper):
class WordPressSpliced(ParserScraper):
imageSearch = '//div[@id="one-comic-option"]//img'
prevSearch = '//a[d:class("previous-comic")]'
class _WPNavi(_WordPressScraper):
class WordPressNavi(WordPressScraper):
prevSearch = '//a[d:class("navi-prev")]'
class _WPNaviIn(_WordPressScraper):
class WordPressNaviIn(WordPressScraper):
prevSearch = '//a[d:class("navi-prev-in")]'
class _WPWebcomic(_ParserScraper):
class WordPressWebcomic(ParserScraper):
imageSearch = '//div[d:class("webcomic-image")]//img'
prevSearch = '//a[d:class("previous-webcomic-link")]'
nextSearch = '///a[d:class("next-webcomic-link")]'
latestSearch = '//a[d:class("last-webcomic-link")]'
class _ComicControlScraper(_ParserScraper):
imageSearch: Union[Sequence[str], str] = '//img[@id="cc-comic"]'
prevSearch = '//a[@rel="prev"]'
nextSearch = '//a[@rel="next"]'
latestSearch = '//a[@rel="last"]'

View file

@ -1,12 +1,12 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2020 Tobias Gruetzmacher
from ..scraper import _ParserScraper
# Copyright (C) 2015-2022 Tobias Gruetzmacher
from ..scraper import ParserScraper
from ..helpers import indirectStarter
class Creators(_ParserScraper):
class Creators(ParserScraper):
imageSearch = '//a[contains(@class,"fancybox")]/img'
prevSearch = '//a[@id="nav_prev"]'
latestSearch = '//div[contains(@class,"caption")]/a'

View file

@ -8,8 +8,8 @@ from re import compile, escape
from ..scraper import _BasicScraper, _ParserScraper
from ..helpers import indirectStarter, bounceStarter
from ..util import tagre
from .common import (_ComicControlScraper, _WordPressScraper, _WPNavi,
_WPWebcomic)
from .common import (ComicControlScraper, WordPressScraper, WordPressNavi,
WordPressWebcomic)
class Damonk(_BasicScraper):
@ -22,12 +22,12 @@ class Damonk(_BasicScraper):
help = 'Index format: yyyymmdd'
class DangerouslyChloe(_ComicControlScraper):
class DangerouslyChloe(ComicControlScraper):
url = 'http://www.dangerouslychloe.com/'
firstStripUrl = url + 'strips-dc/Chapter_1_-_That_damned_girl'
class DarkWhite(_WordPressScraper):
class DarkWhite(WordPressScraper):
url = 'https://www.darkwhitecomic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'chapter-1-sleep'
@ -52,7 +52,7 @@ class DasLebenIstKeinPonyhof(_ParserScraper):
lang = 'de'
class DaughterOfTheLilies(_ComicControlScraper):
class DaughterOfTheLilies(ComicControlScraper):
url = 'https://www.daughterofthelilies.com/'
firstStripUrl = url + 'dotl/part-1-a-girl-with-no-face'
@ -97,7 +97,7 @@ class DeerMe(_ParserScraper):
starter = bounceStarter
class Delve(_WordPressScraper):
class Delve(WordPressScraper):
url = 'https://thisis.delvecomic.com/NewWP/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'in-too-deep'
@ -138,7 +138,7 @@ class DerTodUndDasMaedchen(_ParserScraper):
lang = 'de'
class DesertFox(_WPWebcomic):
class DesertFox(WordPressWebcomic):
url = 'https://desertfoxcomics.net/'
stripUrl = url + 'comics/%s/'
firstStripUrl = stripUrl % 'origins-1'
@ -206,7 +206,7 @@ class Dilbert(_ParserScraper):
return "%s" % name
class DocRat(_WPWebcomic):
class DocRat(WordPressWebcomic):
url = 'https://www.docrat.com.au/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'begin-with-eye-contact'
@ -239,7 +239,7 @@ class DoemainOfOurOwn(_ParserScraper):
return filename
class DoesNotPlayWellWithOthers(_WPNavi):
class DoesNotPlayWellWithOthers(WordPressNavi):
url = 'http://www.doesnotplaywellwithothers.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'pwc-0001'
@ -283,7 +283,7 @@ class DoomsdayMyDear(_ParserScraper):
prevSearch = '//a[d:class("previous-webcomic-link")]'
class Draconia(_WPWebcomic):
class Draconia(WordPressWebcomic):
url = 'https://www.draconiachronicles.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'chapter-1-page-1'
@ -372,7 +372,7 @@ class Drowtales(_ParserScraper):
help = 'Index format: number'
class DungeonsAndDenizens(_WPNavi):
class DungeonsAndDenizens(WordPressNavi):
url = ('https://web.archive.org/web/20160308001834/'
'http://dungeond.com/')
stripUrl = url + '%s/'
@ -380,7 +380,7 @@ class DungeonsAndDenizens(_WPNavi):
endOfLife = True
class DumbingOfAge(_WPNavi):
class DumbingOfAge(WordPressNavi):
url = 'http://www.dumbingofage.com/'
stripUrl = url + '%s/'
help = 'Index format: yyyy/comic/book-num/seriesname/stripname'

View file

@ -1,11 +1,11 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2019-2020 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
from ..helpers import indirectStarter
class Derideal(_ParserScraper):
class Derideal(ParserScraper):
baseUrl = 'https://www.derideal.com/'
imageSearch = '//img[contains(@class, "comic-page")]'
prevSearch = '//a[i[contains(@class, "fa-angle-left")]]'
@ -13,9 +13,9 @@ class Derideal(_ParserScraper):
def __init__(self, name, sub, first, last=None):
if name == 'Derideal':
super(Derideal, self).__init__(name)
super().__init__(name)
else:
super(Derideal, self).__init__('Derideal/' + name)
super().__init__('Derideal/' + name)
self.url = self.baseUrl + sub
self.stripUrl = self.url + '/%s/'

View file

@ -1,11 +1,11 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2019-2020 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from ..helpers import bounceStarter
from .common import _ParserScraper
from ..scraper import ParserScraper
class DMFA(_ParserScraper):
class DMFA(ParserScraper):
url = 'http://www.missmab.com/'
stripUrl = url + 'Comics/%s.php'
imageSearch = '//center//img'

View file

@ -9,7 +9,7 @@ from re import compile, IGNORECASE
from ..helpers import bounceStarter, indirectStarter
from ..scraper import _BasicScraper, _ParserScraper
from ..util import tagre
from .common import _ComicControlScraper, _WordPressScraper, _WPNavi
from .common import ComicControlScraper, WordPressScraper, WordPressNavi
class EarthsongSaga(_ParserScraper):
@ -51,10 +51,10 @@ class EatLiver(_ParserScraper):
latestSearch = '//a[@rel="bookmark"]'
class EatThatToast(_WordPressScraper):
class EatThatToast(WordPressScraper):
url = 'http://eatthattoast.com/'
firstStripUrl = url + 'comic/thewizard/'
textSearch = _WordPressScraper.imageSearch + '/@alt'
textSearch = WordPressScraper.imageSearch + '/@alt'
class EdibleDirt(_BasicScraper):
@ -67,7 +67,7 @@ class EdibleDirt(_BasicScraper):
help = 'Index format: number'
class EdmundFinney(_WPNavi):
class EdmundFinney(WordPressNavi):
url = 'http://eqcomics.com/'
firstStripUrl = url + '2009/03/08/sunday-aliens/'
@ -82,11 +82,11 @@ class ElfOnlyInn(_BasicScraper):
help = 'Index format: yyyymmdd'
class ElGoonishShive(_ComicControlScraper):
class ElGoonishShive(ComicControlScraper):
url = 'http://www.egscomics.com/'
class ElGoonishShiveNP(_ComicControlScraper):
class ElGoonishShiveNP(ComicControlScraper):
url = 'http://www.egscomics.com/egsnp.php'
@ -165,12 +165,12 @@ class ErrantStory(_BasicScraper):
help = 'Index format: yyyy-mm-dd/num'
class Erstwhile(_WPNavi):
class Erstwhile(WordPressNavi):
url = 'http://www.erstwhiletales.com/'
endOfLife = True
class Everblue(_ComicControlScraper):
class Everblue(ComicControlScraper):
url = 'http://www.everblue-comic.com/comic/'
stripUrl = url + '%s'
firstStripUrl = stripUrl % '1'
@ -186,7 +186,7 @@ class EverybodyLovesEricRaymond(_ParserScraper):
prevSearch = '//a[@rel="prev"]'
class EvilDiva(_WordPressScraper):
class EvilDiva(WordPressScraper):
url = ('https://web.archive.org/web/20190221223751/'
'https://www.evildivacomics.com/')
firstStripUrl = url + 'comic/evil-diva-issue-1-cover/'
@ -210,19 +210,19 @@ class Evilish(_ParserScraper):
help = 'Index format: yyyymmdd'
class Evon(_WordPressScraper):
class Evon(WordPressScraper):
url = 'http://evoncomics.com/'
stripUrl = url + '?comic=%s'
firstStripUrl = stripUrl % 'chapter-1'
adult = True
class Exiern(_WordPressScraper):
class Exiern(WordPressScraper):
url = 'http://www.exiern.com/'
firstStripUrl = url + '2005/09/06/so-far/'
class ExploitationNow(_WPNavi):
class ExploitationNow(WordPressNavi):
url = 'http://www.exploitationnow.com/'
firstStripUrl = url + '2000-07-07/9'
endOfLife = True
@ -237,7 +237,7 @@ class Exvulnerum(_ParserScraper):
prevSearch = '//a[./img[contains(@src, "nav_prev")]]'
class ExtraFabulousComics(_WordPressScraper):
class ExtraFabulousComics(WordPressScraper):
url = 'https://extrafabulouscomics.com/'
firstStripUrl = url + 'comic/buttfly/'
starter = bounceStarter

View file

@ -8,7 +8,7 @@ from re import compile, escape
from ..util import tagre
from ..scraper import _BasicScraper, _ParserScraper
from ..helpers import indirectStarter, joinPathPartsNamer
from .common import _ComicControlScraper, _WPNaviIn, _WordPressScraper
from .common import ComicControlScraper, WordPressNaviIn, WordPressScraper
class FalconTwin(_BasicScraper):
@ -38,7 +38,7 @@ class FalseStart(_ParserScraper):
return self.archive[self.archive.index(url) - 1]
class Faneurysm(_WPNaviIn):
class Faneurysm(WordPressNaviIn):
url = 'http://hijinksensue.com/comic/think-only-tree/'
firstStripUrl = 'http://hijinksensue.com/comic/captains-prerogative/'
endOfLife = True
@ -55,7 +55,7 @@ class FantasyRealms(_ParserScraper):
help = 'Index format: nnn'
class FarToTheNorth(_ComicControlScraper):
class FarToTheNorth(ComicControlScraper):
url = 'http://www.farnorthcomic.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'don39t-tell'
@ -70,7 +70,7 @@ class FauxPas(_ParserScraper):
help = 'Index format: nnn'
class FireflyCross(_WordPressScraper):
class FireflyCross(WordPressScraper):
url = 'http://www.fireflycross.pensandtales.com/'
firstStripUrl = url + '?comic=05062002'
@ -135,7 +135,7 @@ class FonFlatter(_ParserScraper):
)
class ForestHill(_WordPressScraper):
class ForestHill(WordPressScraper):
url = 'https://www.foresthillcomic.org/'
@ -226,7 +226,7 @@ class FreighterTails(_ParserScraper):
endOfLife = True
class FriendsYouAreStuckWith(_WordPressScraper):
class FriendsYouAreStuckWith(WordPressScraper):
url = 'http://friendsyasw.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'wanted'
@ -247,7 +247,7 @@ class FullFrontalNerdity(_BasicScraper):
help = 'Index format: number'
class FunInJammies(_WordPressScraper):
class FunInJammies(WordPressScraper):
url = ('https://web.archive.org/web/20170205105241/'
'http://funinjammies.com/')
stripUrl = url + 'comic.php?issue=%s'

View file

@ -1,10 +1,10 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2021 Tobias Gruetzmacher
from ..helpers import indirectStarter
from .common import _WordPressScraper
from .common import WordPressScraper
class FlowerlarkStudios(_WordPressScraper):
class FlowerlarkStudios(WordPressScraper):
starter = indirectStarter
def __init__(self, name, sub):

View file

@ -1,11 +1,11 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2016 Tobias Gruetzmacher
from ..scraper import _ParserScraper
# Copyright (C) 2015-2022 Tobias Gruetzmacher
from ..scraper import ParserScraper
class Footloose(_ParserScraper):
class Footloose(ParserScraper):
url = 'http://footloosecomic.com/footloose.php'
imageSearch = '//body/p[1]//img'
prevSearch = '//body/a[2]'

View file

@ -8,10 +8,10 @@ from re import compile, escape
from ..scraper import _BasicScraper, _ParserScraper
from ..helpers import indirectStarter
from ..util import tagre
from .common import _ComicControlScraper, _WordPressScraper, _WPNavi
from .common import ComicControlScraper, WordPressScraper, WordPressNavi
class Galaxion(_WPNavi):
class Galaxion(WordPressNavi):
url = 'http://galaxioncomics.com/'
stripUrl = url + '%s/'
firstStripUrl = stripUrl % '1-comic/the-story-so-far/the-story-so-far'
@ -19,7 +19,7 @@ class Galaxion(_WPNavi):
help = 'Index format: n-comic/book-n/chapter-n/title-nnn'
class Garanos(_WordPressScraper):
class Garanos(WordPressScraper):
stripUrl = ('https://web.archive.org/web/20180314181433/'
'http://garanos.alexheberling.com/pages/%s/')
url = stripUrl % 'page-487'
@ -59,7 +59,7 @@ class GeeksNextDoor(_ParserScraper):
help = 'Index format: yyyy-mm-dd'
class Ginpu(_WPNavi):
class Ginpu(WordPressNavi):
url = 'https://www.ginpu.us/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'filler-2'
@ -98,7 +98,7 @@ class GirlsWithSlingshots(_BasicScraper):
help = 'Index format: stripname'
class GleefulNihilism(_WordPressScraper):
class GleefulNihilism(WordPressScraper):
url = ('https://web.archive.org/web/20170911203122/'
'http://gleefulnihilism.com/')
stripUrl = url + 'comic/%s/'
@ -107,15 +107,15 @@ class GleefulNihilism(_WordPressScraper):
help = 'Index format: stripname'
class GoblinsComic(_ComicControlScraper):
class GoblinsComic(ComicControlScraper):
url = 'http://www.goblinscomic.org/'
class GodChild(_WordPressScraper):
class GodChild(WordPressScraper):
url = 'http://godchild.keenspot.com/'
class GoGetARoomie(_ComicControlScraper):
class GoGetARoomie(ComicControlScraper):
url = 'http://www.gogetaroomie.com'
@ -135,7 +135,7 @@ class GoneWithTheBlastwave(_BasicScraper):
return '%02d' % int(compile(r'nro=(\d+)').search(page_url).group(1))
class GrrlPower(_WordPressScraper):
class GrrlPower(WordPressScraper):
url = 'https://grrlpowercomic.com/'
stripUrl = url + 'archives/comic/%s/'
firstStripUrl = stripUrl % 'gp0001'
@ -145,7 +145,7 @@ class GrrlPower(_WordPressScraper):
self.session.add_throttle('grrlpowercomic.com', 1.0, 1.5)
class GuildedAge(_WordPressScraper):
class GuildedAge(WordPressScraper):
url = 'http://guildedage.net/'
firstStripUrl = url + 'comic/chapter-1-cover/'

View file

@ -2,11 +2,11 @@
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2022 Tobias Gruetzmacher
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
from ..helpers import indirectStarter
class GoComics(_ParserScraper):
class GoComics(ParserScraper):
url = 'https://www.gocomics.com/'
imageSearch = '//picture[d:class("item-comic-image")]/img'
prevSearch = '//a[d:class("js-previous-comic")]'

View file

@ -1,17 +1,17 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2020 Tobias Gruetzmacher
# Copyright (C) 2015-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from re import compile, escape
from ..scraper import _BasicScraper, _ParserScraper
from ..scraper import BasicScraper, ParserScraper
from ..util import tagre
from ..helpers import bounceStarter, indirectStarter
from .common import _ComicControlScraper, _WordPressScraper, _WPNaviIn
from .common import ComicControlScraper, WordPressScraper, WordPressNaviIn
class Hackles(_ParserScraper):
class Hackles(ParserScraper):
url = 'http://hackles.org/'
stripUrl = url + 'cgi-bin/archives.pl?request=%s'
firstStripUrl = stripUrl % '1'
@ -20,7 +20,7 @@ class Hackles(_ParserScraper):
endOfLife = True
class HagarTheHorrible(_BasicScraper):
class HagarTheHorrible(BasicScraper):
url = 'http://www.hagarthehorrible.net/'
stripUrl = 'http://www.hagardunor.net/comicstrips_us.php?serietype=9&colortype=1&serieno=%s'
firstStripUrl = stripUrl % '1'
@ -38,12 +38,7 @@ class HagarTheHorrible(_BasicScraper):
return self.fetchUrls(url, data, pattern)[-1]
# "Hiatus", navigation missing
class _HappyJar(_WordPressScraper):
url = 'http://www.happyjar.com/'
class HarkAVagrant(_BasicScraper):
class HarkAVagrant(BasicScraper):
url = 'http://www.harkavagrant.com/'
rurl = escape(url)
starter = bounceStarter
@ -63,60 +58,60 @@ class HarkAVagrant(_BasicScraper):
return '%s-%s' % (num, filename)
class HavocInc(_WordPressScraper):
class HavocInc(WordPressScraper):
url = 'http://www.radiocomix.com/havoc-inc/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'havoc-cover'
class HeadlessBliss(_ComicControlScraper):
class HeadlessBliss(ComicControlScraper):
url = 'http://headlessbliss.com/'
class HeyFox(_WordPressScraper):
class HeyFox(WordPressScraper):
url = 'http://www.steamclaw.com/heyfox/'
stripUrl = url + 'archives/comic/%s'
firstStripUrl = stripUrl % '11092004'
adult = True
class HeyKitty(_WordPressScraper):
class HeyKitty(WordPressScraper):
url = 'http://heykittycomic.com/'
stripUrl = url + '?comic=%s'
firstStripUrl = stripUrl % 'it-begins'
class Hipsters(_WordPressScraper):
class Hipsters(WordPressScraper):
url = 'http://www.hipsters-comic.com/'
firstStripUrl = 'http://www.hipsters-comic.com/comic/hip01/'
class HijinksEnsue(_WPNaviIn):
class HijinksEnsue(WordPressNaviIn):
url = 'http://hijinksensue.com/'
latestSearch = '//a[text()="Latest HijiNKS ENSUE"]'
firstStripUrl = 'http://hijinksensue.com/comic/who-is-your-daddy-and-what-does-he-do/'
starter = indirectStarter
class HijinksEnsueClassic(_WPNaviIn):
class HijinksEnsueClassic(WordPressNaviIn):
url = 'http://hijinksensue.com/comic/open-your-eyes/'
firstStripUrl = 'http://hijinksensue.com/comic/a-soul-as-black-as-eyeliner/'
endOfLife = True
class HijinksEnsueConvention(_WPNaviIn):
class HijinksEnsueConvention(WordPressNaviIn):
url = 'http://hijinksensue.com/comic/emerald-city-comicon-2015-fancy-sketches-part-4/'
firstStripUrl = 'http://hijinksensue.com/comic/whatever-dad-im-outta-here/'
endOfLife = True
class HijinksEnsuePhoto(_WPNaviIn):
class HijinksEnsuePhoto(WordPressNaviIn):
url = 'http://hijinksensue.com/comic/emerald-city-comicon-2015-fancy-photo-comic-part-2/'
firstStripUrl = 'http://hijinksensue.com/comic/san-diego-comic-con-fancy-picto-comic-pt-1/'
endOfLife = True
class HowToBeAWerewolf(_ComicControlScraper):
class HowToBeAWerewolf(ComicControlScraper):
url = 'http://howtobeawerewolf.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'coming-february-3rd'

View file

@ -5,12 +5,12 @@
# Copyright (C) 2019-2020 Daniel Ring
from re import compile, escape
from ..scraper import _BasicScraper, _ParserScraper
from ..scraper import BasicScraper, ParserScraper
from ..util import tagre
from .common import _WordPressScraper, _WPNavi
from .common import WordPressScraper, WordPressNavi
class IAmArg(_BasicScraper):
class IAmArg(BasicScraper):
url = 'http://iamarg.com/'
rurl = escape(url)
stripUrl = url + '%s/'
@ -20,7 +20,7 @@ class IAmArg(_BasicScraper):
help = 'Index format: yyyy/mm/dd/stripname'
class ICanBarelyDraw(_BasicScraper):
class ICanBarelyDraw(BasicScraper):
url = 'http://www.icanbarelydraw.com/comic/'
rurl = escape(url)
stripUrl = url + '%s'
@ -30,18 +30,18 @@ class ICanBarelyDraw(_BasicScraper):
help = 'Index format: number'
class IDreamOfAJeanieBottle(_WordPressScraper):
class IDreamOfAJeanieBottle(WordPressScraper):
url = 'http://jeaniebottle.com/'
class InternetWebcomic(_WPNavi):
class InternetWebcomic(WordPressNavi):
url = 'http://www.internet-webcomic.com/'
stripUrl = url + '?p=%s'
firstStripUrl = stripUrl % '30'
help = 'Index format: n'
class IrregularWebcomic(_BasicScraper):
class IrregularWebcomic(BasicScraper):
url = 'http://www.irregularwebcomic.net/'
stripUrl = url + '%s.html'
firstStripUrl = stripUrl % '1'
@ -50,7 +50,7 @@ class IrregularWebcomic(_BasicScraper):
help = 'Index format: nnn'
class IslaAukate(_ParserScraper):
class IslaAukate(ParserScraper):
url = 'https://overlordcomic.com/archive/default/latest'
stripUrl = 'https://overlordcomic.com/archive/default/pages/%s'
firstStripUrl = stripUrl % '001'
@ -62,7 +62,7 @@ class IslaAukate(_ParserScraper):
return filename.rsplit('_', 1)[0] + '.' + filename.rsplit('.', 1)[-1]
class IslaAukateColor(_ParserScraper):
class IslaAukateColor(ParserScraper):
url = 'https://overlordcomic.com/archive/color/latest'
stripUrl = 'https://overlordcomic.com/archive/color/pages/%s'
firstStripUrl = stripUrl % '001'
@ -77,5 +77,5 @@ class IslaAukateColor(_ParserScraper):
return filename.rsplit('_', 1)[0] + '.' + filename.rsplit('.', 1)[-1]
class ItsWalky(_WordPressScraper):
class ItsWalky(WordPressScraper):
url = 'http://www.itswalky.com/'

View file

@ -4,13 +4,13 @@
# Copyright (C) 2015-2022 Tobias Gruetzmacher
from re import compile, escape
from ..scraper import _BasicScraper
from ..scraper import BasicScraper
from ..util import tagre
from ..helpers import indirectStarter
from .common import _ComicControlScraper
from .common import ComicControlScraper
class JackCannon(_BasicScraper):
class JackCannon(BasicScraper):
url = 'http://fancyadventures.com/'
rurl = escape(url)
stripUrl = url + '%s/'
@ -20,7 +20,7 @@ class JackCannon(_BasicScraper):
help = 'Index format: yyyy/mm/dd/page-nnn'
class JimBenton(_BasicScraper):
class JimBenton(BasicScraper):
url = 'http://www.jimbenton.com/page14/page14.html'
stripUrl = 'http://www.jimbenton.com/page14/files/JimBentonComic-%s.html'
starter = indirectStarter
@ -32,7 +32,7 @@ class JimBenton(_BasicScraper):
help = 'Index format: stripname'
class JoeAndMonkey(_BasicScraper):
class JoeAndMonkey(BasicScraper):
url = 'http://www.joeandmonkey.com/'
stripUrl = url + '%s'
imageSearch = compile(r'"(/comic/[^"]+)"')
@ -40,7 +40,7 @@ class JoeAndMonkey(_BasicScraper):
help = 'Index format: nnn'
class JohnnyWander(_ComicControlScraper):
class JohnnyWander(ComicControlScraper):
imageSearch = ('//ul[d:class("cc-showbig")]/li/@data-src',
'//img[@id="cc-comic"]')
url = 'http://www.johnnywander.com/'

View file

@ -5,11 +5,11 @@
# Copyright (C) 2019-2020 Daniel Ring
from re import compile, IGNORECASE
from ..scraper import _BasicScraper, _ParserScraper
from .common import _ComicControlScraper, _WordPressScraper, _WPNavi, _WPWebcomic
from ..scraper import BasicScraper, ParserScraper
from .common import ComicControlScraper, WordPressScraper, WordPressNavi, WordPressWebcomic
class Kaspall(_ParserScraper):
class Kaspall(ParserScraper):
stripUrl = 'http://www.kaspall.com/comic/%s'
url = stripUrl % '2015/10/11'
firstStripUrl = '2004/08/05'
@ -18,7 +18,7 @@ class Kaspall(_ParserScraper):
endOfLife = True
class KevinAndKell(_BasicScraper):
class KevinAndKell(BasicScraper):
url = 'http://www.kevinandkell.com/'
stripUrl = url + '%s/kk%s%s.html'
firstStripUrl = stripUrl % ('1995', '09', '03')
@ -33,31 +33,31 @@ class KevinAndKell(_BasicScraper):
return self.stripUrl % tuple(map(int, index.split('-')))
class KickInTheHead(_WPNavi):
class KickInTheHead(WordPressNavi):
url = 'http://www.kickinthehead.org/'
firstStripUrl = url + '2003/03/20/ipod-envy/'
class KillSixBillionDemons(_WPNavi):
class KillSixBillionDemons(WordPressNavi):
url = 'http://killsixbilliondemons.com/'
firstStripUrl = url + 'comic/kill-six-billion-demons-chapter-1/'
multipleImagesPerStrip = True
adult = True
class Kitfox(_WordPressScraper):
class Kitfox(WordPressScraper):
url = 'http://www.kitfox.com/wordpress/'
stripUrl = url + '?comic=%s'
firstStripUrl = stripUrl % 'the-adventure-begins-almost'
class KiwiBlitz(_ComicControlScraper):
class KiwiBlitz(ComicControlScraper):
url = 'http://www.kiwiblitz.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'welcome-to-kb'
class Krakow(_BasicScraper):
class Krakow(BasicScraper):
url = 'http://www.krakow.krakowstudios.com/'
stripUrl = url + 'archive.php?date=%s'
firstStripUrl = stripUrl % '20081111'
@ -67,7 +67,7 @@ class Krakow(_BasicScraper):
help = 'Index format: yyyymmdd'
class KuroShouri(_WPWebcomic):
class KuroShouri(WordPressWebcomic):
url = 'http://kuroshouri.com/'
stripUrl = url + 'kuroshouri/%s/'
firstStripUrl = stripUrl % 'kuro-shouri'

View file

@ -1,12 +1,12 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2020 Tobias Gruetzmacher
# Copyright (C) 2015-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
class KeenSpot(_ParserScraper):
class KeenSpot(ParserScraper):
multipleImagesPerStrip = True
imageSearch = (
'//img[contains(@src, "/comics/")]',

View file

@ -1,10 +1,10 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
class KemonoCafe(_ParserScraper):
class KemonoCafe(ParserScraper):
imageSearch = '//div[@id="comic"]//img'
prevSearch = '//a[contains(@class, "comic-nav-previous")]'

View file

@ -1,9 +1,9 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2021 Tobias Gruetzmacher
from .common import _WordPressScraper
from .common import WordPressScraper
class KrisStraub(_WordPressScraper):
class KrisStraub(WordPressScraper):
prevSearch = '//a[text()="Previous"]'
endOfLife = True
help = 'Index format: yyyymmdd'

View file

@ -8,7 +8,7 @@ from re import compile
from ..scraper import _BasicScraper, _ParserScraper
from ..helpers import bounceStarter, indirectStarter
from ..util import tagre
from .common import _ComicControlScraper, _WordPressScraper, _WPNaviIn
from .common import ComicControlScraper, WordPressScraper, WordPressNaviIn
class Lackadaisy(_ParserScraper):
@ -28,7 +28,7 @@ class Lackadaisy(_ParserScraper):
return 'lackadaisy_%s.%s' % (num, ext)
class LastResort(_WordPressScraper):
class LastResort(WordPressScraper):
url = 'http://www.lastres0rt.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'that-sound-you-hear-is-a-shattered-stereotype'
@ -68,11 +68,11 @@ class LeastICouldDo(_ParserScraper):
help = 'Index format: yyyymmdd'
class LetsSpeakEnglish(_ComicControlScraper):
class LetsSpeakEnglish(ComicControlScraper):
url = 'http://www.marycagle.com'
class LifeAintNoPonyFarm(_WordPressScraper):
class LifeAintNoPonyFarm(WordPressScraper):
url = ('https://web.archive.org/web/20181221154155/'
'http://sarahburrini.com/en/')
firstStripUrl = url + 'comic/my-first-webcomic/'
@ -137,7 +137,7 @@ class LifeAsRendered(_ParserScraper):
return None
class LilithsWord(_ComicControlScraper):
class LilithsWord(ComicControlScraper):
url = 'http://www.lilithword.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'prologue-page-00'
@ -188,7 +188,7 @@ class LoadingArtist(_ParserScraper):
prevSearch = "//a[contains(concat(' ', @class, ' '), ' prev ')]"
class LoFiJinks(_WPNaviIn):
class LoFiJinks(WordPressNaviIn):
baseUrl = 'https://hijinksensue.com/comic/'
url = baseUrl + 'learning-to-love-again/'
firstStripUrl = baseUrl + 'lo-fijinks-everything-i-know-anout-james-camerons-avatar-movie/'

View file

@ -10,7 +10,7 @@ from ..helpers import indirectStarter
from ..scraper import _BasicScraper, _ParserScraper
from ..util import tagre
from ..xml import NS
from .common import _ComicControlScraper, _WordPressScraper, _WPWebcomic
from .common import ComicControlScraper, WordPressScraper, WordPressWebcomic
class MacHall(_BasicScraper):
@ -29,12 +29,12 @@ class MadamAndEve(_BasicScraper):
multipleImagesPerStrip = True
class Magellan(_WordPressScraper):
class Magellan(WordPressScraper):
url = 'https://magellanverse.com/'
firstStripUrl = url + 'comic/20040307wannabe/'
class MagickChicks(_ComicControlScraper):
class MagickChicks(ComicControlScraper):
url = 'https://pixietrixcomix.com/magick-chicks/'
stripUrl = url + '%s'
firstStripUrl = stripUrl % 'tis-but-a-trifle-2'
@ -52,7 +52,7 @@ class ManlyGuysDoingManlyThings(_ParserScraper):
help = 'Index format: ddmmyyyy'
class MareInternum(_WordPressScraper):
class MareInternum(WordPressScraper):
url = 'https://www.marecomic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'intro-page-1'
@ -98,7 +98,7 @@ class MaxOveracts(_ParserScraper):
help = 'Index format: nnn'
class Meek(_WordPressScraper):
class Meek(WordPressScraper):
url = 'https://www.meekcomic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'chapter-1-cover'
@ -113,27 +113,27 @@ class MegaTokyo(_BasicScraper):
help = 'Index format: nnnn'
class Meiosis(_WordPressScraper):
class Meiosis(WordPressScraper):
url = 'http://meiosiswebcomic.com/'
class Melonpool(_WordPressScraper):
class Melonpool(WordPressScraper):
url = 'http://www.melonpool.com/'
allow_errors = (500,)
class MenageA3(_ComicControlScraper):
class MenageA3(ComicControlScraper):
adult = True
url = 'https://pixietrixcomix.com/menage-a-3/'
firstStripUrl = url + 'for-new-readers'
endOfLife = True
class Metacarpolis(_ComicControlScraper):
class Metacarpolis(ComicControlScraper):
url = 'http://www.metacarpolis.com'
class Misfile(_ComicControlScraper):
class Misfile(ComicControlScraper):
url = 'http://www.misfile.com/misfile/'
stripUrl = url + '%s'
firstStripUrl = stripUrl % '2004-02-22'
@ -149,7 +149,7 @@ class MisfileHellHigh(Misfile):
help = 'Index format: yyyy-mm-dd'
class MistyTheMouse(_WordPressScraper):
class MistyTheMouse(WordPressScraper):
url = 'http://www.mistythemouse.com/'
prevSearch = '//a[@rel="prev"]'
firstStripUrl = 'http://www.mistythemouse.com/?p=12'
@ -176,13 +176,13 @@ class MonsieurLeChien(_BasicScraper):
help = 'Index format: n'
class MonsterSoup(_WordPressScraper):
class MonsterSoup(WordPressScraper):
url = 'https://monstersoupcomic.com/'
stripUrl = url + '?comic=%s'
firstStripUrl = stripUrl % 'chapter-1-cover'
class Moonlace(_WPWebcomic):
class Moonlace(WordPressWebcomic):
url = 'https://moonlace.darkbluecomics.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'page-0-1'
@ -272,7 +272,7 @@ class MysteriesOfTheArcana(_ParserScraper):
prevSearch = '//a[@class="navprevious"]'
class MonsterUnderTheBed(_WordPressScraper):
class MonsterUnderTheBed(WordPressScraper):
url = 'http://themonsterunderthebed.net/'
stripUrl = url + '?comic=%s'
firstStripUrl = stripUrl % 'test-post'

View file

@ -1,16 +1,16 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2019-2021 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
import json
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
class MangaDex(_ParserScraper):
class MangaDex(ParserScraper):
multipleImagesPerStrip = True
def __init__(self, name, mangaId):
super(MangaDex, self).__init__('MangaDex/' + name)
super().__init__('MangaDex/' + name)
baseUrl = 'https://api.mangadex.org/'
self.url = baseUrl + 'manga/%s' % mangaId

View file

@ -8,10 +8,10 @@ from re import compile, escape
from ..scraper import _BasicScraper, _ParserScraper
from ..helpers import indirectStarter, bounceStarter
from ..util import tagre
from .common import _ComicControlScraper, _WordPressScraper, _WPNavi, _WPWebcomic
from .common import ComicControlScraper, WordPressScraper, WordPressNavi, WordPressWebcomic
class Namesake(_ComicControlScraper):
class Namesake(ComicControlScraper):
url = 'http://namesakecomic.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'the-journey-begins'
@ -32,7 +32,7 @@ class NatalieDee(_BasicScraper):
return '%s-%s' % (date, filename)
class Nedroid(_WordPressScraper):
class Nedroid(WordPressScraper):
url = 'http://nedroid.com/'
prevSearch = '//a[@rel="prev"]'
@ -55,7 +55,7 @@ class NeoEarth(_BasicScraper):
help = 'Index format: yyyy-mm-dd'
class NerfNow(_WordPressScraper):
class NerfNow(WordPressScraper):
url = 'https://www.nerfnow.com/'
prevSearch = '//li[@id="nav_previous"]/a'
@ -75,7 +75,7 @@ class Newshounds(_ParserScraper):
return super(Newshounds, self).getPrevUrl(url, data)
class NewWorld(_WordPressScraper):
class NewWorld(WordPressScraper):
url = ('https://web.archive.org/web/20190718012133/'
'http://www.tfsnewworld.com/')
stripUrl = url + '%s/'
@ -85,7 +85,7 @@ class NewWorld(_WordPressScraper):
help = 'Index format: yyyy/mm/dd/stripn'
class NeverSatisfied(_ComicControlScraper):
class NeverSatisfied(ComicControlScraper):
url = 'https://www.neversatisfiedcomic.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'never-satisfied'
@ -107,13 +107,13 @@ class NichtLustig(_BasicScraper):
return '%s' % (filename)
class Nicky510(_WPNavi):
class Nicky510(WordPressNavi):
url = ('https://web.archive.org/web/20160510215718/'
'http://www.nickyitis.com/')
endOfLife = True
class Nightshift(_WPWebcomic):
class Nightshift(WordPressWebcomic):
url = 'https://poecatcomix.com/nightshift-static/'
stripUrl = 'https://poecatcomix.com/nightshift/%s/'
firstStripUrl = stripUrl % 'ns-cover'
@ -189,7 +189,7 @@ class NonPlayerCharacter(_ParserScraper):
return pageUrl.rstrip('/').rsplit('/', 1)[-1]
class NotAVillain(_WPWebcomic):
class NotAVillain(WordPressWebcomic):
url = 'http://navcomic.com/'
stripUrl = url + 'not-a-villain/%s/'
firstStripUrl = stripUrl % 'v1-001'

View file

@ -1,10 +1,10 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2019-2020 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from .common import _ParserScraper
from ..scraper import ParserScraper
class NamirDeiter(_ParserScraper):
class NamirDeiter(ParserScraper):
imageSearch = '//img[contains(@src, "comics/")]'
prevSearch = ('//a[@rel="prev"]',
'//a[./img[contains(@src, "previous")]]',
@ -46,7 +46,7 @@ class NamirDeiter(_ParserScraper):
)
class UnlikeMinerva(_ParserScraper):
class UnlikeMinerva(ParserScraper):
name = 'NamirDeiter/UnlikeMinerva'
baseUrl = 'https://unlikeminerva.com/archive/index.php'
stripUrl = baseUrl + '?week=%s'

View file

@ -1,16 +1,16 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2016 Tobias Gruetzmacher
from ..scraper import _ParserScraper
# Copyright (C) 2015-2022 Tobias Gruetzmacher
from ..scraper import ParserScraper
class Nitrocosm(_ParserScraper):
class Nitrocosm(ParserScraper):
imageSearch = '//img[@class="gallery_display"]'
prevSearch = '//a[@class="nav_btn_previous"]'
def __init__(self, name, path):
super(Nitrocosm, self).__init__(name)
super().__init__(name)
self.url = 'http://www.nitrocosm.com/go/' + path
@classmethod

View file

@ -1,38 +1,28 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2016 Tobias Gruetzmacher
from ..scraper import _ParserScraper
# Copyright (C) 2015-2022 Tobias Gruetzmacher
from ..scraper import ParserScraper
from .common import ComicControlScraper
class _NuklearPower(_ParserScraper):
class NuklearPower(ParserScraper):
prevSearch = '//a[@rel="prev"]'
imageSearch = '//div[@id="comic"]/img'
def __init__(self, name):
super(_NuklearPower, self).__init__('NuklearPower/' + name[2:])
def __init__(self, name, path):
super().__init__('NuklearPower/' + name)
self.url = 'http://www.nuklearpower.com/' + path + '/'
@property
def url(self):
return 'http://www.nuklearpower.com/' + self.path + '/'
@classmethod
def getmodules(cls):
return (
cls('8BitTheater', '8-bit-theater'),
cls('HowIKilledYourMaster', 'hikym'),
cls('TheDreadful', 'dreadful'),
cls('Warbot', 'warbot'),
)
class NP8BitTheater(_NuklearPower):
path = '8-bit-theater'
class NPAtomicRobo(_NuklearPower):
class NPAtomicRobo(ComicControlScraper):
name = 'NuklearPower/AtomicRobo'
url = 'http://www.atomic-robo.com/'
imageSearch = '//img[@id="cc-comic"]'
class NPHowIKilledYourMaster(_NuklearPower):
path = 'hikym'
class NPTheDreadful(_NuklearPower):
path = 'dreadful'
class NPWarbot(_NuklearPower):
path = 'warbot'

View file

@ -3,9 +3,9 @@
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2020 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from .common import _WordPressScraper
from .common import WordPressScraper
class NineteenSeventySeven(_WordPressScraper):
class NineteenSeventySeven(WordPressScraper):
name = '1977'
url = 'http://1977thecomic.com/'

View file

@ -8,7 +8,7 @@ from re import compile, escape
from ..helpers import bounceStarter, indirectStarter
from ..scraper import _BasicScraper, _ParserScraper
from ..util import tagre
from .common import _WordPressScraper, _WPNavi
from .common import WordPressScraper, WordPressNavi
class OctopusPie(_ParserScraper):
@ -71,7 +71,7 @@ class Oglaf(_ParserScraper):
return urls
class OhJoySexToy(_WPNavi):
class OhJoySexToy(WordPressNavi):
url = 'http://www.ohjoysextoy.com/'
firstStripUrl = url + 'introduction/'
textSearch = '//div[@id="comic"]//img/@alt'
@ -99,25 +99,25 @@ class OmakeTheater(_ParserScraper):
help = 'Index format: number (unpadded)'
class OnTheEdge(_WordPressScraper):
class OnTheEdge(WordPressScraper):
url = 'http://ontheedgecomics.com/'
firstStripUrl = 'http://ontheedgecomics.com/comic/ote0001/'
class OopsComicAdventure(_WordPressScraper):
class OopsComicAdventure(WordPressScraper):
url = ('https://web.archive.org/web/20190102215141/'
'http://oopscomicadventure.com/')
endOfLife = True
class Optipess(_WPNavi):
class Optipess(WordPressNavi):
url = 'http://www.optipess.com/'
firstStripUrl = url + '2008/12/01/jason-friend-of-the-butterflies/'
textSearch = '//div[@id="comic"]//img/@alt'
textOptional = True
class OrderOfTheBlackDog(_WordPressScraper):
class OrderOfTheBlackDog(WordPressScraper):
url = 'http://orderoftheblackdog.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'issue-1-cover'
@ -147,7 +147,7 @@ class OurHomePlanet(_ParserScraper):
help = 'Index format: n (unpadded)'
class OutOfPlacers(_WordPressScraper):
class OutOfPlacers(WordPressScraper):
url = 'http://www.valsalia.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'prologue/01'
@ -164,7 +164,7 @@ class OverCompensating(_BasicScraper):
help = 'Index format: number'
class OzyAndMillie(_WordPressScraper):
class OzyAndMillie(WordPressScraper):
stripUrl = 'https://ozyandmillie.org/comic/%s/'
url = stripUrl % 'ozy-and-millie-2131'
firstStripUrl = stripUrl % 'ozy-and-millie-2'

View file

@ -8,7 +8,7 @@ from re import compile, escape
from ..scraper import _BasicScraper, _ParserScraper
from ..helpers import bounceStarter, queryNamer, indirectStarter
from ..util import tagre
from .common import _ComicControlScraper, _WordPressScraper, _WPNavi
from .common import ComicControlScraper, WordPressScraper, WordPressNavi
class PandyLand(_ParserScraper):
@ -47,12 +47,12 @@ class ParallelUniversum(_BasicScraper):
lang = 'de'
class ParaNatural(_ComicControlScraper):
class ParaNatural(ComicControlScraper):
url = 'https://www.paranatural.net/'
firstStripUrl = url + 'comic/chapter-1'
class PartiallyClips(_WordPressScraper):
class PartiallyClips(WordPressScraper):
url = ('https://web.archive.org/web/20180509161332/'
'http://partiallyclips.com/')
firstStripUrl = url + 'comic/screaming-woman/'
@ -117,7 +117,7 @@ class PennyArcade(_ParserScraper):
help = 'Index format: yyyy/mm/dd'
class PeppermintSaga(_WPNavi):
class PeppermintSaga(WordPressNavi):
url = 'http://www.pepsaga.com/'
stripUrl = url + '?p=%s'
firstStripUrl = stripUrl % '3'
@ -125,7 +125,7 @@ class PeppermintSaga(_WPNavi):
adult = True
class PeppermintSagaBGR(_WPNavi):
class PeppermintSagaBGR(WordPressNavi):
url = 'http://bgr.pepsaga.com/'
stripUrl = url + '?p=%s'
firstStripUrl = stripUrl % '4'
@ -176,11 +176,11 @@ class PHDComics(_ParserScraper):
)
class Picklewhistle(_ComicControlScraper):
class Picklewhistle(ComicControlScraper):
url = 'http://www.picklewhistle.com/'
class PicPakDog(_WordPressScraper):
class PicPakDog(WordPressScraper):
url = 'http://www.picpak.net/'
firstStripUrl = url + 'comic/dogs-cant-spell/'
@ -243,7 +243,7 @@ class PoorlyDrawnLines(_ParserScraper):
prevSearch = '//a[@rel="prev"]'
class PoppyOPossum(_WordPressScraper):
class PoppyOPossum(WordPressScraper):
baseUrl = 'https://www.poppy-opossum.com/'
url = baseUrl + '?latest'
stripUrl = baseUrl + 'comic/%s'
@ -274,7 +274,7 @@ class Precocious(_ParserScraper):
help = 'Index format: yyyy/mm/dd'
class PrinceOfSartar(_WPNavi):
class PrinceOfSartar(WordPressNavi):
url = 'http://www.princeofsartar.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'introduction-chapter-1'
@ -289,7 +289,7 @@ class PrinceOfSartar(_WPNavi):
return '%s.%s' % (title, image_ext)
class ProphecyOfTheCircle(_WPNavi):
class ProphecyOfTheCircle(WordPressNavi):
url = 'https://www.prophecyofthecircle.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'prologue'

View file

@ -3,10 +3,10 @@
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2020 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from .common import _WordPressScraper, _WPNavi
from .common import WordPressScraper, WordPressNavi
class PetiteSymphony(_WPNavi):
class PetiteSymphony(WordPressNavi):
multipleImagesPerStrip = True
help = 'Index format: named number'
@ -24,7 +24,7 @@ class PetiteSymphony(_WPNavi):
)
class ComicsBreak(_WordPressScraper):
class ComicsBreak(WordPressScraper):
def __init__(self, name, archive=None, adult=False):
super(ComicsBreak, self).__init__('ComicsBreak/' + name)
self.url = 'http://%s.comicsbreak.com/' % name.lower()

View file

@ -1,10 +1,10 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2019-2020 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from .common import _ParserScraper
from ..scraper import ParserScraper
class ProjectFuture(_ParserScraper):
class ProjectFuture(ParserScraper):
imageSearch = '//td[@class="tamid"]/img'
prevSearch = '//a[./img[@alt="Previous"]]'

View file

@ -1,12 +1,12 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2020 Tobias Gruetzmacher
# Copyright (C) 2015-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
class QuantumVibe(_ParserScraper):
class QuantumVibe(ParserScraper):
url = 'https://www.quantumvibe.com/'
stripUrl = url + 'strip?page=%s'
firstStripUrl = stripUrl % '1'
@ -14,7 +14,7 @@ class QuantumVibe(_ParserScraper):
prevSearch = '//a[./img[@alt="Previous Strip"]]'
class QuestionableContent(_ParserScraper):
class QuestionableContent(ParserScraper):
url = 'http://www.questionablecontent.net/'
stripUrl = url + 'view.php?comic=%s'
firstStripUrl = stripUrl % '1'
@ -23,7 +23,7 @@ class QuestionableContent(_ParserScraper):
help = 'Index format: n (unpadded)'
class Qwantz(_ParserScraper):
class Qwantz(ParserScraper):
url = 'http://www.qwantz.com/index.php'
stripUrl = url + '?comic=%s'
firstStripUrl = stripUrl % '1'

View file

@ -9,14 +9,14 @@ from urllib.parse import urljoin
from ..helpers import bounceStarter
from ..scraper import _BasicScraper, _ParserScraper
from ..util import tagre
from .common import _WordPressScraper, _WPNavi, _WPWebcomic
from .common import WordPressScraper, WordPressNavi, WordPressWebcomic
class RalfTheDestroyer(_WordPressScraper):
class RalfTheDestroyer(WordPressScraper):
url = 'http://ralfthedestroyer.com/'
class RayFox(_WPNavi):
class RayFox(WordPressNavi):
url = 'https://www.rayfoxthecomic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'not-a-super-hero/it-begins'
@ -39,12 +39,12 @@ class RayFox(_WPNavi):
return filename + '.' + ext
class RaynaOnTheRiver(_WordPressScraper):
class RaynaOnTheRiver(WordPressScraper):
url = 'http://www.catomix.com/rayna/'
firstStripUrl = url + 'archives/comic/teaser-poster'
class RealLife(_WordPressScraper):
class RealLife(WordPressScraper):
url = 'https://reallifecomics.com/'
stripUrl = url + 'comic.php?comic=%s'
firstStripUrl = stripUrl % 'title-1'
@ -106,7 +106,7 @@ class RedMeat(_ParserScraper):
return '_'.join(parts[1:3])
class Requiem(_WordPressScraper):
class Requiem(WordPressScraper):
baseUrl = 'http://requiem.spiderforest.com/'
url = baseUrl + '?latest'
stripUrl = baseUrl + 'comic/%s'
@ -146,7 +146,7 @@ class Replay(_ParserScraper):
return name
class RiversideExtras(_WPWebcomic):
class RiversideExtras(WordPressWebcomic):
url = 'https://riversidecomics.com/'

View file

@ -1,10 +1,10 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2019-2020 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
class RHJunior(_ParserScraper):
class RHJunior(ParserScraper):
stripUrl = 'https://www.rhjunior.com/%s/'
imageSearch = '//div[contains(@class, "entry-content")]//img'
multipleImagesPerStrip = True

View file

@ -2,16 +2,16 @@
# Copyright (C) 2019-2020 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Daniel Ring
from ..helpers import indirectStarter
from .common import _WordPressScraper, _WPNaviIn
from .common import WordPressScraper, WordPressNaviIn
class Housepets(_WordPressScraper):
class Housepets(WordPressScraper):
url = 'http://www.housepetscomic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = '2008/06/02/when-boredom-strikes'
class RickGriffinStudios(_WPNaviIn):
class RickGriffinStudios(WordPressNaviIn):
baseUrl = 'http://rickgriffinstudios.com/'
stripUrl = baseUrl + 'comic-post/%s/'
latestSearch = '//a[contains(@title, "Permanent Link")]'

View file

@ -9,7 +9,7 @@ from os.path import splitext
from ..scraper import _BasicScraper, _ParserScraper
from ..helpers import indirectStarter, bounceStarter, joinPathPartsNamer
from ..util import tagre
from .common import _ComicControlScraper, _WordPressScraper, _WPNavi, _WPWebcomic
from .common import ComicControlScraper, WordPressScraper, WordPressNavi, WordPressWebcomic
class SabrinaOnline(_BasicScraper):
@ -33,17 +33,17 @@ class SabrinaOnline(_BasicScraper):
return archivepages[-1]
class SafelyEndangered(_WPNavi):
class SafelyEndangered(WordPressNavi):
url = 'http://www.safelyendangered.com/'
firstStripUrl = url + 'comic/ignored/'
class SaffronAndSage(_WordPressScraper):
class SaffronAndSage(WordPressScraper):
url = 'https://www.saffroncomic.com/'
firstStripUrl = url + 'comic/p0001/'
class SailorsunOrg(_WordPressScraper):
class SailorsunOrg(WordPressScraper):
url = 'http://sailorsun.org/'
@ -56,7 +56,7 @@ class SamAndFuzzy(_ParserScraper):
help = 'Index format: n (unpadded)'
class SandraOnTheRocks(_ComicControlScraper):
class SandraOnTheRocks(ComicControlScraper):
url = 'https://pixietrixcomix.com/sandra-on-the-rocks/'
stripUrl = url + '%s'
firstStripUrl = stripUrl % 'start-by-running'
@ -64,7 +64,7 @@ class SandraOnTheRocks(_ComicControlScraper):
help = 'Index format: name'
class Savestate(_WPNavi):
class Savestate(WordPressNavi):
url = 'http://www.savestatecomic.com/'
stripUrl = url + '%s'
firstStripUrl = stripUrl % '2014/02/pokemon-bank'
@ -189,7 +189,7 @@ class ShadesOfGray(_ParserScraper):
return pageUrl.rstrip('/').rsplit('/', 1)[-1]
class Sharksplode(_WordPressScraper):
class Sharksplode(WordPressScraper):
url = 'http://sharksplode.com/'
textSearch = '//div[@id="comic"]//img/@alt'
allow_errors = (403,)
@ -206,13 +206,13 @@ class Sheldon(_BasicScraper):
help = 'Index format: yymmdd'
class Shifters(_WPNavi):
class Shifters(WordPressNavi):
url = 'http://shiftersonline.com/'
stripUrl = url + '%s/'
firstStripUrl = stripUrl % 'shifters-redux-promo'
class ShipInABottle(_WordPressScraper):
class ShipInABottle(WordPressScraper):
url = 'http://shipinbottle.pepsaga.com/'
stripUrl = url + '?p=%s'
firstStripUrl = stripUrl % '281'
@ -229,7 +229,7 @@ class Shortpacked(_ParserScraper):
help = 'Index format: nnn'
class ShotgunShuffle(_WordPressScraper):
class ShotgunShuffle(WordPressScraper):
url = 'http://shotgunshuffle.com/'
firstStripUrl = url + 'comic/pilot/'
@ -244,30 +244,30 @@ class SinFest(_ParserScraper):
help = 'Index format: yyyy-mm-dd'
class SisterClaire(_ComicControlScraper):
class SisterClaire(ComicControlScraper):
url = 'https://www.sisterclaire.com/comic/'
firstStripUrl = url + 'book-one'
class SixGunMage(_ComicControlScraper):
class SixGunMage(ComicControlScraper):
url = 'http://www.6gunmage.com/comic/'
stripUrl = url + '%s'
firstStripUrl = stripUrl % '6-gun-mage-kickoff'
class SixPackOfOtters(_WPWebcomic):
class SixPackOfOtters(WordPressWebcomic):
url = 'http://sixpackofotters.com/'
stripUrl = url + 'pages/%s/'
firstStripUrl = stripUrl % 'chapter-01-tandem'
class SkinDeep(_WPWebcomic):
class SkinDeep(WordPressWebcomic):
url = 'http://www.skindeepcomic.com/'
stripUrl = url + 'archive/%s/'
firstStripUrl = stripUrl % 'issue-1-cover'
class SleeplessDomain(_ComicControlScraper):
class SleeplessDomain(ComicControlScraper):
url = 'http://www.sleeplessdomain.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'chapter-1-cover'
@ -277,7 +277,7 @@ class SleeplessDomain(_ComicControlScraper):
return pageUrl.rsplit('/', 1)[-1] + '.' + imageUrl.rsplit('.', 1)[-1]
class SlightlyDamned(_ComicControlScraper):
class SlightlyDamned(ComicControlScraper):
url = 'http://www.sdamned.com/'
firstStripUrl = url + 'comic/prologue'
@ -307,7 +307,7 @@ class SluggyFreelance(_ParserScraper):
return imageurl.rsplit('/', 1)[-1].split('.pagespeed', 1)[0]
class SMBC(_ComicControlScraper):
class SMBC(ComicControlScraper):
url = 'https://www.smbc-comics.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % '2002-09-05'
@ -325,7 +325,7 @@ class SMBC(_ComicControlScraper):
return filename
class SnowFlame(_WordPressScraper):
class SnowFlame(WordPressScraper):
url = ('https://web.archive.org/web/20160905071051/'
'http://www.snowflamecomic.com/')
stripUrl = url + '?comic=snowflame-%s-%s'
@ -346,7 +346,7 @@ class SnowFlame(_WordPressScraper):
return "%s-%s-%s" % (chapter, page, filename)
class SodiumEyes(_WordPressScraper):
class SodiumEyes(WordPressScraper):
url = 'https://web.archive.org/web/20200220041406/http://sodiumeyes.com/'
starter = indirectStarter
endOfLife = True
@ -362,7 +362,7 @@ class SomethingPositive(_ParserScraper):
help = 'Index format: mmddyyyy'
class Sorcery101(_WPWebcomic):
class Sorcery101(WordPressWebcomic):
baseUrl = 'https://kelmcdonald.com/sorcery-101/'
stripUrl = baseUrl + '%s/'
url = stripUrl % 'sorcery101-ch-01'
@ -426,11 +426,11 @@ class SpareParts(_BasicScraper):
help = 'Index format: yyyymmdd'
class Spinnerette(_ComicControlScraper):
class Spinnerette(ComicControlScraper):
url = 'http://www.spinnyverse.com'
class SPQRBlues(_WordPressScraper):
class SPQRBlues(WordPressScraper):
url = 'http://spqrblues.com/IV/'
@ -517,7 +517,7 @@ class StarCrossdDestiny(_ParserScraper):
return directory + '-' + filename
class StarfireAgency(_WPWebcomic):
class StarfireAgency(WordPressWebcomic):
url = 'https://poecatcomix.com/starfire-agency-static/'
stripUrl = 'https://poecatcomix.com/starfire-agency/%s/'
firstStripUrl = stripUrl % '2005-09-201'
@ -543,7 +543,7 @@ class StarfireAgency(_WPWebcomic):
return filename
class StarTrip(_ComicControlScraper):
class StarTrip(ComicControlScraper):
url = 'https://www.startripcomic.com/'
@ -566,11 +566,11 @@ class StickyDillyBuns(_BasicScraper):
help = 'Index format: name'
class StreetFighter(_ComicControlScraper):
class StreetFighter(ComicControlScraper):
url = 'http://www.streetfightercomics.com'
class StringTheory(_WPNavi):
class StringTheory(WordPressNavi):
url = 'http://www.stringtheorycomic.com/'
firstStripUrl = url + 'comics/chapterone/chapterone/'
@ -617,7 +617,7 @@ class SuburbanJungle(_ParserScraper):
prevSearch = '//div[@class="nav-previous"]/a'
class SuburbanJungleRoughHousing(_WordPressScraper):
class SuburbanJungleRoughHousing(WordPressScraper):
url = 'http://roughhouse.suburbanjungle.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'rough-housing-issue-1-cover'
@ -632,7 +632,7 @@ class Supercell(_ParserScraper):
prevSearch = '//div[@class="comicnav"]/a[./img[contains(@src, "comnav_02")]]'
class SupernormalStep(_ComicControlScraper):
class SupernormalStep(ComicControlScraper):
url = 'http://supernormalstep.com/'

View file

@ -2,10 +2,10 @@
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2020 Tobias Gruetzmacher
from .common import _WordPressScraper
from .common import WordPressScraper
class SandraAndWoo(_WordPressScraper):
class SandraAndWoo(WordPressScraper):
prevSearch = '//a[@rel="prev"]'
def __init__(self, name, urlName, firstUrl, lang='en'):

View file

@ -1,22 +1,22 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2019-2021 Tobias Gruetzmacher
# Copyright (C) 2019-2021 Daniel Ring
from .common import _WordPressSpliced
from .common import WordPressSpliced
class _WithSid(_WordPressSpliced):
class _WithSid(WordPressSpliced):
def __init__(self, name, sid, eol=False):
super().__init__(name)
self.stripUrl = self.baseUrl + 'comic/%s/?sid={}'.format(sid)
class AbbysAgency(_WordPressSpliced):
class AbbysAgency(WordPressSpliced):
url = 'https://abbysagency.us/'
stripUrl = url + 'blog/comic/%s/'
firstStripUrl = stripUrl % 'a'
class AlienDice(_WordPressSpliced):
class AlienDice(WordPressSpliced):
url = 'https://aliendice.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % '05162001'
@ -32,7 +32,7 @@ class AlienDice(_WordPressSpliced):
return imageUrl.rsplit('/', 1)[-1].replace('20010831', '2001-08-31')
class AlienDiceLegacy(_WordPressSpliced):
class AlienDiceLegacy(WordPressSpliced):
name = 'AlienDice/Legacy'
baseUrl = 'https://aliendice.com/'
url = baseUrl + 'series/legacy/'
@ -45,7 +45,7 @@ class AlienDiceLegacy(_WordPressSpliced):
return super(AlienDiceLegacy, self).isfirststrip(url.rsplit('?', 1)[0])
class BlackRose(_WordPressSpliced):
class BlackRose(WordPressSpliced):
url = 'https://www.blackrose.monster/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % '2004-11-01'
@ -80,7 +80,7 @@ class TheCyantianChronicles(_WithSid):
)
class Shivae(_WordPressSpliced):
class Shivae(WordPressSpliced):
url = 'https://shivae.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % '09202001'

View file

@ -1,12 +1,12 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2021 Tobias Gruetzmacher
from ..scraper import _ParserScraper
# Copyright (C) 2015-2022 Tobias Gruetzmacher
from ..scraper import ParserScraper
from ..helpers import indirectStarter
class Snafu(_ParserScraper):
class Snafu(ParserScraper):
# Next and Previous are swapped...
prevSearch = '//a[@class="next"]'
imageSearch = '//div[@class="comicpage"]/img'
@ -14,7 +14,7 @@ class Snafu(_ParserScraper):
starter = indirectStarter
def __init__(self, name, path):
super(Snafu, self).__init__('SnafuComics/' + name)
super().__init__('SnafuComics/' + name)
self.url = 'http://snafu-comics.com/swmseries/' + path
def namer(self, image_url, page_url):

View file

@ -1,16 +1,16 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2019-2020 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from ..scraper import _ParserScraper
from .common import _WordPressScraper
from ..scraper import ParserScraper
from .common import WordPressScraper
class StudioKhimera(_ParserScraper):
class StudioKhimera(ParserScraper):
imageSearch = '//figure[@class="gallery-item"]//img/@data-src'
prevSearch = '//a[@rel="prev"]'
def __init__(self, name, sub, last=None, adult=False, fixNames=False):
super(StudioKhimera, self).__init__('StudioKhimera/' + name)
super().__init__('StudioKhimera/' + name)
self.baseUrl = 'https://%s.studiokhimera.com/' % sub
self.stripUrl = self.baseUrl + '%s/'
@ -47,7 +47,7 @@ class StudioKhimera(_ParserScraper):
)
class UberQuest(_WordPressScraper):
class UberQuest(WordPressScraper):
name = 'StudioKhimera/UberQuest'
stripUrl = 'https://uberquest.studiokhimera.com/comic/page/%s/'
url = stripUrl % 'latest'

View file

@ -12,7 +12,7 @@ except ImportError:
from ..scraper import _BasicScraper, _ParserScraper
from ..helpers import indirectStarter
from ..util import tagre
from .common import _ComicControlScraper, _WordPressScraper, _WPNavi, _WPWebcomic
from .common import ComicControlScraper, WordPressScraper, WordPressNavi, WordPressWebcomic
class TailsAndTactics(_ParserScraper):
@ -23,13 +23,13 @@ class TailsAndTactics(_ParserScraper):
prevSearch = '//a[text()=" Back"]'
class TekMage(_WPNavi):
class TekMage(WordPressNavi):
url = 'https://tekmagecomic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'chapter-1-page-1'
class Tamberlane(_WPWebcomic):
class Tamberlane(WordPressWebcomic):
baseUrl = 'https://www.tamberlanecomic.com/'
url = baseUrl + 'latest/'
stripUrl = baseUrl + 'tamberlane/%s/'
@ -38,7 +38,7 @@ class Tamberlane(_WPWebcomic):
prevSearch = '//a[@class="previous-link"]'
class TheBoyWhoFell(_ComicControlScraper):
class TheBoyWhoFell(ComicControlScraper):
url = 'https://www.boywhofell.com/'
firstStripUrl = url + 'comic/ch00p00'
@ -54,7 +54,7 @@ class TheBrads(_ParserScraper):
endOfLife = True
class TheChroniclesOfHuxcyn(_WordPressScraper):
class TheChroniclesOfHuxcyn(WordPressScraper):
url = 'https://huxcyn.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'opening-001'
@ -85,7 +85,7 @@ class TheClassMenagerie(_ParserScraper):
endOfLife = True
class TheDepths(_WPWebcomic):
class TheDepths(WordPressWebcomic):
url = 'https://www.thedepthscomic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'page-01'
@ -101,18 +101,18 @@ class TheDepths(_WPWebcomic):
return filename
class TheDevilsPanties(_WPNavi):
class TheDevilsPanties(WordPressNavi):
url = 'https://thedevilspanties.com/'
stripUrl = url + 'archives/%s'
firstStripUrl = stripUrl % '300'
help = 'Index format: number'
class TheDreamlandChronicles(_WordPressScraper):
class TheDreamlandChronicles(WordPressScraper):
url = 'http://www.thedreamlandchronicles.com/'
class TheForgottenOrder(_ComicControlScraper):
class TheForgottenOrder(ComicControlScraper):
url = 'http://www.forgottenordercomic.com/'
firstStripUrl = url + 'comic/prolouge-01-book-1'
@ -126,11 +126,11 @@ class TheGamerCat(_ParserScraper):
help = 'Index format: stripname'
class TheGentlemansArmchair(_WordPressScraper):
class TheGentlemansArmchair(WordPressScraper):
url = 'http://thegentlemansarmchair.com/'
class TheGentleWolf(_WordPressScraper):
class TheGentleWolf(WordPressScraper):
url = 'https://thegentlewolf.net/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'tgw-001'
@ -143,12 +143,12 @@ class TheGentleWolf(_WordPressScraper):
return filename
class TheGlassScientists(_ComicControlScraper):
class TheGlassScientists(ComicControlScraper):
url = 'https://www.theglassscientists.com/'
firstStripUrl = url + 'comic/chapter-i'
class TheJunkHyenasDiner(_WordPressScraper):
class TheJunkHyenasDiner(WordPressScraper):
url = 'http://junkhyenasdiner.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'intro'
@ -164,7 +164,7 @@ class TheLandscaper(_ParserScraper):
endOfLife = True
class TheMelvinChronicles(_WordPressScraper):
class TheMelvinChronicles(WordPressScraper):
url = 'http://melvin.jeaniebottle.com/'
@ -179,7 +179,7 @@ class TheNightBelongsToUs(_ParserScraper):
adult = True
class TheNoob(_WordPressScraper):
class TheNoob(WordPressScraper):
url = 'http://thenoobcomic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % '1'
@ -247,7 +247,7 @@ class TheWhiteboard(_ParserScraper):
return self.url + tourl
class TheWotch(_WordPressScraper):
class TheWotch(WordPressScraper):
url = 'http://www.thewotch.com/'
firstStripUrl = url + '?comic=enter-the-wotch'
@ -263,7 +263,7 @@ class ThisIsIndexed(_BasicScraper):
help = 'Index format: number'
class ThreePanelSoul(_ComicControlScraper):
class ThreePanelSoul(ComicControlScraper):
url = 'http://threepanelsoul.com/'
firstStripUrl = url + 'comic/a-test-comic'
@ -283,7 +283,7 @@ class TinyDickAdventures(_ParserScraper):
return page + '.' + ext
class ToonHole(_WordPressScraper):
class ToonHole(WordPressScraper):
url = 'http://toonhole.com/'
firstStripUrl = url + 'comic/toon-hole-coming-soon-2010/'
@ -300,7 +300,7 @@ class TrippingOverYou(_BasicScraper):
help = 'Index format: stripname'
class TumbleDryComics(_WordPressScraper):
class TumbleDryComics(WordPressScraper):
url = 'https://www.tumbledrycomics.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'we-need-to-get-high-jpg'
@ -348,7 +348,7 @@ class Turnoff(_ParserScraper):
return "%03d-%s" % (index, file_name)
class TwinDragons(_WordPressScraper):
class TwinDragons(WordPressScraper):
url = 'http://www.twindragonscomic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'the-beginning'

View file

@ -2,11 +2,11 @@
# Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Daniel Ring
from ..output import out
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
from ..xml import NS
class Tapas(_ParserScraper):
class Tapas(ParserScraper):
baseUrl = 'https://tapas.io/'
imageSearch = '//article[contains(@class, "js-episode-article")]//img/@data-src'
prevSearch = '//a[contains(@class, "js-prev-ep-btn")]'

View file

@ -7,20 +7,20 @@ from re import compile
from urllib.parse import urljoin
from lxml import etree
from ..scraper import _BasicScraper, _ParserScraper
from ..scraper import BasicScraper, ParserScraper
from ..helpers import indirectStarter
from ..util import tagre
from .common import _ComicControlScraper, _WordPressScraper, _WPNavi
from .common import ComicControlScraper, WordPressScraper, WordPressNavi
class Underling(_WPNavi):
class Underling(WordPressNavi):
url = ('https://web.archive.org/web/20190806120425/'
'http://underlingcomic.com/')
firstStripUrl = url + 'page-one/'
endOfLife = True
class Undertow(_BasicScraper):
class Undertow(BasicScraper):
url = 'http://undertow.dreamshards.org/'
imageSearch = compile(tagre("img", "src", r'([^"]+\.jpg)'))
prevSearch = compile(r'href="(.+?)".+?teynpoint')
@ -28,7 +28,7 @@ class Undertow(_BasicScraper):
starter = indirectStarter
class unDivine(_ComicControlScraper):
class unDivine(ComicControlScraper):
url = 'https://www.undivinecomic.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'page-1'
@ -46,7 +46,7 @@ class unDivine(_ComicControlScraper):
return filename
class UnicornJelly(_BasicScraper):
class UnicornJelly(BasicScraper):
baseUrl = 'http://unicornjelly.com/'
url = baseUrl + 'uni666.html'
stripUrl = baseUrl + 'uni%s.html'
@ -56,7 +56,7 @@ class UnicornJelly(_BasicScraper):
help = 'Index format: nnn'
class Unsounded(_ParserScraper):
class Unsounded(ParserScraper):
url = 'http://www.casualvillain.com/Unsounded/'
startUrl = url + 'comic+index/'
stripUrl = url + 'comic/ch%s/ch%s_%s.html'
@ -95,7 +95,7 @@ class Unsounded(_ParserScraper):
return self.stripUrl % (chapter, chapter, num)
class UrgentTransformationCrisis(_WordPressScraper):
class UrgentTransformationCrisis(WordPressScraper):
url = 'http://www.catomix.com/utc/'
firstStripUrl = url + 'comic/cover1'

View file

@ -8,10 +8,10 @@ from re import compile, escape, IGNORECASE
from ..scraper import _BasicScraper, _ParserScraper
from ..util import tagre
from ..helpers import bounceStarter
from .common import _ComicControlScraper, _WPNaviIn, _WPWebcomic
from .common import ComicControlScraper, WordPressNaviIn, WordPressWebcomic
class WapsiSquare(_WPNaviIn):
class WapsiSquare(WordPressNaviIn):
url = 'http://wapsisquare.com/'
firstStripUrl = url + 'comic/09092001/'
@ -81,14 +81,14 @@ class WereIWolf(_ParserScraper):
return self.stripUrl % (index[0], index[1])
class WhiteNoise(_WPWebcomic):
class WhiteNoise(WordPressWebcomic):
url = 'http://whitenoisecomic.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'book-one'
imageSearch = '//div[@id="comic"]//img'
class WhiteNoiseLee(_ComicControlScraper):
class WhiteNoiseLee(ComicControlScraper):
url = 'http://www.white-noise-comic.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % '1-0'
@ -98,7 +98,7 @@ class WhiteNoiseLee(_ComicControlScraper):
return pageUrl.rsplit('/', 1)[-1] + '.' + imageUrl.rsplit('.', 1)[-1]
class Whomp(_ComicControlScraper):
class Whomp(ComicControlScraper):
url = 'http://www.whompcomic.com/'
firstStripUrl = url + 'comic/06152010'
textSearch = '//img[@id="cc-comic"]/@title'
@ -127,7 +127,7 @@ class Wigu(_ParserScraper):
help = 'Index format: n'
class WildeLife(_ComicControlScraper):
class WildeLife(ComicControlScraper):
url = 'http://www.wildelifecomic.com/'
stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % '1'

View file

@ -3,11 +3,11 @@
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2020 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from .common import _WordPressScraper
from .common import WordPressScraper
from ..helpers import indirectStarter
class WebcomicFactory(_WordPressScraper):
class WebcomicFactory(WordPressScraper):
starter = indirectStarter
def __init__(self, name, url):

View file

@ -1,10 +1,10 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Daniel Ring
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
class WebToons(_ParserScraper):
class WebToons(ParserScraper):
imageSearch = '//img[contains(@class, "_images")]/@data-url'
prevSearch = '//a[contains(@class, "_prevEpisode")]'
multipleImagesPerStrip = True

View file

@ -1,15 +1,15 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2021 Tobias Gruetzmacher
# Copyright (C) 2015-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
import re
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
from ..helpers import bounceStarter
class _WLPComics(_ParserScraper):
class WLPComics(ParserScraper):
imageSearch = '//img[contains(@alt, " Comic")]'
prevSearch = '//a[contains(text(), "Previous ")]'
nextSearch = '//a[contains(text(), "Next ")]'
@ -17,20 +17,20 @@ class _WLPComics(_ParserScraper):
help = 'Index format: nnn'
def __init__(self, name):
super(_WLPComics, self).__init__('WLP/' + name)
super().__init__('WLP/' + name)
def namer(self, image_url, page_url):
return (page_url.rsplit('/', 1)[-1].split('.')[0] + '_' +
image_url.rsplit('/', 1)[-1])
class ChichiChan(_WLPComics):
class ChichiChan(WLPComics):
url = 'http://www.wlpcomics.com/adult/chichi/'
stripUrl = url + '%s.html'
adult = True
class ChocolateMilkMaid(_WLPComics):
class ChocolateMilkMaid(WLPComics):
# Newer pages seem to be broken
stripUrl = 'http://www.wlpcomics.com/adult/cm/%s.html'
url = stripUrl % '264'
@ -46,12 +46,12 @@ class ChocolateMilkMaid(_WLPComics):
return tourl
class MaidAttack(_WLPComics):
class MaidAttack(WLPComics):
url = 'http://www.wlpcomics.com/general/maidattack/'
stripUrl = url + '%s.html'
class PeterIsTheWolfAdult(_WLPComics):
class PeterIsTheWolfAdult(WLPComics):
stripUrl = 'http://www.peteristhewolf.com/adult/%s.html'
# navigation to newest page is broken
url = stripUrl % '427'
@ -74,7 +74,7 @@ class PeterIsTheWolfAdult(_WLPComics):
return super(PeterIsTheWolfAdult, self).getPrevUrl(url, data)
class PeterIsTheWolfGeneral(_WLPComics):
class PeterIsTheWolfGeneral(WLPComics):
stripUrl = 'http://www.peteristhewolf.com/general/%s.html'
# navigation to newest page is broken
url = stripUrl % '427'
@ -94,7 +94,7 @@ class PeterIsTheWolfGeneral(_WLPComics):
return super(PeterIsTheWolfGeneral, self).getPrevUrl(url, data)
class Stellar(_WLPComics):
class Stellar(WLPComics):
url = 'http://www.wlpcomics.com/adult/stellar/'
stripUrl = url + '%s.html'
adult = True

View file

@ -1,11 +1,11 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2019-2020 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Daniel Ring
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
from ..helpers import indirectStarter
class Wrongside(_ParserScraper):
class Wrongside(ParserScraper):
baseUrl = 'http://ayzewi.com/maingallery3/'
url = baseUrl + 'index.php?/category/5'
stripUrl = baseUrl + 'picture.php?%s'
@ -41,7 +41,7 @@ class WrongsideBeginnings(Wrongside):
firstStripUrl = stripUrl % '/2/category/18'
class WrongsideSideStories(_ParserScraper):
class WrongsideSideStories(ParserScraper):
baseUrl = 'http://ayzewi.com/maingallery3/'
stripUrl = baseUrl + 'picture.php?%s'
imageSearch = '//img[@id="theMainImage"]/@src'

View file

@ -1,11 +1,11 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2016 Tobias Gruetzmacher
from ..scraper import _ParserScraper
# Copyright (C) 2015-2022 Tobias Gruetzmacher
from ..scraper import ParserScraper
class KindOfNormal(_ParserScraper):
class KindOfNormal(ParserScraper):
imageSearch = '//article[1]//div[@class="box-content"]//img'
prevSearch = '//a[@class="prev"]'

View file

@ -1,14 +1,13 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2020 Tobias Gruetzmacher
# Copyright (C) 2015-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
from ..helpers import bounceStarter
class XKCD(_ParserScraper):
name = 'xkcd'
class xkcd(ParserScraper):
url = 'https://xkcd.com/'
stripUrl = url + '%s/'
firstStripUrl = stripUrl % '1'

View file

@ -3,10 +3,10 @@
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
from .common import _WordPressScraper, _WPWebcomic
from .common import WordPressScraper, WordPressWebcomic
class YAFGC(_WordPressScraper):
class YAFGC(WordPressScraper):
baseUrl = 'https://www.yafgc.net/'
url = baseUrl + '?latest'
stripUrl = baseUrl + 'comic/%s'
@ -17,7 +17,7 @@ class YAFGC(_WordPressScraper):
self.session.add_throttle('www.yafgc.net', 3.0, 15.5)
class YoshSaga(_WPWebcomic):
class YoshSaga(WordPressWebcomic):
url = 'https://www.yoshsaga.com/'
stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'introduction'

View file

@ -1,23 +1,23 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2021 Tobias Gruetzmacher
# Copyright (C) 2015-2022 Tobias Gruetzmacher
from re import compile, escape
from ..scraper import _BasicScraper, _ParserScraper
from ..scraper import BasicScraper, ParserScraper
from ..util import tagre
from ..helpers import bounceStarter, joinPathPartsNamer
from .common import _WPNavi
from .common import WordPressNavi
class ZapComic(_ParserScraper):
class ZapComic(ParserScraper):
url = 'http://www.zapcomic.com/'
css = True
imageSearch = 'img.comic-item'
prevSearch = 'a.previous-comic-link'
class Zapiro(_ParserScraper):
class Zapiro(ParserScraper):
url = 'http://mg.co.za/zapiro/'
starter = bounceStarter
imageSearch = '//div[@id="cartoon"]/img'
@ -26,7 +26,7 @@ class Zapiro(_ParserScraper):
namer = joinPathPartsNamer((-1,), ())
class ZenPencils(_WPNavi):
class ZenPencils(WordPressNavi):
url = 'https://web.archive.org/web/20200723091741/https://zenpencils.com/'
multipleImagesPerStrip = True
firstStripUrl = url + 'comic/1-ralph-waldo-emerson-make-them-cry/'
@ -36,7 +36,7 @@ class ZenPencils(_WPNavi):
endOfLife = True
class ZombieHunters(_BasicScraper):
class ZombieHunters(BasicScraper):
url = 'http://www.thezombiehunters.com/'
stripUrl = url + '?strip_id=%s'
firstStripUrl = stripUrl % '1'
@ -45,7 +45,7 @@ class ZombieHunters(_BasicScraper):
help = 'Index format: n(unpadded)'
class Zwarwald(_BasicScraper):
class Zwarwald(BasicScraper):
url = "http://www.zwarwald.de/"
rurl = escape(url)
stripUrl = url + 'index.php/page/%s/'

View file

@ -2,12 +2,14 @@
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2022 Tobias Gruetzmacher
from __future__ import annotations
import html
import os
import re
import warnings
from urllib.parse import urljoin
from typing import Dict, List, Optional, Union, Pattern, Sequence
from typing import Collection, Dict, List, Optional, Type, Union, Pattern, Sequence
import lxml
from lxml.html.defs import link_attrs as html_link_attrs
@ -99,11 +101,13 @@ class Scraper:
session: http.Session = http.default_session
@classmethod
def getmodules(cls):
def getmodules(cls) -> Collection[Scraper]:
if cls.url is None:
return ()
name = cls.__name__
if hasattr(cls, 'name'):
name = cls.name
return [cls(name)]
return (cls(name),)
@property
def indexes(self):
@ -361,7 +365,7 @@ class Scraper:
raise GeoblockedException()
class _BasicScraper(Scraper):
class BasicScraper(Scraper):
"""
Scraper base class that matches regular expressions against HTML pages.
@ -376,7 +380,7 @@ class _BasicScraper(Scraper):
BASE_SEARCH = re.compile(tagre("base", "href", '([^"]*)'))
def getPage(self, url):
content = super(_BasicScraper, self).getPage(url).text
content = super().getPage(url).text
# determine base URL
baseUrl = None
match = self.BASE_SEARCH.search(content)
@ -426,7 +430,7 @@ class _BasicScraper(Scraper):
return None
class _ParserScraper(Scraper):
class ParserScraper(Scraper):
"""
Scraper base class that uses a HTML parser and XPath expressions.
@ -452,7 +456,7 @@ class _ParserScraper(Scraper):
css = False
def getPage(self, url):
page = super(_ParserScraper, self).getPage(url)
page = super().getPage(url)
if page.encoding:
# Requests figured out the encoding, so we can deliver Unicode to
# LXML. Unfortunatly, LXML feels betrayed if there is still an XML
@ -535,6 +539,11 @@ class _ParserScraper(Scraper):
return res
# Legacy aliases
_BasicScraper = BasicScraper
_ParserScraper = ParserScraper
class Cache:
"""Cache for comic scraper objects. The cache is initialized on first use.
This is cached, since iterating & loading a complete package might be quite

View file

@ -1,7 +1,7 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2021 Tobias Gruetzmacher
from ..scraper import _ParserScraper
# Copyright (C) 2021-2022 Tobias Gruetzmacher
from ..scraper import ParserScraper
class AnotherDummyTestScraper(_ParserScraper):
class AnotherDummyTestScraper(ParserScraper):
url = 'https://dummy.example/'

View file

@ -1,7 +1,7 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2020 Tobias Gruetzmacher
from ..scraper import _ParserScraper
from ..scraper import ParserScraper
class ADummyTestScraper(_ParserScraper):
class ADummyTestScraper(ParserScraper):
url = 'https://dummy.example/'

View file

@ -22,11 +22,11 @@ def get_test_scrapers():
else:
# Get limited number of scraper tests as default
testscrapernames = [
# "classic" _BasicScraper
# "classic" BasicScraper
'AbstruseGoose',
# complex _ParserScraper
# complex ParserScraper
'GoComics/CalvinAndHobbes',
# _WordPressScraper
# WordPressScraper
'GrrlPower',
]
scraper_pattern = '^(' + '|'.join(testscrapernames) + ')$'

View file

@ -1,13 +1,13 @@
# SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2019 Tobias Gruetzmacher
# Copyright (C) 2015-2022 Tobias Gruetzmacher
import responses
from dosagelib import scraper
class ATestScraper(scraper._BasicScraper):
class ATestScraper(scraper.BasicScraper):
pass

View file

@ -35,7 +35,7 @@ commands =
[flake8]
# we aim for 79, but this suppresses warnings for now...
max-line-length = 100
ignore = E127,E128,E241,FI12,FI14,FI15,FI18,FI50,FI51,FI53,FI54,FI55,W504
ignore = E127,E128,E241,FI12,FI14,FI15,FI18,FI50,FI51,FI53,FI54,FI55,FI58,W504
require-code = True
no-accept-encodings = True
min-version = 3.7
@ -43,7 +43,7 @@ min-version = 3.7
# Duplicated for CodeClimate...
[pep8]
max-line-length = 100
ignore = E127,E128,E241,FI12,FI14,FI15,FI18,FI50,FI51,FI53,FI54,FI55,W504
ignore = E127,E128,E241,FI12,FI14,FI15,FI18,FI50,FI51,FI53,FI54,FI55,FI58,W504
[pytest]
filterwarnings = default