aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/tsumino.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/tsumino.py')
-rw-r--r--gallery_dl/extractor/tsumino.py49
1 files changed, 23 insertions, 26 deletions
diff --git a/gallery_dl/extractor/tsumino.py b/gallery_dl/extractor/tsumino.py
index b196aeb..8732c60 100644
--- a/gallery_dl/extractor/tsumino.py
+++ b/gallery_dl/extractor/tsumino.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright 2019-2023 Mike Fährmann
+# Copyright 2019-2025 Mike Fährmann
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
@@ -30,7 +30,7 @@ class TsuminoBase():
@cache(maxage=14*86400, keyarg=1)
def _login_impl(self, username, password):
self.log.info("Logging in as %s", username)
- url = "{}/Account/Login".format(self.root)
+ url = f"{self.root}/Account/Login"
headers = {"Referer": url}
data = {"Username": username, "Password": password}
@@ -47,8 +47,8 @@ class TsuminoGalleryExtractor(TsuminoBase, GalleryExtractor):
example = "https://www.tsumino.com/entry/12345"
def __init__(self, match):
- self.gallery_id = match.group(1)
- url = "{}/entry/{}".format(self.root, self.gallery_id)
+ self.gallery_id = match[1]
+ url = f"{self.root}/entry/{self.gallery_id}"
GalleryExtractor.__init__(self, match, url)
def metadata(self, page):
@@ -81,14 +81,14 @@ class TsuminoGalleryExtractor(TsuminoBase, GalleryExtractor):
}
def images(self, page):
- url = "{}/Read/Index/{}?page=1".format(self.root, self.gallery_id)
- headers = {"Referer": self.gallery_url}
+ url = f"{self.root}/Read/Index/{self.gallery_id}?page=1"
+ headers = {"Referer": self.page_url}
response = self.request(url, headers=headers, fatal=False)
if "/Auth/" in response.url:
- raise exception.StopExtraction(
- "Failed to get gallery JSON data. Visit '%s' in a browser "
- "and solve the CAPTCHA to continue.", response.url)
+ raise exception.AbortExtraction(
+ f"Failed to get gallery JSON data. Visit '{response.url}' "
+ f"in a browser and solve the CAPTCHA to continue.")
page = response.text
tpl, pos = text.extract(page, 'data-cdn="', '"')
@@ -109,19 +109,19 @@ class TsuminoSearchExtractor(TsuminoBase, Extractor):
def __init__(self, match):
Extractor.__init__(self, match)
- self.query = match.group(1)
+ self.query = match[1]
def items(self):
for gallery in self.galleries():
- url = "{}/entry/{}".format(self.root, gallery["id"])
+ url = f"{self.root}/entry/{gallery['id']}"
gallery["_extractor"] = TsuminoGalleryExtractor
yield Message.Queue, url, gallery
def galleries(self):
"""Return all gallery results matching 'self.query'"""
- url = "{}/Search/Operate?type=Book".format(self.root)
+ url = f"{self.root}/Search/Operate?type=Book"
headers = {
- "Referer": "{}/".format(self.root),
+ "Referer": f"{self.root}/",
"X-Requested-With": "XMLHttpRequest",
}
data = {
@@ -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"]
@@ -155,11 +155,10 @@ class TsuminoSearchExtractor(TsuminoBase, Extractor):
return self._parse_simple(query)
return self._parse_jsurl(query)
except Exception as exc:
- raise exception.StopExtraction(
- "Invalid search query '%s' (%s)", query, exc)
+ raise exception.AbortExtraction(
+ f"Invalid search query '{query}' ({exc})")
- @staticmethod
- def _parse_simple(query):
+ def _parse_simple(self, query):
"""Parse search query with format '?<key>=value>'"""
key, _, value = query.partition("=")
tag_types = {
@@ -179,8 +178,7 @@ class TsuminoSearchExtractor(TsuminoBase, Extractor):
"Tags[0][Exclude]": "false",
}
- @staticmethod
- def _parse_jsurl(data):
+ def _parse_jsurl(self, data):
"""Parse search query in JSURL format
Nested lists and dicts are handled in a special way to deal
@@ -196,9 +194,8 @@ class TsuminoSearchExtractor(TsuminoBase, Extractor):
nonlocal i
if data[i] != expected:
- error = "bad JSURL syntax: expected '{}', got {}".format(
- expected, data[i])
- raise ValueError(error)
+ raise ValueError(
+ f"bad JSURL syntax: expected '{expected}', got {data[i]}")
i += 1
def decode():
@@ -295,11 +292,11 @@ class TsuminoSearchExtractor(TsuminoBase, Extractor):
def expand(key, value):
if isinstance(value, list):
for index, cvalue in enumerate(value):
- ckey = "{}[{}]".format(key, index)
+ ckey = f"{key}[{index}]"
yield from expand(ckey, cvalue)
elif isinstance(value, dict):
for ckey, cvalue in value.items():
- ckey = "{}[{}]".format(key, ckey)
+ ckey = f"{key}[{ckey}]"
yield from expand(ckey, cvalue)
else:
yield key, value