# Cron script templates

Save these as `/tmp/<name>.py` and run with `terminal python3 /tmp/<name>.py`.

## /tmp/parse_trending.py
```python
import requests, re, json, html

def main():
    with open('/tmp/gh_trending.html', 'r', encoding='utf-8', errors='ignore') as f:
        text = f.read()
    blocks = re.split(r'<article\s+class="Box-row"', text)[1:15]
    results = []
    for b in blocks:
        href_m = re.search(r'href="/([^/]+/[^/\s"]+)"', b)
        if not href_m:
            continue
        name = href_m.group(1)
        if name.startswith("login?return_to="):
            fix = re.search(r"github.com/([^/]+/[^/\s\"]+)\"", b)
            if fix:
                name = fix.group(1)
        if re.search(r'/sponsors/', b) or re.search(r'/dashboard', b):
            continue
        desc_m = re.search(r'<p[^>]*>\s*([^<]+)', b)
        desc = html.unescape(desc_m.group(1).strip()) if desc_m else ""
        lang_m = re.search(r'<span[^>]+itemprop="programmingLanguage"[^>]*>([^<]+)', b)
        lang = lang_m.group(1).strip() if lang_m else ""
        stars_m = re.search(r'href="/' + re.escape(name.split('/')[0]) + r'/.*?/stargazers".*?>([0-9.,kKmM]+)', b)
        stars = stars_m.group(1).strip() if stars_m else ""
        forks_m = re.search(r'href="/' + re.escape(name.split('/')[0]) + r'/.*?/forks".*?>([0-9.,kKmM]+)', b)
        forks = forks_m.group(1).strip() if forks_m else ""
        delta_m = re.search(r'<span class="d-inline-block float-sm-right">.*?</span>', b)
        delta = ""
        if delta_m:
            inner = re.search(r'>([^<]+)<', delta_m.group(0))
            if inner:
                delta = inner.group(1).strip()
        results.append({
            "full_name": name,
            "description": desc,
            "language": lang,
            "stars": stars,
            "forks": forks,
            "delta_today": delta,
        })
    print(json.dumps(results, ensure_ascii=False, indent=2))
    print(f"\nTotal parsed repos: {len(results)}")

if __name__ == "__main__":
    main()
```

## /tmp/fetch_metadata.py
```python
import requests, json, time

def main():
    repos = [  # filled at runtime
        "aquasecurity/trivy",
        "NousResearch/hermes-agent",
        "microsoft/markitdown",
        "opendataloader-project/opendataloader-pdf",
        "odoo/odoo",
        "Open-LLM-VTuber/Open-LLM-VTuber",
        "jwasham/coding-interview-university",
        "supermemoryai/supermemory",
        "HKUDS/Vibe-Trading",
    ]
    headers = {"Accept": "application/vnd.github+json", "User-Agent": "Mozilla/5.0"}
    out = []
    for r in repos:
        url = f"https://api.github.com/repos/{r}"
        try:
            j = requests.get(url, headers=headers, timeout=20).json()
            if "id" not in j:
                out.append({"full_name": r, "error": j.get("message")})
                continue
            out.append({
                "full_name": j.get("full_name"),
                "html_url": j.get("html_url"),
                "language": j.get("language"),
                "stargazers_count": j.get("stargazers_count"),
                "forks_count": j.get("forks_count"),
                "description": j.get("description"),
                "topics": j.get("topics", []),
                "updated_at": j.get("updated_at"),
                "created_at": j.get("created_at"),
            })
        except Exception as e:
            out.append({"full_name": r, "error": str(e)})
        time.sleep(0.3)
    print(json.dumps(out, ensure_ascii=False, indent=2))

if __name__ == "__main__":
    main()
```

