video enrichment: persist worker pause state across restart

Pause/resume now write <service>_paused to video_settings, and the engine
restores each worker's saved pause when it's (re)built — mirrors music's
<service>_enrichment_paused boot flag. Isolated to video.db; music untouched.
This commit is contained in:
BoulderBadgeDad 2026-06-14 13:11:41 -07:00
parent 68a65a8e3d
commit 9d2468a50f
3 changed files with 42 additions and 0 deletions

View file

@ -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():

View file

@ -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 <service>_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):

View file

@ -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"):