chore(openspec): archive add-video-support and sync main specs

This commit is contained in:
iu
2026-10-11 20:38:22 +03:00
parent d38ede0201
commit b2e0dd6d30
14 changed files with 218 additions and 8 deletions
@@ -0,0 +1,57 @@
# Proposal
## Why
Альбом задуман как общее пространство для медиа семьи или команды, но сегодня принимает
только изображения: загрузка отклоняет всё, что не `image/*`, генерация вариантов и
вьюер работают исключительно с картинками. Видео с телефонов и камер остаётся вне
системы — теряется в мессенджерах и разрывает контекст альбома. Пользователю нужно
загружать видео в те же альбомы и гарантированно воспроизводить его в браузере.
## What Changes
- Загрузка видео в альбом наравне с фото: стриминг multipart, отдельный лимит 2 ГБ
(картинки остаются 100 МБ).
- Сущность фото становится медиа-записью: `kind` (`image` | `video`), `duration_ms`,
`playback_url`; набор ролей объекта пополняется ролью `playback`.
- Асинхронная подготовка видео в фоне: извлечение метаданных (ffprobe), постер-кадр
(переиспользует существующую генерацию WebP-вариантов thumb/medium/preview) и
воспроизводимый mp4 — remux без перекодирования для web-совместимых источников,
иначе транскод в h264/yuv420p/aac с `faststart`.
- Очередь заданий различает вид задачи и отделяет длительные (транскод) задания от
коротких (картинки): длительный лизинг, таймаут и отдельный малый пул, чтобы
транскод не вытеснял генерацию вариантов изображений.
- Внешняя зависимость `ffmpeg`/`ffprobe` (без Docker — бинарник на хосте): путь
конфигурируется, доступность отражается в health, при отсутствии видео-функции
отключаются.
- UI: плеер `<video>` во вьюере, постер и признак видео с длительностью в сетке,
приём видео в загрузчике.
- **BREAKING**: изменяются схема `photos` и ограничение ролей `photo_objects` на обоих
бэкендах метаданных (PostgreSQL и SQLite), с пересборкой таблицы в SQLite.
## Capabilities
### New Capabilities
- `videos`: обработка и воспроизведение видео в альбоме — приём файла, извлечение
метаданных, постер-кадр, remux/транскод в web-формат, контракт воспроизведения и
готовности.
### Modified Capabilities
- `photos`: сущность фото становится медиа-записью (`kind`, `duration_ms`,
`playback_url`); расширяется допустимый ввод и лимиты размера.
- `media-objects`: набор ролей объекта включает `playback`; очередь заданий различает
виды и поддерживает длительные задания с длительным лизингом.
- `ui-workspace`: вьюер, сетка и загрузчик получают поддержку видео.
- `dev-seed-data`: набор seed-данных включает видео-фикстуры.
## Impact
- **Backend**: `photos` (service, handlers, pipeline, worker, objects, keys), новые
миграции PostgreSQL и SQLite, `storage` (стриминговое чтение больших объектов),
`app` (роуты/health), `config` (VIDEO-*, FFMPEG_PATH, лимиты).
- **Frontend**: `types.ts`, `Viewer.svelte`, `PhotoGrid.svelte`, `Uploader.svelte`.
- **Зависимости**: `ffmpeg`/`ffprobe` на хосте; целевой remux/транскод в mp4 h264/aac.
- **Без изменений**: `albums`, `share-links`, `social`, `realtime` — работают через
роль `playback` и постер-картинку без правок поведения.