| |
| """ |
| github_api.py — ATYPIK v24.0 |
| Telechargement repo sans git (API GitHub + ZIP). |
| Compatible HF Spaces. |
| """ |
|
|
| import os |
| import json |
| import zipfile |
| import urllib.request |
| import tempfile |
| from pathlib import Path |
| from typing import List, Dict, Optional |
|
|
| GITHUB_TOKEN = os.getenv("GITHUB_TOKEN", "") |
|
|
| def _api_request(url: str) -> dict: |
| req = urllib.request.Request(url) |
| req.add_header("Accept", "application/vnd.github+json") |
| if GITHUB_TOKEN: |
| req.add_header("Authorization", f"Bearer {GITHUB_TOKEN}") |
| with urllib.request.urlopen(req, timeout=30) as resp: |
| return json.loads(resp.read().decode("utf-8")) |
|
|
| def download_repo(repo_url: str, branch: str = "main", dest: Optional[Path] = None) -> Path: |
| parts = repo_url.rstrip("/").replace(".git", "").split("/") |
| owner, repo = parts[-2], parts[-1] |
| zip_url = f"https://github.com/{owner}/{repo}/archive/refs/heads/{branch}.zip" |
| dest = dest or Path(tempfile.mkdtemp(prefix="repo_")) |
| zip_path = dest / "repo.zip" |
| req = urllib.request.Request(zip_url) |
| req.add_header("User-Agent", "ATYPIK-Agent") |
| with urllib.request.urlopen(req, timeout=60) as resp: |
| zip_path.write_bytes(resp.read()) |
| with zipfile.ZipFile(zip_path, 'r') as z: |
| z.extractall(dest) |
| extracted = list(dest.glob(f"{repo}-*")) |
| if extracted: |
| return extracted[0] |
| return dest |
|
|
| def get_file_content(repo_url: str, filepath: str, branch: str = "main") -> str: |
| parts = repo_url.rstrip("/").replace(".git", "").split("/") |
| owner, repo = parts[-2], parts[-1] |
| raw_url = f"https://raw.githubusercontent.com/{owner}/{repo}/{branch}/{filepath}" |
| req = urllib.request.Request(raw_url) |
| req.add_header("User-Agent", "ATYPIK-Agent") |
| with urllib.request.urlopen(req, timeout=30) as resp: |
| return resp.read().decode("utf-8") |
|
|
| def list_repo_files(repo_url: str, branch: str = "main") -> List[str]: |
| parts = repo_url.rstrip("/").replace(".git", "").split("/") |
| owner, repo = parts[-2], parts[-1] |
| api_url = f"https://api.github.com/repos/{owner}/{repo}/git/trees/{branch}?recursive=1" |
| data = _api_request(api_url) |
| files = [] |
| for item in data.get("tree", []): |
| if item.get("type") == "blob": |
| files.append(item["path"]) |
| return files |
|
|