53 lines
2.2 KiB
JavaScript
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;
|
|
});
|
|
}
|