{% extends "base.html" %} {% set active = 'crawler' %} {% block title %}Crawler{% endblock %} {% block content %}

Crawler

{% if preview %}
Crawler-Ergebnis — Bitte prüfen und bestätigen

Die Daten wurden noch nicht übernommen. Bitte die Zusammenfassung prüfen und anschließend „Übernehmen“ klicken — oder „Verwerfen“ um den Lauf zu verwerfen.

Teams gefunden
{{ preview.team_count }}
Spieltermine gesamt
{{ preview.termine_count }}
{% for t in preview.teams %} {% endfor %}
Mannschaft Termine
{{ t.name }} {% if t.termine > 0 %} {{ t.termine }} {% else %} 0 {% endif %}
{% endif %}
Konfiguration
VereinsID
{% if verein_id %} {{ verein_id }} {% else %} nicht gesetzt  Einstellungen → {% endif %}
Skript
{% if script_exists %} gefunden {% else %} nicht gefunden {% endif %}
Letzter Stand
{{ generated_at }}
{% if script_exists and verein_id %}
{% elif not verein_id %}

Bitte zuerst die VereinsID in den Einstellungen setzen.

{% else %}

Crawler-Skript nicht gefunden. CRAWLER_SCRIPT in der .env prüfen.

{% endif %}
Hinweise
Was macht das Crawler-Skript?

spielplan_crawler.py ruft die fussball.de-API ab und schreibt alle Vereins-, Team- und Spielplandaten in die Datendatei (DATA_FILE). Spieler-Slots werden mit Platzhalternamen befüllt (Seed 42 → reproduzierbar), damit die App sofort einsatzbereit ist — echte Namen trägt der Trainer per CSV-Import oder manuell ein.

Ablauf

  1. Alle Mannschaften des Vereins laden (FUSSBALL_DE_CLUB_ID)
  2. Duplikate und Futsaljugend-Teams herausfiltern
  3. Team-eigene Spielpläne abrufen und parsen
  4. Spieler-Slots je Altersklasse generieren (Platzhalternamen)
  5. Ergebnis als JSON in DATA_FILE schreiben
  6. Server lädt die neue Datei ohne Neustart

Umgebungsvariablen

Variable Wert / Standard Beschreibung
FUSSBALL_DE_CLUB_ID {{ verein_id or '— nicht gesetzt —' }} Vereins-ID von fussball.de — in den Einstellungen setzen
FUSSBALL_DE_HEIM_KEYWORDS {{ heim_keywords or 'Cremlingen, TuS (Standard)' }} Komma-getrennte Stichwörter zur Erkennung von Heimspielen
DATA_FILE {{ data_file }} Ausgabepfad für die generierte JSON-Datendatei
CRAWLER_SCRIPT {{ crawler_script or '— nicht gesetzt —' }} Absoluter Pfad zum Skript im Container / auf dem Host
{% if cron.available %}
Automatischer Zeitplan (Cron)
{% if cron.active %}
Status
aktiv
Uhrzeit
{{ '%02d'|format(cron.hour) }}:{{ '%02d'|format(cron.minute) }} Uhr — täglich
{% else %}

Kein Cron-Job aktiv. Crawler wird nicht automatisch ausgeführt.

{% endif %}

Eingetragen in der Crontab des laufenden Systembenutzers. Log: {{ cron.log_hint }}

{% else %}
Automatischer Zeitplan (Cron)

crontab nicht verfügbar (Docker ohne Cron-Daemon oder kein crontab-Binary). Alternativ den Crawler per externem Scheduler oder POST /crawler/run mit X-Crawler-Key automatisieren.

{% endif %} {% if last_run %}
Letzter Crawl-Lauf — {% if last_run.success %} Erfolgreich {% else %} Fehlgeschlagen {% endif %}
Zeitpunkt
{{ last_run.timestamp }}
{% if last_run.success %}
Teams
{{ last_run.teams }}
Termine
{{ last_run.termine }}
{% endif %}
{% if last_run.success and last_run.output %}
Crawler-Ausgabe anzeigen
{{ last_run.output }}
{% endif %} {% if not last_run.success %}

Fehlerausgabe:

{{ last_run.error or last_run.output }}
{% endif %}
{% else %}
Letzter Crawl-Lauf

Noch kein Crawl ausgeführt seit Serverstart.

{% endif %} {% endblock %}