replace 'request(…).json()' with 'request_json(…)'

This commit is contained in:
Mike Fährmann
2025-06-29 17:17:09 +02:00
parent 9dbe33b6de
commit f2a72d8d1e
71 changed files with 157 additions and 161 deletions

View File

@@ -27,7 +27,7 @@ class _2chThreadExtractor(Extractor):
def items(self): def items(self):
url = f"{self.root}/{self.board}/res/{self.thread}.json" url = f"{self.root}/{self.board}/res/{self.thread}.json"
posts = self.request(url).json()["threads"][0]["posts"] posts = self.request_json(url)["threads"][0]["posts"]
op = posts[0] op = posts[0]
title = op.get("subject") or text.remove_html(op["comment"]) title = op.get("subject") or text.remove_html(op["comment"])
@@ -75,7 +75,7 @@ class _2chBoardExtractor(Extractor):
# index page # index page
url = f"{base}/index.json" url = f"{base}/index.json"
index = self.request(url).json() index = self.request_json(url)
index["_extractor"] = _2chThreadExtractor index["_extractor"] = _2chThreadExtractor
for thread in index["threads"]: for thread in index["threads"]:
url = f"{base}/res/{thread['thread_num']}.html" url = f"{base}/res/{thread['thread_num']}.html"
@@ -84,7 +84,7 @@ class _2chBoardExtractor(Extractor):
# pages 1..n # pages 1..n
for n in util.advance(index["pages"], 1): for n in util.advance(index["pages"], 1):
url = f"{base}/{n}.json" url = f"{base}/{n}.json"
page = self.request(url).json() page = self.request_json(url)
page["_extractor"] = _2chThreadExtractor page["_extractor"] = _2chThreadExtractor
for thread in page["threads"]: for thread in page["threads"]:
url = f"{base}/res/{thread['thread_num']}.html" url = f"{base}/res/{thread['thread_num']}.html"

View File

@@ -49,14 +49,14 @@ class _35photoExtractor(Extractor):
if extra_ids: if extra_ids:
yield from extra_ids yield from extra_ids
while params["lastId"]: while params["lastId"]:
data = self.request(url, headers=headers, params=params).json() data = self.request_json(url, headers=headers, params=params)
yield from self._photo_ids(data["data"]) yield from self._photo_ids(data["data"])
params["lastId"] = data["lastId"] params["lastId"] = data["lastId"]
def _photo_data(self, photo_id): def _photo_data(self, photo_id):
params = {"method": "photo.getData", "photoId": photo_id} params = {"method": "photo.getData", "photoId": photo_id}
data = self.request( data = self.request_json(
"https://api.35photo.pro/", params=params).json()["data"][photo_id] "https://api.35photo.pro/", params=params)["data"][photo_id]
info = { info = {
"url" : data["src"], "url" : data["src"],
"id" : data["photo_id"], "id" : data["photo_id"],

View File

@@ -29,7 +29,7 @@ class _4chanThreadExtractor(Extractor):
def items(self): def items(self):
url = f"https://a.4cdn.org/{self.board}/thread/{self.thread}.json" url = f"https://a.4cdn.org/{self.board}/thread/{self.thread}.json"
posts = self.request(url).json()["posts"] posts = self.request_json(url)["posts"]
title = posts[0].get("sub") or text.remove_html(posts[0]["com"]) title = posts[0].get("sub") or text.remove_html(posts[0]["com"])
data = { data = {
@@ -62,7 +62,7 @@ class _4chanBoardExtractor(Extractor):
def items(self): def items(self):
url = f"https://a.4cdn.org/{self.board}/threads.json" url = f"https://a.4cdn.org/{self.board}/threads.json"
threads = self.request(url).json() threads = self.request_json(url)
for page in threads: for page in threads:
for thread in page["threads"]: for thread in page["threads"]:

View File

@@ -72,7 +72,7 @@ class _500pxExtractor(Extractor):
"x-csrf-token": self.cookies.get( "x-csrf-token": self.cookies.get(
"x-csrf-token", domain=".500px.com"), "x-csrf-token", domain=".500px.com"),
} }
return self.request(url, headers=headers, params=params).json() return self.request_json(url, headers=headers, params=params)
def _request_graphql(self, opname, variables): def _request_graphql(self, opname, variables):
url = "https://api.500px.com/graphql" url = "https://api.500px.com/graphql"
@@ -85,8 +85,8 @@ class _500pxExtractor(Extractor):
"variables" : util.json_dumps(variables), "variables" : util.json_dumps(variables),
"query" : QUERIES[opname], "query" : QUERIES[opname],
} }
return self.request( return self.request_json(
url, method="POST", headers=headers, json=data).json()["data"] url, method="POST", headers=headers, json=data)["data"]
class _500pxUserExtractor(_500pxExtractor): class _500pxUserExtractor(_500pxExtractor):

View File

@@ -80,7 +80,7 @@ class _8chanThreadExtractor(_8chanExtractor):
# fetch thread data # fetch thread data
url = f"{self.root}/{board}/res/{thread}." url = f"{self.root}/{board}/res/{thread}."
self.session.headers["Referer"] = url + "html" self.session.headers["Referer"] = url + "html"
thread = self.request(url + "json").json() thread = self.request_json(url + "json")
thread["postId"] = thread["threadId"] thread["postId"] = thread["threadId"]
thread["_http_headers"] = {"Referer": url + "html"} thread["_http_headers"] = {"Referer": url + "html"}
@@ -117,7 +117,7 @@ class _8chanBoardExtractor(_8chanExtractor):
pnum = text.parse_int(pnum, 1) pnum = text.parse_int(pnum, 1)
url = f"{self.root}/{board}/{pnum}.json" url = f"{self.root}/{board}/{pnum}.json"
data = self.request(url).json() data = self.request_json(url)
threads = data["threads"] threads = data["threads"]
while True: while True:
@@ -130,4 +130,4 @@ class _8chanBoardExtractor(_8chanExtractor):
if pnum > data["pageCount"]: if pnum > data["pageCount"]:
return return
url = f"{self.root}/{board}/{pnum}.json" url = f"{self.root}/{board}/{pnum}.json"
threads = self.request(url).json()["threads"] threads = self.request_json(url)["threads"]

View File

