Add TV and movie watchlist download tags

This commit is contained in:
Dymas
2026-05-25 16:53:24 +02:00
parent 1487257bed
commit 139d7d9e2f
10 changed files with 197 additions and 23 deletions
+59 -3
View File
@@ -308,6 +308,7 @@ class QueueApiTests(unittest.TestCase):
"show_id": "show-1",
"title": "Structured Show",
"anime_name": "Structured Show",
"media_type": "movie",
"season": "1",
"query": "Structured Show",
"result_index": 1,
@@ -329,11 +330,39 @@ class QueueApiTests(unittest.TestCase):
row = conn.execute("SELECT * FROM jobs WHERE id = ?", (job["id"],)).fetchone()
self.assertEqual(row["title"], "Structured Show")
self.assertEqual(row["media_type"], "movie")
self.assertEqual(row["log_payload"], '["line 1", "line 2"]')
self.assertEqual(APP.json.loads(row["payload"]), {"custom_flag": True})
restored = queue._job_from_row(row)
self.assertEqual(restored["log"], ["line 1", "line 2"])
self.assertTrue(restored["custom_flag"])
self.assertEqual(restored["media_type"], "movie")
def test_movie_finalizer_uses_movie_folder_and_single_file_name(self):
job = APP.app_support.build_job(
{
"query": "Movie Show",
"title": "Movie Show",
"anime_name": "Movie Show",
"media_type": "movie",
"mode": "sub",
"quality": "best",
"episodes": "1",
"download_dir": "/tmp/example",
"season": "1",
},
{"mode": "sub", "quality": "best", "download_dir": "/tmp/example"},
)
staging_dir = APP.app_support.job_staging_dir(job)
staging_dir.mkdir(parents=True, exist_ok=True)
source = staging_dir / "Movie Show Episode 1.mp4"
source.write_bytes(b"movie-bytes")
moved = APP.app_support.finalize_library_files(job)
self.assertEqual(moved, ["/tmp/example/movie/Movie Show/Movie Show.mp4"])
self.assertFalse(source.exists())
self.assertTrue(Path(moved[0]).exists())
def test_shutdown_wait_cancels_active_process_for_deterministic_teardown(self):
queue = object.__new__(APP.DownloadQueue)
@@ -764,6 +793,7 @@ class ThumbnailEventRecoveryTests(unittest.TestCase):
"animeschedule_title": None,
"anidb_aid": None,
"anidb_title": None,
"media_type": "tv",
"thumbnail_path": None,
"thumbnail_checked_at": None,
}
@@ -1038,6 +1068,15 @@ class WatchlistCompletionTests(unittest.TestCase):
self.assertEqual(result["item"]["auto_download_series"], "4")
def test_add_uses_requested_media_type(self):
with mock.patch.object(APP.WATCHLIST, "schedule_refresh", side_effect=lambda show_id, source="manual": APP.WATCHLIST.get(show_id)):
result = APP.WATCHLIST.add(
{"show_id": "show-24", "title": "Queued Movie", "category": "watching", "media_type": "movie"}
)
self.assertEqual(result["item"]["media_type"], "movie")
self.assertEqual(result["item"]["media_type_label"], "Movie")
def test_refresh_uses_bounded_request_timeout(self):
self.seed_watchlist_item(show_id="show-1", title="Example Show")
snapshot = {
@@ -1093,7 +1132,13 @@ class WatchlistCompletionTests(unittest.TestCase):
self.assertEqual(prepared["title"], "Queue Show Season 2")
def test_download_watchlist_item_queues_full_episode_range_for_selected_mode(self):
item = {"show_id": "show-42", "title": "Queue Show"}
item = {
"show_id": "show-42",
"title": "Queue Show",
"auto_download_name": "Queue Show Library",
"auto_download_series": "4",
"media_type": "movie",
}
job = {"id": "job-1", "show_id": "show-42", "episodes": "1-12", "mode": "dub"}
with mock.patch.object(APP, "ensure_runtime", return_value={"watchlist": APP.WATCHLIST, "download_queue": mock.Mock(), "config": {"quality": "best", "download_dir": "/tmp/downloads"}}), mock.patch.object(
APP.WATCHLIST, "get", return_value=item
@@ -1109,8 +1154,9 @@ class WatchlistCompletionTests(unittest.TestCase):
"show_id": "show-42",
"query": "Queue Show",
"title": "Queue Show",
"anime_name": "Queue Show",
"season": "1",
"anime_name": "Queue Show Library",
"media_type": "movie",
"season": "4",
"index": 3,
"mode": "dub",
"quality": "best",
@@ -1555,6 +1601,7 @@ class AutoDownloadQueueTests(unittest.TestCase):
"query": "Queue Show",
"title": "Queue Show",
"anime_name": "Queue Show- Alt-Name",
"media_type": "tv",
"season": "3",
"index": 2,
"mode": "dub",
@@ -1928,6 +1975,15 @@ class HandlerRouteTests(unittest.TestCase):
self.assertEqual(handler.json_payload, payload)
self.assertEqual(handler.json_status, HTTPStatus.OK)
def test_watchlist_media_type_post_returns_updated_item(self):
body = b'{"show_id":"show-1","media_type":"movie"}'
handler = DummyHandler("/api/watchlist/update-media-type", body=body, content_length=len(body))
payload = {"message": "Saved Show 1 as Movie.", "item": {"show_id": "show-1", "media_type": "movie"}}
handler.handler_context = mock.Mock(update_watchlist_media_type=mock.Mock(return_value=payload))
APP.Handler.do_POST(handler)
self.assertEqual(handler.json_payload, payload)
self.assertEqual(handler.json_status, HTTPStatus.OK)
def test_generic_handler_exception_skips_traceback_when_debug_disabled(self):
handler = DummyHandler("/api/config")
with mock.patch.object(http_handler, "debug_enabled", return_value=False), mock.patch.object(