import { normalizePublishPlatformIds } from "./publish-platforms"; export type CoverSupportMode = "native" | "unsupported"; export interface PlatformCoverRequirement { platformId: string; required: boolean; supportMode: CoverSupportMode; aspectRatio: number | null; aspectLabel: string | null; outputWidth: number | null; outputHeight: number | null; priority: number; } const defaultRequirement = { required: false, supportMode: "unsupported" as CoverSupportMode, aspectRatio: null, aspectLabel: null, outputWidth: null, outputHeight: null, priority: 0, }; const requirementCatalog: Record> = { baijiahao: { required: true, supportMode: "native", aspectRatio: 3 / 2, aspectLabel: "3:2", outputWidth: 1200, outputHeight: 800, priority: 100, }, dongchedi: { required: true, supportMode: "native", aspectRatio: 4 / 3, aspectLabel: "4:3", outputWidth: 1200, outputHeight: 900, priority: 90, }, }; export function getPlatformCoverRequirements(platformIds?: Array): PlatformCoverRequirement[] { return normalizePublishPlatformIds(platformIds).map((platformId) => { const config = requirementCatalog[platformId] ?? {}; return { platformId, required: config.required ?? defaultRequirement.required, supportMode: config.supportMode ?? defaultRequirement.supportMode, aspectRatio: config.aspectRatio ?? defaultRequirement.aspectRatio, aspectLabel: config.aspectLabel ?? defaultRequirement.aspectLabel, outputWidth: config.outputWidth ?? defaultRequirement.outputWidth, outputHeight: config.outputHeight ?? defaultRequirement.outputHeight, priority: config.priority ?? defaultRequirement.priority, }; }); } export function coverUploadRequired(platformIds?: Array): boolean { return getPlatformCoverRequirements(platformIds).some((item) => item.required); } export function getPrimaryCoverRequirement(platformIds?: Array): PlatformCoverRequirement { const requirements = getPlatformCoverRequirements(platformIds); if (!requirements.length) { return { platformId: "default", ...defaultRequirement, }; } return [...requirements].sort((left, right) => right.priority - left.priority)[0]; } export function deriveCoverFileName(value?: string | null): string { const trimmed = String(value ?? "").trim(); if (!trimmed) { return ""; } try { const pathname = new URL(trimmed, "https://cover.local").pathname; const lastSegment = pathname.split("/").filter(Boolean).at(-1) ?? ""; return decodeURIComponent(lastSegment); } catch { return ""; } }