@@ -104,7 +104,7 @@ class ArtstationExtractor(Extractor):
url = f"{self.root}/projects/{project_id}.json" url = f"{self.root}/projects/{project_id}.json"
try: try:
data = self.request(url).json() data = self.request_json(url)
except exception.HttpError as exc: except exception.HttpError as exc:
self.log.warning(exc) self.log.warning(exc)
return return
@@ -152,7 +152,7 @@ class ArtstationExtractor(Extractor):
params["page"] = 1 params["page"] = 1
while True: while True:
data = self.request(url, **kwargs).json() data = self.request_json(url, **kwargs)
yield from data["data"] yield from data["data"]
total += len(data["data"]) total += len(data["data"])
@@ -167,9 +167,8 @@ class ArtstationExtractor(Extractor):
"Accept" : "*/*", "Accept" : "*/*",
"Origin" : self.root, "Origin" : self.root,
} }
return self.request( return self.request_json(
url, method="POST", headers=headers, json={}, url, method="POST", headers=headers, json={})["public_csrf_token"]
).json()["public_csrf_token"]
def _no_cache(self, url): def _no_cache(self, url):
"""Cause a cache miss to prevent Cloudflare 'optimizations' """Cause a cache miss to prevent Cloudflare 'optimizations'
@@ -269,8 +268,8 @@ class ArtstationCollectionExtractor(ArtstationExtractor):
def metadata(self): def metadata(self):
url = f"{self.root}/collections/{self.collection_id}.json" url = f"{self.root}/collections/{self.collection_id}.json"
params = {"username": self.user} params = {"username": self.user}
collection = self.request( collection = self.request_json(
url, params=params, notfound="collection").json() url, params=params, notfound="collection")
return {"collection": collection, "user": self.user} return {"collection": collection, "user": self.user}
def projects(self): def projects(self):
@@ -290,8 +289,8 @@ class ArtstationCollectionsExtractor(ArtstationExtractor):
url = self.root + "/collections.json" url = self.root + "/collections.json"
params = {"username": self.user} params = {"username": self.user}
for collection in self.request( for collection in self.request_json(
url, params=params, notfound="collections").json(): url, params=params, notfound="collections"):
url = f"{self.root}/{self.user}/collections/{collection['id']}" url = f"{self.root}/{self.user}/collections/{collection['id']}"
collection["_extractor"] = ArtstationCollectionExtractor collection["_extractor"] = ArtstationCollectionExtractor
yield Message.Queue, url, collection yield Message.Queue, url, collection
@@ -320,7 +319,7 @@ class ArtstationChallengeExtractor(ArtstationExtractor):
submission_url = f"{base}/submissions.json" submission_url = f"{base}/submissions.json"
update_url = f"{self.root}/contests/submission_updates.json" update_url = f"{self.root}/contests/submission_updates.json"
challenge = self.request(challenge_url).json() challenge = self.request_json(challenge_url)
yield Message.Directory, {"challenge": challenge} yield Message.Directory, {"challenge": challenge}
params = {"sorting": self.sorting} params = {"sorting": self.sorting}

View File

@@ -45,8 +45,8 @@ class BehanceExtractor(Extractor):
"variables": variables, "variables": variables,
} }
return self.request(url, method="POST", headers=headers, return self.request_json(
json=data).json()["data"] url, method="POST", headers=headers, json=data)["data"]
def _update(self, data): def _update(self, data):
# compress data to simple lists # compress data to simple lists

View File

@@ -108,7 +108,7 @@ class BilibiliAPI():
def _call(self, endpoint, params): def _call(self, endpoint, params):
url = "https://api.bilibili.com/x/polymer/web-dynamic/v1" + endpoint url = "https://api.bilibili.com/x/polymer/web-dynamic/v1" + endpoint
data = self.extractor.request(url, params=params).json() data = self.extractor.request_json(url, params=params)
if data["code"] != 0: if data["code"] != 0:
self.extractor.log.debug("Server response: %s", data) self.extractor.log.debug("Server response: %s", data)
@@ -159,7 +159,7 @@ class BilibiliAPI():
def login_user_id(self): def login_user_id(self):
url = "https://api.bilibili.com/x/space/v2/myinfo" url = "https://api.bilibili.com/x/space/v2/myinfo"
data = self.extractor.request(url).json() data = self.extractor.request_json(url)
if data["code"] != 0: if data["code"] != 0:
self.extractor.log.debug("Server response: %s", data) self.extractor.log.debug("Server response: %s", data)

View File

@@ -488,7 +488,7 @@ class BlueskyAPI():
url = "https://plc.directory/" + did url = "https://plc.directory/" + did
try: try:
data = self.extractor.request(url).json() data = self.extractor.request_json(url)
for service in data["service"]: for service in data["service"]:
if service["type"] == "AtprotoPersonalDataServer": if service["type"] == "AtprotoPersonalDataServer":
return service["serviceEndpoint"] return service["serviceEndpoint"]

View File

@@ -180,8 +180,8 @@ class BunkrAlbumExtractor(LolisafeAlbumExtractor):
referer = self.root_dl + "/file/" + data_id referer = self.root_dl + "/file/" + data_id
headers = {"Referer": referer, "Origin": self.root_dl} headers = {"Referer": referer, "Origin": self.root_dl}
data = self.request(self.endpoint, method="POST", headers=headers, data = self.request_json(self.endpoint, method="POST", headers=headers,
json={"id": data_id}).json() json={"id": data_id})
if data.get("encrypted"): if data.get("encrypted"):
key = f"SECRET_KEY_{data['timestamp'] // 3600}" key = f"SECRET_KEY_{data['timestamp'] // 3600}"

View File

@@ -144,12 +144,12 @@ class CienArticleExtractor(CienExtractor):
"gallery_id": text.extr(gallery, ' gallery-id="', '"'), "gallery_id": text.extr(gallery, ' gallery-id="', '"'),
"time" : text.extr(gallery, ' time="', '"'), "time" : text.extr(gallery, ' time="', '"'),
} }
data = self.request(url, params=params).json() data = self.request_json(url, params=params)
url = self.root + "/api/creator/gallery/imagePath" url = self.root + "/api/creator/gallery/imagePath"
for params["page"], params["file_id"] in enumerate( for params["page"], params["file_id"] in enumerate(
data["imgList"]): data["imgList"]):
path = self.request(url, params=params).json()["path"] path = self.request_json(url, params=params)["path"]
file = params.copy() file = params.copy()
file["url"] = path file["url"] = path

View File

@@ -854,8 +854,8 @@ class CivitaiSearchAPI():
url = self.root + endpoint url = self.root + endpoint
params = util.json_dumps({"queries": (query,)}) params = util.json_dumps({"queries": (query,)})
data = self.extractor.request( data = self.extractor.request_json(
url, method="POST", headers=self.headers, data=params).json() url, method="POST", headers=self.headers, data=params)
return data["results"][0] return data["results"][0]

View File

@@ -46,7 +46,7 @@ class ComicvineTagExtractor(BooruExtractor):
} }
while True: while True:
images = self.request(url, params=params).json()["images"] images = self.request_json(url, params=params)["images"]
yield from images yield from images
if len(images) < self.per_page: if len(images) < self.per_page:

View File

