# ============================================================ # File: scraper/tasks/save_tasks.py (RESTORED AUDIO LOGIC + book_idx) # ============================================================ print(">>> [IMPORT] save_tasks.py loaded") from celery import shared_task import os from logbus.publisher import log from scraper.logger_decorators import logcall from scraper.utils.utils import get_save_path from scraper.tasks.download_tasks import log_msg from scraper.tasks.audio_tasks import generate_audio from db.repository import inc_download_done, inc_download_skipped @shared_task(bind=True, queue="save", ignore_result=False) @logcall def save_chapter(self, payload: dict): if not payload: log("[SAVE] ERROR: payload is None") return {"error": True} # NEW unified ID book_idx = payload["book_idx"] chapter = payload["chapter"] parsed = payload.get("parsed") path = payload.get("path") skipped = payload.get("skipped") num = chapter["num"] title = chapter.get("title") or f"Chapter {num}" volume = chapter.get("volume_path") volume_name = os.path.basename(volume.rstrip("/")) # ============================================================ # SKIPPED CASE (old behavior restored) # ============================================================ if skipped or not parsed: log_msg(book_idx, f"[SAVE] SKIP chapter {num}") inc_download_skipped(book_idx) # OLD behavior: even skipped chapters still queue audio if path and os.path.exists(path): log_msg(book_idx, f"[AUDIO] Queueing audio for SKIPPED chapter {num}") try: generate_audio.delay(book_idx, volume_name, num, title, path) except Exception as exc: log_msg(book_idx, f"[AUDIO] ERROR queueing skipped audio: {exc}") return payload # ============================================================ # NORMAL SAVE CASE # ============================================================ try: os.makedirs(volume, exist_ok=True) save_path = get_save_path(num, volume) with open(save_path, "w", encoding="utf-8") as f: f.write(parsed) log_msg(book_idx, f"[SAVE] Saved chapter {num} → {save_path}") inc_download_done(book_idx) # OLD behavior: ALWAYS queue audio try: generate_audio.delay(book_idx, volume_name, num, title, save_path) log_msg(book_idx, f"[AUDIO] Task queued for chapter {num}") except Exception as exc: log_msg(book_idx, f"[AUDIO] ERROR queueing chapter {num}: {exc}") payload["path"] = save_path payload["skipped"] = False return payload except Exception as exc: log_msg(book_idx, f"[SAVE] ERROR saving chapter {num}: {exc}") raise