Sub Video Manager Техническая документация
v2.17.1 · stable

Версия клиента 2.17.1 для stable

Sub Video Manager: техническая документация

Единый справочник по desktop-клиенту, FastAPI, MongoDB, файлам проектов, синхронизации, YouTube, переводу, CapCut и эксплуатации сервера.

Продукт: Stray Kids District Клиент: Windows + WebView2 Backend: FastAPI + MongoDB + GridFS Обновлено: 07.10.2026

Назначение и границы системы

Sub Video Manager ведёт проекты субтитров от обнаружения YouTube-ролика до публикации: метаданные, исходные субтитры, перевод, таймкоды, проверка, оформление, CapCut draft, серверные файлы и итоговые ссылки.

Desktop-клиент — основная рабочая поверхность. API — канонический слой общих данных и файлов. Локальные каталоги остаются рабочей копией пользователя. Большие видео хранятся отдельно от файлового синка.

Канонический идентификатор проекта: YouTube video ID. Для ручного проекта используется стабильный ID с префиксом custom_. Название и тип меняются обычным обновлением; изменение ID выполняет администратор через отдельную saga с generation barrier и журналом.

Архитектура

Windows desktopReact UI в WebView2, Python bridge
→
FastAPIAuth, projects, sync, jobs, releases
→
MongoDB + GridFSМетаданные, blobs, журналы, бэкапы
КомпонентОтветственностьДанные
Desktop Web UIТаблица проектов, карточка, фильтры, админские окнаСостояние интерфейса и команды bridge
Python desktop shellФайлы, yt-dlp, CapCut, ffmpeg, синк, обновлениеЛокальные пути и рабочие файлы
APIЕдиная бизнес-модель, авторизация, координация клиентовJSON, multipart, ZIP, streaming
MongoDBПроекты, типы, аккаунты, сессии, jobs, manifest, логиДокументы и индексы
GridFSСинхронизированные файлы, style examples, CapCut draftsВерсионируемые blobs
Video/media serviceВидео отдельно от sync, подписанные скачивания и RangeMP4/MKV/WebM и метаданные ffprobe
CaddyПрямой публичный HTTPS reverse proxyAPI и media traffic

Публичные адреса

  • Основной API: https://api.xn--90a5ag.space/neuro-subs-api.
  • Документация: https://api.xn--90a5ag.space/about.
  • Media: отдельный домен из серверной настройки; ссылки подписаны и ограничены по времени.

Клиент использует единый production API. Публичный HTTPS завершается в Caddy, который передаёт запросы на локальный порт API.

Авторизация и права

После POST /auth/login клиент хранит случайный bearer token. На защищённых запросах передаётся Authorization: Bearer <token> и версия клиента в X-Neuro-Subs-Client-Version.

POST /neuro-subs-api/auth/login
Content-Type: application/json

{"login":"user","password":"…","device_id":"windows-host","client_version":"2.3.0"}
РольРазрешеноОграничения
userЧтение/редактирование проектов, обычные файлы, персональные настройки, CapCut bindingНет аккаунтов, глобальных правил типов, destructive admin actions, GPT и серверных video controls
adminВсе user-функции, аккаунты, типы, статусы, удаление, rollback, серверные видео, перевод и диагностикаОперации всё равно проходят проверки revision, путей и размера

CapCut-привязка хранится отдельно для каждого логина. API не должен возвращать пользователю имена drafts других пользователей.

Тема интерфейса хранится только локально по нормализованному логину и версии схемы: тёмная, светлая или системная, восемь пресетов и собственный accent. Она не синхронизируется через account preferences; контрастный цвет текста вычисляется для каждого accent.

Модель проекта

ПолеТипСмысл
idstringНеизменяемый YouTube ID или custom_….
namestringРедактируемое рабочее название; не меняет уже созданную локальную папку.
local_folder_namestringЗафиксированный slug локальной папки, созданный из первоначального названия.
content_typestringЛогическая серия/тип; определяет локальную папку и фильтр.
youtube_urlstringКанонический источник видео. Для custom может быть пустым.
is_custom_projectbooleanПроект создан вручную и не обязан иметь YouTube ID.
project_statusstringРабочий итоговый статус: в работе, готов, опубликован, не публикуем.
checkpointsobjectНабор булевых этапов workflow.
commentstringРабочие заметки, до 20 000 символов.
published_metaobjectЗаголовок и URL публикаций YouTube/VK.
original_publish_dateUTC datetimeТочный момент публикации исходного ролика в BSON UTC; API отдаёт RFC 3339 с Z. Для legacy-значений precision равен date_only.
our_publish_dateUTC datetimeТочный момент публикации командой в BSON UTC; значение обновляет только серверная синхронизация.
interview_sourcestringИсточник интервью; используется только для типа «Интервью».
interview_membersstring[]Участники интервью.
capcut_project_namesobjectПерсональные привязки логин → локальный CapCut draft.
capcut_draft_on_serverbooleanВычисляемый флаг наличия серверного draft.
video_download_*number/stringШирина, высота, resolution, codec скачанного видео.
date_added, updated_atdatetimeАудит создания и последнего изменения.

Дата

Интерфейс принимает 24.12.2023, 2023-12-24, 24 дек 2023 и 24 дек. 2023 г.. В хранилище записывается 2023-12-24. Невалидная дата не должна тихо затирать существующее значение.

Типы контента

