#!/usr/bin/env bash
set -euo pipefail
R=/data/video-pipeline/GacMaiAudio/project/gacmai_20260718_091744
I="$R/assets/images"
ffmpeg -y -hide_banner -loglevel error -i "$I/intro_source_rev5.png" -vf "scale=3840:2160:flags=lanczos" -frames:v 1 "$I/intro_normalized.png"
ffmpeg -y -hide_banner -loglevel error -i "$I/left_rail_source_rev2.png" -vf "scale=2160:3840:flags=lanczos" -frames:v 1 "$I/left_rail_normalized.png"
ffmpeg -y -hide_banner -loglevel error -i "$I/right_rail_source_rev3.png" -vf "scale=2160:3840:flags=lanczos" -frames:v 1 "$I/right_rail_normalized.png"
python3 - <<'PY'
import json,hashlib,subprocess,datetime
from pathlib import Path
R=Path('/data/video-pipeline/GacMaiAudio/project/gacmai_20260718_091744');I=R/'assets/images';A=R/'artifacts'
pairs=[('intro','intro_source_rev5.png','intro_normalized.png'),('left_rail','left_rail_source_rev2.png','left_rail_normalized.png'),('right_rail','right_rail_source_rev3.png','right_rail_normalized.png')]
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
def dim(p):
 d=json.loads(subprocess.check_output(['ffprobe','-v','error','-select_streams','v:0','-show_entries','stream=width,height','-of','json',str(p)],text=True))['streams'][0];return [d['width'],d['height']]
rows=[]
for role,s,n in pairs:
 sp=I/s;np=I/n;rows.append({'role':role,'source_file':str(sp),'source_sha256':sha(sp),'source_dimensions':dim(sp),'normalized_file':str(np),'normalized_sha256':sha(np),'normalized_dimensions':dim(np),'method':'ffmpeg_lanczos_uniform_scale_no_crop'})
rec={'status':'passed','project_id':'gacmai_20260718_091744','contract_sha256':'3d345b87df3fa3d0c67458a6930b2cbf41a82f80ac7de3c4e7b9e5e920a16f9b','source_qa':{'intro':'pass_against_canonical_contract','left_rail':'pass','right_rail':'pass'},'rows':rows,'normalized_at':datetime.datetime.now(datetime.timezone.utc).isoformat()}
(A/'visual_source_acceptance_and_normalization.json').write_text(json.dumps(rec,ensure_ascii=False,indent=2)+'\n');print(json.dumps(rec,ensure_ascii=False))
PY
