Base app
This commit is contained in:
30
src/cli.py
30
src/cli.py
@@ -59,23 +59,26 @@ def cli(ctx, verbose):
|
||||
help="Папка для сохранения", show_default=True)
|
||||
@click.option("--resume/--no-resume", default=True,
|
||||
help="Пропускать уже скачанные главы")
|
||||
@click.option("--force", "-F", is_flag=True, default=False,
|
||||
help="Игнорировать состояние и скачать заново, перезаписывая файлы")
|
||||
@click.option("--concurrency", default=4, show_default=True,
|
||||
help="Параллельных загрузок изображений")
|
||||
@click.pass_context
|
||||
def download(ctx, url, fmt, chapters, output, resume, concurrency):
|
||||
def download(ctx, url, fmt, chapters, output, resume, force, concurrency):
|
||||
"""Скачать мангу по URL страницы."""
|
||||
asyncio.run(_download(
|
||||
url=url,
|
||||
fmt=fmt,
|
||||
chapters_filter=chapters,
|
||||
output_dir=Path(output),
|
||||
resume=resume,
|
||||
resume=resume and not force,
|
||||
force=force,
|
||||
concurrency=concurrency,
|
||||
verbose=ctx.obj.get("verbose", False),
|
||||
))
|
||||
|
||||
|
||||
async def _download(url, fmt, chapters_filter, output_dir, resume, concurrency, verbose):
|
||||
async def _download(url, fmt, chapters_filter, output_dir, resume, force, concurrency, verbose):
|
||||
db = StateDB()
|
||||
|
||||
async with BrowserManager(headless=True) as bm:
|
||||
@@ -106,8 +109,10 @@ async def _download(url, fmt, chapters_filter, output_dir, resume, concurrency,
|
||||
for ch in chapters:
|
||||
pbar.set_description(f"Глава {ch.number}: {ch.title[:30]}")
|
||||
|
||||
# Проверяем статус (resume)
|
||||
if resume and db.chapter_status(ch.url) == "done":
|
||||
# Проверяем статус (resume / force)
|
||||
if force:
|
||||
db.reset_chapter(ch.url)
|
||||
elif resume and db.chapter_status(ch.url) == "done":
|
||||
logger.info("Пропускаем (уже скачана): {}", ch.title)
|
||||
pbar.update(1)
|
||||
continue
|
||||
@@ -116,7 +121,7 @@ async def _download(url, fmt, chapters_filter, output_dir, resume, concurrency,
|
||||
bm=bm, ctx=ctx, ch=ch,
|
||||
manga_url=url,
|
||||
manga_dir=manga_dir, formats=formats,
|
||||
concurrency=concurrency, db=db,
|
||||
concurrency=concurrency, db=db, force=force,
|
||||
)
|
||||
pbar.update(1)
|
||||
|
||||
@@ -126,7 +131,7 @@ async def _download(url, fmt, chapters_filter, output_dir, resume, concurrency,
|
||||
|
||||
|
||||
async def _process_chapter(bm, ctx, ch: Chapter, manga_url: str, manga_dir: Path,
|
||||
formats: list, concurrency: int, db: StateDB):
|
||||
formats: list, concurrency: int, db: StateDB, force: bool = False):
|
||||
# Новая страница для каждой главы (чистый контекст)
|
||||
ch_page = await ctx.new_page()
|
||||
|
||||
@@ -147,6 +152,10 @@ async def _process_chapter(bm, ctx, ch: Chapter, manga_url: str, manga_dir: Path
|
||||
|
||||
for fmt in formats:
|
||||
out_file = manga_dir / f"{ch_name}.{fmt}"
|
||||
# При --force удаляем старый файл перед перезаписью
|
||||
if force and out_file.exists():
|
||||
out_file.unlink()
|
||||
logger.debug("Удалён старый файл: {}", out_file.name)
|
||||
try:
|
||||
export(image_paths, out_file, fmt, manga_dir.name, ch.title)
|
||||
db.mark_done(ch.url, fmt, str(out_file))
|
||||
@@ -243,3 +252,10 @@ if __name__ == "__main__":
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user