// 배포 전에 공개 릴리스 저장소의 릴리스 목록을 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)); } }