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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -5,43 +5,51 @@
# Copyright (C) 2019-2020 Daniel Ring # Copyright (C) 2019-2020 Daniel Ring
from typing import Sequence, Union from typing import Sequence, Union
from ..scraper import _ParserScraper from ..scraper import ParserScraper
# Common base classes for comics with the same structure (same hosting # Common base classes for comics with the same structure (same hosting
# software, for example) go here. Since those are shared by many modules, # 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 # please don't use lists of expression, as that makes it hard to track which
# expression is for which comics. # 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' imageSearch = '//div[@id="comic"]//img'
prevSearch = '//a[d:class("comic-nav-previous")]' prevSearch = '//a[d:class("comic-nav-previous")]'
nextSearch = '//a[d:class("comic-nav-next")]' nextSearch = '//a[d:class("comic-nav-next")]'
latestSearch = '//a[d:class("comic-nav-last")]' latestSearch = '//a[d:class("comic-nav-last")]'
class _WordPressSpliced(_ParserScraper): class WordPressSpliced(ParserScraper):
imageSearch = '//div[@id="one-comic-option"]//img' imageSearch = '//div[@id="one-comic-option"]//img'
prevSearch = '//a[d:class("previous-comic")]' prevSearch = '//a[d:class("previous-comic")]'
class _WPNavi(_WordPressScraper): class WordPressNavi(WordPressScraper):
prevSearch = '//a[d:class("navi-prev")]' prevSearch = '//a[d:class("navi-prev")]'
class _WPNaviIn(_WordPressScraper): class WordPressNaviIn(WordPressScraper):
prevSearch = '//a[d:class("navi-prev-in")]' prevSearch = '//a[d:class("navi-prev-in")]'
class _WPWebcomic(_ParserScraper): class WordPressWebcomic(ParserScraper):
imageSearch = '//div[d:class("webcomic-image")]//img' imageSearch = '//div[d:class("webcomic-image")]//img'
prevSearch = '//a[d:class("previous-webcomic-link")]' prevSearch = '//a[d:class("previous-webcomic-link")]'
nextSearch = '///a[d:class("next-webcomic-link")]' nextSearch = '///a[d:class("next-webcomic-link")]'
latestSearch = '//a[d:class("last-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 # SPDX-License-Identifier: MIT
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs # Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam # Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2020 Tobias Gruetzmacher # Copyright (C) 2015-2022 Tobias Gruetzmacher
from ..scraper import _ParserScraper from ..scraper import ParserScraper
from ..helpers import indirectStarter from ..helpers import indirectStarter
class Creators(_ParserScraper): class Creators(ParserScraper):
imageSearch = '//a[contains(@class,"fancybox")]/img' imageSearch = '//a[contains(@class,"fancybox")]/img'
prevSearch = '//a[@id="nav_prev"]' prevSearch = '//a[@id="nav_prev"]'
latestSearch = '//div[contains(@class,"caption")]/a' latestSearch = '//div[contains(@class,"caption")]/a'

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,10 +1,10 @@
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
# Copyright (C) 2019-2022 Tobias Gruetzmacher # Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring # 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' imageSearch = '//div[@id="comic"]//img'
prevSearch = '//a[contains(@class, "comic-nav-previous")]' prevSearch = '//a[contains(@class, "comic-nav-previous")]'

View file

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

View file

