<p align="center">
  <img src="busch_radio_spotify/logo.png" alt="Busch-Radio Spotify Bridge" width="180"/>
</p>

<h1 align="center">Busch-Radio Spotify Bridge</h1>

<p align="center">
  Spotify-Musik auf dem Busch-Jäger Unterputz-Internetradio – ohne Bluetooth.
</p>

---

## Problem

Das **Busch-Jäger Unterputz-Internetradio** kann nur Internetradio-Streams abspielen. Es hat kein Bluetooth und keine Spotify-Integration. Spotify-Musik lässt sich damit direkt nicht wiedergeben.

## Lösung

Dieses Home Assistant Add-on erstellt ein virtuelles Spotify Connect-Gerät ([librespot](https://github.com/librespot-org/librespot)) und stellt das Audio als MP3- oder AAC-Stream über Icecast bereit.

### Funktionsweise

```
Spotify-App → [Spotify Connect] → librespot → PCM → ffmpeg → Icecast2 → HTTP-Stream → Busch-Jäger Radio
```

---

## Voraussetzungen

| Anforderung | Details |
|---|---|
| Home Assistant | OS, Supervised oder Container |
| Spotify Premium | Pflicht für Spotify Connect |
| Busch-Jäger Radio | Muss benutzerdefinierte Stream-URLs unterstützen |

---

## Installation

### 1. Repository in HA hinzufügen

1. **Einstellungen → Add-ons → Add-on Store**
2. Drei Punkte oben rechts → **Repositories**
3. URL eintragen: `https://gitea.bitfire.work/retr0/Busch-Radio-Spotify`
4. **Busch-Radio Spotify Bridge** erscheint im Store
5. Installieren (der erste Build dauert ~10–15 Minuten wegen Rust-Kompilierung)

### 2. Add-on konfigurieren

```yaml
device_name: "Busch-Radio"       # Name in der Spotify-App
bitrate: 160                      # 96 / 128 / 160 / 192 kbps
stream_format: "mp3"              # mp3 oder aac
stream_port: 8000                 # HTTP-Port des Streams
stream_mount: "/stream"           # URL-Pfad
icecast_password: "geheim"        # Icecast-Passwort (bitte ändern)
```

### 3. Add-on starten & Spotify autorisieren

Beim **ersten Start** erscheint im Log:

```
Öffne die Einrichtungs-Seite im Browser:
  http://<homeassistant-ip>:5589
```

Öffne diese Adresse im Browser. Der **Einrichtungs-Assistent** führt dich durch die Spotify-Anmeldung:

1. Klicke auf **„Mit Spotify anmelden"**
2. Melde dich mit deinem Spotify-Konto an und bestätige die Berechtigung
3. Dein Browser wird auf `http://127.0.0.1:5588/login?code=...` weitergeleitet – diese Seite ist nicht erreichbar
4. Kopiere die URL aus der Adressleiste und füge sie auf der Einrichtungs-Seite ein
5. Klicke **„Weiter"** – der Assistent leitet die URL korrekt weiter
6. Bei Erfolg erscheint: **Autorisierung erfolgreich!**

Die Credentials werden dauerhaft gespeichert – **dieser Schritt ist nur einmalig nötig**.

### 4. Stream im Radio eintragen

Trage folgende URL im Busch-Jäger Radio ein:

```
http://<homeassistant-ip>:8000/stream
```

### 5. Musik abspielen

1. **Spotify-App** öffnen
2. Abspielgerät wechseln → **„Busch-Radio"** auswählen
3. Das Radio spielt den Stream automatisch ab

---

## Custom Component (optional)

Die Custom Component zeigt den Stream-Status als Media-Player-Entity in HA.

**Installation:**

```bash
cp -r custom_components/busch_radio_spotify /config/custom_components/
# HA neu starten
```

Dann unter **Einstellungen → Integrationen → Busch-Radio Spotify Bridge** einrichten. Das Passwort muss mit `icecast_password` aus der Add-on-Konfiguration übereinstimmen.

**Entity-Attribute:**

| Attribut | Beschreibung |
|---|---|
| `stream_url` | Die URL für das Radio |
| `listeners` | Anzahl aktiver Hörer |
| `source_connected` | Ob Audio gestreamt wird |

---

## Nützliche URLs

| URL | Funktion |
|---|---|
| `http://<ha-ip>:5589` | Einrichtungs-Assistent (OAuth) |
| `http://<ha-ip>:8000/stream` | Stream-URL für das Radio |
| `http://<ha-ip>:8000` | Icecast-Statusseite |

---

## Technische Details

### Komponenten

| Komponente | Funktion |
|---|---|
| [librespot](https://github.com/librespot-org/librespot) main | Spotify Connect Client (PCM-Ausgabe via Pipe) |
| [ffmpeg](https://ffmpeg.org) | PCM → MP3/AAC Transkodierung |
| [Icecast](https://icecast.org) | HTTP-Stream-Server |

### Signalfluss

```
Spotify CDN → librespot (dekodiert, PCM auf stdout)
           → silence-injector (hält Stream bei Pause aufrecht)
           → ffmpeg -re (Echtzeit-Encoding → MP3/AAC)
           → Icecast (HTTP-Stream)
           → Busch-Jäger Radio
```

### Hinweise zum Build

- librespot wird aus dem Quellcode kompiliert (Rust, ~10–15 Min.)
- Der OAuth-Callback-Server bindet an `0.0.0.0` statt `127.0.0.1`, damit der Browser-Login aus dem Heimnetz funktioniert
- Credentials werden in `/data/librespot-cache/` persistent gespeichert

---

## Fehlerbehebung

| Problem | Lösung |
|---|---|
| „Busch-Radio" erscheint nicht in Spotify | Einrichtungs-Seite öffnen: `http://<ha-ip>:5589` |
| Stream nicht erreichbar | Icecast-Status prüfen: `http://<ha-ip>:8000` |
| Stream bricht bei Pause ab | Auf Version 1.0.11+ aktualisieren |
| Songs wechseln zu schnell | Auf Version 1.0.10+ aktualisieren |
| Neu autorisieren | Add-on stoppen → `/data/librespot-cache/credentials.json` löschen → neu starten |
| Build schlägt fehl | Logs im Add-on Store prüfen |

---

## Projektstruktur

```
busch-radio-spotify/
├── busch_radio_spotify/         # Home Assistant Add-on
│   ├── Dockerfile               # Multi-Stage Build (Rust + Alpine)
│   ├── config.yaml              # Add-on Manifest & Optionen
│   ├── build.yaml               # Multi-Arch Konfiguration
│   ├── DOCS.md                  # Add-on Dokumentation (in HA angezeigt)
│   ├── run.sh                   # Startup-Script
│   ├── oauth_helper.py          # OAuth-Einrichtungs-Assistent (Port 5589)
│   ├── icon.png                 # Add-on Icon (Store)
│   └── logo.png                 # Add-on Logo (Detailseite)
├── custom_components/           # Optionale HA Integration
│   └── busch_radio_spotify/
│       ├── __init__.py
│       ├── manifest.json
│       ├── media_player.py
│       ├── config_flow.py
│       └── translations/
├── repository.yaml              # HA Repository-Manifest
└── README.md
```

---

## Rechtliche Hinweise

- Dieses Projekt nutzt **librespot**, eine Open-Source-Reimplementierung des Spotify-Clients
- Audio wird **nicht gespeichert** – ausschließlich live gestreamt
- Ausschließlich für den **privaten Heimgebrauch** gedacht
- **Spotify Premium** ist für Spotify Connect erforderlich

---

## Lizenz

MIT License
