From 9d2468a50f28cbfbaf1b89facd894a46f4d0a950 Mon Sep 17 00:00:00 2001 From: BoulderBadgeDad Date: Sun, 14 Jun 2026 13:11:41 -0700 Subject: [PATCH] video enrichment: persist worker pause state across restart MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pause/resume now write _paused to video_settings, and the engine restores each worker's saved pause when it's (re)built — mirrors music's _enrichment_paused boot flag. Isolated to video.db; music untouched. --- core/video/enrichment/engine.py | 3 +++ core/video/enrichment/worker.py | 15 +++++++++++++++ tests/test_video_enrichment.py | 24 ++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/core/video/enrichment/engine.py b/core/video/enrichment/engine.py index bbc10008..f058f413 100644 --- a/core/video/enrichment/engine.py +++ b/core/video/enrichment/engine.py @@ -25,6 +25,9 @@ class VideoEnrichmentEngine: service: VideoEnrichmentWorker(db, service, client, display_name=_DISPLAY.get(service)) for service, client in clients.items() } + # Restore each worker's persisted pause state (survives restart). + for w in self.workers.values(): + w.restore_paused() def start_all(self): for w in self.workers.values(): diff --git a/core/video/enrichment/worker.py b/core/video/enrichment/worker.py index 406a195a..d88eae92 100644 --- a/core/video/enrichment/worker.py +++ b/core/video/enrichment/worker.py @@ -52,9 +52,24 @@ class VideoEnrichmentWorker: def pause(self): self.paused = True + self._persist_paused() def resume(self): self.paused = False + self._persist_paused() + + def _persist_paused(self): + # Survives restart, like music's _enrichment_paused config flag. + try: + self.db.set_setting(self.service + "_paused", "1" if self.paused else "0") + except Exception: + logger.exception("video enrichment: could not persist pause for %s", self.service) + + def restore_paused(self): + try: + self.paused = str(self.db.get_setting(self.service + "_paused") or "") == "1" + except Exception: + logger.exception("video enrichment: could not restore pause for %s", self.service) @property def enabled(self): diff --git a/tests/test_video_enrichment.py b/tests/test_video_enrichment.py index 46575266..41dc8f74 100644 --- a/tests/test_video_enrichment.py +++ b/tests/test_video_enrichment.py @@ -96,6 +96,30 @@ def test_engine_builds_and_lists_workers(db): assert eng.worker("tmdb") is not None and eng.worker("nope") is None +def test_pause_persists_to_db_and_resume_clears_it(db): + w = VideoEnrichmentWorker(db, "tmdb", FakeClient(None)) + w.pause() + assert db.get_setting("tmdb_paused") == "1" + w.resume() + assert db.get_setting("tmdb_paused") == "0" + + +def test_paused_state_survives_a_fresh_worker(db): + VideoEnrichmentWorker(db, "tmdb", FakeClient(None)).pause() + # A brand-new worker (as if after restart) restores the saved pause. + fresh = VideoEnrichmentWorker(db, "tmdb", FakeClient(None)) + assert fresh.paused is False # not restored until asked + fresh.restore_paused() + assert fresh.paused is True + + +def test_engine_restores_paused_workers_on_build(db): + db.set_setting("tvdb_paused", "1") # tvdb was paused before "restart" + eng = VideoEnrichmentEngine(db, {"tmdb": FakeClient(None), "tvdb": FakeClient(None)}) + assert eng.worker("tvdb").paused is True + assert eng.worker("tmdb").paused is False + + def test_enrichment_package_imports_nothing_from_music(): base = Path(__file__).resolve().parent.parent / "core" / "video" / "enrichment" for py in base.glob("*.py"):