Stadionzeitung gegen TDC Lindau 2 mit Jugendbeitrag vorbereiten
This commit is contained in:
@@ -149,6 +149,11 @@ if (!$lock || !flock($lock, LOCK_EX | LOCK_NB)) {
|
||||
// --- HTTP-Helfer, unverändert aus bin/instagram-sync.php übernommen ---
|
||||
$fetch = static function (string $url, array $headers = []): string|false {
|
||||
$ch = curl_init($url);
|
||||
// Optional wie im Matchcenter-Sync, wenn der lokale DNS-Dienst ausfällt.
|
||||
$dohUrl = getenv('TSV_HTTP_DOH_URL') ?: '';
|
||||
if ($dohUrl !== '') {
|
||||
curl_setopt($ch, CURLOPT_DOH_URL, $dohUrl);
|
||||
}
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_FOLLOWLOCATION => true,
|
||||
|
||||
@@ -94,6 +94,11 @@ if (!$lock || !flock($lock, LOCK_EX | LOCK_NB)) {
|
||||
// --- HTTP-Helfer mit Browser-typischen Headern (gegen HTTP 418) ---
|
||||
$fetch = static function (string $url, bool $json = true) use ($referer): string|false {
|
||||
$ch = curl_init($url);
|
||||
// Optionaler CLI-Ausweg bei defektem lokalem DNS; keine Systemänderung.
|
||||
$dohUrl = PHP_SAPI === 'cli' ? (getenv('TSV_HTTP_DOH_URL') ?: '') : '';
|
||||
if ($dohUrl !== '') {
|
||||
curl_setopt($ch, CURLOPT_DOH_URL, $dohUrl);
|
||||
}
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_FOLLOWLOCATION => true,
|
||||
|
||||
@@ -393,6 +393,30 @@ if (is_file($szFile)) {
|
||||
if (is_file($szFile)) {
|
||||
$szData = $szData ?? (json_decode((string) file_get_contents($szFile), true) ?: []);
|
||||
foreach ($szData['issues'] ?? [] as $ausgabe) {
|
||||
if (is_array($ausgabe['beitrag'] ?? null)) {
|
||||
$beitrag = $ausgabe['beitrag'];
|
||||
foreach (['heading', 'source', 'source_url', 'image_credit'] as $feld) {
|
||||
if (trim((string) ($beitrag[$feld] ?? '')) === '') {
|
||||
$errors[] = "Stadionzeitung '{$ausgabe['slug']}': Beitrag ohne {$feld}.";
|
||||
}
|
||||
}
|
||||
$quelle = (string) ($beitrag['source_url'] ?? '');
|
||||
if (!filter_var($quelle, FILTER_VALIDATE_URL) || parse_url($quelle, PHP_URL_SCHEME) !== 'https') {
|
||||
$errors[] = "Stadionzeitung '{$ausgabe['slug']}': Beitrag mit ungültiger Quellen-URL.";
|
||||
}
|
||||
$foto = $beitrag['image'] ?? [];
|
||||
if (empty($foto['base']) || empty($foto['widths']) || empty($foto['alt'])) {
|
||||
$errors[] = "Stadionzeitung '{$ausgabe['slug']}': Beitragsfoto oder Alt-Text fehlt.";
|
||||
}
|
||||
foreach ($foto['widths'] ?? [] as $w) {
|
||||
if (!is_file(PUBLIC_PATH . '/assets/' . ($foto['base'] ?? '') . "-{$w}.jpg")) {
|
||||
$errors[] = "Stadionzeitung '{$ausgabe['slug']}': Beitragsfoto fehlt ({$w}px).";
|
||||
}
|
||||
}
|
||||
if (!is_file(PUBLIC_PATH . '/assets/img/stadionzeitung/' . $ausgabe['slug'] . '/qr-beitrag.png')) {
|
||||
$errors[] = "Stadionzeitung '{$ausgabe['slug']}': Beitrags-QR fehlt.";
|
||||
}
|
||||
}
|
||||
if (is_array($ausgabe['rueckblick'] ?? null)) {
|
||||
$rueckblick = $ausgabe['rueckblick'];
|
||||
$foto = $rueckblick['image'] ?? [];
|
||||
|
||||
@@ -161,6 +161,7 @@ $rueckseite = $findOne('rueckseite');
|
||||
$spieler = $findOne('spieler');
|
||||
$verfasser = $findOne('verfasser');
|
||||
$rueckblickFoto = $findOne('rueckblick');
|
||||
$beitragFoto = $findOne('beitrag');
|
||||
$galerieQuellen = $findAll('galerie');
|
||||
// Anzeigen kommen NICHT mehr aus dem Ablieferordner, sondern aus dem dauerhaften
|
||||
// Bestand (data/anzeigen.json, gepflegt über bin/anzeige-add.php). Ein noch
|
||||
@@ -201,6 +202,16 @@ foreach ($existing['issues'] ?? [] as $entry) {
|
||||
$oldVorwort = $oldIssue['vorwort'] ?? null;
|
||||
// Interview wie das Vorwort chat-gepflegt — überlebt erneute Läufe ebenso.
|
||||
$oldInterview = $oldIssue['interview'] ?? null;
|
||||
$beitrag = $oldIssue['beitrag'] ?? null;
|
||||
if (is_array($beitrag) && $beitragFoto === null) {
|
||||
$fail('Redaktioneller Beitrag vorhanden, aber beitrag.* fehlt im Ablieferordner.');
|
||||
}
|
||||
if (is_array($beitrag)) {
|
||||
$beitragLink = trim((string) ($beitrag['source_url'] ?? ''));
|
||||
if (!filter_var($beitragLink, FILTER_VALIDATE_URL) || parse_url($beitragLink, PHP_URL_SCHEME) !== 'https') {
|
||||
$fail('Beitrag: source_url muss eine gültige HTTPS-Adresse sein.');
|
||||
}
|
||||
}
|
||||
// Aufruf-Seite (z. B. Sportfest-Helferaufruf) ebenso chat-gepflegt.
|
||||
$oldAufruf = $oldIssue['aufruf'] ?? null;
|
||||
// Sportfest-Ausgabe: Slug-Verweis auf data/veranstaltungen.json (Programm,
|
||||
@@ -417,6 +428,10 @@ try {
|
||||
if ($oldInterview !== null) {
|
||||
$aufschlag[] = $live('interview');
|
||||
}
|
||||
if (is_array($beitrag)) {
|
||||
$beitrag['image'] = $bild($beitragFoto, 'beitrag', (string) ($beitrag['image']['alt'] ?? $beitrag['heading'] ?? 'Vereinsbeitrag'));
|
||||
$aufschlag[] = $live('beitrag');
|
||||
}
|
||||
// Aufruf-Seite (Helferaufruf o. Ä.) reiht sich in denselben anzeigenfreien
|
||||
// Aufschlag ein, direkt hinter Vorwort/Interview — ein redaktioneller
|
||||
// Einstieg ohne Werbung dazwischen (chat-gepflegtes `aufruf`-Feld).
|
||||
@@ -761,6 +776,12 @@ foreach (['mitmachen', 'news', 'termine', 'matchcenter', 'mitglied-werden', 'his
|
||||
// (qr-aufruf.png) — der wird bei jedem Lauf ohnehin neu befüllt. club_url()
|
||||
// wie überall, damit der gedruckte Code auf die echte Domain zeigt.
|
||||
$aufrufLink = trim((string) ($oldAufruf['link'] ?? ''));
|
||||
$beitragLink = trim((string) ($beitrag['source_url'] ?? ''));
|
||||
if ($beitragLink !== '') {
|
||||
if (!generate_qr_png($beitragLink, "{$destDir}/qr-beitrag.png")) {
|
||||
$fail('QR-Code für den redaktionellen Beitrag konnte nicht erzeugt werden.');
|
||||
}
|
||||
}
|
||||
if ($aufrufLink !== '') {
|
||||
if (generate_qr_png(club_url($aufrufLink), "{$destDir}/qr-aufruf.png")) {
|
||||
$log("QR-Code für die Aufruf-Seite (/{$aufrufLink}) erzeugt.");
|
||||
@@ -838,6 +859,7 @@ $issues[] = [
|
||||
'qr_image' => $qrImage,
|
||||
'vorwort' => $oldVorwort,
|
||||
'interview' => $oldInterview,
|
||||
'beitrag' => $beitrag,
|
||||
'aufruf' => $oldAufruf,
|
||||
'veranstaltung' => $oldVeranstaltung,
|
||||
'cover' => $oldCover,
|
||||
|
||||
Reference in New Issue
Block a user