Files
ds-galo/openspec/changes/add-video-support/tasks.md
T
iu d38ede0201 feat(video): add video upload with remux/transcode playback
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.
2026-10-11 20:37:53 +03:00

4.9 KiB
Raw Blame History

Tasks

1. Схема и миграции (паритет PostgreSQL и SQLite)

  • 1.1 Добавить миграции PostgreSQL: photos.kind (default image) и 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

  • Заархивировать изменение после удовлетворения требований ревью проекта.
  • Проверить результат архива.