mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-06 07:56:52 +08:00
refactor(meta): stabilize recognition contract
This commit is contained in:
+79
-1
@@ -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 = ["替换词 => 新词"]
|
||||
|
||||
Reference in New Issue
Block a user