2020-04-18 11:45:44 +00:00
|
|
|
# SPDX-License-Identifier: MIT
|
2016-10-28 22:21:41 +00:00
|
|
|
# Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs
|
2014-01-05 15:50:57 +00:00
|
|
|
# Copyright (C) 2012-2014 Bastian Kleineidam
|
2020-01-09 16:38:13 +00:00
|
|
|
# Copyright (C) 2015-2020 Tobias Gruetzmacher
|
2020-01-13 06:34:05 +00:00
|
|
|
# Copyright (C) 2019-2020 Daniel Ring
|
2019-07-14 06:06:31 +00:00
|
|
|
from re import compile, escape, MULTILINE
|
|
|
|
try:
|
|
|
|
from functools import cached_property
|
|
|
|
except ImportError:
|
|
|
|
from cached_property import cached_property
|
2016-05-06 23:50:10 +00:00
|
|
|
|
2015-04-26 09:52:31 +00:00
|
|
|
from ..scraper import _BasicScraper, _ParserScraper
|
2020-07-31 20:56:30 +00:00
|
|
|
from ..helpers import indirectStarter
|
2014-07-23 18:53:59 +00:00
|
|
|
from ..util import tagre
|
2019-10-18 07:49:55 +00:00
|
|
|
from .common import _ComicControlScraper, _WordPressScraper, _WPNavi, _WPNaviIn, _WPWebcomic
|
2012-06-20 19:58:13 +00:00
|
|
|
|
|
|
|
|
2019-10-11 05:05:55 +00:00
|
|
|
class TailsAndTactics(_ParserScraper):
|
|
|
|
url = 'http://tailsandtactics.com/comic/'
|
|
|
|
stripUrl = url + '%s/'
|
|
|
|
firstStripUrl = stripUrl % '1'
|
|
|
|
imageSearch = '//div[@class="comic-image"]/img'
|
|
|
|
prevSearch = '//a[text()=" Back"]'
|
|
|
|
|
|
|
|
|
2020-11-02 03:28:44 +00:00
|
|
|
class TekMage(_WPNavi):
|
|
|
|
url = 'https://tekmagecomic.com/'
|
|
|
|
stripUrl = url + 'comic/%s/'
|
|
|
|
firstStripUrl = stripUrl % 'chapter-1-page-1'
|
|
|
|
|
|
|
|
|
2019-10-18 07:49:55 +00:00
|
|
|
class Tamberlane(_WPWebcomic):
|
2019-07-07 03:01:17 +00:00
|
|
|
baseUrl = 'https://www.tamberlanecomic.com/'
|
|
|
|
url = baseUrl + 'latest/'
|
|
|
|
stripUrl = baseUrl + 'tamberlane/%s/'
|
|
|
|
firstStripUrl = stripUrl % 'page-1'
|
2020-07-16 07:20:37 +00:00
|
|
|
imageSearch = '//div[@id="comic-page"]/img/@src'
|
|
|
|
prevSearch = '//a[@class="previous-link"]'
|
2019-07-07 03:01:17 +00:00
|
|
|
|
|
|
|
|
2020-09-13 15:18:42 +00:00
|
|
|
class TheBoyWhoFell(_ComicControlScraper):
|
|
|
|
url = 'https://www.boywhofell.com/'
|
|
|
|
firstStripUrl = url + 'comic/ch00p00'
|
|
|
|
|
|
|
|
|
2016-10-31 05:57:47 +00:00
|
|
|
class TheBrads(_ParserScraper):
|
2020-01-09 16:38:13 +00:00
|
|
|
url = ('https://web.archive.org/web/20171211154809/'
|
|
|
|
'http://bradcolbow.com/archive/C4/')
|
|
|
|
stripUrl = url + '%s/'
|
|
|
|
firstStripUrl = stripUrl % 'P125'
|
2020-07-31 20:56:30 +00:00
|
|
|
imageSearch = '//div[d:class("entry")]//img'
|
|
|
|
prevSearch = '//a[d:class("prev")]'
|
2013-02-06 21:27:40 +00:00
|
|
|
multipleImagesPerStrip = True
|
2020-01-09 16:38:13 +00:00
|
|
|
endOfLife = True
|
2013-02-06 21:27:40 +00:00
|
|
|
|
2021-12-25 01:03:16 +00:00
|
|
|
class TheChroniclesOfHuxcyn(_WordPressScraper):
|
|
|
|
url = 'https://huxcyn.com/'
|
|
|
|
stripUrl = url + 'comic/%s'
|
|
|
|
firstStripUrl = stripUrl % 'opening-001'
|
|
|
|
|
|
|
|
def namer(self, imageUrl, pageUrl):
|
|
|
|
# Fix inconsistent filenames
|
|
|
|
filename = imageUrl.rsplit('/', 1)[-1]
|
|
|
|
filename = filename.replace('IMG_0504', 'TCoH109')
|
|
|
|
filename = filename.replace('tcoh', 'TCoH')
|
|
|
|
filename = filename.replace('1599151639.xizana_f3a6458e-8d94-4259-bec3-5a92706fe493_jpeg', 'october.2020.cover')
|
|
|
|
filename = filename.replace('huxonsword', 'october.2020.huxonsword')
|
|
|
|
filename = filename.replace('New_Canvas100pageswebimage', 'TCoH100')
|
|
|
|
if filename[0] == '0':
|
|
|
|
filename = 'TCoH' + filename
|
|
|
|
elif filename[0] == '3':
|
|
|
|
pagenum = int(filename.rsplit('.', 1)[0].split('_', 1)[1].split('_', 1)[0])
|
|
|
|
filename = 'TCoH' + str(40 + pagenum) + filename.rsplit('.', 1)[-1]
|
|
|
|
return filename
|
|
|
|
|
2013-02-06 21:27:40 +00:00
|
|
|
|
2019-06-23 02:44:15 +00:00
|
|
|
class TheClassMenagerie(_ParserScraper):
|
|
|
|
stripUrl = 'http://www.theclassm.com/d/%s.html'
|
|
|
|
url = stripUrl % '20050717'
|
|
|
|
firstStripUrl = stripUrl % '19990322'
|
|
|
|
imageSearch = '//img[@class="ksc"]'
|
|
|
|
prevSearch = '//a[@rel="prev"]'
|
|
|
|
multipleImagesPerStrip = True
|
|
|
|
endOfLife = True
|
|
|
|
|
|
|
|
|
2020-03-04 06:03:07 +00:00
|
|
|
class TheDepths(_WPWebcomic):
|
|
|
|
url = 'https://www.thedepthscomic.com/'
|
|
|
|
stripUrl = url + 'comic/%s/'
|
|
|
|
firstStripUrl = stripUrl % 'page-01'
|
|
|
|
imageSearch = '//div[contains(@class, "webcomic-media")]//img'
|
|
|
|
adult = True
|
|
|
|
|
|
|
|
def namer(self, imageUrl, pageUrl):
|
|
|
|
# Fix inconsistent filenames
|
|
|
|
filename = imageUrl.rsplit('/', 1)[-1]
|
|
|
|
filename = filename.replace('pg', 'page_')
|
|
|
|
filename = filename.replace('page_', 'the_depths_')
|
|
|
|
filename = filename.replace('-web', '')
|
|
|
|
return filename
|
|
|
|
|
|
|
|
|
2017-05-21 23:17:05 +00:00
|
|
|
class TheDevilsPanties(_WPNavi):
|
2020-01-12 21:36:24 +00:00
|
|
|
url = 'https://thedevilspanties.com/'
|
2013-02-04 20:00:26 +00:00
|
|
|
stripUrl = url + 'archives/%s'
|
2013-04-10 21:57:09 +00:00
|
|
|
firstStripUrl = stripUrl % '300'
|
2012-12-08 20:30:51 +00:00
|
|
|
help = 'Index format: number'
|
|
|
|
|
|
|
|
|
2016-04-01 22:14:31 +00:00
|
|
|
class TheDreamlandChronicles(_WordPressScraper):
|
|
|
|
url = 'http://www.thedreamlandchronicles.com/'
|
|
|
|
|
|
|
|
|
2020-09-13 15:14:52 +00:00
|
|
|
class TheForgottenOrder(_ComicControlScraper):
|
|
|
|
url = 'http://www.forgottenordercomic.com/'
|
|
|
|
firstStripUrl = url + 'comic/prolouge-01-book-1'
|
|
|
|
|
|
|
|
|
2015-04-26 09:52:31 +00:00
|
|
|
class TheGamerCat(_ParserScraper):
|
2019-07-03 07:18:55 +00:00
|
|
|
url = 'https://thegamercat.com/'
|
|
|
|
stripUrl = url + 'comic/%s/'
|
|
|
|
firstStripUrl = stripUrl % '06102011'
|
|
|
|
imageSearch = '//div[@id="comic"]//img'
|
|
|
|
prevSearch = '//a[contains(@class, "comic-nav-previous")]'
|
2015-04-26 09:52:31 +00:00
|
|
|
help = 'Index format: stripname'
|
2013-04-25 19:20:48 +00:00
|
|
|
|
2014-01-31 03:32:07 +00:00
|
|
|
|
2016-04-01 22:14:31 +00:00
|
|
|
class TheGentlemansArmchair(_WordPressScraper):
|
|
|
|
url = 'http://thegentlemansarmchair.com/'
|
|
|
|
|
|
|
|
|
2019-07-06 06:05:23 +00:00
|
|
|
class TheGentleWolf(_WordPressScraper):
|
|
|
|
url = 'https://thegentlewolf.net/'
|
|
|
|
stripUrl = url + 'comic/%s/'
|
|
|
|
firstStripUrl = stripUrl % 'tgw-001'
|
|
|
|
|
|
|
|
def namer(self, imageUrl, pageUrl):
|
|
|
|
# Fix duplicate filename
|
|
|
|
filename = imageUrl.rsplit('/', 1)[-1]
|
|
|
|
if pageUrl == self.stripUrl % 'tgw-271':
|
|
|
|
filename = filename.replace('272', '271')
|
|
|
|
return filename
|
|
|
|
|
|
|
|
|
2020-09-13 15:28:19 +00:00
|
|
|
class TheGlassScientists(_ComicControlScraper):
|
|
|
|
url = 'https://www.theglassscientists.com/'
|
|
|
|
firstStripUrl = url + 'comic/chapter-i'
|
|
|
|
|
|
|
|
|
2019-07-20 05:02:44 +00:00
|
|
|
class TheJunkHyenasDiner(_WordPressScraper):
|
|
|
|
url = 'http://junkhyenasdiner.com/'
|
|
|
|
stripUrl = url + 'comic/%s/'
|
|
|
|
firstStripUrl = stripUrl % 'intro'
|
|
|
|
|
|
|
|
|
2020-01-09 16:38:13 +00:00
|
|
|
class TheLandscaper(_ParserScraper):
|
|
|
|
stripUrl = ('https://web.archive.org/web/20171129163510/'
|
|
|
|
'http://landscaper.visual-assault.net/comic/%s')
|
2016-05-06 23:50:10 +00:00
|
|
|
url = stripUrl % 'latest'
|
2014-02-18 20:00:43 +00:00
|
|
|
firstStripUrl = stripUrl % '1'
|
2020-07-31 20:56:30 +00:00
|
|
|
imageSearch = '//article[d:class("comic")]//img[1]'
|
2020-01-09 16:38:13 +00:00
|
|
|
prevSearch = '//a[contains(text(), "Previous")]'
|
|
|
|
endOfLife = True
|
2014-02-18 20:00:43 +00:00
|
|
|
|
2016-03-31 21:13:54 +00:00
|
|
|
|
2016-04-01 22:14:31 +00:00
|
|
|
class TheMelvinChronicles(_WordPressScraper):
|
|
|
|
url = 'http://melvin.jeaniebottle.com/'
|
|
|
|
|
|
|
|
|
2020-06-21 06:19:02 +00:00
|
|
|
class TheNightBelongsToUs(_ParserScraper):
|
|
|
|
url = 'https://tnbtu.com/'
|
|
|
|
stripUrl = url + 'comic/%s/'
|
|
|
|
firstStripUrl = stripUrl % '01-00'
|
|
|
|
imageSearch = '//div[@id="spliced-comic"]//img'
|
|
|
|
prevSearch = '//a[./img[contains(@src, "nav-prev")]]'
|
|
|
|
latestSearch = '//a[contains(@class, "main-link")]'
|
|
|
|
starter = indirectStarter
|
|
|
|
adult = True
|
|
|
|
|
|
|
|
|
2016-05-06 23:50:10 +00:00
|
|
|
class TheNoob(_WordPressScraper):
|
|
|
|
url = 'http://thenoobcomic.com/'
|
|
|
|
stripUrl = url + 'comic/%s/'
|
2013-04-10 21:57:09 +00:00
|
|
|
firstStripUrl = stripUrl % '1'
|
2016-05-06 23:50:10 +00:00
|
|
|
help = 'Index format: n (unpadded)'
|
2012-06-20 19:58:13 +00:00
|
|
|
|
|
|
|
|
2019-07-04 10:18:39 +00:00
|
|
|
class TheOldVictorian(_ParserScraper):
|
|
|
|
url = 'http://theoldvictorianwebcomic.com/'
|
|
|
|
stripUrl = url + 'comic/%s/'
|
|
|
|
firstStripUrl = stripUrl % 'the-old-victorian-cover'
|
|
|
|
imageSearch = '//div[@id="comic"]//img'
|
|
|
|
prevSearch = '//a[contains(@class, "comic-nav-previous")]'
|
|
|
|
|
|
|
|
def namer(self, imageUrl, pageUrl):
|
|
|
|
filename = imageUrl.rsplit('/', 1)[-1].replace('_', '-')
|
|
|
|
filename = filename.replace('TOV00', 'TOV-00')
|
|
|
|
if filename.replace('oldvic', '')[0].isdigit():
|
|
|
|
filename = filename.replace('oldvic', 'TOV-00')
|
|
|
|
if 'TOV-000' in filename and len(filename) > 12:
|
|
|
|
filename = filename[:8] + '-' + filename[8:]
|
|
|
|
return filename
|
|
|
|
|
|
|
|
|
2020-03-18 06:40:47 +00:00
|
|
|
class TheOrderOfTheStick(_ParserScraper):
|
|
|
|
url = 'https://www.giantitp.com/'
|
2016-04-12 21:11:39 +00:00
|
|
|
stripUrl = url + 'comics/oots%s.html'
|
2013-04-10 21:57:09 +00:00
|
|
|
firstStripUrl = stripUrl % '0001'
|
2020-03-18 06:40:47 +00:00
|
|
|
imageSearch = '//img[contains(@src, "/comics/oots/")]'
|
|
|
|
prevSearch = '//a[./img[@alt="Previous Comic"]]'
|
|
|
|
latestSearch = '//a[@class="SideBar" and contains(@href, "/comics/oots")]'
|
2012-06-20 19:58:13 +00:00
|
|
|
help = 'Index format: n (unpadded)'
|
2016-04-13 18:01:51 +00:00
|
|
|
starter = indirectStarter
|
2012-06-20 19:58:13 +00:00
|
|
|
|
2016-04-21 06:20:49 +00:00
|
|
|
def namer(self, image_url, page_url):
|
|
|
|
return page_url.rsplit('/', 1)[-1][:-5]
|
2012-06-20 19:58:13 +00:00
|
|
|
|
|
|
|
|
2019-06-30 17:46:39 +00:00
|
|
|
class TheRockCocks(_BasicScraper):
|
|
|
|
url = 'http://rockcocks.slipshine.net/'
|
|
|
|
rurl = escape(url)
|
2019-12-31 00:44:19 +00:00
|
|
|
stripUrl = url + 'comic/%s'
|
2019-06-30 17:46:39 +00:00
|
|
|
firstStripUrl = stripUrl % "page-1-nsfw-track-1-start"
|
|
|
|
imageSearch = compile(tagre("img", "src", r'(%scomics/[^"]+)' % rurl, after='id="cc-comic"'))
|
|
|
|
prevSearch = compile(tagre("a", "href", r'(%scomic/[^"]+)' % rurl, after='rel="prev"'))
|
|
|
|
adult = True
|
|
|
|
|
|
|
|
|
2017-05-21 22:30:31 +00:00
|
|
|
class TheWhiteboard(_ParserScraper):
|
2019-06-13 06:42:12 +00:00
|
|
|
BROKEN_PAGE_MIDDLE = compile(r'</body></html>\n<')
|
2016-03-31 21:13:54 +00:00
|
|
|
url = 'http://www.the-whiteboard.com/'
|
2019-06-13 06:42:12 +00:00
|
|
|
stripUrl = url + 'auto%s.html'
|
|
|
|
firstStripUrl = stripUrl % 'wb001'
|
|
|
|
imageSearch = '//img[contains(@src, "auto")]'
|
|
|
|
prevSearch = '//a[.//img[contains(@src, "previous")]]'
|
2017-05-21 22:30:31 +00:00
|
|
|
|
|
|
|
def _parse_page(self, data):
|
2019-06-13 06:42:12 +00:00
|
|
|
# Ugly hack to fix broken HTML
|
2017-05-21 22:30:31 +00:00
|
|
|
data = self.BROKEN_PAGE_MIDDLE.sub('<', data)
|
|
|
|
return super(TheWhiteboard, self)._parse_page(data)
|
2016-03-31 21:13:54 +00:00
|
|
|
|
2020-03-18 07:00:33 +00:00
|
|
|
def imageUrlModifier(self, url, data):
|
|
|
|
return self.url + url
|
|
|
|
|
|
|
|
def link_modifier(self, fromurl, tourl):
|
|
|
|
return self.url + tourl
|
|
|
|
|
2016-03-31 21:13:54 +00:00
|
|
|
|
2016-05-06 23:50:10 +00:00
|
|
|
class TheWotch(_WordPressScraper):
|
2013-02-04 20:00:26 +00:00
|
|
|
url = 'http://www.thewotch.com/'
|
2016-05-06 23:50:10 +00:00
|
|
|
firstStripUrl = url + '?comic=enter-the-wotch'
|
2012-06-20 19:58:13 +00:00
|
|
|
|
|
|
|
|
2013-02-06 21:08:36 +00:00
|
|
|
class ThisIsIndexed(_BasicScraper):
|
|
|
|
url = 'http://thisisindexed.com/'
|
2013-04-10 16:19:11 +00:00
|
|
|
rurl = escape(url)
|
2013-02-06 21:08:36 +00:00
|
|
|
stripUrl = url + 'page/%s'
|
2013-04-10 16:19:11 +00:00
|
|
|
imageSearch = compile(tagre("img", "src", r'(%swp-content/uploads/\d+/\d+/card[^"]+)' % rurl))
|
2013-02-06 21:08:36 +00:00
|
|
|
multipleImagesPerStrip = True
|
|
|
|
prevSearch = compile(tagre("div", "class", "nav-previous") +
|
2013-04-11 16:27:43 +00:00
|
|
|
tagre("a", "href", r'(%spage/\d+/)[^"]*' % rurl))
|
2013-02-06 21:08:36 +00:00
|
|
|
help = 'Index format: number'
|
|
|
|
|
|
|
|
|
2016-05-06 23:50:10 +00:00
|
|
|
class ThreePanelSoul(_ComicControlScraper):
|
2016-03-31 21:13:54 +00:00
|
|
|
url = 'http://threepanelsoul.com/'
|
2016-05-06 23:50:10 +00:00
|
|
|
firstStripUrl = url + 'comic/a-test-comic'
|
2016-03-31 21:13:54 +00:00
|
|
|
|
|
|
|
|
2019-07-14 09:14:15 +00:00
|
|
|
class TinyDickAdventures(_ParserScraper):
|
|
|
|
url = 'https://www.lfg.co/'
|
|
|
|
stripUrl = url + 'tda/strip/%s/'
|
|
|
|
firstStripUrl = stripUrl % '1'
|
|
|
|
imageSearch = '//div[@id="comic-img"]//img'
|
|
|
|
prevSearch = '//a[@class="comic-nav-prev"]'
|
|
|
|
latestSearch = '//div[@id="feature-tda-footer"]/a[contains(@href, "tda/strip/")]'
|
|
|
|
starter = indirectStarter
|
|
|
|
|
|
|
|
def namer(self, imageUrl, pageUrl):
|
|
|
|
page = pageUrl.rstrip('/').rsplit('/', 1)[-1]
|
|
|
|
ext = imageUrl.rsplit('.', 1)[-1]
|
|
|
|
return page + '.' + ext
|
|
|
|
|
|
|
|
|
2016-05-06 23:50:10 +00:00
|
|
|
class ToonHole(_WordPressScraper):
|
2016-05-16 21:16:29 +00:00
|
|
|
url = 'http://toonhole.com/'
|
2016-10-31 05:57:47 +00:00
|
|
|
firstStripUrl = url + 'comic/toon-hole-coming-soon-2010/'
|
2013-02-06 21:08:36 +00:00
|
|
|
|
2014-02-10 20:58:09 +00:00
|
|
|
def shouldSkipUrl(self, url, data):
|
2016-10-31 05:57:47 +00:00
|
|
|
return url in (self.url + "comic/if-game-of-thrones-was-animated/",)
|
2013-03-07 17:22:24 +00:00
|
|
|
|
2013-02-06 21:08:36 +00:00
|
|
|
|
2019-06-30 01:07:30 +00:00
|
|
|
class TracesOfThePast(_WPNaviIn):
|
|
|
|
baseUrl = 'http://rickgriffinstudios.com/'
|
|
|
|
url = baseUrl + 'in-the-new-age/'
|
|
|
|
stripUrl = baseUrl + 'comic-post/%s/'
|
|
|
|
firstStripUrl = stripUrl % 'totp-page-1'
|
|
|
|
latestSearch = '//a[contains(@title, "Permanent Link")]'
|
|
|
|
starter = indirectStarter
|
|
|
|
|
|
|
|
|
|
|
|
class TracesOfThePastNSFW(_WPNaviIn):
|
|
|
|
name = 'TracesOfThePast/NSFW'
|
|
|
|
baseUrl = 'http://rickgriffinstudios.com/'
|
|
|
|
url = baseUrl + 'in-the-new-age/'
|
|
|
|
stripUrl = baseUrl + 'comic-post/%s/'
|
|
|
|
firstStripUrl = stripUrl % 'totp-page-1-nsfw'
|
|
|
|
latestSearch = '//a[contains(@title, "NSFW")]'
|
|
|
|
starter = indirectStarter
|
|
|
|
adult = True
|
|
|
|
|
|
|
|
|
2019-04-17 18:28:17 +00:00
|
|
|
class TrippingOverYou(_BasicScraper):
|
|
|
|
url = 'http://www.trippingoveryou.com/'
|
|
|
|
stripUrl = url + 'comic/%s'
|
|
|
|
firstStripUrl = stripUrl % 'wiggle-room'
|
|
|
|
imageSearch = compile(tagre("img", "src", r'([^"]+/comics/[^"]+)'))
|
|
|
|
prevSearch = compile(r'<a class="cc-prev" rel="prev" href="(.+?)">')
|
|
|
|
help = 'Index format: stripname'
|
|
|
|
|
|
|
|
|
2017-04-15 23:11:30 +00:00
|
|
|
class TumbleDryComics(_WordPressScraper):
|
2019-12-31 00:44:19 +00:00
|
|
|
url = 'https://www.tumbledrycomics.com/'
|
2017-04-15 23:28:17 +00:00
|
|
|
stripUrl = url + 'comic/%s/'
|
|
|
|
firstStripUrl = stripUrl % 'we-need-to-get-high-jpg'
|
2017-04-15 23:11:30 +00:00
|
|
|
textSearch = '//div[@id="comic"]//img/@alt'
|
|
|
|
multipleImagesPerStrip = True
|
|
|
|
adult = True
|
|
|
|
help = 'Index format: name'
|
|
|
|
|
|
|
|
def namer(self, image_url, page_url):
|
|
|
|
# Most images have the date they were posted in the filename
|
|
|
|
# For those that don't we can get the month and year from the image url
|
2017-04-15 23:28:17 +00:00
|
|
|
parts = image_url.rsplit('/', 3)
|
|
|
|
year = parts[1]
|
|
|
|
month = parts[2]
|
|
|
|
filename = parts[3]
|
2017-04-15 23:11:30 +00:00
|
|
|
if not filename.startswith(year):
|
|
|
|
filename = year + "-" + month + "-" + filename
|
|
|
|
return filename
|
|
|
|
|
|
|
|
|
2019-07-14 06:06:31 +00:00
|
|
|
class Turnoff(_ParserScraper):
|
|
|
|
name = 'turnoff'
|
|
|
|
url = 'https://turnoff.us/'
|
2020-07-31 20:56:30 +00:00
|
|
|
imageSearch = '//article[d:class("post-content")]//img'
|
|
|
|
prevSearch = '//div[d:class("prev")]//a'
|
2019-07-14 06:06:31 +00:00
|
|
|
stripUrl = url + 'geek/%s'
|
|
|
|
firstStripUrl = stripUrl % 'tcp-buddies'
|
|
|
|
multipleImagesPerStrip = True
|
|
|
|
|
|
|
|
@cached_property
|
|
|
|
def comics_order(self):
|
|
|
|
# Neither the images nor the pages contain information about dates or indices.
|
|
|
|
# However we can extract the order of the images from the JavaScript.
|
|
|
|
html = self.session.get(self.url).text
|
|
|
|
list_regex = compile(r"""^\s*"/geek/(.*)",\s*$""", flags=MULTILINE)
|
|
|
|
return list(reversed(list_regex.findall(html)))
|
|
|
|
|
|
|
|
def namer(self, image_url, page_url):
|
|
|
|
comic_name = page_url.split('/')[-1]
|
|
|
|
try:
|
|
|
|
index = self.comics_order.index(comic_name) + 1
|
|
|
|
except ValueError:
|
|
|
|
index = len(self.comics_order)
|
|
|
|
file_name = image_url.split('/')[-1]
|
|
|
|
return "%03d-%s" % (index, file_name)
|
|
|
|
|
|
|
|
|
2019-07-13 06:31:36 +00:00
|
|
|
class TwinDragons(_WordPressScraper):
|
|
|
|
url = 'http://www.twindragonscomic.com/'
|
|
|
|
stripUrl = url + 'comic/%s/'
|
|
|
|
firstStripUrl = stripUrl % 'the-beginning'
|
|
|
|
multipleImagesPerStrip = True
|
|
|
|
|
|
|
|
|
2013-04-25 19:23:31 +00:00
|
|
|
class TwoGuysAndGuy(_BasicScraper):
|
|
|
|
url = 'http://www.twogag.com/'
|
|
|
|
rurl = escape(url)
|
|
|
|
stripUrl = url + 'archives/%s'
|
|
|
|
firstStripUrl = stripUrl % '4'
|
|
|
|
imageSearch = compile(tagre('img', 'src', r'(%scomics/\d{4}-\d{2}-\d{2}[^"]*)' % rurl))
|
2016-03-31 21:13:54 +00:00
|
|
|
prevSearch = compile(tagre('a', 'href', r'(%sarchives/\d+)' % rurl,
|
|
|
|
after='title="Previous"'))
|
2013-04-25 19:23:31 +00:00
|
|
|
help = 'Index format: number'
|
|
|
|
adult = True
|
2016-03-31 21:13:54 +00:00
|
|
|
|
|
|
|
|
2016-10-13 22:14:53 +00:00
|
|
|
class Twokinds(_ParserScraper):
|
|
|
|
url = 'http://twokinds.keenspot.com/'
|
2017-04-15 23:06:41 +00:00
|
|
|
stripUrl = url + 'comic/%s/'
|
|
|
|
firstStripUrl = stripUrl % '1'
|
2020-07-31 20:56:30 +00:00
|
|
|
imageSearch = '//article[d:class("comic")]//img'
|
|
|
|
prevSearch = '//a[d:class("navprev")]'
|
2017-04-15 23:06:41 +00:00
|
|
|
help = 'Index format: n (unpadded)'
|
2016-10-13 22:14:53 +00:00
|
|
|
|
|
|
|
|
2019-11-04 06:28:53 +00:00
|
|
|
class TwokindsSketches(Twokinds):
|
|
|
|
name = 'Twokinds/Sketches'
|
|
|
|
imageSearch = '//article[contains(@class, "comic")]/a'
|
|
|
|
|
|
|
|
|
2016-03-31 21:13:54 +00:00
|
|
|
class TwoLumps(_BasicScraper):
|
|
|
|
url = 'http://www.twolumps.net/'
|
|
|
|
stripUrl = url + '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'
|