# Kantine BHZ Kiel-Wik – Speiseplan zu iCal Liest die PDF-Speisepläne von [kantine-bhz.de](http://kantine-bhz.de) aus und erzeugt eine iCal-Datei (`.ics`) für den Import in Google Kalender. Jeder Termin enthält alle Tagesgerichte (I. bis V.) und ist auf 12:00 Uhr mittags gesetzt. ## Voraussetzungen - Python 3.9+ (für `zoneinfo`) - Bestehendes venv unter `.venv` ## Installation 1. Virtuelle Umgebung aktivieren: **Windows (PowerShell):** ```powershell .venv\Scripts\Activate.ps1 ``` **Windows (CMD):** ```cmd .venv\Scripts\activate.bat ``` 2. Abhängigkeiten installieren: ```bash pip install -r requirements.txt ``` ## Nutzung ```bash python kantine2ical.py ``` Erzeugt standardmäßig die Datei `kantine_speiseplan.ics` im aktuellen Verzeichnis. **Optionen:** - `-o DATEI` / `--output DATEI` – Ausgabedatei (Standard: `kantine_speiseplan.ics`) - `--url URL` – Basis-URL der Kantine (Standard: `http://kantine-bhz.de`) Beispiel: ```bash python kantine2ical.py -o mein_speiseplan.ics ``` ## Google Kalender Import 1. [Google Kalender](https://calendar.google.com) öffnen 2. Neben „Meine Kalender“ auf das Drei-Punkte-Menü klicken → **Import** 3. Die erzeugte `.ics`-Datei auswählen und dem gewünschten Kalender zuordnen Die Termine erscheinen mit der Zeitzone Europe/Berlin um 12:00 Uhr mit allen fünf Tagesgerichten in der Beschreibung. --- ## Server-Modus (abonnierbare URL) Der Speiseplan kann als **externer Kalender** per URL angeboten werden. Ein Flask-Server liefert die iCal-Daten; Google Kalender und andere Clients können die URL direkt abonnieren. Im Hintergrund wird täglich nach neuen Speiseplan-PDFs gesucht und der Kalender aktualisiert. **Startseite:** Unter der Stamm-URL (`/`) liefert der Server eine **Startseite** mit: - der Abo-URL zum Kopieren (inkl. „Kopieren“-Button), - einer Anleitung zur Einbettung in **Google Kalender** (Schritt für Schritt), - Kurzhinweisen für **andere Kalender-Apps** (Outlook, Apple Kalender, Thunderbird, Android/iOS), - der Angabe, **wann die Speisepläne zuletzt aktualisiert** wurden. Die eigentliche iCal-Datei für Abos und direkten Download ist unter `/calendar.ics` erreichbar. **Voraussetzung:** Für „Von URL hinzufügen“ in Google Kalender muss die Server-URL von außen erreichbar sein (öffentliche IP, Reverse-Proxy oder z. B. ngrok für Tests). 1. Abhängigkeiten installieren (inkl. Flask): `pip install -r requirements.txt` 2. Server starten: ```bash python app.py ``` Oder mit Flask-CLI: `flask --app app run --host 0.0.0.0 --port 5000` 3. Im Browser die **Startseite** aufrufen: `http://:5000/` – dort die Abo-URL kopieren und die Anleitung nutzen. 4. Direkte Abo-URL: `http://:5000/calendar.ics` (bzw. Port durch Ihren Host ersetzen). 5. In Google Kalender: „Andere Kalender hinzufügen“ → „Von URL“ → Abo-URL eintragen. **Konfiguration (optional, Umgebungsvariablen):** - `KANTINE_BASE_URL` – Basis-URL der Kantine (Standard: `http://kantine-bhz.de`) - `REFRESH_INTERVAL_SECONDS` – Sekunden zwischen Aktualisierungen (Standard: 86400 = 24 h) - `PUBLIC_URL` – Öffentliche Basis-URL (z. B. `https://kantine.elpatron.me`). Wenn gesetzt, wird diese URL für die Kalender-Abo-URL auf der Startseite verwendet. **Empfohlen hinter HTTPS-Proxy**, falls der Proxy keine `X-Forwarded-Proto`/`X-Forwarded-Host`-Header sendet – sonst erscheint dort weiterhin `http://`. --- ## Docker (Production) Für den Betrieb als Container (z. B. auf einem Server): **Build und Run:** ```bash docker build -t kantine2ical . docker run -p 8000:8000 -e PUBLIC_URL=https://kantine.elpatron.me kantine2ical ``` (Ersetzen Sie `https://kantine.elpatron.me` durch Ihre öffentliche HTTPS-URL. Dann zeigt die Startseite die Kalender-URL mit `https://`.) - **Startseite** (Anleitung + Abo-URL): `http://:8000/` bzw. Ihre HTTPS-URL - **iCal-Abo:** `http://:8000/calendar.ics` bzw. `https:///calendar.ics` **Mit Docker Compose:** ```bash docker compose up -d ``` Der Container läuft auf Port 8000 und startet bei Bedarf neu (`restart: unless-stopped`). **Hinweis:** Für den Einsatz in Production wird ein **Reverse-Proxy mit HTTPS** (z. B. Traefik, Caddy oder nginx) vor dem Container empfohlen, damit Google die Kalender-URL zuverlässig abrufen kann.