#!/usr/bin/env python3 """Sorteia 3 clipes para os previews de acompanhamento do treino. Criterios (decididos com o usuario): - primeiro frame como imagem de condicao (a caption H3 ancora " em 0.00s"); - tres aspect ratios visualmente diferentes, para o preview cobrir paisagem, retrato e algo intermediario/quadrado; - pixels quadrados de verdade: o preparador rejeita SAR anamorfico, entao so entram clipes com SAR 1:1 / N/A; - >= 124 frames, para o preview de 124f nao sair de um clipe mais curto. """ from __future__ import annotations import argparse, json, random from pathlib import Path OK_SAR = {"1:1", "0:1", "N/A"} def main() -> None: ap = argparse.ArgumentParser() ap.add_argument("--inventory", required=True, type=Path) ap.add_argument("--seed", type=int, default=42) a = ap.parse_args() rows = [r for r in json.loads(a.inventory.read_text()) if "error" not in r] rows = [r for r in rows if r["caption"] and r["frames"] >= 124 and r["sar"] in OK_SAR and r["w"] and r["h"]] # Faixas de aspect: paisagem larga, quadrado-ish, retrato. faixas = { "paisagem": lambda ar: ar >= 1.3, "quadrado": lambda ar: 0.8 <= ar < 1.3, "retrato": lambda ar: ar < 0.8, } rng = random.Random(a.seed) escolhidos = [] for nome, teste in faixas.items(): pool = [r for r in rows if teste(r["w"] / r["h"])] if not pool: print(f"# sem candidatos para {nome}") continue r = rng.choice(pool) escolhidos.append(r) cap = Path(r["path"]).with_suffix(".txt").read_text(encoding="utf-8-sig") gatilho = next((g for g in ("A static", "A slow", "A smooth", "An intense", "A turntable", "A chroma-key") if g + " looping" in cap), "?") print(f"# {nome:9s} {r['w']}x{r['h']} ar={r['w']/r['h']:.2f} " f"{r['frames']}f tipo={r['folder']} gatilho='{gatilho}'") for r in escolhidos: print(r["path"]) if __name__ == "__main__": main()