Files
pw/scripts/prebuild.py
T
2026-11-09 16:05:08 +01:00

76 lines
2.8 KiB
Python
Executable File

#!/usr/bin/env python3
"""Henter det sitet viser fra Gitea ved build og skriver data/gitea.json:
repos til /projekter og aktivitets-heatmap til /now. Er Gitea nede, bygges sitet
alligevel, med en fejlbesked på /projekter og en tom graf på /now."""
import datetime as dt
import json
import urllib.request
BASE, USER = "https://gitea.weircon.dk", "agw"
HIDE = set() # repo-navne der skjules helt
PINNED = ["gtk-ahfail", "pi3-smart-workspace"] # vises først, i den rækkefølge
WEEKS = 26
MAANEDER = ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august",
"september", "oktober", "november", "december"]
def get(path):
req = urllib.request.Request(f"{BASE}/api/v1{path}", headers={"Accept": "application/json"})
with urllib.request.urlopen(req, timeout=30) as r:
return json.load(r)
def repos():
data = get(f"/users/{USER}/repos?limit=50&sort=updated")
rs = [r for r in data if not (r["fork"] or r["archived"] or r["private"] or r["name"].lower() in HIDE)]
pinned = [p.lower() for p in PINNED]
rs.sort(key=lambda r: r["updated_at"], reverse=True)
rs.sort(key=lambda r: pinned.index(r["name"].lower()) if r["name"].lower() in pinned else len(pinned))
keep = ("name", "description", "html_url", "language", "stars_count")
return [{k: r[k] for k in keep} for r in rs]
def level(n):
return 0 if n == 0 else 1 if n < 3 else 2 if n < 6 else 3 if n < 12 else 4
def heatmap():
per_day = {}
try:
for b in get(f"/users/{USER}/heatmap"):
d = dt.datetime.fromtimestamp(b["timestamp"], dt.timezone.utc).date().isoformat()
per_day[d] = per_day.get(d, 0) + b["contributions"]
except Exception as e:
print(f"heatmap: {e}")
# 26 uger bagud, uger som kolonner (man-søn)
today = dt.date.today()
cur = today - dt.timedelta(days=WEEKS * 7 - 1 + today.weekday())
weeks = []
while cur <= today:
week = []
for _ in range(7):
if cur > today:
break
n = per_day.get(cur.isoformat(), 0)
week.append({"date": cur.isoformat(), "n": n, "level": level(n)})
cur += dt.timedelta(days=1)
weeks.append(week)
return weeks, sum(per_day.values()), f"{today.day}. {MAANEDER[today.month - 1]} {today.year}"
def main():
try:
rs, error = repos(), False
except Exception as e:
print(f"repos: {e}")
rs, error = [], True
weeks, total, updated = heatmap()
with open("data/gitea.json", "w") as f:
json.dump({"repos": rs, "error": error, "weeks": weeks, "weeks_shown": WEEKS,
"total": total, "updated": updated}, f, ensure_ascii=False)
print(f"gitea: {len(rs)} repos, {total} bidrag")
if __name__ == "__main__":
main()