diff --git a/dosagelib/plugins/c.py b/dosagelib/plugins/c.py
index a84c2e4b6..49341dee1 100644
--- a/dosagelib/plugins/c.py
+++ b/dosagelib/plugins/c.py
@@ -18,6 +18,15 @@ class CaptainSNES(_BasicScraper):
help = 'Index format: yyyy/mm/dd/nnn-stripname'
+class CaseyAndAndy(_BasicScraper):
+ latestUrl = 'http://www.galactanet.com/comic/'
+ stripUrl = latestUrl + 'view.php?strip=%s'
+ imageSearch = compile(tagre("img", "src", r'(Strip\d+\.gif)'))
+ prevSearch = compile(tagre("a", "href", r'(view\.php\?strip=\d+)')
+ + tagre("img", "src", r'previous\.gif'))
+ help = 'Index format: number'
+
+
class CaribbeanBlue(_BasicScraper):
latestUrl = 'http://cblue.katbox.net/'
stripUrl = latestUrl + 'archive/%s'
diff --git a/dosagelib/plugins/d.py b/dosagelib/plugins/d.py
index f48057994..f24d6e35a 100644
--- a/dosagelib/plugins/d.py
+++ b/dosagelib/plugins/d.py
@@ -19,6 +19,15 @@ class DailyDose(_BasicScraper):
help = 'Index format: stripname'
+class Damonk(_BasicScraper):
+ latestUrl = 'http://www.damonk.com/'
+ stripUrl = latestUrl + 'd/%s.html'
+ imageSearch = compile(tagre("img", "src", r'(/comics/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(/d/\d+\.html)') +
+ tagre("img", "src", r'/images/previous_day\.gif'))
+ help = 'Index format: yyyymmdd'
+
+
class DandyAndCompany(_BasicScraper):
latestUrl = 'http://www.dandyandcompany.com/'
stripUrl = None
@@ -125,12 +134,11 @@ class DieselSweeties(_BasicScraper):
return 'sw%02d' % (index,)
-
class DominicDeegan(_BasicScraper):
latestUrl = 'http://www.dominic-deegan.com/'
stripUrl = latestUrl + 'view.php?date=%s'
imageSearch = compile(tagre("img", "src", r'(comics/\d+\.gif)'))
- prevSearch = compile(r'"(view.php\?date=.+?)".+?prev21')
+ prevSearch = compile(r'"(view.php\?date=[^"]+)".+?prev21')
help = 'Index format: yyyy-mm-dd'
diff --git a/dosagelib/plugins/e.py b/dosagelib/plugins/e.py
index 5375cb396..513582cd4 100644
--- a/dosagelib/plugins/e.py
+++ b/dosagelib/plugins/e.py
@@ -9,6 +9,14 @@ from ..scraper import _BasicScraper
from ..util import tagre
+class EdibleDirt(_BasicScraper):
+ latestUrl = 'http://eddirt.frozenreality.co.uk/'
+ stripUrl = latestUrl + 'index.php?id=%s'
+ imageSearch = compile(tagre("img", "src", r'(strips/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r"(index\.php\?id=\d+)")+"Previous")
+ help = 'Index format: number'
+
+
class EerieCuties(_BasicScraper):
latestUrl = 'http://www.eeriecuties.com/'
stripUrl = latestUrl + 'strips-ec/%s'
@@ -25,6 +33,15 @@ class Eriadan(_BasicScraper):
help = 'Index format: yyyy/mm/dd/nnn (unpadded)'
+class ElfOnlyInn(_BasicScraper):
+ latestUrl = 'http://www.elfonlyinn.net/'
+ stripUrl = latestUrl + 'd/%s.html'
+ imageSearch = compile(tagre("img", "src", r'(/comics/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(/d/\d+\.html)') +
+ tagre("img", "src", r'/images/previous_day\.gif'))
+ help = 'Index format: yyyymmdd'
+
+
class ElGoonishShive(_BasicScraper):
name = 'KeenSpot/ElGoonishShive'
latestUrl = 'http://www.egscomics.com/'
diff --git a/dosagelib/plugins/f.py b/dosagelib/plugins/f.py
index 5af89ef7c..9f311dda4 100644
--- a/dosagelib/plugins/f.py
+++ b/dosagelib/plugins/f.py
@@ -50,6 +50,15 @@ class FlakyPastry(_BasicScraper):
help = 'Index format: nnnn'
+class Flemcomics(_BasicScraper):
+ latestUrl = 'http://www.flemcomics.com/'
+ stripUrl = latestUrl + 'd/%s.html'
+ imageSearch = compile(tagre("img", "src", r'(/comics/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(/d/\d+\.html)') +
+ tagre("img", "src", r'/images/previous_day\.jpg'))
+ help = 'Index format: yyyymmdd'
+
+
class Flipside(_BasicScraper):
latestUrl = 'http://flipside.keenspot.com/comic.php'
stripUrl = latestUrl + '?i=%s'
diff --git a/dosagelib/plugins/j.py b/dosagelib/plugins/j.py
index 3594fc597..ee35b2412 100644
--- a/dosagelib/plugins/j.py
+++ b/dosagelib/plugins/j.py
@@ -7,6 +7,14 @@ from ..scraper import _BasicScraper
from ..util import tagre
+class JackCannon(_BasicScraper):
+ latestUrl = 'http://fancyadventures.com/'
+ stripUrl = latestUrl + '%s/'
+ imageSearch = compile(tagre("img", "src", r'(http://fancyadventures\.com/comics/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(http://fancyadventures\.com/[^"]+)', after="prev"))
+ help = 'Index format: yyyy/mm/dd/page-nnn'
+
+
class JerkCity(_BasicScraper):
latestUrl = 'http://www.jerkcity.com/'
stripUrl = latestUrl + '_jerkcity%s.html'
@@ -21,3 +29,12 @@ class JoeAndMonkey(_BasicScraper):
imageSearch = compile(r'"(/comic/[^"]+)"')
prevSearch = compile(r"Previous")
help = 'Index format: nnn'
+
+
+class JustAnotherEscape(_BasicScraper):
+ latestUrl = 'http://www.justanotherescape.com/'
+ stripUrl = latestUrl + 'index.cgi?date=%s'
+ imageSearch = compile(tagre("img", "src", r'(http://www\.justanotherescape\.com/comics/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(http://www\.justanotherescape\.com//index\.cgi\?date=\d+)')
+ + tagre("img", "alt", "Previous Comic"))
+ help = 'Index format: yyyymmdd'
diff --git a/dosagelib/plugins/k.py b/dosagelib/plugins/k.py
index 14573d73c..95e036f20 100644
--- a/dosagelib/plugins/k.py
+++ b/dosagelib/plugins/k.py
@@ -41,9 +41,27 @@ class KevinAndKell(_BasicScraper):
self.currentUrl = self.stripUrl % tuple(map(int, index.split('-')))
+class KhaosKomix(_BasicScraper):
+ adult = True
+ latestUrl = 'http://www.khaoskomix.com/'
+ stripUrl = latestUrl + 'komix/%s'
+ imageSearch = compile(tagre("img", "src", r'(http://www\.khaoskomix\.com/komiximg/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(http://www\.khaoskomix\.com/komix/[^"]+)', after="Prev"))
+ help = 'Index format: stripname'
+
+
class KillerKomics(_BasicScraper):
latestUrl = 'http://www.killerkomics.com/web-comics/index_ang.cfm'
stripUrl = 'http://www.killerkomics.com/web-comics/%s.cfm'
imageSearch = compile(r''))
stripUrl = 'http://www.phdcomics.com/comics/archive.php?comicid=%s'
@@ -84,6 +91,14 @@ class PiledHigherAndDeeper(_BasicScraper):
namer = queryNamer('comicid', usePageUrl=True)
+class Pimpette(_BasicScraper):
+ latestUrl = 'http://pimpette.ca/'
+ stripUrl = latestUrl + 'index.php?date=%s'
+ imageSearch = compile(tagre("img", "src", r'(strips/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(index\.php\?date=\d+)') + "Previous")
+ help = 'Index format: yyyymmdd'
+
+
class Precocious(_BasicScraper):
baseUrl = 'http://www.precociouscomic.com/'
starter = indirectStarter(baseUrl,
@@ -103,32 +118,6 @@ class PvPonline(_BasicScraper):
help = 'Index format: yyyy/mm/dd/stripname'
-
-def pensAndTales(name, baseUrl):
- return type('PensAndTales_%s' % name,
- (_BasicScraper,),
- dict(
- name='PensAndTales/' + name,
- latestUrl=baseUrl,
- stripUrl=baseUrl + '?date=%s',
- imageSearch=compile(r']+?src="([^"]*?comics/.+?)"', IGNORECASE),
- prevSearch=compile(r'(:?]+?alt=")?Previous Comic', IGNORECASE),
- help='Index format: yyyymmdd')
- )
-
-
-# XXX: using custom Wordpress layout
-# th = pensAndTales('TreasureHunters', 'http://th.pensandtales.com/')
-# XXX: comic broken, no content
-# strangekith = pensAndTales('Strangekith', 'http://strangekith.pensandtales.com/')
-# XXX: comic broken
-# fireflycross = pensAndTales('FireflyCross', 'http://fireflycross.pensandtales.com/')
-evilish = pensAndTales('Evilish', 'http://evilish.pensandtales.com/')
-# XXX: moved / layout changed
-#ynt = pensAndTales('YamiNoTainai', 'http://ynt.pensandtales.com/')
-
-
-
class ProperBarn(_BasicScraper):
latestUrl = 'http://www.nitrocosm.com/go/gag/'
stripUrl = latestUrl + '%s/'
@@ -137,7 +126,6 @@ class ProperBarn(_BasicScraper):
help = 'Index format: nnn'
-
class PunksAndNerds(_BasicScraper):
latestUrl = 'http://www.punksandnerds.com/'
stripUrl = latestUrl + '?p=%s'
@@ -146,7 +134,6 @@ class PunksAndNerds(_BasicScraper):
help = 'Index format: nnn'
-
class PunksAndNerdsOld(_BasicScraper):
latestUrl = 'http://original.punksandnerds.com/'
stripUrl = latestUrl + 'd/%s.html'
@@ -155,7 +142,6 @@ class PunksAndNerdsOld(_BasicScraper):
help = 'Index format: yyyymmdd'
-
class PlanescapeSurvival(_BasicScraper):
latestUrl = 'http://planescapecomic.com/'
stripUrl = latestUrl + '%s.html'
diff --git a/dosagelib/plugins/pensandtales.py b/dosagelib/plugins/pensandtales.py
new file mode 100644
index 000000000..3634bfeeb
--- /dev/null
+++ b/dosagelib/plugins/pensandtales.py
@@ -0,0 +1,30 @@
+# -*- coding: iso-8859-1 -*-
+# Copyright (C) 2004-2005 Tristan Seligmann and Jonathan Jacobs
+# Copyright (C) 2012 Bastian Kleineidam
+from re import compile
+from ..scraper import make_scraper
+from ..util import tagre
+
+_imageSearch = compile(tagre("img", "src", r'([^"]*comics/[^"]+)'))
+
+def add(name, baseUrl, param="date"):
+ classname = 'PensAndTales_%s' % name
+ _prevSearch = compile(tagre("a", "href", r'([^"]*\?%s=\d+)' % param) +
+ '(?:' + tagre("img", "alt", r'Previous Comic') + '|' +
+ '[^<]+Previous' + ')')
+ globals()[classname] = make_scraper(classname,
+ name='PensAndTales/' + name,
+ latestUrl = baseUrl,
+ stripUrl = baseUrl + '?' + param + '=%s',
+ imageSearch = _imageSearch,
+ prevSearch = _prevSearch,
+ help='Index format: yyyymmdd'
+ )
+
+
+# Most of the comics linked an pensandtales are broken and
+# the rest does not have a common layout. It seems they allow
+# almost arbitrary HTML layout.
+
+add('FireflyCross', 'http://www.fireflycross.pensandtales.com/', param="p")
+add('Evilish', 'http://evilish.pensandtales.com/')
diff --git a/dosagelib/plugins/s.py b/dosagelib/plugins/s.py
index 057a32948..feeb6a935 100644
--- a/dosagelib/plugins/s.py
+++ b/dosagelib/plugins/s.py
@@ -66,6 +66,14 @@ class Sheldon(_BasicScraper):
help = 'Index format: yymmdd'
+class Shivae(_BasicScraper):
+ latestUrl = 'http://shivae.net/'
+ stripUrl = latestUrl + 'blog/%s/'
+ imageSearch = compile(tagre("img", "src", r'(http://shivae\.net/files/comics/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(http://shivae\.net/blog/[^"]+)', after="Previous"))
+ help = 'Index format: yyyy/mm/dd/stripname'
+
+
class Shortpacked(_BasicScraper):
latestUrl = 'http://www.shortpacked.com/'
stripUrl = latestUrl + '%s/'
@@ -99,7 +107,6 @@ class SluggyFreelance(_BasicScraper):
help = 'Index format: yymmdd'
-
class SodiumEyes(_BasicScraper):
latestUrl = 'http://sodiumeyes.com/'
stripUrl = latestUrl + '%s/'
@@ -108,6 +115,15 @@ class SodiumEyes(_BasicScraper):
help = 'Index format: yyyy/mm/dd/stripname'
+class Sorcery101(_BasicScraper):
+ baseUrl = 'http://www.sorcery101.net/'
+ latestUrl = baseUrl + 'sorcery-101/'
+ stripUrl = baseUrl + 'sorcery101/%s/'
+ imageSearch = compile(tagre("img", "src", r'(http://www\.sorcery101\.net/comics/sorcery101/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(http://www\.sorcery101\.net/sorcery101/[^"]+)', after="previous-comic-link"))
+ help = 'Index format: stripname'
+
+
class SpareParts(_BasicScraper):
baseUrl = 'http://www.sparepartscomics.com/'
latestUrl = baseUrl + 'comics/?date=20080328'
@@ -117,6 +133,23 @@ class SpareParts(_BasicScraper):
help = 'Index format: yyyymmdd'
+class SPQRBlues(_BasicScraper):
+ latestUrl = 'http://spqrblues.com/IV/'
+ stripUrl = latestUrl + '?p=%s'
+ imageSearch = compile(tagre("img", "src", r'(http://spqrblues\.com/IV/comics/\d+\.png)'))
+ prevSearch = compile(tagre("a", "href", r'(http://spqrblues\.com/IV/\?p=\d+)', after="prev"))
+ help = 'Index format: number'
+
+
+class StationV3(_BasicScraper):
+ latestUrl = 'http://www.stationv3.com/'
+ stripUrl = latestUrl + 'd/%s.html'
+ imageSearch = compile(tagre("img", "src", r'(http://www\.stationv3\.com/comics/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(http://www\.stationv3\.com/d/\d+\.html)') +
+ tagre("img", "src", r'http://www\.stationv3\.com/images/previous\.gif'))
+ help = 'Index format: yyyymmdd'
+
+
class Stubble(_BasicScraper):
latestUrl = 'http://stubblecomics.com/'
stripUrl = latestUrl + '?p=%s'
diff --git a/dosagelib/plugins/t.py b/dosagelib/plugins/t.py
index cd93a9d1a..63462db77 100644
--- a/dosagelib/plugins/t.py
+++ b/dosagelib/plugins/t.py
@@ -8,6 +8,14 @@ from ..helpers import indirectStarter
from ..util import tagre
+class TheDevilsPanties(_BasicScraper):
+ latestUrl = 'http://thedevilspanties.com/'
+ stripUrl = latestUrl + 'archives/%s'
+ imageSearch = compile(tagre("img", "src", r'(http://cdn\.thedevilspanties\.com/comics/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(/archives/\d+)', after="Previous"))
+ help = 'Index format: number'
+
+
class TheNoob(_BasicScraper):
latestUrl = 'http://www.thenoobcomic.com/index.php'
stripUrl = latestUrl + '?pos=%s'
@@ -46,6 +54,15 @@ class TheWotch(_BasicScraper):
help = 'Index format: yyyy-mm-dd'
+class ThunderAndLightning(_BasicScraper):
+ baseUrl = 'http://www.talcomic.com/wp/'
+ latestUrl = baseUrl + '?latestcomic'
+ stripUrl = baseUrl + '%s/'
+ prevSearch = compile(tagre("a", "href", r'(http://www\.talcomic\.com/wp/[^"]+)', after="prev"))
+ imageSearch = compile(tagre("img", "src", r'(http://www\.talcomic\.com/wp/comics/[^"]+)'))
+ help = 'Index format: yyyy/mm/dd/page-nn'
+
+
class TinyKittenTeeth(_BasicScraper):
latestUrl = 'http://www.tinykittenteeth.com/'
stripUrl = latestUrl + '%s/'
@@ -54,6 +71,14 @@ class TinyKittenTeeth(_BasicScraper):
help = 'Index format: yyyy/mm/dd/stripname (unpadded)'
+class TwoLumps(_BasicScraper):
+ latestUrl = 'http://www.twolumps.net/'
+ stripUrl = latestUrl + 'd/%s.html'
+ imageSearch = compile(tagre("img", "src", r'(/comics/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(/d/\d+\.html)', after="prev"))
+ help = 'Index format: yyyymmdd'
+
+
class TwoTwoOneFour(_BasicScraper):
latestUrl = 'http://www.nitrocosm.com/go/2214_classic/'
stripUrl = latestUrl + '%s/'
@@ -87,3 +112,11 @@ class TheOuterQuarter(_BasicScraper):
imageSearch = compile(r'')
help = 'Index format: nnn'
+
+
+class TracyAndTristan(_BasicScraper):
+ latestUrl = 'http://tandt.thecomicseries.com/'
+ stripUrl = latestUrl + 'comics/%s'
+ imageSearch = compile(tagre("img", "src", r'(http://tandt\.thecomicseries\.com/images/comics/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(/comics/\d+)', after="prev"))
+ help = 'Index format: number'
diff --git a/dosagelib/plugins/v.py b/dosagelib/plugins/v.py
index ed35db586..0a96006d7 100644
--- a/dosagelib/plugins/v.py
+++ b/dosagelib/plugins/v.py
@@ -8,6 +8,15 @@ from ..scraper import _BasicScraper
from ..util import tagre
+class Vendetta(_BasicScraper):
+ latestUrl = 'http://www.vendettacomic.com/'
+ stripUrl = latestUrl + 'archive.php?date=%s.jpg'
+ imageSearch = compile(tagre("img", "src", r'(/comics/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(archive\.php\?date=\d+\.jpg)') +
+ tagre("img", "src", r"/images/prev\.jpg"))
+ help = 'Index format: yyyymmdd'
+
+
class VGCats(_BasicScraper):
latestUrl = 'http://www.vgcats.com/comics/'
stripUrl = latestUrl + '?strip_id=%s'
@@ -29,6 +38,14 @@ class VGCatsAdventure(VGCats):
stripUrl = latestUrl + '?strip_id=%s'
+class VictimsOfTheSystem(_BasicScraper):
+ latestUrl = 'http://www.votscomic.com/'
+ stripUrl = latestUrl + '?id=%s.jpg'
+ imageSearch = compile(tagre("img", "src", r'(comicpro/strips/[^"]+)'))
+ prevSearch = compile(tagre("a", "href", r'(\?id=\d+-\d+\.jpg)') + "Previous")
+ help = 'Index format: nnn-nnn'
+
+
class ViiviJaWagner(_BasicScraper):
latestUrl = 'http://www.hs.fi/viivijawagner/'
stripUrl = None