// Author: fruit.com.cn import { getImage, resolveMedia, resolvePlaybackUrl } from '../../shared/lib/media'; import { getText } from '../../shared/lib/text'; export function normalizeDrama(item = {}, lang = 'id') { const id = String(item.id ?? item.dramaId ?? item.code ?? ''); const episodes = item.episodes || item.episodeList || (item.preview ? [item.preview] : []); const preview = item.preview || episodes[0] || null; return { id, title: getText(item.titleLocales || item.locales || item.title, lang) || item.name || 'YMB Drama', channel: getText(item.channelLocales || item.channel, lang) || item.creatorName || 'YMB Originals', genre: getText(item.categoryLocales || item.genre, lang) || getText(item.types?.[0], lang), image: getImage(item), duration: item.duration || preview?.duration || '', views: item.views || item.viewCount || '', likeCount: Number(item.likeCount) || 0, favoriteCount: Number(item.favoriteCount) || 0, commentCount: Number(item.commentCount) || 0, description: getText(item.synopsisLocales, lang) || '', episodes: episodes.map((episode) => ({ ...episode, playUrl: resolvePlaybackUrl(episode.playUrl) })), preview: preview ? { ...preview, playUrl: resolvePlaybackUrl(preview.playUrl) } : null, }; } export function normalizeProgress(item = {}, lang = 'id') { const durationMs = Number(item.durationMs) || 0; const positionMs = Number(item.positionMs) || 0; return { id: String(item.dramaId ?? ''), episodeId: String(item.episodeId ?? ''), title: getText(item.titleLocales, lang) || item.dramaTitle || 'YMB Drama', image: resolveMedia(item.dramaCoverLandscape || item.dramaCover || ''), episodeNumber: item.episodeNumber == null ? null : Number(item.episodeNumber), totalEpisodes: item.totalEpisodes == null ? null : Number(item.totalEpisodes), positionMs, durationMs, fraction: durationMs > 0 ? Math.min(1, positionMs / durationMs) : 0, viewCount: item.viewCount, finished: Boolean(item.finished), updatedAt: item.updatedAt || '', }; } export function uniqueDramas(items) { const seen = new Set(); return items.filter((item) => { if (seen.has(item.id)) return false; seen.add(item.id); return true; }); }