H-BLOGX | der andere Blog

Amazon Echo wird zum Radio für lokale MP3 Dateien

Vielleicht geht es Euch wie es mir ging, nachdem ich den Amazon Echo ein paar Wochen im Betrieb hatte. Wir haben uns gleich zu Anfang einen großen Amazon Echo und einen kleinen Amazon Echo Dot zugelegt (Nachtrag am 09.08.2018: Dank Amazon Prime Day jetzt stolzer Besitzer von 3 Amazon Echo Dot und 2 Amazon Echo, sowie 2 Fire TV Sticks 🙂 ).

Nach den ersten Spielereien mit der netten Dame aus dem Böxle haben wir festgestellt, das wir Sie primär zum Musik hören nutzen. Jetzt ist es so, das wir als Amazon Prime Kunden zwar “nur” die kleine Variante von Amazon Musik nutzen können, welche zwar um die 2000000 Songs beinhaltet, aber man nicht von beiden Amazon Echo auf Amazon Musik gleichzeitig zugreifen kann. D.h. bisher hat einer Amazon Musik gehört, der andere dann TuneIn Radio.

So richtig zufriedstellend fand ich das alles nicht, zumal ich doch eine recht große eigene MP3 Musiksammlung im Laufe der Jahre angesammelt habe. Folgende Gedanken gingen mir dabei durch den Kopf:

Nach längerer Suche bin ich über das inoffizielle deutsche Alexa und Echo Forum gestoßen, in welchem der Benutzer Waringer folgenden Thread eröffnet hat: Alexa-Radio

Alexa-Radio

Hier mal eine kurze Zusammenfassung. Der Benutzer Waringer hatte das gleiche Problem, nichts im Internet gefunden und daraufhin selbst was programmiert. Der Skill ist kein fertiges Produkt, d.h. Ihr müsst Euch ein wenig mit Internet, Webserver und vielleicht Linux auskennen, aber ich hatte stehts super Unterstützung durch Waringer erfahren dürfen. Diese Unterstützung möchte ich jetzt auf diesem Weg weitergeben und erstelle hierzu eine möglichst detailierte Anleitung.

Was braucht Ihr alles?

Fangen wir an

Zu aller Anfang etwas Theorie. Im Prinzip läuft das ganze so ab. Bei Amazon Developer wird eine private Skill Information erstellt. Eine Anleitung hierzu kommt später. In dieser Skill Information wird eine URL hinterlegt, wo Amazon den “eigentlichen Skill” findet. Bei mir habe ich das folgendermaßen gelöst:

NAS

Notebook

Virtuell

Details

Ich werde hier jetzt nicht darauf eingehen wie man ein Windows oder Linux installiert, genauso wenig, wie man einen Apache2 Webserver installiert, aber auf meine Konfigurationen werde ich eingehen.

Auf dem externen Server habe ich eine Config, welche alles was auf Port 80 ankommt, auf Port 443 weiterleitet.

Sobald man dann auf dem Port 443 anklopft (was Amazon auf jeden Fall macht) kommt diese Config zum Einsatz:

<IfModule mod_ssl.c>
<VirtualHost extern.myprivatefqdn.tld:443>

        ServerAdmin webmaster@myprivatefqdn.tld
        ServerName extern.myprivatefqdn.tld
        
        # URL Zeile vom Browser wird auf http://192.168.1.236:1280 umgeschrieben, somit intern Zugriff, extern kein Zugriff
        #<Directory "/soundfiles/">
                   RedirectMatch ^/soundfiles/(.*)$ http://192.168.1.236:1280/$1
        #</Directory>

        # Weiterleitung an Skill Radio, welcher auf Port 3081 im Webserver läuft
        Proxypass               "/echo/radio" "http://192.168.1.236:3081/echo/radio"
        ProxyPassReverse        "/echo/radio" "http://192.168.1.236:3081/echo/radio"

        LogLevel debug
        ErrorLog ${APACHE_LOG_DIR}/alexa-radio_error.log
        CustomLog ${APACHE_LOG_DIR}/alexa-radio_access.log combined

SSLCertificateFile /etc/letsencrypt/live/extern.myprivatefqdn.tld/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/extern.myprivatefqdn.tld/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

 

