NN_scene_name, и она соответствует секвенции Premiere 1:1: 01_… → Timeline 01, 02_… → Timeline 02. Затем UXP-ингест сам импортирует клипы, строит секвенцию и подкладывает синхронный DJI-звук.create_folders.py / run_pipeline prepare). Здесь принятая структура превращается в ingest.json и таймлайны; саму раскладку и переименование сцен сюда не тянем — это предыдущий этап. Не путать со структурой/сдачей проекта (playbook).NN_scene → своя секвенция → всё это nest'ится в MASTER.
Исходники бьём по сценам в нумерованные английские папки внутри 01_Source/Video/ (зеркально — Audio/). Имя = NN_scene_name. Клик по имени папки — копирует его.
01_innovation_center. Все клипы одной локации здесь{TX}_{сцена}_timeline.wav — TX-звук «в координатах таймлайна» (рендерит 0113_frame_align.py после word-sync, ↓ Аудио); ingest и секвенции ссылаются только на них; оригиналы рекордера *_orig_*.wav — в архиве 99_Pipeline/DJI_Audio/01_Ingest · 02_Assembly · … + ↓…M01.XML сайдкары (убраны из Source)01_innovation_center, 02_rooftop… Номер папки = номер секвенции.NN_scene_SELECTS (стрингаут всех клипов, отсматриваешь пул) → NN_scene (чистовой кат под музыку).YT{CODE}_MASTER nest'ит нумерованные сцены по порядку → финал..MP4 кладёт сайдкар {clip}M01.XML (метаданные: таймкод, fps, S-Log3, линза). Они засоряют Source и Premiere для линковки не нужны. Убираем их в 00_Setup/Camera_XML/ — Source остаётся чистым (только .MP4), метаданные архивируются.
captureFps vs formatFps → детект слоу-мо (60/120p), CreationDate → кластеризация по сессиям съёмки.Панель YTAI Assembly, вкладка Ingest. Ингест импортирует клипы в бин, создаёт секвенцию {CODE}_1_Ingest и раскладывает V1 (видео) + A1 (камерный звук) + A2 (DJI TX).
UXP находит проект по project.path. У несохранённого («Untitled») проекта пути нет → авто-детект не сработает. Жми ⌘S, сохрани .prproj в папку проекта.
Кнопка «Use Open Project» (или авто-подстановка при загрузке панели) берёт папку открытого проекта — как в footage-режиме. Иначе — «Select Project Folder» вручную. Панель авто-детектит 00_Setup/01_Ingest/{CODE}_ingest.json.
Жми Build Ingest один раз. Если кажется, что «не доехало» — не кликай повторно (появятся дубли-наложения ↓), а удали секвенцию {CODE}_1_Ingest и пересобери в чистую.
Частота кадров — свойство клипа, а не сцены. Слоу-мо-кадр живёт в своей сцене-таймлайне рядом с соседями (важно для реза под музыку) и помечается лейблом/бином — но не выносится на отдельный таймлайн.
captureFps == formatFps) → пока не сконформишь — играют в реальном времени, не замедленно. Камера сама их не замедлила.
ПКМ по клипу → Modify → Interpret Footage → Assume this frame rate: 23.976. 60p → 40%, 120p → 20%, полное качество, без интерполяции. Клип приезжает на таймлайн уже медленным — режешь под бит как обычный.
Ещё медленнее / рампа входа-выхода — Time Remapping (резинка Speed). Nest'ишь один клип только под сложный рамп или экстремальное замедление (тогда Optical Flow).
captureFps vs formatFps в Camera-XML — список кандидатов на conform собирается оттуда, не на глаз.На таймлайне две аудио-дорожки: A1 = камерный звук (встроен в MP4, движется с видео) и A2 = DJI TX (беспроводной мик) — {TX}_{сцена}_timeline.wav, WAV «в координатах таймлайна», по одному на пару сцена × передатчик, не оригиналы рекордера. A2 — основной звук.
creation_time рано или поздно плывёт, у каждого куска — по-своему. Якорь — речь.
0113_frame_align.py) рендерит {TX}_{сцена}_timeline.wav — WAV «в координатах таймлайна»: 48 кГц Float32 mono, сэмплы 1:1, паузы = тишина. Пересборка после любых правок = просто перегнать скрипт.
ingest.json (tx_strips) ссылается только на эти рендеры; пути к оригиналам хранятся в tx_strips_source. Оригиналы рекордера *_orig_*.wav — и локально, и на Drive — уезжают в архив 99_Pipeline/DJI_Audio/: это чистые исходники, монтаж их не трогает. В сценах 01_Source/{сцена}/ остаются только *_timeline.wav — на них ссылаются ingest и секвенции.Каждый клип съёмочного дня получает свой цветокор ещё на ингесте — до монтажа. Скрипт локально скорит LUT-варианты по лицу спикера и строит интерактивную HTML-страницу; выбор глазами → в план; UXP-панель раскладывает поверх каждого клипа клон готового adjustment layer с Lumetri+Look — на все секвенции проекта, идемпотентно. Руками в Premiere — ничего, кроме однократной настройки трёх Look'ов в мастер-шаблоне.
| Файл | Для чего | Действие |
|---|---|---|
01_bright_scene.cube | яркие / пересвеченные сцены | давит света |
02_normal_scene.cube | нормальный свет | мягкая коррекция |
03_dark_scene.cube | тёмные сцены | осветляет |
~/Library/…/Adobe/Common/LUTs/Creative/YTAI/ (отсюда видит дропдаун Look) · {project}/01_Source/00_LUT/ (её читает скоринг) · бандл UXP-панели (копирует в Creative при ингесте) · шаблоны новых проектов. Старые поколения имён (bright/normal/dark, *_scene без префикса) — в архиве; панель мигрирует старые слои сама.python3 scripts/999_extra/lut_face_score.py --project <путь>. Для каждого клипа каждой сцены: 3 сэмпл-кадра × все .cube из 01_Source/00_LUT/; лицо находит Apple Vision (полностью офлайн), счёт = яркость лица + насыщенность − штраф за пережог. Фаворит по среднему — предвыбор для ревью; лицо не нашлось → метрики по центру кадра, клип помечается.
00_Setup/01_Ingest/{CODE}_lut_review.html (+ папка превью-кадров) и {CODE}_lut_plan.json с фаворитами скорингаОткрой {CODE}_lut_review.html (file://, статика). По каждому клипу — кадры в порядке orig | 01_bright | 02_normal | 03_dark, фаворит скоринга обведён пунктиром, под кадрами метрики (Y / сатурация / клиппинг / score). Клик по карточке или чипу = выбор LUT'а для клипа; можно оставить заметку по сцене. Внизу — «Скопировать фидбек» → JSON в буфер → вставить в чат Claude. Claude вносит выбор в {CODE}_lut_plan.json (+ поле approved). План — источник истины для панели; ревью-HTML после утверждения — архивный артефакт.

UXP API не может ни создать adjustment layer, ни выставить Creative Look программно (Look живёт в бинарном Blob'е Lumetri; числовой параметр «Look» — только встроенные пресеты Adobe). Поэтому эталоны настраиваются руками один раз и дальше клонируются. В мастер-шаблоне (RYA_example.prproj): панель YTAI Assembly → Ingest → Build LUT Donor — создаёт секвенцию YTAI_LUT_DONOR (3 AL-клипа из item'а YTAI_ADJ, каждый @0 на своём треке V1/V2/V3, имена = имена LUT'ов) → руками на каждом клипе Lumetri → Creative → Look = LUT с именем клипа (3 клика) → ⌘S. В рабочие проекты донор приезжает сам: панель импортирует шаблон, когда секвенции нет или она устаревшего поколения. Кнопка идемпотентна: повторное нажатие чинит/дозаполняет.
Открой проект → панель → Ingest → Apply LUT Layers (все секвенции) или Active Sequence Only. По плану панель клонирует донор-клип (Lumetri и Look приезжают с клоном), кладёт на свежий трек над контентом (пересечения — лейнами выше), тримит точно по границам клипа и переименовывает в имя LUT'а — монтажёр видит интент с одного взгляда. Каждый клон пишется в манифест 99_Pipeline/lut_layers_manifest.json — единственная надёжная запись здоровья слоя (Look обратно через API не читается). Повторный прогон: живые слои не трогаются, слой без записи / со старым именем / удалённый вручную — заменяется или доставляется; дублей не бывает, клоббер контента исключён (слои только на своих треках), донор-секвенция при обходе пропускается.
{project}/99_Pipeline/logs/adjust_last.log (debug-дампы панели его не содержат); кнопка Probe Donor Clone — одиночный тест-клон в активную секвенцию с клоббер-гейтом, результат убирается ⌘Z; ⚠️ CLOBBER … press ⌘Z NOW в логе — немедленно Undo; The script object is no longer valid — протухший хэндл, не вердикт: перезапустить.scripts/05_editing/0500_uxp/docs/HANDOFF_adjust_lut.md · спека 0500_uxp_spec.md → ADJUST · скоринг scripts/999_extra/lut_face_score_README.md · тесты tests/adjust/ (45). Проверено end-to-end: YTCH13, 26/26 клипов (18.08.2026) — глаз скорректировал скоринг в 11 клипах из 26, поэтому шаг «ревью глазами» обязателен.| Симптом | Причина | Лечение |
|---|---|---|
| 🕳 Дырка на V1/A1 | Клип не встал — тяжёлый файл не доиндексировался (гонка импорта), findProjectItemByName … not found | Пересобрать (гонка недетерминирована) или перетащить клип из бина в дырку |
| ♊️ Дубли-наложения | Build Ingest прогнан >1 раза в ту же секвенцию — копии сваливаются в кучу | Удалить секвенцию {CODE}_1_Ingest, собрать один раз в чистую |
| 🔇 Звук «плывёт» | Синк сделан по часам камер/рекордера, а кварц врёт (± минуты, дрейф за день) | Синк по речи: word-sync + frame-align, пере-рендер *_timeline.wav (↑ Аудио) |
| 🔇 Клип без TX-звука | DJI не писал в этот момент | В *_timeline.wav это пауза-тишина — норма; рабочий звук — камерный на A1 |
🎨 legacy — no donor seq! при Apply LUT Layers | Донор-секвенция YTAI_LUT_DONOR отсутствует или устаревшего поколения | Build LUT Donor в мастер-шаблоне + 3 Look'а руками (↑ LUT-ревью, шаг 3) |
01_Source/Video/02_<english_name>/ (+ зеркально Audio/02_<english_name>/).…M01.XML → 00_Setup/Camera_XML/.02_<english_name> → nest в {CODE}_MASTER после 01.{project}/00_Setup/TIMELINES.md.