feat: /api/v2/analiza/* endpoints - sport analytics backend

This commit is contained in:
Damir Radulic
2026-05-16 00:28:12 +02:00
parent 7ca5d7d94e
commit aca5051418
1355 changed files with 321891 additions and 4128 deletions
@@ -0,0 +1,67 @@
#!/usr/bin/env python3
# ═══════════════════════════════════════════════════════════════════
# Fajl: sub1_hns_manual_overrides.py | v1.0.0 | 05.05.2026
# Lokacija: /opt/pgz-sport/scripts/sub1_hns_manual_overrides.py
# Autor: dradulic@outlook.com / damir@rinet.one
# Svrha: SUB1 — Manual high-confidence overrides za klubove koje
# fuzzy match nije uhvatio (ali postoje u HNS-u).
# ═══════════════════════════════════════════════════════════════════
"""SUB1 manual overrides — verified mapping for special cases."""
import os, re, sys, time, urllib.request
from datetime import datetime
import psycopg2
DSN = os.getenv("RINET_DSN",
f"host=10.10.0.2 port=6432 dbname=rinet_v3 user=rinet password={os.environ['DB_PASSWORD']}")
UA = "PGZ-Sport-Bot/1.0 (+https://api.rinet.one/sport/; contact dradulic@outlook.com)"
# Manual mappings — verified by visiting semafor.hns.family
# Format: db_id -> (hns_id, slug, naziv-na-HNS, reason)
OVERRIDES = {
9: (3440, "znk-rijeka", "ŽNK Rijeka", "Ženski NK Rijeka — same modern club"),
101: (3440, "znk-rijeka", "ŽNK Rijeka", "Ženski NK Rijeka 'Jack Pot' — sponsor naming, same club"),
574: (5239, "nk-medicinar", "NK Medicinar", "NK Medicinar Rijeka (osnovan 1996, SRC Belveder)"),
}
def http_check(url, timeout=10):
try:
req = urllib.request.Request(url, headers={"User-Agent": UA})
with urllib.request.urlopen(req, timeout=timeout) as r:
html = r.read().decode("utf-8", errors="replace")
m = re.search(r'<h1[^>]*>([^<]+)</h1>', html)
return r.status, (m.group(1).strip() if m else None)
except Exception as e:
return 0, str(e)
def main():
conn = psycopg2.connect(DSN); conn.autocommit = True
cur = conn.cursor()
print(f"[{datetime.now().isoformat(timespec='seconds')}] Manual overrides start")
ok = 0; fail = 0
for kid, (hns_id, slug, naziv, reason) in OVERRIDES.items():
url = f"https://semafor.hns.family/klubovi/{hns_id}/{slug}/"
status, title = http_check(url)
time.sleep(0.8)
if status != 200:
print(f" VERIFY FAIL [{kid}] {hns_id}: {status} {title}")
fail += 1
continue
try:
cur.execute("""
UPDATE pgz_sport.klubovi
SET hns_klub_id = %s,
hns_slug = %s,
source_url = %s,
scrape_source = 'hns_semafor_manual',
last_scraped_at = now()
WHERE id = %s
""", (hns_id, slug, url, kid))
print(f" OVERRIDE [{kid}] -> HNS {hns_id} '{title}' ({reason})")
ok += 1
except Exception as e:
print(f" UPDATE fail [{kid}]: {e}")
fail += 1
print(f"Done: ok={ok}, fail={fail}")
if __name__ == "__main__":
main()