Preserve completed episodes from failed batches

This commit is contained in:
Dymas
2026-08-18 08:43:30 +02:00
parent 8e95ffc79b
commit d663318f27
6 changed files with 155 additions and 10 deletions
+36 -2
View File
@@ -1135,6 +1135,9 @@ class DownloadQueue:
clean.pop("_last_persist_monotonic", None)
clean.pop("_dirty_log_lines", None)
clean.pop("log", None)
for key in list(clean):
if str(key).startswith("_"):
clean.pop(key, None)
for key in ("id", "status", "created_at", "updated_at"):
clean.pop(key, None)
for key in JOB_STRUCTURED_COLUMNS:
@@ -1491,10 +1494,22 @@ class DownloadQueue:
if not text:
text = f"Download progress: {progress.get('percent', 0)}%."
self._stdout_log(job, text)
moved_files = []
finalize_error = None
if progress is not None:
try:
moved_files = self._finalize_progress_episode(job, progress)
except Exception as exc:
finalize_error = exc
with self.lock:
if progress is not None:
job["progress"] = progress
job.setdefault("log", []).append(text)
if finalize_error is not None:
job["_incremental_finalize_error"] = str(finalize_error)
job.setdefault("log", []).append(f"Episode library move failed: {finalize_error}")
for path in moved_files:
job.setdefault("log", []).append(f"Saved: {path}")
job["log"] = job["log"][-MAX_LOG_LINES:]
job["updated_at"] = now_iso()
job["_dirty_log_lines"] = int(job.get("_dirty_log_lines") or 0) + 1
@@ -1516,6 +1531,22 @@ class DownloadQueue:
backend = str((job or {}).get("download_backend") or "download")
print(f"[download:{job_id}:{backend}] {text}", flush=True)
def _finalize_progress_episode(self, job, progress):
if str((progress or {}).get("phase") or "").strip().lower() != "done":
return []
episode = (progress or {}).get("episode")
if episode in (None, ""):
return []
episode_key = str(episode).strip()
finalized = job.setdefault("_incremental_finalized_episodes", [])
if episode_key in finalized:
return []
moved = finalize_library_files(job, episode=episode, cleanup_staging=False, allow_empty=True)
if moved:
finalized.append(episode_key)
job.setdefault("_moved_files", []).extend(moved)
return moved
def _cleanup_staging_dir(self, job):
staging_dir = job_staging_dir(job)
if not staging_dir.exists():
@@ -1741,7 +1772,8 @@ class DownloadQueue:
if exit_code == 0:
try:
moved_files = finalize_library_files(job)
moved_files = list(job.get("_moved_files") or [])
moved_files.extend(finalize_library_files(job, allow_empty=bool(moved_files)))
except Exception as exc:
finalize_error = exc
no_files_downloaded = "No downloaded files were found in the staging folder" in str(exc)
@@ -1796,7 +1828,9 @@ class DownloadQueue:
if successful_backend and successful_backend != attempts[0]["backend"]:
job.setdefault("log", []).append(f"Fallback download completed with {successful_backend}.")
for path in moved_files:
job.setdefault("log", []).append(f"Saved: {path}")
saved_line = f"Saved: {path}"
if saved_line not in (job.get("log") or []):
job.setdefault("log", []).append(saved_line)
job.setdefault("log", []).append("Download completed.")
if watchlist_sync_error:
job.setdefault("log", []).append(f"Watchlist sync failed: {watchlist_sync_error}")