Signed-off-by: Ivan Schaller <ivan@schaller.sh>
This commit is contained in:
parent
2ad0c575a7
commit
5e28cb1088
12 changed files with 27 additions and 38 deletions
|
@ -3,7 +3,8 @@
|
||||||
|
|
||||||
class YourAPI:
|
class YourAPI:
|
||||||
"""Your API Class.
|
"""Your API Class.
|
||||||
Get infos for a manga from example.org
|
|
||||||
|
Get infos for a manga from example.org.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
url_uuid (str): URL or UUID of the manga
|
url_uuid (str): URL or UUID of the manga
|
||||||
|
@ -23,9 +24,7 @@ class YourAPI:
|
||||||
img_base_url = "https://uploads.mangadex.org"
|
img_base_url = "https://uploads.mangadex.org"
|
||||||
|
|
||||||
def __init__(self, url_uuid, language, forcevol):
|
def __init__(self, url_uuid, language, forcevol):
|
||||||
"""
|
"""get infos to initiate class."""
|
||||||
get infos to initiate class
|
|
||||||
"""
|
|
||||||
self.api_name = "Your API Name"
|
self.api_name = "Your API Name"
|
||||||
|
|
||||||
self.url_uuid = url_uuid
|
self.url_uuid = url_uuid
|
||||||
|
@ -67,8 +66,7 @@ class YourAPI:
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_chapter_images(chapter: str, download_wait: float) -> list:
|
def get_chapter_images(chapter: str, download_wait: float) -> list:
|
||||||
"""
|
"""Get chapter images as a list (full links).
|
||||||
Get chapter images as a list (full links)
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
chapter: The chapter number (chapter data index)
|
chapter: The chapter number (chapter data index)
|
||||||
|
@ -77,7 +75,6 @@ class YourAPI:
|
||||||
Returns:
|
Returns:
|
||||||
The list of urls of the page images
|
The list of urls of the page images
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# example
|
# example
|
||||||
return [
|
return [
|
||||||
"https://abc.def/image/123.png",
|
"https://abc.def/image/123.png",
|
||||||
|
@ -85,10 +82,10 @@ class YourAPI:
|
||||||
"https://abc.def/image/12345.png",
|
"https://abc.def/image/12345.png",
|
||||||
]
|
]
|
||||||
|
|
||||||
def create_metadata(self, chapter: str) -> dict:
|
def create_metadata(chapter: str) -> dict:
|
||||||
"""
|
"""Get metadata with correct keys for ComicInfo.xml.
|
||||||
Get metadata with correct keys for ComicInfo.xml
|
|
||||||
Provide as much metadata as possible. empty/false values will be ignored
|
Provide as much metadata as possible. empty/false values will be ignored.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
chapter: The chapter number (chapter data index)
|
chapter: The chapter number (chapter data index)
|
||||||
|
@ -96,7 +93,6 @@ class YourAPI:
|
||||||
Returns:
|
Returns:
|
||||||
The metadata as a dict
|
The metadata as a dict
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# metadata types. have to be valid
|
# metadata types. have to be valid
|
||||||
# {key: (type, default value, valid values)}
|
# {key: (type, default value, valid values)}
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,7 +9,8 @@ from mangadlp import utils
|
||||||
|
|
||||||
class Mangadex:
|
class Mangadex:
|
||||||
"""Mangadex API Class.
|
"""Mangadex API Class.
|
||||||
Get infos for a manga from mangadex.org
|
|
||||||
|
Get infos for a manga from mangadex.org.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
url_uuid (str): URL or UUID of the manga
|
url_uuid (str): URL or UUID of the manga
|
||||||
|
|
|
@ -14,7 +14,7 @@ from mangadlp.utils import get_file_format
|
||||||
|
|
||||||
|
|
||||||
def match_api(url_uuid: str) -> type:
|
def match_api(url_uuid: str) -> type:
|
||||||
"""Match the correct api class from a string
|
"""Match the correct api class from a string.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
url_uuid: url/uuid to check
|
url_uuid: url/uuid to check
|
||||||
|
@ -22,7 +22,6 @@ def match_api(url_uuid: str) -> type:
|
||||||
Returns:
|
Returns:
|
||||||
The class of the API to use
|
The class of the API to use
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# apis to check
|
# apis to check
|
||||||
apis: list[tuple[str, re.Pattern, type]] = [
|
apis: list[tuple[str, re.Pattern, type]] = [
|
||||||
(
|
(
|
||||||
|
@ -53,6 +52,7 @@ def match_api(url_uuid: str) -> type:
|
||||||
|
|
||||||
class MangaDLP:
|
class MangaDLP:
|
||||||
"""Download Mangas from supported sites.
|
"""Download Mangas from supported sites.
|
||||||
|
|
||||||
After initialization, start the script with the function get_manga().
|
After initialization, start the script with the function get_manga().
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
|
|
@ -228,11 +228,7 @@ def readin_list(_ctx, _param, value) -> list:
|
||||||
)
|
)
|
||||||
@click.pass_context
|
@click.pass_context
|
||||||
def main(ctx: click.Context, **kwargs) -> None:
|
def main(ctx: click.Context, **kwargs) -> None:
|
||||||
"""
|
"""Script to download mangas from various sites."""
|
||||||
Script to download mangas from various sites
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
url_uuid: str = kwargs.pop("url_uuid")
|
url_uuid: str = kwargs.pop("url_uuid")
|
||||||
read_mangas: list[str] = kwargs.pop("read_mangas")
|
read_mangas: list[str] = kwargs.pop("read_mangas")
|
||||||
verbosity: int = kwargs.pop("verbosity")
|
verbosity: int = kwargs.pop("verbosity")
|
||||||
|
|
|
@ -5,7 +5,10 @@ from loguru import logger as log
|
||||||
|
|
||||||
|
|
||||||
def run_hook(command: str, hook_type: str, **kwargs) -> int:
|
def run_hook(command: str, hook_type: str, **kwargs) -> int:
|
||||||
"""
|
"""Run a command.
|
||||||
|
|
||||||
|
Run a command with subprocess.run and add kwargs to the environment.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
command (str): command to run
|
command (str): command to run
|
||||||
hook_type (str): type of the hook
|
hook_type (str): type of the hook
|
||||||
|
@ -14,7 +17,6 @@ def run_hook(command: str, hook_type: str, **kwargs) -> int:
|
||||||
Returns:
|
Returns:
|
||||||
exit_code (int): exit code of command
|
exit_code (int): exit code of command
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# check if hook commands are empty
|
# check if hook commands are empty
|
||||||
if not command or command == "None":
|
if not command or command == "None":
|
||||||
log.debug(f"Hook '{hook_type}' empty. Not running")
|
log.debug(f"Hook '{hook_type}' empty. Not running")
|
||||||
|
|
|
@ -8,9 +8,7 @@ LOGURU_FMT = "{time:%Y-%m-%dT%H:%M:%S%z} | <level>[{level: <7}]</level> [{name:
|
||||||
|
|
||||||
# from loguru docs
|
# from loguru docs
|
||||||
class InterceptHandler(logging.Handler):
|
class InterceptHandler(logging.Handler):
|
||||||
"""
|
"""Intercept python logging messages and log them via loguru.logger."""
|
||||||
Intercept python logging messages and log them via loguru.logger
|
|
||||||
"""
|
|
||||||
|
|
||||||
def emit(self, record):
|
def emit(self, record):
|
||||||
# Get corresponding Loguru level if it exists
|
# Get corresponding Loguru level if it exists
|
||||||
|
|
|
@ -84,7 +84,7 @@ def validate_metadata(metadata_in: dict) -> Dict[str, dict]:
|
||||||
|
|
||||||
# check if metadata type is correct
|
# check if metadata type is correct
|
||||||
log.debug(f"Key:{key} -> value={type(md_to_check)} -> check={metadata_type}")
|
log.debug(f"Key:{key} -> value={type(md_to_check)} -> check={metadata_type}")
|
||||||
if not isinstance(md_to_check, metadata_type): # noqa
|
if not isinstance(md_to_check, metadata_type):
|
||||||
log.warning(
|
log.warning(
|
||||||
f"Metadata has wrong type: {key}:{metadata_type} -> {md_to_check}"
|
f"Metadata has wrong type: {key}:{metadata_type} -> {md_to_check}"
|
||||||
)
|
)
|
||||||
|
|
|
@ -16,8 +16,6 @@ def test_read_and_url():
|
||||||
|
|
||||||
|
|
||||||
def test_no_read_and_url():
|
def test_no_read_and_url():
|
||||||
url_uuid = "https://mangadex.org/title/0aea9f43-d4a9-4bf7-bebc-550a512f9b95/shikimori-s-not-just-a-cutie"
|
|
||||||
link_file = "tests/testfile.txt"
|
|
||||||
language = "en"
|
language = "en"
|
||||||
chapters = "1"
|
chapters = "1"
|
||||||
file_format = "cbz"
|
file_format = "cbz"
|
||||||
|
@ -30,7 +28,6 @@ def test_no_read_and_url():
|
||||||
def test_no_chaps():
|
def test_no_chaps():
|
||||||
url_uuid = "https://mangadex.org/title/0aea9f43-d4a9-4bf7-bebc-550a512f9b95/shikimori-s-not-just-a-cutie"
|
url_uuid = "https://mangadex.org/title/0aea9f43-d4a9-4bf7-bebc-550a512f9b95/shikimori-s-not-just-a-cutie"
|
||||||
language = "en"
|
language = "en"
|
||||||
chapters = ""
|
|
||||||
file_format = "cbz"
|
file_format = "cbz"
|
||||||
download_path = "tests"
|
download_path = "tests"
|
||||||
command_args = f"-u {url_uuid} -l {language} --path {download_path} --format {file_format} --debug"
|
command_args = f"-u {url_uuid} -l {language} --path {download_path} --format {file_format} --debug"
|
||||||
|
|
|
@ -40,7 +40,7 @@ def test_manga_pre_hook(wait_10s):
|
||||||
manga_pre_hook,
|
manga_pre_hook,
|
||||||
]
|
]
|
||||||
script_path = "manga-dlp.py"
|
script_path = "manga-dlp.py"
|
||||||
command = ["python3", script_path] + command_args
|
command = ["python3", script_path, *command_args]
|
||||||
|
|
||||||
assert subprocess.call(command) == 0
|
assert subprocess.call(command) == 0
|
||||||
assert hook_file.is_file()
|
assert hook_file.is_file()
|
||||||
|
@ -72,7 +72,7 @@ def test_manga_post_hook(wait_10s):
|
||||||
manga_post_hook,
|
manga_post_hook,
|
||||||
]
|
]
|
||||||
script_path = "manga-dlp.py"
|
script_path = "manga-dlp.py"
|
||||||
command = ["python3", script_path] + command_args
|
command = ["python3", script_path, *command_args]
|
||||||
|
|
||||||
assert subprocess.call(command) == 0
|
assert subprocess.call(command) == 0
|
||||||
assert hook_file.is_file()
|
assert hook_file.is_file()
|
||||||
|
@ -104,7 +104,7 @@ def test_chapter_pre_hook(wait_10s):
|
||||||
chapter_pre_hook,
|
chapter_pre_hook,
|
||||||
]
|
]
|
||||||
script_path = "manga-dlp.py"
|
script_path = "manga-dlp.py"
|
||||||
command = ["python3", script_path] + command_args
|
command = ["python3", script_path, *command_args]
|
||||||
|
|
||||||
assert subprocess.call(command) == 0
|
assert subprocess.call(command) == 0
|
||||||
assert hook_file.is_file()
|
assert hook_file.is_file()
|
||||||
|
@ -136,7 +136,7 @@ def test_chapter_post_hook(wait_10s):
|
||||||
chapter_post_hook,
|
chapter_post_hook,
|
||||||
]
|
]
|
||||||
script_path = "manga-dlp.py"
|
script_path = "manga-dlp.py"
|
||||||
command = ["python3", script_path] + command_args
|
command = ["python3", script_path, *command_args]
|
||||||
|
|
||||||
assert subprocess.call(command) == 0
|
assert subprocess.call(command) == 0
|
||||||
assert hook_file.is_file()
|
assert hook_file.is_file()
|
||||||
|
@ -176,7 +176,7 @@ def test_all_hooks(wait_10s):
|
||||||
chapter_post_hook,
|
chapter_post_hook,
|
||||||
]
|
]
|
||||||
script_path = "manga-dlp.py"
|
script_path = "manga-dlp.py"
|
||||||
command = ["python3", script_path] + command_args
|
command = ["python3", script_path, *command_args]
|
||||||
|
|
||||||
assert subprocess.call(command) == 0
|
assert subprocess.call(command) == 0
|
||||||
assert Path("tests/manga-pre2.txt").is_file()
|
assert Path("tests/manga-pre2.txt").is_file()
|
||||||
|
|
|
@ -6,7 +6,7 @@ from mangadlp.cache import CacheDB
|
||||||
|
|
||||||
def test_cache_creation():
|
def test_cache_creation():
|
||||||
cache_file = Path("cache.json")
|
cache_file = Path("cache.json")
|
||||||
cache = CacheDB(cache_file, "abc", "en", "test")
|
CacheDB(cache_file, "abc", "en", "test")
|
||||||
|
|
||||||
assert cache_file.exists()
|
assert cache_file.exists()
|
||||||
cache_file.unlink()
|
cache_file.unlink()
|
||||||
|
|
|
@ -133,7 +133,7 @@ def test_metadata_chapter_validity(wait_20s):
|
||||||
schema = xmlschema.XMLSchema("mangadlp/metadata/ComicInfo_v2.0.xsd")
|
schema = xmlschema.XMLSchema("mangadlp/metadata/ComicInfo_v2.0.xsd")
|
||||||
|
|
||||||
script_path = "manga-dlp.py"
|
script_path = "manga-dlp.py"
|
||||||
command = ["python3", script_path] + command_args
|
command = ["python3", script_path, *command_args]
|
||||||
|
|
||||||
assert subprocess.call(command) == 0
|
assert subprocess.call(command) == 0
|
||||||
assert metadata_path.is_file()
|
assert metadata_path.is_file()
|
||||||
|
|
|
@ -56,7 +56,7 @@ def test_alt_title_fallback():
|
||||||
forcevol = False
|
forcevol = False
|
||||||
test = Mangadex(url_uuid, language, forcevol)
|
test = Mangadex(url_uuid, language, forcevol)
|
||||||
|
|
||||||
assert test.manga_title == "Iruma à l’école des démons"
|
assert test.manga_title == "Iruma à l`école des démons"
|
||||||
|
|
||||||
|
|
||||||
def test_chapter_infos():
|
def test_chapter_infos():
|
||||||
|
@ -206,7 +206,6 @@ def test_get_chapter_images():
|
||||||
test = Mangadex(url_uuid, language, forcevol)
|
test = Mangadex(url_uuid, language, forcevol)
|
||||||
img_base_url = "https://uploads.mangadex.org"
|
img_base_url = "https://uploads.mangadex.org"
|
||||||
chapter_hash = "0752bc5db298beff6b932b9151dd8437"
|
chapter_hash = "0752bc5db298beff6b932b9151dd8437"
|
||||||
chapter_uuid = "e86ec2c4-c5e4-4710-bfaa-7604f00939c7"
|
|
||||||
chapter_num = "1"
|
chapter_num = "1"
|
||||||
test_list = [
|
test_list = [
|
||||||
f"{img_base_url}/data/{chapter_hash}/x1-0deb4c9bfedd5be49e0a90cfb17cf343888239898c9e7451d569c0b3ea2971f4.jpg",
|
f"{img_base_url}/data/{chapter_hash}/x1-0deb4c9bfedd5be49e0a90cfb17cf343888239898c9e7451d569c0b3ea2971f4.jpg",
|
||||||
|
|
Loading…
Reference in a new issue