Files

50 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Tasks
## 1. Схема и миграции (паритет PostgreSQL и SQLite)
- [x] 1.1 Добавить миграции PostgreSQL: `photos.kind` (default `image`) и `duration_ms`, роль `playback` в `photo_objects`, `variant_jobs.kind`; проверить `make migrate` и `go test ./internal/db/...`.
- [x] 1.2 Добавить парные миграции SQLite (пересборка `photo_objects` с ролью `playback`); проверить миграционные тесты SQLite (`go test ./internal/db/...`).
- [x] 1.3 Дополнить контрактные тесты паритета бэкендов (роль `playback`, колонки `kind`) и прогнать `go test ./internal/repo/...`.
## 2. Конфигурация и видео-инструменты
- [x] 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/...`.
- [x] 2.2 Определять доступность `ffmpeg`/`ffprobe` на старте, выставлять `VIDEO_ENABLED` и отражать статус видео в `/api/health`; проверить `go test ./internal/app/...` (health).
## 3. Модель медиа и потоковое хранилище
- [x] 3.1 Добавить `Photo.Kind`, `Photo.DurationMS`, `Photo.PlaybackURL` и заполнение playback-URL в `attachURLs`; проверить юнит-тестом привязки URL.
- [x] 3.2 Добавить `Open(ctx, key) (io.ReadCloser, error)` в `storage.Backend` для fs и s3; проверить `go test ./internal/storage/...`.
## 4. Потоковая загрузка и лимиты
- [x] 4.1 Перевести загрузку на стриминг во временный файл с расчётом размера и checksum и лимитом по виду файла; проверить `go test ./internal/photos/...`.
- [x] 4.2 Расширить приём на `video/*` (запись с `kind=video`, длительность до обработки), сохранив отказ для прочих типов; проверить тестами загрузки image/video/неподдерживаемого файла.
## 5. Обработка видео в воркере
- [x] 5.1 Реализовать разбор `ffprobe` и матрицу совместимости; юнит-тесты на h264/yuv420p, yuv444, hevc, mkv, vp9 и rotation.
- [x] 5.2 Реализовать построение команд remux/транскод и извлечение постера (`-ss 1`, fallback `-ss 0`) с передачей в `buildVariants`; проверить тестом с подставным ffmpeg (пропуск без ffmpeg).
- [x] 5.3 Ввести `variant_jobs.kind`, длинный лизинг/таймаут и отдельный пул видео; проверить `go test ./internal/photos/...` (worker), включая изоляцию длительного задания от генерации картинок.
## 6. API-контракт и frontend
- [x] 6.1 Добавить `kind`, `duration_ms`, `playback_url` в `types.ts`; проверить `npm run check`.
- [x] 6.2 Добавить в `Viewer.svelte` ветку `<video controls poster>` без перехвата клавиш зума/панорамы; проверить `npm run check` и `npm run build`.
- [x] 6.3 Добавить в `PhotoGrid.svelte` постер, значок воспроизведения и длительность, а в `Uploader.svelte` — приём `video/*` с лимитом по виду; проверить `npm run check`/`npm run build`.
## 7. Dev-наполнение и документация
- [x] 7.1 Добавить флаг видео в seed-скрипт и Make-цель (`VIDEO=1`) с пропуском при отсутствии инструментов; проверить `make testdata DRY=1 VIDEO=1`.
- [x] 7.2 Обновить `README.md` и `.env.example`: зависимость ffmpeg/ffprobe, лимиты и видео-переменные; проверить запуск по инструкции на чистом окружении.
## 8. Интеграционные проверки
- [x] 8.1 E2E: загрузка видео приводит к постеру и `playback_url` на SQLite (пропуск без ffmpeg); `go test ./internal/e2e/...`.
- [x] 8.2 Проверить воспроизведение видео по share-ссылке и неизменность сборки мусора и корзины для видео (ручной прогон и профильные тесты).
## Workflow follow-up
- Заархивировать изменение после удовлетворения требований ревью проекта.
- Проверить результат архива.