Fix some comics.

This commit is contained in:
Bastian Kleineidam 2012-12-02 18:35:06 +01:00
parent 92420c5a08
commit 45df462a47
20 changed files with 222 additions and 181 deletions

View file

@ -3,12 +3,11 @@
# Copyright (C) 2012 Bastian Kleineidam # Copyright (C) 2012 Bastian Kleineidam
import os import os
import locale
import rfc822 import rfc822
import time import time
from .output import out from .output import out
from .util import urlopen, saneDataSize, normaliseURL, unquote from .util import urlopen, normaliseURL, unquote, strsize
from .events import getHandler from .events import getHandler
class FetchComicError(IOError): class FetchComicError(IOError):
@ -94,29 +93,21 @@ class ComicImage(object):
fn = os.path.join(comicDir, filename) fn = os.path.join(comicDir, filename)
if os.path.isfile(fn) and os.path.getsize(fn) >= comicSize: if os.path.isfile(fn) and os.path.getsize(fn) >= comicSize:
self.touch(fn) self.touch(fn)
out.write('Skipping existing file "%s".' % (fn,), 1) out.write('Skipping existing file "%s".' % fn, 1)
return fn, False return fn, False
try: try:
out.write('Writing comic to file %s...' % (fn,), 3) out.write('Writing comic to file %s...' % fn, 3)
with open(fn, 'wb') as comicOut: with open(fn, 'wb') as comicOut:
startTime = time.time()
comicOut.write(self.urlobj.content) comicOut.write(self.urlobj.content)
endTime = time.time()
self.touch(fn) self.touch(fn)
except: except Exception:
if os.path.isfile(fn): if os.path.isfile(fn):
os.remove(fn) os.remove(fn)
raise raise
else: else:
size = os.path.getsize(fn) size = strsize(os.path.getsize(fn))
bytes = locale.format('%d', size, True) out.write("Saved %s (%s)." % (fn, size), 1)
if endTime != startTime:
speed = saneDataSize(size / (endTime - startTime))
else:
speed = '???'
attrs = dict(fn=fn, bytes=bytes, speed=speed)
out.write('Saved "%(fn)s" (%(bytes)s bytes, %(speed)s/sec).' % attrs, 1)
getHandler().comicDownloaded(self.name, fn) getHandler().comicDownloaded(self.name, fn)
return fn, True return fn, True

View file

@ -5,14 +5,15 @@
from re import compile, MULTILINE from re import compile, MULTILINE
from ..util import tagre from ..util import tagre
from ..scraper import _BasicScraper from ..scraper import _BasicScraper
from ..helpers import regexNamer, bounceStarter from ..helpers import regexNamer, bounceStarter, indirectStarter
class ALessonIsLearned(_BasicScraper): class ALessonIsLearned(_BasicScraper):
latestUrl = 'http://www.alessonislearned.com/' baseUrl = 'http://www.alessonislearned.com/'
stripUrl = latestUrl + 'index.php?comic=%s'
imageSearch = compile(tagre("img", "src", r"(cmx/lesson\d+\.[a-z]+)"))
prevSearch = compile(tagre("a", "href", r"(index\.php\?comic=\d+)", quote="'")+r"[^>]+previous") prevSearch = compile(tagre("a", "href", r"(index\.php\?comic=\d+)", quote="'")+r"[^>]+previous")
starter = indirectStarter(baseUrl, prevSearch)
stripUrl = baseUrl + 'index.php?comic=%s'
imageSearch = compile(tagre("img", "src", r"(cmx/lesson\d+\.[a-z]+)"))
help = 'Index format: nnn' help = 'Index format: nnn'
@ -44,6 +45,7 @@ class AbsurdNotions(_BasicScraper):
latestUrl = 'http://www.absurdnotions.org/page129.html' latestUrl = 'http://www.absurdnotions.org/page129.html'
stripUrl = 'http://www.absurdnotions.org/page%s.html' stripUrl = 'http://www.absurdnotions.org/page%s.html'
imageSearch = compile(tagre('img', 'src', r'(an[^"]+)')) imageSearch = compile(tagre('img', 'src', r'(an[^"]+)'))
multipleImagesPerStrip = True
prevSearch = compile(tagre('a', 'href', r'([^"]+)') + tagre('img', 'src', 'nprev\.gif')) prevSearch = compile(tagre('a', 'href', r'([^"]+)') + tagre('img', 'src', 'nprev\.gif'))
help = 'Index format: n (unpadded)' help = 'Index format: n (unpadded)'
@ -82,7 +84,7 @@ class Alice(_BasicScraper):
class AlienLovesPredator(_BasicScraper): class AlienLovesPredator(_BasicScraper):
latestUrl = 'http://alienlovespredator.com/' latestUrl = 'http://alienlovespredator.com/'
stripUrl = latestUrl + '%s' stripUrl = latestUrl + '%s'
imageSearch = compile(tagre("img", "src", r'(http://alienlovespredator\.com/strips/strip_\d\.jpg)')) imageSearch = compile(tagre("img", "src", r'([^"]+)', after='border="1" alt="" width="750"'))
prevSearch = compile(tagre("a", "href", r'([^"]+)', after="prev")) prevSearch = compile(tagre("a", "href", r'([^"]+)', after="prev"))
help = 'Index format: yyyy/mm/dd/name/' help = 'Index format: yyyy/mm/dd/name/'
@ -105,7 +107,7 @@ class AltermetaOld(Altermeta):
class Angels2200(_BasicScraper): class Angels2200(_BasicScraper):
latestUrl = 'http://www.janahoffmann.com/angels/' latestUrl = 'http://www.janahoffmann.com/angels/'
stripUrl = latestUrl + '%s' stripUrl = latestUrl + '%s'
imageSearch = compile(tagre("img", "src", r"(http://www\.janahoffmann\.com/angels/comics/[^'\"]+)")) imageSearch = compile(tagre("img", "src", r"(http://www\.janahoffmann\.com/angels/comics/[^']+)", quote="'"))
prevSearch = compile(tagre("a", "href", r'([^"]+)')+"« Previous") prevSearch = compile(tagre("a", "href", r'([^"]+)')+"« Previous")
help = 'Index format: yyyy/mm/dd/part-<n>-comic-<n>' help = 'Index format: yyyy/mm/dd/part-<n>-comic-<n>'
@ -113,7 +115,7 @@ class Angels2200(_BasicScraper):
class AppleGeeks(_BasicScraper): class AppleGeeks(_BasicScraper):
latestUrl = 'http://www.applegeeks.com/' latestUrl = 'http://www.applegeeks.com/'
stripUrl = latestUrl + 'comics/viewcomic.php?issue=%s' stripUrl = latestUrl + 'comics/viewcomic.php?issue=%s'
imageSearch = compile(tagre("img", "src", r'"(strips/\d+?\..+?)"')) imageSearch = compile(tagre("img", "src", r'((?:/comics/)?issue\d+\.jpg)'))
prevSearch = compile(r'<div class="caption">Previous Comic</div>\s*<p><a href="([^"]+)">', MULTILINE) prevSearch = compile(r'<div class="caption">Previous Comic</div>\s*<p><a href="([^"]+)">', MULTILINE)
help = 'Index format: n (unpadded)' help = 'Index format: n (unpadded)'
@ -124,7 +126,7 @@ class Achewood(_BasicScraper):
imageSearch = compile(tagre("img", "src", r'(/comic\.php\?date=\d+)')) imageSearch = compile(tagre("img", "src", r'(/comic\.php\?date=\d+)'))
prevSearch = compile(tagre("a", "href", r'(index\.php\?date=\d+)', after="Previous")) prevSearch = compile(tagre("a", "href", r'(index\.php\?date=\d+)', after="Previous"))
help = 'Index format: mmddyyyy' help = 'Index format: mmddyyyy'
namer = regexNamer(compile(r'date%3D(\d{8})')) namer = regexNamer(compile(r'date=(\d+)'))
class AstronomyPOTD(_BasicScraper): class AstronomyPOTD(_BasicScraper):
@ -132,7 +134,7 @@ class AstronomyPOTD(_BasicScraper):
'http://antwrp.gsfc.nasa.gov/apod/astropix.html', 'http://antwrp.gsfc.nasa.gov/apod/astropix.html',
compile(r'<a href="(ap\d{6}\.html)">&gt;</a>')) compile(r'<a href="(ap\d{6}\.html)">&gt;</a>'))
stripUrl = 'http://antwrp.gsfc.nasa.gov/apod/ap%s.html' stripUrl = 'http://antwrp.gsfc.nasa.gov/apod/ap%s.html'
imageSearch = compile(r'<a href="(image/\d{4}/.+\..+?)">') imageSearch = compile(r'<a href="(image/\d{4}/[^"]+)"')
prevSearch = compile(r'<a href="(ap\d{6}\.html)">&lt;</a>') prevSearch = compile(r'<a href="(ap\d{6}\.html)">&lt;</a>')
help = 'Index format: yymmdd' help = 'Index format: yymmdd'
@ -246,6 +248,6 @@ class AlsoBagels(_BasicScraper):
class Annyseed(_BasicScraper): class Annyseed(_BasicScraper):
latestUrl = 'http://www.colourofivy.com/annyseed_webcomic_latest.htm' latestUrl = 'http://www.colourofivy.com/annyseed_webcomic_latest.htm'
stripUrl = 'http://www.colourofivy.com/annyseed_webcomic%s.htm' stripUrl = 'http://www.colourofivy.com/annyseed_webcomic%s.htm'
imageSearch = compile(r'<td width="570" height="887" valign="top"><img src="(.+?)"') imageSearch = compile(tagre("img", "src", r'(Annyseed[^"]+)'))
prevSearch = compile(r'<a href="(http://www.colourofivy.com/.+?)"><img src="Last.gif"') prevSearch = compile(r'<a href="(http://www\.colourofivy\.com/[^"]+)"><img src="Last.gif"')
help = 'Index format: nnn' help = 'Index format: nnn'

View file

@ -6,14 +6,7 @@ from re import compile
from ..util import tagre from ..util import tagre
from ..scraper import _BasicScraper from ..scraper import _BasicScraper
from ..helpers import indirectStarter
class BadlyDrawnKitties(_BasicScraper):
latestUrl = 'http://www.badlydrawnkitties.com/'
stripUrl = latestUrl + '%s.html'
imageSearch = compile(tagre("img", "src", r'(/new/[^"]+)'))
prevSearch = compile(tagre("a", "href", r'(/[^"]+)') + tagre("img", "src", r'/images/previous\.gif'))
help = 'Index format: n/nn (unpadded)'
class Bardsworth(_BasicScraper): class Bardsworth(_BasicScraper):
@ -27,7 +20,7 @@ class Bardsworth(_BasicScraper):
class BetterDays(_BasicScraper): class BetterDays(_BasicScraper):
latestUrl = 'http://jaynaylor.com/betterdays/' latestUrl = 'http://jaynaylor.com/betterdays/'
stripUrl = latestUrl + 'archives/%s.html' stripUrl = latestUrl + 'archives/%s.html'
imageSearch = compile(tagre("img", "src", r'(/betterdays/comic/[^"]+)')) imageSearch = compile(tagre("img", "src", r'(/betterdays/comic/[^>]+)', quote=""))
prevSearch = compile(tagre("a", "href", r'([^"]+)') + '&laquo; Previous') prevSearch = compile(tagre("a", "href", r'([^"]+)') + '&laquo; Previous')
help = 'Index format: yyyy/mm/<your guess>' help = 'Index format: yyyy/mm/<your guess>'
@ -93,17 +86,18 @@ class Brink(_BasicScraper):
class BoredAndEvil(_BasicScraper): class BoredAndEvil(_BasicScraper):
latestUrl = 'http://www.boredandevil.com/' baseUrl = 'http://www.boredandevil.com/'
stripUrl = latestUrl + '?date=%s' stripUrl = baseUrl + '?date=%s'
imageSearch = compile(tagre("img", "src", r'(strips/[^"]+)')) imageSearch = compile(tagre("img", "src", r'(strips/[^"]+)'))
prevSearch = compile(r'First Comic.+<a href="(.+?)".+previous-on.gif') prevSearch = compile(r'First Comic.+<a href="(.+?)".+previous-on.gif')
starter = indirectStarter(baseUrl, prevSearch)
help = 'Index format: yyyy-mm-dd' help = 'Index format: yyyy-mm-dd'
class BoyOnAStickAndSlither(_BasicScraper): class BoyOnAStickAndSlither(_BasicScraper):
latestUrl = 'http://www.boasas.com/' latestUrl = 'http://www.boasas.com/'
stripUrl = latestUrl + 'page/%s' stripUrl = latestUrl + 'page/%s'
imageSearch = compile(tagre("img", "src", r'(http://25\.media\.tumblr\.com/[^"]+)')) imageSearch = compile(tagre("img", "src", r'(http://\d+\.media\.tumblr\.com/[^"]+_1280\.png)'))
prevSearch = compile(tagre("a", "href", r'(/page/\d+)') + "<span>Next page") prevSearch = compile(tagre("a", "href", r'(/page/\d+)') + "<span>Next page")
help = 'Index format: n (unpadded)' help = 'Index format: n (unpadded)'
@ -149,9 +143,10 @@ class BadassMuthas(_BasicScraper):
class BrightlyWound(_BasicScraper): class BrightlyWound(_BasicScraper):
latestUrl = 'http://www.brightlywound.com/' baseUrl = 'http://www.brightlywound.com/'
stripUrl = latestUrl + '?comic=%s' latestUrl = baseUrl + '?comic=137'
imageSearch = compile(tagre("img", "src", r"(comic/[^']+)")) stripUrl = baseUrl + '?comic=%s'
imageSearch = compile(tagre("img", "src", r"(comic/[^']+)", quote="'"))
prevSearch = compile(r'<div id=\'navback\'><a href=\'(\?comic\=\d+)\'><img src=\'images/previous.png\'') prevSearch = compile(r'<div id=\'navback\'><a href=\'(\?comic\=\d+)\'><img src=\'images/previous.png\'')
help = 'Index format: nnn' help = 'Index format: nnn'
@ -215,6 +210,7 @@ class BetweenFailures(_BasicScraper):
class BillyTheBeaker(_BasicScraper): class BillyTheBeaker(_BasicScraper):
latestUrl = 'http://billy.defectivejunk.com/' latestUrl = 'http://billy.defectivejunk.com/'
stripUrl = latestUrl + 'index.php?strip=%s' stripUrl = latestUrl + 'index.php?strip=%s'
multipleImagesPerStrip = True
imageSearch = compile(tagre("img", "src", r'(bub\d+_\d+[^"]+)')) imageSearch = compile(tagre("img", "src", r'(bub\d+_\d+[^"]+)'))
prevSearch = compile(tagre("a", "href", r'(index\.php\?strip\=[^"]+)', after="Previous strip")) prevSearch = compile(tagre("a", "href", r'(index\.php\?strip\=[^"]+)', after="Previous strip"))
help = 'Index format: nnn' help = 'Index format: nnn'

