refactor(meta): stabilize recognition contract

This commit is contained in:
jxxghp
2026-08-25 08:12:04 +08:00
parent fcf6f0c7df
commit 8e99abd678
6 changed files with 340 additions and 85 deletions
+79 -1
View File
@@ -7,9 +7,15 @@ import pytest
from app.domain.context import MediaInfo
from app.domain.metainfo import MetaInfo, MetaInfoPath, find_metainfo
from app.domain.meta.metabase import MetaBase
from app.domain.meta.metabase import MetaBase, MetaInfoSnapshot
from app.domain.meta.metamusic import MetaMusic
from app.domain.meta.metaanime import MetaAnime
from app.domain.meta.runtime import (
configure_recognition_runtime,
get_audio_extensions,
get_media_extensions,
get_metainfo_accelerator,
)
from app.application.torrent import TorrentHelper
from app.schemas.types import MediaSource, MediaType
from tests.cases.meta import meta_cases
@@ -100,6 +106,78 @@ def test_metainfopath_with_empty_custom_words():
assert meta is not None
def test_metainfo_snapshot_exposes_complete_immutable_contract():
"""稳定快照应包含路径合并字段,且不受原 MetaBase 后续修改影响。"""
meta = MetaInfo("Show.S01E01.2026.2160p.WEB-DL.HDR.H265.10bit-GROUP.mkv")
meta.web_source = "Amazon"
snapshot = MetaInfoSnapshot.from_meta(meta)
meta.web_source = "Netflix"
assert snapshot.kind == "video"
assert snapshot.begin_season == 1
assert snapshot.begin_episode == 1
assert snapshot.resource_effect == "HDR"
assert snapshot.video_bit == "10bit"
assert snapshot.web_source == "Amazon"
assert snapshot.apply_words == ()
def test_metainfopath_merges_parent_streaming_platform():
"""文件名缺少平台时应从父目录补充,避免路径识别丢失稳定资源字段。"""
media_extensions = get_media_extensions()
audio_extensions = get_audio_extensions()
accelerator = get_metainfo_accelerator()
configure_recognition_runtime(
media_extensions_provider=lambda: (".mkv",),
audio_extensions_provider=lambda: (),
accelerator=None,
)
try:
meta = MetaInfoPath(Path("/Show 2024 AMZN WEB-DL/Show.S01E01.mkv"))
finally:
configure_recognition_runtime(
media_extensions_provider=lambda: media_extensions,
audio_extensions_provider=lambda: audio_extensions,
accelerator=accelerator,
)
assert meta.web_source == "Amazon"
assert meta.year == "2024"
assert meta.episode == "E01"
def test_numeric_video_filename_sets_single_episode_total():
"""纯数字视频文件名表示单集时,范围字段必须保持自洽。"""
media_extensions = get_media_extensions()
audio_extensions = get_audio_extensions()
accelerator = get_metainfo_accelerator()
configure_recognition_runtime(
media_extensions_provider=lambda: (".mkv",),
audio_extensions_provider=lambda: (),
accelerator=None,
)
try:
meta = MetaInfo("5.mkv")
finally:
configure_recognition_runtime(
media_extensions_provider=lambda: media_extensions,
audio_extensions_provider=lambda: audio_extensions,
accelerator=accelerator,
)
assert meta.begin_episode == 5
assert meta.end_episode is None
assert meta.total_episode == 1
def test_empty_video_title_keeps_optional_original_name_none():
"""无法提取标题时 original_name 保持空值,不使用含义不同的空字符串。"""
meta = MetaInfo("S02E1000.mkv")
assert meta.name == ""
assert meta.original_name is None
def test_custom_words_apply_words_recording():
"""测试 apply_words 记录功能。"""
custom_words = ["替换词 => 新词"]