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

View File

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

View File

@@ -29,7 +29,7 @@ class _4chanThreadExtractor(Extractor):
def items(self):
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"])
data = {
@@ -62,7 +62,7 @@ class _4chanBoardExtractor(Extractor):
def items(self):
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 thread in page["threads"]:

View File

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

View File

@@ -80,7 +80,7 @@ class _8chanThreadExtractor(_8chanExtractor):
# fetch thread data
url = f"{self.root}/{board}/res/{thread}."
self.session.headers["Referer"] = url + "html"
thread = self.request(url + "json").json()
thread = self.request_json(url + "json")
thread["postId"] = thread["threadId"]
thread["_http_headers"] = {"Referer": url + "html"}
@@ -117,7 +117,7 @@ class _8chanBoardExtractor(_8chanExtractor):
pnum = text.parse_int(pnum, 1)
url = f"{self.root}/{board}/{pnum}.json"
data = self.request(url).json()
data = self.request_json(url)
threads = data["threads"]
while True:
@@ -130,4 +130,4 @@ class _8chanBoardExtractor(_8chanExtractor):
if pnum > data["pageCount"]:
return
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"
try:
data = self.request(url).json()
data = self.request_json(url)
except exception.HttpError as exc:
self.log.warning(exc)
return
@@ -152,7 +152,7 @@ class ArtstationExtractor(Extractor):
params["page"] = 1
while True:
data = self.request(url, **kwargs).json()
data = self.request_json(url, **kwargs)
yield from data["data"]
total += len(data["data"])
@@ -167,9 +167,8 @@ class ArtstationExtractor(Extractor):
"Accept" : "*/*",
"Origin" : self.root,
}
return self.request(
url, method="POST", headers=headers, json={},
).json()["public_csrf_token"]
return self.request_json(
url, method="POST", headers=headers, json={})["public_csrf_token"]
def _no_cache(self, url):
"""Cause a cache miss to prevent Cloudflare 'optimizations'
@@ -269,8 +268,8 @@ class ArtstationCollectionExtractor(ArtstationExtractor):
def metadata(self):
url = f"{self.root}/collections/{self.collection_id}.json"
params = {"username": self.user}
collection = self.request(
url, params=params, notfound="collection").json()
collection = self.request_json(
url, params=params, notfound="collection")
return {"collection": collection, "user": self.user}
def projects(self):
@@ -290,8 +289,8 @@ class ArtstationCollectionsExtractor(ArtstationExtractor):
url = self.root + "/collections.json"
params = {"username": self.user}
for collection in self.request(
url, params=params, notfound="collections").json():
for collection in self.request_json(
url, params=params, notfound="collections"):
url = f"{self.root}/{self.user}/collections/{collection['id']}"
collection["_extractor"] = ArtstationCollectionExtractor
yield Message.Queue, url, collection
@@ -320,7 +319,7 @@ class ArtstationChallengeExtractor(ArtstationExtractor):
submission_url = f"{base}/submissions.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}
params = {"sorting": self.sorting}

View File

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

View File

@@ -108,7 +108,7 @@ class BilibiliAPI():
def _call(self, endpoint, params):
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:
self.extractor.log.debug("Server response: %s", data)
@@ -159,7 +159,7 @@ class BilibiliAPI():
def login_user_id(self):
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:
self.extractor.log.debug("Server response: %s", data)

View File

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

View File

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

View File

@@ -144,12 +144,12 @@ class CienArticleExtractor(CienExtractor):
"gallery_id": text.extr(gallery, ' gallery-id="', '"'),
"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"
for params["page"], params["file_id"] in enumerate(
data["imgList"]):
path = self.request(url, params=params).json()["path"]
path = self.request_json(url, params=params)["path"]
file = params.copy()
file["url"] = path

View File

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

View File

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

View File

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

View File

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

View File

@@ -299,7 +299,7 @@ class ExhentaiGalleryExtractor(ExhentaiExtractor):
"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:
raise exception.StopExtraction(data["error"])
@@ -351,7 +351,7 @@ class ExhentaiGalleryExtractor(ExhentaiExtractor):
}
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"]
i6 = page["i6"]

View File

@@ -93,7 +93,7 @@ class FantiaExtractor(Extractor):
def _get_post_data(self, post_id):
"""Fetch and process post data"""
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 {
"post_id": resp["id"],
"post_url": self.root + "/posts/" + str(resp["id"]),

View File

@@ -159,7 +159,7 @@ class FoolfuukaThreadExtractor(FoolfuukaExtractor):
def metadata(self):
url = self.root + "/_/api/chan/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"]
def posts(self):
@@ -243,7 +243,7 @@ class FoolfuukaSearchExtractor(FoolfuukaExtractor):
while True:
try:
data = self.request(url, params=params).json()
data = self.request_json(url, params=params)
except ValueError:
return

View File

@@ -74,7 +74,7 @@ class Furry34Extractor(BooruExtractor):
def _fetch_post(self, 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):
url = f"{self.root}/api{endpoint}"
@@ -86,7 +86,7 @@ class Furry34Extractor(BooruExtractor):
threshold = self.per_page
while True:
data = self.request(url, method="POST", json=params).json()
data = self.request_json(url, method="POST", json=params)
yield from data["items"]

View File

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

View File

@@ -30,7 +30,7 @@ class GelbooruBase():
params["user_id"] = self.user_id
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:
return data

View File

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

View File

@@ -44,7 +44,7 @@ class HentaihandGalleryExtractor(GalleryExtractor):
return data
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"]]
@@ -69,7 +69,7 @@ class HentaihandTagExtractor(Extractor):
tpl = self.type + "s"
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"
params = {
@@ -82,7 +82,7 @@ class HentaihandTagExtractor(Extractor):
"duration": "day",
}
while True:
info = self.request(url, params=params).json()
info = self.request_json(url, params=params)
for gallery in info["data"]:
gurl = f"{self.root}/en/comic/{gallery['slug']}"

View File

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

View File

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

View File

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

View File

@@ -341,7 +341,7 @@ class InkbunnyAPI():
while True:
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:
return data
@@ -378,7 +378,7 @@ def _authenticate_impl(api, username, password):
url = "https://inkbunny.net/api_login.php"
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:
raise exception.AuthenticationError(data.get("error_message"))

View File

@@ -884,7 +884,7 @@ class InstagramRestAPI():
"Sec-Fetch-Mode" : "cors",
"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):
if params is None:
@@ -1047,7 +1047,7 @@ class InstagramGraphqlAPI():
"X-Requested-With": "XMLHttpRequest",
"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,
key_data="user", key_edge=None):

View File

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

View File

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

View File

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

View File

@@ -72,7 +72,7 @@ class LolisafeAlbumExtractor(LolisafeExtractor):
def fetch_album(self, album_id):
url = f"{self.root}/api/album/get/{album_id}"
data = self.request(url).json()
data = self.request_json(url)
return data["files"], {
"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])
url = ("https://auth.mangadex.org/realms/mangadex"
"/protocol/openid-connect/token")
data = self.extractor.request(
url, method="POST", data=data, fatal=None).json()
data = self.extractor.request_json(
url, method="POST", data=data, fatal=None)
try:
access_token = data["access_token"]
@@ -328,8 +328,8 @@ class MangadexAPI():
json = {"username": username, "password": password}
self.extractor.log.debug("Using legacy login method")
data = self.extractor.request(
url, method="POST", json=json, fatal=None).json()
data = self.extractor.request_json(
url, method="POST", json=json, fatal=None)
if data.get("result") != "ok":
raise exception.AuthenticationError()

View File

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

View File

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

View File

@@ -89,7 +89,7 @@ class NaverwebtoonComicExtractor(NaverwebtoonBase, Extractor):
}
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)
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",
"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)
src = next(formats, "")
date = text.parse_timestamp(src.rpartition("?")[2])
@@ -566,7 +566,7 @@ class NewgroundsSearchExtractor(NewgroundsExtractor):
}
while True:
data = self.request(url, params=params, headers=headers).json()
data = self.request_json(url, params=params, headers=headers)
post_url = None
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,
'giraffe.annihilate("', '"')[0])
params = {"spirit": spirit, "photo": image_id}
data = self.request(backend, params=params).json()
data = self.request_json(backend, params=params)
break
except Exception:
tries += 1

View File

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

View File

@@ -131,7 +131,7 @@ class PatreonExtractor(Extractor):
while 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:
included = self._transform(posts["included"])

View File

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

View File

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

View File

@@ -55,7 +55,7 @@ class PiczelExtractor(Extractor):
params = {"page": pnum}
while True:
data = self.request(url, params=params).json()
data = self.request_json(url, params=params)
yield from data["data"]
@@ -96,4 +96,4 @@ class PiczelImageExtractor(PiczelExtractor):
def posts(self):
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):
url = f"{self.root}/posts/{self.item}/json/"
return (self.request(url).json(),)
return (self.request_json(url),)
class PillowfortUserExtractor(PillowfortExtractor):
@@ -140,7 +140,7 @@ class PillowfortUserExtractor(PillowfortExtractor):
params = {"p": 1}
while True:
posts = self.request(url, params=params).json()["posts"]
posts = self.request_json(url, params=params)["posts"]
yield from posts
if len(posts) < 20:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -54,7 +54,7 @@ class Rule34vaultExtractor(BooruExtractor):
def _fetch_post(self, 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):
url = f"{self.root}/api{endpoint}"
@@ -67,7 +67,7 @@ class Rule34vaultExtractor(BooruExtractor):
threshold = self.per_page
while True:
data = self.request(url, method="POST", json=params).json()
data = self.request_json(url, method="POST", json=params)
yield from data["items"]

View File

@@ -88,7 +88,7 @@ class Rule34xyzExtractor(BooruExtractor):
def _fetch_post(self, 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):
url = f"{self.root}/api{endpoint}"
@@ -103,7 +103,7 @@ class Rule34xyzExtractor(BooruExtractor):
threshold = self.per_page
while True:
data = self.request(url, method="POST", json=params).json()
data = self.request_json(url, method="POST", json=params)
yield from data["items"]

View File

@@ -40,8 +40,8 @@ class SchalenetworkExtractor(Extractor):
url_api = self.root_api + endpoint
while True:
data = self.request(
url_api, params=params, headers=self.headers).json()
data = self.request_json(
url_api, params=params, headers=self.headers)
try:
entries = data["entries"]
@@ -106,7 +106,7 @@ class SchalenetworkGalleryExtractor(SchalenetworkExtractor, GalleryExtractor):
def metadata(self, _):
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)
tags = []
@@ -149,16 +149,16 @@ class SchalenetworkGalleryExtractor(SchalenetworkExtractor, GalleryExtractor):
if self.cbz:
params["action"] = "dl"
base = self.request(
base = self.request_json(
url, method="POST", params=params, headers=self.headers,
).json()["base"]
)["base"]
url = f"{base}?v={data['updated_at']}&w={fmt['w']}"
info = text.nameext_from_url(base)
if not info["extension"]:
info["extension"] = "cbz"
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"]
results = []

View File

@@ -110,9 +110,9 @@ class ScrolllerExtractor(Extractor):
url = "https://api.scrolller.com/api/v2/graphql"
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),
).json()["data"]
)["data"]
def _pagination(self, opname, variables, data=None):
if data is None:

View File

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

View File

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

View File

@@ -105,7 +105,7 @@ class SlickpicAlbumExtractor(SlickpicExtractor):
"sng" : "0",
"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):

View File

@@ -30,7 +30,7 @@ class SpeakerdeckPresentationExtractor(GalleryExtractor):
params = {
"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(
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)
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"]:
raise exception.StopExtraction(data["error"])
return data["data"]

View File

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

View File

@@ -36,7 +36,7 @@ class SzurubooruExtractor(booru.BooruExtractor):
def _api_request(self, endpoint, params=None):
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):
params["offset"] = 0

View File

@@ -67,7 +67,7 @@ class TapasExtractor(Extractor):
def request_api(self, url, params=None):
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):

View File

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

View File

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

View File

@@ -93,7 +93,7 @@ class VscoExtractor(Extractor):
yield from map(self._transform_media, extra)
while True:
data = self.request(url, params=params, headers=headers).json()
data = self.request_json(url, params=params, headers=headers)
medias = data.get(key)
if not medias:
return
@@ -238,7 +238,7 @@ class VscoSpaceExtractor(VscoExtractor):
return
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):
@@ -262,7 +262,7 @@ class VscoSpacesExtractor(VscoExtractor):
}
# this would theoretically need to be paginated
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"]:
space = space["space"]

View File

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

View File

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

View File

@@ -54,7 +54,7 @@ class WikiartExtractor(Extractor):
params.update(extra_params)
while True:
data = self.request(url, headers=headers, params=params).json()
data = self.request_json(url, headers=headers, params=params)
items = data.get(key)
if not items:
return
@@ -78,7 +78,7 @@ class WikiartArtistExtractor(WikiartExtractor):
def metadata(self):
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}
def paintings(self):

View File

@@ -107,7 +107,7 @@ class WikimediaExtractor(BaseExtractor):
)
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
error = data.get("error")

View File

@@ -74,7 +74,7 @@ class YiffverseExtractor(BooruExtractor):
def _fetch_post(self, 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):
url = f"{self.root}/api{endpoint}"
@@ -87,7 +87,7 @@ class YiffverseExtractor(BooruExtractor):
threshold = self.per_page
while True:
data = self.request(url, method="POST", json=params).json()
data = self.request_json(url, method="POST", json=params)
yield from data["items"]