View file

@ -14,6 +14,7 @@ class CaptainSNES(_BasicScraper):
stripUrl = latestUrl + '%s/' stripUrl = latestUrl + '%s/'
imageSearch = compile(r"<img src='(http://www\.captainsnes\.com/comics/[^']+)'") imageSearch = compile(r"<img src='(http://www\.captainsnes\.com/comics/[^']+)'")
prevSearch = compile(r'<a href="(http://www\.captainsnes\.com/[^"]+)"><span class="prev">') prevSearch = compile(r'<a href="(http://www\.captainsnes\.com/[^"]+)"><span class="prev">')
multipleImagesPerStrip = True
help = 'Index format: yyyy/mm/dd/nnn-stripname' help = 'Index format: yyyy/mm/dd/nnn-stripname'
@ -124,8 +125,8 @@ class CrapIDrewOnMyLunchBreak(_BasicScraper):
class CtrlAltDel(_BasicScraper): class CtrlAltDel(_BasicScraper):
latestUrl = 'http://www.cad-comic.com/cad/' latestUrl = 'http://www.cad-comic.com/cad/'
stripUrl = latestUrl + '%s' stripUrl = latestUrl + '%s'
imageSearch = compile(r'<img src="(/comics/\w+/\d{8}\..+?)"') imageSearch = compile(tagre("img", "src", r'(http://v\.cdn\.cad-comic\.com/comics/[^"]+)'))
prevSearch = compile(r'<a href="(/\w+/\d{8})" class="nav-back') prevSearch = compile(tagre("a", "href", r'([^"]+)', after="nav-back"))
help = 'Index format: yyyymmdd' help = 'Index format: yyyymmdd'
@ -249,7 +250,7 @@ class CalamitiesOfNature(_BasicScraper):
class Champ2010(_BasicScraper): class Champ2010(_BasicScraper):
# the latest URL is hard coded since the comic is discontinued # the latest URL is hard coded since the comic is discontinued
latestUrl = 'http://jedcollins.com/champ2010/champ-12-30-10.html' latestUrl = 'http://jedcollins.com/champ2010/champ-12-30-10.html'
stripUrl = 'http://jedcollins.com/champ2010/champ-%s.html' stripUrl = 'http://jedcollins.com/champ2010/%s.html'
imageSearch = compile(tagre("img", "src", r'(http://jedcollins\.com/champ2010/comics/[^"]+)')) imageSearch = compile(tagre("img", "src", r'(http://jedcollins\.com/champ2010/comics/[^"]+)'))
prevSearch = compile(tagre("a", "href", r'(http://jedcollins\.com/champ2010/[^"]+)', after="Previous")) prevSearch = compile(tagre("a", "href", r'(http://jedcollins\.com/champ2010/[^"]+)', after="Previous"))
help = 'Index format: yy-dd-mm' help = 'Index format: yy-dd-mm'

View file

@ -4,33 +4,48 @@
from re import compile from re import compile
from ..scraper import make_scraper from ..scraper import make_scraper
from ..helpers import bounceStarter from ..util import tagre, fetchUrl
from ..util import tagre
# note: adding the compile() functions inside add() is a major performance hog # note: adding the compile() functions inside add() is a major performance hog
_imageSearch = compile(tagre("img", "src", r'(http://media\.drunkduck\.com\.s3\.amazonaws\.com:80/[^"]+)', before="page-image")) _imageSearch = compile(tagre("img", "src", r'(http://media\.drunkduck\.com\.s3\.amazonaws\.com:80/[^"]+)', before="page-image"))
_linkSearch = tagre("a", "href", r'(/[^"]+/\d+/)') _linkSearch = tagre("a", "href", r'(/[^"]+/\d+/)')
_prevSearch = compile(_linkSearch + tagre("img", "class", "arrow_prev")) _prevSearch = compile(_linkSearch + tagre("img", "class", "arrow_prev"))
_nextSearch = compile(_linkSearch + tagre("img", "class", "arrow_next")) _nextSearch = compile(_linkSearch + tagre("img", "class", "arrow_next"))
_lastSearch = compile(_linkSearch + tagre("img", "class", "arrow_last"))
def add(name): def add(name):
classname = 'DrunkDuck_%s' % name classname = 'DrunkDuck_%s' % name
url = 'http://www.drunkduck.com/%s/' % name _url = 'http://www.drunkduck.com/%s/' % name
@classmethod @classmethod
def namer(cls, imageUrl, pageUrl): def _namer(cls, imageUrl, pageUrl):
index = int(pageUrl.rstrip('/').split('/')[-1]) index = int(pageUrl.rstrip('/').split('/')[-1])
ext = imageUrl.rsplit('.')[-1] ext = imageUrl.rsplit('.')[-1]
return '%d.%s' % (index, ext) return '%d.%s' % (index, ext)
@classmethod
def _starter(cls):
# first, try hopping to previous and next comic
url = fetchUrl(_url, _prevSearch)
if not url:
# no previous link found, try hopping to last comic
url = fetchUrl(_url, _lastSearch)
if not url:
raise ValueError("could not find lastSearch pattern %r in %s" % (_lastSearch.pattern, _url))
return url
url = fetchUrl(url, _nextSearch)
if not url:
raise ValueError("could not find nextSearch pattern %r in %s" % (_nextSearch.pattern, _url))
return url
globals()[classname] = make_scraper(classname, globals()[classname] = make_scraper(classname,
name = 'DrunkDuck/' + name, name = 'DrunkDuck/' + name,
starter = bounceStarter(url, _nextSearch), starter = _starter,
stripUrl = url + '%s/', stripUrl = _url + '%s/',
imageSearch = _imageSearch, imageSearch = _imageSearch,
prevSearch = _prevSearch, prevSearch = _prevSearch,
help = 'Index format: n (unpadded)', help = 'Index format: n (unpadded)',
namer = namer, namer = _namer,
) )
# do not edit anything below since these entries are generated from scripts/update.sh # do not edit anything below since these entries are generated from scripts/update.sh
@ -266,7 +281,6 @@ add('CorruptHardware')
add('Covalence') add('Covalence')
add('Coveinant_Journey') add('Coveinant_Journey')
add('Cowboys_and_Aliens_II') add('Cowboys_and_Aliens_II')
add('Crack')
add('Crack_Bird_and_Company') add('Crack_Bird_and_Company')
add('Crackwalker') add('Crackwalker')
add('Cramberries') add('Cramberries')
@ -313,7 +327,6 @@ add('Dasien')
add('Day_in_the_Life_of_a_Cosplayer') add('Day_in_the_Life_of_a_Cosplayer')
add('DeadFingers') add('DeadFingers')
add('Dead_Men') add('Dead_Men')
add('Dead_Strangers')
add('Death_Brigade') add('Death_Brigade')
add('Death_P0rn') add('Death_P0rn')
add('Decimated_Eden') add('Decimated_Eden')
@ -565,7 +578,6 @@ add('Insomniart')
add('Intergalactic_Continental_Dimension_Travelers') add('Intergalactic_Continental_Dimension_Travelers')
add('Internet_Superbuddies') add('Internet_Superbuddies')
add('Iornhart') add('Iornhart')
add('Iron_Wolf')
add('Irrumator') add('Irrumator')
add('Ishi_Alliance') add('Ishi_Alliance')
add('Island_Of_Submission') add('Island_Of_Submission')
@ -639,7 +651,6 @@ add('Laurentinas_Improv_Studio_The_Comic_Art')
add('Lavender_Legend') add('Lavender_Legend')
add('Led_by_a_Mad_Man') add('Led_by_a_Mad_Man')
add('LeeEXE') add('LeeEXE')
add('Legacy_of_Blaze')
add('Legacy_of_Kain_Laugh_Reaver') add('Legacy_of_Kain_Laugh_Reaver')
add('Legend_of_Link') add('Legend_of_Link')
add('Legend_of_Setar') add('Legend_of_Setar')
@ -756,7 +767,6 @@ add('Mob_Ties')
add('Modern_Day_Witchdoctor') add('Modern_Day_Witchdoctor')
add('Modest_Medusa') add('Modest_Medusa')
add('Monkey_Pot') add('Monkey_Pot')
add('Monster_Lover')
add('Monster_Lover_Destinys_Path') add('Monster_Lover_Destinys_Path')
add('Monster_Soup') add('Monster_Soup')
add('Moon_Reflected_in_Water') add('Moon_Reflected_in_Water')
@ -950,7 +960,6 @@ add('Raw_Fish')
add('Razor_Candy') add('Razor_Candy')
add('Rebound') add('Rebound')
add('Reckless_Youth') add('Reckless_Youth')
add('Red_Dog_Venue')
add('Red_Moon') add('Red_Moon')
add('Red_String') add('Red_String')
add('Redemption_of_Heroes') add('Redemption_of_Heroes')
@ -1275,7 +1284,6 @@ add('Two_Weeks_Notice')
add('Typical_Strange') add('Typical_Strange')
add('UNA_Frontiers_Commentary') add('UNA_Frontiers_Commentary')
add('USB') add('USB')
add('U_Chuu_No_Hoshi_Hotoshi_Tsuko')
add('Ultimate_X') add('Ultimate_X')
add('Ultimate_tourny_of_ultimate_fighting') add('Ultimate_tourny_of_ultimate_fighting')
add('Ultranimu') add('Ultranimu')

View file

