From aa20b229f952bea702583a577d2b48988736bdef Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Wed, 12 Aug 2026 09:14:05 +0300 Subject: [PATCH] =?UTF-8?q?tasks:=20=D0=B7=D0=B0=D0=B2=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=20=D0=BF=D1=80=D0=BE=D1=81=D0=BB=D1=83=D1=88=D0=B8?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B8=20=D0=B2=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - play-recording-in-app: экран, привязка проигрываемой копии к задаче, отдача файла хранилищем - цели web-access добавлен седьмой пункт «Завершения» --- tasks/BACKLOG.md | 1 + tasks/items/play-recording-in-app.md | 52 ++++++++++++++++++++++++++++ tasks/items/web-access.md | 1 + 3 files changed, 54 insertions(+) create mode 100644 tasks/items/play-recording-in-app.md diff --git a/tasks/BACKLOG.md b/tasks/BACKLOG.md index 43545d1..54a0e85 100644 --- a/tasks/BACKLOG.md +++ b/tasks/BACKLOG.md @@ -60,4 +60,5 @@ - [🧹 Разобрать мелочи слоя хранилища](items/storage-layer-nits.md) — Три мелочи ниже потолка триажа: цикл воркера пишет потерю захвата уровнем ERROR и считает её отказом, тип ошибки заведён там, где конвенция просит sentinel, а FileName несёт два разных смысла. - [🔬 Уведомление SpeechKit о готовности вместо опроса](items/speechkit-callback-fit.md) — Шаг проверки дёргает операцию раз в 5 секунд всё время распознавания: часовая запись даёт порядка 720 обращений к платному сервису вместо одного ответа. - [🔬 Адрес объекта в тексте отказа SpeechKit](items/speechkit-error-text-leak.md) — Текст отказа операции приходит от Yandex и уезжает в журнал и в колонку error_text: если он несёт URI объекта, из журнала снова собирается ссылка на чужую запись. +- [✨ Проигрывать загруженную запись на экране записи](items/play-recording-in-app.md) — Послушать загруженное приложение не даёт, а самой копии для этого у задачи нет: указатель на файл перезаписывается на каждом шаге конвейера и у готовой задачи ведёт на объект в Object Storage. - [🔬 Квота по общему размеру загруженного на пользователя](items/per-user-size-quota.md) — Паспорт и security.md запрещают отказы по квоте пользователю, а заметка владельца просит квоту по умолчанию 5 ГБ — открытое противоречие с границей домена, которое владелец решил не разбирать сейчас. diff --git a/tasks/items/play-recording-in-app.md b/tasks/items/play-recording-in-app.md new file mode 100644 index 0000000..933052f --- /dev/null +++ b/tasks/items/play-recording-in-app.md @@ -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` и запрошенным куском. + +## Рамки + +Скачивания файла, обрезки и синхронизации текста со звуком не делаем. Записи +звука в приложении не делаем — это граница цели. Формат хранения и раскладку +каталога данных не трогаем: они объявлены необратимыми, а шаг схемы, уехавший на +сервер, не переписывается — изменение только новым файлом шага. diff --git a/tasks/items/web-access.md b/tasks/items/web-access.md index 1fd03a3..fac09d8 100644 --- a/tasks/items/web-access.md +++ b/tasks/items/web-access.md @@ -28,3 +28,4 @@ отдельном экране, без адресной строки. 6. Открытое без сети, приложение показывает это состоянием, а не пустой страницей и не ошибкой браузера. +7. Загруженная запись слушается на своём экране, а не скачивается файлом.