diff --git a/docs/supportedsites.md b/docs/supportedsites.md index 04a6b64a..4f06028f 100644 --- a/docs/supportedsites.md +++ b/docs/supportedsites.md @@ -511,12 +511,6 @@ Consider all listed sites to potentially be NSFW. Soundtracks - - Koharu - https://koharu.to/ - Favorites, Galleries, Search Results - - Komikcast https://komikcast.cz/ @@ -829,6 +823,12 @@ Consider all listed sites to potentially be NSFW. Articles, Tag Searches + + SchaleNetwork + https://niyaniya.moe/ + Favorites, Galleries, Search Results + + Scrolller https://scrolller.com/ diff --git a/gallery_dl/extractor/koharu.py b/gallery_dl/extractor/koharu.py index cacf5046..7c04dcb1 100644 --- a/gallery_dl/extractor/koharu.py +++ b/gallery_dl/extractor/koharu.py @@ -6,20 +6,26 @@ # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. -"""Extractors for https://koharu.to/""" +"""Extractors for https://niyaniya.moe/""" from .common import GalleryExtractor, Extractor, Message from .. import text, exception from ..cache import cache -BASE_PATTERN = r"(?i)(?:https?://)?(?:koharu|anchira)\.to" +BASE_PATTERN = ( + r"(?i)(?:https?://)?(" + r"(?:niyaniya|shupogaki)\.moe|" + r"(?:koharu|anchira|seia)\.to|" + r"(?:hoshino)\.one" + r")" +) class KoharuExtractor(Extractor): """Base class for koharu extractors""" category = "koharu" - root = "https://koharu.to" - root_api = "https://api.koharu.to" + root = "https://niyaniya.moe" + root_api = "https://api.schale.network" request_interval = (0.5, 1.5) def _init(self): @@ -62,7 +68,7 @@ class KoharuGalleryExtractor(KoharuExtractor, GalleryExtractor): archive_fmt = "{id}_{num}" request_interval = 0.0 pattern = BASE_PATTERN + r"/(?:g|reader)/(\d+)/(\w+)" - example = "https://koharu.to/g/12345/67890abcde/" + example = "https://niyaniya.moe/g/12345/67890abcde/" TAG_TYPES = { 0 : "general", @@ -100,7 +106,7 @@ class KoharuGalleryExtractor(KoharuExtractor, GalleryExtractor): def metadata(self, _): url = "{}/books/detail/{}/{}".format( - self.root_api, self.groups[0], self.groups[1]) + self.root_api, self.groups[1], self.groups[2]) self.data = data = self.request(url, headers=self.headers).json() tags = [] @@ -179,11 +185,11 @@ class KoharuGalleryExtractor(KoharuExtractor, GalleryExtractor): break except KeyError: self.log.debug("%s: Format %s is not available", - self.groups[0], fmtid) + self.groups[1], fmtid) else: raise exception.NotFoundError("format") - self.log.debug("%s: Selected format %s", self.groups[0], fmtid) + self.log.debug("%s: Selected format %s", self.groups[1], fmtid) fmt["w"] = fmtid return fmt @@ -192,10 +198,10 @@ class KoharuSearchExtractor(KoharuExtractor): """Extractor for koharu search results""" subcategory = "search" pattern = BASE_PATTERN + r"/\?([^#]*)" - example = "https://koharu.to/?s=QUERY" + example = "https://niyaniya.moe/?s=QUERY" def items(self): - params = text.parse_query(self.groups[0]) + params = text.parse_query(self.groups[1]) params["page"] = text.parse_int(params.get("page"), 1) return self._pagination("/books", params) @@ -204,12 +210,12 @@ class KoharuFavoriteExtractor(KoharuExtractor): """Extractor for koharu favorites""" subcategory = "favorite" pattern = BASE_PATTERN + r"/favorites(?:\?([^#]*))?" - example = "https://koharu.to/favorites" + example = "https://niyaniya.moe/favorites" def items(self): self.login() - params = text.parse_query(self.groups[0]) + params = text.parse_query(self.groups[1]) params["page"] = text.parse_int(params.get("page"), 1) return self._pagination("/favorites", params) @@ -226,7 +232,7 @@ class KoharuFavoriteExtractor(KoharuExtractor): def _login_impl(self, username, password): self.log.info("Logging in as %s", username) - url = "https://auth.koharu.to/login" + url = "https://auth.schale.network/login" data = {"uname": username, "passwd": password} response = self.request( url, method="POST", headers=self.headers, data=data) diff --git a/scripts/supportedsites.py b/scripts/supportedsites.py index 2d727170..4ba5a763 100755 --- a/scripts/supportedsites.py +++ b/scripts/supportedsites.py @@ -84,6 +84,7 @@ CATEGORY_MAP = { "jpgfish" : "JPG Fish", "kabeuchi" : "かべうち", "kemonoparty" : "Kemono", + "koharu" : "SchaleNetwork", "livedoor" : "livedoor Blog", "ohpolly" : "Oh Polly", "omgmiamiswimwear": "Omg Miami Swimwear", diff --git a/test/results/koharu.py b/test/results/koharu.py index 3ab23505..8ba22146 100644 --- a/test/results/koharu.py +++ b/test/results/koharu.py @@ -9,7 +9,7 @@ from gallery_dl.extractor import koharu __tests__ = ( { - "#url" : "https://koharu.to/g/14216/6c67076fdd45", + "#url" : "https://niyaniya.moe/g/14216/6c67076fdd45", "#category": ("", "koharu", "gallery"), "#class" : koharu.KoharuGalleryExtractor, "#pattern" : r"https://kisakisexo.xyz/download/59896/a4fbd1828229/f47639c6abaf1903dd69c36a3d961da84741a1831aa07a2906ce9c74156a5d75\?v=1721626410802&w=0", @@ -48,7 +48,7 @@ __tests__ = ( }, { - "#url" : "https://koharu.to/g/14216/6c67076fdd45", + "#url" : "https://niyaniya.moe/g/14216/6c67076fdd45", "#category": ("", "koharu", "gallery"), "#class" : koharu.KoharuGalleryExtractor, "#options" : {"cbz": False, "format": "780"}, @@ -57,7 +57,7 @@ __tests__ = ( }, { - "#url" : "https://koharu.to/g/14216/6c67076fdd45", + "#url" : "https://niyaniya.moe/g/14216/6c67076fdd45", "#category": ("", "koharu", "gallery"), "#class" : koharu.KoharuGalleryExtractor, "#options" : {"cbz": False, "format": "780"}, @@ -66,19 +66,34 @@ __tests__ = ( }, { - "#url" : "https://anchira.to/g/14216/6c67076fdd45", + "#url" : "https://koharu.to/g/14216/6c67076fdd45", + "#class": koharu.KoharuGalleryExtractor, +}, +{ + "#url" : "https://anchira.to/g/14216/6c67076fdd45", + "#class": koharu.KoharuGalleryExtractor, +}, +{ + "#url" : "https://seia.to/g/14216/6c67076fdd45", + "#class": koharu.KoharuGalleryExtractor, +}, +{ + "#url" : "https://shupogaki.moe/g/14216/6c67076fdd45", + "#class": koharu.KoharuGalleryExtractor, +}, +{ + "#url" : "https://hoshino.one/g/14216/6c67076fdd45", + "#class": koharu.KoharuGalleryExtractor, +}, + +{ + "#url" : "https://niyaniya.moe/reader/14216/6c67076fdd45", "#category": ("", "koharu", "gallery"), "#class" : koharu.KoharuGalleryExtractor, }, { - "#url" : "https://koharu.to/reader/14216/6c67076fdd45", - "#category": ("", "koharu", "gallery"), - "#class" : koharu.KoharuGalleryExtractor, -}, - -{ - "#url" : "https://koharu.to/?s=tag:^beach$", + "#url" : "https://niyaniya.moe/?s=tag:^beach$", "#category": ("", "koharu", "search"), "#class" : koharu.KoharuSearchExtractor, "#pattern" : koharu.KoharuGalleryExtractor.pattern, @@ -86,24 +101,24 @@ __tests__ = ( }, { - "#url" : "https://koharu.to/favorites", + "#url" : "https://niyaniya.moe/favorites", "#category": ("", "koharu", "favorite"), "#class" : koharu.KoharuFavoriteExtractor, "#pattern" : koharu.KoharuGalleryExtractor.pattern, "#auth" : True, "#urls" : [ - "https://koharu.to/g/14216/6c67076fdd45", + "https://niyaniya.moe/g/14216/6c67076fdd45", ], }, { - "#url" : "https://koharu.to/favorites?cat=6&sort=4", + "#url" : "https://niyaniya.moe/favorites?cat=6&sort=4", "#category": ("", "koharu", "favorite"), "#class" : koharu.KoharuFavoriteExtractor, "#pattern" : koharu.KoharuGalleryExtractor.pattern, "#auth" : True, "#urls" : [ - "https://koharu.to/g/14216/6c67076fdd45", + "https://niyaniya.moe/g/14216/6c67076fdd45", ], },