## /tmp/fetch_readmes.py
```python
import requests, json, time

def main():
    repos = [  # filled at runtime
        "aquasecurity/trivy",
        "NousResearch/hermes-agent",
        "microsoft/markitdown",
        "opendataloader-project/opendataloader-pdf",
        "odoo/odoo",
        "Open-LLM-VTuber/Open-LLM-VTuber",
        "jwasham/coding-interview-university",
        "supermemoryai/supermemory",
        "HKUDS/Vibe-Trading",
    ]
    headers = {"Accept": "application/vnd.github+json", "User-Agent": "Mozilla/5.0"}
    out = {}
    for r in repos:
        url = f"https://api.github.com/repos/{r}/readme"
        try:
            j = requests.get(url, headers=headers, timeout=20).json()
            if "download_url" in j:
                txt = requests.get(j["download_url"], headers=headers, timeout=20).text
                path = f"/tmp/readme_{r.replace('/','_')}.md"
                with open(path, 'w', encoding='utf-8') as f:
                    f.write(txt)
                out[r] = {"path": path, "bytes": len(txt)}
            else:
                out[r] = {"error": j.get("message")}
        except Exception as e:
            out[r] = {"error": str(e)}
        time.sleep(0.4)
    print(json.dumps(out, ensure_ascii=False, indent=2))

if __name__ == "__main__":
    main()
```

## /tmp/lead_extractor.py
```python
import re, json
from pathlib import Path

TECHS = [
    "python","typescript","go","java","javascript","rust",
    "fastapi","django","flask","sqlalchemy","pandas","numpy","pytorch",
    "tensorflow","transformers","langchain","llama","llama-index",
    "gradio","streamlit","litellm","uvicorn","pydantic","redis","celery",
    "kafka","opencv","pillow","scikit-learn","xgboost","lightgbm",
    "onnx","whisper","speechbrain",
    "live2d","ollama","vtuber","rag","vectordb","vector db",
    "pdf","ocr","sbom","containers","docker","kubernetes","cloud",
    "markdown","postgres","tailwind","remix","vite","cloudflare",
    "microsoft","react","next.js","nextjs"
]

def extract(path):
    txt = Path(path).read_text(encoding='utf-8', errors='ignore')[:120000]
    txt = re.sub(r'```.*?```', '', txt, flags=re.S)
    txt = re.sub(r'<!.*?>', '', txt)
    txt = re.sub(r'\[(.*?)\]\(.*?\)', lambda m: m.group(1), txt)
    txt = re.sub(r'!\[.*?\]\(.*?\)', '', txt)
    txt = re.sub(r'[^A-Za-z0-9 .:,;?!%\-/=+()]+', ' ', txt)
    txt = re.sub(r'\s+', ' ', txt)
    sentences = re.split(r'(?<=[.!?])\s+', txt)
    best = [s for s in sentences if len(s.split()) >= 6][:3]
    summary = " ".join(best)
    low = txt.lower()
    found = sorted({kw for kw in TECHS if kw in low})
    return summary, found[:12]

files = {
    "aquasecurity/trivy": "/tmp/readme_aquasecurity_trivy.md",
    "NousResearch/hermes-agent": "/tmp/readme_NousResearch_hermes-agent.md",
    "microsoft/markitdown": "/tmp/readme_microsoft_markitdown.md",
    "opendataloader-project/opendataloader-pdf": "/tmp/readme_opendataloader-project_opendataloader-pdf.md",
    "odoo/odoo": "/tmp/readme_odoo_odoo.md",
    "Open-LLM-VTuber/Open-LLM-VTuber": "/tmp/readme_Open-LLM-VTuber_Open-LLM-VTuber.md",
    "jwasham/coding-interview-university": "/tmp/readme_jwasham_coding-interview-university.md",
    "supermemoryai/supermemory": "/tmp/readme_supermemoryai_supermemory.md",
    "HKUDS/Vibe-Trading": "/tmp/readme_HKUDS_Vibe-Trading.md",
}

out = {}
for repo, path in files.items():
    try:
        summary, techs = extract(path)
        out[repo] = {"summary": summary[:700], "techs": techs}
    except Exception as e:
        out[repo] = {"error": str(e)}

with open('/tmp/readme_summ.json', 'w', encoding='utf-8') as f:
    json.dump(out, f, ensure_ascii=False, indent=2)
print("OK")
```