Типы не хранятся отдельным фиксированным списком. Канонический источник — коллекция content_type_rules: каждая запись связывает ключевую фразу заголовка с типом. Список типов выводится из уникальных значений правил и уже существующих проектов.

  1. Заголовок нормализуется.
  2. Проверяются правила keyword → content type.
  3. При нескольких совпадениях побеждает более длинный keyword; затем более специфичный тип; затем более раннее правило.
  4. Если совпадений нет, пользователь выбирает существующий тип или создаёт новое правило.
  5. Выбранный тип записывается в проект и определяет локальную папку.
Важно при смене типа: сначала обновляется проект, затем локальная папка и sync mapping. Серверные sync-файлы остаются в projects/<project_id>/, поэтому смена типа не должна создавать второй серверный проект.

Все годовые варианты STAYweeK канонизируются в единый тип STAYweeK. STAYweek 2024, STAYweek 2025 и аналогичные папки считаются legacy.

Для интервью используются дополнительные поля источника и участников. Двуязычная очистка заголовка включается только у серий, где корейская и английская части систематически дублируют друг друга; произвольные скобки удалять нельзя.

Чекпойнты и статусы

КлючНазваниеКак устанавливается
video_source_loadedСсылка на видео загруженаАвтоматически по валидному YouTube ID/URL.
regular_subtitlesЕсть обычные сабыАвтоматически по ручному SRT; auto captions не включают.
auto_translatedПеревод выполненАвтоматически по непустому translated text.
timestamps_setНарезаны таймкодыАвтоматически по new_timestamps.
translated_with_eng_checkedТекст проверенВручную.
subtitles_tracks_setОформа расставленаВручную после раскладки по дорожкам.
formatting_correctedОформа откорректированаВручную; переводит проект на финальную проверку.
publishedВидео опубликованоСвязан с итоговым статусом.
readyГотовLegacy-флаг для старых клиентов.
do_not_publishНе публикуемВзаимоисключающий с published.

published=true автоматически покрывает предыдущие обязательные этапы. Legacy stage мигрируется в checkpoints и больше не является источником истины.

Файлы и каталоги

Два представления одного проекта

  • Локально: <content_type>/<unicode-safe-project-slug>/ — удобно человеку и CapCut.
  • На сервере sync: projects/<project_id>/ — стабильно при переименовании или смене типа.
  • Видео на сервере: отдельное video storage по типу/названию; оно не входит в обычный sync manifest.
Префикс файлаФорматНазначение
subtitles[_eng|_kor]_…SRTИсходные ручные субтитры.
original_text[_eng|_kor]_…TXTТекст, извлечённый из SRT.
translated_text[_eng|_kor]_…TXTПеревод с сохранением блоков.
translated_with_eng_…TXTПеревод рядом с оригиналом для проверки.
new_timestamps_…SRTНовая нарезка таймкодов.
translated_timestamps_…SRTПеревод, наложенный на таймкоды.
final_subtitles[_eng|_kor|_ru]_…SRTФинальные субтитры.
translation_progress…LOG/JSON/TXTСостояние возобновляемого перевода.
translation_summary…TXTКонтекст и итог перевода.
thumbnail_<project_id>.pngPNGКаноническое превью; имя привязано к ID.
<project_id>пустой файлСкрытый маркер принадлежности локальной папки; на сервере лежит по тому же ID-пути.
draft_content.jsonJSONПереносимый CapCut draft.

Видео, .part, временные файлы, lock-файлы, cache, review frames и published output исключены из обычного sync. Это предотвращает тяжёлые случайные загрузки и конфликт рабочих артефактов.

Синхронизация

Синк сравнивает SHA-256, размер, mtime и серверную revision. Современная схема путей — project-id-v1. Клиент отображает серверный namespace через локальный mapping и никогда не должен хешировать исчезнувший файл без повторной проверки существования.

ПолитикаФайлыПоведение
bidirectionalTXT, SRT и обычные project artifactsСтороны сравниваются; новая revision переносится с журналом изменения.
server_authoritativedraft_content.json, PNGОбычный пользователь не перезаписывает существующую серверную версию через mtime merge.
excludedВидео, temp, cache, review outputНе входит в manifest и не загружается.

Цикл синка

  1. Клиент сканирует локальный manifest и сопоставляет папки с project IDs.
  2. POST /sync/manifest/diff возвращает upload/download/delete decisions и server cursor.
  3. Мелкие наборы передаются batch ZIP. Большие файлы используют start → chunks → complete.
  4. Каждая запись проверяется по path policy, размеру, SHA-256 и expected server revision.
  5. Перед destructive изменением сервер создаёт backup; администратор может выполнить rollback.
  6. Локальная state-база сохраняет последний server cursor и revisions.

Конфликт

Если обе стороны изменились после последней общей revision, клиент не должен молча выбирать файл. Для server-authoritative файлов требуется явное действие. Для текста показывается сводка изменённых блоков/таймкодов.

Удаление: запись удаляется логически и синхронизируется как tombstone. Удалять server file нужно с актуальной revision; устаревший запрос получает конфликт, а не уничтожает новую версию.

Справочник API

Ниже — назначение всех production routes. Точные request/response schemas и возможность выполнить запрос находятся в Swagger UI; контракт для генераторов клиентов — в OpenAPI JSON. Предпочтительный base path: /neuro-subs-api.

Состояние и релизы

