dragonflight/tools/na_patch.py

50 lines
2.5 KiB
Python
Raw Normal View History

"""Patches node-agent to store bridge per-port format JSON and inject into sidecar env."""
with open('services/node-agent/index.js') as f:
s = f.read()
# 1. Add per-port format cache
old1 = "const _containerSourceType = new Map();"
new1 = ("const _containerSourceType = new Map();\n"
"// port -> fmt JSON from bridge stderr (inject into sidecar env)\n"
"const _dcPortFmt = new Map();")
assert old1 in s, "MISS: _containerSourceType"
s = s.replace(old1, new1, 1)
# 2. Parse format JSON in bridge stderr handler
old2 = (" if (t.startsWith('{')) console.log('[dc-bridge] ' + t);\n"
" else console.error('[dc-bridge] ' + t);")
new2 = (" if (t.startsWith('{')) {\n"
" console.log('[dc-bridge] ' + t);\n"
" try { const f = JSON.parse(t); if (typeof f.port === 'number') _dcPortFmt.set(f.port, f); } catch (_) {}\n"
" } else {\n"
" console.error('[dc-bridge] ' + t);\n"
" }")
assert old2 in s, "MISS: stderr handler"
s = s.replace(old2, new2, 1)
# 3. Inject env after startDeltacastBridge()
old3 = (" if (sourceType === 'deltacast') {\n"
" _dcSidecarCount++;\n"
" startDeltacastBridge();")
new3 = (" if (sourceType === 'deltacast') {\n"
" _dcSidecarCount++;\n"
" startDeltacastBridge();\n"
" // Inject per-port signal format so capture-manager uses real dimensions/fps\n"
" const _srcCfg = (env.find(e => e.startsWith('SOURCE_CONFIG=')) || '').slice(14);\n"
" let _portNum = NaN;\n"
" try { _portNum = JSON.parse(_srcCfg).port; } catch (_) {}\n"
" if (Number.isFinite(_portNum) && _dcPortFmt.has(_portNum)) {\n"
" const _fmt = _dcPortFmt.get(_portNum);\n"
" const _fps = (_fmt.fps_den && _fmt.fps_den !== 1) ? `${_fmt.fps_num}/${_fmt.fps_den}` : String(_fmt.fps_num);\n"
" sidecarEnv.push(`DELTACAST_VIDEO_SIZE=${_fmt.width}x${_fmt.height}`);\n"
" sidecarEnv.push(`DELTACAST_FRAMERATE=${_fps}`);\n"
" sidecarEnv.push(`DELTACAST_INTERLACED=${_fmt.interlaced ? '1' : '0'}`);\n"
" console.log(`[dc-bridge] port ${_portNum} fmt: ${_fmt.width}x${_fmt.height} ${_fps} interlaced=${_fmt.interlaced}`);\n"
" }")
assert old3 in s, "MISS: sidecar start deltacast block"
s = s.replace(old3, new3, 1)
with open('services/node-agent/index.js', 'w') as f:
f.write(s)
print("PATCHED OK")