@@ -61,8 +61,8 @@ class CyberdropAlbumExtractor(lolisafe.LolisafeAlbumExtractor):
for file_id in file_ids: for file_id in file_ids:
try: try:
url = f"{self.root_api}/api/file/info/{file_id}" url = f"{self.root_api}/api/file/info/{file_id}"
file = self.request(url).json() file = self.request_json(url)
auth = self.request(file["auth_url"]).json() auth = self.request_json(file["auth_url"])
file["url"] = auth["url"] file["url"] = auth["url"]
except Exception as exc: except Exception as exc:
self.log.warning("%s (%s: %s)", self.log.warning("%s (%s: %s)",

View File

@@ -60,13 +60,13 @@ class E621Extractor(danbooru.DanbooruExtractor):
yield Message.Url, file["url"], post yield Message.Url, file["url"], post
def _get_notes(self, id): def _get_notes(self, id):
return self.request( return self.request_json(
f"{self.root}/notes.json?search[post_id]={id}").json() f"{self.root}/notes.json?search[post_id]={id}")
@memcache(keyarg=1) @memcache(keyarg=1)
def _get_pools(self, ids): def _get_pools(self, ids):
pools = self.request( pools = self.request_json(
f"{self.root}/pools.json?search[id]={ids}").json() f"{self.root}/pools.json?search[id]={ids}")
for pool in pools: for pool in pools:
pool["name"] = pool["name"].replace("_", " ") pool["name"] = pool["name"].replace("_", " ")
return pools return pools
@@ -127,7 +127,7 @@ class E621PostExtractor(E621Extractor, danbooru.DanbooruPostExtractor):
def posts(self): def posts(self):
url = f"{self.root}/posts/{self.groups[-1]}.json" url = f"{self.root}/posts/{self.groups[-1]}.json"
return (self.request(url).json()["post"],) return (self.request_json(url)["post"],)
class E621PopularExtractor(E621Extractor, danbooru.DanbooruPopularExtractor): class E621PopularExtractor(E621Extractor, danbooru.DanbooruPopularExtractor):

View File

@@ -299,7 +299,7 @@ class ExhentaiGalleryExtractor(ExhentaiExtractor):
"namespace": 1, "namespace": 1,
} }
data = self.request(self.api_url, method="POST", json=data).json() data = self.request_json(self.api_url, method="POST", json=data)
if "error" in data: if "error" in data:
raise exception.StopExtraction(data["error"]) raise exception.StopExtraction(data["error"])
@@ -351,7 +351,7 @@ class ExhentaiGalleryExtractor(ExhentaiExtractor):
} }
for request["page"] in range(self.image_num + 1, self.count + 1): for request["page"] in range(self.image_num + 1, self.count + 1):
page = self.request(api_url, method="POST", json=request).json() page = self.request_json(api_url, method="POST", json=request)
i3 = page["i3"] i3 = page["i3"]
i6 = page["i6"] i6 = page["i6"]

View File

@@ -93,7 +93,7 @@ class FantiaExtractor(Extractor):
def _get_post_data(self, post_id): def _get_post_data(self, post_id):
"""Fetch and process post data""" """Fetch and process post data"""
url = self.root+"/api/v1/posts/"+post_id url = self.root+"/api/v1/posts/"+post_id
resp = self.request(url, headers=self.headers).json()["post"] resp = self.request_json(url, headers=self.headers)["post"]
return { return {
"post_id": resp["id"], "post_id": resp["id"],
"post_url": self.root + "/posts/" + str(resp["id"]), "post_url": self.root + "/posts/" + str(resp["id"]),

View File

@@ -159,7 +159,7 @@ class FoolfuukaThreadExtractor(FoolfuukaExtractor):
def metadata(self): def metadata(self):
url = self.root + "/_/api/chan/thread/" url = self.root + "/_/api/chan/thread/"
params = {"board": self.board, "num": self.thread} params = {"board": self.board, "num": self.thread}
self.data = self.request(url, params=params).json()[self.thread] self.data = self.request_json(url, params=params)[self.thread]
return self.data["op"] return self.data["op"]
def posts(self): def posts(self):
@@ -243,7 +243,7 @@ class FoolfuukaSearchExtractor(FoolfuukaExtractor):
while True: while True:
try: try:
data = self.request(url, params=params).json() data = self.request_json(url, params=params)
except ValueError: except ValueError:
return return

View File

@@ -74,7 +74,7 @@ class Furry34Extractor(BooruExtractor):
def _fetch_post(self, post_id): def _fetch_post(self, post_id):
url = f"{self.root}/api/v2/post/{post_id}" url = f"{self.root}/api/v2/post/{post_id}"
return self.request(url).json() return self.request_json(url)
def _pagination(self, endpoint, params=None): def _pagination(self, endpoint, params=None):
url = f"{self.root}/api{endpoint}" url = f"{self.root}/api{endpoint}"
@@ -86,7 +86,7 @@ class Furry34Extractor(BooruExtractor):
threshold = self.per_page threshold = self.per_page
while True: while True:
data = self.request(url, method="POST", json=params).json() data = self.request_json(url, method="POST", json=params)
yield from data["items"] yield from data["items"]

View File

@@ -39,9 +39,8 @@ class FuskatorGalleryExtractor(GalleryExtractor):
"hash" : self.gallery_hash, "hash" : self.gallery_hash,
"_" : int(time.time()), "_" : int(time.time()),
} }
self.data = data = self.request( self.data = data = self.request_json(
self.root + "/ajax/gal.aspx", params=params, headers=headers, self.root + "/ajax/gal.aspx", params=params, headers=headers)
).json()
title = text.extr(page, "<title>", "</title>").strip() title = text.extr(page, "<title>", "</title>").strip()
title, _, gallery_id = title.rpartition("#") title, _, gallery_id = title.rpartition("#")

View File

@@ -30,7 +30,7 @@ class GelbooruBase():
params["user_id"] = self.user_id params["user_id"] = self.user_id
url = self.root + "/index.php?page=dapi&q=index&json=1" url = self.root + "/index.php?page=dapi&q=index&json=1"
data = self.request(url, params=params).json() data = self.request_json(url, params=params)
if not key: if not key:
return data return data

View File

@@ -86,10 +86,9 @@ class GofileFolderExtractor(Extractor):
return self._api_request("contents/" + content_id, params, headers) return self._api_request("contents/" + content_id, params, headers)
def _api_request(self, endpoint, params=None, headers=None, method="GET"): def _api_request(self, endpoint, params=None, headers=None, method="GET"):
response = self.request( response = self.request_json(
"https://api.gofile.io/" + endpoint, "https://api.gofile.io/" + endpoint,
method=method, params=params, headers=headers, method=method, params=params, headers=headers)
).json()
if response["status"] != "ok": if response["status"] != "ok":
if response["status"] == "error-notFound": if response["status"] == "error-notFound":

View File

@@ -44,7 +44,7 @@ class HentaihandGalleryExtractor(GalleryExtractor):
return data return data
def images(self, _): def images(self, _):
info = self.request(self.page_url + "/images").json() info = self.request_json(self.page_url + "/images")
return [(img["source_url"], img) for img in info["images"]] return [(img["source_url"], img) for img in info["images"]]
@@ -69,7 +69,7 @@ class HentaihandTagExtractor(Extractor):
tpl = self.type + "s" tpl = self.type + "s"
url = f"{self.root}/api/{tpl}/{self.key}" url = f"{self.root}/api/{tpl}/{self.key}"
tid = self.request(url, notfound=self.type).json()["id"] tid = self.request_json(url, notfound=self.type)["id"]
url = self.root + "/api/comics" url = self.root + "/api/comics"
params = { params = {
@@ -82,7 +82,7 @@ class HentaihandTagExtractor(Extractor):
"duration": "day", "duration": "day",
} }
while True: while True:
info = self.request(url, params=params).json() info = self.request_json(url, params=params)
for gallery in info["data"]: for gallery in info["data"]:
gurl = f"{self.root}/en/comic/{gallery['slug']}" gurl = f"{self.root}/en/comic/{gallery['slug']}"

