RESCUE OF A SoundBridge M1001

Roku SoundBridge M1001MIND WORK Technics SL-1300MIND WORK Technics SL-1300 Brik Stereo Moduls

But being build in 2004 the M1001 its hardware and software no longer meet today’s requirements. Because of this, there had been two major problems which I only could fix with a lot of MIND WORK.

First “bug” is the old wireless network standard Wi-Fi 802.11b of the M1001. Fortunately, the radio has a Lan-Port for 10/100mbps Ethernet. Cause of this I bought an Edimax CV-7428NS Media Bridge which can be integrated into my WiFi Mesh with IEEE 802.11b/g/n and up to 300 Mbit/s.

The CV-7428NS has five LAN-Ports to connect “non-wireless” devices to a wireless network. If the M1001 is connected via LAN and then powered up the device recognizes the connection type and boots up in LAN-Mode instead of WiFI-Mode. The installation is simple and the connection works perfectly.

MIND WORK Edimax CV-7428NS Media Bridge

The second problem can´t be fixed so easily. It has the effect that my Soundbrigde more and more is losing the ability to get in contact with radio-streams. It needs a while to identify this as a protocol issue. The Roku can work with a lot of protocols like WEP, WPA, AutoIP, DHCP, TCP, TELNET, HTTP and DRM – but not with HTTPS. And this is the point. Each time a radio station is switching from HTTP to HTTPS my ROKU is losing the capability to “receive” it. Time to put the M1001 into Garbage can? No! Time to call my friend and software developer Winfried Jacobs. I asked him for some MIND WORK to find a way for transforming HTTP into HTTPS requests. And here is what came to his mind while on a bike ride.

Raspberry Pi 1 B from 2013 with Raspberry Pi OS Lite and "Nginx" as WebserverHis solution: a Raspberry Pi 1 B from 2013 with Raspberry Pi OS Lite and “Nginx” as Webserver becoming a “Reverse HTTP Proxy” by coding the Nginx with this config:

location ~ ^/radio/(.*) {
resolver 8.8.8.8 valid=30s;  # works somehow only with resolver, which could also be the docker internal resolver: 127.0.0.11 (not tested)
proxy_pass https://$1;
client_max_body_size 0;  # 0 disables checking client body size; could alternatively be 2m or 10m
proxy_buffering off;

# handle responses containing m3u playlists (content-type audio/x-mpegurl, etc)
# returned for example by this address: https://stream.absolutradio.de/lq/mp3/Fritzbox.m3u

# a) in case of m3u responses / playlist files (and also html and text responses), rewrite urls in the response body:
sub_filter ‘https://’  ‘http://localhost/radio/‘;
sub_filter_types  text/html text/plain audio/x-mpegurl audio/mpegurl, application/m3u, audio/x-mp3-playlist, audio/m3u, audio/x-m3u;
sub_filter_once off;

# b) avoid error “SSL_do_handshake() failed…”, which might be a special case concerning the tested host (stream.absolutradio.de),
# see https://stackoverflow.com/questions/25329941/nginx-caching-proxy-fails-with-ssl23-get-server-hellosslv3-alert-handshake-fail/25330027#25330027
proxy_ssl_server_name on;
proxy_ssl_protocols TLSv1.2;
}

Now I just have to put “http: //192.168.178.60/radio/” in front of each of the original streaming addresses and my lovely Roku Soundbridge M1001 is unrestricted back to live. That is sustainable for me.MIND WORK Roku Soundbridge M1001 Technics SL-1300 Brik on tea tableMIND WORK Roku Soundbridge M1001 DISPLAYMIND WORK BRIK Mini Stereo Modules at vintage tea table

Vor kurzem habe ich bei eBay eine alte Roku Soundbridge M1001 gekauft. Ich mag die Klangqualität, das gerade Design, die Aluminiumoberfläche und das Old-School-Display dieses Webradios sehr. Es passt perfekt zu meinem Technics SL-1300, den Brik-Modulen und nicht zuletzt meinem aufgemotzten schwedischen vintage Tee-Tisch. Aber da das M1001 von 2005 ist, erfüllen die verwendete Hard- und Software nicht mehr heutigen Anforderungen. Hieraus resultieren zwei existenzielle Probleme, für die ich einiges an MIND WORK benötigte, um sie zu lösen.

Erster “Fehler” ist der alte WLAN-Standard Wi-Fi 802.11b des M1001. Glücklicherweise verfügt das Radio über einen Lan-Port für 10/100-Mbit/s Ethernet. Aus diesem Grund habe ich eine Edimax CV-7428NS Media Bridge gekauft, die mit IEEE 802.11b / g / n und bis zu 300 Mbit / s in mein WiFi-Netz integriert werden kann. Die Media Bridge verfügt über fünf LAN-Ports, über die “nicht drahtlose” Geräte mit einem drahtlosen Netzwerk verbunden werden können. Wenn das M1001 über LAN verbunden und dann eingeschaltet wird, erkennt es den Verbindungstyp und startet im LAN-Modus anstelle des WiFI-Modus. Die Installation ist einfach und die Verbindung funktioniert einwandfrei.

