import { VIDEO_POOL } from './videos'; import { libraryStub } from './library'; import type { IThumbUrls } from '../types'; const HOUR = 3600; const DAY = 24 * HOUR; export type CollectionStubCard = { guid: string; id: string; title: string; duration: number; thumbUrls: IThumbUrls; previewUrl: string; channelName?: string; channelAvatar?: string; /** Доля просмотренного, 0–100 — часть сохранённого уже начали смотреть */ progress?: number; /** Unix timestamp (сек.) добавления в коллекцию */ addedAt: number; }; /** `addedAgo` — смещение в секундах от «сейчас», чтобы порядок «недавние» не устаревал. */ type SaveState = { addedAgo: number; progress?: number; }; /** Состояние избранного поверх общего пула роликов — индекс в индекс с `VIDEO_POOL`. */ const FAVORITES_STATE: SaveState[] = [ { addedAgo: 2 * HOUR }, { addedAgo: 6 * HOUR, progress: 62 }, { addedAgo: 11 * HOUR }, { addedAgo: DAY + 4 * HOUR, progress: 35 }, { addedAgo: DAY + 9 * HOUR }, { addedAgo: 2 * DAY + 2 * HOUR }, { addedAgo: 2 * DAY + 13 * HOUR, progress: 88 }, { addedAgo: 3 * DAY + 5 * HOUR }, { addedAgo: 4 * DAY + 7 * HOUR }, { addedAgo: 5 * DAY + 3 * HOUR, progress: 17 }, { addedAgo: 6 * DAY + 10 * HOUR }, { addedAgo: 8 * DAY + 6 * HOUR }, ]; /** «Смотреть позже» откладывают чаще недосмотренным — прогресс тут почти у каждого ролика. */ const WATCH_LATER_STATE: SaveState[] = [ { addedAgo: HOUR, progress: 57 }, { addedAgo: 4 * HOUR }, { addedAgo: 8 * HOUR, progress: 24 }, { addedAgo: 14 * HOUR, progress: 71 }, { addedAgo: DAY + 2 * HOUR }, { addedAgo: DAY + 8 * HOUR, progress: 43 }, { addedAgo: 2 * DAY + 5 * HOUR, progress: 9 }, { addedAgo: 3 * DAY + HOUR }, { addedAgo: 3 * DAY + 12 * HOUR, progress: 66 }, { addedAgo: 5 * DAY + 6 * HOUR }, { addedAgo: 7 * DAY + 3 * HOUR, progress: 31 }, { addedAgo: 9 * DAY + 9 * HOUR, progress: 95 }, ]; /** Пул повторяется волнами, пока не наберётся счётчик коллекции; шаг — насколько старее волна. */ const WAVE_STEP = 10 * DAY; function getCollectionStub(state: SaveState[], total: number, prefix: string): CollectionStubCard[] { const now = Math.floor(Date.now() / 1000); const items = VIDEO_POOL.map((video, index) => ({ ...video, ...state[index] })); const waves = Math.ceil(total / items.length); return Array.from({ length: waves }) .flatMap((_, wave) => items.map(({ addedAgo, ...item }) => ({ ...item, guid: `${item.id}-${prefix}-${wave}`, addedAt: now - addedAgo - wave * WAVE_STEP, }))) .sort((a, b) => b.addedAt - a.addedAt) .slice(0, total); } export const getFavoritesStub = () => getCollectionStub(FAVORITES_STATE, libraryStub.favorites, 'fav'); export const getWatchLaterStub = () => getCollectionStub(WATCH_LATER_STATE, libraryStub.watchLater, 'later');