Add video as a media kind in photos: streaming upload with per-kind limits, ffprobe metadata, poster frame reusing the image variant pipeline, and a playback object (remux when web-compatible, else h264/yuv420p/aac transcode). Video jobs run on a separate pool with a long lease. Frontend gains a video viewer, grid badge/duration and video upload.
4.9 KiB
4.9 KiB
Tasks
1. Схема и миграции (паритет PostgreSQL и SQLite)
- 1.1 Добавить миграции PostgreSQL:
photos.kind(defaultimage) иduration_ms, рольplaybackвphoto_objects,variant_jobs.kind; проверитьmake migrateиgo test ./internal/db/.... - 1.2 Добавить парные миграции SQLite (пересборка
photo_objectsс рольюplayback); проверить миграционные тесты SQLite (go test ./internal/db/...). - 1.3 Дополнить контрактные тесты паритета бэкендов (роль
playback, колонкиkind) и прогнатьgo test ./internal/repo/....
2. Конфигурация и видео-инструменты
- 2.1 Ввести
IMAGE_MAX_UPLOAD_SIZE,VIDEO_MAX_UPLOAD_SIZE,FFMPEG_PATH,FFPROBE_PATH,VIDEO_TRANSCODE_CONCURRENCY,VIDEO_TEMP_DIRвconfigи.env.example; покрытьgo test ./internal/config/.... - 2.2 Определять доступность
ffmpeg/ffprobeна старте, выставлятьVIDEO_ENABLEDи отражать статус видео в/api/health; проверитьgo test ./internal/app/...(health).
3. Модель медиа и потоковое хранилище
- 3.1 Добавить
Photo.Kind,Photo.DurationMS,Photo.PlaybackURLи заполнение playback-URL вattachURLs; проверить юнит-тестом привязки URL. - 3.2 Добавить
Open(ctx, key) (io.ReadCloser, error)вstorage.Backendдля fs и s3; проверитьgo test ./internal/storage/....
4. Потоковая загрузка и лимиты
- 4.1 Перевести загрузку на стриминг во временный файл с расчётом размера и checksum и лимитом по виду файла; проверить
go test ./internal/photos/.... - 4.2 Расширить приём на
video/*(запись сkind=video, длительность до обработки), сохранив отказ для прочих типов; проверить тестами загрузки image/video/неподдерживаемого файла.
5. Обработка видео в воркере
- 5.1 Реализовать разбор
ffprobeи матрицу совместимости; юнит-тесты на h264/yuv420p, yuv444, hevc, mkv, vp9 и rotation. - 5.2 Реализовать построение команд remux/транскод и извлечение постера (
-ss 1, fallback-ss 0) с передачей вbuildVariants; проверить тестом с подставным ffmpeg (пропуск без ffmpeg). - 5.3 Ввести
variant_jobs.kind, длинный лизинг/таймаут и отдельный пул видео; проверитьgo test ./internal/photos/...(worker), включая изоляцию длительного задания от генерации картинок.
6. API-контракт и frontend
- 6.1 Добавить
kind,duration_ms,playback_urlвtypes.ts; проверитьnpm run check. - 6.2 Добавить в
Viewer.svelteветку<video controls poster>без перехвата клавиш зума/панорамы; проверитьnpm run checkиnpm run build. - 6.3 Добавить в
PhotoGrid.svelteпостер, значок воспроизведения и длительность, а вUploader.svelte— приёмvideo/*с лимитом по виду; проверитьnpm run check/npm run build.
7. Dev-наполнение и документация
- 7.1 Добавить флаг видео в seed-скрипт и Make-цель (
VIDEO=1) с пропуском при отсутствии инструментов; проверитьmake testdata DRY=1 VIDEO=1. - 7.2 Обновить
README.mdи.env.example: зависимость ffmpeg/ffprobe, лимиты и видео-переменные; проверить запуск по инструкции на чистом окружении.
8. Интеграционные проверки
- 8.1 E2E: загрузка видео приводит к постеру и
playback_urlна SQLite (пропуск без ffmpeg);go test ./internal/e2e/.... - 8.2 Проверить воспроизведение видео по share-ссылке и неизменность сборки мусора и корзины для видео (ручной прогон и профильные тесты).
Workflow follow-up
- Заархивировать изменение после удовлетворения требований ревью проекта.
- Проверить результат архива.