'Local music' lastig te luisteren? Niet op mijn pi!
De aanleiding
Ergens tussen Kerst en Nieuwjaar keek ik (weer…) naar die bakken met CD’s in de trapkast. Een stuk of 300 schijfjes die ik in geen jaren had aangeraakt, maar waar wel een hoop goede muziek tussen zit - Jazz, Klassiek, Rock, Fado, van alles. En terwijl ik naar die stelling staarde, dacht ik: dit moet toch anders kunnen?
Spotify? Nee. Tidal of Qobuz? Zou kunnen, maar dat is weer een abonnement erbij. En eerlijk: ik heb die muziek al. Gekocht en betaald, lang voordat streaming een ding was.
Dus de vraag was: kan ik die CD’s digitaliseren en streamen naar mijn telefoon – thuis én onderweg – zonder BigTech, zonder maandelijkse kosten, gewoon vanaf mijn eigen Pi?
Spoiler: ja. En dat ging een stuk makkelijker dan ik had verwacht.
Wat ik al had
De Pi5 draaide al een tijdje als centrale hub voor van alles:
- Pi-hole voor netwerkbrede ad-blocking
- Nextcloud voor bestanden en foto’s
- Home Assistant voor domotica
- Een mailserver
- Hugo websites
Daarnaast hing er al een 1TB SSD aan de pi voor Nextcloud-opslag. Ruimte genoeg dus nog voor nieuwe projecten.
Navidrome
Na wat rondkijken kwam ik uit bij Navidrome. Open source, lichtgewicht, perfect voor een Pi, en – ook niet onbelangrijk – compatible met het Subsonic-protocol, wat in mijn geval inhoudt, dat vrijwel elke muziek-app ermee overweg kan.
De setup was simpel, als in: bekend. Ik wilde een docker-compose.yml in een nieuwe map:
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
restart: unless-stopped
user: "1000:1000"
ports:
- "4533:4533"
environment:
ND_SCANSCHEDULE: 1h
ND_LOGLEVEL: info
ND_SESSIONTIMEOUT: 24h
volumes:
- ./data:/data
- /mnt/nextcloud/music:/music:ro
Poort 4533. In mijn hoofd zie ik dat dan meteen voor me als: 45 en 33 rpm. Geen idee of dat ook de dedicated poort voor pi-music is, maar ik vond het wel grappig.
Een docker compose up -d later draaide de boel.
Toegang van buitenaf
Voor externe toegang van projecten op mijn pi gebruik ik Cloudflare Tunnels – geen poorten openzetten in de router, geen gedoe met dynamische IP’s. Gewoon een ‘Application Route’ toevoegen in het Zero Trust dashboard:
- Subdomein: [placeholder3].jbtroost.nl
- Service: 127.0.0.1:4533
Binnen een minuut was https://[placeholder3].jbtroost.nl live. SSL en alles geregeld door Cloudflare.
De telefoon
Op mijn /e/OS telefoon had ik gehoopt de ingebouwde Muziek-app te kunnen gebruiken, maar de versie die nu op de Samsung J5 draait (degoogled Android 10) ondersteunt geen Subsonic. Gelukkig is er Ultrasonic – open source, beschikbaar via de App Lounge, en goed genoeg voor wat ik ermee wilde: via Bluetooth op mijn installatie muziek kunnen draaien .
Server toevoegen, inloggen en bam: daar was mijn muziek. Zowel op wifi als op 4G.
De test
Eerste track die ik uploadde: Kate Bush – The Ninth Wave. Bijna 20 minuten aaneengesloten conceptmuziek van haar album Hounds of Love.
En het werkte dus meteen, zowel in de browser, op de telefoon, thuis als onderweg. Ik had niet vooraf bedacht dat het zo snel up-and-running zou zijn - ook gezien de tijd die we met andere projecten op de pi bezig waren geweest om ze aan de praat te krijgen.
CD’s rippen
Die 300+ schijfjes moesten natuurlijk nog wel gedigitaliseerd worden. Op de Mac gebruik ik XLD (X Lossless Decoder) – gratis, open source, en perfect voor lossless rippen naar FLAC.
De workflow:
- CD erin
- XLD ript automatisch naar FLAC met metadata van MusicBrainz
- CD eject
- Volgende schijfje
En om de zoveel tijd even rsync -av ~/Music/rips/ jb@[ipadres]:/mnt/nextcloud/music/ draaien om alles naar de Pi te syncen. Navidrome pikt nieuwe albums automatisch op.
Tip: ik heb er een alias van gemaakt (syncmusic) in mijn .zshrc. Scheelt toch steeds weer typen.
De Technics aansluiten
Streaming naar mijn telefoon was leuk, maar ik wilde ook kunnen luisteren op mijn Technics SU-500 versterker uit 1986. Die heeft geen wifi, geen Bluetooth, geen Spotify Connect – gewoon eerlijke analoge inputs.
Eerste gedachte: AirPlay via de Airport Express die er al aan hing. Maar AirPlay vanaf een Android telefoon is op z’n minst niet ‘handig’ – alle apps zijn aardig met ontvangen, niet met uitsturen. Apple houdt dat protocol stevig dicht. Uiteraard.
Plan B: een simpele Bluetooth receiver van €8,-. Klein dongeltje, USB voor stroom, 3.5mm minijack voor audio.
De setup
De Bluetooth receiver pairen met de Pi5 (die heeft al ingebouwde Bluetooth) bleek nog een dingetje. Die goedkope receivers hebben een bereik van “zolang ik er naar kijk” – pairen lukte alleen met de receiver direct naast de Pi.
Eenmaal gepaird en vertrouwd (met bluetoothctl trust) bleef de verbinding gelukkig wel stabiel op een paar meter afstand.
Er zat een minijack male-male connector bij de receiver, dus die kon op de AUX-input van de Technics, USB-stroom van een officiële Raspberry Pi adapter (geen goedkope lader – dat bromde als een gek), en klaar.
Het resultaat
Nu werkt het zo:
- Open Ultrasonic op mijn J5
- Kies een album
- Druk op play
- Muziek komt uit de Technics
De telefoon streamt van Navidrome op de Pi, stuurt het via Bluetooth naar de receiver, en die praat analoog met de versterker. Mijn eigen Sonos-achtige setup, maar dan zonder cloud, zonder abonnement, maar wel gewoon met een versterker van 40 jaar oud.
Wat er nu staat
Tot slot
Dit was echt zo’n project waarbij ik dacht: waarom heb ik dit niet eerder gedaan? De muziek was er al. De hardware was er al. Het enige wat nog gemaakt moest worden was de koppeling.
En nu heb ik ineens gewoon mijn eigen streamingdienst! Geen algoritme dat bepaalt wat ik “misschien ook leuk vind”. Gewoon mijn muziek, mijn server, mijn smaak. Op mijn telefoon onderweg, of op die ouwe hifi thuis.
Die Technics uit ‘86 heeft inmiddels meer tech achter zich hangen dan ooit bedacht was, maar het klinkt nog steeds fantastisch.
Ook dit project past weer perfect in het grotere plaatje van zelf hosten en privacy behouden, aka ‘digital sovereignty’.
Vibecoding om los te komen van BigTech blijft een mooi streven.