#!/usr/bin/env python3 """Inspect audio metadata with bounded, read-only ffprobe.""" import argparse import json import shutil import subprocess import sys def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("input") parser.add_argument("--ffprobe", default="ffprobe") parser.add_argument("--timeout", type=float, default=15.0) parser.add_argument("--silence", action="store_true") parser.add_argument("--json", action="store_true") args = parser.parse_args() tool = shutil.which(args.ffprobe) if not tool: print(json.dumps({"ok": False, "status": "missing_tool", "error": "ffprobe not found"})) return 3 try: result = subprocess.run([tool, "-v", "error", "-show_format", "-show_streams", "-of", "json", args.input], capture_output=True, text=True, timeout=args.timeout) except subprocess.TimeoutExpired: print(json.dumps({"ok": False, "status": "timeout", "error": "ffprobe timed out"})) return 4 if result.returncode: print(json.dumps({"ok": False, "status": "probe_failed", "error": result.stderr.strip() or "ffprobe failed"})) return 1 try: document = json.loads(result.stdout) except json.JSONDecodeError: print(json.dumps({"ok": False, "status": "invalid_json", "error": "invalid ffprobe JSON"})) return 1 payload = {"ok": True, "status": "ok", "input": args.input, "probe": document} if args.silence: payload["silence"] = {"status": "candidate_only", "note": "silence intervals require review; no editorial cut was made"} print(json.dumps(payload, indent=2, sort_keys=True)) return 0 if __name__ == "__main__": sys.exit(main())