DisplayPlaylist - Die aktuelle Playliste auf TV oder externem Monitor anzeigen

Motivation
Immer häufiger fragen Besucher einer Milonga danach, welches Lied gerade gespielt wird oder was als nächste Tanda gespielt wird. Das war der Anlass, das Projekt DisplayPlaylist in Angriff zu nehmen. DisplayPlaylist zeigt das gerade gespielte Lied, die letzten drei gespielten Lieder und die nächsten drei Lieder der Playliste an. Da ich einen Macintosh verwende, ist das Ganze natürlich auch für diesen Computer entstanden. Um die Playliste aus den Playern auszulesen, verwende ich AppleScript - die unterstützten Player müssen also eine AppleScript Schnittstelle haben. Die aktuelle Implementation funktioniert mit iTunes und Decibel (http://sbooth.org). Auf dem Mac läuft das Programm "DisplayPlaylist.app", das eine Datei "DisplayPlaylist.log" erzeugt. Diese Datei wird immer dann neu geschrieben, wenn sich etwas an der Playliste im Player ändert - wenn der Player stoppt oder der nächste Tango abgespielt wird oder auch, wenn innerhalb der Playliste ein Lied verschoben wird.

Der Fernseher ist über ein HDMI Kabel an einen Raspberry Pi (Raspi) oder Odroid Computer angeschlossen. Auf diesem Computer wird ein Browser gestartet und es laufen einige Perlskripte, die aus dem "DisplayPlaylist.log" die HTML Datei "DisplayPlaylist.htm" machen, die vom Kweb Browser des Raspi oder vom FireFox des Odroid angezeigt wird. Der Raspi oder Odroid wird vom Mac gemountet und das "DisplayPlaylist.log" wird somit direkt auf den Raspi oder Odroid geschrieben, auf dem die Perlskripte die HTML Datei erzeugen. Der Betrieb mit dem Raspi oder Odroid hat den Vorteil, das der Fernseher irgendwo im Empfangsbereich des lokalen WLANs stehen kann und man nicht auf die Länge des HDMI Kabels vom Mac zum Fernseher beschränkt ist.

Alternativ kann "DisplayPlaylist.htm" auch auf dem Bildschirm (oder dem zweiten Bildschirm) vom Mac angezeigt werden. Dazu einfach im Programm "DisplayPlaylist.app" die Option "LocalMac" auswählen. Die Perlscripte werden jetzt automatisch gestartet und beim Verlassen des Programms wieder beendet. Falls nicht schon geöffnet, wird der Chrome Browser gestartet, und "DisplayPlaylist.htm" im Kiosk Modus.

Da das AppleScript Progamm und die Perlskripte auf verschiedenen Rechnern laufen und asynchron zueinander ausgeführt werden, müssen die Schreib- und Leseoperationen über Lock Dateien synchronisiert werden.

Beim Booten des Raspi wird automatisch der Kweb Browser - beim Odroid der Firefox Browser - gestartet und das "DisplayPlaylist.pl" Perlskript gestartet. Dieses Perlskript wartet darauf, das eine neue "DisplayPlaylist.log" Datei erscheint, erzeugt daraus die HTML Datei und signalisiert dem Kweb Browser einen Reload der Seite. Wenn der Player gerade nicht läuft, wird die Datei "Advertising.htm" in die Seite "DisplayPlaylist.htm" kopiert. Im Beispiel ist eine El Duende Image Präsentation als Slideshow realisiert.

Benötigte Programme  
Mac only  
DisplayDecibel.app

Wird auf dem Mac gestartet, liest die gerade laufende "iTunes" oder "Decibel" Playliste und erzeugt die Datei "DisplayPlaylist.log".

Auf dem Mac muss Perl installiert sein.

~/.DisplayPlaylist

#
# Configuration File for DisplayPlaylist
#
# Set displayMode, advertisingMode and currentPlayer
# to either German or English (or other Language) texts.
#
systemNameLocalisationDefault = "Anzeigemodus"
advertisingLocalisationDefault = "Werbung"
currentPlayerLocalisationDefault = "Music Player""
#
# systemNameLocalisationDefault = "Display mode"
# advertisingLocalisationDefault = "Advertising"
# currentPlayerLocalisationDefault = "Music Player""
#
# Set systemName, systemUser and systemPasswd for "RaspberryPi",
# "RaspberryPi2", "Odroid" or "LocalMac"
#
systemName = "Odroid"
systemUser = "odroid"
systemPasswd = "XXyyZZ"
#
# Set advertising to: "Off", "Advertising", "Clock" or "Video"
#
advertising = "Advertising"
#
# Set musicPlayer to: "Decibel" or "iTunes"
#
musicPlayer = "Decibel"

ReloadChromeKiosk.scpt Signalisiert dem Chrome Browser einen Reload der aktuellen Seite. Wird aus "DisplayPlaylist.pl" aufgerufen. Läuft Chrome nicht, wird es im Kiosk Mode gestartet und "DisplayPlaylist.htm" wird angezeigt.
KillDisplayPlaylist.pl Alle "DisplayPlaylist.pl" Prozesse auf dem Mac killen.
Raspberry Pi und Mac  
DisplayPlaylist.pl Generiert die Datei "DisplayPlaylist.htm", aus den Dateien "DisplayPlaylist.log" und "DisplayPlaylistHeader.htm" oder kopiert "Advertising.htm" in die Datei "DisplayPlaylist.htm" und ruft "ReloadKweb.sh" oder "ReloadChromeKiosk.scpt" auf.
DisplayPlaylist.htm und DisplayPlaylistHeader.htm "DisplayPlaylistHeader.htm" wird von "DisplayPlaylist.pl" benutzt um die Datei "DisplayPlaylist.htm" zu erzeugen. "DisplayPlaylist.htm" wird vom Kweb Browser angezeigt.
SignalDisplayPlaylist.pl

Wird von "DisplayDecibel.app" mit folgenden Funktionen aufgerufen. "system" ist entweder "RaspberryPi", "RaspberryPi2", "LocalMac" oder "Odroid":
- SignalDisplayPlaylist.pl Perl.lock wait system
- SignalDisplayPlaylist.pl Apple.lock touch system
- SignalDisplayPlaylist.pl Apple.lock unlink system
- SignalDisplayPlaylist.pl ProcessLogFile htmlfile system
"htmlfile.htm" wird von "DisplayPlaylist.pl" geöffnet, wenn der Player stopt.

Perl.lock, Apple.lock,
ProcessLogFile und
DisplayPlaylist.log

Werden von "DisplayPlaylist.app" (auf dem Mac) und von "DisplayPlaylist.pl" (auf dem Raspi oder Mac) zur Synchronisierung verwendet.
ReloadKweb.sh Signalisiert dem Kweb Browser einen Reload der aktuellen Seite. Wird aus "DisplayPlaylist.pl" aufgerufen.
Start.firefox.fullscreen.sh Startet firefox im full screen mode
ReloadOdroid.sh
ReloadRaspi2.sh
Signalisiert dem Firefox/Iceweasel Browser einen Reload der aktuellen Seite. Wird aus "DisplayPlaylist.pl" aufgerufen.
Advertising.htm, Clock.htm,
Video.htm
Werden beim Stoppen der Musik je nach Status von "advertising" angezeigt.
station-clock.js, excanvas.js JavaScripte für die Uhr
~/homepage.html Wird vom Kweb (Raspi) oder Chrome (Mac) Browser angezeigt.
~/kiosk Startet den Kweb Browser und "DisplayPlaylist.pl" auf dem Raspi 1
Benötigte Hardware  
Anzeigemedium Fernseher oder Beamer mit HDMI Schnittstelle - möglichst Full HD. Es funktioniert aber auch mit HD Ready. Benötigt wird auch das HDMI Kabel.
Raspberry Pi Raspberry Pi 1 (512MB Ram) oder Raspberry Pi 2 Model B (1GB Ram) mit Gehäuse, Netzteil und einer 8GB microSDHC Karte. Gibt es bei http://www.pollin.de für ca. 70 Euro zu kaufen.
Odroid-U3 Odroid-U3 mit Gehäuse, Netzteil und eine 8GB Lunix eMMC oder microSDHC Karte. Gibt es bei http://www.pollin.de für ca. 90 Euro (microSDHC) oder 110 Euro (eMMC) zu kaufen. Ist um einiges leistungsfähiger und hat doppelt so viel RAM wie der RaspberryPi 2.
DisplayPlaylist Source Code Der Source Code ist im Moment Offline - Bei Interesse Mail oder Anruf.
DisplayPlaylist.tar.gz Die "DisplayPlaylist.app" für den Mac und alle Raspi Dateien und Skripte, inklusive der El Duende Slide Show und des Demovideos (Gross - ca. 120MB).
DisplayPlaylistScripts.tar.gz Die "DisplayPlaylist.app" für den Mac und alle Raspi Dateien und Skripte, allerdings ohne der El Duende Slide Show und des Demovideos.
DisplayPlaylistXcode.tar.gz Das gesamte Xcode Projekt für den Mac

Was muss alles gemacht werden, bevor das System funktioniert?
Auf dem lokalen Mac funktioniert DisplayPlaylist sofort. Einfach "tar -xvzf DisplayPlaylist.tar.gz" im Homeverzeichnis aufrufen und die Applikation "DisplayPlaylist.app" im Ordner "~/downloads/DisplayPlaylist" in den Ordner "/Applications" kopieren. "DisplayPlaylist.app" starten und die Option "LocalMac" wählen.

Chrome muss als Browser vorhanden sein - Falls nicht, einfach installieren. Chrome lässt sich sehr einfach in den Kiosk Modus versetzen (http://www.google.de/chrome).

Konfiguration - Raspberry Pi
Den Raspberry Pi aus den Einzelkomponenten zusammenzubauen ist ein Kinderspiel. Platine in das Gehäuse einsetzen, festschrauben, das Gehäuse zusammenstecken - fertig. Jetzt muss "nur" noch die micro

SD-Karte mit der nötigen Software bespielt werden ...

Rasbian Image auf SD Karte schreiben
- Von http://www.raspberrypi.org/downloads das neueste Image: YYYY-MM-DD-wheezy-raspbian.zip runterladen.
- Image dekomprimieren - erzeugt YYYY-MM-DD-wheezy-raspbian.img Datei
Am Macintosh
$ sudo diskutil list # Das Device der SD feststellen - z.B. /dev/disk2
$ sudo diskutil umountDisk /dev/disk2 # SD unmounten
$ sudo dd bs=2M if=YYYY-MM-DD-wheezy-raspbian.img of=/dev/rdisk2 # Raspbian Image auf SD kopieren
Unter Linux
$ sudo fdisk -l
$ sudo umount /dev/sdb1 /dev/sdb2 # Etwaige gemountete Dateiensysteme unmounten
$ sudo dd bs=2M if=YYYY-MM-DD-wheezy-raspbian.img of=/dev/sdb # Raspbian Image auf SD kopieren

ACHTUNG: Bei allen Schreiboperationen auf die SD-Karte solltet ihr euch sicher sein das richtige Device erwischt zu haben. Ansonsten wird auch gnadenlos eure Festplatte überschrieben !!!

Raspberry Pi mit der erstellten SDHC Karte booten
# Ethernet Kabel an den Raspberry PI und HDMI Kabel an Fernseher anschliessen Netzteil einstecken
# IP Adresse des Raspberry PI Ethernet rausfinden (z.B. über Fritzbox Heimnetz, Netzwerk)
# Die IP Adresse in die /etc/hosts als "raspberry" eintragen.
$ sudo raspi-config # "Expand Filesystem" ausführen und System neu booten
# Mit ssh wieder einloggen und mit raspi-config die Boot Opion "requiring login" und deutsche Zeichen einstellen.

Raspberry Pi 1 - 700Mhz - 1 Kern - 512MB Ram
Mit nur 512MB Ram ist es besser den kleinen Kweb Browser mit möglichst wenig zusätzlichen Programmen, anstelle von Firefox zu installieren.
Kweb Browser installieren
Neueste Version ist hier zu finden: http://www.raspberrypi.org/forums/viewtopic.php?t=40860
$ cd ~/Downloads # In das downloads Verzeichnis des Raspi wechseln
$wget http://steinerdatenbank.de/software/kweb_x.y.z.tar.gz
$ tar ­xvf kweb_x.y.z.tar.gz
$ cd kweb­x.y.z
$ ./debinstall
$ sudo apt-get install xterm
$ sudo apt-get install youtube-dl
$ sudo youtube-dl -U # Muss 2 x ausgeführt werden
$ sudo apt-get install vlc
$ sudo apt-get install matchbox-window-manager # Benutzen wir als Windowmanager
$ ./check.py

$ sudo vi /etc/inittab # Auf dem Raspi
Nach folgender Zeile suchen:
1:2345:respawn:/sbin/getty --noclear 38400 tty1
Die obige Zeile mit "#" auskommentieren und die folgende Zeile dahinter einfügen:
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1

$sudo vi /etc/rc.local # Auf dem Raspi
Die folgende Zeile vor der Zeile "exit 0" einfügen.
su -l pi -c "xinit ./kiosk"

Raspberry Pi 2 - 900Mhz - 4 Kerne - 1GB Ram
$ sudo apt-get install iceweasel # Firefox Browser installieren
$ sudo apt-get install iceweasel-l10n-de # Deutsche Menüs für Iceweasel
$ sudo dpkg-reconfigure locales # Systemsprache auf Deutsch umstellen

Konfiguration - Odroid-U3
Die Konfiguration eines Odoid Computers mit eMMC Karte ist sehr einfach, da Linux schon vorinstalliert ist. Einfach alles zusammenbauen, anschliessen und einschalten.

Odroid-U3 Image auf eMMC oder microSDHC Karte schreiben
Das habei ich noch nie gemacht, ist aber unter http://odroid.com/dokuwiki/doku.php?id=en:odroid-u3 beschrieben.

Odroid-U3 mit der Linux eMMC oder der erstellten SDHC Karte booten
# Ethernet Kabel an den Odroid und HDMI Kabel an Fernseher anschliessen Netzteil einstecken
# IP Adresse des Odroid Ethernet rausfinden (z.B. über Fritzbox Heimnetz, Netzwerk)
# Die IP Adresse in die /etc/hosts als "odroid" eintragen.
$ ssh odroid@odroid # Das Passwort ist odroid
$ sudo odroid-utility.sh starten und "Expand Filesystem" ausführen - System bootet danach neu.

Konfiguration - Odroid-U3 und Raspberry Pi - alle Versionen
#
# Ohne Passwort in den Raspi/Odroid einloggen
#
$ ssh pi@raspberrypi | odroid@odroid
$ mkdir .ssh
$ exit
Vom Mac aus eingeben
$ cat ~/.ssh/id_rsa.pub | ssh pi@raspberrypi 'cat >> .ssh/authorized_keys' # Ohne Passwort einloggen
# cat ~/.ssh/id_rsa.pub | ssh odroid@odroid 'cat >> .ssh/authorized_keys' # Ohne Passwort einloggen
# Bei Ubuntu Systemen: ssh-copy-id -i ~/.ssh/id_rsa.pub odroid@odroid
$ ssh pi@raspberrypi | odroid@odroid # geht jetzt ohne Passwort
#
# Zusätzliche Programme installieren
#
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install netatalk # AFP Client zum mounten des Rapi vom Mac aus installieren
$ sudo apt-get install synergy # System vom Mac aus steuern - Nicht Raspberry Pi Version 1
$ sudo apt-get install xdotool # Tastendrücke simulieren für Browser Reload
$ sudo apt-get install unclutter # Den Mouse Cursor verstecken
$ sudo apt-get install x11-xserver-utils # xset um den Bildschirmschoner abzuschalten
$ sudo apt-get install screen # Virtuelle Terminals
#
# Als Einzeiler
#
$ sudo apt-get install netatalk synergy xdotool unclutter x11-xserver-utils screen
#
$ sudo dpkg-reconfigure tzdata # Zeitzone einstellen

homepage.html in der Home Directory erstellen
#
# Beim Raspi, Raspi2, Mac und Odroid
#
$ vi ~/homepage.html # Mit dem Inhalt
<META http-equiv="REFRESH" content="0; url=Downloads/DisplayPlaylist/DisplayPlaylist.htm">

Autostart Verzeichnis - Raspberry 2 und Odroid
# Beim Raspberry 2 in
$ sudo vi /etc/xdg/lxsession/LXDE-pi/autostart
# Beim Odroid in
# ~/.config/lxsession/Lubuntu/autostart
# Die folgenden Zeilen ans Ende anfügen :
@setxkbmap -layout "de,de" -model macbook79
#
# Remove Idle Cursor, Switch off Screensaver and Disable Energy Star Features
#
@unclutter
@xset s off
@xset -dpms
#
# Start Synergy Client and connect to Server - Control raspi from my Mac
#
@synergyc --name raspi | odroid XXX.XXX.XXX.XXX # IP Adresse vom Mac
#
# Start DisplayPlaylist Script
#
@/home/pi/Downloads/DisplayPlaylist/DisplayPlaylist.pl RaspberryPi2
# @/home/odroid/Downloads/DisplayPlaylist/DisplayPlaylist.pl Odroid
#
# Start FireFox Browser
#
@/home/pi/Downloads/DisplayPlaylist/Start.firefox.fullscreen.sh Raspi
# @/home/odroid/Downloads/DisplayPlaylist/Start.firefox.fullscreen.sh Odroid

Miscellaneous
#
# In den Homedirectories vom Raspi oder Odroid und vom lokalen Mac "DisplayPlaylist.tar.gz" entpacken.
#
$ cd
$ tar -xvzf DisplayPlaylist.tar.gz
#
$ ssh pi@raspberry # Sollte automatisch einloggen
# $ ssh odroid@odroid # Sollte automatisch einloggen
$ vi .bashrc # Die folgenden Zeilen anfügen
alias l='ls -al'
cd Downloads/Displayplaylist
#
# Auf dem Mac "DisplayPlaylist.app" in den Ordner "/Applications" verschieben.
#
$ mv ~/DisplayPlaylist.app /Applications

Bei einem HD Ready TV bei einem Raspi
$ sudo vi /boot/config.txt # Die folgenden Zeilen hinzufügen
framebuffer_width=1920
framebuffer_height=1080

DisplayPlaylist über das Internet anzeigen
$ sudo apt-get install apache2
$ cd /var/www
$ sudo mv html html.orig
$ sudo ln -s /home/pi|odroid/Downloads/Displayplaylist html
$ cd /home/pi|odroid/Downloads/Displayplaylist
$ sudo ln -s DisplayPlaylist.htm index.htm
# Dynamische IP-Adresse besorgen und im Router konfigurieren.
# Beispiel: http://el-duende.no-ip.org
# Nicht vergessen im Router Port 80 auf den Raspi oder Odroid umzuleiten
#
# Wenn auch der Ton auf die Webseite soll, dann muss Nicecast auf dem Mac installiert werden und
# im Router der Port 8000 auf den Mac umgeleitet werden (https://www.rogueamoeba.com/nicecast/)

Neu booten und fertig ist es
Die Perlscripte und der Kweb Browser werden jetzt automatisch gestartet. Nur noch "DisplayPlaylist.app" auf dem Mac starten und den gewünschten Player auswählen.

Backup der SDHC Karte nicht vergessen
Backup der SD Karte auf dem Mac oder unter Linux machen schadet sicherlich nicht :-)
- Umounten der Filesysteme der SD, das richtige Device herausfinden und den Backup der SD starten
$ sudo dd bs=1m if=/dev/sdb of=YYYY-MM-DD-DisplayPlaylist.img