МетодПутьДоступНазначение
GET/healthpublicМинимальный API + MongoDB ping.
GET/health/livepublicLiveness процесса без обращения к MongoDB и файловым хранилищам.
GET/health/readypublicReadiness: MongoDB, release/shared/video storage, версия и uptime. Возвращает 503 при деградации обязательных зависимостей.
GET/versionpublicТекущая версия API/desktop release.
GET/client/releases/latestpublicLatest manifest по platform/channel.
GET/client/releasespublicСписок доступных versioned manifests для локального переключателя администратора.
GET/client/releases/latest/downloadpublicПостоянная ссылка на последнюю сборку.
GET/client/releases/{version}/manifestpublicManifest конкретной версии.
GET/client/releases/{version}/downloadpublicАрхив конкретной версии.
GET/client/bootstrap/windows/downloadpublicBootstrap installer Windows.

Авторизация и аккаунты

МетодПутьДоступНазначение
POST/auth/loginpublicПроверка пароля, создание session token, запись версии клиента.
POST/auth/logoutuserОтзыв текущей сессии.
GET/auth/meuserТекущий аккаунт и роль.
GET/auth/preferencesuserСерверные UI preferences аккаунта.
PUT/auth/preferencesuserПолная замена UI preferences.
PUT/auth/timezoneuserIANA-часовой пояс для вычисления локальных дедлайнов.
GET/admin/accountsadminСписок аккаунтов.
POST/admin/accountsadminСоздание аккаунта.
PATCH/admin/accounts/{login}adminРоль, display name, активность.
POST/admin/accounts/{login}/reset-passwordadminНовый PBKDF2 password hash.
GET/admin/system/statusadminПодробная диагностика конфигурации, хранилищ и record counts без значений секретов.
POST/admin/workers/catch-upadminБезопасный повтор materialization и обработки ожидающих заданий.
GET/admin/workers/healthadminСостояние deadline, review lease и project maintenance workers без токенов и секретов.
GET/admin/timing-analysis/outside-videoadminСписок проектов с субтитрами за пределами исходного видео.

Проекты, типы и project assets

МетодПутьДоступНазначение
GET/projectsuserВсе проекты словарём ID → project.
POST/projects/list-diffuserВерсии известных карточек → изменённые проекты, новые версии и deleted_ids. Учитывает drafts, дедлайны и права пользователя; первый запрос без версий возвращает полный список.
GET/projects/{project_id}userОдин проект.
GET/projects/{project_id}/editor-state/{kind}userАктуальная серверная ревизия проекта нарезки или оформления.
PUT/projects/{project_id}/editor-state/{kind}userMerge изменённых субтитров и связанных полей с optimistic revision.
POST/projects/{project_id}/rooms/{kind}/{action}userВременное присутствие и отдельная постоянная история сообщений для нарезки и оформы. Опрос принимает курсор истории.
PUT/projects/{project_id}userUpsert проекта с безопасным merge персонального CapCut binding.
PUT/projects/{project_id}/performersuser/adminДобавить или убрать себя из исполнителей проекта; администратор может изменить любого активного пользователя.
PUT/projects/{project_id}/priority-pinuser/adminОбщий закреп для всех участников. JSON: {"pinned": true/false}; старые снимки проектов не меняют закреп.
DELETE/projects/{project_id}adminУдаление проекта и связанных серверных сущностей по правилам endpoint.
POST/projects/{old_id}/re-id/{new_id}userИдемпотентная смена ID проекта с переносом связанных серверных ссылок.
POST/projects/bulk-upsertuser/adminМассовый merge доступен user; опасный replace_all=true — только admin.
GET/projects/{project_id}/workuserРевизия распределения, занятые/свободные интервалы, дедлайн и статусы.
GET/work/usersuserБезопасный список активных исполнителей для выбора получателя; служебные поля не возвращаются.
POST/projects/{project_id}/work/previewuserНормализация интервала и предварительная проверка конфликта.
POST/projects/{project_id}/work/takeuserВзять свободный интервал или весь проект с optimistic revision.
POST/projects/{project_id}/work/assignadminНазначить исполнителя на нормализованный интервал.
POST/projects/{project_id}/work/assign-batchadminАтомарно зарезервировать несколько интервалов разным исполнителям.
POST/projects/{project_id}/work/offersuserСоздать предложение передачи работы.
POST/projects/{project_id}/work/offers/{offer_id}/responduserПринять или отклонить предложение с CAS-проверкой; границы и необязательный дедлайн задаются в самом ответе.
POST/projects/{project_id}/work/segments/{segment_id}/actionuser/adminСтатус сегмента, проверка, перенос, resize и дедлайн по матрице ролей.
POST/projects/{project_id}/publication-times/{source}/syncuserСерверная синхронизация точного UTC-времени YouTube/VK или legacy date-only fallback.
GET/projects/{project_id}/work/segments/{segment_id}/capcutassignee/reviewer/adminПолучить фрагмент канонического GridFS draft, кусочные текстовые файлы, границы и ревизии для локальной работы или проверки.
PUT/projects/{project_id}/work/segments/{segment_id}/capcutassignee/reviewer/adminЗагрузить интервальный CapCut merge и кусочные файлы; каноническая версия обновляется через revision/CAS, а конфликтующие границы отмечаются для администратора.
GET/projects/{project_id}/timing-analysisuserРезультат фонового анализа английской дорожки.
GET/decoration/cataloguserОбщие стили, плоские наборы и история использования; порядок отображения хранится локально.
PUT/decoration/cataloguserСохранение изменений относительно base с атомарным объединением; конфликт одного поля возвращает 409.
GET/projects/{id}/style-example/metauserRevision и метаданные style example.
PUT/projects/{id}/style-exampleuserЗагрузка переносимого style example.
GET/projects/{id}/style-exampleuserСкачивание style example.
GET/projects/{id}/capcut-draft/metauserRevision серверного CapCut draft.
PUT/projects/{id}/capcut-draftuserЗагрузка подготовленного draft ZIP/JSON с optimistic revision.
GET/projects/{id}/capcut-draftuserСкачивание серверного draft.
POST/projects/{id}/capcut-decoration/prepareuserПроверка нового локального драфта и слияние изменённых полей с оформой без записи нативной базы; конфликт возвращает 409.
POST/projects/{id}/capcut-decoration/erroruserПодробная ошибка клиента и исходник в отдельном архиве ошибок CapCut.
GET/content-type-rulesuserKeyword → type rules.
POST/content-type-rulesuserUpsert одного правила при создании/классификации проекта.
PUT/content-type-rulesadminПолная атомарная замена набора правил.
GET/shared-assets/draft-marker/{asset}userРазрешённые общие marker assets.
GET/shared-assets/fonts/manifestuserManifest шрифтов SKZ District для фоновой установки клиентом.
GET/shared-assets/fonts/{asset}userСкачивание разрешённого файла шрифта из manifest.

