I ran across a fairly obscure problem with the Sonos music system
related to mime-types, file extensions and dynamically generated playlists. This is fair warning that this post will get a tad technical.
The Sonos music system supports Internet radio stations and is capable of parsing remote M3U playlists. My plan was to write a simple script that retrieves the latest This American Life archives page
, parses the HTML to extract the set of show URLs and returns a dynamically generated playlist with the desired show URL.
Sonos didn't like my dynamically generated playlist and it took me a while to figure out exactly why. In the end it seems the Sonos ignores Content-Type HTTP header
and instead relies solely on the file extension in the URL it is accessing. In this case the file extension was .cgi and since Sonos doesn't know what .cgi means it ignored the contents of the response.
The workaround I found was to enable the execution of CGI scripts with a .m3u file extension but only in a single directory. This is the contents of the Apache-style .htaccess file I used:
AddHandler cgi-script m3u
AddType audio/x-mpegurl .m3u
Then I renamed my script.cgi to script.m3u and Sonos no longer complained about corrupt contents and treated it like a regular playlist. Dynamically generated This American Life playlists streaming through my Sonos. Wonderful.
I've contacted Sonos and explained the issue so hopefully they'll fix it in a future firmware update and others can avoid the headaches.