releases/site/fetch-releases.mjs

80 lines
3 KiB
JavaScript

// 배포 전에 공개 릴리스 저장소의 릴리스 목록을 releases.json 으로 굽는다.
// (브라우저에서 Forgejo API 를 직접 호출하면 CORS 에 막히므로 빌드 시점에 정적 생성)
// 사용: node site/fetch-releases.mjs
import { writeFileSync, readFileSync, existsSync } from "node:fs";
import { resolve, dirname } from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = dirname(fileURLToPath(import.meta.url));
const root = resolve(__dirname, "..");
const envPath = resolve(root, ".env");
// .env 로드 (환경변수가 없을 경우 보완)
if (existsSync(envPath)) {
const content = readFileSync(envPath, "utf8");
for (const line of content.split("\n")) {
const match = line.match(/^\s*([A-Za-z0-9_]+)\s*=\s*(.*)$/);
if (match && !process.env[match[1]]) {
process.env[match[1]] = match[2].trim();
}
}
}
const serverUrl = (process.env.FORGEJO_URL || "https://git.chanpaca.net").replace(/\/$/, "");
const repo = process.env.RELEASE_REPO || "Video-Downloader/releases";
const API = `${serverUrl}/api/v1/repos/${repo}/releases?limit=50`;
const headers = { Accept: "application/json" };
if (process.env.FORGEJO_TOKEN) {
headers.Authorization = `token ${process.env.FORGEJO_TOKEN}`;
} else if (process.env.FORGEJO_USER && process.env.FORGEJO_PASSWORD) {
const b64 = Buffer.from(`${process.env.FORGEJO_USER}:${process.env.FORGEJO_PASSWORD}`).toString("base64");
headers.Authorization = `Basic ${b64}`;
}
const includeDraft = process.env.INCLUDE_DRAFT === "true";
try {
const res = await fetch(API, { headers });
if (!res.ok) throw new Error(`릴리스 API 실패: HTTP ${res.status}`);
const raw = await res.json();
const releases = (Array.isArray(raw) ? raw : [])
.filter((r) => includeDraft || !r.draft)
.sort((a, b) => new Date(b.published_at || b.created_at) - new Date(a.published_at || a.created_at))
.map((r) => ({
tag: r.tag_name,
name: r.name || r.tag_name,
published_at: r.published_at || r.created_at,
prerelease: r.prerelease,
draft: r.draft,
notes: r.body || "",
assets: (r.assets || []).map((a) => ({
name: a.name,
size: a.size,
url: a.browser_download_url,
})),
}));
const publicServerUrl = process.env.FORGEJO_PUBLIC_URL || "https://git.chanpaca.net";
const out = {
generated_at: new Date().toISOString(),
repo_url: `${publicServerUrl.replace(/\/$/, "")}/${repo}`,
releases,
};
writeFileSync(new URL("./releases.json", import.meta.url), JSON.stringify(out, null, 2));
console.log(`releases.json 생성 완료: 릴리스 ${releases.length}건 (저장소: ${repo})`);
} catch (err) {
console.error(`릴리스 정보 로드 실패: ${err.message}`);
// 기존 releases.json 이 없으면 빈 파일 생성
const outPath = resolve(__dirname, "releases.json");
if (!existsSync(outPath)) {
const fallback = {
generated_at: new Date().toISOString(),
repo_url: `${serverUrl}/${repo}`,
releases: [],
};
writeFileSync(outPath, JSON.stringify(fallback, null, 2));
}
}