mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-04 23:17:20 +08:00
feat(download): 支持未识别资源确认下载 (#6356)
* feat(download): 支持未识别资源确认下载 * feat(download): 音乐与影视统一未识别确认下载逻辑 * fix(download): 修正未识别媒体信息构造的类型标注与合集归一 --------- Co-authored-by: liulang <liulang@25qp.cn> Co-authored-by: jxxghp <jxxghp@gmail.com>
This commit is contained in:
co-authored by
liulang
jxxghp
parent
bbd5c12dbc
commit
0069d04b18
@@ -18,6 +18,7 @@ from app.api.response import ResponseAPIRouter
|
||||
from app.chain.download import DownloadChain
|
||||
from app.chain.media import MediaChain
|
||||
from app.domain.context import Context, MediaInfo, MusicInfo, SubtitleInfo, TorrentInfo
|
||||
from app.domain.meta.metabase import MetaBase
|
||||
from app.domain.meta.metamusic import MetaMusic
|
||||
from app.domain.metainfo import MetaInfo
|
||||
from app.adapters.web.security.access import verify_token
|
||||
@@ -71,6 +72,44 @@ def _prepare_subtitle_download(
|
||||
return True, ""
|
||||
|
||||
|
||||
def _build_unrecognized_media_info(
|
||||
torrent: _SchemaTorrentInfo,
|
||||
metainfo: MetaBase,
|
||||
is_music: bool = False,
|
||||
music_type: Optional[str] = None,
|
||||
) -> MediaInfo | MusicInfo:
|
||||
"""
|
||||
为用户确认的未识别资源构造最小下载上下文,影视与音乐统一处理。
|
||||
|
||||
影视以种子分类兜底媒体类型并保留标题年份,音乐按解析标题构造音乐信息,
|
||||
两者都不再要求识别出统一媒体信息即可继续下载。
|
||||
"""
|
||||
if is_music:
|
||||
return MusicInfo(
|
||||
title=metainfo.title or torrent.title,
|
||||
year=metainfo.year,
|
||||
music_type=music_type or MUSIC_ENTITY_RECORDING,
|
||||
)
|
||||
try:
|
||||
media_type = MediaType(torrent.category)
|
||||
except (TypeError, ValueError):
|
||||
media_type = MediaType.from_agent(torrent.category)
|
||||
if media_type == MediaType.COLLECTION:
|
||||
media_type = MediaType.MOVIE
|
||||
if media_type not in (MediaType.MOVIE, MediaType.TV):
|
||||
media_type = metainfo.type
|
||||
# 合集类型在回退到元数据后同样归一为电影,避免落到 UNKNOWN
|
||||
if media_type == MediaType.COLLECTION:
|
||||
media_type = MediaType.MOVIE
|
||||
if media_type not in (MediaType.MOVIE, MediaType.TV):
|
||||
media_type = MediaType.UNKNOWN
|
||||
return MediaInfo(
|
||||
type=media_type,
|
||||
title=metainfo.name or torrent.title,
|
||||
year=metainfo.year,
|
||||
)
|
||||
|
||||
|
||||
@router.get("/", summary="正在下载", response_model=List[_SchemaDownloaderTorrent])
|
||||
def current(
|
||||
name: Optional[str] = None, _: _SchemaTokenPayload = Depends(verify_token)
|
||||
@@ -134,6 +173,7 @@ def add(
|
||||
media_source: Annotated[MediaSource | None, Body()] = None,
|
||||
media_id: Annotated[str | None, Body()] = None,
|
||||
music_type: Annotated[MusicTargetEntityType | None, Body()] = None,
|
||||
allow_unrecognized: Annotated[bool, Body()] = False,
|
||||
downloader: Annotated[str | None, Body()] = None,
|
||||
# 保存路径, 支持<storage>:<path>, 如rclone:/MP, smb:/server/share/Movies等
|
||||
save_path: Annotated[str | None, Body()] = None,
|
||||
@@ -189,7 +229,19 @@ def add(
|
||||
music_type=normalized_music_type,
|
||||
)
|
||||
if not mediainfo:
|
||||
return _SchemaResponse(success=False, message="无法识别媒体信息")
|
||||
if not allow_unrecognized:
|
||||
return _SchemaResponse(
|
||||
success=False,
|
||||
message="无法识别媒体信息",
|
||||
data=_SchemaDownloadAddedData(requires_confirmation=True),
|
||||
)
|
||||
# 用户已确认:影视与音乐统一按种子元信息构造最小上下文继续下载
|
||||
mediainfo = _build_unrecognized_media_info(
|
||||
torrent_in,
|
||||
metainfo,
|
||||
is_music=is_music,
|
||||
music_type=normalized_music_type,
|
||||
)
|
||||
# 种子信息
|
||||
torrentinfo = TorrentInfo()
|
||||
torrentinfo.from_dict(torrent_in.model_dump())
|
||||
|
||||
Reference in New Issue
Block a user