#!/usr/bin/env python3
"""Blendet den Hinweis „KI-generiert" am Anfang jedes Videos ein.

Verbindliche Regel seit 16.08.2026: Jedes mit KI erzeugte Video trägt den
Hinweis, unabhängig vom Stil. Grund ist die synthetische Stimme — sie klingt
echt, und ob sie unter Art. 50 KI-VO fällt, ist nicht sauber ausjudiziert.
Der Trickfilm-Charakter des Bildes hilft dort nicht weiter.

Gestaltung: oben rechts, klein, rund zwei Sekunden sichtbar, mit weicher Ein-
und Ausblendung. Groß genug zum Lesen, klein genug, um das Bild nicht zu stören.
Die Maße hängen an der Bildhöhe, 720p und 1080p sehen dadurch gleich aus.

Aufruf — beliebig viele Dateien, immer die MASTER, nie die Web-Fassung:

    python3 ~/.claude/skills/schulung/scripts/kennzeichnung.py fertig/*.mp4

Das Original wird als `<name>-ohne-hinweis.mp4` daneben abgelegt, der Lauf ist
damit umkehrbar. Web-Fassungen anschließend neu aus dem Master ableiten.
"""
import pathlib, shutil, subprocess, sys

SCHRIFT = "/System/Library/Fonts/Supplemental/Arial Bold.ttf"
TEXT = "KI-generiert"

# Zeitverlauf: 0,3 s Vorlauf, 0,4 s einblenden, 2,0 s stehen, 0,4 s ausblenden
EIN, AUF, HALT, AB = 0.3, 0.4, 2.0, 0.4


def filter_kette(hoehe):
    """Maße relativ zur Bildhöhe, damit 720p und 1080p gleich aussehen."""
    grad = max(14, round(hoehe / 34))
    rand = round(hoehe / 26)
    polster = round(hoehe / 90)
    t1, t2, t3, t4 = EIN, EIN + AUF, EIN + AUF + HALT, EIN + AUF + HALT + AB
    alpha = (f"if(lt(t,{t1}),0,"
             f"if(lt(t,{t2}),(t-{t1})/{AUF},"
             f"if(lt(t,{t3}),1,"
             f"if(lt(t,{t4}),({t4}-t)/{AB},0))))")
    return (
        f"drawtext=fontfile='{SCHRIFT}':text='{TEXT}':"
        f"fontsize={grad}:fontcolor=white:"
        f"box=1:boxcolor=black@0.45:boxborderw={polster}:"
        f"x=w-tw-{rand}:y={rand}:"
        f"alpha='{alpha}'"
    )


def hoehe_von(datei):
    aus = subprocess.run(["ffprobe", "-v", "error", "-select_streams", "v:0",
                          "-show_entries", "stream=height", "-of", "csv=p=0", str(datei)],
                         capture_output=True, text=True)
    return int(aus.stdout.strip())


def kennzeichnen(datei, crf="18"):
    datei = pathlib.Path(datei)
    sicher = datei.with_name(datei.stem + "-ohne-hinweis" + datei.suffix)
    if not sicher.exists():
        shutil.copy2(datei, sicher)      # Original einmal beiseitelegen
    ziel = datei.with_name(datei.stem + "-neu" + datei.suffix)
    h = hoehe_von(sicher)
    subprocess.run(["ffmpeg", "-y", "-v", "error", "-i", str(sicher),
                    "-vf", filter_kette(h),
                    "-c:v", "libx264", "-crf", crf, "-preset", "slow",
                    "-pix_fmt", "yuv420p", "-c:a", "copy",
                    "-movflags", "+faststart", str(ziel)], check=True)
    ziel.replace(datei)
    print(f"  {datei.name}  ({h}p, Schriftgrad {max(14, round(h/34))})")


if __name__ == "__main__":
    for pfad in sys.argv[1:]:
        kennzeichnen(pfad)
