import type { IRawVideoData, IVideoData, ISceneGroup, ITimelineGroup } from '../../../types'; // «locations» → «Locations», «living_room» → «Living room». const humanize = (value?: string | null): string => { const text = (value ?? '').replace(/_/g, ' ').trim(); return text ? text.charAt(0).toUpperCase() + text.slice(1) : text; }; // timelines_groups ({ name, actions:[{ duration?, title }] }) → sceneGroups ({ id, title, scenes:[{ start, title }] }). const cleanTimelineGroups = (raw: ITimelineGroup[] | null): ISceneGroup[] | null => { if (!Array.isArray(raw)) return null; const groups = raw .filter((group) => Array.isArray(group?.actions) && group.actions.length > 0) .map((group) => ({ id: group.name || '', title: humanize(group.title), scenes: group.actions .filter((action) => action?.title) .map((action) => ({ start: Number(action.duration) || 0, title: humanize(action.title), })), })) .filter((group) => group.scenes.length > 0); return groups.length ? groups : null; }; // hotspots (string[]) → number[] (значения кривой популярности по корзинам). const cleanHotspots = (raw: string[] | null): number[] | null => { if (!Array.isArray(raw)) return null; const values = raw.map(Number).filter((value) => Number.isFinite(value)); return values.length ? values : null; }; /** Нормализует сырые данные видео к типу IVideoData. */ export const cleanVideoData = (data: IRawVideoData): IVideoData => ({ guid: data.guid || '', md5: data.md5 || '', duration: data.duration || 0, title: data.title || '', header: data.header || '', views: data.views || 0, likes: data.likes || 0, id: data.id || '', tags: data.tags || [], models: data.models || [], categories: data.categories || [], actions: data.actions || null, channelName: data.channel?.name || '', channelAvatar: data.channel?.avatar_url || '', url: data.url || '', previewUrl: data.preview_url || '', thumbUrls: data.thumb_urls ? { webp: data.thumb_urls.webp, } : undefined, vttUrl: data.vtt_url || '', vttSpriteUrl: data.vtt_sprite_url || '', created: data.created || 0, videoUrl: data.video_url || '', isDeleted: data.is_deleted || false, thumbNum: data.thumb_number || 0, description: data.description || '', dislikes: data.dislikes || 0, hotspots: cleanHotspots(data.hotspots), timelinesGroups: cleanTimelineGroups(data.timelines_groups), isCanonical: data.is_canonical || false, });