dosage/dosagelib/plugins/gocomics.py
Tobias Gruetzmacher 68d4dd463a Revert robots.txt handling.
This brings us back to only honouring robots.txt on page downloads, not
on image downloads.

Rationale: Dosage is not a "robot" in the classical sense. It's not
designed to spider huge amounts of web sites in search for some content
to index, it's only intended to help users keep a personal archive of
comics he is interested in. We try very hard to never download any image
twice. This fixes #24.

(Precedent for this rationale: Google Feedfetcher:
https://support.google.com/webmasters/answer/178852?hl=en#robots)
2015-07-17 20:46:56 +02:00

801 lines
30 KiB
Python
Executable file

# -*- coding: iso-8859-1 -*-
# Copyright (C) 2004-2005 Tristan Seligmann and Jonathan Jacobs
# Copyright (C) 2012-2014 Bastian Kleineidam
# Copyright (C) 2015 Tobias Gruetzmacher
from re import compile
from ..scraper import make_scraper
from ..util import tagre
from ..helpers import bounceStarter
_imageSearch = (
compile(tagre("img", "src", r'(http://assets\.amuniversal\.com/[0-9a-fA-F]+)', before='alt="[0-9a-fA-F]+"')),
compile(tagre("img", "src", r'(http://assets\.amuniversal\.com/[0-9a-fA-F]+)')),
compile(tagre("meta", "content", r'(http://assets\.amuniversal\.com/[0-9a-fA-F]+)', before="og:image")),
)
_prevSearch = compile(tagre("a", "href", r'(/[^"]+/\d+/\d+/\d+)', after="prev"))
_nextSearch = compile(tagre("a", "href", r'(/[^"]+/\d+/\d+/\d+)', after="next"))
def add(name, shortname):
baseUrl = 'http://www.gocomics.com'
url = baseUrl + shortname
classname = 'GoComics_%s' % name
@classmethod
def namer(cls, imageUrl, pageUrl):
prefix, year, month, day = pageUrl.rsplit('/', 3)
return "%s_%s%s%s.gif" % (name, year, month, day)
globals()[classname] = make_scraper(classname,
url = url,
starter = bounceStarter(url, _nextSearch),
name='GoComics/' + name,
stripUrl=baseUrl + shortname + '/%s',
imageSearch = _imageSearch,
prevSearch = _prevSearch,
help='Index format: yyyy/mm/dd',
namer=namer,
)
# old comics removed from the listing
add('AdventuresofDaisy', '/Adventures-of-Daisy')
add('AdventuresofMikeAndSimon', '/adventures-of-mike-and-simon')
add('AnythingGoes', '/anything-goes')
add('BarkingCrayon', '/barking-crayon')
add('BenAndSeymour', '/ben-seymour')
add('BestInShow', '/best-in-show')
add('BobtheGroanUP', '/bob-the-groanup')
add('Cartertoons', '/cartertoons')
add('CockroachComix', '/cockroachcomix')
add('CowSheepandaGnomeNamedHelga', '/cow-sheep-and-a-gnome-named-helga')
add('DabneyandDad', '/dabney-and-dad')
add('DialHforHBomb', '/dial-h-for-h-bomb')
add('DitzAbledPrincess', '/ditzabled-princess')
add('DoodleDaysComics', '/doodle-days')
add('Dragin', '/dragin')
add('EBEJeebie', '/ebe-jeebie')
add('EDITORIALPASTANDPRESENT', '/editorial-past-and-present')
add('ElephantintheRoom', '/elephant-in-the-room')
add('ElfandMotorbelly', '/elf-and-motorbelly')
add('EngagAndNevets', '/engag-nevets')
add('EttoreandBaldo', '/ettore-and-baldo')
add('FantasticMegaLeague', '/fantastiteam')
add('FarcesofNature', '/farces-of-nature')
add('Featherweight', '/featherweight')
add('FrizziToons', '/frizzitoons')
add('FundayMorning', '/funday-morning')
add('GetAGrip', '/get-a-grip')
add('GunstonStreet', '/gunston-street')
add('HanginOut', '/hangin-out')
add('HarambeeHills', '/harambeehills')
add('Hbenson7', '/hbenson7')
add('HeadComics', '/head-comics')
add('HeavenlyNostrils', '/heavenly-nostrils')
add('HolySchnark', '/holy-schnark!')
add('Humoresque', '/humoresque')
add('ImaDillo', '/i-m-a-dillo')
add('KozmooftheCosmos', '/kozmoofthecosmos')
add('LeGooseyLu', '/LeGoosey-Lu')
add('Leadbellies', '/leadbellies')
add('LostInTranslation', '/lost-in-translation')
add('LucasLuminous', '/lucas-luminous')
add('Markonpaper', '/mark-on-paper')
add('MaryBWary', '/mary-b-wary')
add('MidLifewAlan', '/mid-life-with-alan')
add('MixedMedications', '/mixedmedications')
add('MrMorris', '/mr-morris')
add('MyCage', '/mycage')
add('MyGuardianGrandpa', '/my-guardian-grandpa')
add('NeatStep', '/neatstep')
add('NedAndLarry', '/ned-and-larry')
add('NeighborhoodZone', '/neightborhood-zone')
add('NobodysHome', '/nobodys-home')
add('OntheQuad', '/on-the-quad')
add('OrangesareFunny', '/oranges-are-funny')
add('Outnumbered', '/outnumbered')
add('ParisDoodles', '/mo-willems-paris-doodles')
add('PetFood', '/pet-food')
add('PlentyofPenguins', '/plenty-of-penguins')
add('Putz', '/putz')
add('QuestionsForKids', '/questions-for-kids')
add('RogueSymmetry', '/rogue_symmetry')
add('SNAFU', '/snafu')
add('SPACESLUGS', '/spaceslugs')
add('STEPDAD', '/stepdad')
add('Sabine', '/sabine')
add('SecondPrize', '/secondprize')
add('Skooled', '/skooled')
add('SpaceNutz', '/space-nutz')
add('SpaceTimeFunnies', '/spacetimefunnies')
add('Stookie', '/Stookie')
add('SuburbanWilderness', '/suburban-wilderness')
add('SuckerHeadSmack', '/suckerhead-smack')
add('THESILVERLINING', '/silver-lining')
add('TOWHOMITMAYCONCERN', '/towhomitmayconcern')
add('TheAdventuresofTeetyBallerina', '/the-adventures-of-teety-ballerina')
add('TheEdperiment', '/the-edperiment')
add('TheFruitBowl', '/thefruitbowl')
add('TheGoldenKid', '/golden-kid')
add('TheLilMiesters', '/the-lil-miesters')
add('TheOdderLimits', '/the-odder-limits')
add('TheSingleDadDiaries', '/single-dad-diaries')
add('TheVernalPool', '/vernal-pool')
add('ThrompTM', '/thromp')
add('ToBeNamed', '/to-be-named')
add('TonyAuth', '/tonyauth')
add('Toocrazy', '/too-crazy')
add('WayOutInLeftField', '/Way-Out-In-Left-Field')
add('Whatcatscanandcantdo', '/whatcatscanandcantdo')
add('YouGuysAreMyFriendsTheComic', '/you-guys-are-my-friends')
# do not edit anything below since these entries are generated from scripts/update_plugins.sh
# DO NOT REMOVE
add('060', '/0-60')
add('2CowsandaChicken', '/2cowsandachicken')
add('5thYearSenior', '/5th-year-senior')
add('9ChickweedLane', '/9chickweedlane')
add('9to5', '/9to5')
add('ABitSketch', '/a-bit-sketch')
add('ABomb', '/a-bomb')
add('ABootsAndPupComic', '/a-boots-and-pup-comic')
add('ACMEINKD', '/acme-inkd')
add('APEanimalpuns4every1', '/ape')
add('AbnormalTruth', '/abnormal-truth')
add('AdamAtHome', '/adamathome')
add('AdmiralSquirt', '/admiral-squirt')
add('AdultChildren', '/adult-children')
add('AdventuresofMartyandTurkey', '/marty-and-turkey')
add('Agnes', '/agnes')
add('AlisonWard', '/alison-ward')
add('AlleyOop', '/alley-oop')
add('AmaZnEvents', '/amaznevents')
add('AmandatheGreat', '/amanda-the-great')
add('Andertoons', '/andertoons')
add('Andnow', '/and-now')
add('AndyCapp', '/andycapp')
add('Anecdote', '/anecdote')
add('AngryLittleGirls', '/angry-little-girls')
add('AnimalCrackers', '/animalcrackers')
add('Annie', '/annie')
add('AppleCreekComics', '/apple-creek')
add('ArloandJanis', '/arloandjanis')
add('AskShagg', '/askshagg')
add('AuntyAcid', '/aunty-acid')
add('BC', '/bc')
add('BCenEspaol', '/espanol/bcespanol')
add('BERSERKALERT', '/berserk-alert')
add('BUNS', '/buns')
add('BUSHYTALES', '/bushy-tales')
add('BackintheDay', '/backintheday')
add('BadReporter', '/badreporter')
add('Badlands', '/badlands')
add('Baldo', '/baldo')
add('BaldoenEspaol', '/espanol/baldoespanol')
add('BallardStreet', '/ballardstreet')
add('BananaTriangle', '/banana-triangle')
add('BarkeaterLake', '/barkeaterlake')
add('BarneyAndClyde', '/barneyandclyde')
add('BasicInstructions', '/basicinstructions')
add('BatchRejection', '/batch-rejection')
add('Bazoobee', '/bazoobee')
add('BeMisery', '/bemisery')
add('BeanietheBrownie', '/beanie-the-brownie')
add('Beardo', '/beardo')
add('Ben', '/ben')
add('BeneaththeFerns', '/beneath-the-ferns')
add('BenitinyEneas', '/espanol/muttandjeffespanol')
add('BergerAndWyse', '/berger-and-wyse')
add('BerkeleyMews', '/berkeley-mews')
add('Betty', '/betty')
add('Bewley', '/bewley')
add('BiffAndRiley', '/biff-and-riley')
add('BigNate', '/bignate')
add('BigNateFirstClass', '/big-nate-first-class')
add('BigTop', '/bigtop')
add('BillyAndCo', '/billy-and-co')
add('Biographic', '/biographic')
add('Birdbrains', '/birdbrains')
add('Bliss', '/bliss')
add('BloomCounty', '/bloomcounty')
add('BlueSkiesToons', '/blue-skies-toons')
add('Bluebonnets', '/cowsandstuff')
add('BoNanas', '/bonanas')
add('BobGorrell', '/bobgorrell')
add('BobtheSquirrel', '/bobthesquirrel')
add('Boogerbrain', '/boogerbrain')
add('Boomerangs', '/boomerangs')
add('Bork', '/bork')
add('BotBrothers', '/bot-brothers')
add('BottAuto', '/bott-auto')
add('Bottomliners', '/bottomliners')
add('BoundandGagged', '/boundandgagged')
add('BrainSquirts', '/brain-squirts')
add('BreakingCatNews', '/breaking-cat-news')
add('BreakofDay', '/break-of-day')
add('Brevity', '/brevity')
add('BrewsterRockit', '/brewsterrockit')
add('BrianMcFadden', '/brian-mcfadden')
add('BrilliantMines', '/brilliant-mines')
add('BroomHilda', '/broomhilda')
add('BuffaloChips', '/buffalo-chips')
add('Bully', '/bully')
add('Buni', '/buni')
add('BuzzaWuzza', '/buzza-wuzza')
add('CAFFEINATED', '/CAFFEINATED')
add('CafconLeche', '/cafeconleche')
add('CalAndOzz', '/cal-and-ozz')
add('CalvinandHobbes', '/calvinandhobbes')
add('CalvinandHobbesenEspaol', '/espanol/calvinandhobbesespanol')
add('CandacenCompany', '/candace-n-company')
add('Candorville', '/candorville')
add('CandyPills', '/candy-pills')
add('CapsulasMedicas', '/espanol/capsulas-medicas')
add('Cathy', '/cathy')
add('CatsAtWork', '/cats-at-work')
add('CestlaVie', '/cestlavie')
add('ChanLowe', '/chanlowe')
add('CharmysArmy', '/charmys-army')
add('ChasingUnicorns', '/chasing-unicorns')
add('CheapThrillsCuisine', '/cheap-thrills-cuisine')
add('ChipBok', '/chipbok')
add('ChrisBritt', '/chrisbritt')
add('ChubbyGirlComics', '/chubbygirlcomics')
add('ChuckleBros', '/chucklebros')
add('CitizenDog', '/citizendog')
add('Classifudds', '/classifudds')
add('ClayBennett', '/claybennett')
add('ClayJones', '/clayjones')
add('ClearBlueWater', '/clearbluewater')
add('Cleats', '/cleats')
add('CleoandCompany', '/cleo-and-company')
add('ClosetoHome', '/closetohome')
add('CoffeeShopTidbits', '/coffee-shop-tidbits')
add('ColonelKernel', '/colonel-kernel')
add('Committed', '/committed')
add('Computoon', '/compu-toon')
add('Condorito', '/espanol/condorito')
add('ConnietotheWonnie', '/connie-to-the-wonnie')
add('Cornered', '/cornered')
add('CourageousManAdventures', '/courageous-man-adventures')
add('CowTown', '/cowtown')
add('CowandBoyClassics', '/cowandboy')
add('CoyoteVille', '/coyteville')
add('Crooksville', '/crooksville')
add('Crumb', '/crumb')
add('CuldeSac', '/culdesac')
add('DBCartoons', '/db-cartoons')
add('DaddysHome', '/daddyshome')
add('DanWasserman', '/danwasserman')
add('DanaSummers', '/danasummers')
add('DarkSideoftheHorse', '/darksideofthehorse')
add('DarrinBell', '/darrin-bell')
add('DeepDarkFears', '/deep-dark-fears')
add('DevinCraneComicStripGhostwriter', '/devincranecomicstripghostwriter')
add('DiamondLil', '/diamondlil')
add('DickTracy', '/dicktracy')
add('DilbertClassics', '/dilbert-classics')
add('DilbertenEspaol', '/espanol/dilbert-en-espanol')
add('DiligentCity', '/diligent-city')
add('DinosaurComics', '/dinosaur-comics')
add('DogEatDoug', '/dogeatdoug')
add('DogsDucksandAliens', '/dogs-ducks-and-aliens')
add('DogsofCKennel', '/dogsofckennel')
add('DoingTime', '/doingtime')
add('DomesticAbuse', '/domesticabuse')
add('DonBrutus', '/espanol/don-brutus')
add('DontPicktheFlowers', '/dont-pick-the-flowers')
add('DoodleTown', '/doodle-town')
add('Doonesbury', '/doonesbury')
add('Drabble', '/drabble')
add('DrewSheneman', '/drewsheneman')
add('Dromo', '/dro-mo')
add('DudeandDude', '/dudedude')
add('DumbQuestionBadAnswer', '/dumb-question-bad-answer')
add('DustSpecks', '/dust-specks')
add('Econogirl', '/econogirl')
add('Eek', '/eek')
add('EightballEyeball', '/eightball-eyeball')
add('ElCafdePoncho', '/espanol/poochcafeespanol')
add('ElMundodeBeakman', '/beakmanespanol')
add('EleriMaiHarrisCartoons', '/eleri-mai-harris-cartoons')
add('Elmo', '/elmo')
add('EmmyLou', '/emmy-lou')
add('Endtown', '/endtown')
add('ErictheCircle', '/eric-the-circle')
add('EspressoCity', '/Espresso-City')
add('FMinus', '/fminus')
add('FacesoftheNewsbyKerryWaghorn', '/facesinthenews')
add('FamilyTree', '/familytree')
add('FarOut', '/far-out')
add('Farcus', '/farcus')
add('FatCats', '/fat-cats')
add('FleasonFlick', '/fleasonflick')
add('FloandFriends', '/floandfriends')
add('FoolishMortals', '/foolish-mortals')
add('ForBetterorForWorse', '/forbetterorforworse')
add('ForHeavensSake', '/forheavenssake')
add('FortKnox', '/fortknox')
add('FourEyes', '/four-eyes')
add('FoxTrot', '/foxtrot')
add('FoxTrotClassics', '/foxtrotclassics')
add('FoxTrotenEspaol', '/espanol/foxtrotespanol')
add('Francis', '/francis')
add('FrankAndErnest', '/frankandernest')
add('FrankAndSteinway', '/frank-and-steinway')
add('FrankBlunt', '/frankblunt')
add('FrankieComics', '/frankie-comics')
add('Frazz', '/frazz')
add('FredBasset', '/fredbasset')
add('FredBassetenEspaol', '/espanol/fredbassetespanol')
add('FreeRange', '/freerange')
add('FreshlySqueezed', '/freshlysqueezed')
add('FriedCritter', '/fried-critter')
add('FritzMurphyAndMulligan', '/fritz-murphy-and-mulligan')
add('FrogApplause', '/frogapplause')
add('FromtheMoWillemsSketchbook', '/from-the-mo-willems-sketchbook')
add('GIRTH', '/girth')
add('GarciaCartoonCo', '/garcia-cartoon-co')
add('Garfield', '/garfield')
add('GarfieldMinusGarfield', '/garfieldminusgarfield')
add('GarfieldenEspaol', '/espanol/garfieldespanol')
add('GaryMarkstein', '/garymarkstein')
add('GaryVarvel', '/garyvarvel')
add('GasolineAlley', '/gasolinealley')
add('GatorsAndSuch', '/gators-and-such')
add('Gaturro', '/espanol/gaturro')
add('Geech', '/geech')
add('GenerationMute', '/generation-mute')
add('GentleCreatures', '/gentle-creatures')
add('GetFuzzy', '/getfuzzy')
add('GetaLife', '/getalife')
add('GilThorp', '/gilthorp')
add('GingerMeggs', '/gingermeggs')
add('GingerMeggsenEspaol', '/espanol/gingermeggsespanol')
add('GlasbergenCartoons', '/glasbergen-cartoons')
add('GlennMcCoy', '/glennmccoy')
add('GoComicsontheRoad', '/gocomics-on-the-road')
add('Graffiti', '/graffiti')
add('GramDragon', '/gramdragon')
add('GrandAvenue', '/grand-avenue')
add('GrandmaSnoops', '/grandmasnoops')
add('GrannyAnny', '/granny-anny')
add('GrayMatters', '/gray-matters')
add('GreenHumour', '/green-humour')
add('GreenPieces', '/green-pieces')
add('HIP', '/hip')
add('HUBRIS', '/hubris')
add('HaikuEwe', '/haikuewe')
add('HalfFull', '/half-full')
add('HalfFullenEspaol', '/espanol/half-full-espanol')
add('HamShears', '/ham-shears')
add('HankandDalesOurWorld', '/hank-and-dales-our-world')
add('HanktheSock', '/hank-the-sock')
add('HaphazardHumor', '/haphazard-humor')
add('Headcheese', '/headcheese')
add('HealthCapsules', '/healthcapsules')
add('HeartoftheCity', '/heartofthecity')
add('Heathcliff', '/heathcliff')
add('HeathcliffenEspaol', '/espanol/heathcliffespanol')
add('HenryPayne', '/henrypayne')
add('HerbandJamaal', '/herbandjamaal')
add('Herman', '/herman')
add('HermanenEspaol', '/espanol/herman-en-espanol')
add('HipsterPicnic', '/hipster-picnic')
add('Hogwashed', '/hogwashed')
add('HolidayDoodles', '/holiday-doodles')
add('Hollywoodpecker', '/hollywoodpecker')
add('HomeandAway', '/homeandaway')
add('HugoComics', '/hugo-comics')
add('HumanCull', '/human-cull')
add('HumblebeeandBob', '/humblebee-and-bob')
add('HutchOwen', '/hutch-owen')
add('ImTellingMom', '/telling-mom')
add('ImagineThis', '/imaginethis')
add('InherittheMirth', '/inherit-the-mirth')
add('InkPen', '/inkpen')
add('InspectorDangersCrimeQuiz', '/inspector-dangers-crime-quiz')
add('IntheBleachers', '/inthebleachers')
add('IntheSticks', '/inthesticks')
add('InvisibleBread', '/invisible-bread')
add('IsleofEx', '/isle-of-ex')
add('ItsAllAboutYou', '/itsallaboutyou')
add('ItsjustJim', '/its-just-jim')
add('JackOhman', '/jackohman')
add('JackRadioComics', '/jack-radio-comics')
add('JanesWorld', '/janesworld')
add('JeffDanziger', '/jeffdanziger')
add('JeffStahler', '/jeffstahler')
add('JenSorensen', '/jen-sorensen')
add('JerryHolbert', '/jerryholbert')
add('JillpokeBohemia', '/jillpoke-bohemia')
add('JimAndSarah', '/jim-and-sarah')
add('JimBentonCartoons', '/jim-benton-cartoons')
add('JimMorin', '/jimmorin')
add('JimsJournal', '/jimsjournal')
add('JoeHeller', '/joe-heller')
add('JoeVanilla', '/joevanilla')
add('JoelPett', '/joelpett')
add('JohnDeering', '/johndeering')
add('JolleyStuffBrowser', '/jolleystuff-browser')
add('JordanandBentley', '/jordan-and-bentley')
add('JumpStart', '/jumpstart')
add('JustSayUncle', '/just-say-uncle')
add('JustoyFranco', '/espanol/justo-y-franco')
add('KartoonsByKline', '/kartoons-by-kline')
add('KatetheGreat', '/kate-the-great')
add('KenCatalino', '/kencatalino')
add('KevinKallaugher', '/kevinkallaugher')
add('KidBeowulf', '/kid-beowulf')
add('KidShayComics', '/kid-shay-comics')
add('KidSpot', '/kidspot')
add('KidTown', '/kidtown')
add('KirbysTreehouse', '/kirbys-treehouse')
add('KitNCarlyle', '/kitandcarlyle')
add('KitchenCapers', '/kitchen-capers')
add('Kliban', '/kliban')
add('KlibansCats', '/klibans-cats')
add('LIGHTERSIDE', '/lighter-side')
add('LaCucaracha', '/lacucaracha')
add('LaCucarachaenEspaol', '/espanol/la-cucaracha-en-espanol')
add('LaloAlcaraz', '/laloalcaraz')
add('LaloAlcarazenEspaol', '/espanol/laloenespanol')
add('LardWantsWorldPeace', '/lard-wants-world-peace')
add('LardsWorldPeaceTips', '/lards-world-peace-tips')
add('LarryvilleBlue', '/larryville-blue')
add('LasHermanasStone', '/espanol/stonesoup_espanol')
add('LastKiss', '/lastkiss')
add('LayLines', '/lay-lines')
add('LearntoSpeakCat', '/learn-to-speak-cat')
add('LegendofBill', '/legendofbill')
add('LeighLunaComics', '/leigh-luna-comics')
add('LibertyMeadows', '/libertymeadows')
add('LilAbner', '/lil-abner')
add('LiliandDerek', '/lili-and-derek')
add('Lio', '/lio')
add('LioenEspaol', '/espanol/lioespanol')
add('LisaBenson', '/lisabenson')
add('LittleDogLost', '/littledoglost')
add('LittleFriedChickenandSushi', '/little-fried-chicken-and-sushi')
add('LittleNemo', '/little-nemo')
add('Lola', '/lola')
add('LolaenEspaol', '/espanol/lola-en-espanol')
add('LooksGoodonPaper', '/looks-good-on-paper')
add('LooseParts', '/looseparts')
add('LosOsorios', '/espanol/los-osorios')
add('LostSheep', '/lostsheep')
add('LostSideofSuburbia', '/lostsideofsuburbia')
add('Luann', '/luann')
add('LuannAgainn', '/luann-againn')
add('LuannenEspaol', '/espanol/luannspanish')
add('Lucan', '/lucan')
add('LuckyCow', '/luckycow')
add('LugNuts', '/lug-nuts')
add('LumandAbner', '/lum-and-abner')
add('Mac', '/mac')
add('MadDogGhettoCop', '/maddogghettocop')
add('MagicinaMinute', '/magicinaminute')
add('Magnificatz', '/magnificatz')
add('Maintaining', '/maintaining')
add('MakingIt', '/making-it')
add('MariasDay', '/marias-day')
add('Marmaduke', '/marmaduke')
add('MarmadukeenEspaol', '/espanol/marmaduke-en-espanol')
add('MarshallRamsey', '/marshallramsey')
add('MassiveFalls', '/massive-falls')
add('MattBors', '/matt-bors')
add('MattDavies', '/mattdavies')
add('MattWuerker', '/mattwuerker')
add('Maximus', '/maximus')
add('McArroni', '/mcarroni')
add('MediumLarge', '/medium-large')
add('MegClassics', '/meg-classics')
add('MichaelRamirez', '/michaelramirez')
add('Mick', '/mick')
add('MikeLester', '/mike-lester')
add('MikeLuckovich', '/mikeluckovich')
add('MikeduJour', '/mike-du-jour')
add('Millennialhood', '/millennialhood')
add('Millennialville', '/millennialville')
add('Milton50', '/milton-5-0')
add('Mindframe', '/mindframe')
add('MinimumSecurity', '/minimumsecurity')
add('MiscSoup', '/misc-soup')
add('MisterAndMe', '/mister-and-me')
add('ModeratelyConfused', '/moderately-confused')
add('MollyandtheBear', '/mollyandthebear')
add('Momma', '/momma')
add('Mongrels', '/mongrels')
add('MonstersR4Real', '/monsters-r4-real')
add('Monty', '/monty')
add('MontyDiaros', '/espanol/monty-diarios')
add('Mortimer', '/mortimer')
add('MortsIsland', '/noahs-island')
add('MotleyClassics', '/motley-classics')
add('MrGigiandtheSquid', '/mr-gigi-and-the-squid')
add('Mulligan', '/mulligan')
add('MustardandBoloney', '/mustard-and-boloney')
add('MuttAndJeff', '/muttandjeff')
add('MyCageClassics', '/mycage')
add('MythTickle', '/mythtickle')
add('NEUROTICA', '/neurotica')
add('Nancy', '/nancy')
add('NancyClassics', '/nancy-classics')
add('NateelGrande', '/espanol/nate-el-grande')
add('NavyBean', '/navybean')
add('NestHeads', '/nestheads')
add('NewAdventuresofQueenVictoria', '/thenewadventuresofqueenvictoria')
add('NickAnderson', '/nickanderson')
add('NickandZuzu', '/nick-and-zuzu')
add('NoBusinessIKnow', '/nobusinessiknow')
add('NoOrdinaryLife', '/no-ordinary-life')
add('NoPlaceLikeHolmes', '/no-place-like-holmes')
add('NonSequitur', '/nonsequitur')
add('Norman', '/Norman')
add('NothingisNotSomething', '/nothing-is-not-something')
add('ONIONAndPEA', '/onion-and-pea')
add('Oat', '/oat')
add('ObamaandtheFatman', '/obama-and-the-fatman')
add('OfftheMark', '/offthemark')
add('OhBrother', '/oh-brother')
add('OllieandQuentin', '/ollie-and-quentin')
add('OnAClaireDay', '/onaclaireday')
add('OneBigHappy', '/onebighappy')
add('OrdinaryBill', '/ordinary-bill')
add('OriginsoftheSundayComics', '/origins-of-the-sunday-comics')
add('OutoftheGenePoolReRuns', '/outofthegenepool')
add('OverQuirked', '/over-quirked')
add('Overboard', '/overboard')
add('OverboardenEspaol', '/espanol/overboardespanol')
add('OvertheHedge', '/overthehedge')
add('OzyandMillie', '/ozy-and-millie')
add('PCandPixel', '/pcandpixel')
add('PaddedCell', '/padded-cell')
add('PamosWorld', '/pamos-world')
add('PatOliphant', '/patoliphant')
add('PaulSzep', '/paulszep')
add('PawsForThoughtComics', '/paws-for-thought-comics')
add('Peanizles', '/peanizles')
add('Peanuts', '/peanuts')
add('PeanutsBegins', '/peanuts-begins')
add('PeanutsenEspaol', '/espanol/peanuts-espanol')
add('PearlsBeforeSwine', '/pearlsbeforeswine')
add('Peeples', '/peeples')
add('Periquita', '/espanol/periquita')
add('PerlasparalosCerdos', '/espanol/perlas-para-los-cerdos')
add('PerryBibleFellowship', '/perry-bible-fellowship')
add('PhilHands', '/phil-hands')
add('PhoebeandHerUnicorn', '/phoebe-and-her-unicorn')
add('Pi', '/pi')
add('Pibgorn', '/pibgorn')
add('PibgornSketches', '/pibgornsketches')
add('Pickles', '/pickles')
add('PicpakDog', '/picpak-dog')
add('PicturesinBoxes', '/pictures-in-boxes')
add('PigtimesCartoon', '/pigtimes-cartoon')
add('Pinkerton', '/pinkerton')
add('PipethePelican', '/pipe-the-pelican')
add('PirateMike', '/pirate-mike')
add('PlanB', '/planb')
add('PlasticBabyHeadsfromOuterSpace', '/plastic-babyheads')
add('Pluggers', '/pluggers')
add('PoliceLimit', '/policelimit')
add('PoochCafe', '/poochcafe')
add('PoorlyDrawnLines', '/poorly-drawn-lines')
add('PopCultureShockTherapy', '/pop-culture-shock-therapy')
add('Poptropica', '/poptropica')
add('PreTeena', '/preteena')
add('PricklyCity', '/pricklycity')
add('Primusthebadphilosopher', '/primus-the-bad-philosopher')
add('Puppets', '/puppets')
add('RabbitsAgainstMagic', '/rabbitsagainstmagic')
add('Rackafracka', '/rackafracka')
add('RaisingDuncan', '/raising-duncan')
add('RandolphItch2am', '/randolphitch')
add('RandomActsofNancy', '/random-acts-of-nancy')
add('RealLifeAdventures', '/reallifeadventures')
add('RealityCheck', '/realitycheck')
add('RebeccaHendin', '/rebecca-hendin')
add('RedMeat', '/redmeat')
add('RedandRover', '/redandrover')
add('RegularCreatures', '/regular-creatures')
add('ReplyAll', '/replyall')
add('ReplyAllLite', '/reply-all-lite')
add('RicigsToonTrivia', '/ricigs-toon-trivia')
add('RipHaywire', '/riphaywire')
add('RipleysBelieveItorNot', '/ripleysbelieveitornot')
add('RipleysBelieveitorNotSpanish', '/espanol/ripleys-en-espanol')
add('Risible', '/risible')
add('RobRogers', '/robrogers')
add('RobbieandBobby', '/robbie-and-bobby')
add('RobertAriail', '/robert-ariail')
add('RonWarren', '/ron-warren')
add('RosaDominical', '/espanol/rosa-dominical')
add('RoseisRose', '/roseisrose')
add('Rosy', '/rosy')
add('Rubes', '/rubes')
add('RudyPark', '/rudypark')
add('SCAIRYTALESTheNotSoScaryFairyTales', '/Scairy-Tales:-the-not-so-scary-fairy-tales!')
add('SOD', '/sod')
add('SandSharkBeach', '/sandshark-beach')
add('SantavsDracula', '/santa-vs-dracula')
add('SarahsScribbles', '/sarahs-scribbles')
add('SavageChickens', '/savage-chickens')
add('ScaryGary', '/scarygary')
add('ScorchedEarth', '/scorched-earth')
add('ScottStantis', '/scottstantis')
add('Scurvyville', '/scurvyville')
add('ShirleyandSonClassics', '/shirley-and-son-classics')
add('Shoe', '/shoe')
add('Shoecabbage', '/shoecabbage')
add('Shortcuts', '/shortcuts')
add('ShutterbugFollies', '/shutterbug-follies')
add('SignGarden', '/signgarden')
add('SigneWilkinson', '/signewilkinson')
add('SincerelyBeatrice', '/sincerely-beatrice')
add('SkinHorse', '/skinhorse')
add('Skippy', '/skippy')
add('Skylarking', '/skylarking')
add('SleepytownBeagles', '/sleepytown-beagles')
add('SmallNerdyCreatures', '/small-nerdy-creatures')
add('Smith', '/smith')
add('SnowSez', '/snowsez')
add('SoccerDude', '/soccer-dude')
add('SoccerEarth', '/soccer-earth')
add('SookyRottweiler', '/sooky-rottweiler')
add('SouptoNutz', '/soup-to-nutz')
add('Spectickles', '/abbotts-spectickles')
add('Speechless', '/speechless')
add('SpeedBump', '/speedbump')
add('SpinCrazy', '/spin-crazy')
add('SportsbyVoort', '/sports-by-voort')
add('SpottheFrog', '/spot-the-frog')
add('StankoAndTibor', '/stankotibor')
add('Starslip', '/starslip')
add('SteveBenson', '/stevebenson')
add('SteveBreen', '/stevebreen')
add('SteveKelley', '/stevekelley')
add('StoneSoup', '/stonesoup')
add('StrangeBrew', '/strangebrew')
add('StuartCarlson', '/stuartcarlson')
add('SubSub', '/subsub')
add('SuburbanFairyTales', '/suburban-fairy-tales')
add('SunnyStreet', '/sunny-street')
add('SunshineState', '/sunshine-state')
add('SuperFunPakComix', '/super-fun-pak-comix')
add('SuperSiblings', '/super-siblings')
add('Sylvia', '/sylvia')
add('TOBY', '/toby')
add('TankMcNamara', '/tankmcnamara')
add('Tarzan', '/tarzan')
add('TarzanenEspaol', '/espanol/tarzan-en-espanol')
add('TeacherInk', '/teacher-ink')
add('TedRall', '/tedrall')
add('TeddyBearsKillingSpree', '/teddy-bears-killing-spree')
add('TenCats', '/ten-cats')
add('ThatMonkeyTune', '/that-monkey-tune')
add('ThatNewCarlSmell', '/that-new-carl-smell')
add('Thatababy', '/thatababy')
add('ThatisPriceless', '/that-is-priceless')
add('ThatsLife', '/thats-life')
add('TheAcademiaWaltz', '/academiawaltz')
add('TheAdventuresofHeromanGuy', '/adventures-of-heroman-guy')
add('TheArgyleSweater', '/theargylesweater')
add('TheAwkwardYeti', '/the-awkward-yeti')
add('TheBarn', '/thebarn')
add('TheBeauforts', '/the-beauforts')
add('TheBellies', '/the-bellies')
add('TheBentPinky', '/the-bent-pinky')
add('TheBigPicture', '/thebigpicture')
add('TheBoobiehatch', '/the-boobiehatch')
add('TheBoondocks', '/boondocks')
add('TheBornLoser', '/the-born-loser')
add('TheBuckets', '/thebuckets')
add('TheCardinal', '/thecardinal')
add('TheCity', '/thecity')
add('TheCreeps', '/the-creeps')
add('TheDailyDrawing', '/the-daily-drawing')
add('TheDinetteSet', '/dinetteset')
add('TheDoozies', '/thedoozies')
add('TheDuplex', '/duplex')
add('TheElderberries', '/theelderberries')
add('TheFamilyBlend', '/the-family-blend')
add('TheFlyingMcCoys', '/theflyingmccoys')
add('TheFuscoBrothers', '/thefuscobrothers')
add('TheGreenMonkeys', '/thegreenmonkeys')
add('TheGrizzwells', '/thegrizzwells')
add('TheHumbleStumble', '/humble-stumble')
add('TheInsolentLemon', '/the-insolent-lemon')
add('TheKChronicles', '/thekchronicles')
add('TheKnightLife', '/theknightlife')
add('TheLeftyBoscoPictureShow', '/leftyboscopictureshow')
add('TheLightedLab', '/the-lighted-lab')
add('TheLostBear', '/the-lost-bear')
add('TheMartianConfederacy', '/the-martian-confederacy')
add('TheMeaningofLila', '/meaningoflila')
add('TheMiddletons', '/themiddletons')
add('TheNorm40', '/the-norm-4-0')
add('TheNormClassics', '/thenorm')
add('TheOldManAndHisDog', '/old-man-and-his-dog')
add('TheOtherCoast', '/theothercoast')
add('TheQuinnAndFinnShow', '/quinn-and-finn')
add('TheQuixoteSyndrome', '/the-quixote-syndrome')
add('TheSmileFile', '/mid-life-with-alan')
add('TheSunshineClub', '/the-sunshine-club')
add('TheUnemployed', '/the-unemployed')
add('TheWanderingMelon', '/the-wandering-melon')
add('TheWinyChild', '/the-winy-child')
add('TheWizardofIdSpanish', '/espanol/wizardofidespanol')
add('TheWorstThingIveEverDone', '/the-worst-thing-ive-ever-done')
add('ThinLines', '/thinlines')
add('Thingsesque', '/thingsesque')
add('Think', '/think')
add('TimEagan', '/tim-eagan')
add('TinyConfessions', '/tiny-confessions')
add('TinySepuku', '/tinysepuku')
add('TnCComics', '/tnc-comics')
add('TodaysDogg', '/todays-dogg')
add('TomToles', '/tomtoles')
add('TomtheDancingBug', '/tomthedancingbug')
add('TooMuchCoffeeMan', '/toomuchcoffeeman')
add('ToughTown', '/tough-town')
add('Trivquiz', '/trivquiz')
add('Trucutu', '/espanol/trucutu')
add('TruthFacts', '/truth-facts')
add('Tutelandia', '/espanol/tutelandia')
add('Twaggies', '/twaggies')
add('TwitchyOToole', '/twitchy-otoole')
add('TwoBits', '/two-bits')
add('USAcres', '/us-acres')
add('UnMannerlyWays', '/mannerly-ways')
add('UncleArtsFunland', '/uncleartsfunland')
add('UnderstandingChaos', '/understanding-chaos')
add('UnstrangePhenomena', '/unstrange-phenomena')
add('UpandOut', '/up-and-out')
add('Vernscartoons', '/vernscartoons')
add('ViewsAfrica', '/viewsafrica')
add('ViewsAmerica', '/viewsamerica')
add('ViewsAsia', '/viewsasia')
add('ViewsBusiness', '/viewsbusiness')
add('ViewsEurope', '/viewseurope')
add('ViewsLatinAmerica', '/viewslatinamerica')
add('ViewsMidEast', '/viewsmideast')
add('ViewsoftheWorld', '/viewsoftheworld')
add('ViiviAndWagner', '/viivi-and-wagner')
add('WTDuck', '/wtduck')
add('WaltHandelsman', '/walthandelsman')
add('WarpedAnddemented', '/warped-and-demented')
add('WatchYourHead', '/watchyourhead')
add('WayOutComics', '/way-out-comics')
add('WaynoVision', '/waynovision')
add('WeePals', '/weepals')
add('WelcometoFriendly', '/welcome-to-friendly')
add('WendlesLife', '/wendleslife')
add('WhiskeyFalls', '/whiskey-falls')
add('WideOpen', '/wide-open')
add('WillSays', '/will-says')
add('WillyWho', '/willy-who')
add('WinLoseDrew', '/drewlitton')
add('WindingRoads', '/winding-roads')
add('Winston', '/winston')
add('WitoftheWorld', '/witoftheworld')
add('WittOfWill', '/witt-of-will')
add('WizardofId', '/wizardofid')
add('WizardofIdClassics', '/wizard-of-id-classics')
add('WorkingDaze', '/working-daze')
add('WorkingItOut', '/workingitout')
add('WorldofWonder', '/world-of-wonder')
add('Wrobbertcartoons', '/wrobbertcartoons')
add('WrongHands', '/wrong-hands')
add('WuMo', '/wumo')
add('WumoenEspaol', '/espanol/wumoespanol')
add('Wyatt', '/wyatt')
add('YennyLopez', '/yenny-lopez')
add('YennyenEspaol', '/espanol/yennyespanol')
add('YouCanwithBeakmanandJax', '/beakman')
add('ZackHill', '/zackhill')
add('ZenPencils', '/zen-pencils')
add('ZeroGravity', '/zero-gravity')
add('Ziggy', '/ziggy')
add('ZiggyenEspaol', '/espanol/ziggyespanol')
add('Zootopia', '/zootopia')