feat(scan): binary FIX scan reads frl_/frd_ names from .aep (no AE, never hangs)
Build backend images / build content-svc (push) Failing after 15s
Build backend images / build file-svc (push) Failing after 1m51s
Build backend images / build gateway (push) Failing after 51s
Build backend images / build identity-svc (push) Failing after 57s
Build backend images / build notification-svc (push) Failing after 52s
Build backend images / build render-svc (push) Failing after 56s
Build backend images / build studio-svc (push) Failing after 57s

Root cause of 'stuck on AE': heavy expression-driven projects take >10min for AE
to open, exceeding the scan timeout → job dies → admin UI stuck 'scanning'.

Fix: extend the stdlib .aep RIFX parser to collect every Utf8 name (ParseNames),
since FIX media placeholders are renamed footage ITEMS (frl_c1m1), not layers, and
text are layer names (frl_c1t1) — both are Utf8 chunks. QuickScan now branches on
?mode= (or auto-detects frl_ names) and scaffolds FIX scenes/elements + frd_*color
slots directly from the binary. Verified on the real final.aep that timed out in AE:
1 scene, 6 elements, 4 colors in 0.5s vs 10-min AE timeout.

Admin 'Quick scan (no AE)' is now the recommended path and passes the project mode.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-04 22:48:53 +03:30
parent f0ce286527
commit 718564bce4
5 changed files with 240 additions and 13 deletions
@@ -0,0 +1,28 @@
package aep
import (
"os"
"testing"
)
// TestDumpRealAEP is a manual harness: set FR_TEST_AEP to a .aep path to print the
// comps + layer names the parser extracts. Skipped in normal CI runs.
func TestDumpRealAEP(t *testing.T) {
path := os.Getenv("FR_TEST_AEP")
if path == "" {
t.Skip("set FR_TEST_AEP to a .aep path")
}
data, err := os.ReadFile(path)
if err != nil {
t.Fatal(err)
}
comps, err := ParseComps(data)
if err != nil {
t.Fatal(err)
}
names, _ := ParseNames(data)
t.Logf("parsed %d comps, %d names from %s (%d bytes)", len(comps), len(names), path, len(data))
for _, c := range comps {
t.Logf("COMP %q dur=%.2fs layers=%d", c.Name, c.DurationSec, len(c.Layers))
}
}