#!/usr/bin/env python3 """Test all enabled channels concurrently, report pass/fail by provider.""" import sys, json, time from pathlib import Path from concurrent.futures import ThreadPoolExecutor, as_completed sys.path.insert(0, str(Path(__file__).resolve().parent)) import newapi_client as n chans = json.load(open("/tmp/chans.json")) enabled = [c for c in chans if c.get("status") == 1] print(f"testing {len(enabled)} enabled channels (16 workers)...") results = [] def test(c): ok, msg, t = n.test_channel(c["id"], timeout=45) return c["id"], c.get("name", ""), ok, msg, t done = 0 with ThreadPoolExecutor(max_workers=16) as ex: futs = [ex.submit(test, c) for c in enabled] for f in as_completed(futs): results.append(f.result()); done += 1 if done % 50 == 0: print(f" {done}/{len(enabled)}") ok_list = [r for r in results if r[2]] fail_list = [r for r in results if not r[2]] import collections, re def prov(name): return name.rsplit("_",1)[0].split("-")[0] if "_" in name else re.sub(r"[0-9].*","",name) byprov = collections.defaultdict(lambda: [0,0]) for cid,name,ok,msg,t in results: p=prov(name); byprov[p][0 if ok else 1]+=1 print(f"\n=== RESULT: {len(ok_list)}/{len(results)} pass, {len(fail_list)} fail ===\n") print("by provider:") for p in sorted(byprov): a,b=byprov[p]; print(f" {p:24} {a:3} ok / {b:3} fail") print("\nfailures:") for cid,name,ok,msg,t in sorted(fail_list): print(f" {cid:4} {name:30} {msg[:75]}") json.dump([{"id":r[0],"name":r[1],"ok":r[2],"msg":r[3],"time":r[4]} for r in results], open(Path(__file__).resolve().parent/"llm-key-hunter/results/test_all.json","w"), indent=2) print("\nfull results -> results/test_all.json")