import type { EvidenceLevel as ContractEvidenceLevel, ExternalEntityType, MediaKind } from "@umt/contracts"; import type { Confidence, EvidenceLevel as DomainMatchLevel } from "@umt/domain"; // 证据等级:domain 的 EvidenceLevel 实为"匹配等级"(含 rejected),这里以 DomainMatchLevel 称呼; // contracts 的 EvidenceLevel 是落库/展示用的证据等级(含 manual、needs_review)。 export type { DomainMatchLevel }; const LEVEL_TO_CONTRACT: Record = { rule_confirmed: "rule_confirmed", multi_evidence: "multi_evidence", needs_confirm: "needs_review", // 被否决的候选不形成证据记录 rejected: null, }; const LEVEL_TO_DOMAIN: Record = { // 人工确认按最强规则证据参与排序 manual: "rule_confirmed", rule_confirmed: "rule_confirmed", multi_evidence: "multi_evidence", needs_review: "needs_confirm", }; export const DOMAIN_MATCH_LEVELS = Object.keys(LEVEL_TO_CONTRACT) as DomainMatchLevel[]; /** domain 匹配等级 / 解析置信度 → contracts 证据等级;rejected 返回 null */ export function toContractEvidenceLevel(level: DomainMatchLevel): ContractEvidenceLevel | null { return LEVEL_TO_CONTRACT[level]; } export function toDomainConfidence(level: ContractEvidenceLevel): Confidence { return LEVEL_TO_DOMAIN[level]; } // ── 媒体类型:domain 只分 movie / tv ── export type DomainMediaType = "movie" | "tv"; const MEDIA_TO_DOMAIN: Record = { movie: "movie", series: "tv", // 综艺按剧集规则(季/期)处理 variety: "tv", collection: null, other: null, }; export function toDomainMediaType(kind: MediaKind): DomainMediaType | null { return MEDIA_TO_DOMAIN[kind]; } /** domain → contracts 媒体类型;tv 默认落为 series,综艺由调用方按来源分类显式指定 */ export function toContractMediaKind(t: DomainMediaType, opts: { variety?: boolean } = {}): MediaKind { return t === "movie" ? "movie" : opts.variety ? "variety" : "series"; } const ENTITY_TYPE_TO_DOMAIN: Record = { movie: "movie", tv: "tv", season: null, episode: null, collection: null, person: null, }; export function toDomainEntityType(t: ExternalEntityType): DomainMediaType | null { return ENTITY_TYPE_TO_DOMAIN[t]; } export function toContractEntityType(t: DomainMediaType): ExternalEntityType { return t; }