dosage/dosagelib/plugins/smackjeeves.py
Tobias Gruetzmacher 51008a975b Refactor: Introduce generator methods for scrapers
This allows one comic module class to generate multiple scrapers. This
change is to support a more dynamic module system as described in #42.
2016-05-21 01:29:36 +02:00

2755 lines
45 KiB
Python

# -*- coding: utf-8 -*-
# Copyright (C) 2004-2005 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015-2016 Tobias Gruetzmacher
from __future__ import absolute_import, division, print_function
from ..util import quote
from ..scraper import _ParserScraper
from ..output import out
# SmackJeeves is a crawlers nightmare - users are allowed to edit HTML
# directly. Additionally, users use unescaped < characters sometimes, which
# breaks the parse tree on libxml2 before 2.9.3...
class _SmackJeeves(_ParserScraper):
ONLY_COMICS = '[contains(@href, "/comics/")]'
prevSearch = (
'//a[@class="nav-prev"]' + ONLY_COMICS,
'//a[img[re:test(@alt, "prev", "i")]]' + ONLY_COMICS,
'//a[img[re:test(@src, "/(prev|back)")]]' + ONLY_COMICS,
'//a[re:test(@title, "previous", "i")]' + ONLY_COMICS,
'//a[re:test(text(), "prev|back", "i")]' + ONLY_COMICS,
'//select[@class="jumpbox"]/preceding::a[1]' + ONLY_COMICS,
)
nextSearch = (
'//a[@class="nav-next"]' + ONLY_COMICS,
'//a[img[re:test(@alt, "next", "i")]]' + ONLY_COMICS,
'//a[img[re:test(@src, "/next", "i")]]' + ONLY_COMICS,
'//a[re:test(@title, "next", "i")]' + ONLY_COMICS,
'//a[re:test(text(), "next", "i")]' + ONLY_COMICS,
'//select[@class="jumpbox"]/following::a[1]' + ONLY_COMICS,
)
imageSearch = (
'//img[@id="comic_image"]',
'//div[@id="comic-image"]//img',
'//img[@id="comic"]',
'//div[@id="comicset"]/object/param[@name="movie"]/@value',
)
broken_html_bugfix = True
def __init__(self, name):
super(_SmackJeeves, self).__init__('SmackJeeves/' + name[2:])
@property
def url(self):
if hasattr(self, 'host'):
return 'http://%s/comics/' % self.host
else:
return 'http://%s.smackjeeves.com/comics/' % self.sub
def starter(self):
"""Get start URL."""
start = self.url
if self.adult:
start = 'http://www.smackjeeves.com/mature.php?ref=' + quote(start)
data = self.getPage(start)
startimg = None
if not self.shouldSkipUrl(start, data):
startimg = self.fetchUrl(start, data, self.imageSearch)
prevurl = self.fetchUrl(start, data, self.prevSearch)
data = self.getPage(prevurl)
previmg = None
if not self.shouldSkipUrl(prevurl, data):
previmg = self.fetchUrl(prevurl, data, self.imageSearch)
if startimg and previmg and startimg == previmg:
out.debug("Matching! %s %s" % (prevurl, self.name))
return prevurl
else:
return self.fetchUrl(prevurl, data, self.nextSearch)
def namer(self, image_url, page_url):
parts = page_url.split('/')
name = parts[-2]
num = parts[-3]
return "%s_%s" % (name, num)
def shouldSkipUrl(self, url, data):
return data.xpath('//img[contains(@src, "/images/image_na.gif")]')
# do not edit anything below since these entries are generated from
# scripts/update_plugins.sh
# DO NOT REMOVE
class SJ20TimesKirby(_SmackJeeves):
sub = '20xkirby'
class SJ2Kingdoms(_SmackJeeves):
sub = '2kingdoms'
class SJ355Days(_SmackJeeves):
sub = '355days'
class SJAB(_SmackJeeves):
sub = 'alistairandboggart'
adult = True
class SJADoodleADay(_SmackJeeves):
sub = 'adoodleaday'
class SJAGirlAndHerShadow(_SmackJeeves):
sub = 'agirlandhershadow'
class SJAGirlontheServer(_SmackJeeves):
sub = 'girlontheserver'
class SJAKirbyKomic(_SmackJeeves):
sub = 'akirbykomic'
class SJALaMode(_SmackJeeves):
sub = 'alamode'
class SJANGELOU(_SmackJeeves):
sub = 'angelou-esp'
class SJAPTComic(_SmackJeeves):
sub = 'aptcomic'
class SJAQuestionOfCharacter(_SmackJeeves):
sub = 'aqoc'
class SJASongforElise(_SmackJeeves):
sub = 'asongforelise'
adult = True
class SJAYuriCollab(_SmackJeeves):
sub = 'ayuricollabbitches'
adult = True
class SJAarrevaara(_SmackJeeves):
sub = 'aarrevaara'
class SJAcidMonday(_SmackJeeves):
sub = 'acidmonday'
adult = True
class SJAdalsysla(_SmackJeeves):
sub = 'adalsysla'
class SJAddictiveScience(_SmackJeeves):
sub = 'addictivescience'
class SJAdventuresofLumandFriends(_SmackJeeves):
sub = 'aolaf'
class SJAdventuresoftheWeird(_SmackJeeves):
sub = 'adventuresoftheweird'
class SJAetherTheories(_SmackJeeves):
sub = 'aethertheories'
class SJAgeoftheGray(_SmackJeeves):
sub = 'ageofthegray'
adult = True
class SJAllInLOVE(_SmackJeeves):
sub = 'allinlove'
class SJAllStarHeroes(_SmackJeeves):
sub = 'allstarheroes'
class SJAloversRule(_SmackJeeves):
sub = 'aloversrule'
adult = True
class SJAlwaysDamnedWebcomic(_SmackJeeves):
sub = 'alwaysdamned'
adult = True
class SJAlwaysRainingHere(_SmackJeeves):
sub = 'alwaysraininghere'
class SJAmaravati(_SmackJeeves):
sub = 'amaravati'
class SJAmorVincitOmnia(_SmackJeeves):
sub = 'avo'
adult = True
class SJAmsdenEstate(_SmackJeeves):
sub = 'monsterous'
class SJAnathemacomics(_SmackJeeves):
sub = 'anathema-comics'
class SJAngelGuardian(_SmackJeeves):
sub = 'angel-guardian'
class SJAnimalAdventures(_SmackJeeves):
sub = 'animaladventures'
class SJAnimayhem(_SmackJeeves):
sub = 'animayhem'
class SJAnythingaboutnothing(_SmackJeeves):
host = 'www.anythingcomic.com'
class SJArchportCityChronicles(_SmackJeeves):
sub = 'tjs'
class SJArea9(_SmackJeeves):
sub = 'area-9'
class SJAroundtheBlock(_SmackJeeves):
sub = 'aroundtheblock'
class SJArtofAFantasy(_SmackJeeves):
sub = 'artofafantasy'
adult = True
class SJAtArmsLength(_SmackJeeves):
sub = 'atarmslength'
class SJAtlaswebcomic(_SmackJeeves):
sub = 'atlaswebcomic'
class SJAutophobia(_SmackJeeves):
sub = 'autophobia'
adult = True
class SJAware(_SmackJeeves):
sub = 'aware'
class SJAwesomeSauce(_SmackJeeves):
sub = 'tdawesomesauce'
class SJAyaTakeo(_SmackJeeves):
sub = 'ayatakeo'
class SJBLDShortComics(_SmackJeeves):
sub = 'bldshortcomics'
class SJBabysittingFourDemons(_SmackJeeves):
sub = 'babysitting4demons'
class SJBabywhatsyoursign(_SmackJeeves):
sub = 'babywhatsyoursign'
class SJBadassRiz(_SmackJeeves):
sub = 'badassriz'
class SJBallandChain(_SmackJeeves):
sub = 'ballandchain'
class SJBard(_SmackJeeves):
sub = 'barred'
class SJBassComicAdventures(_SmackJeeves):
sub = 'basscomicadventures'
class SJBattleSequence(_SmackJeeves):
sub = 'battlesequence'
class SJBearhoney(_SmackJeeves):
sub = 'bear-honey'
class SJBearlyAbel(_SmackJeeves):
sub = 'bearlyabel'
class SJBeautifulLies(_SmackJeeves):
sub = 'beautiful-lies'
class SJBehindTheObsidianMirror(_SmackJeeves):
sub = 'obsidian-mirror'
adult = True
class SJBehindtheglasscurtain(_SmackJeeves):
sub = 'g1ass'
class SJBeretCatComics(_SmackJeeves):
sub = 'beretcatcomics'
class SJBestbrosforever(_SmackJeeves):
sub = 'bestbrosforever'
class SJBetovering(_SmackJeeves):
sub = 'betovering'
adult = True
class SJBettencourtHotel(_SmackJeeves):
sub = 'bettencourt'
class SJBetweenLightandDark(_SmackJeeves):
sub = 'bld'
class SJBetweenWorlds(_SmackJeeves):
sub = 'betweenworlds'
adult = True
class SJBetwin(_SmackJeeves):
sub = 'be-twin'
class SJBeyondTheOrdinary(_SmackJeeves):
sub = 'bto'
class SJBioRevelation(_SmackJeeves):
sub = 'biorevelation'
class SJBl3(_SmackJeeves):
sub = 'bl3'
class SJBlackDragon(_SmackJeeves):
sub = 'blackdragon'
class SJBlackFridayRule(_SmackJeeves):
sub = 'blackfridayrule'
class SJBlackSheepcomic(_SmackJeeves):
sub = 'black-sheep'
class SJBlackandBlue(_SmackJeeves):
sub = 'black-and-blue'
class SJBlackdemon(_SmackJeeves):
sub = 'blackdemoncomics'
class SJBleachRedux(_SmackJeeves):
sub = 'bleachredux'
class SJBlindandBlue(_SmackJeeves):
sub = 'blindandblue'
class SJBloodhuntersBirthofavampire(_SmackJeeves):
sub = 'bloodhunters'
class SJBloomaPokemonConquestComic(_SmackJeeves):
sub = 'bloomconquest'
class SJBlueHair(_SmackJeeves):
sub = 'bluehair'
class SJBlueWell(_SmackJeeves):
host = 'www.bluewellcomic.com'
class SJBoilingPointofBrain(_SmackJeeves):
sub = 'bpob'
class SJBoogeyDancingMonkeyPot(_SmackJeeves):
sub = 'monkeypot'
class SJBreachofAgency(_SmackJeeves):
sub = 'breachofagency'
class SJBreakfastonaCliff(_SmackJeeves):
sub = 'boac'
class SJBurn(_SmackJeeves):
sub = 'burn'
class SJByTheBook(_SmackJeeves):
sub = 'bythebook'
class SJCafeAmargo(_SmackJeeves):
sub = 'cafeamargo'
class SJCafeSuada(_SmackJeeves):
sub = 'cafesuada'
class SJCambion(_SmackJeeves):
sub = 'cambion'
adult = True
class SJCaptiveSoul(_SmackJeeves):
sub = 'captive-soul'
class SJCaravanaTaleofGodsandMen(_SmackJeeves):
sub = 'caravantale'
class SJCataclysm(_SmackJeeves):
sub = 'cataclysm'
class SJCatnip(_SmackJeeves):
sub = 'catnipmanga'
adult = True
class SJCerintha(_SmackJeeves):
sub = 'cerintha'
class SJChampionofChampions(_SmackJeeves):
sub = 'championofchampions'
class SJChampionsandHeroesAgeofDragons(_SmackJeeves):
sub = 'championsandheroes'
class SJChannelDDDNews(_SmackJeeves):
sub = 'dddnews'
class SJChaosAdventuresII(_SmackJeeves):
sub = 'chaosadventuresii'
class SJChaoticNation(_SmackJeeves):
sub = 'chaoticnation'
adult = True
class SJCharaktermaske(_SmackJeeves):
sub = 'charaktermaske'
class SJChatuplines(_SmackJeeves):
sub = 'chatuplines'
class SJCheneysGotaGun(_SmackJeeves):
sub = 'cheney'
class SJChickenScratches(_SmackJeeves):
sub = 'chickenscratches'
class SJChildrenoftheNight(_SmackJeeves):
sub = 'cotn'
class SJChimiMouryou(_SmackJeeves):
sub = 'cmmr'
class SJChocolatewithPepper(_SmackJeeves):
sub = 'chocolate-with-pepper'
class SJCityFolk(_SmackJeeves):
sub = 'cityfolk'
class SJClairetheFlare(_SmackJeeves):
sub = 'clairetheflare'
class SJCleanCure(_SmackJeeves):
sub = 'cleanpluscure'
class SJClockworkAtrium(_SmackJeeves):
host = 'www.clockwork-atrium.com'
class SJCloeRemembrance(_SmackJeeves):
sub = 'cloe'
class SJCockroachTheater(_SmackJeeves):
sub = 'cockroachtheater'
class SJCogs(_SmackJeeves):
sub = 'cogs'
class SJColorBlind(_SmackJeeves):
sub = 'cbcomic'
class SJConventionalWisdom(_SmackJeeves):
sub = 'conventionalwisdom'
class SJCosmicDash(_SmackJeeves):
sub = 'cosmicdash'
class SJCramberries(_SmackJeeves):
sub = 'cramberries'
class SJCrimsonWings(_SmackJeeves):
sub = 'crimson-wings'
class SJCrocodileTears(_SmackJeeves):
sub = 'crocodile-tears'
adult = True
class SJCupofOlea(_SmackJeeves):
sub = 'cupofolea'
class SJCurseLineage(_SmackJeeves):
sub = 'curselineage'
class SJDBON(_SmackJeeves):
sub = 'dbondoujin'
class SJDEGAF(_SmackJeeves):
sub = 'degaf'
class SJDEMENTED(_SmackJeeves):
sub = 'demented'
adult = True
class SJDaddysGirl(_SmackJeeves):
sub = 'daddysgirl'
class SJDanielleDark(_SmackJeeves):
sub = 'danielledark'
class SJDasien(_SmackJeeves):
sub = 'dasien'
adult = True
class SJDavidDoesntGetIt(_SmackJeeves):
sub = 'daviddoesntgetit'
class SJDeadtoDay(_SmackJeeves):
sub = 'deadtoday'
class SJDeathNoteIridescent(_SmackJeeves):
sub = 'dn-iridescent'
class SJDefyingGravityTheFourGreatGuardians(_SmackJeeves):
sub = 'defyinggravitycomic'
class SJDemonBattles(_SmackJeeves):
sub = 'demonbattles'
class SJDemonCat(_SmackJeeves):
sub = 'demoncat'
class SJDemonEater(_SmackJeeves):
sub = 'demoneater'
adult = True
class SJDenizensAttention(_SmackJeeves):
sub = 'denizensattention'
class SJDevilsCake(_SmackJeeves):
sub = 'devilscake'
class SJDevotoMusicinHell(_SmackJeeves):
sub = 'devoto'
adult = True
class SJDiaz(_SmackJeeves):
sub = 'diaz'
class SJDiexemor(_SmackJeeves):
sub = 'diexemor'
class SJDigimonSaviors(_SmackJeeves):
sub = 'digimonsaviors'
class SJDigimonTamersMiraiProject(_SmackJeeves):
sub = 'digimontamersmiraiproject'
class SJDigisRandomSpriteshack(_SmackJeeves):
sub = 'digisspriteshack'
class SJDigitalInsanity(_SmackJeeves):
sub = 'digitalinsanity'
class SJDoItYourself(_SmackJeeves):
sub = 'diy'
class SJDontdie(_SmackJeeves):
sub = 'dontdie'
class SJDoodleBeans(_SmackJeeves):
sub = 'beans'
adult = True
class SJDoodlingAround(_SmackJeeves):
sub = 'doodlingcomic'
class SJDoomsdayMyDear(_SmackJeeves):
host = 'www.doomsdaymydear.com'
class SJDragonKid(_SmackJeeves):
sub = 'dragonkid'
class SJDragonet(_SmackJeeves):
sub = 'dragonet'
class SJDumpofManyPeople(_SmackJeeves):
sub = 'dumpofmanypeople'
class SJDungeonHordes(_SmackJeeves):
sub = 'dungeonhordes'
class SJEATATAU(_SmackJeeves):
sub = 'eatatau'
class SJEDepthAngel(_SmackJeeves):
sub = 'edepth'
class SJERAConvergence(_SmackJeeves):
sub = 'convergence'
class SJERAIbuki(_SmackJeeves):
sub = 'eraibuki'
class SJERRORERROR(_SmackJeeves):
sub = 'errorerror'
class SJEidolonWhispersofEternity(_SmackJeeves):
sub = 'whispersofeternity'
class SJElementalSpirits(_SmackJeeves):
sub = 'elementalspirits'
class SJEnkeltenKentta(_SmackJeeves):
sub = 'enkeltenkentta'
adult = True
class SJEnthrall(_SmackJeeves):
sub = 'enthrall'
adult = True
class SJEntreeuxdeux(_SmackJeeves):
sub = 'entreuxdeux'
class SJEntuthrie(_SmackJeeves):
sub = 'entuthrie'
adult = True
class SJEorah(_SmackJeeves):
sub = 'eorah'
adult = True
class SJEozinKadonnutKuningas(_SmackJeeves):
sub = 'eozinkadonnutkuningas'
class SJEpicChaos(_SmackJeeves):
sub = 'epicchaos'
class SJEqusopia(_SmackJeeves):
sub = 'equsopia'
class SJEternalKnights(_SmackJeeves):
sub = 'eternalknights'
adult = True
class SJEuphemisticEephus(_SmackJeeves):
sub = 'eephus'
class SJEvD(_SmackJeeves):
sub = 'ev-d'
class SJEvilPlan(_SmackJeeves):
host = 'evilplan.thewebcomic.com'
class SJExperimentalMegaman(_SmackJeeves):
sub = 'ex90081'
class SJEyesofaDigimon(_SmackJeeves):
sub = 'eoad'
class SJFailureConfetti(_SmackJeeves):
sub = 'failureconfetti'
class SJFairyTaleRejects(_SmackJeeves):
host = 'fairytalerejects.thewebcomic.com'
adult = True
class SJFaithlessDigitals(_SmackJeeves):
sub = 'faithlessdigitals'
class SJFalconersDailyStrips(_SmackJeeves):
sub = 'falcdaily'
class SJFallenAngelslove(_SmackJeeves):
sub = 'fallen-angels-love'
class SJFarOutMantic(_SmackJeeves):
sub = 'meteorflo'
class SJFarOutThere(_SmackJeeves):
sub = 'faroutthere'
class SJFatetheAnthologyofKaienandhisfuckingmagicfriends(_SmackJeeves):
sub = 'fatehoho'
class SJFemmeSchism(_SmackJeeves):
sub = 'femmeschism'
class SJFeralGentry(_SmackJeeves):
sub = 'feralgentry'
class SJFinalArcanum(_SmackJeeves):
sub = 'finalarcanum'
class SJFireredLisasReise(_SmackJeeves):
sub = 'lisasreise'
class SJFlyorFail(_SmackJeeves):
sub = 'flyorfail'
class SJForcedSeduction(_SmackJeeves):
sub = 'forced-seduction'
class SJForestHill(_SmackJeeves):
host = 'www.foresthillcomic.org'
class SJForgettheDistance(_SmackJeeves):
sub = 'forgetthedistance'
adult = True
class SJFortheloveofabrokenstring(_SmackJeeves):
sub = 'fortheloveofabrokenstring'
class SJFramebyFrame(_SmackJeeves):
sub = 'frame-by-frame'
adult = True
class SJFrenzyRedux(_SmackJeeves):
sub = 'theadventuresoffrenzy'
class SJFrobertTheDemon(_SmackJeeves):
sub = 'frobby'
class SJFromnowonImagirl(_SmackJeeves):
sub = 'fromnowonimagirl'
class SJFruitloopAndMrDownbeat(_SmackJeeves):
sub = 'fruitbeat'
class SJGamerCafe(_SmackJeeves):
sub = 'gamercafe'
class SJGamesPeoplePlayUpdatedWeekly(_SmackJeeves):
sub = 'gamespeopleplay'
class SJGardenofHearts(_SmackJeeves):
sub = 'gardenofhearts'
class SJGayBacon(_SmackJeeves):
sub = 'gaybacon'
class SJGayTimesWithRyanandJay(_SmackJeeves):
sub = 'gtwraj'
class SJGetUpandGo(_SmackJeeves):
sub = 'getupandgo'
adult = True
class SJGigisNuzlockeRuns(_SmackJeeves):
sub = 'giginuzlocke'
class SJGloomverse(_SmackJeeves):
sub = 'gloomverse'
class SJGnoph(_SmackJeeves):
sub = 'gnoph'
class SJGoldenSunGenerationsAftermathVolume1(_SmackJeeves):
sub = 'gsgbtsyearone'
class SJGoldenSunGenerationsColossoVolume6(_SmackJeeves):
sub = 'gsgbtsyearthree'
class SJGoodGame(_SmackJeeves):
sub = 'goodgame'
class SJGoodnightMrsGoose(_SmackJeeves):
sub = 'goose'
class SJGrayscale(_SmackJeeves):
sub = 'grayscale'
adult = True
class SJGuardianGhost(_SmackJeeves):
sub = 'guardianghost'
class SJGuardiansoftheGalaxialSpaceways(_SmackJeeves):
sub = 'ggs'
class SJHIPS(_SmackJeeves):
sub = 'hips'
adult = True
class SJHabibahssong(_SmackJeeves):
sub = 'habibahsong'
class SJHarvestMoonParadiseFound(_SmackJeeves):
sub = 'paradisefound'
class SJHatShop(_SmackJeeves):
sub = 'hatshop'
class SJHatethePlayer(_SmackJeeves):
host = 'hatetheplayer.thewebcomic.com'
class SJHelix(_SmackJeeves):
sub = 'helix'
adult = True
class SJHeltonShelton(_SmackJeeves):
sub = 'heltonshelton'
class SJHephaestus(_SmackJeeves):
host = 'hephaestus.thewebcomic.com'
class SJHereBeVoodoo(_SmackJeeves):
sub = 'herebevoodoo'
adult = True
class SJHiddenStrengthAWhiteNuzlocke(_SmackJeeves):
sub = 'hsnuzlocke'
class SJHinata(_SmackJeeves):
sub = 'hinata'
class SJHitandMiss(_SmackJeeves):
sub = 'hitandmiss'
class SJHolocrash(_SmackJeeves):
sub = 'holocrash'
adult = True
class SJHolyBlasphemy(_SmackJeeves):
sub = 'holyblasphemy'
class SJHolyCrap(_SmackJeeves):
sub = 'holycrap'
class SJHopeForABreeze(_SmackJeeves):
sub = 'h4ab'
class SJHouseofCraziness(_SmackJeeves):
sub = 'craziness'
class SJHurrocksFardel(_SmackJeeves):
sub = 'hurrocksfardel'
class SJHybristorific(_SmackJeeves):
sub = 'hybristorific'
adult = True
class SJIWishIggysWish(_SmackJeeves):
sub = 'i-wish-comic'
class SJIciVontLesMorts(_SmackJeeves):
sub = 'icivontlesmorts'
adult = True
class SJInHouseHumor(_SmackJeeves):
sub = 'inhousehumor'
class SJInchoatica(_SmackJeeves):
sub = 'inchoatica'
class SJIngloriousbasterds(_SmackJeeves):
sub = 'ingloriousbasterds'
class SJInhuman(_SmackJeeves):
sub = 'inhumancomic'
class SJInsideOuTAYuriTale(_SmackJeeves):
sub = 'insideout-a-yuri-tale'
class SJInspiredByADream(_SmackJeeves):
sub = 'inspiredbyadream'
class SJIntoxicated(_SmackJeeves):
sub = 'intoxicated'
adult = True
class SJItsan8BitWorldBlankWorld(_SmackJeeves):
sub = '8bitblankworld'
class SJJackiesStory(_SmackJeeves):
sub = 'jackiestory'
class SJJantar(_SmackJeeves):
sub = 'jantar'
class SJJantarpol(_SmackJeeves):
sub = 'jantar-pl'
class SJJason(_SmackJeeves):
sub = 'jasoncomic'
class SJJoeysAdventure(_SmackJeeves):
sub = 'joeysadventure'
class SJJourneyMan(_SmackJeeves):
sub = 'journeyman'
class SJJoyToTheWorld(_SmackJeeves):
sub = 'joytotheworld'
class SJJune(_SmackJeeves):
sub = 'june'
class SJJustAnotherLife(_SmackJeeves):
sub = 'justanotherlife'
class SJJustCrazy(_SmackJeeves):
sub = 'justcrazy'
class SJJustmyluck(_SmackJeeves):
sub = 'justmyluck'
class SJKCNO(_SmackJeeves):
sub = 'kcno'
class SJKaitoShuno(_SmackJeeves):
sub = 'kaitoshuno'
adult = True
class SJKasaKeira(_SmackJeeves):
sub = 'kasakeira'
class SJKatran(_SmackJeeves):
sub = 'katran'
class SJKazanatoFuneralPlanningService(_SmackJeeves):
sub = 'kazanato'
class SJKezroChroniclesPhantomOps(_SmackJeeves):
sub = 'phantomops'
class SJKirbandfriendsshowcase(_SmackJeeves):
sub = 'kas'
class SJKirbiesoftheAlternateDimension(_SmackJeeves):
sub = 'kirbyaltdimension'
class SJKirbyAdventure(_SmackJeeves):
sub = 'kirbysadventure'
class SJKirbyDreamTeam(_SmackJeeves):
sub = 'kirbysdreamteam'
class SJKirbyFunfestTheOriginals(_SmackJeeves):
sub = 'kirbyfunfestold'
class SJKirbyTheDeeArmy(_SmackJeeves):
sub = 'kirbyandthedeearmy'
class SJKirbysDreamAdventure(_SmackJeeves):
sub = 'kirbyda'
class SJKirbysDreamlandAdventures(_SmackJeeves):
sub = 'kirbysdreamlandadventures'
class SJKissmeSnow(_SmackJeeves):
sub = 'kissmesnow'
class SJKissoftheDevil(_SmackJeeves):
sub = 'kissofthedevil'
class SJKnightface(_SmackJeeves):
sub = 'knightface'
adult = True
class SJKnightsRequiem(_SmackJeeves):
sub = 'knightsrequiem'
class SJKojiX5(_SmackJeeves):
sub = 'kojix5'
class SJKreetor(_SmackJeeves):
sub = 'kreetor'
class SJKruptos(_SmackJeeves):
sub = 'kruptos'
class SJKuroNeko(_SmackJeeves):
sub = 'kuro-neko'
class SJKuronaFlutterandLylaSpamTime(_SmackJeeves):
sub = 'icantflyaplane'
class SJLOGOS(_SmackJeeves):
sub = 'logoscomic'
adult = True
class SJLOKI(_SmackJeeves):
sub = 'loki'
class SJLastBlockStanding(_SmackJeeves):
sub = 'lastblockstanding'
class SJLastLivingSouls(_SmackJeeves):
sub = 'lastlivingsouls'
class SJLatchkeyKingdom(_SmackJeeves):
sub = 'latchkeykingdom'
class SJLavenderLegend(_SmackJeeves):
sub = 'lavenderlegend'
class SJLeCirquedObscure(_SmackJeeves):
sub = 'cirquedobscure'
class SJLedbyaMadMan(_SmackJeeves):
sub = 'ledbyamadman'
class SJLegendofZeldaAHerosStory(_SmackJeeves):
sub = 'aherosstory'
class SJLegendofZeldaStaffofPower(_SmackJeeves):
sub = 'loz-sop'
class SJLegendofZeldaTheEdgeandTheLight(_SmackJeeves):
sub = 'legendofzelda'
class SJLegendofZeldaTheWindWaker(_SmackJeeves):
sub = 'zeldawindwaker'
class SJLegendsofMobiusBookOne(_SmackJeeves):
sub = 'legendsofmobius-bookone'
class SJLemongrass(_SmackJeeves):
sub = 'lemongrass'
class SJLesCendresdelHiver(_SmackJeeves):
sub = 'cendres'
class SJLetLoveRule(_SmackJeeves):
sub = 'letloverule'
class SJLethalDose(_SmackJeeves):
sub = 'lethaldosecomic'
adult = True
class SJLetsBreakitforReals(_SmackJeeves):
sub = 'breaktehmentality'
class SJLicensedHeroes(_SmackJeeves):
sub = 'licensedheroes'
class SJLifeAsACutOut(_SmackJeeves):
host = 'lifeasacutout.thewebcomic.com'
class SJLifeAsItWas(_SmackJeeves):
sub = 'lifeasitwas'
class SJLifeLessOrdinary(_SmackJeeves):
sub = 'lifelessordinary'
adult = True
class SJLifeonpaper(_SmackJeeves):
sub = 'lifeonpaper'
class SJLightLovers(_SmackJeeves):
sub = 'lightlovers'
class SJLightwithinShadow(_SmackJeeves):
sub = 'lightwithinshadow'
class SJLilLevi(_SmackJeeves):
sub = 'lillevi'
class SJLiliBleu(_SmackJeeves):
sub = 'lilibleu'
class SJLondonUnderworld(_SmackJeeves):
sub = 'lunderworld'
class SJLostNova(_SmackJeeves):
sub = 'lostnova'
class SJLoveHarbor(_SmackJeeves):
sub = 'shipcentral'
class SJLoveMeLoveMyTeddyBear(_SmackJeeves):
sub = 'teddybear'
class SJLoveandIcecream(_SmackJeeves):
sub = 'lovexandxicecream'
class SJLoveroftheSunandMoon(_SmackJeeves):
sub = 'loverofthesunandmoon'
class SJLsEmpire(_SmackJeeves):
sub = 'l-empire'
class SJLuffinpuffandEric(_SmackJeeves):
sub = 'luffinpuff'
class SJLumasParadise(_SmackJeeves):
sub = 'luma'
class SJMUTE(_SmackJeeves):
sub = 'muterobot'
class SJMYth(_SmackJeeves):
sub = 'myth'
class SJMagicalGirlAlice(_SmackJeeves):
sub = 'magicalgirlalice'
class SJMagicalMisfits(_SmackJeeves):
sub = 'magicalmisfits'
class SJMagience(_SmackJeeves):
host = 'www.magience.co'
class SJMagipunk(_SmackJeeves):
sub = 'magipunk'
class SJManifestedpart1(_SmackJeeves):
sub = 'manifested'
class SJMarXistemTWC(_SmackJeeves):
sub = 'marxistem'
class SJMarioandLuigiMisadventures(_SmackJeeves):
sub = 'mandladventures'
class SJMariosDayJob(_SmackJeeves):
sub = 'mariosjob'
class SJMariovsSonicvsMegaMan(_SmackJeeves):
sub = 'mvsvmm'
class SJMarsMind(_SmackJeeves):
sub = 'marsmind'
class SJMascara(_SmackJeeves):
sub = 'mascara'
class SJMasqueradeWTTM(_SmackJeeves):
sub = 'masqueradewttm'
class SJMatildasSweetCakeCafe(_SmackJeeves):
sub = 'mscc'
adult = True
class SJMaytheRainCome(_SmackJeeves):
sub = 'maytheraincome'
class SJMazscara(_SmackJeeves):
sub = 'mazscara'
class SJMegaManBattleNetwork7(_SmackJeeves):
sub = 'mmbn7-twt'
class SJMegaManTales(_SmackJeeves):
sub = 'megamantales'
class SJMegaPain(_SmackJeeves):
sub = 'megapain'
class SJMelodyAndMacabre(_SmackJeeves):
sub = 'melodyandmacabre'
class SJMerirosvotSeikkailumerella(_SmackJeeves):
sub = 'merirosvotseikkailumerella'
class SJMetroJack(_SmackJeeves):
sub = 'metro-jack'
adult = True
class SJMidnightPrince(_SmackJeeves):
sub = 'midnightprince'
class SJMineS(_SmackJeeves):
sub = 'mines'
class SJMinibot(_SmackJeeves):
sub = 'minibot'
class SJMinorActsofHeroism(_SmackJeeves):
host = 'www.minoractsofheroism.com'
class SJMissing(_SmackJeeves):
sub = 'missing'
class SJMissingversionfrancaise(_SmackJeeves):
sub = 'missingfr'
class SJMixupofallMixups(_SmackJeeves):
sub = 'mixupofmixups'
class SJMobianChaos(_SmackJeeves):
sub = 'mobianchaos'
class SJMokepon(_SmackJeeves):
sub = 'mokepon'
class SJMonstar(_SmackJeeves):
host = 'monstar.thewebcomic.com'
class SJMoonValley(_SmackJeeves):
sub = 'moonvalley'
class SJMorphE(_SmackJeeves):
host = 'morphe.thewebcomic.com'
class SJMortifer(_SmackJeeves):
sub = 'mortifer'
class SJMrFactory(_SmackJeeves):
sub = 'mrfactory'
class SJMyBoyfriendisaMobBoss(_SmackJeeves):
sub = 'mbmb'
adult = True
class SJMyFakeHeart(_SmackJeeves):
sub = 'myfakeheart'
class SJMySistertheDragon(_SmackJeeves):
sub = 'sisterdragon'
class SJMySparklingPrincesama(_SmackJeeves):
sub = 'kiraouji'
class SJMyStereoBot(_SmackJeeves):
sub = 'mystereobot'
class SJMyTrollLife(_SmackJeeves):
sub = 'mytrolllife'
class SJMyTwoCentsPlusTax(_SmackJeeves):
sub = 'mtcpt'
class SJMysticanDreams(_SmackJeeves):
sub = 'mysticandreams'
class SJMythsofUnovaAWhiteNuzlockeRunHardMode(_SmackJeeves):
sub = 'mythsofunova'
class SJNIK(_SmackJeeves):
sub = 'nik'
class SJNah(_SmackJeeves):
sub = 'thecomicformerlyknownasgenlab'
class SJNegligence(_SmackJeeves):
sub = 'negligence'
class SJNeoCrystalAdventures(_SmackJeeves):
sub = 'neocrystaladventures'
class SJNeonGlow(_SmackJeeves):
sub = 'neonglow'
class SJNevertheHero(_SmackJeeves):
sub = 'neverthehero'
class SJNexus(_SmackJeeves):
sub = 'nexus'
class SJNiceKitty(_SmackJeeves):
sub = 'nicekitty'
class SJNighHeavenandHell(_SmackJeeves):
sub = 'oldnighheavenandhell'
adult = True
class SJNightSpace(_SmackJeeves):
sub = 'nightspace'
class SJNissiesDragonPrincess(_SmackJeeves):
sub = 'drgnprincess'
class SJNixsFireRedNuzlocke(_SmackJeeves):
sub = 'nixnuzlocke'
class SJNoEnd(_SmackJeeves):
sub = 'no-end'
class SJNobleHeartsHiruandMerroug(_SmackJeeves):
sub = 'hiruandmerroug'
adult = True
class SJNormalcyisforWimps(_SmackJeeves):
sub = 'normalcyisforwimps'
class SJNotyoursamI(_SmackJeeves):
sub = 'notyoursami'
adult = True
class SJObsidianHeart(_SmackJeeves):
sub = 'obsidianheart'
class SJOctober20th(_SmackJeeves):
host = 'www.october20comic.com'
class SJOddPlaceOddTime(_SmackJeeves):
sub = 'oddplaceoddtime'
class SJOhman(_SmackJeeves):
sub = 'ohman'
class SJOldElastikid(_SmackJeeves):
sub = 'oldelastikid'
class SJOneRainyDay(_SmackJeeves):
sub = 'one-rainy-day'
adult = True
class SJOnlyonelovesong(_SmackJeeves):
sub = 'onlyonelovesong'
class SJOperationTheater(_SmackJeeves):
sub = 'operation-theater'
class SJOriginBook1Codearth(_SmackJeeves):
sub = 'theoriginbooks'
class SJOurTimeinEden(_SmackJeeves):
sub = 'ourtimeineden'
class SJOutbreak(_SmackJeeves):
sub = 'xoutbreak'
class SJOutofKey(_SmackJeeves):
sub = 'outofkey'
class SJOverSync(_SmackJeeves):
sub = 'oversync'
class SJPMDExplorersofHeart(_SmackJeeves):
sub = 'pmd-explorers-of-heart'
class SJPMDTeamFirefox(_SmackJeeves):
sub = 'pmdteamfirefox'
class SJPMDVictoryFire(_SmackJeeves):
sub = 'victoryfire'
class SJPTO(_SmackJeeves):
sub = 'pto'
adult = True
class SJPahantekija(_SmackJeeves):
sub = 'pahantekija'
class SJPanacea(_SmackJeeves):
sub = 'panacea'
adult = True
class SJPantsParty(_SmackJeeves):
sub = 'partypants'
class SJPanzerDragonandEnigmaCompleteEdition(_SmackJeeves):
sub = 'panzerdragonandenigma'
class SJParadox(_SmackJeeves):
sub = 'paradoxcomic'
adult = True
class SJParipety(_SmackJeeves):
sub = 'paripety'
class SJPause(_SmackJeeves):
sub = 'pause'
class SJPencilviewUpdatesMondayscough(_SmackJeeves):
sub = 'pencilview'
class SJPerinto(_SmackJeeves):
sub = 'perinto'
class SJPerplexingMagnoliaDisruption(_SmackJeeves):
sub = 'smgpmd'
class SJPeterPan(_SmackJeeves):
sub = 'peterpan'
class SJPhantomland(_SmackJeeves):
sub = 'phantomland'
class SJPhotoShootnarusasuDoujinshi(_SmackJeeves):
sub = 'photoshootnarusasu'
adult = True
class SJPlasticKings(_SmackJeeves):
sub = 'plastickings'
class SJPlatonicBoyfriends(_SmackJeeves):
sub = 'platonicboyfriends'
class SJPlayTime(_SmackJeeves):
sub = 'dollysplaytime'
class SJPokeVenturous(_SmackJeeves):
sub = 'pokeventuras'
class SJPokemonBeta(_SmackJeeves):
sub = 'pokemonbeta'
class SJPokemonCrystalDoubleNuzlockeChallenge(_SmackJeeves):
sub = 'miinuzlocke'
class SJPokemonGleamingCrystal(_SmackJeeves):
sub = 'gleamingcrystal'
class SJPokemonLANDSKY(_SmackJeeves):
sub = 'landsky'
class SJPokemonMysteryDungeonTeamCrystal(_SmackJeeves):
sub = 'crystalmysterydungeon'
class SJPokemonParallel(_SmackJeeves):
sub = 'pokemon-parallel'
class SJPokemonSAKOHJU(_SmackJeeves):
sub = 'sakohju'
class SJPokemonnoRakuen(_SmackJeeves):
sub = 'pokemon-no-rakuen'
class SJPonzi(_SmackJeeves):
sub = 'ponzi'
class SJPrettyMouth(_SmackJeeves):
sub = 'prettymouth'
class SJPrincessChroma(_SmackJeeves):
sub = 'princesschroma'
class SJProfessorDolphinpresentsPokemon(_SmackJeeves):
sub = 'pdpp'
class SJProjectCAPLimit(_SmackJeeves):
sub = 'imagecap'
class SJPuck(_SmackJeeves):
sub = 'puck'
class SJPulseandBolt(_SmackJeeves):
sub = 'pulse-bolt'
class SJPurpureaNoxa(_SmackJeeves):
sub = 'purpureanoxa'
adult = True
class SJQueerQueen(_SmackJeeves):
sub = 'queerqueen'
class SJRANDOM(_SmackJeeves):
sub = 'randomthecomic'
class SJROSIER(_SmackJeeves):
sub = 'rosier'
class SJRainLGBT(_SmackJeeves):
sub = 'rainlgbt'
class SJRainxSasori(_SmackJeeves):
sub = 'rainxsasori'
adult = True
class SJRareCandyTreatment(_SmackJeeves):
host = 'www.rarecandytreatment.com'
class SJRavenWolf(_SmackJeeves):
sub = 'ravenwolf'
class SJRedVelvetRequiem(_SmackJeeves):
sub = 'rvr'
class SJRegina(_SmackJeeves):
sub = 'regina'
class SJReidyandFriendsShowcase(_SmackJeeves):
sub = 'reidynfriends'
class SJRemoteAngel(_SmackJeeves):
sub = 'remoteangel'
class SJReplica(_SmackJeeves):
sub = 'replica'
adult = True
class SJRespectable(_SmackJeeves):
sub = 'respectable'
adult = True
class SJReturntoEden(_SmackJeeves):
sub = 'rte'
class SJRiversideExtras(_SmackJeeves):
host = 'www.riversidecomics.co'
adult = True
class SJRottenApple(_SmackJeeves):
sub = 'rottenapple'
class SJRoyalIcing(_SmackJeeves):
sub = 'royalicing'
class SJRubyNation(_SmackJeeves):
host = 'www.therubynation.com'
class SJRuderiQuest(_SmackJeeves):
sub = 'ruderi'
class SJRuneSpark(_SmackJeeves):
sub = 'runespark'
class SJRyuManwebcomicversion(_SmackJeeves):
sub = 'ryuman-web'
class SJSChIzO(_SmackJeeves):
sub = 'schizophrenic'
class SJSFCBlackjackBay(_SmackJeeves):
sub = 'blackjackbay'
class SJSFCForestofDreams(_SmackJeeves):
sub = 'sfcforestofdreams'
class SJSLightlyabOVeavErage(_SmackJeeves):
sub = 'slightlyaboveaverage'
adult = True
class SJSOSRadio(_SmackJeeves):
sub = 'sosradio'
class SJSPRITEDHeroesofDobalia(_SmackJeeves):
sub = 'spritedhod'
class SJSUNRISESTORY(_SmackJeeves):
sub = 'sunrisestory'
class SJSabishiiGhost(_SmackJeeves):
sub = 'sabishiighost'
class SJSaintforRent(_SmackJeeves):
sub = 'saint-for-rent'
class SJSakuraDAY(_SmackJeeves):
sub = 'sakuraday'
class SJSakuraMishzo(_SmackJeeves):
sub = 'sakurazo'
adult = True
class SJSalemUncommons(_SmackJeeves):
sub = 'salemuncommons'
class SJSallySprocketAndPistonPete(_SmackJeeves):
sub = 'ssnpp'
class SJSaltyKiss(_SmackJeeves):
sub = 'saltykiss'
class SJSaywhatyoumean(_SmackJeeves):
sub = 'saywhatyoumean'
class SJSchoolofRejectsSoRe(_SmackJeeves):
sub = 'sore'
class SJScionsoftheSeraph(_SmackJeeves):
sub = 'scions'
adult = True
class SJScrappedProject(_SmackJeeves):
sub = 'scrappedproject'
class SJSecretPowerbk1(_SmackJeeves):
sub = 'secretpower1'
class SJSecretPowerbk2(_SmackJeeves):
sub = 'secretpower2'
class SJSeki(_SmackJeeves):
sub = 'se-ki'
adult = True
class SJSenoireDelirium(_SmackJeeves):
sub = 'senoiredelirium'
class SJSeriousTimes(_SmackJeeves):
sub = 'serioustimes'
class SJShameless(_SmackJeeves):
sub = 'shamelesscomic'
class SJShamelessAdvertisements(_SmackJeeves):
sub = 'advertiseat'
class SJShotoutofCanon(_SmackJeeves):
sub = 'akumathfs'
class SJShroudofLight(_SmackJeeves):
sub = 'shroudoflight'
class SJSignifikat(_SmackJeeves):
sub = 'signifikat'
adult = True
class SJSimonSues(_SmackJeeves):
sub = 'simonsues'
class SJSimpleBear(_SmackJeeves):
sub = 'simplebear'
class SJSimplySarah(_SmackJeeves):
sub = 'simplysarah'
class SJSire(_SmackJeeves):
host = 'sire.thewebcomic.com'
class SJSkeptical(_SmackJeeves):
sub = 'skeptical'
class SJSlackmatic(_SmackJeeves):
sub = 'slackmatic'
class SJSlipstreamSingularity(_SmackJeeves):
sub = 'slipstreamsingularity'
class SJSmallPressAdventures(_SmackJeeves):
sub = 'smallpressadventures'
class SJSocksMittensandScarfs(_SmackJeeves):
sub = 'socksmitsscarfs'
class SJSomebodyShootMe(_SmackJeeves):
sub = 'somebodyshootme'
class SJSomethingLikeaPhenomenon(_SmackJeeves):
sub = 'somethinglikeaphenomenon'
adult = True
class SJSonicAuthorAdventII(_SmackJeeves):
sub = 'saa2'
class SJSonicBoom(_SmackJeeves):
sub = 'sonic-boom'
class SJSonicClub(_SmackJeeves):
sub = 'sonicclub'
class SJSonicDashly(_SmackJeeves):
sub = 'sonicdashly'
class SJSonicFuture(_SmackJeeves):
sub = 'sonicfuture'
class SJSonicSchoolRedo(_SmackJeeves):
sub = 'sonicschoolredo'
class SJSonicUniverseAsk(_SmackJeeves):
sub = 'sonicuniverseask'
class SJSoulGuardian(_SmackJeeves):
sub = 'soulguardian'
class SJSouthernCross(_SmackJeeves):
host = 'southerncross.thewebcomic.com'
class SJSovereignTheMostAmazingComicEver(_SmackJeeves):
sub = 'mostamazingcomicever'
class SJSpaghettiAndMeatballs(_SmackJeeves):
sub = 'spaghettiandmeatballs'
adult = True
class SJSparElricsextras(_SmackJeeves):
sub = 'sparextras'
class SJSparkStory(_SmackJeeves):
sub = 'sparkstory'
class SJSpellcross(_SmackJeeves):
sub = 'spellcross'
class SJSpiderWings(_SmackJeeves):
sub = 'spiderwings'
class SJSpidersilk(_SmackJeeves):
sub = 'spidersilk'
class SJSplitScreen(_SmackJeeves):
sub = 'splitscreencomic'
adult = True
class SJSpriterschaos(_SmackJeeves):
sub = 'spriterschaos'
class SJSprytts(_SmackJeeves):
sub = 'sprytts'
class SJStarTrip(_SmackJeeves):
sub = 'startrip'
class SJStay(_SmackJeeves):
sub = 'stay-comic'
adult = True
class SJStellaInChrome(_SmackJeeves):
sub = 'stellainchrome'
class SJStereophonic(_SmackJeeves):
host = 'stereophonic.thewebcomic.com'
class SJStoryofadamnedlove(_SmackJeeves):
sub = 'storyofadamnedlove'
class SJStrangersandFriends(_SmackJeeves):
sub = 'hemu'
class SJStriped(_SmackJeeves):
sub = 'striped'
adult = True
class SJStuntRayWalterswish(_SmackJeeves):
sub = 'stuntray'
class SJSubjecttoChangeCollegeWoes(_SmackJeeves):
sub = 'subject-to-change'
class SJSunfall(_SmackJeeves):
host = 'sunfall.thewebcomic.com'
class SJSunmeetsMoon(_SmackJeeves):
sub = 'sunmeetsmoon'
class SJSuperDimensionAfterTheHero(_SmackJeeves):
sub = 'afterthehero'
class SJSuperMarioBros3(_SmackJeeves):
sub = 'smb3'
class SJSuperMarjoBros(_SmackJeeves):
sub = 'marjobros'
class SJSupermassiveBlackHoleA(_SmackJeeves):
sub = 'smbhax'
class SJSurvivorFanCharacters(_SmackJeeves):
sub = 'sfc'
class SJSweetestPoison(_SmackJeeves):
sub = 'sweetestpoison'
class SJSwitchMechanism(_SmackJeeves):
sub = 'switchmechanism'
class SJSymbios(_SmackJeeves):
sub = 'symbios'
adult = True
class SJTEN(_SmackJeeves):
sub = 'ten'
class SJTLAAOK(_SmackJeeves):
sub = 'tlaaok'
adult = True
class SJTPTruePower(_SmackJeeves):
sub = 'truepower'
class SJTRIPP(_SmackJeeves):
sub = 'tripp'
class SJTaikiTheWebcomic(_SmackJeeves):
sub = 'taiki'
class SJTailsAdventureThroughTimeandOtherWorlds(_SmackJeeves):
sub = 'tailsadventure'
class SJTakingPicturesofStrangers(_SmackJeeves):
sub = 'darrenandkale'
adult = True
class SJTalesfromAaronsWings(_SmackJeeves):
sub = 'tfaw'
class SJThatWasntThereYesterday(_SmackJeeves):
sub = 'twty'
class SJThe13thWorld(_SmackJeeves):
sub = 'the13thworld'
class SJTheAdventuresofBanjoZ(_SmackJeeves):
sub = 'abz-fancomic'
adult = True
class SJTheAntihero(_SmackJeeves):
sub = 'antihero'
class SJTheArchipelago(_SmackJeeves):
sub = 'thearchipelago'
class SJTheAvianStories(_SmackJeeves):
sub = 'theavianstories'
class SJTheBattleInTheSky(_SmackJeeves):
sub = 'thebattleinthesky'
class SJTheBookofNosferatu(_SmackJeeves):
host = 'www.thebookofnosferatu.com'
class SJTheBrideoftheShark(_SmackJeeves):
sub = 'sameyome'
adult = True
class SJTheBucket(_SmackJeeves):
sub = 'thebucket'
class SJTheCafedAlizee(_SmackJeeves):
sub = 'alizee'
class SJTheCavernofSecrets(_SmackJeeves):
sub = 'cavern'
class SJTheColony(_SmackJeeves):
sub = 'thecolony'
adult = True
class SJTheContract(_SmackJeeves):
sub = 'the-contract'
class SJTheCrawl(_SmackJeeves):
sub = 'thecrawl'
class SJTheCurtandTonyShow(_SmackJeeves):
sub = 'thecurtandtonyshow'
class SJTheDarkAgeofMobius(_SmackJeeves):
sub = 'thedarkageofmobius'
class SJTheDarkLegacy(_SmackJeeves):
sub = 'tdlcomic'
class SJTheDemonicAdventuresofAngelWitchPita(_SmackJeeves):
sub = 'angelwitchpita'
adult = True
class SJTheDestroyer(_SmackJeeves):
sub = 'heartless-destroyer'
adult = True
class SJTheDragonandtheLemur(_SmackJeeves):
sub = 'dal'
adult = True
class SJTheDreaming(_SmackJeeves):
sub = 'thedreaming'
class SJTheDrifter(_SmackJeeves):
sub = 'thedrifter'
adult = True
class SJTheElectricRose(_SmackJeeves):
sub = 'electricrosecomic'
class SJTheForestofWhispers(_SmackJeeves):
sub = 'theforestofwhispers'
class SJTheGhostWithTheMost(_SmackJeeves):
sub = 'theghostwiththemost'
class SJTheGoldRiderofPern(_SmackJeeves):
sub = 'goldrider'
class SJTheGrayZone(_SmackJeeves):
sub = 'thegrayzone'
class SJTheHeadhunters(_SmackJeeves):
sub = 'headhunters'
class SJTheHeartofEarth(_SmackJeeves):
sub = 'heart-of-earth'
class SJTheHobbitbic(_SmackJeeves):
sub = 'hobbit'
class SJTheJosephComics(_SmackJeeves):
sub = 'josephcomics'
class SJTheKeyHotelEnding(_SmackJeeves):
sub = 'tekeyhotel'
class SJTheKeyToReality(_SmackJeeves):
sub = 'keytoreality'
class SJTheKwiddexProtocol(_SmackJeeves):
sub = 'kwiddexprotocol'
class SJTheLastBloodCafe(_SmackJeeves):
sub = 'lastbloodcafe'
class SJTheLegendaryQueen(_SmackJeeves):
sub = 'legendaryqueen'
adult = True
class SJTheLifeofMagFlamequill(_SmackJeeves):
sub = 'lifeofmag'
class SJTheLoneSwordsman(_SmackJeeves):
sub = 'theloneswordsman'
class SJTheLostland(_SmackJeeves):
sub = 'thelostlandcomic'
class SJTheMegaManandSonicSpriteShowcase(_SmackJeeves):
sub = 'megamanshowcase'
class SJTheMoistTouch(_SmackJeeves):
sub = 'themoisttouch'
class SJTheNOMEDSEGA(_SmackJeeves):
sub = 'nomed'
class SJTheNightSurfers(_SmackJeeves):
sub = 'thenightsurfers'
class SJTheNocheComicSeries(_SmackJeeves):
sub = 'nochecomicseries'
adult = True
class SJThePirateBalthasar(_SmackJeeves):
sub = 'thepiratebalthasar'
class SJThePremise(_SmackJeeves):
sub = 'thepremise'
class SJThePrincessandtheGiant(_SmackJeeves):
sub = 'princess'
class SJThePropertyofHate(_SmackJeeves):
sub = 'tpoh'
class SJTheReborn(_SmackJeeves):
sub = 'reborn'
class SJTheSearchforHenryJekyll(_SmackJeeves):
sub = 'thesearchforhenryjekyll'
class SJTheSilverLeague(_SmackJeeves):
sub = 'thesilverleague'
class SJTheSummerofBlakeSinclair(_SmackJeeves):
sub = 'blake-sinclair'
class SJTheTimeDog(_SmackJeeves):
sub = 'timedog'
class SJTheTytonNuzlockeChallengeEmeraldEdition(_SmackJeeves):
sub = 'tytonnuzlockeemerald'
class SJTheWastelands(_SmackJeeves):
sub = 'wastelands'
class SJTheWhiteTower(_SmackJeeves):
sub = 'thewhitetower'
class SJTheWinterCampaign(_SmackJeeves):
sub = 'winterc'
class SJTheYoshiHerd(_SmackJeeves):
sub = 'theyoshiherd'
class SJTheatrics(_SmackJeeves):
sub = 'theatrics'
class SJTheiaMania(_SmackJeeves):
sub = 'theia-mania'
class SJThelaughingDeath(_SmackJeeves):
sub = 'thelaughingdeath'
class SJThemadman(_SmackJeeves):
sub = 'themadman'
class SJTheswordsmanandtheamnesiac(_SmackJeeves):
sub = 'tsata'
adult = True
class SJThiefCatcherRingTail(_SmackJeeves):
sub = 'tcringtail'
class SJThinkBeforeYouThink(_SmackJeeves):
sub = 'thinkbeforeyouthink'
class SJThornTopia(_SmackJeeves):
sub = 'tnt100'
class SJThornsComic(_SmackJeeves):
sub = 'thornscomic'
class SJThroughtheWonkyEye(_SmackJeeves):
sub = 'through-the-wonky-eye'
class SJTosiHuonoYaoiSarjis(_SmackJeeves):
sub = 'tosihuonoyaoisarjis'
adult = True
class SJTotallyCrossover(_SmackJeeves):
sub = 'totallycrossover'
class SJTrainerWantstoFight(_SmackJeeves):
sub = 'twtf'
class SJTransUMan(_SmackJeeves):
sub = 'transuman'
adult = True
class SJTransfusions(_SmackJeeves):
sub = 'transfusions'
class SJTroublenextdoor(_SmackJeeves):
sub = 'troublenextdoor'
class SJUglyBoysLove(_SmackJeeves):
sub = 'shounenai'
class SJUglygame(_SmackJeeves):
sub = 'uglygame'
class SJUndertheDeadSkies(_SmackJeeves):
host = 'underthedeadskies.thewebcomic.com'
adult = True
class SJUnicampaLapis(_SmackJeeves):
sub = 'ual'
class SJUpDown(_SmackJeeves):
sub = 'updown'
adult = True
class SJUshalaatWorldsEnd(_SmackJeeves):
sub = 'ushala'
adult = True
class SJVACANT(_SmackJeeves):
sub = 'vacant'
class SJVacan7(_SmackJeeves):
sub = 'vacan7'
adult = True
class SJVerloreGeleentheid(_SmackJeeves):
host = 'verlore.thewebcomic.com'
class SJVoidMisadventures(_SmackJeeves):
sub = 'voidmisadventures'
class SJVoyageoftheBrokenPromise(_SmackJeeves):
sub = 'voyageofthebrokenpromise'
adult = True
class SJWHATaboutSHADOWS(_SmackJeeves):
sub = 'was'
class SJWakeEcho(_SmackJeeves):
sub = 'echo'
class SJWander(_SmackJeeves):
sub = 'wander'
class SJWantedDeadorDead(_SmackJeeves):
sub = 'wanteddeadordead'
class SJWayfar(_SmackJeeves):
sub = 'wayfar'
class SJWaysoftheheart(_SmackJeeves):
sub = 'wayoftheheart'
class SJWeAreGolden(_SmackJeeves):
sub = 'wearegolden'
adult = True
class SJWelcometoFreakshow(_SmackJeeves):
sub = 'welcometofreakshow'
class SJWelcometothePCA(_SmackJeeves):
sub = 'welcometothepca'
class SJWhatAboutLove(_SmackJeeves):
sub = 'whataboutlove'
adult = True
class SJWhatisdeepinonesheart(_SmackJeeves):
sub = 'ones-mindt'
class SJWhenSheWasBad(_SmackJeeves):
sub = 'whenshewasbad'
class SJWhenweweresilent(_SmackJeeves):
sub = 'silence'
class SJWhereaboutsOfTime(_SmackJeeves):
sub = 'wot'
class SJWhiteHeart(_SmackJeeves):
sub = 'whiteheart'
adult = True
class SJWhiteNoise(_SmackJeeves):
sub = 'white-noise'
class SJWildWingBoys(_SmackJeeves):
sub = 'wwb'
class SJWildWingBoysKoathArc(_SmackJeeves):
sub = 'wwbka'
class SJWildflowers(_SmackJeeves):
sub = 'wildflowers'
class SJWingsOverEthereal(_SmackJeeves):
sub = 'wings-over-ethereal'
class SJWingsTurnedtoDust(_SmackJeeves):
sub = 'wingsturnedtodust'
class SJWootlabs(_SmackJeeves):
host = 'wootlabs.thewebcomic.com'
class SJXXMoralityXx(_SmackJeeves):
sub = 'xxmoralityxx'
class SJYadotCakeShop(_SmackJeeves):
sub = 'yadotcakeshop'
adult = True
class SJYamanaokiHighSchool(_SmackJeeves):
sub = 'yamanaokihs'
class SJYouAreTheReasonForTheEndOfTheWorld(_SmackJeeves):
sub = 'thereasonfortheendoftheworld'
class SJYoungCannibals(_SmackJeeves):
host = 'www.youngcannibals.net'
class SJZaenWell(_SmackJeeves):
sub = 'zaenwell'
class SJZeldaTheNewAdventureofLinkIIMajorasMask(_SmackJeeves):
sub = 'newlink'
class SJ_A_(_SmackJeeves):
sub = 'a-the-stalker'