MuziekDetective
Analyseert een openbare Spotify-playlist en genereert op basis van genre, sfeer en tempo één onderbouwde muzieksuggestie via AI.
- Playlist-URL
- Selenium
- Groq (Llama)
- Suggestie
Probleem
Een playlist zegt genoeg over sfeer en smaak, maar er bestond geen simpele manier om daar één onderbouwde suggestie uit te halen zonder een account aan te maken of zelf een API-sleutel bij Spotify te regelen.
Aanpak
Je plakt de URL van een openbare Spotify-playlist. Selenium laadt de pagina headless en extraheert de tracklist, die namelijk dynamisch wordt geladen met JavaScript, dus een simpele HTTP-GET volstaat niet. De tracklist gaat vervolgens naar de Groq API (Llama), die op basis van genre, sfeer en tempo één onderbouwde suggestie teruggeeft.
Om misbruik en het lekken van de Groq-sleutel te voorkomen, zit er rate limiting per gebruiker en centraal API-sleutelbeheer in.
Stack
Bewuste keuze
Ik koos bewust voor geen Spotify Web API en geen OAuth. De applicatie werkt puur op een openbare playlist-URL, dus een gebruiker hoeft niets te registreren of in te loggen. De prijs daarvoor is een afhankelijkheid van Spotify's HTML-structuur: verandert die structuur, dan breekt de extractie. Dat risico accepteer ik bewust in ruil voor een drempelloze gebruikerservaring.
Wat ik ervan leerde
Het idee was snel gebouwd; de weg naar een betrouwbare, live applicatie leverde de meeste leerervaring op.
Lokaal werkte alles feilloos, maar in productie liep de tracklist-extractie af en toe vast, een omgevingsspecifiek probleem dat lokaal onzichtbaar bleef. Dat dwong me tot systematisch debuggen op basis van productielogs: hypotheses opstellen, één variabele tegelijk aanpassen, en pas concluderen als het logboek het bevestigde. Dat is een vaardigheid op zich, los van het schrijven van de code zelf.
Daarnaast leerde ik dat AI-output niet vanzelf betrouwbaar is. Zonder bijsturing via zowel de prompt als de model-parameters kreeg ik wisselende, soms te stellige antwoorden. Pas na tuning op beide vlakken werd de suggestie consistent bruikbaar.