Scrobbling RTBF live radios to Last.fm and ListenBrainz with userscripts

Finding a way to scrobble live RTBF radios like Classic 21 and Classic 21 Metal to Last.fm and ListenBrainz was not as straightforward as it should have been.

I've stopped Spotify for a long time and I have switched to Navidrome and Jellyfin/Finamp on Android, which embark scrobblers for Last.fm and ListenBrainz, luckily for me.

However in the universe of music scrobblers, I had yet to find how to scrobble my favorite local radios, RTBF Classic21 and Classic21 Metal (https://www.rtbf.be/radio/liveradio/classic21_metal) 🎸🇧🇪.

They integrate a player compatible with an awesome web-scrobbler extension (https://github.com/web-scrobbler) whose purpose is to work for live radios web players. Sadly I couldn't make it work with those radios despite history is showing it is supposed to have worked years ago. There is an integration for RTBF live radios at https://github.com/web-scrobbler/web-scrobbler/pull/2377/files - it was supposed to work for Classic 21 as well, unfortunately the code seems obsolete now and I couldn't ship a working fix for this. So I paused a bit, and gave up, ... not long enough 😂.

I had the idea of running Shazam in the background and send it findings to some backend for scrobbling my songs, and I thought it would be very epic and complicated. I did try anyway the Shazam web extension and noticed that it would mismatch the song and artist displayed on the radio website most of the time. This is concerning. Why is that? I do not know yet, so just in doubt I have contacted the website admin for RTBF about this.

Anyway, diving back into the code and opening Dev Tools in Brave, helped me discover an interesting URL: https://core-search.radioplayer.cloud/056/qp/v4/events/?rpId=29 which returns the songs being played for this radio, I mean the recent ones, the next one and the one currently playing!

Then I decided to try hacking my own solution for this problem. It wouldn't work with Navidrome nor with a chrome extension, I wanted a simple minimalist hack. I'm used to tweak websites UX with Tampermonkey and I'd to give a try. The result is https://gitea.zoemp.be/sansguidon/snippets/raw/branch/main/tampermonkey/rtbf_scrobbler.js.

I’ve adopted ListenBrainz as an alternative to Last.FM, but I still can’t fully let go of it. That’s why my userscript supports both, and it's hackable for those who want to extend it 😉

I've tested it on:

And it should likely be compatible with most radios at:

My scrobbling profiles are https://www.last.fm/user/SansGUidon and https://listenbrainz.org/user/SansGuidon/.

Feel free to share, copy, reuse and provide feedback! I'll keep this post updated if RTBF radio answers my questions 😉 or if I get interesting feedback. I've also mentioned this post in https://github.com/web-scrobbler/web-scrobbler/discussions/5327.

💌 The best way to get in touch is via my email morgan at zoemp dot be. You can also follow me on the Fediverse / Mastodon at @sansguidon@mamot.fr. I speak (a lot) French, English and a bit of Dutch.


LLMs – Chat Interfaces vs. Raw APIs: Why I Choose Conversations

I recently read Max Woolf's post on LLM use, where he explains why he rarely uses generative LLMs directly, preferring raw APIs for control. It's an interesting take, but I fundamentally disagree. For me, chat interfaces aren't just convenient—they’re an essential part of understanding.

LLMs are more than code generators. They are interactive partners. When I use ChatGPT, Mistral, or Copilot in chat mode, it's not just about fast results. It's about exploring ideas, challenging my thinking, and refining concepts. The back-and-forth, the debugging, the reflection—it’s like pair programming with a tireless assistant. If I need to test an idea or explore a concept, the chat interface is perfect for that: it's always available, from any device, no API or IDE needed.

Max argues APIs allow for more fine-tuning—system prompts, temperature control, constraints. Sure. But in a chat session, you can iterate, switch topics, revisit past decisions, and even post-mortem the entire conversation, as a way to learn from it and log your decisions. And yes, I archive everything. I link these sessions to tickets in TickTick to revisit ideas. Try doing that with an API call.

The chat interface is a workspace, not a magic wand. It’s where you can think, break things, fix them, and learn. Isolating interactions to API calls removes that context, those learning moments. To me, that’s missing the point.

APIs are fine for deterministic output. But I prefer the chaos of conversation—it forces me to engage deeper, explore failures, and actually think. That’s why I don’t just use LLMs to generate. I use them to reason. Not just for hard skills, but soft skills too.


Lazy coding done right

When performing a task, even if it's a one-off, I believe it's a mistake to approach it with a short-term vision. We might solve many problems just for one occasion, but that's the nature of any project; each one is unique and happens only once. Should we really ship it with a short-term vision and skip automation, documentation, and testing just because they require more effort? Should we be so lazy?

I believe being lazy can be a good thing, but we shouldn't be so lazy that we skip essential steps like testing, documentation, information processing and retention, automation, collaboration, asking questions, and improving processes. These efforts will surely pay off for our knowledge and efficiency, or if not for ours, then for the team's knowledge and efficiency, for maintainability, and to reduce tech debt and bus factor. Of course, that requires thinking like a chess player, calculating our moves, and doing some planning.

For example, during an infrastructure migration, we faced many integrations that needed testing from the ops side, yet we lacked internal QA expertise. We rushed to collaborate with others to gather information on testing their flows. Even though we didn't have time to write automated tests immediately, I documented all the information so we could use it for future monitoring and automation purposes.

Another instance is our workspace setups, which were initially painful, yet many developers accepted it. When I had to use their setup script, I found many outdated or irrelevant steps and undocumented instructions. I automated those steps and fixed the instructions. Now, newcomers recognize the value of this, and even people external to the project can set it up without prior knowledge, saving days of effort and enabling easier contributions.

When I have to do a task, even just once, I try to make a script and document it. If I have to do it more than once, I try to automate even more parts. Each time I return to a task I'm becoming too familiar with, I feel the urge to improve the process, document and automate it, make it configurable, flexible, shared, robust, and efficient. When performing repetitive operations, I script them, always. At least partially if not fully. If mistakes occur, the fixes are likely to be automated or documented.

When asking for help, I provide context, and when doing something useful, I share the news or update the docs so people can be aware and benefit from it. I often receive positive feedback for this approach, as people start to realize that automation is more efficient, forgiving, and less risky than repeating operations manually.

Sometimes it's more tempting and fun to spend two days automating something rather than spending an hour running an imperfect automation hundreds of times. You have to balance the pros and cons of fun versus efficiency, depending on your priorities. However, it's risky to automate something you don't fully understand. You need to acquire some level of expertise in a topic before embracing automation and contributing improvements. It's dangerous to automate something you don't know how to run, debug, or test manually.

LLMs can help automate tasks, but you should be able to code and debug without them. You need to perform a task fully without LLMs or scripting before attempting to script it. It's good practice to study the documentation, API, and man pages of the tools you use and learn to troubleshoot effectively.

I believe every second counts, and even if we're solving a unique problem for the first time, the knowledge gained is worth documenting. This way, we can extract a process or history from it, which can be helpful for us, our team, or anyone else if shared.

Real DevOps do/dont – a list

[hint: this is not a serious post, I'm sorry if you feel attacked by this]

Inspired by Google search results for "Real Devs dont" (https://www.google.com/search?q=%22real+developers+dont%22).

  • Real Devs don't use UI - they use CLIs instead (https://terminaltrove.com/).
  • Real Devs don't need an IDE like VSCode, instead they code in production using Vim (and of course real devs use Nano. No, Emacs, https://xkcd.com/378/ ).
  • Real Devs don't use frameworks, they use libs.
  • Real Devs don't comment their code, there is no time for that.
  • Real Devs don't test their code, instead they throw all changes in production to save time.
  • Real Devs don't use their trackpad, instead they do practice touch typing (https://www.typingstudy.com/) and learn every app shortcut by heart, or build their own.
  • Real Devs don't need unit tests, instead they build programming skills.
  • Real Devs don't use debuggers, instead they stare at the stack trace for hours.
  • Real Devs don't joke or laugh at work, instead they blame every failure on poor colleagues competency.
  • Real Devs don't use Website builders, instead they code in raw HTML and CSS and throw JS away.
  • Real Devs don't trust anyone.
  • Real Devs use mechanical keyboards.

Honest tech definitions for dummies

  • AI Agent: a cheap junior employee who has root access to your system and production and will fake competency and waste your money. Have fun.
  • All-in-one calendar/messenger/file sharing app: oh, look, they generously manage your most sensitive data with good intent and cheap costs: your security and privacy is not a problem it seems. Run away even if it's free.
  • Anti-AI: someone using AI but bitter about it officially.
  • Application logs: something you stare at while thinking about the sense of your life.
  • Backups: something everyone is supposed to do but never does. Tip: you can have world-class data backups for free, feed them to some LLM prompt or share them in private LinkedIn messages or in private GitHub repo, they will likely leak later in some hack or some LLM output.
  • Bugs: something that occurs to you because you didn't RTFM.
  • CDN: a disaster waiting to happen.
  • CI/CD pipeline: a glorified shell script that compiles your code, usually wrapped in YAML or in Groovy or a messy mix of both. Nobody cares it until it breaks. If you are a developer, blame any pipeline failure onto the CI/CD tooling pretend your code works on your machine.
  • Coding: some ancien art you go back to after wasting 4 days debugging AI-generated code.
  • Contabo: cheap plastic VPS.
  • Cloud: a big garage with computers, related to random outages and expensive certifications.
  • CloudFlare: a tool to protect robots from humans trying to use internet.
  • DevOps person: someone debugging your code and your production environment.
  • Docker: a packager for your bloated app and your dependency hell.
  • DuckDuckGo: a private search engine hosted by big tech and using big tech search results and funded by big tech. Yeah very private.
  • Ecosia: a green washing search engine.
  • Git: a simple version control tool to make your life miserable.
  • Google search: a search engine for ads.
  • Hetzner: cheap VPS for your piracy stuff self hosted business applications.
  • Home hosted: piracy stuff or very sensitive stuff running on a Raspberry with zero backup. Do not mixup with Self hosted.
  • JavaScript: sugar for the web.
  • Kubernetes: because Docker wasn't complicated enough, this is a glorified infinite loop that restarts your bloated apps when they crash, and they will. It's also good to have on a resume.
  • LLM: a tool for text generation you can use to save you from developing skills. Some people call it general AGI. Ok, AGI, go win the lottery for me.
  • Newsletter: legal spam nobody reads.
  • Passkeys: a tool to prevent humans from using a tool on multiple devices.
  • QR Codes: links that force you to be glued to your phone and run a crappy app to avoid talking to human beings. It's the modern way to ordering anything. If you want I can generate infinite QR Codes for only 10$ per month.
  • Quantum: a marketing term to make any bullshit sound more legit. Oh, there is it, a quantum LLM.
  • Reboot: something you do when you are too lazy to RTFM.
  • RTFM: reading the manual is something you never do unless to prove someone else wrong or when it's time to understand the programming language you are using for ten years.
  • Self hosted: some barely secured docker containerized app running in some cloud like Hetzner. What is "self" about it? You decide. Maybe the fact it's installed by some human following a recipe. Impressive.
  • Spotify: a scam acting like a glorified Winamp clone that randomly removes content from your favorite playlists, rob you and artists.
  • Substack / Bearblog / Dev.to and other blog platforms: a recycle bin for your ideas.
  • Seedboxes: A place for exchanging free Linux distributions,.NOTHING ELSE of course.
  • the Onion, Le Gorafi: satire websites that compete with D. Trump for the most stupid headlines.
  • URL shorteners: a good legal way to ease phishing attempts. It's also a tool used to hide mostly useless sometimes good links behind magic ephemeral links. You remember that good site? Was it blb.lb/8378hdkf? Or goo.gl/hdk792? Who knew it would be such a terrible idea. Oh, did you see this new quantum URL shortener?
  • VPN: a glorified proxy.
  • Web scraping: a way to fix the lack of APIs. Also a lazy yet professional way to CTRL+C / CTRL+V content from websites.
  • YouTube: ads streaming service.
Mastodon