Was genau passiert hier?

Wenn Du im Browser die URL http://extern.myprivatefqdn.tld (also HTTP Port 80) eintippst, wirst Du auf https://extern.myprivatefqdn.tld (also HTTPs Port 443) weitergeleitet und siehst ….. nichts, also nur eine leere Seite. Für Scriptskids völlig uninteressant.

Solltest Du jedoch die URL https://extern.myprivatefqdn.tld/soundfiles/ aufrufen, erfolgt ein RedirectMatch auf die URL http://192.168.1.236 auf Port 1280. Die Webseite welche mir angezeigt wird, ist mein MP3 Verzeichis von 0 bis 9 und A bis Z. Das kommt aus dem Grund zustande, da ich ja im Vorfeld auf dem internen Webserver

1. einen Mount von meinem QNAP NAS auf einen internen Mountpoint gemacht habe (nur lesend!) und
2. dann im HTML Verzeichnis vom internen Apache Webserver (welches auf Port 1280 hört) mit symbolischen Links diese interne Verzeichnis dort optisch zur Verfügung stelle.

Somit kann ich mich “intern” durch die MP3 Verzeichnisse mit dem Browser durchklicken bis ich auf der eigentlichen MP3 Datei bin und diese theoretisch im Browser anhören. Ruft man die URL https://extern.myprivatefqdn.tld/soundfiles/ jedoch von “außerhalb” meines private Netzwerks auf, ist die IP 192.168.1.236 ja gar nicht bekannt, da diese privaten IPs nicht ins Internet geroutet werden.

Es muss zum Musik hören also folgende Information bekannt sein

  1. Die externe URL
  2. Das virtuelle Unterverzeichnis (in Beispiel “soundfiles”)
  3. Man muss sich im gleichen privaten Netzwerk wie der Amazon Echo befinden

Damit sind wir auf dem externen Webserver erst mal fertig.

Der eigentliche Skill

Auf der GitHub Seite von Waringer solltet Ihr mal alles durchlesen. Dort wird das Zusammenspiel auch nochmals graphisch dargestellt. Wir wissen in unserem Beispiel aber auch, das es im externen Webserver in der Config die Zeilen

# Weiterleitung an Skill Radio, welcher auf Port 3081 im Webserver läuft
Proxypass "/echo/radio" "http://192.168.1.236:3081/echo/radio"
ProxyPassReverse "/echo/radio" "http://192.168.1.236:3081/echo/radio"
gab. Wozu werden die jetzt benötigt. Ich habe ganz oben erwähnt, das man im Amazon Developer eine URL hinterlegen muss. Das ist die URL, auf dem der eigentliche "programmierte" Skill läuft. D.h folgendes wird der Reihe nach passieren.
  1. Du erstellst auf Amazon Developer den Skill Eintrag.
  2. Jetzt aktivierst Du diesen “privaten” Skill auf dem Amazon Echo
  3. Dann sprichst Du z.B. “Alexa, öffne [Name des Skills, wie Ihr den genannt habt] und suche [z.B. ABBA]
  4. Alexa, besser Amazon Echo kontaktiert dann Amazon. Amazon prüft ob die externe URL erreichbar ist und übergibt an den Skill
  5. Der Skill welcher intern auf http://192.168.1.236:3081/echo/radio läuft, ruft die externe URL https://extern.myprivatefqdn.tld/soundfiles/ auf und wird dabei auf die interne URL http://192.168.1.236:1280 umgeleitet, wo der Amazon Echo dann den Weg zu den MP3 Dateien findet.
  6. Auf Grund der internen Datenbank (MariaDB) kennt der Skill die Eigenschaften der MP3 und erstellt eine temporäre Playlist, die der Reihe nach alles abspielt, wo er in der Datenbank was mit [z.B. ABBA] gefunden hat. Von Waringer wurde auch noch eine Optimierung programmiert, womit man das Kommentarfeld der MP3 Tags auslesen kann. Somit kann man dann “steuerbare” Playlisten erstellen, indem man eigene Schlüsselwörter in die Kommentare (getrennt durch Strichpunkt “;”) schreibt.

