From c362f39e3a0b6962ea09c7ae082c154d35a905a6 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Thu, 7 May 2020 23:31:44 -0700 Subject: [PATCH 01/20] Fix FurryExperience --- dosagelib/plugins/comicfury.py | 1 + dosagelib/plugins/old.py | 1 + dosagelib/plugins/smackjeeves.py | 1 - 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dosagelib/plugins/comicfury.py b/dosagelib/plugins/comicfury.py index f7134a36f..f45ad5105 100644 --- a/dosagelib/plugins/comicfury.py +++ b/dosagelib/plugins/comicfury.py @@ -445,6 +445,7 @@ class ComicFury(_ParserScraper): cls('FrostFire', 'frostfire'), cls('FullmetalBrothers', 'fullmetalbrothers', 'es'), cls('FurAndN3rdy', 'furnerdy'), + cls('FurryExperience', 'furryexperience'), cls('Fusion', 'fusion'), cls('FutureRegrets', 'futureregrets'), cls('FuzzballAndScuzzball', 'fuzzballandscuzzball'), diff --git a/dosagelib/plugins/old.py b/dosagelib/plugins/old.py index 070146ac4..8140bf778 100644 --- a/dosagelib/plugins/old.py +++ b/dosagelib/plugins/old.py @@ -753,6 +753,7 @@ class Renamed(Scraper): cls('ZebraGirl', 'ComicFury/ZebraGirl'), # Renamed in 3.0 + cls('SmackJeeves/FurryExperience', 'ComicFury/FurryExperience'), cls('SmackJeeves/GrowingTroubles', 'ComicFury/GrowingTroubles'), cls('StudioKhimera/Draconia', 'Draconia'), ) diff --git a/dosagelib/plugins/smackjeeves.py b/dosagelib/plugins/smackjeeves.py index a490c5e5c..ca9a20186 100644 --- a/dosagelib/plugins/smackjeeves.py +++ b/dosagelib/plugins/smackjeeves.py @@ -240,7 +240,6 @@ class SmackJeeves(_ParserScraper): cls('FromnowonImagirl', 99018), cls('FruitloopAndMrDownbeat', 82798), cls('FullSpectrumTherapy', 156285), - cls('FurryExperience', 62354), cls('GamerCafe', 138841), cls('GamesPeoplePlayUpdatedWeekly', 72207), cls('GardenofHearts', 106504), From 4726497c06b842ac77675a9975b88b99c19e536b Mon Sep 17 00:00:00 2001 From: Techwolf Date: Thu, 7 May 2020 23:47:27 -0700 Subject: [PATCH 02/20] Update WebToons comics --- dosagelib/plugins/webtoons.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/dosagelib/plugins/webtoons.py b/dosagelib/plugins/webtoons.py index 61c902eff..e71603b2c 100644 --- a/dosagelib/plugins/webtoons.py +++ b/dosagelib/plugins/webtoons.py @@ -82,6 +82,7 @@ class WebToons(_ParserScraper): cls('Backchannel', 'super-hero/backchannel', 1456), cls('BadSigns', 'comedy/bad-signs', 1623), cls('Bastard', 'thriller/bastard', 485), + cls('BeforeWeKnewIt', 'romance/before-we-knew-it', 1972), cls('BehindTheGIFs', 'comedy/behind-the-gifs', 658), cls('BigJo', 'romance/big-jo', 854), cls('BiteMe', 'thriller/bite-me', 1019), @@ -106,6 +107,7 @@ class WebToons(_ParserScraper): cls('CherryBlossoms', 'romance/cherry-blossoms', 1005), cls('Chiller', 'thriller/chiller', 536), cls('ChocoLatte', 'romance/choco-latte', 1691), + cls('CityOfBlank', 'sf/city-of-blank', 1895), cls('CityOfWalls', 'drama/city-of-wall', 505), cls('ClusterFudge', 'slice-of-life/cluster-fudge', 355), cls('CodeAdam', 'action/code-adam', 1657), @@ -163,6 +165,7 @@ class WebToons(_ParserScraper): cls('Gepetto', 'sf/gepetto', 81), cls('GhostsAmongTheWildFlowers', 'fantasy/ghosts-over-wild-flowers', 718), cls('GhostTeller', 'horror/ghost-teller', 1307), + cls('GhostTheater', 'drama/ghost-theater', 1911), cls('GhostWife', 'romance/ghost-wife', 1471), cls('GirlsHaveABlog', 'slice-of-life/girls-have-a-blog', 1052), cls('GirlsOfTheWilds', 'action/girls-of-the-wilds', 93), @@ -185,8 +188,10 @@ class WebToons(_ParserScraper): cls('Hooky', 'fantasy/hooky', 425), cls('HoovesOfDeath', 'fantasy/hooves-of-death', 1535), cls('HouseOfStars', 'fantasy/house-of-stars', 1620), + cls('HowToBecomeADragon', 'fantasy/how-to-become-a-dragon', 1973), cls('HowToLove', 'slice-of-life/how-to-love', 472), cls('IDontWantThisKindOfHero', 'super-hero/i-dont-want-this-kind-of-hero', 98), + cls('IF', 'action/if', 1925), cls('IllusionsOfAdulting', 'slice-of-life/illusions-of-adulting', 922), cls('IllustratedInternet', 'comedy/illustrated-internet', 750), cls('ILoveYoo', 'drama/i-love-yoo', 986), @@ -194,12 +199,15 @@ class WebToons(_ParserScraper): cls('ImTheGrimReaper', 'supernatural/im-the-grim-reaper', 1697), cls('Inarime', 'super-hero/inarime', 675), cls('InternetExplorer', 'challenge/internet-explorer', 219164), + cls('InTheBleakMidwinter', 'sf/in-the-bleak-midwinter', 1946), + cls('ItsMine', 'drama/its-mine', 2010), cls('JackieRose', 'supernatural/jackie-rose', 613), cls('JingleJungle', 'slice-of-life/jingle-jungle', 282), cls('JustAskYuli', 'slice-of-life/just-ask-yuli', 402), cls('JustForKicks', 'slice-of-life/just-for-kicks', 1152), cls('JustPancakes', 'comedy/just-pancakes', 1651), cls('KidsAreAllRight', 'drama/kids-are-all-right', 283), + cls('Killstagram', 'thriller/killstagram', 1971), cls('KindOfConfidential', 'romance/kind-of-confidential', 663), cls('KindOfLove', 'slice-of-life/kind-of-love', 1850), cls('KnightRun', 'sf/knight-run', 67), @@ -216,9 +224,11 @@ class WebToons(_ParserScraper): cls('LittleMatchaGirl', 'fantasy/little-matcha-girl', 1665), cls('LiveForever', 'thriller/live-forever', 1312), cls('LiveWithYourself', 'comedy/live-with-yourself', 919), + cls('Lone', 'fantasy/lone', 1929), cls('Lookism', 'drama/lookism', 1049), cls('LoreOlympus', 'romance/lore-olympus', 1320), cls('Lorna', 'slice-of-life/lorna', 1284), + cls('LostInTranslation', 'drama/lost-in-translation', 1882), cls('LoveAdviceFromTheGreatDukeOfHell', 'comedy/love-advice', 1498), cls('Lozolz', 'tiptoon/lozolz', 1268), cls('LUFF', 'romance/luff', 1489), @@ -228,6 +238,8 @@ class WebToons(_ParserScraper): cls('MageAndDemonQueen', 'comedy/mage-and-demon-queen', 1438), cls('Magical12thGraders', 'super-hero/magical-12th-graders', 90), cls('Magician', 'fantasy/magician', 70), + cls('MagicSodaPop', 'fantasy/magic-soda-pop', 1947), + cls('MarryMe', 'romance/marry-me', 1951), cls('MatchmakerHero', 'sf/matchmaker-hero', 1569), cls('MelvinasTherapy', 'horror/melvinas-therapy', 1021), cls('MeowMan', 'comedy/meow-man', 1677), @@ -317,12 +329,14 @@ class WebToons(_ParserScraper): cls('SpiritFingers', 'drama/spirit-fingers', 1577), cls('Spirits', 'fantasy/spirits-re', 1348), cls('STARCROSS', 'super-hero/star-cross', 1599), + cls('StayingHealthyTogether', 'tiptoon/staying-healthy-together', 1963), cls('StrawberrySeafoam', 'fantasy/strawberry-seafoam', 1248), cls('SubtleDisaster', 'drama/subtle-disaster', 350), cls('SubZero', 'romance/subzero', 1468), cls('SuperSecret', 'romance/super-secret', 666), cls('SupersonicGirl', 'super-hero/supersonic-girl', 633), cls('SweetHome', 'thriller/sweethome', 1285), + cls('SwimmingLessonsForAMermaid', 'romance/swimming-lessons-for-a-mermaid', 1912), cls('SwordInterval', 'supernatural/sword-interval', 486), cls('TalesOfTheUnusual', 'horror/tales-of-the-unusual', 68), cls('TheBadguys', 'super-hero/the-bad-guys', 701), @@ -331,6 +345,7 @@ class WebToons(_ParserScraper): cls('TheCroaking', 'fantasy/the-croaking', 1494), cls('TheDaneMen', 'comedy/the-danemen', 395), cls('TheDevilIsAHandsomeMan', 'drama/the-devil-is-a-handsome-man', 1311), + cls('TheDoctorsAreOut', 'romance/the-doctors-are-out', 1910), cls('TheFeverKing', 'super-hero/the-fever-king', 1659), cls('TheFourOfThem', 'drama/the-four-of-them', 1524), cls('TheGamer', 'action/the-gamer', 88), @@ -358,6 +373,7 @@ class WebToons(_ParserScraper): cls('ThirdShiftSociety', 'supernatural/third-shift-society', 1703), cls('Thornstone', 'fantasy/thornstone', 1612), cls('TickleTown', 'comedy/tickle-town', 428), + cls('ToasterDude', 'comedy/toaster-dude', 1983), cls('TowerOfGod', 'fantasy/tower-of-god', 95), cls('TrailerParkWarlock', 'comedy/trailer-park-warlock', 1512), cls('TrashBird', 'comedy/trash-bird', 473), @@ -381,6 +397,7 @@ class WebToons(_ParserScraper): cls('WarningLabel', 'romance/warning-label', 1051), cls('Watermelon', 'fantasy/watermelon', 1435), cls('WeakHero', 'action/weakhero', 1726), + cls('WEBTOONGREENLiGHT', 'action/webtoon-greenlight', 1988), cls('WestwoodVibrato', 'drama/westwood-vibrato', 537), cls('WhereTangentsMeet', 'romance/where-tangents-meet', 421), cls('WindBreaker', 'sports/wind-breaker', 372), From de3b396d117f7cdc983ea130e116d3a49d3fbb95 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Wed, 20 May 2020 23:08:43 -0700 Subject: [PATCH 03/20] Add RayFox --- dosagelib/plugins/r.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/dosagelib/plugins/r.py b/dosagelib/plugins/r.py index e74830e4f..a883352d5 100644 --- a/dosagelib/plugins/r.py +++ b/dosagelib/plugins/r.py @@ -9,13 +9,36 @@ from urllib.parse import urljoin from ..helpers import bounceStarter from ..scraper import _BasicScraper, _ParserScraper from ..util import tagre -from .common import _WordPressScraper, _WPWebcomic +from .common import _WordPressScraper, _WPNavi, _WPWebcomic class RalfTheDestroyer(_WordPressScraper): url = 'http://ralfthedestroyer.com/' +class RayFox(_WPNavi): + url = 'https://www.rayfoxthecomic.com/' + stripUrl = url + 'comic/%s/' + firstStripUrl = stripUrl % 'not-a-super-hero/it-begins' + + def namer(self, imageUrl, pageUrl): + filename = imageUrl.rsplit('/', 1)[-1].split('.', 1)[0] + ext = imageUrl.rsplit('.', 1)[-1] + if filename == 'j': + filename = 'RF_E3_P52' + elif filename == '46' or filename == '55' or filename == '61': + filename = 'RF_E3_P' + filename + elif 'chapter-3-cover' in filename: + filename = 'RF_E3_Cover' + elif 'Cover2' in filename: + filename = 'RF_E1_' + filename + elif 'Volume-1-Cover' in filename: + filename = filename.replace('Ray-Fox-Volume-1-', 'RF_E1_') + elif filename[0] == '0': + filename = 'RF_E1_P' + filename + return filename + '.' + ext + + class RaynaOnTheRiver(_WordPressScraper): url = 'http://www.catomix.com/rayna/' firstStripUrl = url + 'archives/comic/teaser-poster' From c29bd2f06997f5f066320954786ddc16d97a6dda Mon Sep 17 00:00:00 2001 From: Techwolf Date: Fri, 22 May 2020 20:14:24 -0700 Subject: [PATCH 04/20] Add ProjectFuture/Emily --- dosagelib/plugins/projectfuture.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dosagelib/plugins/projectfuture.py b/dosagelib/plugins/projectfuture.py index a5223e644..6a7853bb9 100644 --- a/dosagelib/plugins/projectfuture.py +++ b/dosagelib/plugins/projectfuture.py @@ -30,6 +30,7 @@ class ProjectFuture(_ParserScraper): cls('BookOfTenets', 'tenets', '01', last='45'), cls('CriticalMass', 'criticalmass', 'cover', last='26'), cls('DarkLordRising', 'darklord', '01-00', last='10-10'), + cls('Emily', 'emily', '01-00'), cls('FishingTrip', 'fishing', '01-00'), cls('HeadsYouLose', 'heads', '00-01', last='07-12'), cls('NiallsStory', 'niall', '00'), From 9764b8210178d4007d7361841e5e21b86da750bb Mon Sep 17 00:00:00 2001 From: Techwolf Date: Sat, 23 May 2020 18:17:42 -0700 Subject: [PATCH 05/20] Fix Moonlace and Bethellium --- dosagelib/plugins/b.py | 3 ++- dosagelib/plugins/m.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dosagelib/plugins/b.py b/dosagelib/plugins/b.py index e71e4c08c..1aa42c91f 100644 --- a/dosagelib/plugins/b.py +++ b/dosagelib/plugins/b.py @@ -101,8 +101,9 @@ class Beetlebum(_BasicScraper): class Bethellium(_WPWebcomic): stripUrl = 'http://dbcomics.darkblueworkshop.com/bethellium/%s/' - firstStripUrl = stripUrl % 'chapter-1/webcomic-bethellium-chapter-1-cover' + firstStripUrl = stripUrl % 'chapter-1/cover' url = firstStripUrl + latestSearch = '//main' + _WPWebcomic.latestSearch starter = indirectStarter def getPrevUrl(self, url, data): diff --git a/dosagelib/plugins/m.py b/dosagelib/plugins/m.py index 5f530c59a..b11bb8579 100644 --- a/dosagelib/plugins/m.py +++ b/dosagelib/plugins/m.py @@ -177,11 +177,12 @@ class Moonlace(_WPWebcomic): stripUrl = 'http://dbcomics.darkblueworkshop.com/moonlace/%s/' firstStripUrl = stripUrl % 'prologue/page-1' url = firstStripUrl + latestSearch = '//main' + _WPWebcomic.latestSearch adult = True def starter(self): # Set age-gate cookie - self.session.get(self.firstStripUrl + '?webcomic_birthday=1') + self.session.cookies.set('age_gate', '1', domain='darkblueworkshop.com') return indirectStarter(self) def namer(self, imageUrl, pageUrl): From 2688ffad916ddf41e8ffb58d70746d379eb44ce3 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Fri, 19 Jun 2020 00:56:16 -0700 Subject: [PATCH 06/20] Fix DesertFox --- dosagelib/plugins/d.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dosagelib/plugins/d.py b/dosagelib/plugins/d.py index 05273a324..e0ab8f977 100644 --- a/dosagelib/plugins/d.py +++ b/dosagelib/plugins/d.py @@ -133,8 +133,8 @@ class DerTodUndDasMaedchen(_ParserScraper): class DesertFox(_WPWebcomic): - url = 'https://www.desertfoxcomics.net/' - stripUrl = url + 'desertfox/comic/%s/' + url = 'https://desertfoxcomics.net/' + stripUrl = url + 'comics/%s/' firstStripUrl = stripUrl % 'origins-1' def namer(self, imageUrl, pageUrl): From 2ef6ebb6f804a9431d4c582817563a9c777bbc2e Mon Sep 17 00:00:00 2001 From: Techwolf Date: Fri, 19 Jun 2020 21:34:49 -0700 Subject: [PATCH 07/20] Fix Nightshift and StarfireAgency --- dosagelib/plugins/n.py | 32 +++++++++++++++----------------- dosagelib/plugins/s.py | 40 ++++++++++++++++++++++------------------ 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/dosagelib/plugins/n.py b/dosagelib/plugins/n.py index 7c86ca0df..2587f4efc 100644 --- a/dosagelib/plugins/n.py +++ b/dosagelib/plugins/n.py @@ -102,31 +102,29 @@ class Nicky510(_WPNavi): endOfLife = True -class Nightshift(_ParserScraper): +class Nightshift(_WPWebcomic): url = 'https://poecatcomix.com/nightshift-static/' - stripUrl = 'https://poecatcomix.com/comic/%s/' - firstStripUrl = stripUrl % 'ns1-page-cover' - imageSearch = '//div[@class="mangapress-media-img"]/img' - prevSearch = '//li[@class="link-prev"]/a' - latestSearch = '//li[@class="link-last"]/a/@href' + stripUrl = 'https://poecatcomix.com/nightshift/%s/' + firstStripUrl = stripUrl % 'ns-cover' + imageSearch = '//div[contains(@class, "webcomic-media")]//img' adult = True def starter(self): - # Build list of chapters for navigation + # Build list of chapters for naming indexPage = self.getPage(self.url) self.chapters = indexPage.xpath('//a[./img[contains(@class, "attachment-large")]]/@href') - chapterPage = self.getPage(self.chapters[-1]) - return chapterPage.xpath(self.latestSearch)[0] - - def getPrevUrl(self, url, data): - # Retrieve previous chapter from list - if url in self.chapters: - chapterPage = self.getPage(self.chapters[self.chapters.index(url) - 1]) - return chapterPage.xpath(self.latestSearch)[0] - return super(Nightshift, self).getPrevUrl(url, data) + latestPage = self.chapters[0] + self.chapters = self.chapters[1:] + self.currentChapter = len(self.chapters) + return latestPage def namer(self, imageUrl, pageUrl): - return pageUrl.rstrip('/').rsplit('/', 1)[-1] + '.' + imageUrl.rsplit('.', 1)[-1] + page = pageUrl.rstrip('/').rsplit('/', 1)[-1] + page = page.replace('blood-brothers', 'bloodbrothers').replace('bb-2', 'bb2').replace('ns7-', 'page-') + filename = 'ns%d-%s.%s' % (self.currentChapter, page, imageUrl.rsplit('.', 1)[-1]) + if pageUrl in self.chapters: + self.currentChapter = self.currentChapter - 1 + return filename class Nimona(_ParserScraper): diff --git a/dosagelib/plugins/s.py b/dosagelib/plugins/s.py index fc4984c3f..6afe3c3b4 100644 --- a/dosagelib/plugins/s.py +++ b/dosagelib/plugins/s.py @@ -500,26 +500,30 @@ class StarCrossdDestiny(_ParserScraper): return directory + '-' + filename -class StarfireAgency(_WordPressScraper): - url = 'http://starfire.poecatcomix.com/' - stripUrl = url + 'comic/%s/' - firstStripUrl = stripUrl % 'sfa-issue-1' +class StarfireAgency(_WPWebcomic): + url = 'https://poecatcomix.com/starfire-agency-static/' + stripUrl = 'https://poecatcomix.com/starfire-agency/%s/' + firstStripUrl = stripUrl % '2005-09-201' + imageSearch = '//div[contains(@class, "webcomic-media")]//img' + + def starter(self): + # Build list of chapters for naming + indexPage = self.getPage(self.url) + self.chapters = indexPage.xpath('//a[./img[contains(@class, "attachment-large")]]/@href') + latestPage = self.chapters[0] + self.chapters = self.chapters[1:] + self.currentChapter = len(self.chapters) + return latestPage def namer(self, imageUrl, pageUrl): - # Prepend chapter title to page filenames - page = self.getPage(pageUrl) - chapter = page.xpath('//div[@class="comic-chapter"]/a') - if len(chapter) > 0: - chapter = chapter[0].text.replace(' ', '-').lower() - else: - chapter = 'chapter-1' - - # Fix inconsistent filenames - filename = imageUrl.rsplit('/', 1)[-1] - if 'cover' not in filename.lower(): - filename = filename.replace('SFA', 'Page') - return chapter + '_' + filename - + page = pageUrl.rstrip('/').rsplit('/', 1)[-1] + page = page.replace('3page00', 'cover3').replace('6429', 'cover7').replace('sfa-6-5-cover', 'cover6') + page = page.replace('sfa01', 'page01').replace('sfa03', 'page03').replace('sfa04', 'page04') + page = page.replace('sfa24', 'page24').replace('sfa07', 'page') + filename = 'sfa%d-%s.%s' % (self.currentChapter, page, imageUrl.rsplit('.', 1)[-1]) + if pageUrl in self.chapters: + self.currentChapter = self.currentChapter - 1 + return filename class StarTrip(_ComicControlScraper): url = 'https://www.startripcomic.com/' From a191f7e909ba8e669db884081a2848ea026ca064 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Sat, 20 Jun 2020 23:10:40 -0700 Subject: [PATCH 08/20] Add SoloLeveling --- dosagelib/plugins/l.py | 2 +- dosagelib/plugins/s.py | 50 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/dosagelib/plugins/l.py b/dosagelib/plugins/l.py index b82de963a..c42baf8aa 100644 --- a/dosagelib/plugins/l.py +++ b/dosagelib/plugins/l.py @@ -116,7 +116,7 @@ class LifeAsRendered(_ParserScraper): def getPrevUrl(self, url, data): # Fix broken navigation links page = url.rstrip('/').rsplit('/', 1)[-1] - if self.nav and page in self.nav: + if page in self.nav: return self.stripUrl % self.nav[page] return super(LifeAsRendered, self).getPrevUrl(url, data) diff --git a/dosagelib/plugins/s.py b/dosagelib/plugins/s.py index 6afe3c3b4..dc57f4434 100644 --- a/dosagelib/plugins/s.py +++ b/dosagelib/plugins/s.py @@ -335,6 +335,56 @@ class SodiumEyes(_WordPressScraper): url = 'http://sodiumeyes.com/' +class SoloLeveling(_ParserScraper): + url = 'https://w1.sololeveling.net/' + stripUrl = url + 'manga/solo-leveling-chapter-%s/' + firstStripUrl = stripUrl % '1' + imageSearch = '//div[@class="img_container"]//img' + prevSearch = '//a[@rel="prev"]' + latestSearch = '//table[@class="chap_tab"]//a' + starter = indirectStarter + multipleImagesPerStrip = True + imageUrlFixes = { + '94-0_5dd574efda419/28.': '94-0_5dd574efda419/28a.', + '92-0_5dc2fcb9ed562/22.': '92-0_5dc2fcb9ed562/22s.', + '91-0_5db9b881ac2f0/20k.': '91-0_5db9b881ac2f0/20l.', + '91-0_5db9b881ac2f0/23.': '91-0_5db9b881ac2f0/23a.', + '90-0_5db08467ca2b1/07.': '90-0_5db08467ca2b1/07a.', + '90-0_5db08467ca2b1/09.': '90-0_5db08467ca2b1/09a.', + '90-0_5db08467ca2b1/13.': '90-0_5db08467ca2b1/13a.', + '90-0_5db08467ca2b1/14.': '90-0_5db08467ca2b1/14a.', + '90-0_5db08467ca2b1/21.': '90-0_5db08467ca2b1/21a.', + '90-0_5db08467ca2b1/22.': '90-0_5db08467ca2b1/22a.', + '88-0_5d9e0dedb942e/03.': '88-0_5d9e0dedb942e/03b.', + '88-0_5d9e0dedb942e/05.': '88-0_5d9e0dedb942e/05a.', + '88-0_5d9e0dedb942e/30.': '88-0_5d9e0dedb942e/30a.', + '87-0_5d94cdebd9df7/01a.': '87-0_5d94cdebd9df7/01c.' + } + + def imageUrlModifier(self, imageUrl, data): + if 'url=' in imageUrl: + imageUrl = imageUrl.split('url=')[1].split('&')[0] + for fix in self.imageUrlFixes: + imageUrl = imageUrl.replace(fix, self.imageUrlFixes[fix]) + return imageUrl + + def fetchUrls(self, url, data, urlSearch): + # Save link order for position-based filenames + self.imageUrls = super(SoloLeveling, self).fetchUrls(url, data, urlSearch) + self.imageUrls = [self.imageUrlModifier(x, data) for x in self.imageUrls] + return self.imageUrls + + def getPrevUrl(self, url, data): + return self.stripUrl % str(int(url.strip('/').rsplit('-', 1)[-1]) - 1) + + def namer(self, imageUrl, pageUrl): + # Construct filename from episode number and image position on page + episodeNum = pageUrl.strip('/').rsplit('-', 1)[-1] + imageNum = self.imageUrls.index(imageUrl) + imageExt = imageUrl.rsplit('.', 1)[-1] + return "%s-%03d.%s" % (episodeNum, imageNum, imageExt) + + class SomethingPositive(_ParserScraper): url = 'https://www.somethingpositive.net/' stripUrl = url + 'sp%s.shtml' From 5d274023468e04cb47eb5e2c3d900d713df2ace1 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Sat, 20 Jun 2020 23:19:02 -0700 Subject: [PATCH 09/20] Add TheNightBelongsToUs --- dosagelib/plugins/t.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/dosagelib/plugins/t.py b/dosagelib/plugins/t.py index 96a8d1417..e654b9611 100644 --- a/dosagelib/plugins/t.py +++ b/dosagelib/plugins/t.py @@ -129,6 +129,17 @@ class TheMelvinChronicles(_WordPressScraper): url = 'http://melvin.jeaniebottle.com/' +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 + + class TheNoob(_WordPressScraper): url = 'http://thenoobcomic.com/' stripUrl = url + 'comic/%s/' From 1e4c29114556278091aa4a64ad0fb7e782778c53 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Sun, 21 Jun 2020 23:42:38 -0700 Subject: [PATCH 10/20] Add ComicFury/LustAndIre --- dosagelib/plugins/comicfury.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dosagelib/plugins/comicfury.py b/dosagelib/plugins/comicfury.py index f45ad5105..cdff67be0 100644 --- a/dosagelib/plugins/comicfury.py +++ b/dosagelib/plugins/comicfury.py @@ -645,6 +645,7 @@ class ComicFury(_ParserScraper): cls('LuckyHazard', 'luckyhazard'), cls('Lukewarm', 'lukewarm'), cls('LunaStar', 'lunastar'), + cls('LustAndIre', 'lustandire', adult=True), cls('MadGirl', 'madgirl'), cls('MagicElDesencuentro', 'magiceldesencuentro', 'es'), cls('MagicTheScattering', 'magicthescattering'), From 88e54258d0d274a7030d908bcff396e1f6dead5c Mon Sep 17 00:00:00 2001 From: Techwolf Date: Thu, 25 Jun 2020 00:28:33 -0700 Subject: [PATCH 11/20] Fix StudioKhimera/UberQuest --- dosagelib/plugins/studiokhimera.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/dosagelib/plugins/studiokhimera.py b/dosagelib/plugins/studiokhimera.py index 62015cf71..267a578f4 100644 --- a/dosagelib/plugins/studiokhimera.py +++ b/dosagelib/plugins/studiokhimera.py @@ -2,6 +2,7 @@ # Copyright (C) 2019-2020 Tobias Gruetzmacher # Copyright (C) 2019-2020 Daniel Ring from ..scraper import _ParserScraper +from .common import _WordPressScraper class StudioKhimera(_ParserScraper): @@ -39,20 +40,25 @@ class StudioKhimera(_ParserScraper): return None return self.chapters[index - 1] - def namer(self, imageUrl, pageUrl): - # Fix inconsistent filenames - filename = imageUrl.rsplit('/', 1)[-1] - if 'uberquest' in pageUrl: - filename = filename.replace('Page', 'UberQuest') - filename = filename.replace('UberQuest01.', 'UberQuest001.') - filename = filename.replace('UberQuest98.', 'UberQuest098.') - filename = filename.replace('UberQuest99.', 'UberQuest099.') - return filename - @classmethod def getmodules(cls): return ( cls('Eorah', 'eorah'), cls('Mousechievous', 'mousechievous'), - cls('UberQuest', 'uberquest'), ) + + +class UberQuest(_WordPressScraper): + name = 'StudioKhimera/UberQuest' + url = 'https://uberquest.studiokhimera.com/' + stripUrl = url + 'comic/%s/' + firstStripUrl = stripUrl % 'chapter-1-cover' + + def namer(self, imageUrl, pageUrl): + # Fix inconsistent filenames + filename = imageUrl.rsplit('/', 1)[-1] + filename = filename.replace('Page', 'UberQuest') + filename = filename.replace('UberQuest01.', 'UberQuest001.') + filename = filename.replace('UberQuest98.', 'UberQuest098.') + filename = filename.replace('UberQuest99.', 'UberQuest099.') + return filename From 4a24afa652528331fb5a3d8bef9e2fec2e284080 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Tue, 7 Jul 2020 00:47:56 -0700 Subject: [PATCH 12/20] Mark OriginalLife as endOfLife --- dosagelib/plugins/o.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dosagelib/plugins/o.py b/dosagelib/plugins/o.py index 8bda5be9f..41b66ab5d 100644 --- a/dosagelib/plugins/o.py +++ b/dosagelib/plugins/o.py @@ -134,6 +134,7 @@ class OriginalLife(_ParserScraper): imageSearch = '//img[contains(@src, "/originallife/comic/")]' prevSearch = '//a[contains(text(), "Previous")]' adult = True + endOfLife = True help = 'Index format: yyyy/mm/' From 2c05fbb78fd02454d8a3304de84a66bad322da1f Mon Sep 17 00:00:00 2001 From: Techwolf Date: Thu, 16 Jul 2020 00:20:37 -0700 Subject: [PATCH 13/20] Fix Tamberlane --- dosagelib/plugins/t.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/dosagelib/plugins/t.py b/dosagelib/plugins/t.py index e654b9611..180f59817 100644 --- a/dosagelib/plugins/t.py +++ b/dosagelib/plugins/t.py @@ -28,11 +28,8 @@ class Tamberlane(_WPWebcomic): url = baseUrl + 'latest/' stripUrl = baseUrl + 'tamberlane/%s/' firstStripUrl = stripUrl % 'page-1' - - def namer(self, imageUrl, pageUrl): - # Fix inconsistent filenames - filename = imageUrl.rsplit('/', 1)[-1] - return filename.replace('ai4zCWaA', 'Page_152') + imageSearch = '//div[@id="comic-page"]/img/@src' + prevSearch = '//a[@class="previous-link"]' class TheBrads(_ParserScraper): From 103520e5860cb30c7e41d49113d13a49973d5a8a Mon Sep 17 00:00:00 2001 From: Techwolf Date: Fri, 31 Jul 2020 19:32:57 -0700 Subject: [PATCH 14/20] Add LazJonesAndTheMayfieldRegulators/SideStories --- dosagelib/plugins/l.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/dosagelib/plugins/l.py b/dosagelib/plugins/l.py index c42baf8aa..6df0225af 100644 --- a/dosagelib/plugins/l.py +++ b/dosagelib/plugins/l.py @@ -41,13 +41,22 @@ class LastResort(_WordPressScraper): class LazJonesAndTheMayfieldRegulators(_ParserScraper): - url = 'https://www.lazjones.com/' - stripUrl = url + 'comic/%s' + baseUrl = 'https://www.lazjones.com/' + url = baseUrl + 'regulators' + stripUrl = baseUrl + 'comic/%s' firstStripUrl = stripUrl % 'chapter1_00' imageSearch = '//img[contains(@src, "comic/pages/")]' prevSearch = '//a[contains(text(), "Previous")]' +class LazJonesAndTheMayfieldRegulatorsSideStories(LazJonesAndTheMayfieldRegulators): + name = 'LazJonesAndTheMayfieldRegulators/SideStories' + baseUrl = 'https://www.lazjones.com/' + url = baseUrl + 'sidestories' + stripUrl = baseUrl + 'comic/%s' + firstStripUrl = stripUrl % 'journal01' + + class LeastICouldDo(_ParserScraper): url = 'https://leasticoulddo.com/' stripUrl = url + 'comic/%s' From 711d8d5e23e7453ea342403a2c4723720deefd02 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Fri, 31 Jul 2020 22:01:23 -0700 Subject: [PATCH 15/20] Fix BlackTapestries and TheRealmOfKaerwyn --- dosagelib/plugins/comicfury.py | 2 ++ dosagelib/plugins/old.py | 2 ++ dosagelib/plugins/smackjeeves.py | 2 -- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dosagelib/plugins/comicfury.py b/dosagelib/plugins/comicfury.py index cdff67be0..af313ef52 100644 --- a/dosagelib/plugins/comicfury.py +++ b/dosagelib/plugins/comicfury.py @@ -215,6 +215,7 @@ class ComicFury(_ParserScraper): cls('BioSyte', 'biosyte'), cls('Birdman', 'birdman'), cls('BlankLifeInsertPlayerRokulily', 'blanklife'), + cls('BlackTapestries', 'blacktapestries', adult=True), cls('BlitzPhoenix', 'blinix'), cls('BlobWorld', 'blobworld'), cls('BloodLegaciesEternity', 'bloodlegacieseternity'), @@ -1040,6 +1041,7 @@ class ComicFury(_ParserScraper): cls('TheQuantumKid', 'thequantumkid'), cls('TheQuestForCoitus', 'acomicstudios'), cls('TheRathNexus', 'rath'), + cls('TheRealmOfKaerwyn', 'kaerwyn'), cls('TheRebels', 'rebels'), cls('TheRedeemers', 'theredeemers'), cls('TheRestlessDead', 'therestlessdead'), diff --git a/dosagelib/plugins/old.py b/dosagelib/plugins/old.py index 8140bf778..cba4fce9e 100644 --- a/dosagelib/plugins/old.py +++ b/dosagelib/plugins/old.py @@ -753,7 +753,9 @@ class Renamed(Scraper): cls('ZebraGirl', 'ComicFury/ZebraGirl'), # Renamed in 3.0 + cls('SmackJeeves/BlackTapestries', 'ComicFury/BlackTapestries'), cls('SmackJeeves/FurryExperience', 'ComicFury/FurryExperience'), cls('SmackJeeves/GrowingTroubles', 'ComicFury/GrowingTroubles'), + cls('SmackJeeves/TheRealmOfKaerwyn', 'ComicFury/TheRealmOfKaerwyn'), cls('StudioKhimera/Draconia', 'Draconia'), ) diff --git a/dosagelib/plugins/smackjeeves.py b/dosagelib/plugins/smackjeeves.py index ca9a20186..78d16b176 100644 --- a/dosagelib/plugins/smackjeeves.py +++ b/dosagelib/plugins/smackjeeves.py @@ -135,7 +135,6 @@ class SmackJeeves(_ParserScraper): cls('Blackdemon', 117183), cls('BlackDragon', 131654), cls('BlackFridayRule', 94517), - cls('BlackTapestries', 171490, adult=True), cls('BlackSheepcomic', 91663), cls('BleachRedux', 94169), cls('BlindandBlue', 110850), @@ -573,7 +572,6 @@ class SmackJeeves(_ParserScraper): cls('ThePremise', 118125), cls('ThePrincessAndTheGiant', 59629, endOfLife=True), cls('ThePropertyofHate', 117970), - cls('TheRealmOfKaerwyn', 156193), cls('TheReborn', 1898), cls('TheSearchForHenryJekyll', 139257), cls('TheSilverLeague', 110008), From 49c02541f4046cb7b0c6e98bdf880f8dd42c8e75 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Tue, 11 Aug 2020 19:43:06 -0700 Subject: [PATCH 16/20] Add MangaDex/KawaiiJoushiWoKomarasetai --- dosagelib/plugins/mangadex.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dosagelib/plugins/mangadex.py b/dosagelib/plugins/mangadex.py index 491f16839..527261ed9 100644 --- a/dosagelib/plugins/mangadex.py +++ b/dosagelib/plugins/mangadex.py @@ -78,6 +78,7 @@ class MangaDex(_ParserScraper): cls('HoriMiya', 6770), cls('InterspeciesReviewers', 20796), cls('JingaiNoYomeToIchaIchaSuru', 22651), + cls('KawaiiJoushiWoKomarasetai', 17910), cls('KanojoOkarishimasu', 22151), cls('ModernMoGal', 30308), cls('OMaidensinYourSavageSeason', 22030), From 70c030ca326b4d442b4c7dce6137d9d2a9279918 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Thu, 13 Aug 2020 21:55:54 -0700 Subject: [PATCH 17/20] Add MangaDex/OokamiShounenWaKyouMoUsoOKasaneru --- dosagelib/plugins/mangadex.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dosagelib/plugins/mangadex.py b/dosagelib/plugins/mangadex.py index 527261ed9..860c9f953 100644 --- a/dosagelib/plugins/mangadex.py +++ b/dosagelib/plugins/mangadex.py @@ -82,6 +82,7 @@ class MangaDex(_ParserScraper): cls('KanojoOkarishimasu', 22151), cls('ModernMoGal', 30308), cls('OMaidensinYourSavageSeason', 22030), + cls('OokamiShounenWaKyouMoUsoOKasaneru', 14569), cls('OokamiToKoshinryou', 1168), cls('OtomeYoukaiZakuro', 4533), cls('PleaseDontBullyMeNagatoro', 22631), From 191df7d5ed5232872a54c7c57f5fda040e447c97 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Fri, 14 Aug 2020 20:50:09 -0700 Subject: [PATCH 18/20] Mark SchlockMercenary as endOfLife --- dosagelib/plugins/s.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dosagelib/plugins/s.py b/dosagelib/plugins/s.py index dc57f4434..f7d9447b8 100644 --- a/dosagelib/plugins/s.py +++ b/dosagelib/plugins/s.py @@ -111,8 +111,9 @@ class SchlockMercenary(_ParserScraper): stripUrl = url + '%s' firstStripUrl = stripUrl % '2000-06-12' imageSearch = '//div[@class="strip-image-wrapper"]/img' - multipleImagesPerStrip = True prevSearch = '//a[@class="previous-strip"]' + multipleImagesPerStrip = True + endOfLife = True help = 'Index format: yyyy-mm-dd' From 073890c23767b9f700ba726f1da6f1a0258b4fa5 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Sat, 15 Aug 2020 21:11:08 -0700 Subject: [PATCH 19/20] Add MangaDex/HangingOutWithAGamerGirl --- dosagelib/plugins/mangadex.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dosagelib/plugins/mangadex.py b/dosagelib/plugins/mangadex.py index 860c9f953..01edd17d0 100644 --- a/dosagelib/plugins/mangadex.py +++ b/dosagelib/plugins/mangadex.py @@ -74,6 +74,7 @@ class MangaDex(_ParserScraper): cls('DeliciousinDungeon', 13871), cls('DrStone', 20882), cls('DragonDrive', 5165), + cls('HangingOutWithAGamerGirl', 42490), cls('HeavensDesignTeam', 27811), cls('HoriMiya', 6770), cls('InterspeciesReviewers', 20796), From d4fb75b8443d4248d0e43a6a9bc6c73969321eb6 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Tue, 18 Aug 2020 23:05:44 -0700 Subject: [PATCH 20/20] Add MangaDex/TheWolfAndRedRidingHood --- dosagelib/plugins/mangadex.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dosagelib/plugins/mangadex.py b/dosagelib/plugins/mangadex.py index 01edd17d0..53511c7c0 100644 --- a/dosagelib/plugins/mangadex.py +++ b/dosagelib/plugins/mangadex.py @@ -94,6 +94,7 @@ class MangaDex(_ParserScraper): cls('SPYxFAMILY', 35705), cls('SwordArtOnline', 1360), cls('SwordArtOnlineProgressive', 9604), + cls('TheWolfAndRedRidingHood', 31079), cls('TomoChanWaOnnanoko', 15722), cls('TonikakuKawaii', 23439), cls('YotsubaAnd', 311),