mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-11-01 21:07:01 +08:00
fix(transfer): honor download history media type
This commit is contained in:
@@ -453,11 +453,18 @@ class TransferExecutionOwner(_TransferOwnerBase):
|
||||
and download_history.media_id
|
||||
and not history_year_conflict
|
||||
):
|
||||
# 下载历史类型与原生 ID 成对保存;目录类型只在快照缺少有效类型时兜底。
|
||||
try:
|
||||
history_mtype = MediaType(download_history.type)
|
||||
except (TypeError, ValueError):
|
||||
history_mtype = None
|
||||
if history_mtype in (None, MediaType.UNKNOWN):
|
||||
history_mtype = task.mtype
|
||||
# 下载记录中已存在识别信息。这里不再重复标注类型:函数开头
|
||||
# 已把 mediainfo 声明为 MediaInfo | MusicInfo | None,重复
|
||||
# 声明会遮蔽它,把音乐识别结果判成类型错误
|
||||
mediainfo = MediaChain().recognize_media(
|
||||
mtype=task.mtype or MediaType(download_history.type),
|
||||
mtype=history_mtype,
|
||||
media_source=download_history.media_source,
|
||||
media_id=download_history.media_id,
|
||||
music_type=self._download_history_music_type(download_history),
|
||||
|
||||
72
tests/test_transfer_history_identity_type.py
Normal file
72
tests/test_transfer_history_identity_type.py
Normal file
@@ -0,0 +1,72 @@
|
||||
"""下载历史媒体身份类型的整理回归测试。"""
|
||||
|
||||
from types import SimpleNamespace
|
||||
|
||||
from app.application.history import DownloadHistorySnapshot
|
||||
from app.application.transfer.workflow import TransferTask
|
||||
from app.chain.transfer import TransferChain # pylint: disable=no-name-in-module
|
||||
from app.domain.context import MediaInfo
|
||||
from app.domain.meta.metabase import MetaBase
|
||||
from app.schemas.file import FileItem
|
||||
from app.schemas.types import MediaSource, MediaType
|
||||
|
||||
|
||||
def test_download_history_type_wins_over_monitor_type_hint(monkeypatch):
|
||||
"""TMDB 影视 ID 冲突时,按下载历史保存的类型查询,不被目录提示改写。"""
|
||||
recognized_media = MediaInfo(type=MediaType.TV, title="兰香如故", year="2026")
|
||||
recognition_calls = []
|
||||
|
||||
def recognize_media(**kwargs):
|
||||
"""记录持久身份的实际识别类型。"""
|
||||
recognition_calls.append(kwargs)
|
||||
return recognized_media
|
||||
|
||||
media_chain = SimpleNamespace(
|
||||
recognize_media=recognize_media,
|
||||
supplement_tmdb_info=lambda media, _meta: media,
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
"app.chain.transfer.execution.MediaChain",
|
||||
lambda: media_chain,
|
||||
)
|
||||
|
||||
chain = object.__new__(TransferChain)
|
||||
chain.transfer_history_repository = SimpleNamespace(
|
||||
get_by_media_identity=lambda **_kwargs: None,
|
||||
)
|
||||
chain.runtime_config = SimpleNamespace(scrape_follow_tmdb=True)
|
||||
chain.jobview = SimpleNamespace(
|
||||
migrate_task=lambda _task: False,
|
||||
try_remove_job=lambda _task: None,
|
||||
)
|
||||
chain.obtain_images = lambda **_kwargs: None
|
||||
|
||||
task = TransferTask(
|
||||
fileitem=FileItem(
|
||||
storage="local",
|
||||
path="/downloads/兰香如故.S01E32.mkv",
|
||||
type="file",
|
||||
name="兰香如故.S01E32.mkv",
|
||||
extension="mkv",
|
||||
size=1024,
|
||||
),
|
||||
meta=MetaBase("兰香如故 S01E32"),
|
||||
mtype=MediaType.MOVIE,
|
||||
download_history=DownloadHistorySnapshot(
|
||||
id=1,
|
||||
path="/downloads/兰香如故.S01E32.mkv",
|
||||
type=MediaType.TV.value,
|
||||
title="兰香如故",
|
||||
media_source=MediaSource.TMDB,
|
||||
media_id="282326",
|
||||
),
|
||||
preview=True,
|
||||
)
|
||||
|
||||
state, message = chain._TransferChain__handle_transfer(task)
|
||||
|
||||
assert not state
|
||||
assert "已在整理队列中" in message
|
||||
assert recognition_calls[0]["mtype"] == MediaType.TV
|
||||
assert recognition_calls[0]["media_source"] == MediaSource.TMDB
|
||||
assert recognition_calls[0]["media_id"] == "282326"
|
||||
Reference in New Issue
Block a user