View File

@@ -97,7 +97,7 @@ class ImagechestUserExtractor(Extractor):
while True: while True:
try: try:
data = self.request(url, params=params).json()["data"] data = self.request_json(url, params=params)["data"]
except (TypeError, KeyError): except (TypeError, KeyError):
return return

View File

@@ -112,7 +112,7 @@ class ImgbbExtractor(Extractor):
params["page"] += 1 params["page"] += 1
elif not seek or 'class="pagination-next"' not in page: elif not seek or 'class="pagination-next"' not in page:
return return
data = self.request(endpoint, method="POST", data=params).json() data = self.request_json(endpoint, method="POST", data=params)
page = data["html"] page = data["html"]

View File

@@ -293,10 +293,9 @@ class ImgurAPI():
def _call(self, endpoint, params=None, headers=None): def _call(self, endpoint, params=None, headers=None):
while True: while True:
try: try:
return self.extractor.request( return self.extractor.request_json(
"https://api.imgur.com" + endpoint, "https://api.imgur.com" + endpoint,
params=params, headers=(headers or self.headers), params=params, headers=(headers or self.headers))
).json()
except exception.HttpError as exc: except exception.HttpError as exc:
if exc.status not in (403, 429) or \ if exc.status not in (403, 429) or \
b"capacity" not in exc.response.content: b"capacity" not in exc.response.content:

View File

@@ -341,7 +341,7 @@ class InkbunnyAPI():
while True: while True:
params["sid"] = self.session_id params["sid"] = self.session_id
data = self.extractor.request(url, params=params).json() data = self.extractor.request_json(url, params=params)
if "error_code" not in data: if "error_code" not in data:
return data return data
@@ -378,7 +378,7 @@ def _authenticate_impl(api, username, password):
url = "https://inkbunny.net/api_login.php" url = "https://inkbunny.net/api_login.php"
data = {"username": username, "password": password} data = {"username": username, "password": password}
data = api.extractor.request(url, method="POST", data=data).json() data = api.extractor.request_json(url, method="POST", data=data)
if "sid" not in data: if "sid" not in data:
raise exception.AuthenticationError(data.get("error_message")) raise exception.AuthenticationError(data.get("error_message"))

View File

@@ -884,7 +884,7 @@ class InstagramRestAPI():
"Sec-Fetch-Mode" : "cors", "Sec-Fetch-Mode" : "cors",
"Sec-Fetch-Site" : "same-origin", "Sec-Fetch-Site" : "same-origin",
} }
return extr.request(url, **kwargs).json() return extr.request_json(url, **kwargs)
def _pagination(self, endpoint, params=None, media=False): def _pagination(self, endpoint, params=None, media=False):
if params is None: if params is None:
@@ -1047,7 +1047,7 @@ class InstagramGraphqlAPI():
"X-Requested-With": "XMLHttpRequest", "X-Requested-With": "XMLHttpRequest",
"Referer" : extr.root + "/", "Referer" : extr.root + "/",
} }
return extr.request(url, params=params, headers=headers).json()["data"] return extr.request_json(url, params=params, headers=headers)["data"]
def _pagination(self, query_hash, variables, def _pagination(self, query_hash, variables,
key_data="user", key_edge=None): key_data="user", key_edge=None):

View File

@@ -20,7 +20,7 @@ class ItchioGameExtractor(Extractor):
directory_fmt = ("{category}", "{user[name]}") directory_fmt = ("{category}", "{user[name]}")
filename_fmt = "{game[title]} ({id}).{extension}" filename_fmt = "{game[title]} ({id}).{extension}"
archive_fmt = "{id}" archive_fmt = "{id}"
pattern = r"(?:https?://)?(\w+).itch\.io/([\w-]+)" pattern = r"(?:https?://)?(\w+)\.itch\.io/([\w-]+)"
example = "https://USER.itch.io/GAME" example = "https://USER.itch.io/GAME"
def __init__(self, match): def __init__(self, match):
@@ -47,8 +47,8 @@ class ItchioGameExtractor(Extractor):
for upload_id in text.extract_iter(page, 'data-upload_id="', '"'): for upload_id in text.extract_iter(page, 'data-upload_id="', '"'):
file_url = f"{game_url}/file/{upload_id}" file_url = f"{game_url}/file/{upload_id}"
info = self.request(file_url, method="POST", params=params, info = self.request_json(file_url, method="POST", params=params,
headers=headers, data=data).json() headers=headers, data=data)
game = info["lightbox"]["game"] game = info["lightbox"]["game"]
user = info["lightbox"]["user"] user = info["lightbox"]["user"]

View File

@@ -65,7 +65,7 @@ class KabeuchiUserExtractor(Extractor):
} }
while True: while True:
info = self.request(url, method="POST", data=data).json() info = self.request_json(url, method="POST", data=data)
datas = info["datas"] datas = info["datas"]
if not datas or not isinstance(datas, list): if not datas or not isinstance(datas, list):

View File

@@ -54,8 +54,8 @@ class LexicaSearchExtractor(Extractor):
} }
while True: while True:
data = self.request( data = self.request_json(
url, method="POST", headers=headers, json=json).json() url, method="POST", headers=headers, json=json)
prompts = { prompts = {
prompt["id"]: prompt prompt["id"]: prompt

View File

@@ -72,7 +72,7 @@ class LolisafeAlbumExtractor(LolisafeExtractor):
def fetch_album(self, album_id): def fetch_album(self, album_id):
url = f"{self.root}/api/album/get/{album_id}" url = f"{self.root}/api/album/get/{album_id}"
data = self.request(url).json() data = self.request_json(url)
return data["files"], { return data["files"], {
"album_id" : self.album_id, "album_id" : self.album_id,

View File

@@ -301,8 +301,8 @@ class MangadexAPI():
self.extractor.log.debug("Using client-id '%s'", self.client_id[:24]) self.extractor.log.debug("Using client-id '%s'", self.client_id[:24])
url = ("https://auth.mangadex.org/realms/mangadex" url = ("https://auth.mangadex.org/realms/mangadex"
"/protocol/openid-connect/token") "/protocol/openid-connect/token")
data = self.extractor.request( data = self.extractor.request_json(
url, method="POST", data=data, fatal=None).json() url, method="POST", data=data, fatal=None)
try: try:
access_token = data["access_token"] access_token = data["access_token"]
@@ -328,8 +328,8 @@ class MangadexAPI():
json = {"username": username, "password": password} json = {"username": username, "password": password}
self.extractor.log.debug("Using legacy login method") self.extractor.log.debug("Using legacy login method")
data = self.extractor.request( data = self.extractor.request_json(
url, method="POST", json=json, fatal=None).json() url, method="POST", json=json, fatal=None)
if data.get("result") != "ok": if data.get("result") != "ok":
raise exception.AuthenticationError() raise exception.AuthenticationError()

View File

@@ -64,8 +64,8 @@ class MangaparkBase():
"variables" : variables, "variables" : variables,
"operationName": opname, "operationName": opname,
} }
return self.request( return self.request_json(
url, method="POST", json=data).json()["data"].popitem()[1] url, method="POST", json=data)["data"].popitem()[1]
class MangaparkChapterExtractor(MangaparkBase, ChapterExtractor): class MangaparkChapterExtractor(MangaparkBase, ChapterExtractor):

View File

@@ -117,7 +117,7 @@ class NaverPostExtractor(NaverBase, GalleryExtractor):
"adt" : "glad", "adt" : "glad",
"lc" : "ko_KR", "lc" : "ko_KR",
} }
data = self.request(url, params=params).json() data = self.request_json(url, params=params)
video = max(data["videos"]["list"], video = max(data["videos"]["list"],
key=lambda v: v.get("size") or 0) key=lambda v: v.get("size") or 0)
files.append((video["source"], video)) files.append((video["source"], video))
@@ -160,7 +160,7 @@ class NaverBlogExtractor(NaverBase, Extractor):
# loop over all posts # loop over all posts
while True: while True:
data = self.request(url, params=params).json() data = self.request_json(url, params=params)
for post in data["postList"]: for post in data["postList"]:
post["url"] = (f"{self.root}/PostView.nhn?blogId=" post["url"] = (f"{self.root}/PostView.nhn?blogId="

View File

@@ -89,7 +89,7 @@ class NaverwebtoonComicExtractor(NaverwebtoonBase, Extractor):
} }
while True: while True:
data = self.request(url, headers=headers, params=params).json() data = self.request_json(url, headers=headers, params=params)
path = data["webtoonLevelCode"].lower().replace("_c", "C", 1) path = data["webtoonLevelCode"].lower().replace("_c", "C", 1)
base = f"{self.root}/{path}/detail?titleId={data['titleId']}&no=" base = f"{self.root}/{path}/detail?titleId={data['titleId']}&no="

