Allow season zero for auto-downloads

This commit is contained in:
Dymas
2026-09-09 22:54:01 +02:00
parent 91228d58e0
commit 079488fa5a
9 changed files with 128 additions and 17 deletions
+97
View File
@@ -906,6 +906,32 @@ class QueueApiTests(unittest.TestCase):
)
self.assertTrue(Path(moved[0]).exists())
def test_tv_finalizer_accepts_season_zero_for_specials(self):
with tempfile.TemporaryDirectory() as temp_root:
job = APP.app_support.build_job(
{
"query": "Special Show",
"title": "Special Show",
"anime_name": "Special Show",
"media_type": "tv",
"mode": "sub",
"quality": "best",
"episodes": "1",
"download_dir": temp_root,
"season": "0",
},
{"mode": "sub", "quality": "best", "download_dir": temp_root},
)
staging_dir = APP.app_support.job_staging_dir(job)
staging_dir.mkdir(parents=True, exist_ok=True)
source = staging_dir / "Special Show Episode 1.mp4"
source.write_bytes(b"ep1")
moved = APP.app_support.finalize_library_files(job)
self.assertEqual(moved, [f"{temp_root}/tv/Special Show/Season 00/Special Show - S00E01.mp4"])
self.assertTrue(Path(moved[0]).exists())
def test_tv_finalizer_can_move_one_finished_episode_without_removing_staging(self):
with tempfile.TemporaryDirectory() as temp_root:
job = APP.app_support.build_job(
@@ -2016,6 +2042,22 @@ class WatchlistCompletionTests(unittest.TestCase):
self.assertEqual(result["item"]["auto_download_series"], "4")
def test_add_uses_requested_auto_download_series_zero(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-23z", "title": "Queued Specials", "category": "watching", "auto_download_series": "0"}
)
self.assertEqual(result["item"]["auto_download_series"], "0")
def test_update_auto_download_settings_uses_series_zero(self):
with mock.patch.object(APP.WATCHLIST, "schedule_refresh", side_effect=lambda show_id, source="manual": APP.WATCHLIST.get(show_id)):
APP.WATCHLIST.add({"show_id": "show-23s", "title": "Queued Specials", "category": "watching"})
item = APP.WATCHLIST.update_auto_download_settings("show-23s", series="0")
self.assertEqual(item["auto_download_series"], "0")
def test_add_uses_requested_auto_download_offset(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(
@@ -2245,6 +2287,26 @@ class WatchlistCompletionTests(unittest.TestCase):
self.assertEqual(result["job"], job)
self.assertIn("Queued Queue Show for dub download.", result["message"])
def test_download_watchlist_item_queues_season_zero(self):
item = {
"show_id": "show-42",
"title": "Queue Specials",
"auto_download_name": "Queue Specials Library",
"auto_download_source_name": "Queue Specials Source",
"auto_download_series": "0",
"auto_download_quality": "720",
"media_type": "tv",
}
job = {"id": "job-1", "show_id": "show-42", "episodes": "1", "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
), mock.patch.object(APP, "episode_list", return_value=["1"]):
runtime = APP.ensure_runtime()
runtime["download_queue"].add.return_value = job
APP.download_watchlist_item("show-42", "dub")
self.assertEqual(runtime["download_queue"].add.call_args.args[0]["season"], "0")
def test_remove_from_watchlist_detaches_existing_queue_jobs(self):
runtime = APP.ensure_runtime()
APP.WATCHLIST.add({"show_id": "show-queue-remove", "title": "Queue Remove Show"})
@@ -3205,6 +3267,39 @@ class AutoDownloadQueueTests(unittest.TestCase):
}
)
def test_queue_watchlist_auto_download_queues_season_zero(self):
item = {
"show_id": "show-42",
"title": "Queue Specials",
"category": "watching",
"dub_episode_values": ["1"],
"sub_episode_values": [],
"auto_download_mode": "dub",
"auto_download_quality": "best",
"auto_download_name": "Queue Specials",
"auto_download_source_name": "Queue Specials Source",
"auto_download_series": "0",
"auto_download_offset": None,
"downloaded_dub_episodes": [],
"downloaded_sub_episodes": [],
}
download_queue = mock.Mock()
download_queue.covered_episodes.return_value = set()
runtime = {
"config": {
"auto_download_enabled": True,
"auto_download_mode": "dub",
"auto_download_quality": "best",
"download_dir": "/tmp/downloads",
},
"download_queue": download_queue,
}
with mock.patch.object(APP, "ensure_runtime", return_value=runtime):
result = APP.queue_watchlist_auto_download(item, refresh_source="manual")
self.assertTrue(result["queued"])
self.assertEqual(download_queue.add.call_args.args[0]["season"], "0")
def test_queue_watchlist_auto_download_can_queue_existing_backlog_after_initial_seed_refresh(self):
item = {
"show_id": "show-99",
@@ -4270,6 +4365,7 @@ class TemplateHelperTests(unittest.TestCase):
def test_search_page_sends_watchlist_auto_download_series(self):
self.assertIn('auto_download_series: $("seasonInput").value || "1"', APP.INDEX_HTML)
self.assertIn('id="seasonInput" type="number" min="0"', APP.INDEX_HTML)
def test_search_page_closes_selection_modal_after_successful_actions(self):
self.assertIn('setNotice(data.message || "Added to watchlist.");\n closeSelectionModal();', APP.INDEX_HTML)
@@ -4423,6 +4519,7 @@ class TemplateHelperTests(unittest.TestCase):
self.assertIn("closeAutoDownloadOverlay()", APP.WATCHLIST_HTML)
self.assertIn("Save auto-download", APP.WATCHLIST_HTML)
self.assertIn("Manual add does not trigger it", APP.WATCHLIST_HTML)
self.assertIn('id="autoDownloadSeries" type="number" min="0"', APP.WATCHLIST_HTML)
self.assertIn("Source name", APP.WATCHLIST_HTML)
self.assertIn('id="autoDownloadSourceName"', APP.WATCHLIST_HTML)
self.assertIn("Name source", APP.WATCHLIST_HTML)