ingest.json и таймлайны. Ingest сюда
не тянем: это отдельный этап, и делать его одновременно с раскладкой — верный способ
не доделать ни то, ни другое.Одна сцена — один смысловой кусок дня, а не одна кассета. Внутри сцены — всё, что к ней относится: видео всех камер, петлички, сайдкары. Никаких промежуточных уровней: имена файлов и так уникальны, а лишняя глубина мешает и монтажёру, и rclone, и ингесту.
CAM1-FX3/bright.cube · dark.cube · normal.cube — шоу-луты проектаСтруктура решается по содержанию, а содержание известно только после анализа. Предлагать слияния по названиям папок — прямой путь к ошибке: из трёх «очевидных» склеек по именам две оказались неверными. Поэтому цикл всегда один и тот же, и он повторяется, пока не будет «принято».
Хвосты пофайлово, локальный анализ картинки и текста, хронология по creation_time,
дыры в звуке. Ничего не двигается.
Предлагаемая структура собирается с диска в одну страницу: кадры, звук, время, из каких старых папок берётся каждая сцена.
«Эти две — одна сцена», «это назвать иначе», «это вообще вне ingest». Правки идут в карту, а не в файловую систему.
Без «да» ни один файл не двигается. Пока не принято — возврат на шаг 2, карта пересобирается заново.
Перемещения одним прогоном с журналом и инвариантом «было = стало + архив». Сводка «было → стало» показывается после.
Карта пересобирается по факту с диска — она же становится документом проекта. Дальше — этап 3, ingest.
| Гейт | Что показывается до действия |
|---|---|
| Хвосты | список уникального — до того, как что-либо уедет в архив |
| Анализ | что из готовых JSON выбрасываем как непроверенное |
| Структура | карта сцен целиком — без «да» ни один файл не двигается |
| Раскладка | сводка «было → стало» с инвариантом по файлам и байтам |
Карта — это единственный способ принять решение осмысленно: по именам папок структуру не проверишь. Каждая сцена — карточка, где рядом стоят картинка, звук, время и происхождение.
01_Drive_To_Abramovo_Anya_Story ·
02_Lost_On_The_Way_To_Abramovo · 03_Village_Recognition_And_Meeting_Yulia| Блок карточки | Зачем он там |
|---|---|
| Кадры из клипов | видно содержимое, а не название папки. Кадры тянутся из самих клипов, по нескольку на сцену |
| Имя папки на диске | ровно то, что покажет Finder — моноширинным, кликом копируется |
| Человеческое название + описание | о чём сцена: кто говорит, что происходит, где начинается и где кончается разговор |
Время tc_in–tc_out | по нему видно стыки: разрыв в две минуты между сценами — почти всегда один кусок дня |
| Счётчики: клипы · минуты · петлички · вес | сцена без петлички или с одной вместо шести — сразу заметна |
| «Собирается из N старых папок» | провенанс: видно, что именно склеивается, и легко возразить |
| Группировка по дням | у многодневной смены хронология дня важнее сквозной нумерации |
| KPI сверху | «38 → 12 папок, 151 клип, 7.3 ч, 75 петличек, 492 ГБ» — масштаб изменения одной строкой |
Готовая карта остаётся в проекте как 00_Setup/05_Review/{CODE}_structure_map.html,
а обоснования слияний — рядом, в {CODE}_restructure_proposal.html.
| LUT | Под какой кадр | Побочный эффект |
|---|---|---|
normal.cube | ровный свет — рабочая середина, выигрывает почти везде | — |
bright.cube | пересвет: окно, улица, солнце в кадре | на ровном материале топит тени |
dark.cube | недосвет: комната без окон, вечер, тень | вымывает цвет |
Правило выбора: самый сочный из тех, что не завалил тени. Луты названы по тому, каким снят кадр, а не по результату — иначе на выборе постоянно путаешься.
Звук раскладывается вместе с картинкой и в тот же момент. Если отложить — петличка окажется не в той сцене, а найдётся это уже на монтаже.
TX01, TX02).__S{NN} показывает,
из какой нумерации пришла копия. Байт-идентичные копии потом схлопываются дедупом.creation_time только для порядка. Точный синхрон дорожек — отдельная задача
следующего этапа, по речи: 3.2 Multicam Word-Sync.
На спринте YTCH часы FX3 врали на 57 минут, и по-разному в каждый день.На YTCH12 в такой оболочке нашлись три петлички, которых не было больше нигде. На YTCH10 — тоже три, и одна закрывала реальную дыру в звуке: петличка обрывалась на 14:13 и продолжалась с 14:21, а в оболочке лежал ровно этот кусок — полторы минуты живого звука дороги, где камера не писала. Плюс 15 транскриптов второй камеры, единственная копия которых была в наследии оффлоада.
Сверка: имя без сценового суффикса __S{NN} + размер, при совпадении —
SHA-256. Уникальное разносим по сценам по времени записи, дубли — в архив
99_Pipeline/_dupes_scene_merge_YYYYMMDD/, не в корзину.
project.json
блок «лучшие цитаты» оказался вымышленным целиком: 7 из 7, ни одной строки нет
в транскрипте. Самый длинный дословный кусок — 17–40 % цитаты.
Поэтому каждая цитата ищется дословно в Claude4_assembly.json
после нормализации (регистр, ё, пунктуация). Метрика близости — длина самого длинного
непрерывного совпадения, а не сумма совпавших кусков: на стоге в 50 тысяч слов сумма даёт
≈1.0 для любого набора русских слов и ничего не различает.
| Файл | Что проверять | Что находится на практике |
|---|---|---|
project.json | каждую строку best_quotes |
выдуманы целиком — блок удалять |
quotes.json | anchored:true против реального текста |
~4 % помечены привязанными, но не подтверждаются |
scenes.json | привязку «цитата → клип» по тексту этого клипа | сцена верна почти всегда, клип врёт в ~10 %; иногда в поле клипа лежит имя сцены |
Что не подтвердилось — выбрасываем, а не «правим по смыслу». Исходное
значение стоит сохранить рядом (clip_claimed, best_quotes_removed):
это провенанс, по нему видно, чему нельзя доверять в следующий раз.
Ключ слияния — непрерывный кусок дня. Практический критерий: построить
хронологию сцен по creation_time и посмотреть разрывы между соседними клипами.
Разрыв 0–2 минуты — почти всегда один кусок; 10–20 минут — надо смотреть содержание;
час и больше — разные блоки.
11_Photos_Handover_And_Son_Story — по имени «про сына и фотографии», по факту
финал интервью: «спасибо большое, очень хорошо рассказали». Идёт встык к предыдущей папке.35_Drive_Scrolling_Chats — по имени перегон, по факту тот же стол,
что и фотоальбом, телефон в руках, разрыв 2 минуты.03_Village_Recognition_And_Meeting_Yulia — выглядит как отдельная сцена приезда,
а по часам это хвост той же дороги, разрыв ноль минут.Дыры внутри таймлайна допустимы: в сцене «вечерний итог» и до слияния было 53 минуты пустоты. Но склейка, дающая полтора часа дырки, — повод спросить, а не решать молча.
было = стало + архив — и по числу
файлов, и по байтам. Не сошлось — стоп.
| Правило | Почему |
|---|---|
| Имена файлов не менять | суффиксы __S07 останутся от старой
нумерации — это нормально. Переименование рвёт ссылки в транскриптах, проектах и wordsync.
Ориентир — папка, а не суффикс |
| Коллизия имён с разным содержимым — аварийный стоп | перезапись молча съедает материал |
Медиа только mv, никогда rm |
дубли уезжают в архивную папку |
| Дедуп по имени БЕЗ суффикса | копии одной полосы различаются суффиксом
__S01/__S02. Сравнение только одинаковых имён их не поймает —
нужен второй проход по стему |
| Оставлять ту копию, на которую ссылается ingest | иначе после дедупа в ingest остаются битые пути |
| Журнал каждого перемещения | 00_Setup/logs/restructure_YYYYMMDD.jsonl —
единственный способ разобрать «а куда делся этот файл» через неделю |
Масштаб для ориентира: на YTCH10 это 1690 перемещений первым проходом и ещё 26 вторым (дедуп по стему), архив — 655 файлов, ни один медиафайл не удалён.
Этап закрыт, когда сходятся четыре вещи: дерево на диске, карта,
транскрипты и инвариант. Всё, что связано с ingest.json и таймлайнами, —
уже следующий этап: 3.1 Ingest.
NN_Scene_Name/ в хронологии дня, медиа плоско{CODE}_structure_map.html, пересобранная с диска, а не из планаscene_t0 и wall_offset — пересчитать заново, а не перенести:
у слитой сцены новый ноль0113_frame_align.py — timeline-рендеры петличек
{TX}_{сцена}_timeline.wav пересобрать под новые сцены (у слитой сцены новый ноль,
старые рендеры невалидны): ingest (tx_strips) и секвенции ссылаются
только на них, не на оригиналыscenes, vision_catalog, quotes,
broll_index, Claude4_assemblyvalidate_ingest.py до exit 0 — и только потом Build Ingest{сцена}/CAM1-FX3/clip.MP4 →
камера CAM1-FX3. После уплощения родительская папка — имя сцены, в cam_layers
его нет, и клип молча выпадает из секвенции. Ловится только validate_ingest.py.
Правильное лечение — объявлять камеру в ingest (поле cam из имени файла),
а не выводить из пути: имя папки принадлежит таймлайну, а не камере.
Зеркало проекта на Google Drive — тоже отдельная работа, по диффу и server-side:
3.3 Project Drive Sync. Коротко: двигать rclone moveto
внутри одного remote, папки назначения создавать заранее и последовательно (Drive допускает
одноимённые папки и параллельные moveto их плодят), в конце — rclone dedupe
и сверка множеств путей.
⚠️ YTCH / проекты с frame-align: звук на Drive живёт не как на SSD.
Оригиналы рекордера (*_orig_*.wav) в 01_Source на Drive не заливаются —
server-side уезжают в архив 99_Pipeline/DJI_Audio/{сцена}/; в 01_Source
на Drive и в прокси-комплекте монтажёра — только {TX}_{сцена}_timeline.wav
(+ видео, транскрипты, LUT). Понадобились оригиналы — не тащить их обратно руками:
вернуть в 01_Source локально и перегнать 0113_frame_align.py
(пересборка — единственный путь). Локально на SSD оригиналы остаются в сценах, ничего не переносится.
| Грабля | Как проявляется | Лечение |
|---|---|---|
| Раскладка «молча», без карты | перекладывать приходится дважды, второй раз — поверх сдвинутых артефактов | карта → приёмка → и только потом --apply |
| Дедуп по полному имени | 26 байт-идентичных копий петличек (8.2 ГБ) переживают раскладку | второй проход по имени без __S{NN} |
| Кадры без LUT в карте | S-Log серый, по превью ничего не понять — структуру принимают «на веру» | шоу-LUT под каждый кадр + подпись на картинке |
| Камера из родительской папки | после уплощения все клипы выпадают из секвенции молча | validate_ingest.py перед каждым Build Ingest |
| Переименование сцен в транскрипте | 38 заголовков вместо 12 | слить разделы, а не заменить строки |
| Фоновая транскрибация во время раскладки | инвариант не сходится на несколько файлов | дождаться конца фоновых задач перед --apply |
| Метрика «похожести» цитат | сумма совпавших кусков даёт ≈1.0 на любом тексте | длина самого длинного непрерывного совпадения |
| Часы камеры | расходятся на ~57 минут, по-разному в каждый день | синхрон только по речи, см. 3.2 |
| exFAT | плодит ._*, они уезжают на Drive мусором |
--exclude "._*" |
Артефакты, по которым потом видно, что и почему сделано:
| Файл | Что в нём |
|---|---|
00_Setup/05_Review/{CODE}_structure_map.html | карта сцен с кадрами под шоу-LUT, звуком и временем — собранная с диска по факту |
00_Setup/05_Review/{CODE}_restructure_proposal.html | обоснования слияний и что не сошлось в анализе |
00_Setup/logs/restructure_YYYYMMDD.jsonl | журнал каждого перемещения |
00_Setup/01_Ingest/_pre_merge_backup_YYYYMMDD/ | все артефакты до слияния |
99_Pipeline/_dupes_scene_merge_YYYYMMDD/ | дубли и хвосты — целиком, не в корзине |
Дальше по конвейеру: 2.2 Audio Enhance · 2.3 Pre-Edit Word Precision · 2.4 Source Enrichment → и этап 3 · Ingest.