Files
ymb-site/src/entities/drama/model.js
T

53 lines
2.2 KiB
JavaScript

// 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;
});
}