Dateistruktur
| Datei | Beschreibung |
|---|---|
| config.php | Konfiguration (Steam-ID, GOG-Benutzer, Cache, Token) |
| SteamWishlist.php | Steam-Wunschliste: API-Abfrage, Cache, ICS-Erzeugung |
| GogWishlist.php | GOG-Wunschliste: Seitenabruf, Cache, ICS-Erzeugung |
| WishlistMerge.php | Ordnet Steam- und GOG-Spiele einander zu (Titel-Match) |
| IcsBuilder.php | Gemeinsame ICS-Erzeugung (RFC 5545, Zeilenfaltung) |
| FeedBuilder.php | Zusammenführung beider Wunschlisten, Feed-Auswahl |
| index.php | HTML-Kalender-Ansicht (Webseite) |
| feed.php | ICS-Feed für Kalender-Abos (Nextcloud, Google, etc.) |
| export.php | ICS-Datei-Download (einmaliger Import) |
| gog-feed.php | ICS-Feed nur mit der GOG-Wunschliste |
| gog-export.php | ICS-Datei-Download nur mit der GOG-Wunschliste |
| refresh.php | Cache-Neuaufbau (token-geschützt) |
| cron-refresh.php | Cron-Hilfsskript (intern) |
| setup-cron.sh | Interaktives Cron-Setup-Skript |
| clear-cache.php | Cache komplett löschen (beide Wunschlisten) |
| debug.php | Diagnose: API-Zugriff, GOG-Seitenabruf, Title-Match |
| hilfe.html | Diese Anleitung |
| style.css | Steam-Dark-Theme Styling |
| .htaccess | Apache-Konfiguration (Bludit-Kompatibilität) |
| cache/ | Cache-Verzeichnis (wird automatisch erstellt) |
Installation
Voraussetzungen
- Apache Webserver mit PHP 8.x
- PHP-Erweiterungen:
curl,json,fileinfo - Schreibrechte im
cache/-Verzeichnis für den Webserver - (Optional) Bludit CMS - via
.htaccessbereits konfiguriert
Schritt-für-Schritt
- Alle Dateien in den Webserver-Ordner kopieren (z.B.
/var/www/html/SteamCal/) - Verzeichnisrechte prüfen:
chown www-data:www-data /var/www/html/SteamCal/cache && chmod 755 /var/www/html/SteamCal/cache config.phpöffnen und Steam-ID sowie GOG-Benutzernamen eintragen (siehe Konfiguration)- Cache initial aufbauen:
https://deinedomain.de/SteamCal/refresh.php?token=DEIN_TOKEN - Ergebnis prüfen:
https://deinedomain.de/SteamCal/
.htaccess muss folgendes stehen, damit Bludit die PHP-Dateien nicht abfängt:
RewriteRule ^SteamCal/ - [L]
Konfiguration (config.php)
Die gesamte Konfiguration erfolgt in einer einzigen Datei:
<?php
return [
'steam_vanity_url' => 'LAN-Taverne',
'steam_id_64' => '76561198006558270',
'cache_dir' => __DIR__ . '/cache',
'cache_ttl' => 1800,
'calendar_name' => 'LAN-Taverne Steam Wishlist',
'refresh_interval' => 60,
'secret_token' => 'DEIN_SICHERHEITSTOKEN',
'gog_enabled' => true,
'gog_username' => 'FoxLANTaverne',
'gog_language' => 'de',
'gog_calendar_name' => 'LAN-Taverne GOG Wishlist',
'calendar_name_all' => 'LAN-Taverne Wunschliste (Steam + GOG)',
];
Parameter-Erklärung
| Parameter | Beschreibung |
|---|---|
steam_vanity_url | Dein Steam-Benutzername (aus der Profil-URL, z.B. steampowered.com/id/LAN-Taverne) |
steam_id_64 | Deine Steam-ID im64er-Format. Wird von der App automatisch aus dem Benutzernamen aufgelöst. Kann auch unter steamid.io ermittelt werden. |
cache_dir | Pfad zum Cache-Verzeichnis. Standard: __DIR__ . '/cache' |
cache_ttl | Cache-Lebensdauer in Sekunden. 1800 = 30 Minuten. |
calendar_name | Name des Steam-Kalenders in der ICS-Datei und im Nextcloud/Google Kalender. |
refresh_interval | Aktualisierungsintervall in Minuten (RFC 7986 REFRESH-INTERVAL in der ICS). |
secret_token | Schlüssel für den refresh.php-Endpunkt. Nur wer diesen Token kennt, kann den Cache neu aufbauen. |
gog_enabled | true = GOG-Wunschliste wird mitgeladen. false = nur Steam. |
gog_username | Dein GOG-Benutzername, also der Teil hinter gog.com/u/ in deiner Wunschlisten-URL. |
gog_language | Sprachcode der GOG-Seite, z.B. de oder en. Bestimmt Datumsformat und Genres. |
gog_calendar_name | Name des GOG-Kalenders (nur gog-feed.php). |
calendar_name_all | Name des kombinierten Kalenders (Standard: feed.php). |
Steam-ID herausfinden
- Gehe zu
https://steamcommunity.com/id/DEIN_NAME - Rechtsklick → Seite Quelltext anzeigen
- Suche nach
steamid→ die Nummer ist deinesteam_id_64 - Oder nutze
https://steamid.io/lookup/DEIN_NAME
Sicheren Token generieren
Erzeuge einen zufälligen Token mit:
php -r "echo bin2hex(random_bytes(16));"
Das Ergebnis als Wert für secret_token eintragen.
GOG-Wunschliste
Seit der Erweiterung werden beide Wunschlisten geladen und auf der Webseite zusammengeführt. Jede Spiel-Karte zeigt über Badges, ob das Spiel auf Steam, auf GOG oder auf beiden Wunschlisten steht.
Wie die GOG-Daten geholt werden
GOG bietet keine öffentliche Wunschlisten-API an. Die App lädt daher die öffentliche Seite
https://www.gog.com/de/u/DEIN_NAME/wishlist und liest das dort eingebettete JSON-Objekt
gogData aus (Produkte, Release-Datum, Preis, Genres, Entwickler, Bild). Ein Login ist dafür nicht nötig – die Wunschliste muss lediglich öffentlich sein.
- In GOG anmelden und unter Profil → Einstellungen → Datenschutz die Wunschliste auf „Öffentlich” stellen
gog_usernameinconfig.phpauf den Namen in der URL setzen- Cache neu aufbauen:
refresh.php?token=DEIN_TOKEN
Zuordnung Steam ↔ GOG
Damit ein Spiel nur einmal im Kalender auftaucht, werden die beiden Listen über den Titel zusammengeführt (WishlistMerge.php):
- Normalisierter Titel (Kleinbuchstaben, ohne Sonderzeichen, Ü/ö/ü/ß umgeschrieben)
- Zusatz wie „Game of the Year Edition”, „Complete Edition”, „Deluxe”, „Remastered” oder eine Jahreszahl wird entfernt
- Nur wenn der so bereinigte Titel auf beiden Listen eindeutig ist, werden die Einträge zusammengeführt
- Soundtracks, DLCs, Demos und Fortsetzungen (z.B. „Game 2”, „II”) werden bewusst nicht zusammengeführt
debug.php unter
»MATCHING« an.
Filter auf der Webseite
Über die Schaltflächen Alle / Steam / GOG / Beide lässt sich die Ansicht filtern; die Zähler in den Schaltflächen passen sich dabei an. Die Zuordnung erfolgt im Browser, die Webseite funktioniert also auch ohne JavaScript vollständig (nur die Filter bleiben dann inaktiv).
Feeds und Downloads
| Endpunkt | Inhalt |
|---|---|
feed.php | Standard-Feed: alle Spiele, die auf mindestens einer der beiden Wunschlisten stehen (zusammengeführt, keine Doppelungen) |
feed.php?store=steam | Nur Steam-Wunschliste (unverändertes Verhalten der alten Version) |
feed.php?store=gog | Nur GOG-Wunschliste |
gog-feed.php | Kurzform von feed.php?store=gog |
export.php | ICS-Download, kombinierte Wunschliste |
export.php?store=steam | ICS-Download nur Steam |
gog-export.php | ICS-Download nur GOG |
refresh.php?token=... | Aktualisiert beide Wunschlisten |
refresh.php?token=...&store=gog | Aktualisiert nur die GOG-Wunschliste |
Was passiert ohne Release-Datum?
GOG nutzt intern den Wert -7200 als Platzhalter für „Datum unbekannt”. Solche Spiele landen in der Gruppe „Kein Release-Datum bekannt”; im Kalender erscheinen sie am 31.12. des aktuellen Jahres (gleiches Verhalten wie bei Steam). Spiele mit isComingSoon werden als „bevorstehend” angezeigt, auch wenn noch kein Datum feststeht.
Cache & Aktualisierung
Die App nutzt ein Cache-System: Webseite und ICS-Feed lesen nur aus dem Cache. Der Cache wird ausschließlich durch Aufruf von refresh.php aktualisiert.
Cache manuell neu aufbauen
https://deinedomain.de/SteamCal/refresh.php?token=DEIN_TOKEN
Ruft die Steam API und die GOG-Wunschlistenseite ab und aktualisiert alle Spiel-Details. Dauer: ca. 1-2 Minuten bei ~100 Steam-Spielen. Mit &store=steam bzw. &store=gog wird nur ein Store aktualisiert.
{"status":"ok","steam_games_count":111,"gog_games_count":37,"games_count":147,...}
Cache löschen
https://deinedomain.de/SteamCal/clear-cache.php
Cron-Job einrichten (empfohlen)
Für automatische stündliche Aktualisierung auf dem Server:
# Crontab öffnen
crontab -e
# Jede Stunde neu aufbauen (anpassen!):
0 * * * * curl -s "https://deinedomain.de/SteamCal/refresh.php?token=DEIN_TOKEN" > /dev/null 2>&1
setup-cron.sh führt dich interaktiv durch die Cron-Konfiguration.
Kalender abonnieren (Nextcloud)
- Nextcloud Calendar öffnen
- Auf + (Neuen Kalender abonnieren) klicken
- Link-Adresse eingeben:
https://deinedomain.de/SteamCal/feed.php - Kalender-Name vergeben (z.B. "Steam Wishlist")
- Fertig → Nextcloud aktualisiert automatisch alle 60 Minuten
Alternativen
| Methode | Beschreibung |
|---|---|
feed.php | Abo-Feed mit Auto-Refresh (empfohlen für Nextcloud, Google Calendar, Thunderbird) |
export.php | Einmaliger Download als .ics-Datei (für manuelle Importe) |
REFRESH-INTERVAL;VALUE=DURATION:PT60M und X-PUBLISHED-TTL:PT60M. Nextcloud und andere Kalender-Apps erkennen das Intervall automatisch.
Bludit-Kompatibilität
Da Bludit CMS alle Anfragen über seine eigene Router-Logik verarbeitet, muss RewriteEngine Off im SteamCal-Verzeichnis deaktiviert werden.
Root-.htaccess (im Webserver-Root)
Folgende Zeile vor den Bludit-Rewrite-Regeln einfügen:
RewriteRule ^SteamCal/ - [L]
SteamCal/.htaccess
RewriteEngine Off
<IfModule mod_php.c>
php_flag display_errors On
php_value error_reporting E_ALL
</IfModule>
<FilesMatch "\.(php)$">
SetHandler application/x-httpd-php
</FilesMatch>
Fehlerbehebung
Keine Spiele im Kalender
- Prüfe ob die
cache/-Dateien vorhanden sind - Cache neu aufbauen:
refresh.php?token=DEIN_TOKENaufrufen - Schreibrechte prüfen:
ls -la /var/www/html/SteamCal/cache/
GOG-Wunschliste bleibt leer
- In GOG prüfen, ob die Wunschliste öffentlich ist (sonst liefert die Seite keine Produkte)
gog_usernameinconfig.phpprüfen: darf keine Leerzeichen enthalten, muss exakt der Name hintergog.com/u/seindebug.phpaufrufen – der Abschnitt „TEST WUNSCHLISTEN-SEITE (GOG)“ zeigt die HTML-Größe und obgogDatagefunden wurde- Falls GOG den Seitenaufbau geändert hat:
debug.phpmeldet „gogData NICHT gefunden” – dann mussGogWishlist::parseGogData()angepasst werden - Prüfen, ob
gog_enabledinconfig.phpnicht auffalsesteht
Spiel wird nur auf einem Store angezeigt
- Die Zusammenführung erfolgt über den Spieltitel. Abweichende Editionen („Complete“ ↔ „Standard”) werden erkannt, aber nicht bei nahezu gleichnamigen Reihen
- Unter
debug.php→ MATCHING steht, welche GOG-Spiele kein Gegenstück auf Steam haben
Bludit zeigt "404 Not Found"
- Prüfe ob
RewriteRule ^SteamCal/ - [L]in der Root-.htaccesssteht - Prüfe ob
RewriteEngine OffinSteamCal/.htaccessgesetzt ist
Cache-Refresh schlägt fehl
- Prüfe den Token in
config.php(der im Browser muss genau übereinstimmen) - PHP
max_execution_timeprüfen: Inrefresh.phpwirdset_time_limit(300)gesetzt - Server-Logs prüfen:
/var/log/apache2/error.log
Nextcloud aktualisiert nicht
- Prüfe ob
feed.phpim Browser die ICS-Datei korrekt ausgibt - Nextcloud-Seite neu laden (Strg+Shift+R)
- In Nextcloud Calendar: Abo-URL neu eintragen