Дедлайн назначения необязателен. Обычный пользователь резервирует свободную работу только себе; администратор может одним действием зарезервировать несколько непересекающихся кусков разным исполнителям. Проверка и суточное взятие исправлений сохраняют версии отдельно, а уведомления о свободном остатке существуют только внутри приложения и исчезают, когда остаток занят.

Уведомления

МетодПутьДоступНазначение
GET/notificationsuserЛичные in-app уведомления с контекстом проекта, предложения и сегмента для действий по свежей ревизии.
POST/notifications/readuserИдемпотентно отметить выбранные уведомления прочитанными.

Перевод и метрики

МетодПутьДоступНазначение
GET/translate/modelsadminРазрешённые модели и цены.
POST/translate/textadminСинхронный line-preserving перевод.
POST/translate/jobsadminСоздание resumable translation job с deduplication.
GET/translate/jobs/{job_id}adminСтатус job.
GET/translate/jobs/{job_id}/resultadminРезультат, summaries и token usage.
POST/metrics/translation/{project_id}userАгрегированная стоимость и usage перевода.
POST/metrics/draft-check/{project_id}userМетрика проверки draft.

Синхронизация файлов

МетодПутьДоступНазначение
POST/sync/manifest/diffuserСравнение manifest и server cursor.
POST/sync/files/move-prefixuserБезопасная миграция legacy prefix.
GET/sync/files/metauserSHA, size, revision, policy одного файла.
GET/sync/files/downloaduserСкачивание одного blob.
POST/sync/batches/downloaduserZIP до 100 файлов с внутренним manifest.
POST/sync/batches/uploaduserПакетная загрузка с проверками policy/revision.
POST/sync/uploads/startuserНачало chunked upload.
PUT/sync/uploads/{id}/chunks/{index}userИдемпотентная загрузка chunk.
POST/sync/uploads/{id}/completeuserСборка, SHA-256 verification, backup и commit.
GET/admin/sync/backupsadminСписок откатов.
GET/admin/sync/backups/{id}adminСравнение откатной и текущей версии.
POST/admin/sync/backups/{id}/rollbackadminВосстановление backup.
POST/admin/sync/backups/{id}/discardadminРевизионное удаление ненужного отката.

Видео, логи и YouTube jobs

МетодПутьДоступНазначение
POST/video/prepareuserПолучение server-assisted URL/метаданных.
POST/video/downloaduserAPI fallback для скачивания серверной H.264/AAC-копии.
POST/video/uploaduserЗагрузка локального видео проекта на сервер.
POST/video/uploads/startuserНачало порционной загрузки большого локального видео.
PUT/video/uploads/{upload_id}/chunks/{chunk_index}userПередача одной проверяемой части видео.
POST/video/uploads/{upload_id}/completeuserПроверка SHA-256, атомарная сборка и публикация видео.
GET/video/projectuserНаличие, resolution/codec и подписанная download link.
GET/admin/videosadminВсе серверные видео и disk usage.
POST/admin/videos/deleteadminУдаление выбранных/старых видео.
GET/admin/projects/{id}/server-filesadminSync, CapCut и video files одного проекта.
POST/admin/projects/{id}/server-files/deleteadminУдаление одного server file с revision guard.
GET/admin/logsadminServer sync/job logs.
GET/admin/capcut-import-errorsadminОшибки импорта и неподдерживаемые визуальные параметры с подробной диагностикой.
GET/admin/capcut-import-errors/{error_id}/originaladminСохранённый исходник для разбора ошибки.
POST/admin/logs/clearadminОчистка по типу, теме и возрасту.
POST/logs/app/uploaduserПакет клиентских log entries с deduplication.
GET/admin/app-logsadminКлиентские логи по пользователю/run.
POST/jobs/youtube-sync/try-lockuserРаспределённый lease для единственного sync worker.
POST/jobs/youtube-sync/finishuserУспешное завершение run с details.
POST/jobs/youtube-sync/failuserОшибка run и release lease.
GET/admin/youtube-sync/runsadminИстория запусков.
POST/admin/youtube-sync/runs/clearadminОчистка старой истории.
GET/admin/youtube-sync/pendingadminРолики без определённого типа.
POST/admin/youtube-sync/pending/{id}/resolveadminСоздать проект с выбранным типом.
POST/admin/youtube-sync/pending/{id}/dismissadminИсключить pending item.

