"""zaman.json üretir (sadece okur). Saat: gece yarısından beri saniye, Rode BWF saati esas.

Kamera başlangıçları ses çapraz korelasyonuyla ölçüldü (kamera sesi ↔ Rode WAV, tüm WAV içinde arama).
Kamera A'nın sesi iki mikrofonun mono karışımı (Rode alıcısı A'ya bağlı); r 0.6–0.96.
Kamera A saati XML'e göre +259.4 sn, Kamera B +89.5 sn kayık. Ölçülemeyen B klipleri bu farkla
yerleştirilir ve "tahmini" diye işaretlenir.
"""
import glob, json, os, re, subprocess

K = "/home/stark/Desktop/Eğitim - 01"
OUT = os.path.join(K, "Önizleme", "medya", "zaman.json")

OLCULEN = {  # klip -> ölçülen başlangıç (sn)
    "C1966": 71108.900, "C1967": 74726.349, "C1968": 76009.432, "C1969": 76869.153,
    "C1970": 77373.542, "C1973": 83078.385,
    "C2221": 71111.990, "C2225": 77394.660, "C2229": 82946.480,
    # RSV'den kurtarılanlar (rsv_kurtar.py), aynı yöntemle ölçüldü
    "C2222": 74740.922, "C2223": 76153.242, "C2224": 76684.206,
}
FARK = {"A": 259.4, "B": 89.5}


def probe(p, alan):
    return subprocess.run(["ffprobe", "-v", "error", "-show_entries", alan, "-of", "csv=p=0", p],
                          capture_output=True, text=True).stdout.strip()


# Kamera A'nın sesi ayrı WAV olarak "Kamera A sesi" izinde; burada sadece B'nin kanalları
z = {"bolumler": {}, "kanal": {"B": {"L": "kamera mik.", "R": "kamera mik."}}}
for bolum in ("Eğitim", "Sohbet"):
    b = {"video": {"A": [], "B": []}, "ses": {"Mikrofon 1": [], "Mikrofon 2": [], "Kamera A sesi": [], "Seyirci (ayrılmış)": []}}
    for w in sorted(glob.glob(f"{K}/{bolum}/Seyirci ayrılmış/*.WAV")):   # seyirci_ayir.py: Kamera A − Mik 2
        b["ses"]["Seyirci (ayrılmış)"].append(
            dict(yol=w, bas=int(probe(w, "format_tags=time_reference")) / 48000, sure=float(probe(w, "format=duration"))))
    for w in sorted(glob.glob(f"{K}/{bolum}/Kamera A sesi/*.WAV")):      # Mik 1+2 karışık, BWF saatli
        b["ses"]["Kamera A sesi"].append(
            dict(yol=w, bas=int(probe(w, "format_tags=time_reference")) / 48000, sure=float(probe(w, "format=duration"))))
    for w in sorted(glob.glob(f"{K}/{bolum}/*.WAV")):
        no = int(os.path.basename(w)[:5])
        b["ses"]["Mikrofon 1" if no < 57 else "Mikrofon 2"].append(
            dict(yol=w, bas=int(probe(w, "format_tags=time_reference")) / 48000, sure=float(probe(w, "format=duration"))))
    for x in sorted(glob.glob(f"{K}/{bolum}/C*.MP4") + glob.glob(f"{K}/{bolum}/C*.MOV")):
        ad = os.path.basename(x)[:-4]; kam = "A" if ad.startswith("C19") else "B"
        sure = float(probe(x, "format=duration"))
        k = dict(yol=x, sure=sure)
        if ad in OLCULEN:
            k["bas"] = OLCULEN[ad]
        else:
            m = re.search(r'CreationDate value="[^T]+T(\d\d):(\d\d):(\d\d)', open(x[:-4] + "M01.XML", errors="ignore").read())
            k["bas"] = int(m[1]) * 3600 + int(m[2]) * 60 + int(m[3]) + FARK[kam]; k["tahmini"] = True
        b["video"][kam].append(k)
    b["ses"] = {"Miks": [dict(yol=w, bas=int(probe(w, "format_tags=time_reference")) / 48000, sure=float(probe(w, "format=duration")))
                         for w in sorted(glob.glob(f"{K}/{bolum}/Miks/*.WAV"))], **b["ses"]}   # miks.py çıktısı, ilk sırada
    b["ses"] = {ad: v for ad, v in b["ses"].items() if v}          # boş izler gösterilmesin
    hepsi = [k for d in (b["video"], b["ses"]) for v in d.values() for k in v]
    b["bas"] = min(k["bas"] for k in hepsi); b["son"] = max(k["bas"] + k["sure"] for k in hepsi)
    z["bolumler"][bolum] = b
json.dump(z, open(OUT, "w"), ensure_ascii=False, indent=1)
for bolum, b in z["bolumler"].items():
    print(bolum, round(b["bas"]), round(b["son"]))
    for d in (b["video"], b["ses"]):
        for ad, v in d.items():
            for k in v:
                h = lambda t: f"{int(t)//3600:02d}:{int(t)%3600//60:02d}:{int(t)%60:02d}"
                print(f"  {ad:11} {os.path.basename(k['yol']):24} {h(k['bas'])} – {h(k['bas']+k['sure'])}{'  (tahmini)' if k.get('tahmini') else ''}")
