AzuraCast Last.fm Scrobbler
Kleines Python-Script, das aktuell laufende AzuraCast-Tracks an Last.fm scrobbelt.
🏰 Website · 📰 Community · 🐘 Mastodon · 💬 Support
Überblick
Dieses Script liest die öffentlichen Now-Playing-Daten einer AzuraCast-Station und meldet den aktuellen Song an Last.fm. Es ist für Cron gedacht: Jeder Lauf prüft den aktuellen Track, setzt einmal pro Track den Last.fm-Status "Now Playing" und scrobbelt den Track, sobald genug Laufzeit vergangen ist.
Funktionen
- liest AzuraCast Now-Playing-Daten über die öffentliche API
- setzt Last.fm "Now Playing"
- scrobbelt Tracks nur einmal pro AzuraCast-Play
- speichert den lokalen Zustand in einer kleinen JSON-Datei
- braucht keine externen Python-Pakete
- kann per Cron oder als Dauerprozess laufen
- kann Albumdaten optional an Last.fm mitsenden oder weglassen
Dateien
lastfm_scrobbler.py: das Scriptlastfm-scrobbler.env.example: Beispiel-Konfigurationlastfm-scrobbler.env: echte Konfiguration, wird nicht ins Git aufgenommen.lastfm_scrobbler_state.json: lokaler Zustand, wird automatisch erstellt
Voraussetzungen
- Python 3
- erreichbare AzuraCast-Instanz
- Last.fm API-Key und Shared Secret
- Last.fm Session-Key für den Account, auf den gescrobbelt werden soll
Installation
Beispiel im AzuraCast-Projektordner:
cd /mnt/local/dockerdata2/docker-container/azuracast
mkdir -p scripts
cp lastfm_scrobbler.py scripts/
cp lastfm-scrobbler.env.example scripts/lastfm-scrobbler.env
chmod +x scripts/lastfm_scrobbler.py
chmod 600 scripts/lastfm-scrobbler.env
Dann scripts/lastfm-scrobbler.env ausfüllen:
AZURACAST_BASE_URL=https://deine-azuracast-url.example
AZURACAST_STATION_SHORTCODE=main
LASTFM_API_KEY=...
LASTFM_SHARED_SECRET=...
LASTFM_SESSION_KEY=...
LASTFM_SEND_ALBUM=1
Alternativ kann statt AZURACAST_BASE_URL und AZURACAST_STATION_SHORTCODE direkt eine Now-Playing-URL gesetzt werden:
AZURACAST_NOWPLAYING_URL=https://deine-azuracast-url.example/api/nowplaying_static/main.json
Last.fm Session-Key erzeugen
Last.fm API-Key und Shared Secret erstellst du unter:
https://www.last.fm/api/account/create
Danach im Script-Verzeichnis:
./lastfm_scrobbler.py --get-token
Das Script gibt einen Token und eine Freigabe-URL aus. Die URL im Browser öffnen und den Zugriff erlauben.
Danach den Token aus der ersten Ausgabe verwenden:
./lastfm_scrobbler.py --get-session TOKEN_AUS_DER_AUSGABE
TOKEN_AUS_DER_AUSGABE ist nur ein Platzhalter. Dort muss der echte Token stehen, der vorher bei --get-token hinter Token: ausgegeben wurde.
Die Ausgabe enthält dann:
LASTFM_SESSION_KEY=...
Diesen Wert in lastfm-scrobbler.env eintragen.
Testlauf
./lastfm_scrobbler.py --dry-run
Wenn das gut aussieht:
./lastfm_scrobbler.py
Cron
Empfohlen: jede Minute ausführen.
Wenn Script und Env im scripts/-Ordner des AzuraCast-Projekts liegen:
* * * * * cd /mnt/local/dockerdata2/docker-container/azuracast && /usr/bin/env python3 scripts/lastfm_scrobbler.py >> scripts/lastfm-scrobbler.log 2>&1
Cron bearbeiten:
crontab -e
Dauerlauf statt Cron
./lastfm_scrobbler.py --daemon --interval 60
Cron ist für diese Aufgabe meistens einfacher und robuster.
Scrobble-Logik
Das Script scrobbelt nicht sofort beim ersten Erkennen eines Songs. Es wartet, bis mindestens die Hälfte des Tracks oder maximal 4 Minuten gespielt wurden.
Bei fehlender Track-Länge wartet es standardmäßig 240 Sekunden. Dadurch werden Songs nicht gescrobbelt, wenn sie nur kurz angelaufen sind.
Damit Cron den gleichen Song nicht mehrfach scrobbelt, merkt sich das Script bereits verarbeitete Tracks in:
.lastfm_scrobbler_state.json
Der interne Schlüssel basiert auf Artist, Titel, Album und AzuraCast-played_at.
Albumdaten
Last.fm erlaubt beim Scrobbeln optionale Albumdaten, aber kein Coverbild. Cover werden von Last.fm selbst anhand der Metadaten gematched.
Wenn AzuraCast saubere Albumdaten liefert, kann das Matching besser werden:
LASTFM_SEND_ALBUM=1
Wenn Albumdaten ungenau sind oder Last.fm dadurch schlechter matched, kann man sie abschalten:
LASTFM_SEND_ALBUM=0
Wichtige Optionen
LASTFM_MIN_SCROBBLE_ELAPSED_SECONDS=30
Untergrenze. Vor dieser Laufzeit wird nie gescrobbelt.
LASTFM_NO_DURATION_SCROBBLE_SECONDS=240
Fallback, falls AzuraCast keine Track-Länge liefert.
LASTFM_SCROBBLER_INTERVAL_SECONDS=60
Nur für --daemon relevant. Bei Cron entscheidet der Cron-Eintrag.
Sicherheit
Die echte Datei lastfm-scrobbler.env enthält API-Key, Shared Secret und Session-Key. Sie sollte nicht committed werden.
Empfohlene Rechte auf Linux:
chmod 600 lastfm-scrobbler.env
Quellen
- AzuraCast Now Playing API: https://www.azuracast.com/docs/developers/now-playing-data/
- Last.fm
track.scrobble: https://www.last.fm/api/show/track.scrobble - Last.fm Auth: https://www.last.fm/api/authspec
© Patrick Asmus · Techniverse Network · Lizenz