flags local
This commit is contained in:
83
scripts/fetch-crests.ts
Normal file
83
scripts/fetch-crests.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
/**
|
||||
* Einmal-Skript: Lädt alle Team-Crests von football-data.org herunter
|
||||
* und speichert sie unter public/crests/{teamId}.svg.
|
||||
*
|
||||
* Ausführung: npx tsx --env-file=.env scripts/fetch-crests.ts
|
||||
*/
|
||||
import * as fs from "node:fs";
|
||||
import * as path from "node:path";
|
||||
|
||||
const CREST_BASE = "https://crests.football-data.org";
|
||||
const OUT_DIR = path.resolve(import.meta.dirname, "..", "public", "crests");
|
||||
const FD_BASE = "https://api.football-data.org/v4";
|
||||
const FD_COMP = "WC";
|
||||
|
||||
function fdHeaders(): Record<string, string> {
|
||||
const token = process.env.FOOTBALL_DATA_TOKEN;
|
||||
if (!token) {
|
||||
console.error("[fehler] FOOTBALL_DATA_TOKEN nicht gesetzt. Bitte .env prüfen.");
|
||||
process.exit(1);
|
||||
}
|
||||
return { "X-Auth-Token": token };
|
||||
}
|
||||
|
||||
interface FdTeam {
|
||||
id: number;
|
||||
name: string;
|
||||
tla?: string | null;
|
||||
crest?: string | null;
|
||||
}
|
||||
|
||||
async function main() {
|
||||
console.log("[fetch-crests] Rufe Team-Daten von football-data.org ab…");
|
||||
|
||||
const res = await fetch(`${FD_BASE}/competitions/${FD_COMP}/teams`, {
|
||||
headers: fdHeaders(),
|
||||
});
|
||||
if (!res.ok) {
|
||||
console.error(`[fehler] football-data API: ${res.status} ${res.statusText}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const data = (await res.json()) as { teams: FdTeam[] };
|
||||
const teams = data.teams ?? [];
|
||||
console.log(`[fetch-crests] ${teams.length} Teams gefunden.`);
|
||||
|
||||
fs.mkdirSync(OUT_DIR, { recursive: true });
|
||||
|
||||
let ok = 0;
|
||||
let failed = 0;
|
||||
const failures: string[] = [];
|
||||
|
||||
for (const t of teams) {
|
||||
const id = String(t.id);
|
||||
const url = t.crest ?? `${CREST_BASE}/${id}.svg`;
|
||||
const outPath = path.join(OUT_DIR, `${id}.svg`);
|
||||
|
||||
try {
|
||||
const imgRes = await fetch(url);
|
||||
if (!imgRes.ok) {
|
||||
failed++;
|
||||
failures.push(`${t.name} (id=${id}): HTTP ${imgRes.status}`);
|
||||
continue;
|
||||
}
|
||||
const buf = Buffer.from(await imgRes.arrayBuffer());
|
||||
fs.writeFileSync(outPath, buf);
|
||||
ok++;
|
||||
} catch (err) {
|
||||
failed++;
|
||||
failures.push(`${t.name} (id=${id}): ${err instanceof Error ? err.message : String(err)}`);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\n[fetch-crests] Fertig: ${ok} geladen, ${failed} fehlgeschlagen.`);
|
||||
if (failures.length > 0) {
|
||||
console.log("[fetch-crests] Fehlgeschlagene:");
|
||||
for (const f of failures) console.log(` - ${f}`);
|
||||
}
|
||||
}
|
||||
|
||||
main().catch((err) => {
|
||||
console.error("[fehler]", err);
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user