#!/usr/bin/env python3
"""Склеивает исходники по одному плану: видео и родной звук режутся одинаково."""
from __future__ import annotations
import argparse, json, subprocess
from pathlib import Path

def main():
    ap=argparse.ArgumentParser(); ap.add_argument('stitch_plan'); ap.add_argument('output')
    ap.add_argument('--width',type=int,default=720); ap.add_argument('--height',type=int,default=1280); ap.add_argument('--fps',type=float,default=30)
    ap.add_argument('--crf',type=int,default=17); args=ap.parse_args()
    plan=json.loads(Path(args.stitch_plan).read_text(encoding='utf-8')); src=plan['sources']
    cmd=['ffmpeg','-y','-v','error']
    for s in src: cmd += ['-i',s['file']]
    filters=[]; labels=[]
    for i,s in enumerate(src):
        a=float(s['in']); b=float(s['out'])
        filters.append(f'[{i}:v]trim=start={a}:end={b},setpts=PTS-STARTPTS,'
                       f'scale={args.width}:{args.height}:force_original_aspect_ratio=increase,'
                       f'crop={args.width}:{args.height},setsar=1,fps={args.fps},format=yuv420p[v{i}]')
        filters.append(f'[{i}:a]atrim=start={a}:end={b},asetpts=PTS-STARTPTS,'
                       f'aresample=48000,aformat=sample_fmts=fltp:channel_layouts=stereo[a{i}]')
        labels.append(f'[v{i}][a{i}]')
    filters.append(''.join(labels)+f'concat=n={len(src)}:v=1:a=1[v][a]')
    cmd += ['-filter_complex',';'.join(filters),'-map','[v]','-map','[a]','-c:v','libx264','-preset','slow','-crf',str(args.crf),
            '-c:a','aac','-b:a','192k','-movflags','+faststart',args.output]
    q=subprocess.run(cmd)
    if q.returncode: raise SystemExit(q.returncode)
    print(json.dumps({'output':args.output,'sources':len(src),'expected_duration':plan.get('expected_duration')},ensure_ascii=False))
if __name__=='__main__': main()