View File

@@ -296,7 +296,7 @@ class NewgroundsExtractor(Extractor):
"Accept": "application/json, text/javascript, */*; q=0.01", "Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest", "X-Requested-With": "XMLHttpRequest",
} }
sources = self.request(url, headers=headers).json()["sources"] sources = self.request_json(url, headers=headers)["sources"]
formats = self._video_formats(sources) formats = self._video_formats(sources)
src = next(formats, "") src = next(formats, "")
date = text.parse_timestamp(src.rpartition("?")[2]) date = text.parse_timestamp(src.rpartition("?")[2])
@@ -566,7 +566,7 @@ class NewgroundsSearchExtractor(NewgroundsExtractor):
} }
while True: while True:
data = self.request(url, params=params, headers=headers).json() data = self.request_json(url, params=params, headers=headers)
post_url = None post_url = None
for post_url in text.extract_iter(data["content"], 'href="', '"'): for post_url in text.extract_iter(data["content"], 'href="', '"'):

View File

@@ -53,7 +53,7 @@ class NsfwalbumAlbumExtractor(GalleryExtractor):
self.request(iframe + image_id).text, self.request(iframe + image_id).text,
'giraffe.annihilate("', '"')[0]) 'giraffe.annihilate("', '"')[0])
params = {"spirit": spirit, "photo": image_id} params = {"spirit": spirit, "photo": image_id}
data = self.request(backend, params=params).json() data = self.request_json(backend, params=params)
break break
except Exception: except Exception:
tries += 1 tries += 1

View File

@@ -187,8 +187,8 @@ class OAuthBase(Extractor):
data["client_id"] = client_id data["client_id"] = client_id
data["client_secret"] = client_secret data["client_secret"] = client_secret
data = self.request( data = self.request_json(
token_url, method="POST", data=data, auth=auth).json() token_url, method="POST", data=data, auth=auth)
# check token response # check token response
if "error" in data: if "error" in data:
@@ -383,7 +383,7 @@ class OAuthMastodon(OAuthBase):
"redirect_uris": self.redirect_uri, "redirect_uris": self.redirect_uri,
"scopes": "read", "scopes": "read",
} }
data = self.request(url, method="POST", data=data).json() data = self.request_json(url, method="POST", data=data)
if "client_id" not in data or "client_secret" not in data: if "client_id" not in data or "client_secret" not in data:
raise exception.StopExtraction( raise exception.StopExtraction(
@@ -438,8 +438,8 @@ class OAuthPixiv(OAuthBase):
"redirect_uri" : "https://app-api.pixiv.net" "redirect_uri" : "https://app-api.pixiv.net"
"/web/v1/users/auth/pixiv/callback", "/web/v1/users/auth/pixiv/callback",
} }
data = self.request( data = self.request_json(
url, method="POST", headers=headers, data=data).json() url, method="POST", headers=headers, data=data)
if "error" in data: if "error" in data:
stdout_write(f"\n{data}\n") stdout_write(f"\n{data}\n")

View File

@@ -131,7 +131,7 @@ class PatreonExtractor(Extractor):
while url: while url:
url = text.ensure_http_scheme(url) url = text.ensure_http_scheme(url)
posts = self.request(url, headers=headers).json() posts = self.request_json(url, headers=headers)
if "included" in posts: if "included" in posts:
included = self._transform(posts["included"]) included = self._transform(posts["included"])

View File

@@ -45,7 +45,7 @@ class PhotovogueUserExtractor(Extractor):
} }
while True: while True:
data = self.request(url, params=params).json() data = self.request_json(url, params=params)
yield from data["items"] yield from data["items"]
if not data["has_next"]: if not data["has_next"]:

View File

@@ -62,7 +62,7 @@ class PicartoGalleryExtractor(Extractor):
} }
while True: while True:
posts = self.request(url, params=params).json() posts = self.request_json(url, params=params)
if not posts: if not posts:
return return
yield from posts yield from posts

View File

@@ -55,7 +55,7 @@ class PiczelExtractor(Extractor):
params = {"page": pnum} params = {"page": pnum}
while True: while True:
data = self.request(url, params=params).json() data = self.request_json(url, params=params)
yield from data["data"] yield from data["data"]
@@ -96,4 +96,4 @@ class PiczelImageExtractor(PiczelExtractor):
def posts(self): def posts(self):
url = f"{self.root_api}/api/gallery/{self.groups[0]}" url = f"{self.root_api}/api/gallery/{self.groups[0]}"
return (self.request(url).json(),) return (self.request_json(url),)

View File

@@ -126,7 +126,7 @@ class PillowfortPostExtractor(PillowfortExtractor):
def posts(self): def posts(self):
url = f"{self.root}/posts/{self.item}/json/" url = f"{self.root}/posts/{self.item}/json/"
return (self.request(url).json(),) return (self.request_json(url),)
class PillowfortUserExtractor(PillowfortExtractor): class PillowfortUserExtractor(PillowfortExtractor):
@@ -140,7 +140,7 @@ class PillowfortUserExtractor(PillowfortExtractor):
params = {"p": 1} params = {"p": 1}
while True: while True:
posts = self.request(url, params=params).json()["posts"] posts = self.request_json(url, params=params)["posts"]
yield from posts yield from posts
if len(posts) < 20: if len(posts) < 20:

View File

