{PROJECT}/01_Source_Proxy/ — комплект внутри проекта (видео-прокси + петличные WAV + транскрипты + луты сцен), самодостаточный для монтажа. В YTCH и frame-align-проектах петличные WAV — только сведённые *_timeline.wav; оригиналы рекордера живут на Drive в 99_Pipeline/DJI_Audio/. Передача комплекта с гидом — этап 5.2. Не путать с Source Light — см. §12.Прокси — это копия того же самого, только легче. Не «уменьшенная версия», не «черновик», не «превью».
01_Source_Proxy/ → 01_Source/. Внутренние пути идентичны, Premiere подхватывает всё пакетно.Прокси-комплект живёт внутри проекта — {PROJECT}/01_Source_Proxy/, а не папкой-соседкой {PROJECT}_Proxy рядом. Стандарт с 17.08.2026: папка-соседка ломает каноническую структуру, плодит вторую точку правды и путает монтажёра.
Главная таблица этапа. Слева — что измеряем, справа — какое значение считается нормой и чем это проверить. Сверяется на каждом клипе: не сошлось — клип не уезжает в комплект и попадает в отчёт.
| # | показатель | у исходника FX3 | целевое у прокси | чем смотрим |
|---|---|---|---|---|
| 1 | разрешение | 3840×2160 | ровно то же, не уменьшать | stream=width,height |
| 2 | частота кадров | 25/1 | та же, сверять строкой: 29.97 = 30000/1001 ≠ 30 | stream=r_frame_rate |
| 3 | число кадров | 804 | ровно столько же, по пакетам, а не по длительности | -count_packets |
| 4 | битность | 10 битyuv422p10le | 10 бит — yuv420p10le / Main 10.8-битный источник остаётся 8-битным | stream=pix_fmt,profile |
| 5 | субдискретизация | 4:2:2 | 4:2:0 — единственное, что падает (§3) | stream=pix_fmt |
| 6 | кодек и битрейт | h264 High 4:2:2 140 Мбит/с | hevc 8 Мбит/с, коридор 0.35–2.5× от цели | stream=codec_name,bit_rate |
| 7 | звук | pcm_s16be 2 канала, 1536 кбит/с | aac 256 кбит/с, дорожек и каналов столько же и в том же порядке | stream=codec_type,channels |
| 8 | таймкод | 00:30:07:23на дорожке rtmd | тот же, на дорожке tmcd | -select_streams d stream_tags=timecode |
| 9 | цветовые теги | нет | нет — пусто равно пусто, bt709 не подставляем | stream=color_space,color_primaries |
| 10 | геометрия | поворот 0° | тот же. Поворот ≠ 0 → не перекодируем вообще (§5) | side_data_list.rotation |
| 11 | вес | 604.5 МБ | в 17–21 раз легче | format=size |
Отличаться имеет право только это: кодек с битрейтом (строка 6) и субдискретизация 4:2:2 → 4:2:0 (строка 5). Всё остальное обязано совпасть, потому что подмена прокси на оригинал — это смена одной корневой папки, а не пересчёт таймлайна.
Лог-профили (S-Log3 у Sony, D-Log2 у DJI) держат всю картинку в узком диапазоне. LUT растягивает его обратно — и вот тут 8 бит рассыпаются бандами в небе, на коже и в градиентах.
Замер на живом клипе. RYA-FX3-0983, 32 секунды со съёмки, реальное движение. PSNR после наложения рабочего 02_normal_scene.cube — сравниваются прокси старого и нового рецепта с оригиналом:
| рецепт | средний PSNR | худший кадр | вес |
|---|---|---|---|
8 бит main / yuvj420p — как собирали 17.08 | 33.29 дБ | 28.68 дБ | 34.3 МБ |
10 бит main10 / p010le — канон | 35.26 дБ | 31.45 дБ | 34.0 МБ |
+1.97 дБ в среднем и +2.77 дБ на худшем кадре при одинаковом весе. Худший кадр важнее среднего: это и есть те кадры с движением и градиентом, где 8 бит видно глазом. Десять бит не стоили ни байта и ни секунды кодирования — старый дефолт был не компромиссом, а чистой потерей.
⚠️ Повышать так же неправильно, как понижать. 8-битный айфон в main10 — это лишние биты, которые нечем заполнить. Битность берётся с источника, а не ставится константой.
А вот субдискретизация 4:2:2 → 4:2:0 — единственная настоящая потеря в контракте. Насколько она критична, отвечаем замером, а не рассуждением.
PSNR по плоскостям в YUV (15 секунд, оба варианта разогнаны до 4:4:4 для честного сравнения). Y — яркость, U и V — цветоразностные:
| вариант | Y (яркость) | U | V |
|---|---|---|---|
| 8 бит 4:2:0 | 42.64 | 53.65 | 51.59 |
| 10 бит 4:2:0 — канон | 42.85 | 55.35 | 52.37 |
| 10 бит 4:2:2 | 42.78 | 55.28 | 52.40 |
⚠️ Старое объяснение было неверным. В тикете значилось «аппаратный кодер 4:2:2 не умеет». Проверено: ffmpeg 8.1.1 принимает -profile:v main42210 -pix_fmt p210le, кодирует за то же время и в тот же вес. Вопрос не «можем ли», а «нужно ли» — и ответ выше. Канон остаётся main10/p010le, а --chroma 422 оставлен дверью: понадобится кеить по прокси или появится цветная бахрома на титрах — переключается одним аргументом.
И главное: прокси никогда не становится финалом. Цвет крутится на оригинале, где 4:2:2 и 10 бит целы. Там, где 4:2:2 действительно решает — кеинг, тонкая вторичная коррекция, насыщенные контрастные края, — на прокси не работают.
Оригинал FX3 несёт таймкод, прокси обязана нести тот же. Без него рассыпается всё, что опирается на TC: синхрон мультикама, сверка с рекордером, монтажный лист.
rtmd), а не в контейнере. format_tags=timecode у оригинала вернёт пусто — и легко решить, что таймкода нет вовсе.ffprobe -select_streams d -show_entries stream_tags=timecode. Отдавать в -timecode.tmcd и дублирует в format_tags — при сверке смотреть оба места.Комплект YTCH спринта 3 (441 прокси, собраны 17.08.2026) не нёс таймкода ни в одном файле — ровно по этой причине.
Клип перекодируется, только если он тяжёлый материал с камеры. Всё остальное идёт в комплект байт-в-байт — копия проходит контракт по построению. Правила в contract.decide() идут по порядку, срабатывает первое совпавшее.
| # | что за клип | решение | почему |
|---|---|---|---|
| 1 | спаннер *__S{NN} — второй экземпляр клипа из другой сцены | пропуск | кодируется один раз, вторая копия делается на Drive server-side (§11) |
| 2 | есть недекодируемая дорожка (apac 4ch у айфона) | копия | ни одна дорожка не должна пропасть |
| 3 | снято на телефон — по тегам производителя (com.apple.quicktime.make=Apple, модель iPhone…, ключи com.android.*) | копия, всегда | без порогов по битрейту: телефон пишет с переменной частотой кадров, перекодирование её выравнивает, число кадров расходится — и клип остаётся без прокси вообще |
| 4 | поворот в Display Matrix | копия | ffmpeg поворот применит, и разъедется разрешение |
| 5 | HEVC не тяжелее цели ×1.6 | копия | уже лёгкий |
| 6 | готовый Rec.709 HEVC 8 бит с тегами, не тяжелее цели ×8 (до 64 Мбит/с при 8M) | копия | и так впятеро легче лога; ×6 стоял ровно на 48 Мбит/с, где пишет айфон 4K |
| 7 | любой кодек легче цели — h264 скринкасты OBS, сток, выгрузки YouTube, web-экспорты | копия | перекодирование такой файл раздувает, гейт заворачивает по весу |
| 8 | остальное — тяжёлый материал с камеры | кодируем | рецепт §6 |
IMG_0393.MOV 106 383 193 Б локально = 106 383 193 Б в комплекте.01_Project_Files и YTCG36 Screen), на YTFP YTFP01_web.mp4 вырос с 97 МБ до 2572 МБ. Смысл прокси — лёгкость: если источник уже легче цели, жать нечего.IMG_0578.MOV несёт 8 дорожек — видео, aac 2ch, apac 4ch и пять mebx-метадорожек. ffmpeg apac не декодирует: попытка пережать такой клип либо упадёт, либо молча потеряет дорожку и метаданные.apac — но это другой кодек с тем же четырёхбуквенным тегом. Честный ответ даёт только попытка декодировать одну секунду дорожки.3840×2160 с матрицей −90°, и ffmpeg при перекодировании поворот применяет — на выходе 2160×3840, и пункт 1 контракта разъезжается.Правило: клип перекодируется, только если он тяжёлый материал с камеры, снят не на телефон, его геометрию не надо переписывать и он тяжелее цели. Скринкасты студийного дня в прокси не идут вовсе: папка Screencast исключается по имени (--exclude).
Ничего не хардкодится: перед каждым клипом снимаются его параметры, и команда собирается под них.
# 1. снять параметры источника TC=$(ffprobe -v error -select_streams d -show_entries stream_tags=timecode \ -of csv=p=0 "$SRC" | head -1 | tr -d ',\r') PIX=$(ffprobe -v error -select_streams v:0 -show_entries stream=pix_fmt \ -of csv=p=0 "$SRC") # 2. битность — по источнику, не константой case "$PIX" in *10le|*10be|*12le) PROF=main10; OPIX=p010le ;; *) PROF=main; OPIX=yuv420p ;; esac # 3. кодировать во временный файл ffmpeg -y -v error -i "$SRC" \ -map 0:v:0 -map "0:a?" \ -c:v hevc_videotoolbox -b:v 8M -tag:v hvc1 \ -profile:v "$PROF" -pix_fmt "$OPIX" \ -c:a aac -b:a 256k \ ${TC:+-timecode "$TC"} \ -movflags +faststart \ -f mp4 "$DST.part.mp4" mv "$DST.part.mp4" "$DST"
Битрейт — --bitrate auto, по частоте кадров: 25p и 30p — 8 Мбит/с, 50p и 60p — 12 Мбит/с (вдвое больше кадров требуют больше), прочее — 10 Мбит/с. Таблица FPS_BITRATE живёт в contract.py. HEVC на 8 Мбит/с примерно равен H.264 на 15–16, артефакты видны только в быстром движении, где прокси всё равно не финал.
⚠️ У proxy.py и rebuild.py дефолт — 8M, и явное значение таблицу отключает целиком. Без --bitrate auto 50p-клипы YTEVO03 (109 штук) уехали бы на 8 Мбит/с вместо 12, и гейт бы промолчал: его коридор 0.35–2.5× это пропускает. Ночные прогоны (0121_studio_day/night.py, ферма) передают auto всегда.
Комплект принят, когда по каждому клипу сошлось всё перечисленное. Не сошлось → один ретрай; не сошлось снова → клип не уезжает и попадает в отчёт.
r_frame_rate совпали строкой⚠️ Ловушка сверки битности. -pix_fmt p010le на входе кодера даёт файл, который ffprobe читает как yuv420p10le. Сверять pix_fmt строкой нельзя — завернёт каждый правильный клип. Сверяется класс глубины.
⚠️ Почему не «сжатие в 12–25 раз». Такой коридор зашит под исходник ~140 Мбит/с и врёт на коротких клипах. Живой случай 22.09.2026: RYA-FX3-0868 длиной 0.96 секунды — Sony пишет такой обрубок на 563 Мбит/с в контейнере, честная прокси даёт сжатие ×63, и гейт браковал исправный файл. Проверять надо то, что обещали: битрейт прокси. У того же клипа он вышел 8.9 Мбит/с при заказанных 8 — всё в порядке.
Отчёт proxy_report.json несёт по каждому клипу пару источник→прокси по всем восьми параметрам, а не одни кадры: когда что-то разойдётся, должно быть видно, что именно.
Гейт выше говорит, что проверяется. Здесь — чем. Все проверки читают файлы и ничего не переделывают: запускать можно в любой момент, в том числе по уже отданному монтажёру комплекту.
Самое полезное, когда что-то кажется странным. Печатает таблицу «источник → прокси» по каждому пункту, с галочкой или крестом.
python3 ~/YTAI/scripts/16_proxy/1601_build/proxy.py \
--src "$СЦЕНА" --dst "$КУДА" --only "RYA-FX3-1107.MP4" --gate-report
--verify-only не кодирует и не трогает файлы: берёт пары оригинал↔прокси и прогоняет гейт. Код возврата 0 — комплект принят, 1 — есть клипы вне контракта, они перечислены.
python3 ~/YTAI/scripts/16_proxy/1601_build/proxy.py \
--src "$PROJ/01_Source" --dst "$PROJ/01_Source_Proxy" \
--verify-only --gate-report --report "$PROJ/00_Setup/logs/proxy_verify.json"
Обходит смонтированные тома, находит проекты по канону имени и по каждому говорит: сколько клипов, есть ли комплект, проходит ли контракт и какой именно пункт не проходит. Восемь клипов на проект — секунды; --sample 0 — все, но долго.
python3 ~/YTAI/scripts/16_proxy/1601_build/audit.py --sample 8 \ --json ~/Library/Logs/ytai/proxy_audit_$(date +%Y%m%d).json
Отчёту на слово не верим. Скачиваем один прокси с Drive и сверяем с оригиналом голым ffprobe — другим кодом, чем тот, что собирал.
rclone copyto "gdrive,team_drive=$TD:$ПУТЬ/RYA-FX3-0852.MP4" /tmp/p.MP4 # и то же самое по оригиналу — глазами сравнить четыре строки for f in "$ОРИГИНАЛ" /tmp/p.MP4; do ffprobe -v error -select_streams v:0 \ -show_entries stream=width,height,r_frame_rate,pix_fmt,profile -of csv=p=0 "$f" ffprobe -v error -select_streams v:0 -count_packets \ -show_entries stream=nb_read_packets -of csv=p=0 "$f" ffprobe -v error -select_streams d -show_entries stream_tags=timecode -of csv=p=0 "$f" ffprobe -v error -select_streams a -show_entries stream=codec_name,channels -of csv=p=0 "$f" done
Проверяет чистую логику без диска и без сети: потолок стейджинга, предикат «уже сделано», разбор отказов rclone, поиск спаннеров. Правка без прошедшего selftest не уезжает ни в коммит, ни в ночь.
python3 ~/YTAI/scripts/16_proxy/1601_build/rebuild.py selftest
Как читать proxy_report.json
| ключ | что значит |
|---|---|
counts | сколько клипов encoded, copied, skip, FAIL |
fails | обязан быть 0. Не ноль — комплект отдавать нельзя |
clips[].action и .reason | жали или копировали и почему — человеческим языком |
clips[].contract | восемь пунктов по этому клипу: ok, значение у источника и у прокси |
clips[].ratio | во сколько раз легче — для глаз, приговор выносится не по нему |
Быстрый взгляд на весь отчёт одной строкой:
python3 -c "import json,sys; r=json.load(open(sys.argv[1]));
print(r['counts'], 'провалов:', r['fails']);
[print(' ✗', c['rel'], c['err']) for c in r['clips'] if c['status']=='FAIL']" \
"$PROJ/00_Setup/logs/proxy_report.json"
Один и тот же клип RYA-FX3-0983 (YTCH10, 32 с) в трёх видах: оригинал, прокси старого рецепта от 17.08.2026 и прокси нового контракта от 23.09.2026. Это не правило, а то, что именно чинили.
| параметр | исходник | прокси 17.08 | прокси 23.09 |
|---|---|---|---|
| вес | 604.5 МБ | 34.3 МБ | 34.0 МБ |
| общий битрейт | 150.4 Мбит/с | 8.5 Мбит/с | 8.4 Мбит/с |
| видеокодек | h264 | hevc | hevc |
| профиль | High 4:2:2 | Main | Main 10 |
| видеобитрейт | 140.2 Мбит/с | 8.3 Мбит/с | 8.2 Мбит/с |
| разрешение | 3840×2160 | 3840×2160 | 3840×2160 |
| частота | 25/1 | 25/1 | 25/1 |
| кадров | 804 | 804 | 804 |
| формат пикселя | yuv422p10le | yuvj420p | yuv420p10le |
| битность | 10 бит | ⚠️ 8 бит | ✅ 10 бит |
| субдискретизация | 4:2:2 | 4:2:0 | 4:2:0 |
| цвет: space / primaries | нет / нет | ⚠️ bt709 / нет | ✅ нет / нет |
| таймкод | 00:30:07:23 | ⚠️ нет | ✅ 00:30:07:23 |
| дорожек всего | 3 | ⚠️ 2 | ✅ 3 |
| звук: кодек | pcm_s16be | aac | aac |
| звук: каналов | 2 | 2 | 2 |
| звук: частота | 48.0 кГц | 48.0 кГц | 48.0 кГц |
| звук: битрейт | 1536 кбит/с | 260 кбит/с | 260 кбит/с |
| сжатие | — | ×17.6 | ×17.8 |
bt709, хотя исходник снят в S-Log3 и цветовых тегов не несёт вовсе. Premiere читает этот тег и применяет не ту кривую.Итог пересборки комплекта YTCH в ночь 22→23.09.2026. Кодирование и заливка внахлёст, девять часов. Цифры сняты 23.09 в 11:00. Три проекта закрыты; YTCH10 занял 5ч 46м. Недобор клипов — это те, что гейт справедливо не пустил: повёрнутые айфонные, см. §5.
| проект | исходники | комплект | сжатие | клипов |
|---|---|---|---|---|
| YTCH12_Sveta | 225 ГБ | 13.2 ГБ | ×17.1 | 116 / 115 ✅ |
| YTCH11_Liza_Vitalik | 332 ГБ | 18.4 ГБ | ×18.0 | 100 / 101 ✅ |
| YTCH10_Anya_Yulia | 496 ГБ | 27.8 ГБ | ×17.8 | 165 / 175 ✅ |
| итого закрыто | 1053 ГБ | 59.4 ГБ | ×17.7 | 381 |
| YTCH14, YTCH13, Masha, Gulya | 360 ГБ | идут | — | ⏳ |
У YTCH12 «116 из 115» — лишний файл это спаннер RYA-FX3-1071__S10, второй экземпляр клипа, живущего в двух сценах: он сделан на Drive копированием, без повторной заливки. Один клип YTCH11 остался от 17.08 — это повёрнутый айфон IMG_0406 2.MOV, который гейт справедливо завернул, см. §5.
Скорость, замеренная на прогоне: кодирование ×4 реалтайма суммарно и от числа потоков почти не зависит — hevc_videotoolbox это один аппаратный блок, а не ядра. Один поток даёт ×3.7, три потока ×4.0: три купили 8 % и стоили втрое больше места в стейджинге.
Монтажёр работает в проекте, у которого медиа слинковано на 01_Source_Proxy — открыл наш .prproj, сделал Link Media → Locate в прокси-папку, остальное подхватилось по именам.
Link Media с переключением корня 01_Source_Proxy → 01_Source. Внутренние пути идентичны, Premiere подхватывает всё пакетно. Ни один клип не сдвигается: кадров ровно столько же, таймкод тот же.
.part ломает ffmpeg. Временное имя без известного расширения → «Invalid argument» при инициализации муксера. Лечится явным -f mp4.0:a? нужно в кавычках — иначе шелл съедает ? как глоб. В коде команда собирается списком, где этой проблемы нет структурно.rclone moveto/copy в пределах одного remote не тратит трафик. Держать --tpslimit 6–8, иначе 403.._*. AppleDouble-файлы на каждый файл и папку; в rclone copy обязателен --exclude "._*", иначе мусор уезжает на Drive.rm.| Editing Proxy (эта страница) | Source Light | |
|---|---|---|
| назначение | монтаж с подменой на оригинал | лёгкая копия вместо оригинала (отдача, архив) |
| кодек | hevc_videotoolbox 8M — быстрый аппаратный | libx265 CRF24 (VMAF ≈ 93.8) — медленнее, качественнее |
| критерий | восемь пунктов контракта | визуально неотличимо, вес минимален |
| финал | пересборка на оригиналах обязательна | оригинал может вообще не понадобиться |
| тул | 16_proxy/1601_build/ | 999_extra/source_light_transcode.py |
Проверено VMAF-калибровкой: для Source Light аппаратный hevc_videotoolbox дал файл больше при худшем качестве — программный x265 там обязателен. Для прокси наоборот: скорость решает, потому что финал всё равно на оригиналах.
Роман 16.10.2026: «синхрон и нарезка исходных аудиофайлов без их сжатия под видео (32 бит флоат)… фрейм в фрейм». Под каждый видеоклип 01_Source — WAV из оригинала передатчика DJI: float 32, 48 кГц, моно, сэмплы копией — ни уровня, ни лимитера, ни пересэмплирования. Файл начинается на первом кадре клипа и длится ровно кадры / fps, до сэмпла. Монтаж берёт эти файлы; исходное качество потом возвращается заменой файла. Шаг E2 Pre-edit (/map/speed/).
| что | как |
|---|---|
| файл | 01_Source_Sound/<сцена>/<камера>/<клип>__DJI-N.wav — по файлу на передатчик (решение Романа 16.10), имена как у дорожек лайта |
| откуда сэмплы | полоса сцены DJI-N_<сцена>_timeline.wav (0113: время файла = время ленты, бит в бит с _orig); начало — как у дорожки петлички лайта: место клипа на ленте − сдвиг GCC по звуку камеры + задержка камеры к губам |
| за краем блока ленты | каждая запись стоит линейно и продолжается той же записью из _orig: сдвиг GCC иначе тянет соседний блок полосы — другое время дня |
| немые дорожки | передатчик в это время не писал — файл не кладётся, причина в описи (silent) |
| сцена без полос | поиск записей: часы дня (00_Setup/06_Day/clocks.json) и все носители и Drive по индексу where.py; нашлась и звук камеры подтвердил место — кусок прямо из _orig; иначе в описи «петлички нет», что нашлось и где искали |
| приёмка | перечитан с диска = md5; = полоса по каждому сэмплу со звуком; = _orig по каждому сэмплу покрытия, вне покрытия нули; длина = кадры × 48000 / fps дробью |
| никогда | _edit (обработанный вариант DJI, не равен _orig); обработка в этих файлах — чистка и уровень живут в миксе фильма |
Пилот YTEVO03, 16.10.2026: 209 клипов, с петличкой 128 — 213 файлов (7,1 ГБ) за 23 с на Memex, приёмка 213 из 213 бит в бит, начала совпали с дорожками лайта до сэмпла. У 81 клипа петлички нет, в описи почему: 74 — записей передатчиков на это время нет нигде (сцены 03, 06, 09, 12, съёмка 17.09 «Лисий Нос»), 2 — записи DJI-2 и DJI-3 по часам под клипами, но звук камеры с ними не сходится (передатчики были не у камеры), 3 — осечки Pocket 0,5–0,7 с, короче окна сверки звуком.
# план: место на ленте, доли _orig, сдвиг GCC, поиск для сцен без полос (лёгкий, любая машина) PY=~/YTAI/environment/.venv_transcribe/bin/python; S=~/YTAI/scripts/16_proxy/1605_sound/sound.py $PY $S plan --project "$PROJ" # нарезка и приёмка — на машине, где диск проекта свой (T9-Black-2 — Memex) ssh memex-tb 'export RYA_STEP=E2 RYA_PROJECT=CODE; ~/.local/bin/rya-res run sound-cut-CODE --kind light --where here -- \ ~/YTAI/environment/.venv_transcribe/bin/python ~/YTAI/scripts/16_proxy/1605_sound/sound.py cut --project "$PROJ"' $PY $S check --project "$PROJ" # или так же на Memex $PY $S status --project "$PROJ" # клипов N, с петличкой M, без — K и почему
| что | где |
|---|---|
| состояние этапа против этой страницы — разбор 28.09.2026: конвейер схемой, восемь пунктов, два дома комплекта, что записано и что нет | /kb/proxy/state/ |
| контракт в коде — одна точка правды | ~/YTAI/scripts/16_proxy/1601_build/contract.py |
| сборка комплекта проекту | ~/YTAI/scripts/16_proxy/1601_build/proxy.py |
| ночная пересборка канала с потоковой заливкой | ~/YTAI/scripts/16_proxy/1601_build/rebuild.py |
| доукомплектование: WAV, транскрипты, луты | ~/YTAI/scripts/16_proxy/1601_build/kit.py |
| ночной супервизор: сборка → самоаудит → починка | ~/YTAI/scripts/16_proxy/1601_build/night.py |
| заливка собранного комплекта на Drive + добор WAV и транскриптов server-side | ~/YTAI/scripts/16_proxy/1602_deliver/upload_proxies.sh |
| ферма: с Drive на Drive, без дисков рядом | ~/YTAI/scripts/16_proxy/1603_farm/ (plan.py → farm.py) |
| проверка прокси по всем дискам | ~/YTAI/scripts/16_proxy/1601_build/audit.py |
| Source Light (не прокси) | ~/YTAI/scripts/999_extra/source_light_transcode.py |
| лайт: прокси с цветом фильма + петлички дорожками | ~/YTAI/scripts/16_proxy/1604_light/ → 01_Source_Light/ |
| звук петличек под каждый клип, float 32 кадр в кадр (E2) | ~/YTAI/scripts/16_proxy/1605_sound/sound.py → 01_Source_Sound/ |
| передача монтажёру (комплект + гид) | 5.2 Editor Handoff & Proxy Kit |
| Drive-механика, монтажный лист | 3.8 Project Drive Sync · 5.5 Монтажный лист |
| структура сцен на входе | 3.2 Исходники → целевая структура |
| луты сцен | 3.3 Scene LUTs |
# комплект проекту python3 ~/YTAI/scripts/16_proxy/1601_build/proxy.py \ --src "$PROJ/01_Source" --dst "$PROJ/01_Source_Proxy" \ --bitrate auto --jobs 2 --report "$PROJ/00_Setup/logs/proxy_report.json" # доложить WAV, транскрипты и луты сцен python3 ~/YTAI/scripts/16_proxy/1601_build/kit.py --src "$PROJ/01_Source" --dst "$PROJ/01_Source_Proxy" # проверить один клип по всем восьми пунктам python3 ~/YTAI/scripts/16_proxy/1601_build/proxy.py \ --src "$SCENE" --dst "$OUT" --only "RYA-FX3-1107.MP4" --gate-report
Три драйвера — один контракт. Решение, команда и гейт у всех берутся из contract.py; различается только логистика.
| драйвер | откуда | куда | когда |
|---|---|---|---|
1601_build/proxy.py | локальная папка | локальная папка | один проект, место есть |
1601_build/rebuild.py | локальный SSD | Drive внахлёст | канал целиком (--kit YTCH|YTEVO|YTUVI), места нет |
1603_farm/farm.py | Drive | Drive | машины и дисков рядом нет — ночью на Мемексе |
# там, где смонтированы диски: манифест «сцена → файл на Drive», каждый источник по точному размеру python3 ~/YTAI/scripts/16_proxy/1603_farm/plan.py --unit YTEVO03 --publish # где угодно python3 ~/YTAI/scripts/16_proxy/1603_farm/farm.py run --unit YTEVO03 --dry-run python3 ~/YTAI/scripts/16_proxy/1603_farm/farm.py run --unit YTEVO03 python3 ~/YTAI/scripts/16_proxy/1603_farm/farm.py status --unit YTEVO03 python3 ~/YTAI/scripts/16_proxy/1603_farm/farm.py selftest # регрессия до любой правки
journal.jsonl; взятый клип держит лизу 3 часа и сам возвращается в очередь, если воркер упал.copyto/copy, никогда sync: в комплекте на Drive живут и транскрипты — у YTEVO03 их 277, единственная копия вне _work. Квота Drive 750 ГБ/сутки лечится ожиданием, а не повтором.~/.cache/ytai/proxy_farm/STOP · PAUSE_UPLOAD. Развёртывание на Мемекс — deploy_memex.sh, launchd в 01:00. Как комплект едет на Drive — 3.8 Project Drive Sync.