SteamCal Anleitung

Steam- & GOG-Wunschliste → Kalender | Installation, Konfiguration & Wartung

Dateistruktur

DateiBeschreibung
config.phpKonfiguration (Steam-ID, GOG-Benutzer, Cache, Token)
SteamWishlist.phpSteam-Wunschliste: API-Abfrage, Cache, ICS-Erzeugung
GogWishlist.phpGOG-Wunschliste: Seitenabruf, Cache, ICS-Erzeugung
WishlistMerge.phpOrdnet Steam- und GOG-Spiele einander zu (Titel-Match)
IcsBuilder.phpGemeinsame ICS-Erzeugung (RFC 5545, Zeilenfaltung)
FeedBuilder.phpZusammenführung beider Wunschlisten, Feed-Auswahl
index.phpHTML-Kalender-Ansicht (Webseite)
feed.phpICS-Feed für Kalender-Abos (Nextcloud, Google, etc.)
export.phpICS-Datei-Download (einmaliger Import)
gog-feed.phpICS-Feed nur mit der GOG-Wunschliste
gog-export.phpICS-Datei-Download nur mit der GOG-Wunschliste
refresh.phpCache-Neuaufbau (token-geschützt)
cron-refresh.phpCron-Hilfsskript (intern)
setup-cron.shInteraktives Cron-Setup-Skript
clear-cache.phpCache komplett löschen (beide Wunschlisten)
debug.phpDiagnose: API-Zugriff, GOG-Seitenabruf, Title-Match
hilfe.htmlDiese Anleitung
style.cssSteam-Dark-Theme Styling
.htaccessApache-Konfiguration (Bludit-Kompatibilität)
cache/Cache-Verzeichnis (wird automatisch erstellt)

Installation

Voraussetzungen

Schritt-für-Schritt

  1. Alle Dateien in den Webserver-Ordner kopieren (z.B. /var/www/html/SteamCal/)
  2. Verzeichnisrechte prüfen:
    chown www-data:www-data /var/www/html/SteamCal/cache && chmod 755 /var/www/html/SteamCal/cache
  3. config.php öffnen und Steam-ID sowie GOG-Benutzernamen eintragen (siehe Konfiguration)
  4. Cache initial aufbauen: https://deinedomain.de/SteamCal/refresh.php?token=DEIN_TOKEN
  5. Ergebnis prüfen: https://deinedomain.de/SteamCal/
Bludit-Nutzer: In der Root-.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

ParameterBeschreibung
steam_vanity_urlDein Steam-Benutzername (aus der Profil-URL, z.B. steampowered.com/id/LAN-Taverne)
steam_id_64Deine Steam-ID im64er-Format. Wird von der App automatisch aus dem Benutzernamen aufgelöst. Kann auch unter steamid.io ermittelt werden.
cache_dirPfad zum Cache-Verzeichnis. Standard: __DIR__ . '/cache'
cache_ttlCache-Lebensdauer in Sekunden. 1800 = 30 Minuten.
calendar_nameName des Steam-Kalenders in der ICS-Datei und im Nextcloud/Google Kalender.
refresh_intervalAktualisierungsintervall in Minuten (RFC 7986 REFRESH-INTERVAL in der ICS).
secret_tokenSchlüssel für den refresh.php-Endpunkt. Nur wer diesen Token kennt, kann den Cache neu aufbauen.
gog_enabledtrue = GOG-Wunschliste wird mitgeladen. false = nur Steam.
gog_usernameDein GOG-Benutzername, also der Teil hinter gog.com/u/ in deiner Wunschlisten-URL.
gog_languageSprachcode der GOG-Seite, z.B. de oder en. Bestimmt Datumsformat und Genres.
gog_calendar_nameName des GOG-Kalenders (nur gog-feed.php).
calendar_name_allName des kombinierten Kalenders (Standard: feed.php).

Steam-ID herausfinden

  1. Gehe zu https://steamcommunity.com/id/DEIN_NAME
  2. Rechtsklick → Seite Quelltext anzeigen
  3. Suche nach steamid → die Nummer ist deine steam_id_64
  4. 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.

  1. In GOG anmelden und unter Profil → Einstellungen → Datenschutz die Wunschliste auf „Öffentlich” stellen
  2. gog_username in config.php auf den Namen in der URL setzen
  3. 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):

  1. Normalisierter Titel (Kleinbuchstaben, ohne Sonderzeichen, Ü/ö/ü/ß umgeschrieben)
  2. Zusatz wie „Game of the Year Edition”, „Complete Edition”, „Deluxe”, „Remastered” oder eine Jahreszahl wird entfernt
  3. Nur wenn der so bereinigte Titel auf beiden Listen eindeutig ist, werden die Einträge zusammengeführt
  4. Soundtracks, DLCs, Demos und Fortsetzungen (z.B. „Game 2”, „II”) werden bewusst nicht zusammengeführt
Welche GOG-Spiele keinem Steam-Eintrag zugeordnet wurden, zeigt 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

EndpunktInhalt
feed.phpStandard-Feed: alle Spiele, die auf mindestens einer der beiden Wunschlisten stehen (zusammengeführt, keine Doppelungen)
feed.php?store=steamNur Steam-Wunschliste (unverändertes Verhalten der alten Version)
feed.php?store=gogNur GOG-Wunschliste
gog-feed.phpKurzform von feed.php?store=gog
export.phpICS-Download, kombinierte Wunschliste
export.php?store=steamICS-Download nur Steam
gog-export.phpICS-Download nur GOG
refresh.php?token=...Aktualisiert beide Wunschlisten
refresh.php?token=...&store=gogAktualisiert 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.

Der Endpunkt gibt JSON zurück: {"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
Tipp: Das Skript setup-cron.sh führt dich interaktiv durch die Cron-Konfiguration.

Kalender abonnieren (Nextcloud)

  1. Nextcloud Calendar öffnen
  2. Auf + (Neuen Kalender abonnieren) klicken
  3. Link-Adresse eingeben: https://deinedomain.de/SteamCal/feed.php
  4. Kalender-Name vergeben (z.B. "Steam Wishlist")
  5. Fertig → Nextcloud aktualisiert automatisch alle 60 Minuten

Alternativen

MethodeBeschreibung
feed.phpAbo-Feed mit Auto-Refresh (empfohlen für Nextcloud, Google Calendar, Thunderbird)
export.phpEinmaliger Download als .ics-Datei (für manuelle Importe)
Der Feed enthält RFC 7986 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

GOG-Wunschliste bleibt leer

Spiel wird nur auf einem Store angezeigt

Bludit zeigt "404 Not Found"

Cache-Refresh schlägt fehl

Nextcloud aktualisiert nicht