import bisect
import json
import sys
def main():
args = sys.argv[1:]
def take(name, default):
if name in args:
i = args.index(name)
val = args[i + 1]
del args[i : i + 2]
return val
return default
def take_all(name):
vals = []
while name in args:
i = args.index(name)
vals.append(args[i + 1])
del args[i : i + 2]
return vals
max_gap = float(take("--max-gap", "inf"))
segs = sorted(
(float(t), float(f)) for t, f in (s.split(":") for s in take_all("--seg"))
)
src, dst = args[0], args[1]
starts = [t for t, _ in segs]
factors = [f for _, f in segs]
def factor_at(t):
if not segs or t < starts[0]:
return 1.0
return factors[bisect.bisect_right(starts, t) - 1]
lines = open(src).read().splitlines()
header = lines[0]
events = [json.loads(l) for l in lines[1:] if l.strip()]
out = [header]
prev_raw = 0.0
clock = 0.0
for ev in events:
t, kind, data = ev[0], ev[1], ev[2]
gap = min(t - prev_raw, max_gap)
clock += max(gap, 0.0) / factor_at(prev_raw)
prev_raw = t
out.append(json.dumps([round(clock, 6), kind, data]))
with open(dst, "w") as f:
f.write("\n".join(out) + "\n")
print(f"{src} ({events[-1][0]:.1f}s) -> {dst} ({clock:.1f}s), {len(events)} events")
for t, fac in segs:
print(f" from {t:6.2f}s x{fac:g}")
if __name__ == "__main__":
main()