diff --git a/docs/supportedsites.md b/docs/supportedsites.md
index 68cd4b16..d45b5fb0 100644
--- a/docs/supportedsites.md
+++ b/docs/supportedsites.md
@@ -736,7 +736,7 @@ Consider all sites to be NSFW unless otherwise known.
| Skeb |
https://skeb.jp/ |
- Posts, User Profiles |
+ Posts, Search Results, User Profiles |
|
diff --git a/gallery_dl/extractor/skeb.py b/gallery_dl/extractor/skeb.py
index cd8c2383..b95d55d1 100644
--- a/gallery_dl/extractor/skeb.py
+++ b/gallery_dl/extractor/skeb.py
@@ -223,6 +223,55 @@ class SkebUserExtractor(SkebExtractor):
return posts
+class SkebSearchExtractor(SkebExtractor):
+ """Extractor for skeb search results"""
+ subcategory = "search"
+ pattern = r"(?:https?://)?skeb\.jp/search\?q=([^]+)"
+ test = ("https://skeb.jp/search?q=bunny%20tree&t=works", {
+ "count": ">= 18",
+ })
+
+ def posts(self):
+ url = "https://hb1jt3kre9-2.algolianet.com/1/indexes/*/queries"
+ params = {
+ "x-algolia-agent": "Algolia for JavaScript (4.13.1); Browser",
+ }
+ headers = {
+ "Origin": self.root,
+ "Referer": self.root + "/",
+ "x-algolia-api-key": "9a4ce7d609e71bf29e977925e4c6740c",
+ "x-algolia-application-id": "HB1JT3KRE9",
+ }
+
+ pams = ("hitsPerPage=40&filters=genre%3Aart%20OR%20genre%3Avoice%20OR"
+ "%20genre%3Anovel%20OR%20genre%3Avideo%20OR%20genre%3Amusic%2"
+ "0OR%20genre%3Acorrection&page=")
+ page = 0
+
+ request = {
+ "indexName": "Request",
+ "query": text.unquote(self.user_name),
+ "params": pams + str(page),
+ }
+ data = {"requests": (request,)}
+
+ while True:
+ result = self.request(
+ url, method="POST", params=params, headers=headers, json=data,
+ ).json()["results"][0]
+
+ for post in result["hits"]:
+ parts = post["path"].split("/")
+ user_name = parts[1][1:]
+ post_num = parts[3]
+ yield user_name, post_num
+
+ if page >= result["nbPages"]:
+ return
+ page += 1
+ request["params"] = pams + str(page)
+
+
class SkebFollowingExtractor(SkebExtractor):
"""Extractor for all creators followed by a skeb user"""
subcategory = "following"