@@ -43,7 +43,7 @@ class PixeldrainFileExtractor(PixeldrainExtractor):
def items(self): def items(self):
url = f"{self.root}/api/file/{self.file_id}" url = f"{self.root}/api/file/{self.file_id}"
file = self.request(url + "/info").json() file = self.request_json(url + "/info")
file["url"] = url + "?download" file["url"] = url + "?download"
file["date"] = self.parse_datetime(file["date_upload"]) file["date"] = self.parse_datetime(file["date_upload"])
@@ -69,7 +69,7 @@ class PixeldrainAlbumExtractor(PixeldrainExtractor):
def items(self): def items(self):
url = f"{self.root}/api/list/{self.album_id}" url = f"{self.root}/api/list/{self.album_id}"
album = self.request(url).json() album = self.request_json(url)
files = album["files"] files = album["files"]
album["count"] = album["file_count"] album["count"] = album["file_count"]
@@ -120,7 +120,7 @@ class PixeldrainFolderExtractor(PixeldrainExtractor):
recursive = self.config("recursive") recursive = self.config("recursive")
url = f"{self.root}/api/filesystem/{self.groups[0]}" url = f"{self.root}/api/filesystem/{self.groups[0]}"
stat = self.request(url + "?stat").json() stat = self.request_json(url + "?stat")
paths = stat["path"] paths = stat["path"]
path = paths[stat["base_index"]] path = paths[stat["base_index"]]

View File

@@ -233,7 +233,7 @@ class PixivExtractor(Extractor):
def _request_ajax(self, endpoint): def _request_ajax(self, endpoint):
url = f"{self.root}/ajax{endpoint}" url = f"{self.root}/ajax{endpoint}"
try: try:
return self.request(url, headers=self.headers_web).json()["body"] return self.request_json(url, headers=self.headers_web)["body"]
except Exception: except Exception:
return None return None
@@ -1075,7 +1075,7 @@ class PixivSketchExtractor(Extractor):
} }
while True: while True:
data = self.request(url, headers=headers).json() data = self.request_json(url, headers=headers)
yield from data["data"]["items"] yield from data["data"]["items"]
next_url = data["_links"].get("next") next_url = data["_links"].get("next")

View File

@@ -77,7 +77,7 @@ class PixnetImageExtractor(PixnetExtractor):
"format": "json", "format": "json",
} }
data = self.request(url, params=params).json() data = self.request_json(url, params=params)
data["id"] = text.parse_int( data["id"] = text.parse_int(
data["url"].rpartition("/")[2].partition("-")[0]) data["url"].rpartition("/")[2].partition("-")[0])
data["filename"], _, data["extension"] = data["title"].rpartition(".") data["filename"], _, data["extension"] = data["title"].rpartition(".")

View File

@@ -49,8 +49,8 @@ class PlurkExtractor(Extractor):
} }
while True: while True:
info = self.request( info = self.request_json(
url, method="POST", headers=headers, data=data).json() url, method="POST", headers=headers, data=data)
yield from info["responses"] yield from info["responses"]
if not info["has_newer"]: if not info["has_newer"]:
return return

View File

@@ -85,8 +85,8 @@ class PoipikuExtractor(Extractor):
"MD" : "0", "MD" : "0",
"TWF": "-1", "TWF": "-1",
} }
resp = self.request( resp = self.request_json(
url, method="POST", headers=headers, data=data).json() url, method="POST", headers=headers, data=data)
page = resp["html"] page = resp["html"]
if (resp.get("result_num") or 0) < 0: if (resp.get("result_num") or 0) < 0:

View File

@@ -47,8 +47,8 @@ class PornpicsExtractor(Extractor):
} }
while True: while True:
galleries = self.request( galleries = self.request_json(
url, params=params, headers=headers).json() url, params=params, headers=headers)
yield from galleries yield from galleries
if len(galleries) < limit: if len(galleries) < limit:

View File

@@ -256,8 +256,8 @@ class RedgifsAPI():
def _call(self, endpoint, params=None): def _call(self, endpoint, params=None):
url = self.API_ROOT + endpoint url = self.API_ROOT + endpoint
self.headers["Authorization"] = self._auth() self.headers["Authorization"] = self._auth()
return self.extractor.request( return self.extractor.request_json(
url, params=params, headers=self.headers).json() url, params=params, headers=self.headers)
def _pagination(self, endpoint, params=None, key="gifs"): def _pagination(self, endpoint, params=None, key="gifs"):
if params is None: if params is None:
@@ -277,5 +277,5 @@ class RedgifsAPI():
# https://github.com/Redgifs/api/wiki/Temporary-tokens # https://github.com/Redgifs/api/wiki/Temporary-tokens
url = self.API_ROOT + "/v2/auth/temporary" url = self.API_ROOT + "/v2/auth/temporary"
self.headers["Authorization"] = None self.headers["Authorization"] = None
return "Bearer " + self.extractor.request( return "Bearer " + self.extractor.request_json(
url, headers=self.headers).json()["token"] url, headers=self.headers)["token"]

View File

@@ -54,7 +54,7 @@ class Rule34vaultExtractor(BooruExtractor):
def _fetch_post(self, post_id): def _fetch_post(self, post_id):
url = f"{self.root}/api/v2/post/{post_id}" url = f"{self.root}/api/v2/post/{post_id}"
return self.request(url).json() return self.request_json(url)
def _pagination(self, endpoint, params=None): def _pagination(self, endpoint, params=None):
url = f"{self.root}/api{endpoint}" url = f"{self.root}/api{endpoint}"
@@ -67,7 +67,7 @@ class Rule34vaultExtractor(BooruExtractor):
threshold = self.per_page threshold = self.per_page
while True: while True:
data = self.request(url, method="POST", json=params).json() data = self.request_json(url, method="POST", json=params)
yield from data["items"] yield from data["items"]

View File

@@ -88,7 +88,7 @@ class Rule34xyzExtractor(BooruExtractor):
def _fetch_post(self, post_id): def _fetch_post(self, post_id):
url = f"{self.root}/api/v2/post/{post_id}" url = f"{self.root}/api/v2/post/{post_id}"
return self.request(url).json() return self.request_json(url)
def _pagination(self, endpoint, params=None): def _pagination(self, endpoint, params=None):
url = f"{self.root}/api{endpoint}" url = f"{self.root}/api{endpoint}"
@@ -103,7 +103,7 @@ class Rule34xyzExtractor(BooruExtractor):
threshold = self.per_page threshold = self.per_page
while True: while True:
data = self.request(url, method="POST", json=params).json() data = self.request_json(url, method="POST", json=params)
yield from data["items"] yield from data["items"]

View File

