Files
transcriber/tasks/items/play-recording-in-app.md
T
av 8739b18a9f tasks: очередь расставлена от базы к деталям
- порядок беклога и роадмапа назначен слоями: проверки, которым можно
  верить → долги входа → владелец записи и контракт API → конвейер под
  тестами → приложение и возможности поверх; у каждого движения записана
  причина;
- заведены восемь задач под пункты «Завершения», которых не закрывала ни
  одна запись, — цель any-audio-source была без задач вовсе;
- у четырёх задач сняты критерии, требовавшие того, что делает задача ниже
  по очереди; исправлены ссылки на несуществующий repo/sqlite и на
  отменённую разведку об очереди.
2026-08-12 20:48:53 +03:00

53 lines
4.5 KiB
Markdown
Raw 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.
# ✨ Проигрывать загруженную запись на экране записи
- **Тип:** 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` и запрошенным куском.
## Рамки
Скачивания файла, обрезки и синхронизации текста со звуком не делаем. Записи
звука в приложении не делаем — это граница цели. Формат хранения и раскладку
каталога данных не трогаем: они объявлены необратимыми, а шаг схемы, уехавший на
сервер, не переписывается — изменение только новым файлом шага.