mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-29 12:06:51 +08:00
68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
"""订阅编排共享的媒体元数据与身份契约。"""
|
|
|
|
from typing import Optional, Protocol, Union
|
|
|
|
from app.domain.meta.metabase import MetaBase
|
|
from app.domain.meta.metamusic import MetaMusic
|
|
from app.domain.metainfo import MetaInfo
|
|
from app.schemas.media import build_media_key, resolve_media_identity
|
|
from app.schemas.types import MUSIC_ENTITY_ALBUM, MediaType
|
|
|
|
|
|
class SubscribeSnapshot(Protocol):
|
|
"""构造订阅媒体契约所需的最小只读字段集合。"""
|
|
|
|
name: str
|
|
type: str
|
|
year: Optional[str]
|
|
season: Optional[int]
|
|
media_source: object
|
|
media_id: object
|
|
music_type: Optional[str]
|
|
total_tracks: Optional[int]
|
|
|
|
|
|
def build_subscribe_meta(subscribe: SubscribeSnapshot) -> MetaBase:
|
|
"""按订阅快照构造主程序链路共用的媒体元数据。"""
|
|
if subscribe.type == MediaType.MUSIC.value:
|
|
is_album = getattr(subscribe, "music_type", None) == MUSIC_ENTITY_ALBUM
|
|
return MetaMusic(
|
|
title=subscribe.name,
|
|
album=subscribe.name if is_album else None,
|
|
year=subscribe.year,
|
|
total_tracks=(
|
|
getattr(subscribe, "total_tracks", None) if is_album else None
|
|
),
|
|
media_source=subscribe.media_source,
|
|
media_id=(
|
|
str(subscribe.media_id)
|
|
if subscribe.media_id is not None
|
|
else None
|
|
),
|
|
)
|
|
meta = MetaInfo(subscribe.name)
|
|
meta.year = subscribe.year
|
|
meta.begin_season = subscribe.season
|
|
meta.type = MediaType(subscribe.type)
|
|
meta.media_source = subscribe.media_source
|
|
meta.media_id = subscribe.media_id
|
|
return meta
|
|
|
|
|
|
def subscribe_media_key(
|
|
subscribe: SubscribeSnapshot,
|
|
) -> Union[str, int, None]:
|
|
"""返回订阅缺失集映射使用的稳定媒体键。"""
|
|
media_source, media_id = resolve_media_identity(media=subscribe)
|
|
return build_media_key(media_source, media_id) or media_id
|
|
|
|
|
|
def subscribe_media_keys(subscribe: SubscribeSnapshot) -> list[Union[str, int]]:
|
|
"""返回缺失集缓存可识别的规范媒体键与旧纯 ID 键。"""
|
|
media_source, media_id = resolve_media_identity(media=subscribe)
|
|
candidates = [
|
|
build_media_key(media_source, media_id),
|
|
media_id,
|
|
]
|
|
return [candidate for candidate in candidates if candidate not in (None, "")]
|