@@ -40,8 +40,8 @@ class SchalenetworkExtractor(Extractor):
url_api = self.root_api + endpoint url_api = self.root_api + endpoint
while True: while True:
data = self.request( data = self.request_json(
url_api, params=params, headers=self.headers).json() url_api, params=params, headers=self.headers)
try: try:
entries = data["entries"] entries = data["entries"]
@@ -106,7 +106,7 @@ class SchalenetworkGalleryExtractor(SchalenetworkExtractor, GalleryExtractor):
def metadata(self, _): def metadata(self, _):
url = f"{self.root_api}/books/detail/{self.groups[1]}/{self.groups[2]}" url = f"{self.root_api}/books/detail/{self.groups[1]}/{self.groups[2]}"
self.data = data = self.request(url, headers=self.headers).json() self.data = data = self.request_json(url, headers=self.headers)
data["date"] = text.parse_timestamp(data["created_at"] // 1000) data["date"] = text.parse_timestamp(data["created_at"] // 1000)
tags = [] tags = []
@@ -149,16 +149,16 @@ class SchalenetworkGalleryExtractor(SchalenetworkExtractor, GalleryExtractor):
if self.cbz: if self.cbz:
params["action"] = "dl" params["action"] = "dl"
base = self.request( base = self.request_json(
url, method="POST", params=params, headers=self.headers, url, method="POST", params=params, headers=self.headers,
).json()["base"] )["base"]
url = f"{base}?v={data['updated_at']}&w={fmt['w']}" url = f"{base}?v={data['updated_at']}&w={fmt['w']}"
info = text.nameext_from_url(base) info = text.nameext_from_url(base)
if not info["extension"]: if not info["extension"]:
info["extension"] = "cbz" info["extension"] = "cbz"
return ((url, info),) return ((url, info),)
data = self.request(url, params=params, headers=self.headers).json() data = self.request_json(url, params=params, headers=self.headers)
base = data["base"] base = data["base"]
results = [] results = []

View File

@@ -110,9 +110,9 @@ class ScrolllerExtractor(Extractor):
url = "https://api.scrolller.com/api/v2/graphql" url = "https://api.scrolller.com/api/v2/graphql"
headers["Content-Type"] = "text/plain;charset=UTF-8" headers["Content-Type"] = "text/plain;charset=UTF-8"
return self.request( return self.request_json(
url, method="POST", headers=headers, data=util.json_dumps(data), url, method="POST", headers=headers, data=util.json_dumps(data),
).json()["data"] )["data"]
def _pagination(self, opname, variables, data=None): def _pagination(self, opname, variables, data=None):
if data is None: if data is None:

View File

@@ -57,7 +57,7 @@ class SimplyhentaiGalleryExtractor(GalleryExtractor):
def images(self, _): def images(self, _):
url = self.page_url + "/all-pages" url = self.page_url + "/all-pages"
headers = {"Accept": "application/json"} headers = {"Accept": "application/json"}
images = self.request(url, headers=headers).json() images = self.request_json(url, headers=headers)
return [ return [
( (
urls["full"].replace("/giant_thumb_", "/"), urls["full"].replace("/giant_thumb_", "/"),

View File

@@ -81,8 +81,8 @@ class SkebExtractor(Extractor):
params["offset"] = 0 params["offset"] = 0
while True: while True:
posts = self.request( posts = self.request_json(
url, params=params, headers=self.headers).json() url, params=params, headers=self.headers)
for post in posts: for post in posts:
parts = post["path"].split("/") parts = post["path"].split("/")
@@ -105,8 +105,8 @@ class SkebExtractor(Extractor):
params["limit"] = 90 params["limit"] = 90
while True: while True:
data = self.request( data = self.request_json(
url, params=params, headers=self.headers).json() url, params=params, headers=self.headers)
yield from data yield from data
if len(data) < params["limit"]: if len(data) < params["limit"]:
@@ -115,7 +115,7 @@ class SkebExtractor(Extractor):
def _get_post_data(self, user_name, post_num): def _get_post_data(self, user_name, post_num):
url = f"{self.root}/api/users/{user_name}/works/{post_num}" url = f"{self.root}/api/users/{user_name}/works/{post_num}"
resp = self.request(url, headers=self.headers).json() resp = self.request_json(url, headers=self.headers)
creator = resp["creator"] creator = resp["creator"]
post = { post = {
"post_id" : resp["id"], "post_id" : resp["id"],
@@ -265,9 +265,9 @@ class SkebSearchExtractor(SkebExtractor):
data = {"requests": (request,)} data = {"requests": (request,)}
while True: while True:
result = self.request( result = self.request_json(
url, method="POST", params=params, headers=headers, json=data, url, method="POST", params=params, headers=headers, json=data,
).json()["results"][0] )["results"][0]
for post in result["hits"]: for post in result["hits"]:
parts = post["path"].split("/") parts = post["path"].split("/")

View File

@@ -105,7 +105,7 @@ class SlickpicAlbumExtractor(SlickpicExtractor):
"sng" : "0", "sng" : "0",
"whq" : "1", "whq" : "1",
} }
return self.request(url, method="POST", data=data).json()["list"] return self.request_json(url, method="POST", data=data)["list"]
class SlickpicUserExtractor(SlickpicExtractor): class SlickpicUserExtractor(SlickpicExtractor):

View File

@@ -30,7 +30,7 @@ class SpeakerdeckPresentationExtractor(GalleryExtractor):
params = { params = {
"url": f"{self.root}/{user}/{presentation}", "url": f"{self.root}/{user}/{presentation}",
} }
data = self.request(url, params=params).json() data = self.request_json(url, params=params)
self.presentation_id = text.extr( self.presentation_id = text.extr(
data["html"], 'src="//speakerdeck.com/player/', '"') data["html"], 'src="//speakerdeck.com/player/', '"')

View File

@@ -72,7 +72,7 @@ class SteamgriddbExtractor(Extractor):
yield Message.Url, url, text.nameext_from_url(url, asset) yield Message.Url, url, text.nameext_from_url(url, asset)
def _call(self, endpoint, **kwargs): def _call(self, endpoint, **kwargs):
data = self.request(self.root + endpoint, **kwargs).json() data = self.request_json(self.root + endpoint, **kwargs)
if not data["success"]: if not data["success"]:
raise exception.StopExtraction(data["error"]) raise exception.StopExtraction(data["error"])
return data["data"] return data["data"]

View File

@@ -233,7 +233,7 @@ class SubscribestarUserExtractor(SubscribestarExtractor):
url = text.extr(posts[-1], needle_next_page, '"') url = text.extr(posts[-1], needle_next_page, '"')
if not url: if not url:
return return
page = self.request(self.root + text.unescape(url)).json()["html"] page = self.request_json(self.root + text.unescape(url))["html"]
class SubscribestarPostExtractor(SubscribestarExtractor): class SubscribestarPostExtractor(SubscribestarExtractor):

View File

@@ -36,7 +36,7 @@ class SzurubooruExtractor(booru.BooruExtractor):
def _api_request(self, endpoint, params=None): def _api_request(self, endpoint, params=None):
url = self.root + "/api" + endpoint url = self.root + "/api" + endpoint
return self.request(url, headers=self.headers, params=params).json() return self.request_json(url, headers=self.headers, params=params)
def _pagination(self, endpoint, params): def _pagination(self, endpoint, params):
params["offset"] = 0 params["offset"] = 0

View File

@@ -67,7 +67,7 @@ class TapasExtractor(Extractor):
def request_api(self, url, params=None): def request_api(self, url, params=None):
headers = {"Accept": "application/json, text/javascript, */*;"} headers = {"Accept": "application/json, text/javascript, */*;"}
return self.request(url, params=params, headers=headers).json()["data"] return self.request_json(url, params=params, headers=headers)["data"]
class TapasEpisodeExtractor(TapasExtractor): class TapasEpisodeExtractor(TapasExtractor):

View File

@@ -137,8 +137,8 @@ class TsuminoSearchExtractor(TsuminoBase, Extractor):
data.update(self._parse(self.query)) data.update(self._parse(self.query))
while True: while True:
info = self.request( info = self.request_json(
url, method="POST", headers=headers, data=data).json() url, method="POST", headers=headers, data=data)
for gallery in info["data"]: for gallery in info["data"]:
yield gallery["entry"] yield gallery["entry"]

View File

@@ -61,7 +61,7 @@ class UnsplashExtractor(Extractor):
params["page"] = self.page_start params["page"] = self.page_start
while True: while True:
photos = self.request(url, params=params).json() photos = self.request_json(url, params=params)
if results: if results:
photos = photos["results"] photos = photos["results"]
yield from photos yield from photos
@@ -79,7 +79,7 @@ class UnsplashImageExtractor(UnsplashExtractor):
def photos(self): def photos(self):
url = f"{self.root}/napi/photos/{self.item}" url = f"{self.root}/napi/photos/{self.item}"
return (self.request(url).json(),) return (self.request_json(url),)
class UnsplashUserExtractor(UnsplashExtractor): class UnsplashUserExtractor(UnsplashExtractor):

View File

@@ -93,7 +93,7 @@ class VscoExtractor(Extractor):
yield from map(self._transform_media, extra) yield from map(self._transform_media, extra)
while True: while True:
data = self.request(url, params=params, headers=headers).json() data = self.request_json(url, params=params, headers=headers)
medias = data.get(key) medias = data.get(key)
if not medias: if not medias:
return return
@@ -238,7 +238,7 @@ class VscoSpaceExtractor(VscoExtractor):
return return
params["cursor"] = cursor["postcursorcontext"]["postId"] params["cursor"] = cursor["postcursorcontext"]["postId"]
data = self.request(url, params=params, headers=headers).json() data = self.request_json(url, params=params, headers=headers)
class VscoSpacesExtractor(VscoExtractor): class VscoSpacesExtractor(VscoExtractor):
@@ -262,7 +262,7 @@ class VscoSpacesExtractor(VscoExtractor):
} }
# this would theoretically need to be paginated # this would theoretically need to be paginated
url = f"{self.root}/grpc/spaces/user/{uid}" url = f"{self.root}/grpc/spaces/user/{uid}"
data = self.request(url, headers=headers).json() data = self.request_json(url, headers=headers)
for space in data["spacesWithRoleList"]: for space in data["spacesWithRoleList"]:
space = space["space"] space = space["space"]

View File

@@ -34,12 +34,12 @@ class WeasylExtractor(Extractor):
self.session.headers['X-Weasyl-API-Key'] = self.config("api-key") self.session.headers['X-Weasyl-API-Key'] = self.config("api-key")
def request_submission(self, submitid): def request_submission(self, submitid):
return self.request( return self.request_json(
f"{self.root}/api/submissions/{submitid}/view").json() f"{self.root}/api/submissions/{submitid}/view")
def retrieve_journal(self, journalid): def retrieve_journal(self, journalid):
data = self.request( data = self.request_json(
f"{self.root}/api/journals/{journalid}/view").json() f"{self.root}/api/journals/{journalid}/view")
data["extension"] = "html" data["extension"] = "html"
data["html"] = "text:" + data["content"] data["html"] = "text:" + data["content"]
data["date"] = text.parse_datetime(data["posted_at"]) data["date"] = text.parse_datetime(data["posted_at"])
@@ -54,7 +54,7 @@ class WeasylExtractor(Extractor):
} }
while True: while True:
data = self.request(url, params=params).json() data = self.request_json(url, params=params)
for submission in data["submissions"]: for submission in data["submissions"]:
if metadata: if metadata:
submission = self.request_submission( submission = self.request_submission(

View File

@@ -152,7 +152,7 @@ class WeiboExtractor(Extractor):
def _status_by_id(self, status_id): def _status_by_id(self, status_id):
url = f"{self.root}/ajax/statuses/show?id={status_id}" url = f"{self.root}/ajax/statuses/show?id={status_id}"
return self.request(url).json() return self.request_json(url)
def _user_id(self): def _user_id(self):
if len(self.user) >= 10 and self.user.isdecimal(): if len(self.user) >= 10 and self.user.isdecimal():
@@ -161,7 +161,7 @@ class WeiboExtractor(Extractor):
url = (f"{self.root}/ajax/profile/info?" url = (f"{self.root}/ajax/profile/info?"
f"{'screen_name' if self._prefix == 'n' else 'custom'}=" f"{'screen_name' if self._prefix == 'n' else 'custom'}="
f"{self.user}") f"{self.user}")
return self.request(url).json()["data"]["user"]["idstr"] return self.request_json(url)["data"]["user"]["idstr"]
def _pagination(self, endpoint, params): def _pagination(self, endpoint, params):
url = self.root + "/ajax" + endpoint url = self.root + "/ajax" + endpoint

View File

@@ -54,7 +54,7 @@ class WikiartExtractor(Extractor):
params.update(extra_params) params.update(extra_params)
while True: while True:
data = self.request(url, headers=headers, params=params).json() data = self.request_json(url, headers=headers, params=params)
items = data.get(key) items = data.get(key)
if not items: if not items:
return return
@@ -78,7 +78,7 @@ class WikiartArtistExtractor(WikiartExtractor):
def metadata(self): def metadata(self):
url = f"{self.root}/{self.lang}/{self.artist_name}?json=2" url = f"{self.root}/{self.lang}/{self.artist_name}?json=2"
self.artist = self.request(url).json() self.artist = self.request_json(url)
return {"artist": self.artist} return {"artist": self.artist}
def paintings(self): def paintings(self):

View File

@@ -107,7 +107,7 @@ class WikimediaExtractor(BaseExtractor):
) )
while True: while True:
data = self.request(url, params=params).json() data = self.request_json(url, params=params)
# ref: https://www.mediawiki.org/wiki/API:Errors_and_warnings # ref: https://www.mediawiki.org/wiki/API:Errors_and_warnings
error = data.get("error") error = data.get("error")

View File

@@ -74,7 +74,7 @@ class YiffverseExtractor(BooruExtractor):
def _fetch_post(self, post_id): def _fetch_post(self, post_id):
url = f"{self.root}/api/v2/post/{post_id}" url = f"{self.root}/api/v2/post/{post_id}"
return self.request(url).json() return self.request_json(url)
def _pagination(self, endpoint, params=None): def _pagination(self, endpoint, params=None):
url = f"{self.root}/api{endpoint}" url = f"{self.root}/api{endpoint}"
@@ -87,7 +87,7 @@ class YiffverseExtractor(BooruExtractor):
threshold = self.per_page threshold = self.per_page
while True: while True:
data = self.request(url, method="POST", json=params).json() data = self.request_json(url, method="POST", json=params)
yield from data["items"] yield from data["items"]