Add Jellyfin handoff progress job

This commit is contained in:
Dymas
2026-06-14 13:09:46 +02:00
parent 6403c98b7d
commit 332ec670fc
8 changed files with 475 additions and 35 deletions
+25 -9
View File
@@ -31,7 +31,11 @@ APP = importlib.util.module_from_spec(SPEC)
assert SPEC.loader is not None
SPEC.loader.exec_module(APP)
IMPORT_RUNTIME_WAS_DEFERRED = (
APP.CONFIG is None and APP.WATCHLIST is None and APP.DOWNLOAD_QUEUE is None and APP.WATCHLIST_REFRESH is None
APP.CONFIG is None
and APP.WATCHLIST is None
and APP.DOWNLOAD_QUEUE is None
and APP.WATCHLIST_REFRESH is None
and APP.WATCHLIST_JELLYFIN_SYNC is None
)
APP.initialize_runtime(start_workers=False)
APP.reset_runtime(wait=True)
@@ -2586,6 +2590,7 @@ class StartupBehaviorTests(unittest.TestCase):
current_queue = APP.DOWNLOAD_QUEUE
current_refresh = APP.WATCHLIST_REFRESH
current_auto_refresh = APP.WATCHLIST_AUTO_REFRESH
current_jellyfin_sync = APP.WATCHLIST_JELLYFIN_SYNC
with mock.patch.object(APP, "shutdown_runtime", return_value=False):
with self.assertRaises(RuntimeError):
APP.reset_runtime(wait=True)
@@ -2595,6 +2600,7 @@ class StartupBehaviorTests(unittest.TestCase):
self.assertIs(APP.DOWNLOAD_QUEUE, current_queue)
self.assertIs(APP.WATCHLIST_REFRESH, current_refresh)
self.assertIs(APP.WATCHLIST_AUTO_REFRESH, current_auto_refresh)
self.assertIs(APP.WATCHLIST_JELLYFIN_SYNC, current_jellyfin_sync)
finally:
APP.reset_runtime(wait=True)
APP.initialize_runtime(start_workers=False)
@@ -2663,6 +2669,7 @@ class StartupBehaviorTests(unittest.TestCase):
self.assertIsNone(APP.DOWNLOAD_QUEUE)
self.assertIsNone(APP.WATCHLIST_REFRESH)
self.assertIsNone(APP.WATCHLIST_AUTO_REFRESH)
self.assertIsNone(APP.WATCHLIST_JELLYFIN_SYNC)
finally:
APP.initialize_runtime(start_workers=False)
@@ -2679,6 +2686,7 @@ class HandlerRouteTests(unittest.TestCase):
self.assertIsNone(APP.DOWNLOAD_QUEUE.worker)
self.assertIsNone(APP.WATCHLIST_REFRESH.worker)
self.assertIsNone(APP.WATCHLIST_AUTO_REFRESH.worker)
self.assertIsNone(APP.WATCHLIST_JELLYFIN_SYNC.worker)
finally:
APP.reset_runtime(wait=True)
APP.initialize_runtime(start_workers=False)
@@ -3115,23 +3123,31 @@ class HandlerRouteTests(unittest.TestCase):
self.assertEqual(handler.json_payload, payload)
self.assertEqual(handler.json_status, HTTPStatus.OK)
def test_jellyfin_sync_post_returns_summary_payload(self):
def test_jellyfin_sync_status_route_returns_json(self):
handler = DummyHandler("/api/config/jellyfin/sync-status")
payload = {"running": True, "job": {"id": "job-1", "status": "running"}}
handler.handler_context = mock.Mock(get_jellyfin_sync_status=mock.Mock(return_value=payload))
APP.Handler.do_GET(handler)
self.assertEqual(handler.json_payload, payload)
self.assertEqual(handler.json_status, HTTPStatus.OK)
def test_jellyfin_sync_post_returns_job_payload(self):
body = b'{"download_dir":"/tmp/example","jellyfin_sync_enabled":true,"jellyfin_tv_dir":"/tmp/jellyfin-tv","jellyfin_movie_dir":"/tmp/jellyfin-movies"}'
handler = DummyHandler("/api/config/jellyfin/sync", body=body, content_length=len(body))
payload = {"message": "Moved 1 watchlist entry to Jellyfin libraries.", "moved": 1, "total": 2, "items": []}
payload = {"message": "Jellyfin handoff started.", "created": True, "job": {"id": "job-1", "status": "pending"}}
handler.handler_context = mock.Mock(
get_config_snapshot=mock.Mock(return_value={}),
run_jellyfin_sync=mock.Mock(return_value=payload),
start_jellyfin_sync=mock.Mock(return_value=payload),
http_error=APP.HttpError,
)
APP.Handler.do_POST(handler)
self.assertEqual(handler.json_payload, payload)
self.assertEqual(handler.json_status, HTTPStatus.OK)
self.assertEqual(handler.json_status, HTTPStatus.ACCEPTED)
def test_jellyfin_sync_post_merges_partial_payload_with_saved_config(self):
body = b'{"jellyfin_sync_enabled":true}'
handler = DummyHandler("/api/config/jellyfin/sync", body=body, content_length=len(body))
payload = {"message": "Moved 0 watchlist entries to Jellyfin libraries.", "moved": 0, "total": 0, "items": []}
payload = {"message": "Jellyfin handoff already queued.", "created": False, "job": {"id": "job-1", "status": "pending"}}
handler.handler_context = mock.Mock(
get_config_snapshot=mock.Mock(
return_value={
@@ -3143,11 +3159,11 @@ class HandlerRouteTests(unittest.TestCase):
"jellyfin_movie_dir": "/tmp/jellyfin-movies",
}
),
run_jellyfin_sync=mock.Mock(return_value=payload),
start_jellyfin_sync=mock.Mock(return_value=payload),
)
APP.Handler.do_POST(handler)
self.assertEqual(handler.json_status, HTTPStatus.OK)
handler.handler_context.run_jellyfin_sync.assert_called_once_with(
self.assertEqual(handler.json_status, HTTPStatus.ACCEPTED)
handler.handler_context.start_jellyfin_sync.assert_called_once_with(
{
"download_dir": "/tmp/example",
"mode": "sub",