YouTube и серверные видео

Периодический sync использует distributed lock, чтобы несколько desktop-клиентов не создавали дубли. Новые entries классифицируются по rules. Неопределённые попадают в pending queue и требуют выбора типа.

  • Локальная загрузка сначала использует bundled yt-dlp; сервер — fallback.
  • Сервер выбирает MP4 H.264 + M4A AAC, совместимые с Windows и CapCut; AV1 намеренно не является приоритетом.
  • ffprobe сохраняет width, height, resolution, codec и duration. «Неизвестно» означает отсутствие ffprobe или невозможность прочитать stream, а не неизвестное качество YouTube.
  • Превью называется thumbnail_<project_id>.png, чтобы старый файл с похожим заголовком не приклеился к новому ролику.
  • Media download поддерживает HTTP Range и выдаётся по HMAC-ссылке с expiry.

Перевод и субтитры

  1. Получить ручной SRT. Auto captions используются только по явному выбору.
  2. Извлечь непустые блоки в original_text.
  3. Перевести line-preserving job: число строк на выходе обязано совпасть.
  4. Записать translated_text, running summary и usage.
  5. Создать translated_with_eng для ручной проверки.
  6. Нарезать new_timestamps и собрать final SRT.
  7. Импортировать в CapCut, расставить дорожки, проверить оформление.

Сервер принимает не более 5 000 строк и 2 000 000 символов за запрос. Пустая модельная строка для непустого источника, расхождение числа строк и нулевое число OpenAI requests считаются ошибкой. API key хранится только на сервере.

Разрешённые модели: gpt-5.4-mini, gpt-5.6-luna, gpt-5.6-terra, gpt-5.6-sol. Фактический список всегда проверяется через GET /translate/models.

CapCut drafts и оформление

Сервер хранит переносимую копию draft, а не абсолютные локальные пути. Перед загрузкой Python bridge нормализует структуру и прикладывает необходимые assets. Метаданные revision позволяют выбрать направление копирования без случайной перезаписи.

  • Локальное имя CapCut draft персонально для аккаунта.
  • Первичное создание локальной основы не загружает её автоматически; upload — отдельное явное действие.
  • Фиолетовая кнопка загружает текущий draft на сервер после подготовки.
  • Статус синхронизации использует визуальный хэш субтитров: текст, тайминги, положение, видимость, оформление и анимации учитываются, а видео, аудиоанализ, версия CapCut и служебные метаданные открытия игнорируются.
  • Статус отдельно различает проекты только на сервере и реальные расхождения между существующими локальной и серверной копиями.
  • Style example — короткий переносимый фрагмент оформления, отдельный от полного draft.
  • При совпадении первой текстовой дорожки с new_timestamps удаляется только эта служебная дорожка; остальные не затрагиваются.
  • Изменение скобок обновляет root, backup, template и актуальные timeline copies согласованно.

Сервер, Docker и релизы

Production services

СервисНазначениеRestart policy
neuro-subs-apiFastAPI на loopback origin.unless-stopped
neuro-subs-server-mongoMongoDB 4.4 для CPU без AVX.unless-stopped
neuro-subs-pot-providerPO token provider для yt-dlp.unless-stopped
neuro-subs-mediaПодписанная video delivery с Range.unless-stopped
CaddyПрямой публичный HTTPS reverse proxy.systemd auto-restart

Проверка после deploy

# На сервере
curl -fsS http://127.0.0.1:4183/neuro-subs-api/health/ready
docker compose -f docker-compose.server.yml ps
systemctl is-active caddy

# Снаружи
curl -fsS https://api.xn--90a5ag.space/neuro-subs-api/health/ready

Релиз Windows строится, публикует versioned ZIP, latest manifest и bootstrap archive. Клиент сверяет SHA-256 перед атомарной заменой. Версия 2.9.4 допускает удаление CapCut-драфта с копией общей метки только после проверки её байтов; чужие локальные вложения по-прежнему защищены.

Диагностика и восстановление

Новые технические ручки

  • GET /health/live — liveness процесса без внешних зависимостей. Если не отвечает, проблема в контейнере, процессе или HTTP-маршруте.
  • GET /health/ready — безопасная публичная readiness: версия, uptime, MongoDB latency и доступность storage. Секреты и connection strings не возвращаются.
  • GET /admin/system/status — расширенный admin status: readiness, флаги конфигурации, каталоги и приблизительные counts ключевых коллекций. Значения токенов/ключей не возвращаются.