@ -8,7 +8,7 @@ from re import compile
from ..scraper import _BasicScraper, _ParserScraper from ..scraper import _BasicScraper, _ParserScraper
from ..helpers import bounceStarter, indirectStarter from ..helpers import bounceStarter, indirectStarter
from ..util import tagre from ..util import tagre
from .common import _ComicControlScraper, _WordPressScraper, _WPNaviIn from .common import ComicControlScraper, WordPressScraper, WordPressNaviIn
class Lackadaisy(_ParserScraper): class Lackadaisy(_ParserScraper):
@ -28,7 +28,7 @@ class Lackadaisy(_ParserScraper):
return 'lackadaisy_%s.%s' % (num, ext) return 'lackadaisy_%s.%s' % (num, ext)
class LastResort(_WordPressScraper): class LastResort(WordPressScraper):
url = 'http://www.lastres0rt.com/' url = 'http://www.lastres0rt.com/'
stripUrl = url + 'comic/%s/' stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'that-sound-you-hear-is-a-shattered-stereotype' firstStripUrl = stripUrl % 'that-sound-you-hear-is-a-shattered-stereotype'
@ -68,11 +68,11 @@ class LeastICouldDo(_ParserScraper):
help = 'Index format: yyyymmdd' help = 'Index format: yyyymmdd'
class LetsSpeakEnglish(_ComicControlScraper): class LetsSpeakEnglish(ComicControlScraper):
url = 'http://www.marycagle.com' url = 'http://www.marycagle.com'
class LifeAintNoPonyFarm(_WordPressScraper): class LifeAintNoPonyFarm(WordPressScraper):
url = ('https://web.archive.org/web/20181221154155/' url = ('https://web.archive.org/web/20181221154155/'
'http://sarahburrini.com/en/') 'http://sarahburrini.com/en/')
firstStripUrl = url + 'comic/my-first-webcomic/' firstStripUrl = url + 'comic/my-first-webcomic/'
@ -137,7 +137,7 @@ class LifeAsRendered(_ParserScraper):
return None return None
class LilithsWord(_ComicControlScraper): class LilithsWord(ComicControlScraper):
url = 'http://www.lilithword.com/' url = 'http://www.lilithword.com/'
stripUrl = url + 'comic/%s' stripUrl = url + 'comic/%s'
firstStripUrl = stripUrl % 'prologue-page-00' firstStripUrl = stripUrl % 'prologue-page-00'
@ -188,7 +188,7 @@ class LoadingArtist(_ParserScraper):
prevSearch = "//a[contains(concat(' ', @class, ' '), ' prev ')]" prevSearch = "//a[contains(concat(' ', @class, ' '), ' prev ')]"
class LoFiJinks(_WPNaviIn): class LoFiJinks(WordPressNaviIn):
baseUrl = 'https://hijinksensue.com/comic/' baseUrl = 'https://hijinksensue.com/comic/'
url = baseUrl + 'learning-to-love-again/' url = baseUrl + 'learning-to-love-again/'
firstStripUrl = baseUrl + 'lo-fijinks-everything-i-know-anout-james-camerons-avatar-movie/' 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 ..scraper import _BasicScraper, _ParserScraper
from ..util import tagre from ..util import tagre
from ..xml import NS from ..xml import NS
from .common import _ComicControlScraper, _WordPressScraper, _WPWebcomic from .common import ComicControlScraper, WordPressScraper, WordPressWebcomic
class MacHall(_BasicScraper): class MacHall(_BasicScraper):
@ -29,12 +29,12 @@ class MadamAndEve(_BasicScraper):
multipleImagesPerStrip = True multipleImagesPerStrip = True
class Magellan(_WordPressScraper): class Magellan(WordPressScraper):
url = 'https://magellanverse.com/' url = 'https://magellanverse.com/'
firstStripUrl = url + 'comic/20040307wannabe/' firstStripUrl = url + 'comic/20040307wannabe/'
class MagickChicks(_ComicControlScraper): class MagickChicks(ComicControlScraper):
url = 'https://pixietrixcomix.com/magick-chicks/' url = 'https://pixietrixcomix.com/magick-chicks/'
stripUrl = url + '%s' stripUrl = url + '%s'
firstStripUrl = stripUrl % 'tis-but-a-trifle-2' firstStripUrl = stripUrl % 'tis-but-a-trifle-2'
@ -52,7 +52,7 @@ class ManlyGuysDoingManlyThings(_ParserScraper):
help = 'Index format: ddmmyyyy' help = 'Index format: ddmmyyyy'
class MareInternum(_WordPressScraper): class MareInternum(WordPressScraper):
url = 'https://www.marecomic.com/' url = 'https://www.marecomic.com/'
stripUrl = url + 'comic/%s/' stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'intro-page-1' firstStripUrl = stripUrl % 'intro-page-1'
@ -98,7 +98,7 @@ class MaxOveracts(_ParserScraper):
help = 'Index format: nnn' help = 'Index format: nnn'
class Meek(_WordPressScraper): class Meek(WordPressScraper):
url = 'https://www.meekcomic.com/' url = 'https://www.meekcomic.com/'
stripUrl = url + 'comic/%s/' stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'chapter-1-cover' firstStripUrl = stripUrl % 'chapter-1-cover'
@ -113,27 +113,27 @@ class MegaTokyo(_BasicScraper):
help = 'Index format: nnnn' help = 'Index format: nnnn'
class Meiosis(_WordPressScraper): class Meiosis(WordPressScraper):
url = 'http://meiosiswebcomic.com/' url = 'http://meiosiswebcomic.com/'
class Melonpool(_WordPressScraper): class Melonpool(WordPressScraper):
url = 'http://www.melonpool.com/' url = 'http://www.melonpool.com/'
allow_errors = (500,) allow_errors = (500,)
class MenageA3(_ComicControlScraper): class MenageA3(ComicControlScraper):
adult = True adult = True
url = 'https://pixietrixcomix.com/menage-a-3/' url = 'https://pixietrixcomix.com/menage-a-3/'
firstStripUrl = url + 'for-new-readers' firstStripUrl = url + 'for-new-readers'
endOfLife = True endOfLife = True
class Metacarpolis(_ComicControlScraper): class Metacarpolis(ComicControlScraper):
url = 'http://www.metacarpolis.com' url = 'http://www.metacarpolis.com'
class Misfile(_ComicControlScraper): class Misfile(ComicControlScraper):
url = 'http://www.misfile.com/misfile/' url = 'http://www.misfile.com/misfile/'
stripUrl = url + '%s' stripUrl = url + '%s'
firstStripUrl = stripUrl % '2004-02-22' firstStripUrl = stripUrl % '2004-02-22'
@ -149,7 +149,7 @@ class MisfileHellHigh(Misfile):
help = 'Index format: yyyy-mm-dd' help = 'Index format: yyyy-mm-dd'
class MistyTheMouse(_WordPressScraper): class MistyTheMouse(WordPressScraper):
url = 'http://www.mistythemouse.com/' url = 'http://www.mistythemouse.com/'
prevSearch = '//a[@rel="prev"]' prevSearch = '//a[@rel="prev"]'
firstStripUrl = 'http://www.mistythemouse.com/?p=12' firstStripUrl = 'http://www.mistythemouse.com/?p=12'
@ -176,13 +176,13 @@ class MonsieurLeChien(_BasicScraper):
help = 'Index format: n' help = 'Index format: n'
class MonsterSoup(_WordPressScraper): class MonsterSoup(WordPressScraper):
url = 'https://monstersoupcomic.com/' url = 'https://monstersoupcomic.com/'
stripUrl = url + '?comic=%s' stripUrl = url + '?comic=%s'
firstStripUrl = stripUrl % 'chapter-1-cover' firstStripUrl = stripUrl % 'chapter-1-cover'
class Moonlace(_WPWebcomic): class Moonlace(WordPressWebcomic):
url = 'https://moonlace.darkbluecomics.com/' url = 'https://moonlace.darkbluecomics.com/'
stripUrl = url + 'comic/%s/' stripUrl = url + 'comic/%s/'
firstStripUrl = stripUrl % 'page-0-1' firstStripUrl = stripUrl % 'page-0-1'
@ -272,7 +272,7 @@ class MysteriesOfTheArcana(_ParserScraper):
prevSearch = '//a[@class="navprevious"]' prevSearch = '//a[@class="navprevious"]'
class MonsterUnderTheBed(_WordPressScraper): class MonsterUnderTheBed(WordPressScraper):
url = 'http://themonsterunderthebed.net/' url = 'http://themonsterunderthebed.net/'
stripUrl = url + '?comic=%s' stripUrl = url + '?comic=%s'
firstStripUrl = stripUrl % 'test-post' firstStripUrl = stripUrl % 'test-post'

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,10 +1,10 @@
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
# Copyright (C) 2019-2020 Tobias Gruetzmacher # Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring # 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' imageSearch = '//td[@class="tamid"]/img'
prevSearch = '//a[./img[@alt="Previous"]]' prevSearch = '//a[./img[@alt="Previous"]]'

