# ARQUIVO HISTORICO. Contem erro conhecido ao agrupar cid=NA.
# Preservado para auditoria; use filtrar-outliers.py para recalcular a amostra.
# Varredura de nichos faceless PT-BR no YouTube (vídeos do último mês) -> scan.json
# ponytail: yt-dlp sem API key; YouTube Data API se precisar de escala
import json, subprocess, sys, urllib.parse
from concurrent.futures import ThreadPoolExecutor

NICHOS = ["curiosidades", "histórias bíblicas", "mistérios não resolvidos", "história do brasil",
          "fatos sobre animais", "relatos de terror", "finanças explicadas", "resumo de filme",
          "estoicismo", "casos reais crime", "ciência explicada", "lendas brasileiras"]
POR_NICHO = 110

def busca(n):
    url = "https://www.youtube.com/results?search_query=" + urllib.parse.quote(n) + "&sp=EgQIBBAB"
    out = subprocess.run(["yt-dlp", "--flat-playlist", "--playlist-end", str(POR_NICHO), "--print",
                          "%(view_count)s\t%(id)s\t%(channel)s\t%(channel_id)s\t%(duration)s\t%(title)s", url],
                         capture_output=True, text=True, encoding="utf-8").stdout
    vids = []
    for l in out.splitlines():
        p = l.split("\t")
        if len(p) == 6 and p[0].isdigit():
            vids.append({"nicho": n, "views": int(p[0]), "id": p[1], "canal": p[2], "cid": p[3],
                         "dur": float(p[4]) if p[4] not in ("NA", "None") else None, "titulo": p[5]})
    return vids

def inscritos(vid):
    out = subprocess.run(["yt-dlp", "--skip-download", "--print", "%(channel_follower_count)s\t%(upload_date)s",
                          "https://www.youtube.com/watch?v=" + vid], capture_output=True, text=True, encoding="utf-8").stdout.strip()
    p = out.split("\t")
    return (int(p[0]) if p[0].isdigit() else None, p[1] if len(p) > 1 else None)

with ThreadPoolExecutor(6) as ex:
    vids = [v for lst in ex.map(busca, NICHOS) for v in lst]
uniq = {v["id"]: v for v in vids}
vids = list(uniq.values())
print("videos", len(vids), file=sys.stderr)
# um vídeo (o mais visto) por canal pra pegar inscritos
top = {}
for v in vids:
    if v["cid"] not in top or v["views"] > top[v["cid"]]["views"]:
        top[v["cid"]] = v
print("canais", len(top), file=sys.stderr)
with ThreadPoolExecutor(10) as ex:
    res = dict(zip(top.keys(), ex.map(lambda v: inscritos(v["id"]), top.values())))
for v in vids:
    v["inscritos"] = res.get(v["cid"], (None, None))[0]
for cid, v in top.items():
    v["data"] = res[cid][1]
json.dump(vids, open("scan.json", "w", encoding="utf-8"), ensure_ascii=False, indent=0)
print("ok", file=sys.stderr)