@ -5,9 +5,11 @@
from re import compile from re import compile
from ..scraper import make_scraper from ..scraper import make_scraper
from ..util import tagre from ..util import tagre
from ..helpers import bounceStarter
_imageSearch = compile(tagre("img", "src", r'(http://assets\.amuniversal\.com/[0-9a-f]+)')) _imageSearch = compile(tagre("img", "src", r'(http://assets\.amuniversal\.com/[0-9a-f]+)'))
_prevSearch = compile(tagre("a", "href", r'(/[^"]+/\d+/\d+/\d+)', after="prev")) _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): def add(name, shortname):
baseUrl = 'http://www.gocomics.com' baseUrl = 'http://www.gocomics.com'
@ -15,11 +17,11 @@ def add(name, shortname):
@classmethod @classmethod
def namer(cls, imageUrl, pageUrl): def namer(cls, imageUrl, pageUrl):
prefix, year, month, day = pageUrl.split('/', 3) prefix, year, month, day = pageUrl.rsplit('/', 3)
return "%s_%s%s%s.gif" % (shortname, year, month, day) return "%s_%s%s%s.gif" % (name, year, month, day)
globals()[classname] = make_scraper(classname, globals()[classname] = make_scraper(classname,
latestUrl=baseUrl + shortname, starter = bounceStarter(baseUrl + shortname, _nextSearch),
name='GoComics/' + name, name='GoComics/' + name,
stripUrl=baseUrl + shortname + '/%s', stripUrl=baseUrl + shortname + '/%s',
imageSearch = _imageSearch, imageSearch = _imageSearch,
@ -223,7 +225,6 @@ add('Frazz', '/frazz')
add('FredBasset', '/fredbasset') add('FredBasset', '/fredbasset')
#add('FreeRange', '/freerange') #add('FreeRange', '/freerange')
add('FreshlySqueezed', '/freshlysqueezed') add('FreshlySqueezed', '/freshlysqueezed')
add('FrikkFrakkAndFrank', '/frikk-frakk-frank')
add('FrizziToons', '/frizzitoons') add('FrizziToons', '/frizzitoons')
add('FrogApplause', '/frogapplause') add('FrogApplause', '/frogapplause')
add('Garfield', '/garfield') add('Garfield', '/garfield')

View file

@ -14,12 +14,20 @@ _prevSearch = compile(tagre("a", "href", r'([^"]*/d/\d{8}\.html)') +
def add(name, url): def add(name, url):
classname = 'KeenSpot_%s' % name classname = 'KeenSpot_%s' % name
@classmethod
def _prevUrlModifier(cls, prevUrl):
if prevUrl:
return prevUrl.replace("keenspace", "comicgenesis"
).replace("comicgen.com", "comicgenesis.com")
globals()[classname] = make_scraper(classname, globals()[classname] = make_scraper(classname,
name='KeenSpot/' + name, name='KeenSpot/' + name,
latestUrl=url, latestUrl=url,
stripUrl=url + 'd/%s.html', stripUrl=url + 'd/%s.html',
imageSearch = _imageSearch, imageSearch = _imageSearch,
prevSearch = _prevSearch, prevSearch = _prevSearch,
prevUrlModifier = _prevUrlModifier,
multipleImagesPerStrip = True,
help = 'Index format: yyyymmdd', help = 'Index format: yyyymmdd',
) )
@ -41,7 +49,7 @@ add('ADVENTURERS', 'http://adventurers.comicgenesis.com/')
add('AKitsuneKotaroStory', 'http://kitsunekotaro.comicgenesis.com/') add('AKitsuneKotaroStory', 'http://kitsunekotaro.comicgenesis.com/')
add('AStepTooFar', 'http://asoftercore.comicgenesis.com/') add('AStepTooFar', 'http://asoftercore.comicgenesis.com/')
add('ATasteofEvil', 'http://atasteofevil.comicgenesis.com/') add('ATasteofEvil', 'http://atasteofevil.comicgenesis.com/')
add('AaaSoCAwesomenessandaSliceofCheese', 'http://retography.comicgen.com/') add('AaaSoCAwesomenessandaSliceofCheese', 'http://retography.comicgenesis.com/')
add('Acalltodestiny', 'http://madgoblin.comicgenesis.com/') add('Acalltodestiny', 'http://madgoblin.comicgenesis.com/')
add('Ace147', 'http://ace147.comicgenesis.com/') add('Ace147', 'http://ace147.comicgenesis.com/')
add('AcrossthePond', 'http://atp.comicgenesis.com/') add('AcrossthePond', 'http://atp.comicgenesis.com/')
@ -59,7 +67,7 @@ add('AinoYasha', 'http://ainoyasha.comicgenesis.com/')
add('AllAboutEda', 'http://aae.comicgenesis.com/') add('AllAboutEda', 'http://aae.comicgenesis.com/')
add('AllRosesHaveThorns', 'http://allroses.comicgenesis.com/') add('AllRosesHaveThorns', 'http://allroses.comicgenesis.com/')
add('AllWishes', 'http://allwishes.comicgenesis.com/') add('AllWishes', 'http://allwishes.comicgenesis.com/')
add('AlltheCommies', 'http://atc.comicgen.com/') add('AlltheCommies', 'http://atc.comicgenesis.com/')
add('AlphaBetaSoup', 'http://abs.comicgenesis.com/') add('AlphaBetaSoup', 'http://abs.comicgenesis.com/')
add('AlphaLuna', 'http://alphaluna.comicgenesis.com/') add('AlphaLuna', 'http://alphaluna.comicgenesis.com/')
add('AltaModaMetro', 'http://www.am-metro.net/') add('AltaModaMetro', 'http://www.am-metro.net/')
@ -77,13 +85,13 @@ add('AngelWarriorComics', 'http://angelwarriorcomics.comicgenesis.com/')
add('Angels', 'http://angelscomic.comicgenesis.com/') add('Angels', 'http://angelscomic.comicgenesis.com/')
add('AngryDMonkey', 'http://www.angrydmonkey.com/') add('AngryDMonkey', 'http://www.angrydmonkey.com/')
add('AngryPeople', 'http://angrypeople.comicgenesis.com/') add('AngryPeople', 'http://angrypeople.comicgenesis.com/')
add('AngrySoul', 'http://angrysoul.comicgen.com/') add('AngrySoul', 'http://angrysoul.comicgenesis.com/')
add('Angst', 'http://oldskool.comicgenesis.com/') add('Angst', 'http://oldskool.comicgenesis.com/')
add('AnimalInstinct', 'http://animalinstinct.comicgenesis.com/') add('AnimalInstinct', 'http://animalinstinct.comicgenesis.com/')
add('AnimeMomentsinHistory', 'http://animehistory.comicgenesis.com/') add('AnimeMomentsinHistory', 'http://animehistory.comicgenesis.com/')
add('Animenifesto', 'http://animenifesto.comicgenesis.com/') add('Animenifesto', 'http://animenifesto.comicgenesis.com/')
add('Anna', 'http://anna.comicgen.com/') add('Anna', 'http://anna.comicgenesis.com/')
add('AnthropomorphicHardware', 'http://hardware.comicgen.com/') add('AnthropomorphicHardware', 'http://hardware.comicgenesis.com/')
add('AntiBunny', 'http://www.antibunny.com/') add('AntiBunny', 'http://www.antibunny.com/')
add('AntiChristDaiji', 'http://clad.comicgenesis.com/') add('AntiChristDaiji', 'http://clad.comicgenesis.com/')
add('AntiZombieArmy', 'http://antizombiearmy.comicgenesis.com/') add('AntiZombieArmy', 'http://antizombiearmy.comicgenesis.com/')
@ -127,13 +135,13 @@ add('Bhag', 'http://bhag.comicgenesis.com/')
add('BigMouthComics', 'http://deathless.comicgenesis.com/') add('BigMouthComics', 'http://deathless.comicgenesis.com/')
add('BigTom', 'http://bigtom.comicgenesis.com/') add('BigTom', 'http://bigtom.comicgenesis.com/')
add('Bikou', 'http://bikou.comicgenesis.com/') add('Bikou', 'http://bikou.comicgenesis.com/')
add('BilltheMagician', 'http://billrocks.comicgen.com/') add('BilltheMagician', 'http://billrocks.comicgenesis.com/')
add('BishoujoKishiSailorHellsing', 'http://sailorhellsing.comicgenesis.com/') add('BishoujoKishiSailorHellsing', 'http://sailorhellsing.comicgenesis.com/')
add('BishounenHunters', 'http://bishihunters.comicgenesis.com/') add('BishounenHunters', 'http://bishihunters.comicgenesis.com/')
add('BitterSweetBS', 'http://bsbs.comicgenesis.com/') add('BitterSweetBS', 'http://bsbs.comicgenesis.com/')
add('BlackBlue', 'http://blackandblue.comicgenesis.com/') add('BlackBlue', 'http://blackandblue.comicgenesis.com/')
add('BlackMagic', 'http://naohiro.comicgen.com/') add('BlackMagic', 'http://naohiro.comicgenesis.com/')
add('BlackTapestries', 'http://blacktapestries.comicgen.com/') add('BlackTapestries', 'http://blacktapestries.comicgenesis.com/')
add('Blackaby', 'http://blackaby.comicgenesis.com/') add('Blackaby', 'http://blackaby.comicgenesis.com/')
add('Blahsville', 'http://blahsville.comicgenesis.com/') add('Blahsville', 'http://blahsville.comicgenesis.com/')
add('BlankGeorge', 'http://blankgeorge.comicgenesis.com/') add('BlankGeorge', 'http://blankgeorge.comicgenesis.com/')
@ -146,7 +154,6 @@ add('BloodWing', 'http://bloodwing.comicgenesis.com/')
add('BlottoStreet', 'http://blottostreet.comicgenesis.com/') add('BlottoStreet', 'http://blottostreet.comicgenesis.com/')
add('BlueCollarCleanup', 'http://franko.comicgenesis.com/') add('BlueCollarCleanup', 'http://franko.comicgenesis.com/')
add('BlueSkunkthewebcomic', 'http://freakofnature.comicgenesis.com/') add('BlueSkunkthewebcomic', 'http://freakofnature.comicgenesis.com/')
add('BlueZombie', 'http://entity.comicgenesis.com/')
add('BlueandOrange', 'http://blueandorange.comicgenesis.com/') add('BlueandOrange', 'http://blueandorange.comicgenesis.com/')
add('Blunderclod', 'http://blunderclod.comicgenesis.com/') add('Blunderclod', 'http://blunderclod.comicgenesis.com/')
add('BoB', 'http://ymmot.comicgenesis.com/') add('BoB', 'http://ymmot.comicgenesis.com/')
@ -156,9 +163,8 @@ add('BoldStyle', 'http://boldstyle.comicgenesis.com/')
add('BondsofBlood', 'http://bondsofblood.comicgenesis.com/') add('BondsofBlood', 'http://bondsofblood.comicgenesis.com/')
add('BoobsAhoy', 'http://boobsahoy.comicgenesis.com/') add('BoobsAhoy', 'http://boobsahoy.comicgenesis.com/')
add('Bookwyrms', 'http://bookwyrms.comicgenesis.com/') add('Bookwyrms', 'http://bookwyrms.comicgenesis.com/')
add('BoomerExpress', 'http://www.boomerexpress.com/')
add('BorderlineSanity', 'http://brdrline.comicgenesis.com/') add('BorderlineSanity', 'http://brdrline.comicgenesis.com/')
add('BottomFlavor', 'http://bottomflavor.comicgen.com/') add('BottomFlavor', 'http://bottomflavor.comicgenesis.com/')
add('BradTheVampire', 'http://bradthevampire.comicgenesis.com/') add('BradTheVampire', 'http://bradthevampire.comicgenesis.com/')
add('Brainfries', 'http://www.brainfries.com/') add('Brainfries', 'http://www.brainfries.com/')
add('BreakingtheDoldrum', 'http://breakingthedoldrum.comicgenesis.com/') add('BreakingtheDoldrum', 'http://breakingthedoldrum.comicgenesis.com/')
@ -175,7 +181,7 @@ add('CAGE', 'http://cage.comicgenesis.com/')
add('CTRO', 'http://llv.comicgenesis.com/') add('CTRO', 'http://llv.comicgenesis.com/')
add('CUltureShocked', 'http://kitsune76.comicgenesis.com/') add('CUltureShocked', 'http://kitsune76.comicgenesis.com/')
add('CameoComic', 'http://cameocomic.comicgenesis.com/') add('CameoComic', 'http://cameocomic.comicgenesis.com/')
add('CampAlaska', 'http://campalaska.comicgen.com/') add('CampAlaska', 'http://campalaska.comicgenesis.com/')
add('CampusLife', 'http://campuslife.comicgenesis.com/') add('CampusLife', 'http://campuslife.comicgenesis.com/')
add('CampusSafari', 'http://shivae2.comicgenesis.com/') add('CampusSafari', 'http://shivae2.comicgenesis.com/')
add('CanYouKeepaSecret', 'http://cykas.comicgenesis.com/') add('CanYouKeepaSecret', 'http://cykas.comicgenesis.com/')
@ -194,8 +200,8 @@ add('CaseyandAndy', 'http://sephalon.comicgenesis.com/')
add('Catalyst', 'http://catalyst.comicgenesis.com/') add('Catalyst', 'http://catalyst.comicgenesis.com/')
add('CatboyattheCon', 'http://trades.comicgenesis.com/') add('CatboyattheCon', 'http://trades.comicgenesis.com/')
add('Cats', 'http://cats.comicgenesis.com/') add('Cats', 'http://cats.comicgenesis.com/')
add('Chainroaker', 'http://chainroaker.comicgen.com/') add('Chainroaker', 'http://chainroaker.comicgenesis.com/')
add('Chair', 'http://chair.comicgen.com/') add('Chair', 'http://chair.comicgenesis.com/')
add('Chalkdust', 'http://chalkdustcomic.comicgenesis.com/') add('Chalkdust', 'http://chalkdustcomic.comicgenesis.com/')
add('ChaosInc', 'http://chaosinc.comicgenesis.com/') add('ChaosInc', 'http://chaosinc.comicgenesis.com/')
add('ChaosKnot', 'http://chaosknot.comicgenesis.com/') add('ChaosKnot', 'http://chaosknot.comicgenesis.com/')
@ -204,7 +210,7 @@ add('Chicanery', 'http://chicanery.comicgenesis.com/')
add('ChildrenAtPlay', 'http://childrenatplay.comicgenesis.com/') add('ChildrenAtPlay', 'http://childrenatplay.comicgenesis.com/')
add('Chris27sCollectionofCrappyComix', 'http://chrisread.comicgenesis.com/') add('Chris27sCollectionofCrappyComix', 'http://chrisread.comicgenesis.com/')
add('ChronicMisadventures', 'http://chronic.comicgenesis.com/') add('ChronicMisadventures', 'http://chronic.comicgenesis.com/')
add('ChubbyandNot', 'http://chubbyandnot.comicgen.com/') add('ChubbyandNot', 'http://chubbyandnot.comicgenesis.com/')
add('Cinderblock', 'http://cinderblock.comicgenesis.com/') add('Cinderblock', 'http://cinderblock.comicgenesis.com/')
add('Citron', 'http://citron.comicgenesis.com/') add('Citron', 'http://citron.comicgenesis.com/')
add('CitrusHouse', 'http://citrushouse.comicgenesis.com/') add('CitrusHouse', 'http://citrushouse.comicgenesis.com/')
@ -237,7 +243,7 @@ add('CracklingSilence', 'http://crackling.comicgenesis.com/')
add('Crackwalker', 'http://crackwalker.comicgenesis.com/') add('Crackwalker', 'http://crackwalker.comicgenesis.com/')
add('CrashBoomMagic', 'http://www.crash-boom-magic.com/') add('CrashBoomMagic', 'http://www.crash-boom-magic.com/')
add('CrazySlowlyGoing', 'http://crazyslowlygoing.comicgenesis.com/') add('CrazySlowlyGoing', 'http://crazyslowlygoing.comicgenesis.com/')
add('CreepyHead', 'http://creepyhead.comicgen.com/') add('CreepyHead', 'http://creepyhead.comicgenesis.com/')
add('CrimsonWings', 'http://sdcomics.comicgenesis.com/') add('CrimsonWings', 'http://sdcomics.comicgenesis.com/')
add('CrookedHalo', 'http://chaoscricket.comicgenesis.com/') add('CrookedHalo', 'http://chaoscricket.comicgenesis.com/')
add('CrossRoads', 'http://anivasion.comicgenesis.com/') add('CrossRoads', 'http://anivasion.comicgenesis.com/')
@ -245,7 +251,7 @@ add('CrossStreetBlues', 'http://crossstreet.comicgenesis.com/')
add('CrossroadsOfBoogerCounty', 'http://cobc.comicgenesis.com/') add('CrossroadsOfBoogerCounty', 'http://cobc.comicgenesis.com/')
add('CryHavoc', 'http://cryhavoc.comicgenesis.com/') add('CryHavoc', 'http://cryhavoc.comicgenesis.com/')
add('CuteThulhu', 'http://www.cutethulhu.com/') add('CuteThulhu', 'http://www.cutethulhu.com/')
add('DATAROM', 'http://datarom.comicgen.com/') add('DATAROM', 'http://datarom.comicgenesis.com/')
add('DBZRPGTheComic', 'http://dbzrpg.comicgenesis.com/') add('DBZRPGTheComic', 'http://dbzrpg.comicgenesis.com/')
add('DIABOLICA', 'http://diabolica.comicgenesis.com/') add('DIABOLICA', 'http://diabolica.comicgenesis.com/')
add('DIVE', 'http://dive.comicgenesis.com/') add('DIVE', 'http://dive.comicgenesis.com/')
@ -281,8 +287,8 @@ add('DinoandSam', 'http://dinoandsam.comicgenesis.com/')
add('DirkCrimsonEightBitDetective', 'http://dirkcrimson.comicgenesis.com/') add('DirkCrimsonEightBitDetective', 'http://dirkcrimson.comicgenesis.com/')
add('DirtySocks', 'http://dirtysocks.comicgenesis.com/') add('DirtySocks', 'http://dirtysocks.comicgenesis.com/')
add('DmxStoleMyCar', 'http://juggaloscrub.comicgenesis.com/') add('DmxStoleMyCar', 'http://juggaloscrub.comicgenesis.com/')
add('DogDays', 'http://dogdays.comicgen.com/') add('DogDays', 'http://dogdays.comicgenesis.com/')
add('DogandPony', 'http://dogandpony.comicgen.com/') add('DogandPony', 'http://dogandpony.comicgenesis.com/')
add('DogtheSpot', 'http://dogthespot.comicgenesis.com/') add('DogtheSpot', 'http://dogthespot.comicgenesis.com/')
add('DominicDeegan', 'http://dominicdeegan.comicgenesis.com/') add('DominicDeegan', 'http://dominicdeegan.comicgenesis.com/')
add('DominicDurgan', 'http://dominicdurgan.comicgenesis.com/') add('DominicDurgan', 'http://dominicdurgan.comicgenesis.com/')
@ -308,10 +314,9 @@ add('DreamersDynasty', 'http://kidneo66.comicgenesis.com/')
add('DreamofaWorld', 'http://doaw.comicgenesis.com/') add('DreamofaWorld', 'http://doaw.comicgenesis.com/')
add('Drewford', 'http://drewford.comicgenesis.com/') add('Drewford', 'http://drewford.comicgenesis.com/')
add('DrunkMonkeyComicsPresents', 'http://drunkmonkey.comicgenesis.com/') add('DrunkMonkeyComicsPresents', 'http://drunkmonkey.comicgenesis.com/')
add('DungeonDamage', 'http://dungeondamage.comicgenesis.com/')
add('Dylan', 'http://roryobannion.comicgenesis.com/') add('Dylan', 'http://roryobannion.comicgenesis.com/')
add('DysfunctionJunction', 'http://dysfunctionjunction.comicgenesis.com/') add('DysfunctionJunction', 'http://dysfunctionjunction.comicgenesis.com/')
add('Dyson27sCreek', 'http://dysonscreek.comicgen.com/') add('Dyson27sCreek', 'http://dysonscreek.comicgenesis.com/')
add('E2', 'http://e2e.comicgenesis.com/') add('E2', 'http://e2e.comicgenesis.com/')
add('ECWorldofFenninRo', 'http://wofr.comicgenesis.com/') add('ECWorldofFenninRo', 'http://wofr.comicgenesis.com/')
add('ESHbyESH', 'http://esh.comicgenesis.com/') add('ESHbyESH', 'http://esh.comicgenesis.com/')
@ -334,7 +339,7 @@ add('Ensuing', 'http://ensuing.comicgenesis.com/')
add('Epigenesis', 'http://epigenesis.comicgenesis.com/') add('Epigenesis', 'http://epigenesis.comicgenesis.com/')
add('ErrorLevel3', 'http://errorboy.comicgenesis.com/') add('ErrorLevel3', 'http://errorboy.comicgenesis.com/')
add('EscapemanAdventures', 'http://escapeman.comicgenesis.com/') add('EscapemanAdventures', 'http://escapeman.comicgenesis.com/')
add('Etcetera', 'http://etc.comicgen.com/') add('Etcetera', 'http://etc.comicgenesis.com/')
add('EternalCaffeineJunkie', 'http://ecj.comicgenesis.com/') add('EternalCaffeineJunkie', 'http://ecj.comicgenesis.com/')
add('EternityComplex', 'http://eternitycomplex.comicgenesis.com/') add('EternityComplex', 'http://eternitycomplex.comicgenesis.com/')
add('EvesApple', 'http://evesapple.comicgenesis.com/') add('EvesApple', 'http://evesapple.comicgenesis.com/')
@ -353,17 +358,16 @@ add('FairyTaleNewVillage', 'http://taiwanimation.comicgenesis.com/')
add('FakingSanity', 'http://fakingsanity.comicgenesis.com/') add('FakingSanity', 'http://fakingsanity.comicgenesis.com/')
add('FalseGods', 'http://falsegod.comicgenesis.com/') add('FalseGods', 'http://falsegod.comicgenesis.com/')
add('FancyThat', 'http://fancythat.comicgenesis.com/') add('FancyThat', 'http://fancythat.comicgenesis.com/')
add('FanserviceMeteorologyWin', 'http://aod.comicgen.com/') add('FanserviceMeteorologyWin', 'http://aod.comicgenesis.com/')
add('FantasyQwest', 'http://creatorauthorman.comicgenesis.com/') add('FantasyQwest', 'http://creatorauthorman.comicgenesis.com/')
add('Fantazine', 'http://fantazin.comicgenesis.com/') add('Fantazine', 'http://fantazin.comicgenesis.com/')
add('FarchieArchie', 'http://farchie.comicgenesis.com/') add('FarchieArchie', 'http://farchie.comicgenesis.com/')
add('Farmboy', 'http://farmboy.comicgenesis.com/') add('Farmboy', 'http://farmboy.comicgenesis.com/')
add('Fate27sTear', 'http://firecloud.comicgenesis.com/') add('Fate27sTear', 'http://firecloud.comicgenesis.com/')
add('FaultyLogic', 'http://faultylogic.comicgenesis.com/')
add('FearfulAsymptote', 'http://fearful.comicgenesis.com/') add('FearfulAsymptote', 'http://fearful.comicgenesis.com/')
add('FellowFreaks', 'http://fellowfreaks.comicgenesis.com/') add('FellowFreaks', 'http://fellowfreaks.comicgenesis.com/')
add('Felney', 'http://felneycomic.comicgenesis.com/') add('Felney', 'http://felneycomic.comicgenesis.com/')
add('FemmeFatale', 'http://femmefatale.comicgen.com/') add('FemmeFatale', 'http://femmefatale.comicgenesis.com/')
add('FeverDream', 'http://feverdream.comicgenesis.com/') add('FeverDream', 'http://feverdream.comicgenesis.com/')
add('FiddlyBits', 'http://fiddlybits.comicgenesis.com/') add('FiddlyBits', 'http://fiddlybits.comicgenesis.com/')
add('FightCastorEvade', 'http://fightcastorevade.comicgenesis.com/') add('FightCastorEvade', 'http://fightcastorevade.comicgenesis.com/')
@ -376,7 +380,7 @@ add('FiveMinuteComic', 'http://fiveminute.comicgenesis.com/')
add('Fizzle', 'http://fizzle.comicgenesis.com/') add('Fizzle', 'http://fizzle.comicgenesis.com/')
add('Flatwood', 'http://flatwood.comicgenesis.com/') add('Flatwood', 'http://flatwood.comicgenesis.com/')
add('FletchersCave', 'http://fletcherscave.comicgenesis.com/') add('FletchersCave', 'http://fletcherscave.comicgenesis.com/')
add('FlinchandFriends', 'http://flinch.comicgen.com/') add('FlinchandFriends', 'http://flinch.comicgenesis.com/')
add('FlipandSplog', 'http://fas.comicgenesis.com/') add('FlipandSplog', 'http://fas.comicgenesis.com/')
add('Flounderville', 'http://flounderville.comicgenesis.com/') add('Flounderville', 'http://flounderville.comicgenesis.com/')
add('FloydCartoons', 'http://floydcartoons.comicgenesis.com/') add('FloydCartoons', 'http://floydcartoons.comicgenesis.com/')
@ -436,7 +440,7 @@ add('Gnerds2000', 'http://gnerds.comicgenesis.com/')
add('Gnomes', 'http://gnomes.comicgenesis.com/') add('Gnomes', 'http://gnomes.comicgenesis.com/')
add('GoCrazy', 'http://gocrazy.comicgenesis.com/') add('GoCrazy', 'http://gocrazy.comicgenesis.com/')
add('GoFish', 'http://gofish.comicgenesis.com/') add('GoFish', 'http://gofish.comicgenesis.com/')
add('GoForIt', 'http://goforit.comicgen.com/') add('GoForIt', 'http://goforit.comicgenesis.com/')
add('GodtheDevilandaMonkey', 'http://godthedevilandamonkey.comicgenesis.com/') add('GodtheDevilandaMonkey', 'http://godthedevilandamonkey.comicgenesis.com/')
add('GoldenAge', 'http://goldenage.comicgenesis.com/') add('GoldenAge', 'http://goldenage.comicgenesis.com/')
add('GoneAstray', 'http://goneastray.comicgenesis.com/') add('GoneAstray', 'http://goneastray.comicgenesis.com/')
@ -465,7 +469,7 @@ add('HeadDoctorProductions', 'http://headdoctor.comicgenesis.com/')
add('HealerOnFeatheredWings', 'http://selsachronicles.comicgenesis.comhttp://selsachronicles.comicgenesis.com//') add('HealerOnFeatheredWings', 'http://selsachronicles.comicgenesis.comhttp://selsachronicles.comicgenesis.com//')
add('HeartofaDragon', 'http://heartofadragon.comicgenesis.com/') add('HeartofaDragon', 'http://heartofadragon.comicgenesis.com/')
add('Hedgehogs', 'http://hedgehogs.comicgenesis.com/') add('Hedgehogs', 'http://hedgehogs.comicgenesis.com/')
add('HellSweetHell', 'http://hellsweethell.comicgen.com/') add('HellSweetHell', 'http://hellsweethell.comicgenesis.com/')
add('Hepcats', 'http://hepcats.comicgenesis.com/') add('Hepcats', 'http://hepcats.comicgenesis.com/')
add('HereThereBeDragons', 'http://heretherebedragons.comicgenesis.com/') add('HereThereBeDragons', 'http://heretherebedragons.comicgenesis.com/')
add('HeroAcademy', 'http://heroacademy.comicgenesis.com/') add('HeroAcademy', 'http://heroacademy.comicgenesis.com/')
@ -483,7 +487,7 @@ add('Horndog', 'http://horndog.comicgenesis.com/')
add('HorriblyOldSchoolSuperFightFight', 'http://superfightfight.comicgenesis.com/') add('HorriblyOldSchoolSuperFightFight', 'http://superfightfight.comicgenesis.com/')
add('HorseshoesandHandgrenades', 'http://handgrenades.comicgenesis.com/') add('HorseshoesandHandgrenades', 'http://handgrenades.comicgenesis.com/')
add('HotelGrim', 'http://hotelgrim.comicgenesis.com/') add('HotelGrim', 'http://hotelgrim.comicgenesis.com/')
add('HouseofBob', 'http://dustbunny.comicgen.com/') add('HouseofBob', 'http://dustbunny.comicgenesis.com/')
add('HowISeeIt', 'http://toasterpip.comicgenesis.com/') add('HowISeeIt', 'http://toasterpip.comicgenesis.com/')
add('HowNottoRunAComic', 'http://hownottorunacomic.comicgenesis.com/') add('HowNottoRunAComic', 'http://hownottorunacomic.comicgenesis.com/')
add('HowtoCookaSpasticChicken', 'http://wench.comicgenesis.com/') add('HowtoCookaSpasticChicken', 'http://wench.comicgenesis.com/')
@ -493,7 +497,7 @@ add('IAlwaysWakeUpLazy', 'http://www.alwayslazy.com/')
add('IBlameDanny', 'http://vileterror.comicgenesis.com/') add('IBlameDanny', 'http://vileterror.comicgenesis.com/')
add('IDGet', 'http://idget.comicgenesis.com/') add('IDGet', 'http://idget.comicgenesis.com/')
add('IDIC398TS', 'http://idiots.comicgenesis.com/') add('IDIC398TS', 'http://idiots.comicgenesis.com/')
add('IEatFood', 'http://ieatfood.comicgen.com/') add('IEatFood', 'http://ieatfood.comicgenesis.com/')
add('IdleMinds', 'http://idleminds.comicgenesis.com/') add('IdleMinds', 'http://idleminds.comicgenesis.com/')
add('Ifeeltwitchy', 'http://meghasissues.comicgenesis.com/') add('Ifeeltwitchy', 'http://meghasissues.comicgenesis.com/')
add('Ihopeyoualldie', 'http://ihateyou.comicgenesis.com/') add('Ihopeyoualldie', 'http://ihateyou.comicgenesis.com/')
@ -515,7 +519,7 @@ add('InternationalHopeFoundation', 'http://ihf.comicgenesis.com/')
add('IpsoFacto', 'http://ipsofactocomic.comicgenesis.com/') add('IpsoFacto', 'http://ipsofactocomic.comicgenesis.com/')
add('ItHurtsToBeThatStupid', 'http://ihtbts.comicgenesis.com/') add('ItHurtsToBeThatStupid', 'http://ihtbts.comicgenesis.com/')
add('ItsGravy', 'http://itsgravy.comicgenesis.com/') add('ItsGravy', 'http://itsgravy.comicgenesis.com/')
add('JAndSOddjobs', 'http://oddworld.comicgen.com/') add('JAndSOddjobs', 'http://oddworld.comicgenesis.com/')
add('JBBcomics', 'http://jbbcomics.comicgenesis.com/') add('JBBcomics', 'http://jbbcomics.comicgenesis.com/')
add('JRockShellShock', 'http://jrock.comicgenesis.com/') add('JRockShellShock', 'http://jrock.comicgenesis.com/')
add('JWalkinAndapos', 'http://jwalkin.comicgenesis.com/') add('JWalkinAndapos', 'http://jwalkin.comicgenesis.com/')
@ -539,8 +543,6 @@ add('JourneysDown', 'http://journeys.comicgenesis.com/')
add('Joyride', 'http://www.joyridecomic.com/') add('Joyride', 'http://www.joyridecomic.com/')
add('JulyStreet', 'http://julystreet.comicgenesis.com/') add('JulyStreet', 'http://julystreet.comicgenesis.com/')
add('JustAnotherEscape', 'http://www.justanotherescape.com/') add('JustAnotherEscape', 'http://www.justanotherescape.com/')
add('JustWeird', 'http://justweird.comicgenesis.com/')
add('JuvenileDiversion', 'http://juvenilediversion.comicgenesis.com/')
add('KariandDoug', 'http://karindoug.comicgenesis.com/') add('KariandDoug', 'http://karindoug.comicgenesis.com/')
add('KarmaSlave', 'http://karmaslave.comicgenesis.com/') add('KarmaSlave', 'http://karmaslave.comicgenesis.com/')
add('Kazei5Rebirth', 'http://whiterabbit.comicgenesis.com/') add('Kazei5Rebirth', 'http://whiterabbit.comicgenesis.com/')
@ -558,14 +560,13 @@ add('KitsuneJewel', 'http://kitsunejewel.comicgenesis.com/')
add('KittyCattyGames', 'http://kittycattygames.comicgenesis.com/') add('KittyCattyGames', 'http://kittycattygames.comicgenesis.com/')
add('KiwiDay', 'http://kiwiday.comicgenesis.com/') add('KiwiDay', 'http://kiwiday.comicgenesis.com/')
add('KiwiDayN', 'http://kiwidayn.comicgenesis.com/') add('KiwiDayN', 'http://kiwidayn.comicgenesis.com/')
add('KnightsOfTheNexus', 'http://www.knightsofthenexus.com/')
add('KnightsoftheOldCoding', 'http://kotoc.comicgenesis.com/') add('KnightsoftheOldCoding', 'http://kotoc.comicgenesis.com/')
add('KoFightClub', 'http://www.kofightclub.com/') add('KoFightClub', 'http://www.kofightclub.com/')
add('KodomoNomo', 'http://kodomonomo.comicgenesis.com/') add('KodomoNomo', 'http://kodomonomo.comicgenesis.com/')
add('Kokiro', 'http://kokiro.comicgenesis.com/') add('Kokiro', 'http://kokiro.comicgenesis.com/')
add('KungFounded', 'http://kungfounded.comicgenesis.com/') add('KungFounded', 'http://kungfounded.comicgenesis.com/')
add('KungFuPandas', 'http://kungfupandas.comicgenesis.com/') add('KungFuPandas', 'http://kungfupandas.comicgenesis.com/')
add('KurenaiMashin', 'http://km.comicgen.com/') add('KurenaiMashin', 'http://km.comicgenesis.com/')
add('LCDLowestCommonDenominator', 'http://lcd.comicgenesis.com/') add('LCDLowestCommonDenominator', 'http://lcd.comicgenesis.com/')
add('LXFTheLeagueofExtraordinaryFurries', 'http://lxfurries.comicgenesis.com/') add('LXFTheLeagueofExtraordinaryFurries', 'http://lxfurries.comicgenesis.com/')
add('LabBratz', 'http://labbratz.comicgenesis.com/') add('LabBratz', 'http://labbratz.comicgenesis.com/')
@ -577,7 +578,7 @@ add('LarryandOliver', 'http://lao.comicgenesis.com/')
add('Laserwing', 'http://laserwing.comicgenesis.com/') add('Laserwing', 'http://laserwing.comicgenesis.com/')
add('LatentIntent', 'http://latentintent.comicgenesis.com/') add('LatentIntent', 'http://latentintent.comicgenesis.com/')
add('LeanOnMe', 'http://jadaze.comicgenesis.com/') add('LeanOnMe', 'http://jadaze.comicgenesis.com/')
add('LegendOfTheFour', 'http://legendoffour.comicgen.com/') add('LegendOfTheFour', 'http://legendoffour.comicgenesis.com/')
add('LegendaryMagicalAngelPrincessCeleste', 'http://celeste.comicgenesis.com/') add('LegendaryMagicalAngelPrincessCeleste', 'http://celeste.comicgenesis.com/')
add('LegendoftheGalaxyWar', 'http://galaxylegend.comicgenesis.com/') add('LegendoftheGalaxyWar', 'http://galaxylegend.comicgenesis.com/')
add('LegendsofRovana', 'http://rovana.comicgenesis.com/') add('LegendsofRovana', 'http://rovana.comicgenesis.com/')
@ -587,9 +588,9 @@ add('LeuandYar', 'http://leunam12.comicgenesis.com/')
add('Life27saWitch', 'http://lifesawitch.comicgenesis.com/') add('Life27saWitch', 'http://lifesawitch.comicgenesis.com/')
add('LifeGoesOn', 'http://lgo.comicgenesis.com/') add('LifeGoesOn', 'http://lgo.comicgenesis.com/')
add('LifeatBayside', 'http://bayside.comicgenesis.com/') add('LifeatBayside', 'http://bayside.comicgenesis.com/')
add('LifeinBellCounty', 'http://bellcountylife.comicgen.com/') add('LifeinBellCounty', 'http://bellcountylife.comicgenesis.com/')
add('LifeinaNutshell', 'http://hiroslife.comicgenesis.com/') add('LifeinaNutshell', 'http://hiroslife.comicgenesis.com/')
add('LifeisUnfair', 'http://lifeisunfair.comicgen.com/') add('LifeisUnfair', 'http://lifeisunfair.comicgenesis.com/')
add('LifeofBuddha', 'http://lifeofbuddha.comicgenesis.com/') add('LifeofBuddha', 'http://lifeofbuddha.comicgenesis.com/')
add('LifeonForbez', 'http://cdc.comicgenesis.com/') add('LifeonForbez', 'http://cdc.comicgenesis.com/')
add('Lifesuchasitis', 'http://lifesuchasitis.comicgenesis.com/') add('Lifesuchasitis', 'http://lifesuchasitis.comicgenesis.com/')
@ -609,7 +610,7 @@ add('Loserz', 'http://loserzcomic.comicgenesis.com/')
add('LostinTransit', 'http://lostintransit.comicgenesis.com/') add('LostinTransit', 'http://lostintransit.comicgenesis.com/')
add('LostinTranslation', 'http://lit.comicgenesis.com/') add('LostinTranslation', 'http://lit.comicgenesis.com/')
add('LoveBites', 'http://lovebites.comicgenesis.com/') add('LoveBites', 'http://lovebites.comicgenesis.com/')
add('LoveMeNot', 'http://lovemenot.comicgen.com/') add('LoveMeNot', 'http://lovemenot.comicgenesis.com/')
add('LowerPlace', 'http://lowerplace.comicgenesis.com/') add('LowerPlace', 'http://lowerplace.comicgenesis.com/')
add('LoxieAndZoot', 'http://loxieandzoot.comicgenesis.com/') add('LoxieAndZoot', 'http://loxieandzoot.comicgenesis.com/')
add('Lumia27sKingdom', 'http://lumia.comicgenesis.com/') add('Lumia27sKingdom', 'http://lumia.comicgenesis.com/')
@ -644,9 +645,8 @@ add('MegaCool', 'http://megacool.comicgenesis.com/')
add('Meiosis', 'http://meiosis.comicgenesis.com/') add('Meiosis', 'http://meiosis.comicgenesis.com/')
add('MelEverymanAndHisSarcasticTalkingHousepetAmbrose', 'http://everyman.comicgenesis.com/') add('MelEverymanAndHisSarcasticTalkingHousepetAmbrose', 'http://everyman.comicgenesis.com/')
add('MenschunsererZeitGerman', 'http://muz.comicgenesis.com/') add('MenschunsererZeitGerman', 'http://muz.comicgenesis.com/')
add('Michikomonogatari', 'http://isukiyomi.comicgenesis.com/')
add('Midcentral', 'http://midcentral.comicgenesis.com/') add('Midcentral', 'http://midcentral.comicgenesis.com/')
add('MidnorthFlourCo', 'http://mnflourco.comicgen.com/') add('MidnorthFlourCo', 'http://mnflourco.comicgenesis.com/')
add('MiketheMulletThing', 'http://mikethemulletthing.comicgenesis.com/') add('MiketheMulletThing', 'http://mikethemulletthing.comicgenesis.com/')
add('Mindmistress', 'http://mindmistress.comicgenesis.com/') add('Mindmistress', 'http://mindmistress.comicgenesis.com/')
add('Mindtap', 'http://mindtap.comicgenesis.com/') add('Mindtap', 'http://mindtap.comicgenesis.com/')
@ -656,7 +656,6 @@ add('MintCondition', 'http://mintcondition.comicgenesis.com/')
add('MisadventuresinPhysics', 'http://mip.comicgenesis.com/') add('MisadventuresinPhysics', 'http://mip.comicgenesis.com/')
add('MisadventuresoftheDrowWizard', 'http://motdw.comicgenesis.com/') add('MisadventuresoftheDrowWizard', 'http://motdw.comicgenesis.com/')
add('MixedMyth', 'http://mixedmyth.comicgenesis.com/') add('MixedMyth', 'http://mixedmyth.comicgenesis.com/')
add('MobileMadness', 'http://mobilemadness.comicgenesis.com/')
add('ModelStudent', 'http://darkmaxtor.comicgenesis.com/') add('ModelStudent', 'http://darkmaxtor.comicgenesis.com/')
add('MolluskAntics', 'http://molluskantics.comicgenesis.com/') add('MolluskAntics', 'http://molluskantics.comicgenesis.com/')
add('MoonCrest24', 'http://mooncrest.comicgenesis.com/') add('MoonCrest24', 'http://mooncrest.comicgenesis.com/')
@ -677,17 +676,17 @@ add('MyAngelYouAreAngel', 'http://angel.comicgenesis.com/')
add('MyBrainHurts', 'http://mybrainhurts.comicgenesis.com/') add('MyBrainHurts', 'http://mybrainhurts.comicgenesis.com/')
add('MyLifeinBlue', 'http://mylifeinblue.comicgenesis.com/') add('MyLifeinBlue', 'http://mylifeinblue.comicgenesis.com/')
add('MysteryCastle', 'http://mysterycastle.comicgenesis.com/') add('MysteryCastle', 'http://mysterycastle.comicgenesis.com/')
add('MysticRevolution', 'http://mysticrevolution.comicgen.com/') add('MysticRevolution', 'http://mysticrevolution.comicgenesis.com/')
add('MythocorpIntl', 'http://mythocorp.comicgenesis.com/') add('MythocorpIntl', 'http://mythocorp.comicgenesis.com/')
add('NAFTANorthAmericanFreeToonAgreementalsoYankuckcanee', 'http://nafta.comicgenesis.com/') add('NAFTANorthAmericanFreeToonAgreementalsoYankuckcanee', 'http://nafta.comicgenesis.com/')
add('NKatz', 'http://nkatz.comicgenesis.com/') add('NKatz', 'http://nkatz.comicgenesis.com/')
add('NahastLandsofStrife', 'http://nahast.comicgenesis.com/') add('NahastLandsofStrife', 'http://nahast.comicgenesis.com/')
add('NardManga', 'http://nardmanga.comicgenesis.com/') add('NardManga', 'http://nardmanga.comicgenesis.com/')
add('NastyChocolates', 'http://nastychocolates.comicgenesis.com/') add('NastyChocolates', 'http://nastychocolates.comicgenesis.com/')
add('NeTrek', 'http://netrek.comicgen.com/') add('NeTrek', 'http://netrek.comicgenesis.com/')
add('NeedleandThread', 'http://needleandthread.comicgenesis.com/') add('NeedleandThread', 'http://needleandthread.comicgenesis.com/')
add('NeglectedMarioCharacterComix', 'http://nccomix.comicgenesis.com/') add('NeglectedMarioCharacterComix', 'http://nccomix.comicgenesis.com/')
add('NekkoandJoruba', 'http://nekkoandjoruba.comicgen.com/') add('NekkoandJoruba', 'http://nekkoandjoruba.comicgenesis.com/')
add('NekoTheKitty', 'http://nekothekitty.comicgenesis.com/') add('NekoTheKitty', 'http://nekothekitty.comicgenesis.com/')
add('Nekotime', 'http://nekotime.comicgenesis.com/') add('Nekotime', 'http://nekotime.comicgenesis.com/')
add('Nemutionjewel', 'http://nemution.comicgenesis.com/') add('Nemutionjewel', 'http://nemution.comicgenesis.com/')
@ -706,10 +705,10 @@ add('NightShiftWEBComix', 'http://webcomix.comicgenesis.com/')
add('NighthawkDayhawk', 'http://nighthawkdayhawk.comicgenesis.com/') add('NighthawkDayhawk', 'http://nighthawkdayhawk.comicgenesis.com/')
add('NightwolfCentral', 'http://nightwolfcentral.comicgenesis.com/') add('NightwolfCentral', 'http://nightwolfcentral.comicgenesis.com/')
add('No4thWalltoBreak', 'http://no4thwalltobreak.comicgenesis.com/') add('No4thWalltoBreak', 'http://no4thwalltobreak.comicgenesis.com/')
add('NoCrap', 'http://nocrap.comicgen.com/') add('NoCrap', 'http://nocrap.comicgenesis.com/')
add('NoNeedForBushido', 'http://noneedforbushido.comicgenesis.com/') add('NoNeedForBushido', 'http://noneedforbushido.comicgenesis.com/')
add('NoTimeForLife', 'http://randyraven.comicgenesis.com/') add('NoTimeForLife', 'http://randyraven.comicgenesis.com/')
add('NobtheBlob', 'http://nobtheblob.comicgen.com/') add('NobtheBlob', 'http://nobtheblob.comicgenesis.com/')
add('NoneMoreComic', 'http://nonemore.comicgenesis.com/') add('NoneMoreComic', 'http://nonemore.comicgenesis.com/')
add('NosesOptional', 'http://nosesoptional.comicgenesis.com/') add('NosesOptional', 'http://nosesoptional.comicgenesis.com/')
add('NothingLikeSanity', 'http://nothinglikesanity.comicgenesis.com/') add('NothingLikeSanity', 'http://nothinglikesanity.comicgenesis.com/')
@ -720,7 +719,7 @@ add('NymphsoftheWest', 'http://hesperides.comicgenesis.com/')
add('ODARKCITY', 'http://odark.comicgenesis.com/') add('ODARKCITY', 'http://odark.comicgenesis.com/')
add('ODCKS', 'http://odcks.comicgenesis.com/') add('ODCKS', 'http://odcks.comicgenesis.com/')
add('ORBVS', 'http://orbvs.comicgenesis.com/') add('ORBVS', 'http://orbvs.comicgenesis.com/')
add('Oddities', 'http://oddities.comicgen.com/') add('Oddities', 'http://oddities.comicgenesis.com/')
add('OfDoom', 'http://ofdoom.comicgenesis.com/') add('OfDoom', 'http://ofdoom.comicgenesis.com/')
add('OfSomethingandNothinginParticular', 'http://osanip.comicgenesis.com/') add('OfSomethingandNothinginParticular', 'http://osanip.comicgenesis.com/')
add('OffTheWall', 'http://offthewall.comicgenesis.com/') add('OffTheWall', 'http://offthewall.comicgenesis.com/')
@ -748,9 +747,9 @@ add('PET', 'http://petcomic.comicgenesis.com/')
add('PPMBnGRF', 'http://ppmbngrf.comicgenesis.com/') add('PPMBnGRF', 'http://ppmbngrf.comicgenesis.com/')
add('PSIAPessimisticSenseofInadequacy', 'http://fesworks.comicgenesis.com/') add('PSIAPessimisticSenseofInadequacy', 'http://fesworks.comicgenesis.com/')
add('PacoStand', 'http://paco.comicgenesis.com/') add('PacoStand', 'http://paco.comicgenesis.com/')
add('PaladinsAndaposHaven', 'http://paladin.comicgen.com/') add('PaladinsAndaposHaven', 'http://paladin.comicgenesis.com/')
add('PandP', 'http://pandpcomic.comicgenesis.com/') add('PandP', 'http://pandpcomic.comicgenesis.com/')
add('Pandala', 'http://pandala.comicgen.com/') add('Pandala', 'http://pandala.comicgenesis.com/')
add('Pander', 'http://pander.comicgenesis.com/') add('Pander', 'http://pander.comicgenesis.com/')
add('Pandimaniacs', 'http://pandimaniacs.comicgenesis.com/') add('Pandimaniacs', 'http://pandimaniacs.comicgenesis.com/')
add('PanelsTheExperimentation', 'http://panels.comicgenesis.com/') add('PanelsTheExperimentation', 'http://panels.comicgenesis.com/')
@ -770,7 +769,7 @@ add('PhilAndBob', 'http://drjon.comicgenesis.com/')
add('PhillerSpace', 'http://phillerspace.comicgenesis.com/') add('PhillerSpace', 'http://phillerspace.comicgenesis.com/')
add('PhillikesTacos', 'http://philtaco.comicgenesis.com/') add('PhillikesTacos', 'http://philtaco.comicgenesis.com/')
add('PhilosophyBites', 'http://phbites.comicgenesis.com/') add('PhilosophyBites', 'http://phbites.comicgenesis.com/')
add('PhilosophyMonkey', 'http://philosophymonkey.comicgen.com/') add('PhilosophyMonkey', 'http://philosophymonkey.comicgenesis.com/')
add('Phoenix', 'http://phoenix1.comicgenesis.com/') add('Phoenix', 'http://phoenix1.comicgenesis.com/')
add('PicpakDog', 'http://picpak.comicgenesis.com/') add('PicpakDog', 'http://picpak.comicgenesis.com/')
add('PictureDiary', 'http://picturediary.comicgenesis.com/') add('PictureDiary', 'http://picturediary.comicgenesis.com/')
@ -804,7 +803,7 @@ add('PublicidadeEnganosa', 'http://publicidadeenganosa.comicgenesis.com/')
add('Puppetry', 'http://wordsandpictures.comicgenesis.com/') add('Puppetry', 'http://wordsandpictures.comicgenesis.com/')
add('PurpleDuckMambo', 'http://purpleduckmambo.comicgenesis.com/') add('PurpleDuckMambo', 'http://purpleduckmambo.comicgenesis.com/')
add('QueensOfRandomness', 'http://marshmallow.comicgenesis.com/') add('QueensOfRandomness', 'http://marshmallow.comicgenesis.com/')
add('QuestionableQuestersandShadowsofFate', 'http://qqandsof.comicgen.com/') add('QuestionableQuestersandShadowsofFate', 'http://qqandsof.comicgenesis.com/')
add('QuestionableTales', 'http://questionabletales.comicgenesis.com/') add('QuestionableTales', 'http://questionabletales.comicgenesis.com/')
add('Quickbiteme', 'http://quickbiteme.comicgenesis.com/') add('Quickbiteme', 'http://quickbiteme.comicgenesis.com/')
add('Quuren', 'http://quuren.comicgenesis.com/') add('Quuren', 'http://quuren.comicgenesis.com/')
@ -823,12 +822,12 @@ add('Reclamation', 'http://reclamation.comicgenesis.com/')
add('RedLexi', 'http://redlexi.comicgenesis.com/') add('RedLexi', 'http://redlexi.comicgenesis.com/')
add('Remsi', 'http://remsi.comicgenesis.com/') add('Remsi', 'http://remsi.comicgenesis.com/')
add('ReploidFriends', 'http://reploidfriends.comicgenesis.com/') add('ReploidFriends', 'http://reploidfriends.comicgenesis.com/')
add('Requiem', 'http://erech.comicgen.com/') add('Requiem', 'http://erech.comicgenesis.com/')
add('Reset', 'http://reset.comicgenesis.com/') add('Reset', 'http://reset.comicgenesis.com/')
add('ResistanceLine', 'http://resistanceline.comicgen.com/') add('ResistanceLine', 'http://resistanceline.comicgenesis.com/')
add('Restaurant', 'http://restaurant.comicgenesis.com/') add('Restaurant', 'http://restaurant.comicgenesis.com/')
add('RetailWeekly', 'http://retail.comicgenesis.com/') add('RetailWeekly', 'http://retail.comicgenesis.com/')
add('ReturntoDonnelly', 'http://returntodonnelly.comicgen.com/') add('ReturntoDonnelly', 'http://returntodonnelly.comicgenesis.com/')
add('ReturntoEden', 'http://returntoeden.comicgenesis.com/') add('ReturntoEden', 'http://returntoeden.comicgenesis.com/')
add('ReverendRanda', 'http://reverendranda.comicgenesis.com/') add('ReverendRanda', 'http://reverendranda.comicgenesis.com/')
add('Riboflavin', 'http://riboflavin.comicgenesis.com/') add('Riboflavin', 'http://riboflavin.comicgenesis.com/')
@ -839,7 +838,6 @@ add('RiverCityHigh', 'http://rivercityhigh.comicgenesis.com/')
add('RoadfromNowhere', 'http://nowhere.comicgenesis.com/') add('RoadfromNowhere', 'http://nowhere.comicgenesis.com/')
add('RoboFlan', 'http://lewiscode.comicgenesis.com/') add('RoboFlan', 'http://lewiscode.comicgenesis.com/')
add('RobotandBoy', 'http://faeta.comicgenesis.com/') add('RobotandBoy', 'http://faeta.comicgenesis.com/')
add('RogerAndDominic', 'http://roganddom.comicgenesis.com/')
add('RoguesofClwydRhan', 'http://rocr.comicgenesis.com/') add('RoguesofClwydRhan', 'http://rocr.comicgenesis.com/')
add('RoleoftheDie', 'http://www.roleofthedie.com/') add('RoleoftheDie', 'http://www.roleofthedie.com/')
add('RonnieRaccoon', 'http://www.ronnieraccoon.com/') add('RonnieRaccoon', 'http://www.ronnieraccoon.com/')
@ -851,11 +849,11 @@ add('RulesofMakeBelieve', 'http://ju-lian.comicgenesis.com/')
add('RuneMaster', 'http://runemaster.comicgenesis.com/') add('RuneMaster', 'http://runemaster.comicgenesis.com/')
add('Rveillerie', 'http://hootoo.comicgenesis.com/') add('Rveillerie', 'http://hootoo.comicgenesis.com/')
add('SLAGIT', 'http://slagit.comicgenesis.com/') add('SLAGIT', 'http://slagit.comicgenesis.com/')
add('SLAYERSREWIND', 'http://wyldcherry.comicgen.com/') add('SLAYERSREWIND', 'http://wyldcherry.comicgenesis.com/')
add('SMACK', 'http://smack.comicgenesis.com/') add('SMACK', 'http://smack.comicgenesis.com/')
add('SPQRBlues', 'http://spqrblues.comicgenesis.com/') add('SPQRBlues', 'http://spqrblues.comicgenesis.com/')
add('SSComix', 'http://sscomix.comicgenesis.com/') add('SSComix', 'http://sscomix.comicgenesis.com/')
add('STFU', 'http://stfu.comicgen.com/') add('STFU', 'http://stfu.comicgenesis.com/')
add('SaintPeter27sCross', 'http://saintpeterscross.comicgenesis.com/') add('SaintPeter27sCross', 'http://saintpeterscross.comicgenesis.com/')
add('SalemUncommons', 'http://salemuncommons.comicgenesis.com/') add('SalemUncommons', 'http://salemuncommons.comicgenesis.com/')
add('SamandElisAdventures', 'http://sameliadv.comicgenesis.com/') add('SamandElisAdventures', 'http://sameliadv.comicgenesis.com/')
@ -865,7 +863,6 @@ add('SarahZero', 'http://plughead.comicgenesis.com/')
add('SaturdayMorningBreakfastCereal', 'http://smbc.comicgenesis.com/') add('SaturdayMorningBreakfastCereal', 'http://smbc.comicgenesis.com/')
add('Saturnalia', 'http://saturnalia.keenspace.com/') add('Saturnalia', 'http://saturnalia.keenspace.com/')
add('SavageIslands', 'http://poobert.comicgenesis.com/') add('SavageIslands', 'http://poobert.comicgenesis.com/')
add('SaveMeGebus', 'http://savemegebus.comicgenesis.com/')
add('Sawdust', 'http://sawdust.comicgenesis.com/') add('Sawdust', 'http://sawdust.comicgenesis.com/')
add('ScandalSheet', 'http://scandalsheet.comicgenesis.com/') add('ScandalSheet', 'http://scandalsheet.comicgenesis.com/')
add('Scatterplot', 'http://scatterplot.comicgenesis.com/') add('Scatterplot', 'http://scatterplot.comicgenesis.com/')
@ -888,8 +885,8 @@ add('Senioritis', 'http://senioritis.comicgenesis.com/')
add('ShadowPlanet', 'http://shadowplanet.comicgenesis.com/') add('ShadowPlanet', 'http://shadowplanet.comicgenesis.com/')
add('ShadowedLight', 'http://shadowedlight.comicgenesis.com/') add('ShadowedLight', 'http://shadowedlight.comicgenesis.com/')
add('Shapes', 'http://shapes.comicgenesis.com/') add('Shapes', 'http://shapes.comicgenesis.com/')
add('Shifters', 'http://shifters.comicgen.com/') add('Shifters', 'http://shifters.comicgenesis.com/')
add('ShineGetDumplingsGoGoTower', 'http://shinegotower.comicgen.com/') add('ShineGetDumplingsGoGoTower', 'http://shinegotower.comicgenesis.com/')
add('Shinkutokimekisempukaku', 'http://yamcha.comicgenesis.com/') add('Shinkutokimekisempukaku', 'http://yamcha.comicgenesis.com/')
add('ShinobiHigh', 'http://shinobihigh.comicgenesis.com/') add('ShinobiHigh', 'http://shinobihigh.comicgenesis.com/')
add('ShivaeStudios', 'http://shivae.comicgenesis.com/') add('ShivaeStudios', 'http://shivae.comicgenesis.com/')
@ -904,7 +901,7 @@ add('SimonsWorld', 'http://simonsworld.comicgenesis.com/')
add('SinPerspectiva', 'http://mysp.comicgenesis.com/') add('SinPerspectiva', 'http://mysp.comicgenesis.com/')
add('SinisterBedfellows', 'http://mckenzee.comicgenesis.com/') add('SinisterBedfellows', 'http://mckenzee.comicgenesis.com/')
add('SinkorDrown', 'http://sinkordrown.comicgenesis.com/') add('SinkorDrown', 'http://sinkordrown.comicgenesis.com/')
add('SinsAgainstNature', 'http://sane.comicgen.com/') add('SinsAgainstNature', 'http://sane.comicgenesis.com/')
add('SippansSerie', 'http://sippan.comicgenesis.com/') add('SippansSerie', 'http://sippan.comicgenesis.com/')
add('SitandSpin', 'http://sitandspin.comicgenesis.com/') add('SitandSpin', 'http://sitandspin.comicgenesis.com/')
add('SixByNineCollege', 'http://sixbyninecollege.comicgenesis.com/') add('SixByNineCollege', 'http://sixbyninecollege.comicgenesis.com/')
@ -961,7 +958,7 @@ add('Stubble', 'http://stubble.comicgenesis.com/')
add('StuffofLegends', 'http://stuffoflegends.comicgenesis.com/') add('StuffofLegends', 'http://stuffoflegends.comicgenesis.com/')
add('StupidComics', 'http://stupidcomics.comicgenesis.com/') add('StupidComics', 'http://stupidcomics.comicgenesis.com/')
add('SubjectToChange', 'http://subjecttochange.comicgenesis.com/') add('SubjectToChange', 'http://subjecttochange.comicgenesis.com/')
add('Sublunary', 'http://sublunary.comicgen.com/') add('Sublunary', 'http://sublunary.comicgenesis.com/')
add('SueC3B1osdelSur', 'http://sds.comicgenesis.com/') add('SueC3B1osdelSur', 'http://sds.comicgenesis.com/')
add('SuicideForHire', 'http://suicideforhire.comicgenesis.com/') add('SuicideForHire', 'http://suicideforhire.comicgenesis.com/')
add('Summoners', 'http://summoners.comicgenesis.com/') add('Summoners', 'http://summoners.comicgenesis.com/')
@ -1000,7 +997,7 @@ add('TheAcademy', 'http://theacademy.comicgenesis.com/')
add('TheAdventuresofCaptainMooki', 'http://cmooki.comicgenesis.com/') add('TheAdventuresofCaptainMooki', 'http://cmooki.comicgenesis.com/')
add('TheAdventuresofGralax', 'http://gralax.comicgenesis.com/') add('TheAdventuresofGralax', 'http://gralax.comicgenesis.com/')
add('TheAdventuresofKaniraBaxter', 'http://kanirabaxter.comicgenesis.com/') add('TheAdventuresofKaniraBaxter', 'http://kanirabaxter.comicgenesis.com/')
add('TheAdventuresofLi27lDenverPastrami', 'http://lildenverpastrami.comicgen.com/') add('TheAdventuresofLi27lDenverPastrami', 'http://lildenverpastrami.comicgenesis.com/')
add('TheAdventuresofPeppyThePipingPirate', 'http://akira.comicgenesis.com/') add('TheAdventuresofPeppyThePipingPirate', 'http://akira.comicgenesis.com/')
add('TheAdventuresofPopsicleman', 'http://popsicleman.comicgenesis.com/') add('TheAdventuresofPopsicleman', 'http://popsicleman.comicgenesis.com/')
add('TheAdventuresofSpaceDevil', 'http://spacedevil.comicgenesis.com/') add('TheAdventuresofSpaceDevil', 'http://spacedevil.comicgenesis.com/')
@ -1010,7 +1007,6 @@ add('TheAdventuresofVindibuddSuperheroInTraining', 'http://vindibudd.comicgenesi
add('TheAdventuresofWharsMeBrainDude', 'http://jamellan.comicgenesis.com/') add('TheAdventuresofWharsMeBrainDude', 'http://jamellan.comicgenesis.com/')
add('TheAmoeba', 'http://www.theamoebaonline.co.uk/') add('TheAmoeba', 'http://www.theamoebaonline.co.uk/')
add('TheAnarchist', 'http://theanarchist.comicgenesis.com/') add('TheAnarchist', 'http://theanarchist.comicgenesis.com/')
add('TheAvatar', 'http://theavatar.comicgenesis.com/')
add('TheBessEffectGerman', 'http://tbe.comicgenesis.com/') add('TheBessEffectGerman', 'http://tbe.comicgenesis.com/')
add('TheBestandtheBrightest', 'http://www.flyovercountry.net/') add('TheBestandtheBrightest', 'http://www.flyovercountry.net/')
add('TheBigheads', 'http://thebigheads.comicgenesis.com/') add('TheBigheads', 'http://thebigheads.comicgenesis.com/')
@ -1040,7 +1036,7 @@ add('TheFreneticAdventuresofFredBarlowe', 'http://fredbarlowe.comicgenesis.com/'
add('TheGeekWay', 'http://geekway.comicgenesis.com/') add('TheGeekWay', 'http://geekway.comicgenesis.com/')
add('TheGodlyandtheDamned', 'http://gandd.comicgenesis.com/') add('TheGodlyandtheDamned', 'http://gandd.comicgenesis.com/')
add('TheGods27Pack', 'http://godspack.comicgenesis.com/') add('TheGods27Pack', 'http://godspack.comicgenesis.com/')
add('TheGreatTree', 'http://tgt.comicgen.com/') add('TheGreatTree', 'http://tgt.comicgenesis.com/')
add('TheGreenAvenger', 'http://www.green-avenger.com/') add('TheGreenAvenger', 'http://www.green-avenger.com/')
add('TheGrimbles', 'http://grimbles.comicgenesis.com/') add('TheGrimbles', 'http://grimbles.comicgenesis.com/')
add('TheHappyPenis', 'http://happypenis.comicgenesis.com/') add('TheHappyPenis', 'http://happypenis.comicgenesis.com/')
@ -1082,10 +1078,10 @@ add('ThePrimeofAmbition', 'http://jaadrih.comicgenesis.com/')
add('TheProfessor', 'http://xuanwu.comicgenesis.com/') add('TheProfessor', 'http://xuanwu.comicgenesis.com/')
add('TheRobmanShow', 'http://therobmanshow.comicgenesis.com/') add('TheRobmanShow', 'http://therobmanshow.comicgenesis.com/')
add('TheSagaofGagerff2', 'http://gager.comicgenesis.com/') add('TheSagaofGagerff2', 'http://gager.comicgenesis.com/')
add('TheSailorNeopetsRPG', 'http://snrpg.comicgen.com/') add('TheSailorNeopetsRPG', 'http://snrpg.comicgenesis.com/')
add('TheShortEnd', 'http://theshortend.comicgenesis.com/') add('TheShortEnd', 'http://theshortend.comicgenesis.com/')
add('TheSiteMap', 'http://sitemap.comicgenesis.com/') add('TheSiteMap', 'http://sitemap.comicgenesis.com/')
add('TheSomethingSomethingofSomethingSomethingness', 'http://somethingstrange.comicgen.com/') add('TheSomethingSomethingofSomethingSomethingness', 'http://somethingstrange.comicgenesis.com/')
add('TheStickFigureDragons', 'http://feychild.comicgenesis.com/') add('TheStickFigureDragons', 'http://feychild.comicgenesis.com/')
add('TheStraightJacketFreedomForce', 'http://tsjff.comicgenesis.com/') add('TheStraightJacketFreedomForce', 'http://tsjff.comicgenesis.com/')
add('TheSuperPeoples', 'http://superpeoples.comicgenesis.com/') add('TheSuperPeoples', 'http://superpeoples.comicgenesis.com/')
@ -1095,7 +1091,7 @@ add('TheVolet', 'http://volet.comicgenesis.com/')
add('TheWarofWinds', 'http://warofwinds.comicgenesis.com/') add('TheWarofWinds', 'http://warofwinds.comicgenesis.com/')
add('TheWayoftheWorld', 'http://wayworld.comicgenesis.com/') add('TheWayoftheWorld', 'http://wayworld.comicgenesis.com/')
add('TheWhole9Yards', 'http://nineyards.comicgenesis.com/') add('TheWhole9Yards', 'http://nineyards.comicgenesis.com/')
add('TheWingsOfChange', 'http://wingsofchange.comicgen.com/') add('TheWingsOfChange', 'http://wingsofchange.comicgenesis.com/')
add('TheWoodenLeg', 'http://thewoodenleg.comicgenesis.com/') add('TheWoodenLeg', 'http://thewoodenleg.comicgenesis.com/')
add('TheWorldofUh', 'http://seganut82.comicgenesis.com/') add('TheWorldofUh', 'http://seganut82.comicgenesis.com/')
add('TheWotch', 'http://thewotch.comicgenesis.com/') add('TheWotch', 'http://thewotch.comicgenesis.com/')
@ -1133,8 +1129,8 @@ add('TrialsintheLight', 'http://trials.comicgenesis.com/')
add('TripleTrouble', 'http://tripletrouble.comicgenesis.com/') add('TripleTrouble', 'http://tripletrouble.comicgenesis.com/')
add('TriumphantLosers', 'http://triumphantlosers.comicgenesis.com/') add('TriumphantLosers', 'http://triumphantlosers.comicgenesis.com/')
add('TrueBums', 'http://truebums.comicgenesis.com/') add('TrueBums', 'http://truebums.comicgenesis.com/')
add('TurboNinjaBastard', 'http://tnb.comicgen.com/') add('TurboNinjaBastard', 'http://tnb.comicgenesis.com/')
add('TurboTrak', 'http://turbotrak.comicgen.com/') add('TurboTrak', 'http://turbotrak.comicgenesis.com/')
add('Turing27sFollyIITheAdventuresOfPhil', 'http://proteancomics.comicgenesis.com/') add('Turing27sFollyIITheAdventuresOfPhil', 'http://proteancomics.comicgenesis.com/')
add('Tutelar', 'http://coffeystreet.comicgenesis.com/') add('Tutelar', 'http://coffeystreet.comicgenesis.com/')
add('TwiceDestined', 'http://twicedestined.comicgenesis.com/') add('TwiceDestined', 'http://twicedestined.comicgenesis.com/')
@ -1167,13 +1163,13 @@ add('VictimsoftheSystem', 'http://victims.comicgenesis.com/')
add('Victor', 'http://victor.comicgenesis.com/') add('Victor', 'http://victor.comicgenesis.com/')
add('VictorianTimes', 'http://victorian.comicgenesis.com/') add('VictorianTimes', 'http://victorian.comicgenesis.com/')
add('VideoGameAddicts', 'http://vgaddicts.comicgenesis.com/') add('VideoGameAddicts', 'http://vgaddicts.comicgenesis.com/')
add('WARPZONEthinkwithinthecube', 'http://warpzonecube.comicgen.com/') add('WARPZONEthinkwithinthecube', 'http://warpzonecube.comicgenesis.com/')
add('WORLDDICTATORComicsPresentsWhenImWorldDictator', 'http://worlddictator.comicgenesis.com/') add('WORLDDICTATORComicsPresentsWhenImWorldDictator', 'http://worlddictator.comicgenesis.com/')
add('WadeintheDeepEnd', 'http://wade.comicgenesis.com/') add('WadeintheDeepEnd', 'http://wade.comicgenesis.com/')
add('WakeUpScreaming', 'http://wakeupscreaming.comicgenesis.com/') add('WakeUpScreaming', 'http://wakeupscreaming.comicgenesis.com/')
add('WakingtheHouseofRaeux', 'http://viistar.comicgenesis.com/') add('WakingtheHouseofRaeux', 'http://viistar.comicgenesis.com/')
add('WarMageNC17', 'http://warmage.comicgenesis.com/') add('WarMageNC17', 'http://warmage.comicgenesis.com/')
add('WarningBucketsOfBlood', 'http://chaoticcomics.comicgen.com/') add('WarningBucketsOfBlood', 'http://chaoticcomics.comicgenesis.com/')
add('WayoftheDodo', 'http://dodocomic.comicgenesis.com/') add('WayoftheDodo', 'http://dodocomic.comicgenesis.com/')
add('WebcomicTheWebcomicWebcomicWebcomicWebcomic', 'http://dannormnsanidey.comicgenesis.com/') add('WebcomicTheWebcomicWebcomicWebcomicWebcomic', 'http://dannormnsanidey.comicgenesis.com/')
add('Wedontgetiteither', 'http://wdgie.comicgenesis.com/') add('Wedontgetiteither', 'http://wdgie.comicgenesis.com/')
@ -1202,7 +1198,7 @@ add('WillyMorgan', 'http://willymorgan.comicgenesis.com/')
add('Wingmen', 'http://wingmen.comicgenesis.com/') add('Wingmen', 'http://wingmen.comicgenesis.com/')
add('WishInOneHand', 'http://wishin1hand.comicgenesis.com/') add('WishInOneHand', 'http://wishin1hand.comicgenesis.com/')
add('Witchprickers', 'http://buxompiratewench.comicgenesis.com/') add('Witchprickers', 'http://buxompiratewench.comicgenesis.com/')
add('Witticisma', 'http://witticisma.comicgen.com/') add('Witticisma', 'http://witticisma.comicgenesis.com/')
add('WizardAndWarrior', 'http://wizardandwarrior.comicgenesis.com/') add('WizardAndWarrior', 'http://wizardandwarrior.comicgenesis.com/')
add('Wizztards', 'http://wizztards.comicgenesis.com/') add('Wizztards', 'http://wizztards.comicgenesis.com/')
add('WonTonHammer', 'http://wonton.comicgenesis.com/') add('WonTonHammer', 'http://wonton.comicgenesis.com/')
@ -1213,8 +1209,8 @@ add('WrathofHeaven', 'http://wrath.comicgenesis.com/')
add('XartinDelic', 'http://xartindelic.comicgenesis.com/') add('XartinDelic', 'http://xartindelic.comicgenesis.com/')
add('YARKRAMERSFIRSTREALITY', 'http://firstreality.comicgenesis.com/') add('YARKRAMERSFIRSTREALITY', 'http://firstreality.comicgenesis.com/')
add('YKAnime', 'http://ykanime.comicgenesis.com/') add('YKAnime', 'http://ykanime.comicgenesis.com/')
add('YOSH', 'http://yosh.comicgen.com/') add('YOSH', 'http://yosh.comicgenesis.com/')
add('YUMEdream', 'http://yume.comicgen.com/') add('YUMEdream', 'http://yume.comicgenesis.com/')
add('YahtzeeTakesOnTheWorld', 'http://yahtzee.comicgenesis.com/') add('YahtzeeTakesOnTheWorld', 'http://yahtzee.comicgenesis.com/')
add('YangChild', 'http://yangchild.comicgenesis.com/') add('YangChild', 'http://yangchild.comicgenesis.com/')
add('YellowMoon', 'http://yellowmoon.comicgenesis.com/') add('YellowMoon', 'http://yellowmoon.comicgenesis.com/')
@ -1230,7 +1226,7 @@ add('Zarla', 'http://zarla.comicgenesis.com/')
add('ZebraGirl', 'http://zebragirl.comicgenesis.com/') add('ZebraGirl', 'http://zebragirl.comicgenesis.com/')
add('Zeek', 'http://zeek.comicgenesis.com/') add('Zeek', 'http://zeek.comicgenesis.com/')
add('ZeeratheSpacePirate', 'http://zeera.comicgenesis.com/') add('ZeeratheSpacePirate', 'http://zeera.comicgenesis.com/')
add('Zelon', 'http://zelon.comicgen.com/') add('Zelon', 'http://zelon.comicgenesis.com/')
add('ZeuU', 'http://zeurinu.comicgenesis.com/') add('ZeuU', 'http://zeurinu.comicgenesis.com/')
add('Zoology', 'http://thezoo.comicgenesis.com/') add('Zoology', 'http://thezoo.comicgenesis.com/')
add('Zootz', 'http://digitalvigilante.comicgenesis.com/') add('Zootz', 'http://digitalvigilante.comicgenesis.com/')
@ -1250,13 +1246,13 @@ add('etch', 'http://etch.comicgenesis.com/')
add('fagz', 'http://fagz.comicgenesis.com/') add('fagz', 'http://fagz.comicgenesis.com/')
add('fallinglessons', 'http://fallinglessons.comicgenesis.com/') add('fallinglessons', 'http://fallinglessons.comicgenesis.com/')
add('fromthedeskof', 'http://fromthedeskof.comicgenesis.com/') add('fromthedeskof', 'http://fromthedeskof.comicgenesis.com/')
add('geeks', 'http://geekstryingtobefunny.comicgen.com/') add('geeks', 'http://geekstryingtobefunny.comicgenesis.com/')
add('heysuburbia', 'http://rockyfoxtop.comicgenesis.com/') add('heysuburbia', 'http://rockyfoxtop.comicgenesis.com/')
add('hyperghostbroadcasts', 'http://hyperghostbroadcasts.comicgenesis.com/') add('hyperghostbroadcasts', 'http://hyperghostbroadcasts.comicgenesis.com/')
add('ifthenelse', 'http://ifthenelse.comicgenesis.com/') add('ifthenelse', 'http://ifthenelse.comicgenesis.com/')
add('ihatesteve', 'http://ihatesteve.comicgenesis.com/') add('ihatesteve', 'http://ihatesteve.comicgenesis.com/')
add('inconsistentshorts', 'http://ics.comicgenesis.com/') add('inconsistentshorts', 'http://ics.comicgenesis.com/')
add('junkRIOT', 'http://junkriot.comicgen.com/') add('junkRIOT', 'http://junkriot.comicgenesis.com/')
add('khaoskomic', 'http://komix.comicgenesis.com/') add('khaoskomic', 'http://komix.comicgenesis.com/')
add('laMouettetheseagullfromMars', 'http://lamouette.comicgenesis.com/') add('laMouettetheseagullfromMars', 'http://lamouette.comicgenesis.com/')
add('leapingwizards', 'http://leapingwizards.comicgenesis.com/') add('leapingwizards', 'http://leapingwizards.comicgenesis.com/')
@ -1274,11 +1270,11 @@ add('socializedmedicine', 'http://socializedmedicine.comicgenesis.com/')
add('spacejams', 'http://spacejams.comicgenesis.com/') add('spacejams', 'http://spacejams.comicgenesis.com/')
add('spiderfrogballoon', 'http://spiderfrogballoon.comicgenesis.com/') add('spiderfrogballoon', 'http://spiderfrogballoon.comicgenesis.com/')
add('theadventuresofmegamanandlink', 'http://takeru.comicgenesis.com/') add('theadventuresofmegamanandlink', 'http://takeru.comicgenesis.com/')
add('theendofthings', 'http://endofthings.comicgen.com/') add('theendofthings', 'http://endofthings.comicgenesis.com/')
add('themisanthropes', 'http://misanthropes.comicgenesis.com/') add('themisanthropes', 'http://misanthropes.comicgenesis.com/')
add('themouseoftime', 'http://mouseoftime.comicgenesis.com/') add('themouseoftime', 'http://mouseoftime.comicgenesis.com/')
add('ttskr', 'http://ttskr.comicgenesis.com/') add('ttskr', 'http://ttskr.comicgenesis.com/')
add('twelvedragons', 'http://twelvedragons.comicgenesis.com/') add('twelvedragons', 'http://twelvedragons.comicgenesis.com/')
add('umlauthouse', 'http://umlauthouse.comicgenesis.com/') add('umlauthouse', 'http://umlauthouse.comicgenesis.com/')
add('usrbinw00t', 'http://usrbinw00t.comicgenesis.com/') add('usrbinw00t', 'http://usrbinw00t.comicgenesis.com/')
add('xCHOPSTICKSxNeo', 'http://chopsticksneo.comicgen.com/') add('xCHOPSTICKSxNeo', 'http://chopsticksneo.comicgenesis.com/')

View file

@ -49,7 +49,7 @@ class Nicky510(_BasicScraper):
class NoNeedForBushido(_BasicScraper): class NoNeedForBushido(_BasicScraper):
latestUrl = 'http://noneedforbushido.com/latest/' latestUrl = 'http://noneedforbushido.com/latest/'
stripUrl = latestUrl + '%s/' stripUrl = 'http://noneedforbushido.com/%s/'
imageSearch = compile(tagre("img", "src", r'(http://noneedforbushido\.com/comics/comic/[^"]+)')) imageSearch = compile(tagre("img", "src", r'(http://noneedforbushido\.com/comics/comic/[^"]+)'))
prevSearch = compile(tagre("a", "href", r'(http://noneedforbushido\.com/[^"]+)', after="previous-comic-link")) prevSearch = compile(tagre("a", "href", r'(http://noneedforbushido\.com/[^"]+)', after="previous-comic-link"))
help = 'Index format: yyyy/comic/nnn' help = 'Index format: yyyy/comic/nnn'

View file

@ -67,10 +67,10 @@ class Sheldon(_BasicScraper):
class Shortpacked(_BasicScraper): class Shortpacked(_BasicScraper):
latestUrl = 'http://www.shortpacked.com/' latestUrl = 'http://www.shortpacked.com/'
stripUrl = latestUrl + 'd/%s.html' stripUrl = latestUrl + '%s/'
imageSearch = compile(tagre("img", "src", r'(http://www\.shortpacked\.com/comics/[^"]+)')) imageSearch = compile(tagre("img", "src", r'(http://www\.shortpacked\.com/comics/[^"]+)'))
prevSearch = compile(tagre("a", "href", r'(http://www\.shortpacked\.com/\d+/comic/[^"]+)', after="prev")) prevSearch = compile(tagre("a", "href", r'(http://www\.shortpacked\.com/\d+/comic/[^"]+)', after="prev"))
help = 'Index format: yyyymmdd' help = 'Index format: yyyy/comic/book-nn/mm-name1/name2'
class SinFest(_BasicScraper): class SinFest(_BasicScraper):

View file

@ -6,8 +6,10 @@ from ..scraper import make_scraper
from ..helpers import bounceStarter from ..helpers import bounceStarter
from ..util import tagre from ..util import tagre
_imageSearch = compile(tagre("img", "src", r'(http://www\.smackjeeves\.com/images/uploaded/comics/[^"]*)')) _imageSearch = compile(tagre("img", "src", r'(http://(?:www|img2)\.smackjeeves\.com/images/uploaded/comics/[^"]+)'))
_prevSearch = compile(tagre("a", "href", r'(/comics/\d+/[^"]*)') + '<img[^>]*alt="< Previous"') _linkSearch = tagre("a", "href", r'([^"]*/comics/\d+/[^"]*)')
_prevSearch = compile(_linkSearch + '(?:<img[^>]*alt="< Previous"|&lt; Back)')
_nextSearch = compile(_linkSearch + '(?:<img[^>]*alt="Next >"|Next &gt;)')
def add(name): def add(name):
classname = 'SmackJeeves/' + name classname = 'SmackJeeves/' + name
@ -20,8 +22,8 @@ def add(name):
return pageUrl.split('/')[-2] return pageUrl.split('/')[-2]
globals()[classname] = make_scraper(classname, globals()[classname] = make_scraper(classname,
starter=bounceStarter(baseUrl, compile(tagre("a", "href", r'(/comics/\d+/[^"]*)') + '<img[^>]*alt="Next >"')), starter=bounceStarter(baseUrl, _nextSearch),
stripUrl = baseUrl, stripUrl = baseUrl + '%s/',
imageSearch = _imageSearch, imageSearch = _imageSearch,
prevSearch = _prevSearch, prevSearch = _prevSearch,
help = 'Index format: nnnn (some increasing number)', help = 'Index format: nnnn (some increasing number)',

View file

@ -16,7 +16,7 @@ def add(name, host):
globals()[classname] = make_scraper(classname, globals()[classname] = make_scraper(classname,
name='SnafuComics/%s' % name, name='SnafuComics/%s' % name,
latestUrl = baseUrl, latestUrl = baseUrl,
stripUrl = baseUrl + 'index.php?strip_id=%s', stripUrl = baseUrl + '?comic_id=%s',
imageSearch = _imageSearch, imageSearch = _imageSearch,
prevSearch = _prevSearch, prevSearch = _prevSearch,
help = 'Index format: n (unpadded)', help = 'Index format: n (unpadded)',

View file

@ -8,27 +8,25 @@ from ..scraper import _BasicScraper
from ..util import tagre from ..util import tagre
# XXX make dynamic class VGCats(_BasicScraper):
class _VGCats(_BasicScraper):
latestUrl = 'http://www.vgcats.com/comics/' latestUrl = 'http://www.vgcats.com/comics/'
imageSearch = compile(r'<img src="(images/\d{6}\..+?)"') stripUrl = latestUrl + '?strip_id=%s'
prevSearch = compile(r'<a href="(\?strip_id=\d+)"><img src="back.gif" border="0"') imageSearch = compile(tagre("img", "src", r'(images/\d{6}\.[^"]+)'))
prevSearch = compile(tagre("a", "href", r'(\?strip_id=\d+)') +
tagre("img", "src", r"back\.gif"))
help = 'Index format: n (unpadded)' help = 'Index format: n (unpadded)'
@property
def stripUrl(self):
return self.latestUrl + '?strip_id=%s'
class VGCatsSuper(VGCats):
class Super(_VGCats):
name = 'VGCats/Super' name = 'VGCats/Super'
latestUrl = 'http://www.vgcats.com/super/' latestUrl = 'http://www.vgcats.com/super/'
stripUrl = latestUrl + '?strip_id=%s'
class Adventure(_VGCats): class VGCatsAdventure(VGCats):
name = 'VGCats/Adventure' name = 'VGCats/Adventure'
latestUrl = 'http://www.vgcats.com/ffxi/' latestUrl = 'http://www.vgcats.com/ffxi/'
stripUrl = latestUrl + '?strip_id=%s'
class ViiviJaWagner(_BasicScraper): class ViiviJaWagner(_BasicScraper):

View file

@ -77,6 +77,7 @@ class _BasicScraper(object):
seen_urls = set() seen_urls = set()
while url: while url:
imageUrls, prevUrl = fetchUrls(url, self.imageSearch, self.prevSearch) imageUrls, prevUrl = fetchUrls(url, self.imageSearch, self.prevSearch)
prevUrl = self.prevUrlModifier(prevUrl)
seen_urls.add(url) seen_urls.add(url)
yield self.getComicStrip(url, imageUrls) yield self.getComicStrip(url, imageUrls)
# avoid recursive URL loops # avoid recursive URL loops
@ -107,6 +108,14 @@ class _BasicScraper(object):
"""Return filename for given image and page URL.""" """Return filename for given image and page URL."""
return None return None
@classmethod
def prevUrlModifier(cls, prevUrl):
"""Optional modification of parsed previous URLs. Useful if
there are domain redirects. The default implementation does
not modify the URL.
"""
return prevUrl
def getFilename(self, imageUrl, pageUrl): def getFilename(self, imageUrl, pageUrl):
"""Return filename for given image and page URL.""" """Return filename for given image and page URL."""
return self.namer(imageUrl, pageUrl) return self.namer(imageUrl, pageUrl)

View file

@ -12,7 +12,6 @@ import re
import traceback import traceback
import time import time
from htmlentitydefs import name2codepoint from htmlentitydefs import name2codepoint
from math import log, floor
from .output import out from .output import out
from .configuration import UserAgent, AppName, App, SupportUrl from .configuration import UserAgent, AppName, App, SupportUrl
@ -209,19 +208,6 @@ def get_columns (fp):
return 80 return 80
suffixes = ('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB')
def saneDataSize(size):
if size == 0:
return 'unk B'
index = int(floor(log(abs(size), 1024)))
index = min(index, len(suffixes) - 1)
index = max(index, 0)
factor = 1024 ** index
return '%0.3f %s' % (float(size) / factor, suffixes[index])
def splitpath(path): def splitpath(path):
c = [] c = []
head, tail = os.path.split(path) head, tail = os.path.split(path)
@ -331,3 +317,24 @@ def unquote(text):
while '%' in text: while '%' in text:
text = urllib.unquote(text) text = urllib.unquote(text)
return text return text
def strsize (b):
"""Return human representation of bytes b. A negative number of bytes
raises a value error."""
if b < 0:
raise ValueError("Invalid negative byte number")
if b < 1024:
return "%dB" % b
if b < 1024 * 10:
return "%dKB" % (b // 1024)
if b < 1024 * 1024:
return "%.2fKB" % (float(b) / 1024)
if b < 1024 * 1024 * 10:
return "%.2fMB" % (float(b) / (1024*1024))
if b < 1024 * 1024 * 1024:
return "%.1fMB" % (float(b) / (1024*1024))
if b < 1024 * 1024 * 1024 * 10:
return "%.2fGB" % (float(b) / (1024*1024*1024))
return "%.1fGB" % (float(b) / (1024*1024*1024))

View file

@ -17,6 +17,13 @@ json_file = __file__.replace(".py", ".json")
# names of comics to exclude # names of comics to exclude
exclude_comics = [ exclude_comics = [
"Twonks_and_Plonkers", # broken images, no real content "Twonks_and_Plonkers", # broken images, no real content
"U_Chuu_No_Hoshi_Hotoshi_Tsuko", # broken images
"Red_Dog_Venue", # start page is broken
"Monster_Lover", # start page is broken
"Legacy_of_Blaze", # broken images
"Dead_Strangers", # broken images
"Crack", # broken images
"Iron_Wolf", # broken images
] ]

View file

@ -20,6 +20,7 @@ url_matcher = re.compile(tagre("a", "href", r'(/[^"]+)', after="alpha_list") + r
# names of comics to exclude # names of comics to exclude
exclude_comics = [ exclude_comics = [
"FrikkFrakkAndFrank", # too few comics
] ]

View file

@ -21,8 +21,28 @@ num_matcher = re.compile(r'Number of Days: (\d+)')
# names of comics to exclude # names of comics to exclude
exclude_comics = [ exclude_comics = [
"JuvenileDiversion", # page moved
"JustWeird", # page has 403 forbidden
"MobileMadness", # page does not follow standard layout
"KnightsOfTheNexus", # page does not follow standard layout
"RogerAndDominic", # page does not follow standard layout
"TheAvatar", # page does not follow standard layout
"Michikomonogatari", # page does not follow standard layout
"DungeonDamage", # page does not follow standard layout
"SaveMeGebus", # page does not follow standard layout
"BlueZombie", # broken page
"BoomerExpress", # redirection to another page
"FaultyLogic", # page does not follow standard layout
"EarthRiser", # redirects to a new page
"GoForIt", # page is gone
"ACDeceptibotscomic", # no images
] ]
url_overrides = {
# link to last valid strip
"BallofYarn": "http://ballofyarn.comicgenesis.com/d/20020624.html",
}
def handle_url(url, res): def handle_url(url, res):
"""Parse one search result page.""" """Parse one search result page."""
@ -49,7 +69,7 @@ def handle_url(url, res):
print("ERROR:", repr(data[end:end+300], file=sys.stderr)) print("ERROR:", repr(data[end:end+300], file=sys.stderr))
continue continue
num = int(mo.group(1)) num = int(mo.group(1))
res[name] = (url, num) res[name] = (url_overrides.get(name, url), num)
def save_result(res): def save_result(res):
@ -89,6 +109,7 @@ def print_results(args):
url, num = entry url, num = entry
if num < min_comics: if num < min_comics:
continue continue
url = url.replace("comicgen.com", "comicgenesis.com")
if has_comic(name): if has_comic(name):
prefix = '#' prefix = '#'
else: else:

View file

@ -66,7 +66,10 @@ def get_content(filename):
for line in f: for line in f:
if line.startswith((". ", "F ")) and "test_comics" in line: if line.startswith((". ", "F ")) and "test_comics" in line:
num_tests += 1 num_tests += 1
tests.append(get_test(line)) try:
tests.append(get_test(line))
except Exception as msg:
print("WARNING:", msg, file=sys.stderr)
if num_tests % 5 == 0: if num_tests % 5 == 0:
print(num_tests, end=" ", file=sys.stderr) print(num_tests, end=" ", file=sys.stderr)
tests.sort() tests.sort()

View file

@ -7,6 +7,5 @@ script=test.sh
rm -f "$script" rm -f "$script"
echo "#!/bin/sh -e" > "$script" echo "#!/bin/sh -e" > "$script"
egrep -v "^\. " testresults.txt | egrep "^F " | cut -b "3-" | awk '{ print "make test TESTOUTPUT=/dev/null TESTS=" $0; }' >> "$script" egrep -v "^\. " testresults.txt | egrep "^F " | cut -b "3-" | sort | awk '{ print "make test TESTOUTPUT=/dev/null TESTS=" $0; }' >> "$script"
chmod 755 "$script" chmod 755 "$script"

View file

@ -11,4 +11,3 @@ for script in creators gocomics drunkduck universal keenspot; do
"${d}/removeafter.py" "$target" "# DO NOT REMOVE" "${d}/removeafter.py" "$target" "# DO NOT REMOVE"
"${d}/${script}.py" $mincomics >> "$target" "${d}/${script}.py" $mincomics >> "$target"
done done