Der Skill wurde mit der Programmiersprache Go durch Waringer programmiert. Du musst diese also zuerst auf dem internen Webserver installieren. Die Anleitung auf deren Homepage ist aber recht gut. Danach müssen die beiden Dateien radio.go und scanner.go kompiliert werden. Die auf der GitHub beschriebene Datei radio.conf wird nicht während die Kompilierungsphase gebraucht, sondern erst dann, wenn die kompilierte Datei radio gestartet wird.

Shortcuts

Nachtrag am 09.08.2018:

Nachdem ich jetzt ca. 3 Wochen im Urlaub war, musste ich selbst feststellen, das gewisse Befehle auf der Linux Konsole in Verbindung mit dem Alexa-Radio Skill mir geistig abhanden gekommen sind (was eigentlich für einen erholsamen Urlaub spricht). Von daher schreibe ich hier einfach mal ein paar Befehlszeilen auf, damit man diese parat hat.

Mit

./build.sh

werden die ganzen *.go Dateien kompiliert.

Nach dem erfolgreichen Kompilieren müssen die beiden Dateien

bin/radio

und

bin/scanner

in das Verzeichnis

/usr/local/bin/

kopiert werden.

Im Verzeichnis

/etc

liegt die Datei radio.conf, welche auf eure individuellen Systemvorausetzungen angepasst sein muss. Diese Datei wird nur beim starten des Skills ausgelesen und benötigt (jedoch nicht beim Kompilieren).

 

Im Serververzeichnis

/etc/systemd/system

 

befindet sich die Datei alexa-radio.service mit dem Inhalt

[Unit]
Description=Alexa-Radio
After=network.target mysqld.service 

[Service] 
ExecStart=/usr/local/bin/radio -c /etc/radio.conf
Type=simple
WatchdogSec=30s
Restart=on-failure

[Install]
WantedBy=multi-user.target

 

Eingeschaltet bzw. aktiviert wird es mit dem Befehl

systemctl enable alexa-radio.service

 

Danach kann man den Skill mit

systemctl start alexa-radio.service

starten und mit

systemctl stop alexa-radio.service

stoppen.

 

Falls Ihr mal die Datenbank zwischendurch updaten müsst, geht das so

mysql -u Benutzername -p Passwort < sql/dateiname.sql

Damit wird die SQL Datei mit den Credentials gleich in die Datenbank “geschossen”

 

Ebenso könnt Ihr via Shell die Datenbank abfragen. Meldet euch dazu zuerst an der MariaDB mit

mysql -u Benutzername -p Passwort

an. Danach werdet Ihr (vermutlich) nochmals nach einem Passwort gefragt.

Jetzt könnte Ihr folgendes SQL Statement kopieren und in die Shell einfügen. Bitte ersetzt dabei den Platzhalter %abba% durch z.B. %new york%, halt den String, den Ihr in der Datenbank finden wollt. Bitte die beiden “%” Zeichen vor und nach dem String dran lassen!

SET @search='%abba%';SELECT TracK.* FROM TracK LEFT JOIN ArtisT ON TK_AT_id = AT_id LEFT JOIN AlbuM ON TK_AM_id = AM_id WHERE TK_Name LIKE @search OR TK_Comment LIKE @search OR AT_Name LIKE @search OR AM_Name LIKE @search;

 

Mit der Tastenkombination

Ctrl + C

 

kommt Ihr wieder auf die normale Shell zurück

 

An dieser Stelle werde ich jetzt erst mal nicht mehr weiter schreiben, da es mehr Sinn macht, auf Fragen von Dir / Euch zu antworten und diese dann weiter in die Anleitung einfließen zu lassen.

Schreibt bitte auch gerne in die Kommentare, was euch gut gefällt oder auch was euch gar nicht gefällt, bzw. was Ihr noch vermisst, damit wir diese Anleitung immer besser machen.

Update:

Die oben stehende Anleitung hat bei mir gut funktioniert, jedoch bin ich von meiner QNAP NAS abgekommen.  Meine Daten liegen zu auf der pCloud, sodass ich das Konzept der obigen Anleitung nicht mehr verfolge und betreibe. Von daher bitte ich um Abstand mit Fragen zu halten, da ich einfach nicht mehr im Thema bin.