Das zweite Problem kann nicht so einfach behoben werden. Ich hatte den Effekt, dass meine Soundbrigde immer mehr die Fähigkeit verliert, mit Radiostreams in Kontakt zu treten. Es dauert eine Weile, um dies als Protokollproblem zu identifizieren. Das Roku kann mit vielen Protokollen wie WEP, WPA, AutoIP, DHCP, TCP, TELNET, HTTP und DRM arbeiten – jedoch nicht mit HTTPS. Und das ist der Punkt. Jedes Mal, wenn ein Radiosender von HTTP zu HTTPS wechselt, verliert meine ROKU die Fähigkeit, ihn zu “empfangen”. Zeit, den M1001 in den Mülleimer zu werfen? Nein! Zeit, meinen Freund und Softwareentwickler Winfried Jacobs anzurufen. Ich bat ihn, mit etwas MIND WORK einen Weg zu finden, HTTP in HTTPS-Anfragen umzuwandeln.  Und hier ist seine Lösung (danke dafür), die ihm während einer Radfahrt eingefallen ist: ein Raspberry Pi 1 B aus dem Jahr 2013 mit Raspberry Pi OS Lite und “Nginx” als Webserver, der durch Codierung des Nginx mit folgender Config zu einem “Reverse HTTP Proxy” wurde:

location ~ ^/radio/(.*) {
resolver 8.8.8.8 valid=30s;  # works somehow only with resolver, which could also be the docker internal resolver: 127.0.0.11 (not tested)
proxy_pass https://$1;
client_max_body_size 0;  # 0 disables checking client body size; could alternatively be 2m or 10m
proxy_buffering off;

# handle responses containing m3u playlists (content-type audio/x-mpegurl, etc)
# returned for example by this address: https://stream.absolutradio.de/lq/mp3/Fritzbox.m3u

# a) in case of m3u responses / playlist files (and also html and text responses), rewrite urls in the response body:
sub_filter ‘https://’  ‘http://localhost/radio/‘;
sub_filter_types  text/html text/plain audio/x-mpegurl audio/mpegurl, application/m3u, audio/x-mp3-playlist, audio/m3u, audio/x-m3u;
sub_filter_once off;

# b) avoid error “SSL_do_handshake() failed…”, which might be a special case concerning the tested host (stream.absolutradio.de),
# see https://stackoverflow.com/questions/25329941/nginx-caching-proxy-fails-with-ssl23-get-server-hellosslv3-alert-handshake-fail/25330027#25330027
proxy_ssl_server_name on;
proxy_ssl_protocols TLSv1.2;
}

Jetzt muss ich nur noch jeder der ursprünglichen Streaming-Adressen  “http: //192.168.178.60/radio/” vorwegstellen und meine schöne Roku Soundbridge M1001 ist wieder uneingeschränkt verfügbar.  Das nenne ich nachhaltig.:)