СимптомПроверкаВывод
API и media одновременно недоступныЛокальный readiness на сервереЕсли ready — проверить Caddy, проброс 80/443 и внешний канал; если нет — API/Mongo/storage.
Один домен лежит, второй работаетDNS-запись и конфигурация CaddyOrigin жив; проблема конкретного hostname или локального сервиса.
SSH работает, HTTP нетdocker compose ps, локальный curlКонтейнер не поднят или порт не слушает.
Readiness 503, database=falseMongo container и его logsAPI процесс жив, MongoDB недоступна.
Readiness 503, video_storage=falseMount, permissions, free diskРабочее video storage недоступно для записи.
API работает, вход не работает/health, затем account active/session logsПубличный маршрут исправен; проблема auth/account/Mongo data.
Синк падает на No such fileКлиентский app log и local manifest rescanФайл исчез между scan и hash; повторный sync не должен удалять серверную копию.
Неправильные сабы/previewProject ID, canonical server prefix и thumbnail filenameИскать legacy title-based collision или неверную миграцию.
Разрешение неизвестноffprobe и video metadataФайл есть, но stream metadata не извлечена.

Порядок при аварии

  1. Проверить публичный readiness URL.
  2. Если он недоступен — SSH/Tailscale/LAN и локальный readiness origin.
  3. Если origin ready — проверить Caddy, проброс портов 80/443 и DNS сервера.
  4. Если origin degraded — смотреть конкретный failed check; не перезапускать всё вслепую.
  5. После восстановления проверить login, project list, manifest diff и media health.
  6. Только затем запускать sync или deploy.

Безопасность и целостность

  • Пароли: PBKDF2-SHA256 с индивидуальной случайной солью и 210 000 итераций.
  • Session tokens хранятся в виде SHA-256 hash; исходный token показывается только при создании.
  • Admin actions проверяют роль на сервере, а не только скрываются в UI.
  • Пути нормализуются и не могут выйти через .. за разрешённый root.
  • Uploads ограничены по размеру, chunk index, SHA-256 и expected revision.
  • Media links подписаны HMAC, имеют expiry и не кэшируются публично.
  • API не возвращает Mongo URI, OpenAI key, media signing secret или Telegram token.
  • Публичная диагностика содержит только безопасные boolean/latency/size данные.
Swagger описывает API, но не является заменой авторизации. Не вставляйте production token в публичные скриншоты и не публикуйте .env.

Частые вопросы

Где канонически лежат файлы проекта?

На сервере — projects/<project_id>/. Локально — человекочитаемая папка типа и slug. Mapping связывает их; название не является идентификатором.

Почему после смены типа нельзя просто переместить серверную папку?

Серверный namespace уже привязан к ID и не зависит от типа. Меняется локальный mapping. Перемещение title-based legacy prefix требуется только при миграции старой схемы.

Почему видео не синхронизируется вместе с SRT/TXT?

Видео тяжёлое и имеет другой lifecycle. Оно хранится в отдельном video service, скачивается/удаляется явными действиями и не участвует в manifest diff.

Что является источником списка типов?

Уникальные content_type из content_type_rules плюс существующие проекты. Отдельная legacy-коллекция типов больше не является источником записи.

Что делать, если оба домена недоступны?

Проверить origin readiness через SSH. Ready origin означает проблему Caddy, проброса 80/443 или внешнего канала; degraded JSON сразу показывает MongoDB или storage.

Можно ли безопасно повторить sync после обрыва?

Да. Batch и chunked flows проверяют hashes/revisions; upload completion идемпотентен в рамках upload ID. При конфликте нужна явная развязка.

Где смотреть точный JSON конкретной ручки?

В Swagger UI или OpenAPI JSON. Эта страница объясняет семантику и эксплуатационные правила.

История ключевых релизов

