# dump_vs_direct.py
import os
import vapoursynth as vs
core = vs.core

SRC = "/run/media/e/Almacenamiento/Media/Anime/Raws/[BDMV] Ojamajo Doremi (1999)/BIXA_9550_2/BDMV/STREAM/00001.m2ts"
FRAME = 267  # <-- pon aquí el frame entero que quieras

# Source: intenta ffms2, si no, usa bs.VideoSource
try:
    clip = core.ffms2.Source(SRC)
except Exception:
    clip = core.bs.VideoSource(SRC)

# Forzar metadata BT.709 limited
clip = core.std.SetFrameProps(clip, _Matrix=1, _Transfer=1, _Primaries=1, _ColorRange=1)

# Extraer un clip de 1 frame (evita indexación directa)
single_clip = core.std.Trim(clip, FRAME, FRAME)

# Convertir a RGB explícito
rgb = core.resize.Bilinear(
    single_clip,
    format=vs.RGB24,
    matrix_in_s="709",
    transfer_in_s="709",
    primaries_in_s="709",
    range_in_s="limited",
    range_s="full",
    dither_type="none"
)

# Escribir usando un nombre con %d (requisito de imwri)
out_template = "frame_vs_raw_%d.png"
core.imwri.Write(rgb, imgformat="PNG", filename=out_template).get_frame(0)

# imwri habrá escrito frame_vs_raw_0.png (porque el clip tiene 1 frame).
# Renombramos para que el fichero muestre el número real del frame
src_name = out_template % 0
dst_name = f"frame_vs_raw_{FRAME}.png"
if os.path.exists(src_name):
    os.replace(src_name, dst_name)
    print("WROTE:", dst_name)
else:
    raise FileNotFoundError("No se encontró el archivo escrito por imwri: " + src_name)