13 comments

  • Hello,
    Very happy to find this page. I have a Soundbridge that has played it’s last streaming station due to everything moving to https. I’ve been working on using nginx on a pi3 as a reverse proxy but keep running into various errors. Would you be willing to share your entire nginx config with me please?
    Thank you.

    Liked by 1 person

    • Hi Paul, Nice to hear, that you will rescue your SoundBridge too. I thought the code for nginx in my post but I will ask my coder if there is something more you have to deal with.

      Like

  • Paul here again, got it working! Your config bits work perfectly, had some basic nginx config missing. The other missing piece was decoding the correct url’s for the streams. Right clicking on a streaming web page and using „inspect element“ lets me find the URL, then I can use VLC to test it before putting it in the soundbridge. Thanks again for this page and documentation.

    Liked by 1 person

  • Hallöchen,

    klingt gut! Ich hab zu dem HTTPS aber noch das Problem, das Radiosender wie z.B. “Radio Arabella” aus München nicht mehr empfangbar sind mit der Soundbridge. Verbindung wird hergestellt, aber Stream bricht sofort wieder ab, Neuverbindung, kurzer Ton, Abbruch usw.! Dafür vielleicht auch eine Idee? Stream-URL wäre http://live.radioarabella.de/stream
    Soundbridges sind auch heute noch uptodate! Ich hab (jetzt muss ich echt überlegen) 4 aktiv in Gebrauch und 2 als Reserve.

    Like

    • Hi, ich werde die Adresse die Tage mal bei meiner Soundbridge prüfen und meine mich zu erinnern, dass ich das Problem auch mal hatte. Aber seit dem ich nicht mehr direkt über das Wlan der Soundbridge sondern über den Umweg Lan zu Mediabridge gehe, das Problem nicht mehr aufgetaucht ist. Wenn ich die Adresse geprüft habe, melde ich mich nochmal. Grüsse #Martin

      Like

  • Hallo,

    die Idee ist super und ließ sich auch leicht umsetzen. Mein Problem ist, dass in allen Playlists, zu denen ich die Links habe, Weiterleitungen zum eigentlichen Stream stehen. Und diese Weiterleitungen enthalten wieder https.

    Beispiel:
    https://stream.absolutradio.de/lq/mp3/Fritzbox.m3u hab ich im Preset konfiguriert als
    http://192.168.1.30:81/radio/stream.absolutradio.de/lq/mp3/Fritzbox.m3u
    Lade ich mir das m3u direkt herunter, steht dort https://sec-absolut.hoerradar.de/absolutradio-mp3-128?sABC=60o899sn%230%236n924132s76317r57235r93rss45n4ps%23&=&amsparams=playerid:;skey:1622710778 drin. Und dieser https-Stream wird natürlich nicht umgesetzt. Das äußert sich in der Anzeige von “Wiederhole Verbindung zu Server …” in der Soundbridge bzw. zu immer gleichen Logeinträgen in /var/log/nginx/access.log:
    192.168.1.18 – – [03/Jun/2021:10:29:36 +0200] “GET /radio/www.di.fm/vocaltrance HTTP/1.0” 200 28697 “-” “Roku SoundBridge/3.0”

    Hier meine Config:
    server {
    listen 81;

    location ~ ^/radio/(.*) {
    resolver 8.8.8.8;
    proxy_pass https://$1; # uses regular expression from above, inserts postfix (after /radio/) as url
    client_max_body_size 0; # for streaming content: disables checking of client body size
    proxy_buffering off; # for streaming content
    proxy_ssl_server_name on;
    }
    }

    VG
    Stephan

    Like

    • Hi Stephan,
      mein Coder hatte etwas Zeit und die Konfig überarbeitet (siehe oben in meinem Beitrag).

      Seine Analyse:
      “Das Problem besteht darin, dass die genannte Adresse eine “m3u”-Playlist zurückliefert, und dass die hierin enthaltene(n) Adressen so angepasst werden müssen, dass sie den Raspberry-Proxy verwenden. (Abschnitt a)
      Zusätzlich gab es noch ein Verbindungs-Problem mit der genannten Adresse (“SSL_do_handshake() failed…”), das habe ich dann gleich mit erledigt. (Abschnitt b)”

      Grüße

      Martin

      Like

      • Ich habe es mittlerweile selber hinbekommen, indem ich 3 weitere Zeilen in der nginx-Config eingebaut habe:
        sub_filter_once off;
        sub_filter_types *;
        sub_filter “https://” “http://192.168.1.30:81/soundbridge/”;

        Damit wird ein Input-Content-Filter eingerichtet, der alle https-Links im Response wieder auf http und den nginx-Server umleitet. Funzt super.
        Vieleicht nützt es ja auch jemanden anderen. Hier nochmals meine komplette Config (auf der 192.168.1.30 läuft mein nginx):

        # Roku proxy configuration
        #
        server {
        listen 81;
        access_log off;
        error_log off;
        #root /var/www/html;
        #index index.html indem.htm index.nginx-debian.html;

        #server_name rokuproxy;

        location ~ ^/soundbridge/(.*) {
        resolver 8.8.8.8;
        proxy_pass https://$1; # uses regular expression from above, inserts postfix (after /radio/) as url
        client_max_body_size 0; # for streaming content: disables checking of client body size
        proxy_buffering off; # for streaming content
        proxy_ssl_server_name on;
        sub_filter_once off;
        sub_filter_types *;
        sub_filter “https://” “http://192.168.1.30:81/soundbridge/”;
        }
        }

        VG
        Stephan

        Like

  • Hallo Stephan, mit dieser nginx config erhalte ich, wenn ich die IP aufd er nginx läuft eingebe:
    Welcome to nginx!
    If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
    For online documentation and support please refer to nginx.org.
    Commercial support is available at nginx.com.
    Thank you for using nginx.
    Raspi ist noch relativ neu für mich. Hast einen Tip für mich?

    Like

    • Hallo Christian,

      das ist schon so Ok. Du rufst ja den nginx einfach nur so auf. Wenn Du wirklich meine Config hast, dann springt der nur an, wenn ein „soundbridge“ in der URL steht (bzw. ein „radio“, falls Du die Originalconfig von ganz oben auf dieser Seite hast).

      Wenn Du also eine Radio-Streaming-URL hast, wie z.B.https://stream.absolutradio.de/lq/mp3/Fritzbox.m3u
      dann solltest Du in den Presets der Soundbridge stattdessen folgendes eintragen:http://IP-von-Nginx:81/soundbridge/stream.absolutradio.de/lq/mp3/Fritzbox.m3u

      Damit sollte dann Dein nginx anspringen und alles, was nach „soundbridge/“ kommt abholen und Dir bzw. der Soundbridge zur Verfügung stellen. Sollte übrigens auch mit dem Browser funktionieren, dass er das m3u runterlädt, welches sich z.B. mit VLC öffnen lässt.

      Bitte beachte auch, dass in meiner obigen Config die IP und der Port des Nginx bei sub_filter stehen muss!

      VG
      Stephan

      Like

      • Hallo Stephan, danke für Deine rasche Antwort. Habs mittlerweile hinbekommen. Hab den Raspi einfach nochmal ganz neu aufgesetzt, nur Update und Upgrade ausgeführt und nginx installiert und mit Deiner Config versehen. Funktioniert wunderbar.
        VG
        Christian

        Like

Submit a comment

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: