manga-dlp/mangadlp/utils.py

138 lines
5 KiB
Python
Raw Permalink Normal View History

import re
2022-07-06 22:19:40 +02:00
from datetime import datetime
from pathlib import Path
2022-06-20 17:46:04 +02:00
from typing import Any
from zipfile import ZipFile
from loguru import logger as log
2022-07-21 20:39:56 +02:00
2022-05-16 16:09:17 +02:00
# create an archive of the chapter images
def make_archive(chapter_path: Path, file_format: str) -> None:
zip_path: Path = Path(f"{chapter_path}.zip")
2022-05-16 16:09:17 +02:00
try:
# create zip
with ZipFile(zip_path, "w") as zipfile:
for file in chapter_path.iterdir():
zipfile.write(file, file.name)
# rename zip to file format requested
zip_path.rename(zip_path.with_suffix(file_format))
2022-07-22 21:11:01 +02:00
except Exception as exc:
raise IOError from exc
def make_pdf(chapter_path: Path) -> None:
2022-05-16 16:09:17 +02:00
try:
import img2pdf # pylint: disable=import-outside-toplevel
2022-07-22 21:11:01 +02:00
except Exception as exc:
2022-07-15 12:49:49 +02:00
log.error("Cant import img2pdf. Please install it first")
2022-07-22 21:11:01 +02:00
raise ImportError from exc
pdf_path: Path = Path(f"{chapter_path}.pdf")
images: list[str] = []
2022-05-16 16:09:17 +02:00
for file in chapter_path.iterdir():
images.append(str(file))
try:
pdf_path.write_bytes(img2pdf.convert(images))
2022-07-22 21:11:01 +02:00
except Exception as exc:
2022-07-15 12:49:49 +02:00
log.error("Can't create '.pdf' archive")
2022-07-22 21:11:01 +02:00
raise IOError from exc
# create a list of chapters
2022-06-20 17:46:04 +02:00
def get_chapter_list(chapters: str, available_chapters: list) -> list:
# check if there are available chapter
chapter_list: list[str] = []
2022-05-04 19:17:12 +02:00
for chapter in chapters.split(","):
2022-06-20 17:46:04 +02:00
# check if chapter list is with volumes and ranges (forcevol)
2022-05-04 19:17:12 +02:00
if "-" in chapter and ":" in chapter:
2022-05-13 22:34:25 +02:00
# split chapters and volumes apart for list generation
2022-06-20 17:46:04 +02:00
lower_num_fv: list[str] = chapter.split("-")[0].split(":")
upper_num_fv: list[str] = chapter.split("-")[1].split(":")
vol_fv: str = lower_num_fv[0]
chap_beg_fv: int = int(lower_num_fv[1])
chap_end_fv: int = int(upper_num_fv[1])
# generate range inbetween start and end --> 1:1-1:3 == 1:1,1:2,1:3
2022-06-20 17:46:04 +02:00
for chap in range(chap_beg_fv, chap_end_fv + 1):
chapter_list.append(str(f"{vol_fv}:{chap}"))
2022-05-13 22:34:25 +02:00
# no volumes, just chapter ranges
2022-05-04 19:17:12 +02:00
elif "-" in chapter:
2022-06-20 17:46:04 +02:00
lower_num: int = int(chapter.split("-")[0])
upper_num: int = int(chapter.split("-")[1])
2022-05-13 22:34:25 +02:00
# generate range inbetween start and end --> 1-3 == 1,2,3
for chap in range(lower_num, upper_num + 1):
chapter_list.append(str(chap))
# check if full volume should be downloaded
elif ":" in chapter:
2022-06-20 17:46:04 +02:00
vol_num: str = chapter.split(":")[0]
chap_num: str = chapter.split(":")[1]
# select all chapters from the volume --> 1: == 1:1,1:2,1:3...
2022-06-20 17:46:04 +02:00
if vol_num and not chap_num:
regex: Any = re.compile(f"{vol_num}:[0-9]{{1,4}}")
vol_list: list[str] = [n for n in available_chapters if regex.match(n)]
chapter_list.extend(vol_list)
else:
chapter_list.append(chapter)
2022-05-13 22:34:25 +02:00
# single chapters without a range given
2022-05-04 19:17:12 +02:00
else:
chapter_list.append(chapter)
2022-05-04 19:17:12 +02:00
return chapter_list
# remove illegal characters etc
def fix_name(filename: str) -> str:
filename = filename.encode(encoding="ascii", errors="ignore").decode(
encoding="utf8"
)
2022-05-04 19:17:12 +02:00
# remove illegal characters
2022-05-17 22:10:16 +02:00
filename = re.sub(r'[/\\<>:;|?*!@"]', "", filename)
# remove multiple dots
2022-05-17 22:10:16 +02:00
filename = re.sub(r"([.]{2,})", ".", filename)
# remove dot(s) at the beginning and end of the filename
2022-05-17 22:10:16 +02:00
filename = re.sub(r"(^[.]+)|([.]+$)", "", filename)
# remove trailing and beginning spaces
filename = re.sub("([ \t]+$)|(^[ \t]+)", "", filename)
return filename
# create name for chapter
def get_filename(
chapter_name: str, chapter_vol: str, chapter_num: str, forcevol: bool
) -> str:
2022-05-13 22:34:25 +02:00
# if chapter is a oneshot
2022-05-04 19:17:12 +02:00
if chapter_name == "Oneshot" or chapter_num == "Oneshot":
2022-05-13 22:34:25 +02:00
return "Oneshot"
# if the chapter has no name
if not chapter_name:
return (
f"Vol. {chapter_vol} Ch. {chapter_num}"
if forcevol
else f"Ch. {chapter_num}"
)
# if the chapter has a name
# return with volume if option is set, else just the chapter num and name
return (
f"Vol. {chapter_vol} Ch. {chapter_num} - {chapter_name}"
if forcevol
else f"Ch. {chapter_num} - {chapter_name}"
)
def progress_bar(progress: float, total: float) -> None:
2022-12-30 01:46:53 +01:00
time = datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
percent = int(progress / (int(total) / 100))
bar_length = 50
bar_progress = int(progress / (int(total) / bar_length))
bar_texture = "" * bar_progress
whitespace_texture = " " * (bar_length - bar_progress)
if progress == total:
2022-05-16 16:09:17 +02:00
full_bar = "" * bar_length
2022-12-30 01:46:53 +01:00
print(f"\r{time}{' '*6}| [BAR ] ❙{full_bar}❙ 100%", end="\n")
else:
2022-12-30 01:46:53 +01:00
print(
f"\r{time}{' '*6}| [BAR ] ❙{bar_texture}{whitespace_texture}{percent}%",
end="\r",
)