first commit
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
import xml.etree.ElementTree as XML
|
||||
from pathlib import Path
|
||||
import tempfile
|
||||
|
||||
import questionary
|
||||
from rich import print
|
||||
from rich.progress import Progress, SpinnerColumn, TextColumn, MofNCompleteColumn
|
||||
|
||||
from sites import Provider
|
||||
from packager import download_images, zip_files
|
||||
|
||||
class Manga():
|
||||
def __init__(self, provider:Provider, cached:list[int] = []) -> None:
|
||||
self.site = provider
|
||||
self.cached = cached
|
||||
self.info, self.chapters = self.site.get_mediainfo()
|
||||
self.slug = self.slugify(self.info.get("series")) # type: ignore
|
||||
|
||||
@staticmethod
|
||||
def slugify(string:str) -> str:
|
||||
string = "".join(x for x in string if not x in '<>:"/\\|?*')
|
||||
return str(string)
|
||||
|
||||
def _generateComicInfo(self, chapter:dict, dir:Path):
|
||||
filename = dir.joinpath("ComicInfo.xml")
|
||||
ComicInfo = XML.Element("ComicInfo")
|
||||
|
||||
XML.SubElement(ComicInfo, "Series").text = self.info.get("series")
|
||||
XML.SubElement(ComicInfo, "Writer").text = ",".join(self.info.get("writer")) # type: ignore
|
||||
XML.SubElement(ComicInfo, "Penciller").text = ",".join(self.info.get("penciller")) # type: ignore
|
||||
XML.SubElement(ComicInfo, "Genre").text = ",".join(self.info.get("genre")) # type: ignore
|
||||
XML.SubElement(ComicInfo, "Summary").text = self.info.get("summary")
|
||||
XML.SubElement(ComicInfo, "Number").text = str(chapter.get("nr"))
|
||||
XML.SubElement(ComicInfo, "Title").text = chapter.get("title")
|
||||
XML.SubElement(ComicInfo, "LanguageISO").text = self.info.get("languageISO")
|
||||
XML.SubElement(ComicInfo, "PageCount").text = str(len(chapter.get("images"))) # type: ignore
|
||||
XML.SubElement(ComicInfo, "ScanInformation").text = self.info.get("scanInformation")
|
||||
|
||||
tree = XML.ElementTree(ComicInfo)
|
||||
|
||||
XML.indent(tree, space="\t", level=0)
|
||||
tree.write(str(filename), encoding="utf-8")
|
||||
|
||||
return filename
|
||||
|
||||
@staticmethod
|
||||
def printMangaInfo(info:dict):
|
||||
print(info)
|
||||
|
||||
def choose_chapters(self, auto):
|
||||
choices = [
|
||||
questionary.Choice(
|
||||
f"{chapter.get("nr"):02d}: {chapter.get("title")}",
|
||||
chapter,
|
||||
checked = chapter.get("nr") not in self.cached
|
||||
) for chapter in self.chapters
|
||||
]
|
||||
self.chapters = questionary.checkbox(
|
||||
"Choose which chapters to download",
|
||||
choices
|
||||
).skip_if(
|
||||
auto,
|
||||
[chapter for chapter in self.chapters if chapter.get("nr") not in self.cached]
|
||||
).ask()
|
||||
|
||||
def download(self, save_dir:Path):
|
||||
with tempfile.TemporaryDirectory(prefix="manga_") as temp_dir:
|
||||
if self.chapters:
|
||||
with Progress(
|
||||
TextColumn("[progress.description]{task.description}"),
|
||||
MofNCompleteColumn(),
|
||||
SpinnerColumn()
|
||||
) as p:
|
||||
task = p.add_task(f"[bold]Processing [orange3]{self.info.get("series")}[/]", total=len(self.chapters))
|
||||
while not p.finished:
|
||||
for chapter in self.chapters:
|
||||
print(f"Downloading [bold blue]Chapter {chapter.get("nr"):02d}[/]...")
|
||||
files = [self._generateComicInfo(chapter, Path(temp_dir))]
|
||||
files.extend(download_images(chapter.get("images"), Path(temp_dir))) # type: ignore
|
||||
zip_files(self.slug, chapter, files, save_dir)
|
||||
self.cached.append(chapter.get("nr"))
|
||||
p.update(task, advance=1)
|
||||
else:
|
||||
print("No new [orange3]Chapter[/] were found...")
|
||||
Reference in New Issue
Block a user