View file

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

View file

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

View file

@ -1,10 +1,10 @@
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
# Copyright (C) 2019-2020 Tobias Gruetzmacher # Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring # 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/' stripUrl = 'https://www.rhjunior.com/%s/'
imageSearch = '//div[contains(@class, "entry-content")]//img' imageSearch = '//div[contains(@class, "entry-content")]//img'
multipleImagesPerStrip = True multipleImagesPerStrip = True

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,10 +1,10 @@
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
# Copyright (C) 2019-2022 Tobias Gruetzmacher # Copyright (C) 2019-2022 Tobias Gruetzmacher
# Copyright (C) 2019-2022 Daniel Ring # 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' imageSearch = '//img[contains(@class, "_images")]/@data-url'
prevSearch = '//a[contains(@class, "_prevEpisode")]' prevSearch = '//a[contains(@class, "_prevEpisode")]'
multipleImagesPerStrip = True multipleImagesPerStrip = True

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -35,7 +35,7 @@ commands =
[flake8] [flake8]
# we aim for 79, but this suppresses warnings for now... # we aim for 79, but this suppresses warnings for now...
max-line-length = 100 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 require-code = True
no-accept-encodings = True no-accept-encodings = True
min-version = 3.7 min-version = 3.7
@ -43,7 +43,7 @@ min-version = 3.7
# Duplicated for CodeClimate... # Duplicated for CodeClimate...
[pep8] [pep8]
max-line-length = 100 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] [pytest]
filterwarnings = default filterwarnings = default