tasks: заведена задача про прослушивание записи в приложении
- play-recording-in-app: экран, привязка проигрываемой копии к задаче, отдача файла хранилищем - цели web-access добавлен седьмой пункт «Завершения»
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
# ✨ Проигрывать загруженную запись на экране записи
|
||||
|
||||
- **Тип:** feature
|
||||
- **Категория:** Очередь
|
||||
- **Зачем:** Послушать загруженное приложение не даёт, а самой копии для этого у задачи нет: указатель на файл перезаписывается на каждом шаге конвейера и у готовой задачи ведёт на объект в Object Storage.
|
||||
- **Теги:** goal:web-access
|
||||
|
||||
Двигает пункт 7 «Завершения» цели: запись слушается на её экране, а не
|
||||
скачивается файлом.
|
||||
|
||||
Заметка владельца от 2026-08-12. Копии на диске остаются все три — исходник,
|
||||
ogg после конвертации и запись об объекте, — но `job.FileID` на каждом шаге
|
||||
указывает на последнюю: у задачи в `done` он ведёт на объект Object Storage, а
|
||||
местные копии не связаны с задачей ничем. Значит, задача не только про экран:
|
||||
проигрываемую копию сперва нужно к записи привязать.
|
||||
|
||||
Берётся после `records-list-screen` — экран одной записи делает она.
|
||||
|
||||
## Затрагивает
|
||||
|
||||
- связь задачи с копией: сегодня `transcribe_jobs.file` — одно поле на одну
|
||||
копию, и шаг схемы придётся добавлять;
|
||||
- контракт HTTP API из `json-api-for-spa` — адрес проигрываемой копии в ответе
|
||||
о записи;
|
||||
- экран одной записи из `records-list-screen`;
|
||||
- отдачу файла хранилищем: `/api/files/...` отвечает на `Range` сам, но
|
||||
`audio/ogg` не входит в перечень типов, которые хранилище отдаёт с
|
||||
`Content-Disposition: inline`, — ogg-копия уходит вложением;
|
||||
- периметр из [ADR-2026-08-12](../../docs/adr/ADR-2026-08-12-file-link-open-but-not-logged.md):
|
||||
ссылка на файл открыта знанием записи, и экран делает её видимой странице;
|
||||
- `docs/architecture.md` — какая копия считается проигрываемой.
|
||||
|
||||
## Критерии приёмки
|
||||
|
||||
- Готовая запись проигрывается с её экрана, без скачивания файла. Оракул — тест
|
||||
экрана на подставном API: у проигрывателя есть источник, и он начинает играть.
|
||||
- Задача в `done` указывает на копию, пригодную для браузера. Оракул — тест
|
||||
конвейера: после полного прохода у задачи есть адрес местной копии, а не
|
||||
только ключ объекта.
|
||||
- Запись, ещё не дошедшую до текста, экран тоже даёт послушать. Оракул — тест на
|
||||
задаче в состоянии `transcribe`: проигрыватель на экране есть.
|
||||
- Копия отдаётся так, что её берёт проигрыватель браузера, и перемотка работает
|
||||
на записи длиннее часа. Оракул — два запроса к адресу копии: обычный отвечает
|
||||
типом и заголовком `Content-Disposition`, при которых элемент `audio` играет,
|
||||
а запрос с `Range` — кодом `206` и запрошенным куском.
|
||||
|
||||
## Рамки
|
||||
|
||||
Скачивания файла, обрезки и синхронизации текста со звуком не делаем. Записи
|
||||
звука в приложении не делаем — это граница цели. Формат хранения и раскладку
|
||||
каталога данных не трогаем: они объявлены необратимыми, а шаг схемы, уехавший на
|
||||
сервер, не переписывается — изменение только новым файлом шага.
|
||||
@@ -28,3 +28,4 @@
|
||||
отдельном экране, без адресной строки.
|
||||
6. Открытое без сети, приложение показывает это состоянием, а не пустой
|
||||
страницей и не ошибкой браузера.
|
||||
7. Загруженная запись слушается на своём экране, а не скачивается файлом.
|
||||
|
||||
Reference in New Issue
Block a user