Stadionzeitung, Veranstaltungen, News-Artikel, Lightbox und Anzeigen-Verteilung
Stadionzeitung: Live-Seiten (Tabellen, Ergebnisse, Vorschau, Termine, News, Kontakt, Historie, Sportheim, Partner, Momente, Impressum), automatisches Cover, Swipe-Viewer mit Vollbildmodus und die Druckfassung als Falt-Heft. Anzeigen kommen jetzt aus dem Bestand und werden gleichmäßig verteilt, nie mehr als zwei hintereinander (vorher vier Blöcke à fünf). Die Doppelseiten-Regel rechnet das Skript selbst, statt sie von Hand zu prüfen. Veranstaltungen: Bereich /veranstaltungen mit Detailseite pro Fest, Lebenszyklus über das Datum (Ankündigung vor dem Fest, Rückblick danach), Galerie mit Lightbox. veranstaltungen.json ist dritte Termin-Quelle, damit ein Fest nie doppelt gepflegt wird. News-Artikel als dritte dynamische Prefix-Route, gemeinsamer detail-head. Behobene Fehler: - Wappen-Kontexte setzten Zeilen-Layout auf .crest statt auf die Zeile; das Wappen wurde zum Grid, Vereinsname und Tore rutschten darunter zusammen (Ergebnis-Rückblick, Vorschau, Cover). - --header-h (60px) unterschätzt die Kopfleiste um 32px (Logo 72px + 20px Versatz): neues abgeleitetes --header-space, sonst klebten Zurück-Links unter dem Logo. - base_url in der Produktions-Config ohne www, während .htaccess auf www umleitet; preflight prüft das jetzt. - .lightbox brauchte display:none mit (0,2,0), sonst lag das Overlay offen. Neue Werkzeuge: bin/anzeige-add.php (Anzeigen-Bestand), bin/veranstaltung-bilder.php (Plakate und Galerien, Alt-Texte folgen der Quelldatei), bin/qr.php (Druck-QR mit Warnung, wenn base_url nicht auf die echte Domain zeigt). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NzeVVgMCrzCDJAKeLEdKr7
This commit is contained in:
564
bin/chronik-lib.php
Normal file
564
bin/chronik-lib.php
Normal file
@@ -0,0 +1,564 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* Gemeinsame Logik der Chronik-Skripte (chronik-init.php, chronik-add.php).
|
||||
*
|
||||
* Bewusst hier unter bin/ und NICHT in app/helpers.php: das ist Recherche-Werkzeug für
|
||||
* die Jubiläums-Chronik 2028, kein Website-Code. Nichts davon darf je im Request-Pfad
|
||||
* landen — die Seite kennt die Chronik nicht.
|
||||
*
|
||||
* Zwei Dinge trägt diese Datei, und beide sind der eigentliche Punkt der Übung:
|
||||
*
|
||||
* 1. Der DATEINAME ist der Metadatenträger. Die Files Gallery unter /dateien kennt keine
|
||||
* Felder für Datum, Quelle oder Rechte — sie listet Dateien. Also muss alles, was ein
|
||||
* Fundstück später brauchbar macht, in den Namen: `1972-07-15_Einweihung-Sportheim_BR.jpg`.
|
||||
* Datum vorn, damit die alphabetische Sortierung der Gallery zufällig die chronologische ist.
|
||||
*
|
||||
* 2. RECHTE werden beim Einsammeln festgehalten, nicht 2028 rekonstruiert. Zu jedem Fundstück
|
||||
* entsteht eine `.quelle.txt` daneben und eine Zeile im Register. Was geklärt werden muss,
|
||||
* landet zusätzlich in 00_RECHTE-ZU-KLAEREN.txt — im Ordner, wo es jemand sieht.
|
||||
*/
|
||||
|
||||
/** Jahrzehnt-Bündel: [von, bis] => Ordnername. Früh breit, später enger — dort wird das Material dichter. */
|
||||
const CHRONIK_BUCKETS = [
|
||||
'1908-1929' => '1908-1929',
|
||||
'1930-1949' => '1930-1949',
|
||||
'1950-1969' => '1950-1969',
|
||||
'1970-1989' => '1970-1989',
|
||||
'1990-2009' => '1990-2009',
|
||||
'2010-2028' => '2010-2028',
|
||||
];
|
||||
|
||||
const CHRONIK_DOKUMENTE = 'Festschriften-und-Dokumente';
|
||||
const CHRONIK_UNDATIERT = 'Undatiert';
|
||||
|
||||
const CHRONIK_README = '00_LIESMICH.txt';
|
||||
const CHRONIK_RECHTE = '00_RECHTE-ZU-KLAEREN.txt';
|
||||
|
||||
/** Register liegt im REPO, nicht im Uploads-Ordner: uploads/ ist gitignored, das Register braucht Versionsgeschichte. */
|
||||
function chronik_register_path(): string
|
||||
{
|
||||
return ROOT_PATH . '/docs/chronik/register.csv';
|
||||
}
|
||||
|
||||
function chronik_root(): string
|
||||
{
|
||||
return STORAGE_PATH . '/dateien/uploads/Vereinshistorie';
|
||||
}
|
||||
|
||||
/**
|
||||
* Wayback-Adressen auf die ursprüngliche Adresse zurückführen.
|
||||
*
|
||||
* Das Internet Archive ist nur der Aufbewahrungsort — Urheber und Rechte richten sich nach
|
||||
* der Seite, die dort eingefroren wurde. Ein Schnappschuss der eigenen alten Vereinsseite
|
||||
* gehört dem Verein, nicht dem Archiv.
|
||||
*/
|
||||
function chronik_origin_url(string $url): string
|
||||
{
|
||||
if (preg_match('#^https?://web\.archive\.org/web/[^/]+/(https?://.+)$#i', $url, $m)) {
|
||||
return $m[1];
|
||||
}
|
||||
return $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rechtelage aus dem Host ableiten.
|
||||
*
|
||||
* Die Einschätzung ist eine ARBEITSHILFE, keine Rechtsauskunft — sie sagt nur, wo geklärt
|
||||
* werden muss, bevor etwas gedruckt oder auf die Website gestellt wird. Sammeln und Sichten
|
||||
* ist das eine, Veröffentlichen das andere; genau diese Grenze markiert das Feld.
|
||||
*
|
||||
* @return array{status:string, klaeren:bool, hinweis:string}
|
||||
*/
|
||||
function chronik_rights(string $host): array
|
||||
{
|
||||
$host = strtolower(preg_replace('/^www\./', '', $host));
|
||||
|
||||
$map = [
|
||||
'infranken.de' => [
|
||||
'Presse © Mediengruppe Oberfranken (inFranken/Bayerische Rundschau)',
|
||||
true,
|
||||
'Text UND Foto sind geschützt. Für Abdruck in der Chronik bzw. Nutzung auf der Website '
|
||||
. 'Nachdruckrechte beim Verlag anfragen (Mediengruppe Oberfranken, Bamberg). Für '
|
||||
. 'Vereinsjubiläen wird das üblicherweise gegen Quellenangabe eingeräumt — aber schriftlich, und früh.',
|
||||
],
|
||||
'bayerische-rundschau.de' => [
|
||||
'Presse © Mediengruppe Oberfranken (Bayerische Rundschau)',
|
||||
true,
|
||||
'Wie inFranken — gleicher Verlag. Nachdruckrechte schriftlich einholen.',
|
||||
],
|
||||
'frankenpost.de' => [
|
||||
'Presse © Mediengruppe Oberfranken (Frankenpost)',
|
||||
true,
|
||||
'Gleiches Haus wie Bayerische Rundschau/inFranken — eine gemeinsame Anfrage an die '
|
||||
. 'Mediengruppe Oberfranken deckt alle drei Titel ab.',
|
||||
],
|
||||
'fraenkischertag.de' => [
|
||||
'Presse © Mediengruppe Oberfranken (Fränkischer Tag)',
|
||||
true,
|
||||
'Vierter Titel des Hauses, dieselbe Anfrage deckt ihn mit ab. Achtung beim Lokalsport '
|
||||
. 'Kulmbach: dort steht oft „Foto: privat" — das Bild kommt dann aus dem Verein oder von '
|
||||
. 'einer Privatperson, die Bildrechte liegen bei ihr und nicht beim Verlag. Wer das ist, '
|
||||
. 'weiß die Redaktion oder die Mannschaft; danach ist es ein Anruf statt einer Anfrage.',
|
||||
],
|
||||
'kicker.de' => [
|
||||
'Presse © kicker / Olympia-Verlag',
|
||||
true,
|
||||
'Reine Stammdaten (Liga, Spielort) sind Fakten und frei; Texte und Fotos nicht.',
|
||||
],
|
||||
'europlan-online.de' => [
|
||||
'© Europlan-Online (Groundhopping-Portal)',
|
||||
true,
|
||||
'Stadiondaten als Fakten frei verwendbar; die Stadionfotos gehören den einzelnen '
|
||||
. 'Fotografen und sind einzeln anzufragen.',
|
||||
],
|
||||
'turneninkulmbach.info' => [
|
||||
'Turnabteilung TSV 08 Kulmbach — eigenes Material',
|
||||
false,
|
||||
'Seite der eigenen Turnabteilung. Intern klären, wer sie betreut, dann sind die '
|
||||
. 'Inhalte für die Chronik verfügbar.',
|
||||
],
|
||||
'anpfiff.info' => [
|
||||
'© anpfiff.info',
|
||||
true,
|
||||
'Amateurfußball-Portal. Ergebnisse frei, Berichte und Fotos nicht.',
|
||||
],
|
||||
'bfv.de' => [
|
||||
'© Bayerischer Fußball-Verband',
|
||||
true,
|
||||
'Reine Ergebnis- und Tabellendaten (Fakten) sind frei verwendbar; Texte, Fotos und Wappen nicht. '
|
||||
. 'Wappen fremder Vereine nur mit deren Zustimmung abbilden.',
|
||||
],
|
||||
'fussball.de' => [
|
||||
'© DFB / Bayerischer Fußball-Verband',
|
||||
true,
|
||||
'Ergebnisse und Tabellenstände als Fakten frei; Seitenaufbau, Texte und Fotos nicht.',
|
||||
],
|
||||
'deutsche-turnliga.de' => [
|
||||
'© Deutsche Turnliga',
|
||||
true,
|
||||
'Ergebnisdaten frei, Texte/Fotos nicht.',
|
||||
],
|
||||
'tsv08kulmbach.de' => [
|
||||
'Eigenes Material (TSV 08 Kulmbach)',
|
||||
false,
|
||||
'Aus dem Bestand des Vereins — nutzbar. Bei Personenfotos trotzdem das Recht am eigenen Bild beachten.',
|
||||
],
|
||||
// Frühere Vereinsdomain (Jimdo, ~2016–2023). DNS läuft nicht mehr, erreichbar nur
|
||||
// noch über das Internet Archive — inhaltlich aber unser eigenes Material.
|
||||
'tsv1908kulmbach.de' => [
|
||||
'Eigenes Material (TSV 08 Kulmbach, frühere Vereinsseite)',
|
||||
false,
|
||||
'Alte Vereinsseite, nur noch im Internet Archive. Inhalte stammen vom Verein selbst. '
|
||||
. 'Bei Personenfotos das Recht am eigenen Bild beachten.',
|
||||
],
|
||||
'commons.wikimedia.org' => [
|
||||
'Wikimedia Commons — freie Lizenz, Bedingung prüfen',
|
||||
true,
|
||||
'Frei nutzbar, aber fast immer MIT Namensnennung und Lizenzangabe. Die konkrete Lizenz '
|
||||
. '(CC BY-SA, CC0, PD) auf der Dateiseite ablesen und im Register eintragen.',
|
||||
],
|
||||
'de.wikipedia.org' => [
|
||||
'Wikipedia — CC BY-SA',
|
||||
true,
|
||||
'Text nur mit Namensnennung und unter gleicher Lizenz weiterverwendbar. Für eine Chronik '
|
||||
. 'besser als Faktenquelle nutzen und selbst formulieren.',
|
||||
],
|
||||
'facebook.com' => [
|
||||
'Social Media — Urheber unklar',
|
||||
true,
|
||||
'Wer das Foto gemacht hat, steht dort meist nicht. Vor einer Veröffentlichung Urheber '
|
||||
. 'ermitteln (oft der Verein selbst oder ein Mitglied) und Einwilligung abgeborgener Personen prüfen.',
|
||||
],
|
||||
'instagram.com' => [
|
||||
'Social Media — Urheber unklar',
|
||||
true,
|
||||
'Wie Facebook. Eigene Vereinsposts sind unkritisch, fremde nicht.',
|
||||
],
|
||||
'digipress.digitale-sammlungen.de' => [
|
||||
'Bayerische Staatsbibliothek — meist gemeinfrei',
|
||||
false,
|
||||
'Zeitungen bis ~1920er sind in der Regel gemeinfrei. Quellenangabe (Blatt, Datum, Seite, BSB) trotzdem mitführen.',
|
||||
],
|
||||
];
|
||||
|
||||
foreach ($map as $needle => [$status, $klaeren, $hinweis]) {
|
||||
if ($host === $needle || str_ends_with($host, '.' . $needle)) {
|
||||
return ['status' => $status, 'klaeren' => $klaeren, 'hinweis' => $hinweis];
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'status' => 'Ungeklärt — Urheber unbekannt',
|
||||
'klaeren' => true,
|
||||
'hinweis' => 'Herkunft im Register nachtragen und vor jeder Veröffentlichung klären.',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Datum (YYYY, YYYY-MM oder YYYY-MM-DD) → Zielordner.
|
||||
* Unbekanntes oder unplausibles Datum landet in Undatiert/ statt still im falschen Jahrzehnt.
|
||||
*/
|
||||
function chronik_bucket(?string $date): string
|
||||
{
|
||||
if ($date === null || !preg_match('/^(\d{4})/', $date, $m)) {
|
||||
return CHRONIK_UNDATIERT;
|
||||
}
|
||||
$year = (int) $m[1];
|
||||
foreach (CHRONIK_BUCKETS as $range => $dir) {
|
||||
[$from, $to] = array_map('intval', explode('-', $range));
|
||||
if ($year >= $from && $year <= $to) {
|
||||
return $dir;
|
||||
}
|
||||
}
|
||||
return CHRONIK_UNDATIERT;
|
||||
}
|
||||
|
||||
/** Datum auf YYYY-MM-DD normalisieren; unbekannte Teile werden 00 (sortiert vor dem 1. des Monats). */
|
||||
function chronik_date_norm(?string $date): string
|
||||
{
|
||||
if ($date === null || !preg_match('/^(\d{4})(?:-(\d{2}))?(?:-(\d{2}))?/', $date, $m)) {
|
||||
return '0000-00-00';
|
||||
}
|
||||
return sprintf('%s-%s-%s', $m[1], $m[2] ?? '00', $m[3] ?? '00');
|
||||
}
|
||||
|
||||
/** Titel → dateinamensicherer Slug. Umlaute ausgeschrieben, damit NFD/NFC nie zum Thema wird. */
|
||||
function chronik_slug(string $text, int $maxLen = 60): string
|
||||
{
|
||||
$text = strtr($text, [
|
||||
'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue',
|
||||
'ß' => 'ss', 'é' => 'e', 'è' => 'e', 'ê' => 'e', 'á' => 'a', 'à' => 'a', 'ç' => 'c',
|
||||
]);
|
||||
$text = (string) preg_replace('/[^A-Za-z0-9]+/', '-', $text);
|
||||
$text = trim((string) preg_replace('/-+/', '-', $text), '-');
|
||||
if (strlen($text) > $maxLen) {
|
||||
$text = substr($text, 0, $maxLen);
|
||||
$text = (string) preg_replace('/-[^-]*$/', '', $text) ?: $text;
|
||||
}
|
||||
return $text !== '' ? $text : 'ohne-titel';
|
||||
}
|
||||
|
||||
/** Kurzkürzel der Quelle für den Dateinamen (BR, BFV, …). */
|
||||
function chronik_source_tag(string $host): string
|
||||
{
|
||||
$host = strtolower(preg_replace('/^www\./', '', $host));
|
||||
$tags = [
|
||||
'infranken.de' => 'BR',
|
||||
'bayerische-rundschau.de' => 'BR',
|
||||
'frankenpost.de' => 'FP',
|
||||
'fraenkischertag.de' => 'FT',
|
||||
'kicker.de' => 'KICKER',
|
||||
'europlan-online.de' => 'EUROPLAN',
|
||||
'anpfiff.info' => 'ANPFIFF',
|
||||
'turneninkulmbach.info' => 'TURNEN08',
|
||||
'tsv1908kulmbach.de' => 'TSV08',
|
||||
'bfv.de' => 'BFV',
|
||||
'fussball.de' => 'FUSSBALLDE',
|
||||
'deutsche-turnliga.de' => 'DTL',
|
||||
'tsv08kulmbach.de' => 'TSV08',
|
||||
'facebook.com' => 'FB',
|
||||
'instagram.com' => 'IG',
|
||||
'de.wikipedia.org' => 'WIKIPEDIA',
|
||||
'commons.wikimedia.org' => 'COMMONS',
|
||||
'digipress.digitale-sammlungen.de' => 'BSB',
|
||||
'web.archive.org' => 'WAYBACK',
|
||||
];
|
||||
foreach ($tags as $needle => $tag) {
|
||||
if ($host === $needle || str_ends_with($host, '.' . $needle)) {
|
||||
return $tag;
|
||||
}
|
||||
}
|
||||
return strtoupper(chronik_slug(explode('.', $host)[0] ?? 'quelle', 12));
|
||||
}
|
||||
|
||||
/** Registerzeile anhängen (CSV, Semikolon — öffnet sich in Excel/LibreOffice ohne Import-Dialog). */
|
||||
function chronik_register_append(array $row): void
|
||||
{
|
||||
$path = chronik_register_path();
|
||||
$dir = dirname($path);
|
||||
if (!is_dir($dir)) {
|
||||
mkdir($dir, 0775, true);
|
||||
}
|
||||
|
||||
$cols = ['datei', 'datum', 'titel', 'art', 'quelle', 'url', 'urheber', 'rechte', 'klaeren', 'abgerufen', 'notiz'];
|
||||
$new = !is_file($path);
|
||||
|
||||
$fh = fopen($path, 'a');
|
||||
if (!$fh) {
|
||||
return;
|
||||
}
|
||||
flock($fh, LOCK_EX);
|
||||
if ($new) {
|
||||
fputcsv($fh, $cols, ';', '"', '\\');
|
||||
}
|
||||
fputcsv($fh, array_map(static fn(string $c): string => (string) ($row[$c] ?? ''), $cols), ';', '"', '\\');
|
||||
flock($fh, LOCK_UN);
|
||||
fclose($fh);
|
||||
}
|
||||
|
||||
/** Schon im Register? Verhindert Dubletten bei wiederholten Läufen. */
|
||||
function chronik_register_has_url(string $url): bool
|
||||
{
|
||||
$path = chronik_register_path();
|
||||
if (!is_file($path)) {
|
||||
return false;
|
||||
}
|
||||
$fh = fopen($path, 'r');
|
||||
if (!$fh) {
|
||||
return false;
|
||||
}
|
||||
$found = false;
|
||||
while (($row = fgetcsv($fh, 0, ';', '"', '\\')) !== false) {
|
||||
if (($row[5] ?? '') === $url) {
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose($fh);
|
||||
return $found;
|
||||
}
|
||||
|
||||
/** Beleg-Sidecar neben dem Fundstück: alles, was der Dateiname nicht fasst. */
|
||||
function chronik_sidecar_text(array $row, string $hinweis): string
|
||||
{
|
||||
$lines = [
|
||||
'FUNDSTÜCK FÜR DIE VEREINSCHRONIK — TSV 08 Kulmbach',
|
||||
str_repeat('=', 52),
|
||||
'',
|
||||
'Titel: ' . ($row['titel'] ?? ''),
|
||||
'Datum: ' . ($row['datum'] ?? '') . ' (00 = unbekannt)',
|
||||
'Art: ' . ($row['art'] ?? ''),
|
||||
'Quelle: ' . ($row['quelle'] ?? ''),
|
||||
'URL: ' . ($row['url'] ?? ''),
|
||||
'Urheber: ' . (($row['urheber'] ?? '') !== '' ? $row['urheber'] : 'nicht angegeben'),
|
||||
'Abgerufen am: ' . ($row['abgerufen'] ?? ''),
|
||||
'',
|
||||
'RECHTE: ' . ($row['rechte'] ?? ''),
|
||||
' ' . (($row['klaeren'] ?? '') === 'ja' ? '>>> VOR VERÖFFENTLICHUNG KLÄREN <<<' : 'nutzbar'),
|
||||
'',
|
||||
wordwrap($hinweis, 88, "\n"),
|
||||
];
|
||||
if (($row['notiz'] ?? '') !== '') {
|
||||
$lines[] = '';
|
||||
$lines[] = 'Notiz:';
|
||||
$lines[] = wordwrap((string) $row['notiz'], 88, "\n");
|
||||
}
|
||||
return implode("\n", $lines) . "\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* 00_RECHTE-ZU-KLAEREN.txt aus dem Register neu schreiben.
|
||||
* Bewusst generiert statt fortgeschrieben: die Datei soll immer den aktuellen Stand zeigen,
|
||||
* auch wenn im Register etwas auf „geklärt" gesetzt wurde.
|
||||
*/
|
||||
function chronik_write_rights_todo(): int
|
||||
{
|
||||
$path = chronik_register_path();
|
||||
if (!is_file($path)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$byRights = [];
|
||||
$count = 0;
|
||||
$fh = fopen($path, 'r');
|
||||
if (!$fh) {
|
||||
return 0;
|
||||
}
|
||||
fgetcsv($fh, 0, ';', '"', '\\'); // Kopfzeile
|
||||
while (($row = fgetcsv($fh, 0, ';', '"', '\\')) !== false) {
|
||||
if (($row[8] ?? '') !== 'ja') {
|
||||
continue;
|
||||
}
|
||||
$byRights[$row[7] ?? 'Ungeklärt'][] = [
|
||||
'datei' => $row[0] ?? '',
|
||||
'titel' => $row[2] ?? '',
|
||||
'datum' => $row[1] ?? '',
|
||||
'url' => $row[5] ?? '',
|
||||
// Der Verlag verlangt den Bildnachweis namentlich — wo er bekannt ist,
|
||||
// gehört er in die Anfrage-Anlage, nicht nur ins Register.
|
||||
'urheber' => $row[6] ?? '',
|
||||
];
|
||||
$count++;
|
||||
}
|
||||
fclose($fh);
|
||||
|
||||
$out = [
|
||||
'RECHTE, DIE VOR DER VERÖFFENTLICHUNG ZU KLÄREN SIND',
|
||||
str_repeat('=', 52),
|
||||
'',
|
||||
'Diese Datei wird von bin/chronik-add.php erzeugt — nicht von Hand pflegen,',
|
||||
'sondern die Spalte „klaeren" in docs/chronik/register.csv auf „nein" setzen,',
|
||||
'sobald eine Freigabe vorliegt, und das Skript erneut laufen lassen.',
|
||||
'',
|
||||
'Sammeln und intern sichten ist unproblematisch. Erst der Abdruck in der Chronik',
|
||||
'oder die Veröffentlichung auf der Website braucht eine Erlaubnis.',
|
||||
'',
|
||||
"Offen: {$count} Fundstücke",
|
||||
'',
|
||||
];
|
||||
|
||||
foreach ($byRights as $rechte => $items) {
|
||||
$out[] = str_repeat('-', 52);
|
||||
$out[] = $rechte . ' (' . count($items) . ')';
|
||||
$out[] = str_repeat('-', 52);
|
||||
foreach ($items as $i) {
|
||||
$out[] = ' · ' . $i['datum'] . ' ' . $i['titel'];
|
||||
$out[] = ' ' . $i['datei'];
|
||||
if ($i['urheber'] !== '') {
|
||||
$out[] = ' ' . $i['urheber'];
|
||||
}
|
||||
if ($i['url'] !== '') {
|
||||
$out[] = ' ' . $i['url'];
|
||||
}
|
||||
}
|
||||
$out[] = '';
|
||||
}
|
||||
|
||||
$out[] = 'Stand: ' . date('d.m.Y H:i');
|
||||
file_put_contents(chronik_root() . '/' . CHRONIK_RECHTE, implode("\n", $out) . "\n");
|
||||
|
||||
return $count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Entwurf der Nachdruck-Anfrage an den Verlag, als Datei im Ordner.
|
||||
*
|
||||
* Steht hier und nicht im Repo, weil der Vorstand sie braucht, nicht die Entwicklung — und
|
||||
* weil sie neben den Fundstücken liegen soll, auf die sie sich bezieht. Der wichtigste Satz
|
||||
* darin ist die Bitte um EINE Freigabe für alle drei Titel: Bayerische Rundschau, inFranken
|
||||
* und Frankenpost gehören zur selben Mediengruppe, drei Einzelanfragen wären unnötig.
|
||||
*/
|
||||
function chronik_verlagsanfrage_text(): string
|
||||
{
|
||||
return <<<TXT
|
||||
ENTWURF — ANFRAGE NACHDRUCKRECHTE
|
||||
=================================
|
||||
|
||||
Für die Vereinschronik zum 120-jährigen Bestehen (2028) wollen wir Zeitungsberichte und
|
||||
Pressefotos verwenden. Die gehören dem Verlag, nicht uns — auch die, in denen wir vorkommen.
|
||||
|
||||
Bitte früh abschicken. Eine Absage im Jahr 2027 wirft das Chronik-Konzept um, eine Absage
|
||||
2026 kostet nichts.
|
||||
|
||||
Empfänger: Mediengruppe Oberfranken – Zeitungsverlage GmbH & Co. KG
|
||||
(deckt Bayerische Rundschau, inFranken.de UND Frankenpost gemeinsam ab)
|
||||
|
||||
Vor dem Versand prüfen: aktuelle Anschrift und zuständige Ansprechperson auf der
|
||||
Verlagsseite nachsehen, die Liste im Anhang aus docs/chronik/register.csv erzeugen.
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Betreff: Nachdruckrechte für die Vereinschronik zum 120-jährigen Jubiläum des
|
||||
TSV 08 Kulmbach (2028)
|
||||
|
||||
Sehr geehrte Damen und Herren,
|
||||
|
||||
der TSV 1908 Kulmbach e. V. begeht im Jahr 2028 sein 120-jähriges Bestehen. Aus diesem
|
||||
Anlass erarbeiten wir eine Vereinschronik.
|
||||
|
||||
Über die Jahrzehnte hat die Bayerische Rundschau das Vereinsleben in Kulmbach begleitet.
|
||||
Ihre Berichte sind für unsere Vereinsgeschichte häufig die einzige erhaltene Quelle.
|
||||
Wir möchten Sie deshalb um die Erlaubnis bitten, einzelne Artikel und Pressefotos in der
|
||||
Chronik abzudrucken — jeweils mit vollständiger Quellenangabe (Titel, Datum, Autorin
|
||||
oder Autor, Bildnachweis).
|
||||
|
||||
Konkret geht es um:
|
||||
|
||||
· Umfang: voraussichtlich [ANZAHL] Artikel und [ANZAHL] Fotos
|
||||
(Aufstellung im Anhang)
|
||||
· Verwendung: gedruckte Festschrift, Auflage ca. [ANZAHL] Exemplare,
|
||||
Abgabe an Mitglieder und Gäste, nicht gewerblich
|
||||
· zusätzlich: Darstellung einzelner Ausschnitte im Historie-Bereich unserer
|
||||
Vereinswebsite tsv08kulmbach.de
|
||||
· Zeitraum: Erscheinen der Chronik im Jubiläumsjahr 2028
|
||||
|
||||
Sollten für die Nutzung Gebühren anfallen, bitten wir um eine Auskunft über die Konditionen.
|
||||
Als gemeinnütziger Verein sind wir für ein Entgegenkommen dankbar.
|
||||
|
||||
Für Rückfragen stehen wir gerne zur Verfügung.
|
||||
|
||||
Mit freundlichen Grüßen
|
||||
|
||||
[NAME], [FUNKTION]
|
||||
TSV 1908 Kulmbach e. V.
|
||||
[ANSCHRIFT / TELEFON / E-MAIL]
|
||||
|
||||
Anlage: Aufstellung der gewünschten Artikel und Fotos
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
NOCH ZU KLÄREN, UNABHÄNGIG VOM VERLAG
|
||||
-------------------------------------
|
||||
· Private Fotos von Mitgliedern: Einverständnis der abgebildeten Personen einholen.
|
||||
Bei Kindern die Eltern fragen. Am einfachsten gleich beim Einsammeln miterledigen.
|
||||
· Wappen anderer Vereine: nur mit deren Zustimmung abbilden.
|
||||
· Fotos ohne bekannten Urheber: Herkunft ermitteln, solange es noch jemand weiß.
|
||||
In zwei Jahren weiß es niemand mehr.
|
||||
TXT;
|
||||
}
|
||||
|
||||
function chronik_readme_text(): string
|
||||
{
|
||||
return <<<TXT
|
||||
VEREINSHISTORIE — MATERIALSAMMLUNG FÜR DAS JUBILÄUM 2028
|
||||
========================================================
|
||||
|
||||
Hier sammeln wir alles, was in die Vereinschronik zum 120-jährigen Bestehen
|
||||
einfließen kann: Fotos, Zeitungsausschnitte, Urkunden, Festschriften, Programmhefte,
|
||||
Mannschaftsbilder, Wimpel, Protokolle.
|
||||
|
||||
Lieber zu viel als zu wenig. Aussortiert wird später.
|
||||
|
||||
|
||||
WO KOMMT ES HIN?
|
||||
----------------
|
||||
In den Ordner des Jahrzehnts, aus dem es stammt:
|
||||
|
||||
1908-1929 1930-1949 1950-1969 1970-1989 1990-2009 2010-2028
|
||||
|
||||
Weißt du das Jahr nicht? -> Undatiert/ (wir ordnen es später zu)
|
||||
Festschrift, Satzung, Urkunde, Protokoll? -> Festschriften-und-Dokumente/
|
||||
|
||||
|
||||
WIE SOLL ES HEISSEN?
|
||||
--------------------
|
||||
Datum zuerst, dann worum es geht:
|
||||
|
||||
1972-07-15_Einweihung-Sportheim.jpg
|
||||
1985-00-00_Mannschaftsfoto-Erste.jpg (Monat/Tag unbekannt -> 00)
|
||||
1962-00-00_Aufstieg-Bericht_BR.jpg (Quelle hinten, hier: Bayerische Rundschau)
|
||||
|
||||
Das Datum vorn sorgt dafür, dass die Liste sich von selbst richtig sortiert.
|
||||
Wenn du den Namen nicht hinbekommst: trotzdem hochladen. Ein falsch benanntes
|
||||
Foto ist unendlich viel besser als ein Foto, das im Schuhkarton bleibt.
|
||||
|
||||
|
||||
WAS UNS BEI JEDEM STÜCK HILFT
|
||||
-----------------------------
|
||||
Wenn du es weißt, schreib es dazu (in den Dateinamen oder als kurze Textdatei daneben):
|
||||
· Wann ungefähr?
|
||||
· Wer ist zu sehen?
|
||||
· Wo aufgenommen?
|
||||
· Wer hat fotografiert / wo stand der Artikel?
|
||||
|
||||
Der letzte Punkt ist der wichtigste und der, der am häufigsten fehlt. Ohne ihn
|
||||
dürfen wir das Bild später womöglich nicht drucken.
|
||||
|
||||
|
||||
RECHTE
|
||||
------
|
||||
Zeitungsartikel und Pressefotos gehören dem Verlag, nicht uns — auch wenn wir
|
||||
darin vorkommen. Was noch freigegeben werden muss, steht in
|
||||
|
||||
00_RECHTE-ZU-KLAEREN.txt
|
||||
|
||||
Private Aufnahmen von Vereinsmitgliedern sind unkritisch, solange die abgebildeten
|
||||
Personen mit einer Veröffentlichung einverstanden sind.
|
||||
|
||||
|
||||
Fragen? Melde dich bei der Vorstandschaft.
|
||||
TXT;
|
||||
}
|
||||
Reference in New Issue
Block a user