Files
Patrick Asmus 7a28f665e0 Initial
2026-06-27 21:08:42 +02:00

5.7 KiB

Techniverse Community

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 Script
  • lastfm-scrobbler.env.example: Beispiel-Konfiguration
  • lastfm-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



© Patrick Asmus · Techniverse Network · Lizenz