perf: optimize media recognition internals

This commit is contained in:
jxxghp
2026-05-15 13:37:36 +08:00
parent b2a18f9ae4
commit 2831eecbeb
9 changed files with 396 additions and 254 deletions

View File

@@ -0,0 +1,107 @@
import asyncio
from unittest import TestCase
from unittest.mock import Mock
from app.core.context import MediaInfo
from app.core.meta import MetaBase
from app.modules.douban import DoubanModule
from app.modules.themoviedb import TheMovieDbModule
from app.schemas.types import MediaType
class MediaRecognizeModulesTest(TestCase):
def test_tmdb_cache_false_skips_cache_lookup(self):
"""cache=False 时应跳过缓存读取,但仍按正常流程查询 TMDB。"""
module = TheMovieDbModule()
meta = MetaBase("测试电影")
meta.name = "测试电影"
meta.type = MediaType.MOVIE
module.cache = Mock()
module.tmdb = Mock()
module.tmdb.get_info.return_value = {
"id": 100,
"media_type": MediaType.MOVIE,
"title": "测试电影",
"genres": [],
}
module.category = Mock()
module.category.get_movie_category.return_value = None
result = module.recognize_media(meta=meta, tmdbid=100, cache=False)
self.assertIsInstance(result, MediaInfo)
self.assertEqual(result.tmdb_id, 100)
module.cache.get.assert_not_called()
module.cache.update.assert_called_once()
def test_async_tmdb_cache_false_skips_cache_lookup(self):
"""异步 cache=False 时也应跳过缓存读取。"""
module = TheMovieDbModule()
meta = MetaBase("测试电影")
meta.name = "测试电影"
meta.type = MediaType.MOVIE
module.cache = Mock()
module.tmdb = Mock()
async def _async_get_info(**kwargs):
return {
"id": 101,
"media_type": MediaType.MOVIE,
"title": "测试电影",
"genres": [],
}
module.tmdb.async_get_info = _async_get_info
module.category = Mock()
module.category.get_movie_category.return_value = None
result = asyncio.run(module.async_recognize_media(meta=meta, tmdbid=101, cache=False))
self.assertIsInstance(result, MediaInfo)
self.assertEqual(result.tmdb_id, 101)
module.cache.get.assert_not_called()
module.cache.update.assert_called_once()
def test_douban_prepare_search_names_deduplicates_simplified_name(self):
"""豆瓣候选名称应保留顺序,并去掉繁简转换后的重复项。"""
meta = MetaBase("流浪地球")
meta.cn_name = "流浪地球"
meta.en_name = "The Wandering Earth"
self.assertEqual(
DoubanModule._prepare_search_names(meta),
["流浪地球", "The Wandering Earth"],
)
def test_douban_search_result_helper_preserves_season_title_rule(self):
"""豆瓣搜索结果 helper 应保留电视剧标题追加季号的旧逻辑。"""
meta = MetaBase("测试剧")
meta.name = "测试剧"
meta.type = MediaType.TV
meta.begin_season = 2
items = [
{
"type_name": MediaType.TV.value,
"target": {
"id": "200",
"title": "测试剧",
"type": "tv",
"year": "2024",
},
},
{
"type_name": MediaType.MOVIE.value,
"target": {
"id": "201",
"title": "测试剧 电影版",
"type": "movie",
"year": "2024",
},
},
]
result = DoubanModule._build_search_medias_result(meta, items)
self.assertEqual(len(result), 1)
self.assertEqual(result[0].title, "测试剧 第二季")
self.assertEqual(result[0].season, 2)

View File

@@ -2,7 +2,7 @@
from pathlib import Path
from unittest import TestCase
from app.core.metainfo import MetaInfo, MetaInfoPath
from app.core.metainfo import MetaInfo, MetaInfoPath, find_metainfo
from tests.cases.meta import meta_cases
@@ -124,6 +124,22 @@ class MetaInfoTest(TestCase):
self.assertEqual(meta.name, "电影名称")
self.assertEqual(meta.original_name, "电影测试替换名称")
def test_custom_words_replace_then_episode_offset(self):
"""测试复杂识别词仍按先替换、后集数偏移的顺序处理"""
custom_words = ["旧名 => 新名 && 第 <> 集 >> EP+1"]
meta = MetaInfo(title="旧名 第03集", custom_words=custom_words)
self.assertEqual(meta.name, "新名")
self.assertEqual(meta.episode, "E04")
self.assertEqual(meta.apply_words, custom_words)
def test_emby_tmdbid_overrides_braced_metainfo_tmdbid(self):
"""
同时存在内嵌元信息和 Emby [tmdbid] 标签时,保持历史上的 [tmdbid] 优先级。
"""
title, metainfo = find_metainfo("Movie {[tmdbid=111;type=movies]} [tmdbid=222]")
self.assertEqual(metainfo["tmdbid"], "222")
self.assertNotIn("[tmdbid=222]", title)
def test_metainfopath_auxiliary_chinese_stem_uses_parent_title(self):
"""
文件名为简英双语/特效等压制标签、父目录为拉丁片名时,应合并父目录标题与年份。