#!/usr/bin/env python3 """OAuth-Hilfsserver für die Busch-Radio Spotify Bridge. Stellt unter http://:5589 eine Hilfsseite bereit, die den einmaligen Spotify-Autorisierungsprozess vereinfacht. Endpoints: GET / -> HTML-Hilfsseite GET /auth-url -> JSON: {"url": "https://accounts.spotify.com/..."} GET /status -> JSON: {"authed": true/false} """ import http.server import json import os import sys import urllib.parse HA_IP = sys.argv[1] if len(sys.argv) > 1 else "homeassistant.local" AUTH_URL_FILE = "/tmp/busch-radio/auth_url.txt" CRED_FILE = "/data/librespot-cache/credentials.json" HTML = f""" Busch-Radio – Spotify-Anmeldung

🎵 Busch-Radio – Spotify-Anmeldung

Einmaliger Einrichtungs-Assistent • Credentials werden dauerhaft gespeichert.

✓ Bereits autorisiert – keine erneute Anmeldung nötig.

Schritt 1 – Spotify-Anmeldung starten

1

Klicke auf den Link, um die Spotify-Autorisierung zu öffnen.

Warte auf librespot…

Du benötigst ein Spotify-Premium-Konto.

2

Melde dich mit deinem Spotify-Konto an und bestätige die Berechtigungsanfrage.

Schritt 2 – Weiterleitung abschließen

3

Nach der Anmeldung leitet Spotify auf eine Seite weiter, die nicht erreichbar ist:

http://127.0.0.1:5588/login?code=…

Kopiere diese URL vollständig aus der Adressleiste.

4

Füge die kopierte URL hier ein und klicke auf „Weiter“:

Bitte eine gültige URL einfügen (beginnt mit http://127.0.0.1:5588).

5

Im neu geöffneten Tab erscheint: Autorisierung erfolgreich!

Das Add-on startet danach automatisch durch. Diese Seite kann geschlossen werden.

""" class Handler(http.server.BaseHTTPRequestHandler): def log_message(self, *args): pass def do_GET(self): path = urllib.parse.urlparse(self.path).path if path == "/auth-url": url = None if os.path.exists(AUTH_URL_FILE): with open(AUTH_URL_FILE) as f: url = f.read().strip() or None body = json.dumps({"url": url}).encode() self._respond(200, "application/json", body) elif path == "/status": body = json.dumps({"authed": os.path.exists(CRED_FILE)}).encode() self._respond(200, "application/json", body) else: body = HTML.encode() self._respond(200, "text/html; charset=utf-8", body) def _respond(self, code, content_type, body): self.send_response(code) self.send_header("Content-Type", content_type) self.send_header("Content-Length", str(len(body))) self.end_headers() self.wfile.write(body) if __name__ == "__main__": server = http.server.HTTPServer(("0.0.0.0", 5589), Handler) server.serve_forever()