diff --git a/app/chain/subscribe.py b/app/chain/subscribe.py index 50b4a48c..f108df35 100644 --- a/app/chain/subscribe.py +++ b/app/chain/subscribe.py @@ -1306,18 +1306,16 @@ class SubscribeChain(ChainBase): logger.debug(f"search Lock released at {datetime.now()}") @staticmethod - def __update_movie_best_version_download_priority( + def __update_movie_download_priority( subscribe: Subscribe, mediainfo: MediaInfo, downloads: Optional[List[Context]], ): """ - 记录电影洗版本轮下载资源优先级。 + 记录电影本轮下载资源优先级,用作后续电影洗版的起始质量状态。 """ if not downloads: return - if not subscribe.best_version: - return priority = max([item.torrent_info.pri_order for item in downloads]) now = datetime.now().strftime('%Y-%m-%d %H:%M:%S') @@ -1330,7 +1328,7 @@ class SubscribeChain(ChainBase): }) subscribe.current_priority = priority subscribe.last_update = now - if priority != 100: + if subscribe.best_version and priority != 100: # 正在洗版,更新资源优先级 logger.info(f'{mediainfo.title_year} 正在洗版,更新资源优先级为 {priority}') @@ -1348,6 +1346,12 @@ class SubscribeChain(ChainBase): self.__record_subscribe_download_facts(subscribe=subscribe, mediainfo=mediainfo, downloads=downloads) elif downloads: self.__update_subscribe_note(subscribe=subscribe, downloads=downloads) + if downloads and meta.type == MediaType.MOVIE: + self.__update_movie_download_priority( + subscribe=subscribe, + mediainfo=mediainfo, + downloads=downloads, + ) # 是否完成订阅 if not subscribe.best_version: # 普通订阅:先按 lefts 写 lack,再判断完成 @@ -1366,13 +1370,6 @@ class SubscribeChain(ChainBase): logger.info(f'{mediainfo.title_year} 未下载完整,继续订阅 ...') return - if downloads and meta.type == MediaType.MOVIE: - # 电影没有按集质量事实,只能用 current_priority 表达洗版下载质量。 - self.__update_movie_best_version_download_priority( - subscribe=subscribe, - mediainfo=mediainfo, - downloads=downloads, - ) if meta.type == MediaType.TV: self.__refresh_subscribe_progress_with_no_exists( no_exists=lefts, diff --git a/tests/test_subscribe_chain.py b/tests/test_subscribe_chain.py index bd303ef4..29d0bcd2 100644 --- a/tests/test_subscribe_chain.py +++ b/tests/test_subscribe_chain.py @@ -1903,7 +1903,7 @@ class SubscribeNoteTrackingTest(TestCase): with patch.object(SUBSCRIBE_CHAIN_MODULE, "SubscribeOper", _SubscribeOper), patch.object( SubscribeChain, - "_SubscribeChain__update_movie_best_version_download_priority", + "_SubscribeChain__update_movie_download_priority", ), patch.object( SubscribeChain, "_SubscribeChain__finish_subscribe", @@ -2819,3 +2819,44 @@ class SubscribeDownloadFactsTest(TestCase): ) refresh_mock.assert_not_called() + + def test_movie_normal_download_records_current_priority_before_completion(self): + subscribe = self._build_subscribe( + type=MediaType.MOVIE.value, + best_version=0, + best_version_full=0, + current_priority=None, + episode_priority={}, + note=[], + tmdbid=30003, + total_episode=1, + lack_episode=1, + ) + download = self._download(episodes=[], pri_order=90) + download.media_info = SimpleNamespace(type=MediaType.MOVIE, tmdb_id=30003, douban_id=None) + download.meta_info = SimpleNamespace(episode_list=[], season_list=[]) + updates = [] + finished = [] + + class _SubscribeOper: + def update(self, subscribe_id, payload): + updates.append(payload) + + chain = self.SubscribeChain() + + def finish_probe(subscribe, **_kwargs): + finished.append(subscribe.current_priority) + + with patch.object(self.module, "SubscribeOper", return_value=_SubscribeOper()), \ + patch.object(chain, "_SubscribeChain__finish_subscribe", side_effect=finish_probe): + chain.finish_subscribe_or_not( + subscribe=subscribe, + meta=SimpleNamespace(type=MediaType.MOVIE), + mediainfo=SimpleNamespace(title_year="下载事实电影 (2026)"), + downloads=[download], + lefts={}, + ) + + self.assertEqual(subscribe.current_priority, 90) + self.assertEqual(finished, [90]) + self.assertIn({"current_priority": 90, "last_update": subscribe.last_update}, updates)