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",
],
},