Preserve completed episodes from failed batches
This commit is contained in:
+36
-2
@@ -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}")
|
||||
|
||||
Reference in New Issue
Block a user