diff --git a/docs/supportedsites.md b/docs/supportedsites.md
index 1911cfe1..a5838b56 100644
--- a/docs/supportedsites.md
+++ b/docs/supportedsites.md
@@ -124,7 +124,7 @@ Consider all listed sites to potentially be NSFW.
| Audiochan |
https://audiochan.com/ |
- Audios, Collections, User Profiles |
+ Audios, Collections, Search Results, User Profiles |
|
diff --git a/gallery_dl/extractor/audiochan.py b/gallery_dl/extractor/audiochan.py
index d5153d17..66f00ae7 100644
--- a/gallery_dl/extractor/audiochan.py
+++ b/gallery_dl/extractor/audiochan.py
@@ -24,6 +24,7 @@ class AudiochanExtractor(Extractor):
archive_fmt = "{audioFile[id]}"
def _init(self):
+ self.user = False
self.headers_api = {
"content-type" : "application/json",
"Origin" : self.root,
@@ -34,7 +35,6 @@ class AudiochanExtractor(Extractor):
self.headers_dl = {
"Accept": "audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,"
"application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5",
- # "Range" : "bytes=0-",
"Sec-Fetch-Dest" : "audio",
"Sec-Fetch-Mode" : "no-cors",
"Sec-Fetch-Site" : "same-site",
@@ -48,8 +48,16 @@ class AudiochanExtractor(Extractor):
post["_http_headers"] = self.headers_dl
post["date"] = self.parse_datetime_iso(file["created_at"])
post["date_updated"] = self.parse_datetime_iso(file["updated_at"])
- post["tags"] = [f"{tag['category']}:{tag['name']}"
- for tag in post["tags"]]
+
+ tags = []
+ for tag in post["tags"]:
+ if "tag" in tag:
+ tag = tag["tag"]
+ tags.append(f"{tag['category']}:{tag['name']}")
+ post["tags"] = tags
+
+ if self.user:
+ post["user"] = post["credits"][0]["user"]
yield Message.Directory, post
text.nameext_from_name(file["filename"], post)
@@ -59,12 +67,14 @@ class AudiochanExtractor(Extractor):
url = self.root_api + endpoint
return self.request_json(url, params=params, headers=self.headers_api)
- def _pagination(self, endpoint, params):
+ def _pagination(self, endpoint, params, key=None):
params["page"] = 1
params["limit"] = "12"
while True:
data = self.request_api(endpoint, params)
+ if key is not None:
+ data = data[key]
yield from data["data"]
@@ -79,8 +89,8 @@ class AudiochanAudioExtractor(AudiochanExtractor):
example = "https://audiochan.com/a/SLUG"
def posts(self):
+ self.user = True
audio = self.request_api("/audios/slug/" + self.groups[0])
- audio["user"] = audio["credits"][0]["user"]
return (audio,)
@@ -110,6 +120,21 @@ class AudiochanCollectionExtractor(AudiochanExtractor):
endpoint = "/collections/" + slug
self.kwdict["collection"] = col = self.request_api(endpoint)
col.pop("audios", None)
+ col.pop("items", None)
endpoint = f"/collections/slug/{slug}/items"
return self._pagination(endpoint, {})
+
+
+class AudiochanSearchExtractor(AudiochanExtractor):
+ subcategory = "search"
+ pattern = rf"{BASE_PATTERN}/search/?\?([^#]+)"
+ example = "https://audiochan.com/search?q=QUERY"
+
+ def posts(self):
+ self.user = True
+ endpoint = "/search"
+ params = text.parse_query(self.groups[0])
+ params["sfw_only"] = "false"
+ self.kwdict["search_tags"] = params.get("q")
+ return self._pagination(endpoint, params, "audios")
diff --git a/test/results/audiochan.py b/test/results/audiochan.py
index b630e4e9..b6cd1595 100644
--- a/test/results/audiochan.py
+++ b/test/results/audiochan.py
@@ -11,15 +11,23 @@ __tests__ = (
{
"#url" : "https://audiochan.com/a/pBP1V1ODEV2od9CjLu",
"#class" : audiochan.AudiochanAudioExtractor,
- "#pattern" : r"https://stream.audiochan.com/v\?token=YXVkaW9zL2Q4YjA1ZWEzLWU0ZGItNGU2NC05MzZiLTQzNmI3MmM4OTViMS9sOTBCOFI0ajhjS0NFSmNwa2kubXAz&exp=\d+&st=\w+",
+ "#pattern" : r"https://stream.audiochan.com/v\?token=YXVkaW9zL2Q4YjA1ZWEzLWU0ZGItNGU2NC05MzZiLTQzNmI3MmM4OTViMS9sOTBCOFI0ajhjS0NFSmNwa2kubXAz&exp=\d+&st=.+",
"#count" : 1,
+
+ "user": {
+ "username": "lil_lovergirl",
+ },
},
{
"#url" : "https://audiochan.com/u/lil_lovergirl",
"#class" : audiochan.AudiochanUserExtractor,
- "#pattern" : r"https://stream\.audiochan\.com/v\?token=\w+\&exp=\d+\&st=\w+",
- "#count" : 35,
+ "#pattern" : r"https://stream\.audiochan\.com/v\?token=\w+\&exp=\d+\&st=.+",
+ "#count" : range(35, 50),
+
+ "user": {
+ "username": "lil_lovergirl",
+ },
},
{
@@ -34,6 +42,25 @@ __tests__ = (
"https://content.audiochan.com/audios/d8b05ea3-e4db-4e64-936b-436b72c895b1/Fwy5YxgK4zc7sQ9xx3.mp3",
"https://content.audiochan.com/audios/d8b05ea3-e4db-4e64-936b-436b72c895b1/P3YrtAdKVekYb3BTgy.mp3",
),
+
+ "collection": {
+ "id": "6d7a89a4-e752-4772-923d-65783aee332e",
+ "slug": "qzrByaXAwTLVXRgC9m",
+ "title": "💗SFW",
+ },
+ "user": {
+ "username": "lil_lovergirl",
+ },
+},
+
+{
+ "#url" : "https://audiochan.com/search?q=Cozy&sort=trending&timeRange=all",
+ "#class" : audiochan.AudiochanSearchExtractor,
+ "#count" : range(25, 40),
+
+ "search_tags": "Cozy",
+ "user": dict,
+ "tags": list,
},
)