ВерсияОсновные изменения
2.17.1Жест масштаба сохраняет существующие ключи вращения и прозрачности.
2.17.0Кнопка общего закрепа у проекта. Ключевые моменты вращения, прозрачности и кривые перехода в предпросмотре, видео и CapCut.
2.16.1Ускорены частые правки оформы с сохранением всех записей восстановления; Undo/Redo сохраняет свежие поля коллег. Объединены уведомления и повторные чтения, защищена замена видео с резервными копиями. Оформа открывается из шапки, экспорт показывает локальную цель CapCut.
2.16.067 редактируемых горячих клавиш, сочетания с колесом, пресеты «Оформа»/«CapCut», живые модификаторы и английские физические клавиши. J/K/L, скорость и громкость просмотра.
2.15.1Нативный журнал восстановления и безопасное закрытие, ограниченный DOM больших очередей, целостность синхронизации и переводов, upload/ZIP/BSON limits, новый observed-epoch wire и надёжная публикация обновлений. Данные и резервные копии сохранены; maintenance остаётся observe.
2.15.0Анимации и экспорт оформы, полноэкранный режим и восстановление правок; ленивое открытие редакторов, меньше фоновых запросов, неблокирующие загрузки и защита записей по поколению проекта.
2.14.0Импорт CapCut в общий проект оформы, стили по дорожкам и примерам, просмотр выбранных нативных анимаций и слияние изменённых полей при обновлении проекта с резервными копиями и архивом ошибок.
2.13.0Ключевые кадры масштаба с экспортом в CapCut, точность покадрового просмотра и проверка идентичности видео при получении автоматических таймкодов.
2.12.2Локальный кеш списка проектов, получение изменённых карточек и удалений, ограничение повторных обновлений при фокусе, пакетная проверка актуальности синхронизируемых файлов и ускорение общих редакторов.
2.12.1Продолжение оборванных загрузок, использование готового серверного видео, кеш проверок неизменившихся файлов и индексированные пакетные запросы хранилища.
2.12.0Серверная история чата нарезки и оформы, постоянные цвета участников и устойчивое первое параллельное сохранение.
2.11.7Общий состав стилей проекта оформы и восстановление пресетов из назначений клавиатуры.
2.11.6Совместные бегунки и выбор сабов, уведомления чата, синхронизация изменений по полям и защита сохранения оформы.
2.11.5Основной стиль для рабочего «а»; выгрузка таймкодов только после полной нарезки без расхождений; исправления очереди анализа новых видео.
2.11.4Исправлен перенос назначенных стилей и повторный экспорт оформы в CapCut; добавлены подсветка привязки к бегунку и переключение направления прокрутки.
2.11.3Исправлен цикл обновлений при изменении масштаба видеоплеера в редакторе оформы.
2.11.2Исправлены присутствие и отправка сообщений в чате проекта; опрос комнаты передаёт только версию редактора.
2.11.1Исправлены список реплик, выбор субтитра и отображение ключевых моментов на узких сабах.
2.11.0Параллельная синхронизация нарезки и оформы, присутствие пользователей и временный чат проекта с обновлением каждые три секунды. Автоматическая установка общего набора шрифтов SKZ District.
2.12.0Persistent timing and decoration chats, fixed collaborator colors, and safe concurrent first saves.
2.11.7Shared decoration project style membership and preset recovery from keyboard assignments.
2.11.6Collaborative playheads and selections, chat notifications, field-level delta sync, and resilient decoration saves.
2.11.5Main style for working timing captions; timestamp export only after a complete, error-free cut; fixes for the new-video analysis queue.
2.11.4Fixed assigned-style transfer and repeated CapCut decoration export; added playhead snap highlighting and immediate scroll-axis switching.
2.11.3Fixed an update loop while zooming the decoration editor player.
2.11.2Fixed project chat presence and message delivery; room polling now returns only the editor revision.
2.11.1Fixed the cue list, subtitle selection and keyframe markers on narrow clips.
2.11.0Collaborative timing and decoration sync, live presence and ephemeral project chat with three-second refresh. Automatic installation of the shared SKZ District font set.
2.10.8Оформление выделенных фрагментов текста и групповая правка сабов; ключевые моменты расположения в нарезке и оформлении с экспортом CapCut. Обычный замок английской дорожки, редактирование скрытых сабов, исправленные межстрочные интервалы и один шаг отмены для ползунков.
2.10.7Исправленная высота букв в предпросмотре и подстановка отсутствующих символов, редактируемые английские сабы, возврат к субтитру из стилей, приоритет клика по сабу и заметные края обрезки. Расширенные логи ошибок редактора.
2.10.6Повторное автосохранение при блокировке Windows, исправленные дорожки и настройки прокрутки, скрытая английская дорожка, направляющие в нарезке и редактирование стилей через пример.
2.10.5Предпросмотр стилей с фоном, перетаскивание клавиш, независимые трансформации примера в нарезке и автопрокрутка таймлайна при перетаскивании бегунка к краю.
2.10.4Stable от 17 сентября 2026: первый кадр без клика, восстановление позиции и масштаба для пользователя и проекта без выделения субтитра; однострочная высота −1010.
2.10.3Stable от 17 сентября 2026: допустимые размеры таймлайна, управление внизу плеера, исправленные переносы и автоматическая позиция основной речи по числу строк.
2.10.2Stable от 17 сентября 2026: синхронизация оставляет неизвестные локальные файлы на месте; автоматическое восстановление из мусорки убрано.
2.10.1Stable от 17 сентября 2026: защита назначений от фоновой очистки, восстановление из мусорки, общий инспектор оформления в нарезке и исправленная клавиатура стилей.
2.10.0Stable от 17 сентября 2026: редактор оформления, проектные наборы стилей и переход из выгрузки таймкодов.
2.9.4Stable от 14 сентября 2026: известная копия общей метки не мешает безопасному удалению локального CapCut-драфта после переноса нарезки.
2.9.3Stable от 14 сентября 2026: статус «В процессе» начинается с нарезки во встроенном редакторе или выгрузки таймкодов; при загрузке неизвестного размера показывается движение без ложного процента.
2.9.2Stable от 9 сентября 2026: более частое получение прогресса фоновых операций и плавное заполнение кнопок без крупных визуальных скачков.
2.9.1Stable от 9 сентября 2026: фактический прогресс фоновых действий и автоматического скачивания видео перед открытием проекта нарезки, подробности проектов при синхронизации CapCut.
2.9.0Stable от 8 сентября 2026: согласованный визуальный анализ обычных, цветных, плавающих и смешанных подписей, региональные поправки, возобновляемая серверная обработка и прямой HTTPS через Caddy без legacy fallback.
2.8.2Stable от 1 сентября 2026: перенос внешних медиа и сборных клипов в серверных драфтах, исключение повторно используемых превью и концовок, правильные таймкоды английской дорожки после final-интеграции.
2.8.1Stable от 1 сентября 2026: соседние кадры, двухкадровая расстановка и сворачиваемые атрибуты в редакторе нарезки; надёжная проверка превью и защищённое от повторного запуска удаление локального видео.
2.8.0Stable от 31 августа 2026: фоновый анализ кадров готовит английскую направляющую проекта нарезки, не меняя исходный SRT и длинный саб; также исправлены повторная final-интеграция и приоритет свежих локальных SRT при синхронизации.
2.7.4Stable от 30 августа 2026: открытие и закрытие неизменённого CapCut-проекта больше не создаёт ложную рассинхронизацию после служебного расширения схемы и привязки исходных сабов к кадровой сетке.
2.7.3Stable от 29 августа 2026: честный единый прогресс загрузки видео, развёрнутое окно нарезки, процент готовности встроенной нарезки, возврат прямой покадровой навигации и корректная сортировка проекта после интеграции субтитров.
2.7.2Stable от 29 августа 2026: все решения конфликтов CapCut до пакетной передачи, нарезка для всех аккаунтов со скрытой кнопкой, сохранение личной конфигурации редактора, быстрый кэш соседних кадров и стыков.
2.7.1Stable от 28 августа 2026: готовность локального видео и таймкодов без ожидания сервера, сохраняемая фоновая очередь, кеш параметров видео и приоритет готового кадра. Также включает исправления beta.1–beta.6; в этой версии доступ к нарезке был у alkis.
2.7.0Stable-релиз от 27 августа 2026 года: независимые проекты нарезки для всех полных проектов alkis, повторная выгрузка рабочей дорожки и создание CapCut-проекта при интеграции финальных сабов. Для остальных пользователей сохранён прежний workflow.
2.6.0Stable-релиз от 26 августа 2026 года: редактор нарезки таймкодов в менеджере, отдельные sidecar-данные и закрытый канал технических сборок.
2.5.0Stable-релиз от 24 августа 2026 года: полноценное распределение по кускам, необязательные дедлайны, версионированная проверка, кусочная синхронизация и подготовка CapCut-проекта к публикации.
2.4.7Stable-релиз от 23 августа 2026 года: постоянный слепок CapCut-проектов, быстрый поиск рассинхрона, компактный прогресс синхронизации и надёжная серверная доставка видео.
2.4.6Stable-релиз от 23 августа 2026 года: безопасный импорт SRT, надёжные локальная и серверная загрузки видео, понятные недоступные действия и приоритет локального имени CapCut-проекта.
2.4.5Stable-релиз от 20 августа 2026 года: содержательные CapCut-действия, свежие метки установленных drafts, ручная синхронизация всех локальных CapCut-проектов и подсветка workflow-стадий.
2.4.4Stable-релиз от 20 августа 2026 года: вход по сохранённой сессии обновляет активность, даты аккаунтов показываются без секунд, а журналы можно безопасно использовать для восстановления пропущенных входов.
2.4.3Stable-релиз от 19 августа 2026 года: локальные collision-safe папки синхронизируются с каноническими серверными именами без отказов и карантина.
2.4.2Stable-релиз от 19 августа 2026 года: неизменяемые локальные папки, скрытые ID-маркеры проектов и устранение ложного рассинхрона CapCut после простого открытия проекта.
2.4.1Stable-релиз от 18 августа 2026 года: совместимость старых CapCut drafts с 9.3, восстановление rich-text, визуальное сравнение субтитров, точные статусы проектов и мгновенное редактирование таблицы.
2.4.0Stable-релиз от 14 августа 2026 года: содержательное сравнение CapCut draft, явный статус синхронизации и исправление взаимной блокировки updater.
2.3.8Динамический выбор ручных субтитров YouTube, пакетные draft-операции, свежие метки CapCut и нормализация перевода.
2.3.7Stable-релиз от 8 августа 2026 года: точные размеры и высота CapCut-субтитров, безопасная инспекция откатов и исправленное восстановление файлов.
2.3.6Stable-релиз от 7 августа 2026 года: исправлены collision-safe имена проектных файлов, дубликаты manifest и полное удаление дублирующих указателей.
2.3.5Stable-релиз от 6 августа 2026 года: исправлен server-side sync точных дат YouTube, улучшены кнопки ЛК, ширина таблицы и файловая синхронизация.
2.3.4Stable-релиз от 3 августа 2026 года: устойчивое открытие неполных проектов и отключение автообновления при ручном переключении на старую версию.
2.3.3Stable-релиз от 2 августа 2026 года: переработанный интерфейс исполнителей и частей, приглашения на конкретные интервалы и исправленная передача частей для администратора.
2.3.2Stable-релиз от 2 августа 2026 года: безопасный режим обслуживания observe, кэшированная readiness-диагностика, guard административного catch-up и исправление rollback safety updater.
2.3.1Stable-релиз от 1 августа 2026 года: исправление updater-helper, таблица без переполнения, цельные пользовательские темы и интерфейс исполнителей и частей.
2.3.0Stable-релиз от 31 июля 2026 года: ревизионная работа по сегментам, точные UTC-времена публикации, уведомления, интервальный CapCut, локальные темы и безопасное переключение версий с watchdog-откатом.
2.2.8Ручной импорт Shorts с локальным видео и превью, исключение Shorts из автосинка и валидная локальная основа CapCut с техническим сабом а без исходного SRT.
2.2.7Устойчивый sync, server video controls, bilingual technical documentation, readiness и admin diagnostics.
2.2.xProject-ID storage, CapCut portability, server files, YouTube pending workflow, video metadata.
2.1.xReact/TypeScript desktop UI, account preferences, multi-user bindings.
Sub Video Manager 1.0.74Стабилизация legacy desktop workflow до архитектурного перехода 2.x.
Sub Video Manager 2.17.1 · Stable client · Контракт API: OpenAPI
Ничего не найдено.