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 im Januar 2014 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/Music und Decibel (https://feisty-dog.com/decibel/). Auf dem Mac läuft das Programm "DisplayPlaylist", das eine HTML Datei in dem Verzeichnis ~user/Sites 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.

DisplayPlaylist ist mit der Entwicklungsumgebung "Lazarus Pascal" in Pascal geschrieben. Zum Auslesen der Musicplayer verwende ich AppleScript.

Der Fernseher ist über ein HDMI Kabel an einen Raspberry Pi (Raspi) Computer angeschlossen. Auf diesem Computer wird ein Browser gestartet. Im Browser wird die Adresse des Macs (auf dem ein Webserver laufen muss) angegeben. Der Betrieb mit dem Raspi 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.

Ihr könnt natürlich die Webseite auch mit dem Firefox Browser auf dem Bildschirm (oder dem zweiten Bildschirm) eures Mac angezeigen. Firefox kann mit "Cmd"-"Shift"-"F" in den Fullscreen Modus gebracht werden. Ihr könnt auch in "about:config" "browser.fullscreen.autohide" auf "true" setzen, damit die Tabs und die Adressleiste noch verschwinden.

Wenn der Player gerade nicht läuft, wird abhängig vom "Advertising" Modus die Datei "Advertising.htm", "Clock.htm" oder "Video.htm" angezeigt.

Wie man die Webseite aufruft, ist weiter unten unter "Webserver einrichten" beschrieben.

Benötigte Programme  
DisplayPlaylist Wird auf dem Mac gestartet.
~/.DisplayPlaylist.ini [DisplayPlaylist]
;Configuration File for DisplayPlaylist
;
;Location of html-files on localhost and the URL for the browser
;Set macSiteDir: $HOME/Sites is the default if not set here
;Example: macSiteDir=/Users/user/Sites/
;
;Set browserUrl: http:/$HOSTNAME/~$USER if not set here
;Example: browserUrl=http://mac/~user
;browserUrl=http://mac:8080
;
;If 'true' (default), genre is not Tango/Vals/Milonga set genre to 'Cortina'
;If 'false', genre is not changed
;Beispiel: changeToCortina=true
;
;runAsScript7Tracks.scpt, runAsScript7Music.sh or runAsScript7iTunes.sh
;Default: runAsScriptProg=runAsScript7Tracks.scpt
;
;Set advertising to: Off, Advertising, Clock or Video
advertising=Advertising
;
;Set musicPlayer to: Decibel, Swinsian or Music
musicPlayer=Decibel
;
[WindowPosition]
Top=25
Left=851
Height=363
Width=589
DisplayPlaylistHeader.htm
DisplayPlaylist.htm, index.html
"DisplayPlaylistHeader.htm" wird zur Erzeugung von "DisplayPlaylist.htm" benötigt, das vom Browser angezeigt wird. "index.html" ist ein symbolischer Link auf "DisplayPlaylist.htm"
Advertising.htm, Clock.htm,
Video.htm
Werden beim Stoppen der Musik je nach Status von "advertising" angezeigt.
FirefoxDelCache.sh
FirefoxRestart.sh
- Browser Cache auf dem Raspberry Pi für "URL Reload" löschen.
- Firefox auf Raspberry Pi mit URL für anderen Mac neu starten.
station-clock.js, excanvas.js,
live.js
JavaScripte für die Uhr und automatischen Browser reload
Verzeichnis images/ "ElDuendeLogo.gif" und "ElDuendeImage.pptx", die Powerpoint Datei. In dem Verzeichnis ElDuendeImage/ sind die einzelnen Bilder der Powerpoint Datei.
Verzeichnis videos/ Das Video für "Video.htm".
Benötigte Hardware  
Anzeigemedium Fernseher oder Beamer mit HDMI Schnittstelle - möglichst Full HD. Es funktioniert aber auch mit HD Ready.
Raspberry Pi Z.B. ein Raspberry Pi 4 mit Gehäuse, Netzteil und einer 16GB microSDHC Karte. Gibt es im http://www.rasppishop.de für ca. 60 Euro zu kaufen.
DisplayPlaylist Programm DisplayPlaylist.tar.gz - Sources und Binaries 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 Downloads-Verzeichnis und danach im Verzeichnis "Downloads/DisplayPlaylist" "./install.sh" ausführen. Das Programm wird unter /Applications und der Rest unter ~user/Sites/ installiert. Wer noch ein Mac OS mit iTunes hat, muss in der Datei "~/.DisplayPlaylist.ini" die Zeile ";runAsScriptProg=runAsScript7iTunes.sh" auskommentieren. Die Applikation "DisplayPlaylist" kann jetzt auf dem Mac gestartet werden und meldet sich mit der Bedieneroberfläche. Wenn bei einem neuen Lied der Browser seine Seite nicht automatisch aktualisiert, dann einfach den Cache des Browsers löschen.

Bedienung
- Unter "Advertising" kann "Advertising", "Video", "Clock" oder "Off" gewählt werden.
- Als "Music Player" kann "Decibel", "Music" oder "Swinsian" gewählt werden.
- Durch Klicken auf "Start Browser" den Browser auf dem Mac starten.
Informationen
- Konnte der Music Player erfolgreich ausgelesen werden.
- Mit welchem Skript wird der Music Player ausgelesen.
- Der Status des Musc Playsers - "Playing" oder "Stopped".
- Das gerade gespielte Lied.

Webserver einrichten
Python Webserver
Ohne einen Webserver auf dem Mac einzurichten funktioniert folgendes:
$ cd ~/Sites
$ python3 -m http.server --cgi 8080
Die Webseite des DisplayPlaylist Programmes vom Mac ist jetzt unter "http://mac:8080" im lokalen Netzwerk erreichbar.

Mac Webserver
$ sudo vi /etc/apache2/httpd.conf
Die Kommentare "#" von folgender Zeile entfernen.
#LoadModule userdir_module libexec/apache2/mod_userdir.so   # Bei mir Zeile 183
#Include /private/etc/apache2/extra/httpd-userdir.conf   # Bei mir Zeile 520
ServerName mac  # Bei mir Zeile 232
Wer PHP (Ab Mac OS 12 nicht mehr installiert) und Perl braucht.
#LoadModule php7_module libexec/apache2/libphp7.so   # Bei mir Zeile 186
#LoadModule perl_module libexec/apache2/mod_perl.so   # Line 187

$ sudo vi /private/etc/apache2/extra/httpd-userdir.conf
Den Kommentar "#" von folgenden Zeilen entfernen.
#Include /private/etc/apache2/users/*.conf     # Bei mir Zeile 19

$ sudo vi /etc/apache2/users/cs.conf
# Folgenden Inhalt in diese Datei schreiben.
<Directory "/Users/user/Sites/">
AllowOverride All
Options Indexes MultiViews FollowSymLinks
Require all granted
</Directory>

$ apachectl configtest
Syntax OK
$ sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist
# Nach Konfigurationsänderungen
$ sudo apachectl restart

Die Webseite des DisplayPlaylist Programmes ist jetzt unter "http://mac/~user" erreichbar.

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 mit dem "Raspberry Pi Imager" das "Raspberry Pi OS" auf eine SD Karte geschrieben werden. Wenn die SD Karte danach nicht mehr gemounted ist, dann kurz aus dem Mac rausnehmen und wieder reinstecken.

$ touch /Volumes/boot/ssh # ssh aktivieren
$ vi /Volumes/boot/wpa_supplicant.conf # WLAN konfigurieren
# Inhalt von /boot/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE
network={
ssid="ssid"
psk="Passwort"
key_mgmt=WPA-PSK
}

Raspberry Pi mit der erstellten SDHC Karte booten
# SD-Karte und Netzteil in Raspi einstecken. HDMI Kabel an Raspi und Monitor/Fernseher anschliessen.
# WLAN IP Adresse des Raspi rausfinden (z.B. über Fritzbox Heimnetz, Netzwerk)
# Die IP Adresse in die /etc/hosts als "raspberry" eintragen.
#
$ ssh pi@raspberry # Das Passwort ist "raspberry"
$ sudo apt update
# Mi "sudo apt upgrade" könnt ihr auf das neueste Raspberry Pi OS upgraden.
$ sudo apt install firefox-esr
$ sudo apt-get install xdotool unclutter x11-xserver-utils
$ sudo vi /etc/xdg/lxsession/LXDE-pi/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 FireFox Browser
#
@/usr/bin/firefox --kiosk http://mac/~user
#
$ sudo vi /boot/config.txt
# Die folgenden Zeilen hinzufügen
framebuffer_width=1920
framebuffer_height=1080
$ sudo reboot

Die Applikation "DisplayPlaylist" kann jetzt auf dem Mac gestartet werden und meldet sich mit der Bedieneroberfläche.