dosage/dosagelib/plugins/smackjeeves.py
2020-07-31 22:56:30 +02:00

640 lines
28 KiB
Python

# SPDX-License-Identifier: MIT
# Copyright (C) 2015-2020 Tobias Gruetzmacher
# Copyright (C) 2019-2020 Daniel Ring
import re
from ..scraper import _ParserScraper
class SmackJeeves(_ParserScraper):
baseUrl = 'https://www.smackjeeves.com/discover/'
apiBase = 'https://www.smackjeeves.com/api/discover/'
prevSearch = '//a[i[d:class("i-arrow-double-left-black")]]'
imageSearch = re.compile("comicData:[^']*'([^']*)'", re.DOTALL)
help = 'Index format: n'
def __init__(self, name, id, adult=False, endOfLife=False, last=None):
super(SmackJeeves, self).__init__('SmackJeeves/' + name)
self._comicid = id
self.url = self.baseUrl + 'articleList?titleNo={}'.format(id)
self.stripUrl = self.baseUrl + 'detail?titleNo={}&articleNo=%s'.format(id)
self.firstStripUrl = self.stripUrl % 1
self.adult = adult
self.endOfLife = endOfLife or last
self.lastid = (last or 0) - 1
if name == 'VerloreGeleentheid':
self.textSearch = True
def starter(self):
response = self.session.post(self.apiBase + 'articleList',
params={'titleNo': self._comicid})
response.raise_for_status()
return response.json()['result']['list'][self.lastid]['articleUrl']
def fetchUrls(self, url, data, urlsearch):
if urlsearch != self.imageSearch:
return super(SmackJeeves, self).fetchUrls(url, data, urlsearch)
# Find image URL in JavaScript
datatag = data.xpath('//script[contains(text(), "comicData")]')
if not datatag:
return ()
datamatch = self.imageSearch.search(datatag[0].text)
if not datamatch:
return ()
return (datamatch.group(1),)
def link_modifier(self, fromurl, tourl):
# All links redirect to /discover/ - so fix it to save a request
return tourl.replace('com/detail', 'com/discover/detail')
def namer(self, image_url, page_url):
articleNo = int(page_url.rsplit('=', 1)[1])
return '{:04}'.format(articleNo)
def fetchText(self, url, data, textSearch, optional):
if 'VerloreGeleentheid' in self.name:
response = self.session.post('https://www.smackjeeves.com/api/comments/get', params={
'titleNo': self._comicid,
'articleNo': url.rsplit('=', 1)[1],
'page': 1,
'order': 'new'
})
response.raise_for_status()
comments = response.json()['result']['list']
for comment in reversed(comments):
if comment['nickname'] == 'Wolfie_Inu':
return comment['commentText']
return None
else:
super(SmackJeeves, self).fetchText(url, data, textSearch, optional)
@classmethod
def getmodules(cls):
return (
cls('20TimesKirby', 91583),
cls('2Kingdoms', 112096, endOfLife=True),
cls('355Days', 114138),
cls('_A_', 130892, endOfLife=True),
cls('AB', 110961, adult=True),
cls('AceOfHearts', 155154),
cls('AcidMonday', 30447, adult=True),
cls('Adalsysla', 96496, endOfLife=True),
cls('ADoodleADay', 141301),
cls('AdventuresOfLumAndFriends', 122193),
cls('AdventuresoftheWeird', 4430),
cls('AetherTheories', 116164),
cls('AgeOfTheGray', 132378),
cls('AGirlOnTheServer', 44252),
cls('AKirbyKomic', 25724),
cls('ALaMode', 35776),
cls('AllInLOVE', 6639),
cls('AllStarHeroes', 127874),
cls('AlmostTouching', 140881, adult=True),
cls('AlwaysDamnedWebcomic', 21652, adult=True),
cls('AlwaysRainingHere', 96902),
cls('Amaravati', 49250),
cls('AmorVincitOmnia', 66370, adult=True),
cls('AmsdenEstate', 105458),
cls('AngelGuardian', 72720),
cls('ANGELOU', 21129),
cls('AnimalAdventures', 125930),
cls('Animayhem', 53122),
cls('AnythingAboutNothing', 50399),
cls('APTComic', 71310),
cls('AQuestionOfCharacter', 70161),
cls('Area9', 108861),
cls('AroundTheBlock', 125385),
cls('ArtOfAFantasy', 92258, adult=True),
cls('ASongforElise', 45895, adult=True),
cls('AtArmsLength', 39242),
cls('Atlaswebcomic', 140920),
cls('Autophobia', 82522),
cls('AyaTakeo', 60325),
cls('AYuriCollab', 126727, adult=True),
cls('BabysittingFourDemons', 5992),
cls('BadassRiz', 130263),
cls('BallandChain', 99503),
cls('Bard', 51147),
cls('BassComicAdventures', 131900),
cls('BattleSequence', 132075),
cls('Bearhoney', 111843),
cls('BearlyAbel', 41761),
cls('BeautifulLies', 130068),
cls('BehindTheGlassCurtain', 54480, endOfLife=True),
cls('BehindTheObsidianMirror', 94375, adult=True),
cls('BeretCatComics', 136026),
cls('Bestbrosforever', 132559),
cls('Betovering', 127694, adult=True),
cls('BettencourtHotel', 98760, endOfLife=True),
cls('BeTwin', 97886, endOfLife=True),
cls('BeyondTheOrdinary', 129233),
cls('BioRevelation', 121142),
cls('Bl3', 131849, endOfLife=True),
cls('BlackAndBlue', 63275, endOfLife=True),
cls('Blackdemon', 117183),
cls('BlackDragon', 131654),
cls('BlackFridayRule', 94517),
cls('BlackTapestries', 171490, adult=True),
cls('BlackSheepcomic', 91663),
cls('BleachRedux', 94169),
cls('BlindandBlue', 110850),
cls('BloodhuntersBirthOfAVampire', 92969, endOfLife=True),
cls('BloomAPokemonConquestComic', 122439),
cls('BlueHair', 119037),
cls('BoilingPointofBrain', 122291),
cls('BoogeyDancingMonkeyPot', 128196),
cls('BreachOfAgency', 82923, endOfLife=True),
cls('Burn', 93761),
cls('ByTheBook', 98401, adult=True),
cls('CafeSuada', 80707),
cls('Cambion', 112560, adult=True),
cls('CaptiveSoul', 115786),
cls('Captured', 135452, adult=True),
cls('CaravanaTaleofGodsandMen', 129824),
cls('Cataclysm', 98815, adult=True),
cls('Catnip', 108592, adult=True),
cls('Cerintha', 117941),
cls('ChampionofChampions', 103159),
cls('ChampionsAndHeroesAgeOfDragons', 98261),
cls('ChannelDDDNews', 120506),
cls('ChaosAdventuresII', 64827),
cls('ChaoticNation', 108410, adult=True),
cls('Charaktermaske', 118975),
cls('Chatuplines', 84863),
cls('CheneysGotaGun', 75737),
cls('ChickenScratches', 90898),
cls('ChildrenOfTheNight', 52560),
cls('ChimiMouryou', 108675),
cls('ChocolatewithPepper', 132832),
cls('ClairetheFlare', 121081),
cls('ClockworkAtrium', 3048),
cls('CloeRemembrance', 9150, endOfLife=True),
cls('CockroachTheater', 138343),
cls('Cogs', 130634),
cls('ColorBlind', 118617),
cls('ConventionalWisdom', 89324),
cls('CosmicDash', 4584),
cls('Cramberries', 82134),
cls('CrimsonWings', 113469),
cls('CrocodileTears', 85055, adult=True),
cls('CupOfOlea', 130678),
cls('CurseLineage', 86745),
cls('DanielleDark', 9257),
cls('Dasien', 1779, adult=True),
cls('DavidDoesntGetIt', 115176),
cls('DBON', 76205),
cls('DeathNoteIridescent', 87149),
cls('DEGAF', 120316),
cls('DEMENTED', 104334, adult=True),
cls('DemonBattles', 145936),
cls('DemonCat', 105404),
cls('DemonEater', 125937, adult=True),
cls('DenizensAttention', 56481),
cls('DevilsCake', 26927),
cls('DevotoMusicinHell', 114862, adult=True),
cls('Diaz', 129935),
cls('DigimonSaviors', 43521),
cls('DigimonTamersMiraiProject', 119257),
cls('DigitalInsanity', 144866),
cls('DoItYourself', 103195),
cls('DoodleBeans', 17473, adult=True),
cls('DoodlingAround', 117225),
cls('Dragonet', 119508),
cls('DragonKid', 96550),
cls('DreamCatcher', 23687),
cls('DumpofManyPeople', 138063),
cls('DungeonHordes', 94210),
cls('EATATAU', 64889),
cls('EDepthAngel', 98932),
cls('EidolonWhispersOfEternity', 136262),
cls('ElementalSpirits', 18192),
cls('EnkeltenKentta', 78834, adult=True),
cls('Enthrall', 113047, adult=True),
cls('EntreEuxDeux', 97894, endOfLife=True),
cls('Eorah', 135499, adult=True),
cls('Equsopia', 127680),
cls('ERAConvergence', 63750, endOfLife=True),
cls('ERAIbuki', 129506, endOfLife=True),
cls('ERRORERROR', 113481),
cls('EuphemisticEephus', 127121),
cls('EvilPlan', 19063),
cls('ExperimentalMegaman', 75706),
cls('EyesOfADigimon', 97117),
cls('FailureConfetti', 69275),
cls('FairyTaleRejects', 99139, adult=True),
cls('FaithlessDigitals', 137288),
cls('FalconersDailyStrips', 124329),
cls('FallenAngelslove', 113208),
cls('FarOutMantic', 48658),
cls('FarOutThere', 89199),
cls('FeralGentry', 119912),
cls('FinalArcanum', 51191),
cls('FireredLisasReise', 109151),
cls('FlyorFail', 104604),
cls('ForcedSeduction', 61407),
cls('ForgetTheDistance', 80429, adult=True),
cls('Fortheloveofabrokenstring', 116411),
cls('FramebyFrame', 71042, adult=True),
cls('FrobertTheDemon', 26586),
cls('FromnowonImagirl', 99018),
cls('FruitloopAndMrDownbeat', 82798),
cls('FullSpectrumTherapy', 156285),
cls('FurryExperience', 62354),
cls('GamerCafe', 138841),
cls('GamesPeoplePlayUpdatedWeekly', 72207),
cls('GardenofHearts', 106504),
cls('GayBacon', 104466),
cls('GayTimesWithRyanAndJay', 121095),
cls('GetUpAndGo', 42180, adult=True),
cls('GigisNuzlockeRuns', 157589),
cls('Gloomverse', 75498),
cls('Gnoph', 138286, endOfLife=True),
cls('GoodGame', 48048, endOfLife=True),
cls('GoodnightMrsGoose', 73655),
cls('Grayscale', 100295, adult=True),
cls('GuardiansoftheGalaxialSpaceways', 70286),
cls('Habibahssong', 137453),
cls('HarvestMoonParadiseFound', 105422, endOfLife=True),
cls('HateThePlayer', 118599),
cls('HatShop', 71816),
cls('Helix', 121066),
cls('HeltonShelton', 124804),
cls('Hephaestus', 79909),
cls('HereBeVoodoo', 133691, adult=True),
cls('HiddenStrengthAWhiteNuzlocke', 116170),
cls('Hinata', 134703),
cls('Holocrash', 64113, endOfLife=True),
cls('HolyBlasphemy', 91250),
cls('HolyCrap', 13235),
cls('HopeForABreeze', 40188),
cls('HouseOfCraziness', 171040),
cls('HurrocksFardel', 1488),
cls('IciVontLesMorts', 133719, adult=True),
cls('Inchoatica', 138342),
cls('Ingloriousbasterds', 139586),
cls('InHouseHumor', 108681),
cls('Inhuman', 108969),
cls('InsideOuTAYuriTale', 50590),
cls('InspiredByADream', 48419),
cls('ItsAn8BitWorldBlankWorld', 88082),
cls('IWishIggysWish', 107290),
cls('JackiesStory', 108822),
cls('Jantar', 134338),
cls('Jason', 139878),
cls('JoeysAdventure', 142807),
cls('JourneyMan', 129303),
cls('JoyToTheWorld', 129685),
cls('June', 90624),
cls('JustAnotherLife', 128013),
cls('JustCrazy', 84007),
cls('Justmyluck', 169106),
cls('KaitoShuno', 100498, adult=True),
cls('KasaKeira', 78059),
cls('KazanatoFuneralPlanningService', 24026),
cls('KCNO', 103010, endOfLife=True),
cls('KezroChroniclesPhantomOps', 104447),
cls('Kirbandfriendsshowcase', 85495),
cls('KirbiesoftheAlternateDimension', 108771),
cls('KirbyAdventure', 77366),
cls('KirbyDreamTeam', 112273),
cls('KirbyFunfestTheOriginals', 90652),
cls('KirbysDreamAdventure', 69796),
cls('KirbysDreamlandAdventures', 46154),
cls('KirbyTheDeeArmy', 115693, endOfLife=True),
cls('KissmeSnow', 125812),
cls('KissoftheDevil', 64006),
cls('Knightface', 97596, adult=True),
cls('KnightsRequiem', 68098),
cls('KojiX5', 108937, endOfLife=True),
cls('Kreetor', 80871),
cls('Kruptos', 99200, endOfLife=True),
cls('KuronaFlutterandLylaSpamTime', 124636),
cls('LastBlockStanding', 125034),
cls('LavenderLegend', 107018),
cls('LeCirquedObscure', 103647),
cls('LedbyaMadMan', 111999),
cls('LegendOfZeldaAHerosStory', 118155),
cls('LegendOfZeldaStaffOfPower', 112732),
cls('LegendOfZeldaTheEdgeAndTheLight', 126345, endOfLife=True),
cls('LegendOfZeldaTheWindWaker', 49542),
cls('Lemongrass', 131786),
cls('LesCendresdelHiver', 131767),
cls('LethalDose', 115067, adult=True),
cls('LetLoveRule', 177216),
cls('LicensedHeroes', 123974),
cls('LifeAsACutOut', 86222),
cls('LifeAsItWas', 117747),
cls('LifeLessOrdinary', 63169, adult=True),
cls('Lifeonpaper', 126099),
cls('LightLovers', 135581, adult=True),
cls('LightwithinShadow', 47016),
cls('LilLevi', 134946),
cls('LOGOS', 93415, adult=True),
cls('LOKI', 93990),
cls('LondonUnderworld', 45699),
cls('LostNova', 84173),
cls('LoveandIcecream', 112872),
cls('LoveHarbor', 130349),
cls('LoveMeLoveMyTeddyBear', 50359),
cls('LoveroftheSunandMoon', 121615),
cls('LsEmpire', 33751),
cls('LuffinpuffandEric', 83450),
cls('LumasParadise', 46770, last=174),
cls('MagicalMisfits', 138166),
cls('Magipunk', 131204),
cls('Manifestedpart1', 140208),
cls('MarioandLuigiMisadventures', 4806),
cls('MariosDayJob', 2330),
cls('MarioVsSonicVsMegaMan', 14122, endOfLife=True),
cls('MarsMind', 129347),
cls('MarXistemTWC', 100651),
cls('Mascara', 59912),
cls('MatildasSweetCakeCafe', 115251, adult=True),
cls('MayTheRainCome', 119715, endOfLife=True),
cls('Mazscara', 12456),
cls('MegaManTales', 6516),
cls('MegaPain', 88178),
cls('MelodyAndMacabre', 28408),
cls('MetroJack', 61376, adult=True),
cls('MidnightPrince', 106681, adult=True),
cls('MineS', 139112),
cls('Minibot', 18129),
cls('MinorActsOfHeroism', 78356),
cls('Missing', 118871),
cls('Missingversionfrancaise', 126329),
cls('MobianChaos', 49021),
cls('Mokepon', 42705),
cls('Monstar', 141569),
cls('MoonValley', 157462),
cls('MorphE', 122406),
cls('Mortifer', 17271),
cls('MrFactory', 119931),
cls('MyFakeHeart', 19105),
cls('MySisterTheDragon', 9612, endOfLife=True),
cls('MySparklingPrincesama', 105626),
cls('MyStereoBot', 133633),
cls('MysticanDreams', 130154),
cls('MythsOfUnovaAWhiteNuzlockeRunHardMode', 101385),
cls('MYth', 36430),
cls('Nah', 88350),
cls('Negligence', 66718),
cls('NeonGlow', 63747),
cls('NeverTheHero', 132200),
cls('Nexus', 115357),
cls('NiceKitty', 75854),
cls('NighHeavenandHell', 72209, adult=True),
cls('NightSpace', 142396),
cls('NIK', 83716),
cls('NissiesDragonPrincess', 112655),
cls('NixsFireRedNuzlocke', 127939),
cls('NobleHeartsHiruandMerroug', 138690, adult=True),
cls('NoEnd', 138812),
cls('NormalcyisforWimps', 23862),
cls('NotyoursamI', 63700, adult=True),
cls('ObnoxiousHerokun', 146954, adult=True),
cls('ObsidianHeart', 130610),
cls('October20th', 122344),
cls('OddPlaceOddTime', 60037),
cls('OldElastikid', 97110),
cls('OneRainyDay', 111352, adult=True),
cls('Onlyonelovesong', 86555),
cls('OperationTheater', 97500),
cls('OriginBook1Codearth', 124751),
cls('OurTimeInEden', 27011),
cls('Outbreak', 134869),
cls('OutofKey', 123152),
cls('OverSync', 114781),
cls('Panacea', 79601, adult=True),
cls('PantsParty', 70630),
cls('PanzerDragonandEnigmaCompleteEdition', 20039),
cls('Pause', 135615),
cls('PencilviewUpdatesMondayscough', 33041),
cls('PeterPan', 119991),
cls('Phantomland', 106943),
cls('PhotoShootNarusasuDoujinshi', 110984, adult=True, last=187),
cls('PlasticKings', 132377),
cls('PlayTime', 68440),
cls('PleaseBeMyBoytoy', 26922),
cls('PMDExplorersOfHeart', 121563),
cls('PMDTeamFirefox', 103870),
cls('PMDVictoryFire', 116780),
cls('PokemonBeta', 76962, endOfLife=True),
cls('PokemonCrystalDoubleNuzlockeChallenge', 102420, endOfLife=True),
cls('PokemonLANDSKY', 120046),
cls('PokemonNoRakuen', 22822),
cls('PokemonParallel', 86143),
cls('PokemonSAKOHJU', 120395),
cls('Pokeventurous', 98420),
cls('Ponzi', 85187),
cls('PrettyMouth', 131442),
cls('PrincessChroma', 106726),
cls('ProfessorDolphinpresentsPokemon', 81880),
cls('ProjectCAPLimit', 137000),
cls('PTO', 43363, adult=True),
cls('Puck', 100566),
cls('PullingYouUnder', 155504, adult=True),
cls('PulseandBolt', 86022),
cls('PurpureaNoxa', 103522, adult=True),
cls('QueerQueen', 130802),
cls('RainbowMansion', 140231, adult=True),
cls('RainLGBT', 90588),
cls('RainxSasori', 108131, adult=True, endOfLife=True),
cls('RANDOM', 99296),
cls('RareCandyTreatment', 83853),
cls('RavenWolf', 97826),
cls('Regina', 129902),
cls('ReidyAndFriendsShowcase', 45097),
cls('RemoteAngel', 46191),
cls('Replica', 123116, adult=True, endOfLife=True),
cls('Respectable', 128996, adult=True, endOfLife=True),
cls('ReturntoEden', 15691),
cls('ROSIER', 54232),
cls('RottenApple', 133069),
cls('RoyalIcing', 81321),
cls('RubyNation', 107039),
cls('RuneSpark', 140886),
cls('RUScrewed', 144524),
cls('RyuManwebcomicVersion', 135497, endOfLife=True),
cls('SabishiiGhost', 136824),
cls('SaintforRent', 123862),
cls('SakuraDAY', 135342),
cls('SakuraMishzo', 58018, adult=True),
cls('SalemUncommons', 70211),
cls('SallySprocketAndPistonPete', 58930),
cls('SaltyKiss', 104227),
cls('SayWhatYouMean', 82290),
cls('SChIzO', 94872),
cls('SchoolOfRejectsSoRe', 37768),
cls('ScionsoftheSeraph', 43320, adult=True),
cls('ScrappedProject', 73142),
cls('SecretPowerbk1', 117146),
cls('SecretPowerbk2', 117458),
cls('Seki', 123118, adult=True),
cls('SeriousTimes', 73090),
cls('SFCBlackjackBay', 123799),
cls('SFCForestofDreams', 88943),
cls('ShamelessAdvertisements', 51975),
cls('Shameless', 130592),
cls('ShotoutofCanon', 18876),
cls('ShroudofLight', 121119),
cls('Signifikat', 12217, adult=True),
cls('SimpleBear', 120596),
cls('Sire', 58167),
cls('Skeptical', 108904),
cls('Slackmatic', 144286),
cls('SLightlyAbOVeAvErage', 117203, adult=True),
cls('SlipstreamSingularity', 66132),
cls('SmallPressAdventures', 70273),
cls('SocksMittensandScarfs', 132813),
cls('SomethingLikeaPhenomenon', 176182, adult=True),
cls('SonicAuthorAdventII', 5867),
cls('SonicBoom', 111375),
cls('SonicClub', 5638),
cls('SonicDashly', 87024),
cls('SonicFuture', 30809),
cls('SonicSchoolRedo', 110100),
cls('SOSRadio', 107498),
cls('SouthernCross', 94541),
cls('SovereignTheMostAmazingComicEver', 129062),
cls('SparElricsExtras', 125431),
cls('Spellcross', 125055),
cls('SpiderWings', 36314),
cls('SplitScreen', 125293, adult=True, endOfLife=True),
cls('SPRITEDHeroesofDobalia', 109013),
cls('Spriterschaos', 11126),
cls('Sprytts', 70422),
cls('Stay', 102560, adult=True),
cls('StellaInChrome', 70107),
cls('Stereophonic', 129406),
cls('StolenGeneration', 20901, adult=True, endOfLife=True),
cls('Storyofadamnedlove', 107702),
cls('StrangersandFriends', 94050),
cls('Striped', 79896, adult=True),
cls('StuntRayWalterswish', 73075),
cls('SubjecttoChangeCollegeWoes', 48759),
cls('Sunfall', 133465),
cls('SunmeetsMoon', 62545),
cls('SUNRISESTORY', 127611),
cls('SuperDimensionAfterTheHero', 98885),
cls('SuperMarioBros3', 18739, endOfLife=True),
cls('SuperMarjoBros', 136454),
cls('SupermassiveBlackHoleA', 59625),
cls('SurvivorFanCharacters', 24928),
cls('SweetestPoison', 142001),
cls('SwitchMechanism', 121604, endOfLife=True),
cls('TaikiTheWebcomic', 87240),
cls('TailsAdventureThroughTimeandOtherWorlds', 116964),
cls('TakingPicturesofStrangers', 71337, adult=True),
cls('TalesFromAaronsWings', 142272, endOfLife=True),
cls('TEN', 96475),
cls('ThatWasntThereYesterday', 85420),
cls('The13thWorld', 108420),
cls('TheAdventuresOfBanjoZ', 136763, adult=True, endOfLife=True),
cls('TheAntihero', 64167),
cls('TheArchipelago', 142266),
cls('Theatrics', 93578),
cls('TheBattleInTheSky', 143006),
cls('TheBookOfNosferatu', 97421),
cls('TheBrideoftheShark', 61393, adult=True),
cls('TheBucket', 124197),
cls('TheCafedAlizee', 80009),
cls('TheCavernOfSecrets', 126366),
cls('TheColony', 70272, adult=True),
cls('TheContract', 121955),
cls('TheCrawl', 124962),
cls('TheDarkLegacy', 83199),
cls('TheDemonicAdventuresOfAngelWitchPita', 105060, adult=True),
cls('TheDestroyer', 79216, adult=True),
cls('TheDragonAndTheLemur', 91259, adult=True),
cls('TheDreaming', 142053, endOfLife=True),
cls('TheDrifter', 137597, adult=True),
cls('TheElectricRose', 133024),
cls('TheForestofWhispers', 123645),
cls('TheGhostWithTheMost', 125332),
cls('TheGoldRiderofPern', 30008),
cls('TheGrayZone', 116458),
cls('TheHeadhunters', 105336),
cls('TheHeartofEarth', 113048),
cls('TheiaMania', 115095),
cls('TheJosephComics', 19785, endOfLife=True),
cls('TheKeyHotelEnding', 106307, endOfLife=True),
cls('TheKwiddexProtocol', 70268),
cls('TheLastBloodCafe', 136484),
cls('ThelaughingDeath', 129212),
cls('TheLegendaryQueen', 17122, adult=True),
cls('TheLifeofMagFlamequill', 51697),
cls('TheLoneSwordsman', 18218),
cls('TheMadMan', 83928),
cls('TheMegaManandSonicSpriteShowcase', 75689),
cls('TheNightSurfers', 120705),
cls('TheNocheComicSeries', 133439, adult=True),
cls('TheNOMEDSEGA', 127642),
cls('ThePirateBalthasar', 73113),
cls('ThePremise', 118125),
cls('ThePrincessAndTheGiant', 59629, endOfLife=True),
cls('ThePropertyofHate', 117970),
cls('TheRealmOfKaerwyn', 156193),
cls('TheReborn', 1898),
cls('TheSearchForHenryJekyll', 139257),
cls('TheSilverLeague', 110008),
cls('TheSummerofBlakeSinclair', 95648),
cls('Theswordsmanandtheamnesiac', 74220, adult=True),
cls('TheTimeDog', 97194),
cls('TheTytonNuzlockeChallengeEmeraldEdition', 115517),
cls('TheWhiteTower', 123161, endOfLife=True),
cls('TheWinterCampaign', 80021),
cls('TheYoshiHerd', 5814),
cls('ThiefCatcherRingTail', 112115),
cls('ThornsComic', 131578),
cls('ThornTopia', 54482),
cls('TLAAOK', 92316, adult=True),
cls('TosiHuonoYaoiSarjis', 141725, adult=True),
cls('TotallyCrossover', 73445),
cls('TPTruePower', 13199),
cls('TrainerWantsToFight', 134083),
cls('Transfusions', 77588, adult=True),
cls('TransUMan', 107514, adult=True, endOfLife=True),
cls('TroubleNextDoor', 114482, endOfLife=True),
cls('UglyBoysLove', 102165),
cls('Uglygame', 61960),
cls('UnderTheDeadSkies', 114107),
cls('UnicampaLapis', 111371),
cls('UpDown', 140374, adult=True),
cls('UshalaatWorldsEnd', 130596, adult=True),
cls('Vacan7', 63460, adult=True),
cls('VACANT', 127276),
cls('VerloreGeleentheid', 80604, endOfLife=True),
cls('VoidMisadventures', 129134),
cls('VoyageoftheBrokenPromise', 137418, adult=True),
cls('WakeEcho', 70945),
cls('Wander', 118109),
cls('WantedDeadorDead', 68540),
cls('Wayfar', 95839),
cls('Waysoftheheart', 91122),
cls('WeAreGolden', 72590, adult=True),
cls('WelcomeToFreakshow', 72225),
cls('WelcomeToThePCA', 127811, endOfLife=True),
cls('WhatAboutLove', 74057, adult=True),
cls('WHATAboutSHADOWS', 109321, endOfLife=True),
cls('WhatIsDeepInOnesHeart', 130798),
cls('WhatWeRememberTheMost', 162746),
cls('WhenSheWasBad', 12859),
cls('Whenweweresilent', 156839),
cls('WhereaboutsOfTime', 133530),
cls('WhiteHeart', 124545, adult=True),
cls('WhiteNoise', 63110),
cls('Wildflowers', 125360),
cls('WildWingBoysKoathArc', 50240),
cls('WildWingBoys', 203574),
cls('WingsOverEthereal', 37417),
cls('WingsTurnedtoDust', 113033, last=417),
cls('Wootlabs', 101636),
cls('XXMoralityXx', 132016),
cls('YadotCakeShop', 106995, adult=True),
cls('YamanaokiHighSchool', 82468),
cls('YoungCannibals', 8027),
cls('ZaenWell', 111081),
cls('ZeldaTheNewAdventureofLinkIIMajorasMask', 43724),
)