Bash X Party: Filmabend als Trinkspiel
Einen Film gucken und per Bash-Skript in ein Trinkspiel verwandeln - klingt bescheuert? Aber sicher ;)
Also ob dieser Artikel nun pädagogisch wertvoll ist oder nicht, soll eine höhere Instanz entscheiden ... Aber Ihr lernt was Sinnvolles über Bash-Scripting und könnt das Trinken gerne durch Beten, PC-Tweets oder so ersetzen, falls Ihr Eure höhere Instanz beindrucken wollt. Oder macht halt Situps. Es geht eigentlich nur darum, einen Film in zufälligen Intervallen zu unterbrechen, eine zufällige andere Mediendatei für eine kurze Zeit abzuspielen und den Film dann fortzusetzen.
Nu isser übergeschnappt
Wie man aus Filmen stilsicher ein Trinkspiel macht, zeigen seit Jahren Kalkofe und Rütters bei SchleFaZ. Aber Techies machen ja gerne alles selbst, hier also eine rudimentäre Variante - aber immerhin einfach anpassbar, was Trinkmenge und/oder Aufgaben angeht. Das Spiel an sich ist recht trivial: Ihr schaut einen Film und dieser wird in zufälligen Abständen unterbrochen und es wird eine (zufällig ausgewählte) Mediendatei abgespielt, beispielsweise ein Musikvideo, das Euch irgendwie passend erscheint. Oder auch nur Musik oder ein Bild, spielt eigentlich keine Rolle. Länger als ein Minütchen oder so sollte aber nicht unterbrochen werden, schließlich läuft ja noch ein Film.
Und ja klar, infantiler Quatsch - das Fernsehen ist schuld!
Die Einspieler könnt Ihr dann beliebig als "Aufgaben" interpretieren. Also etwa bestimmte Clips für bestimmte Shots - wie wäre es mit Werbespots der vorrätigen Spirituosen? Hätte was von Eis-Unterbrechung im Kino. Oder Bilder der Mitspieler, falls immer nur einzeln getrunken wird. Oder Clips mit sonstigen Aufgaben zum Nachahmen ...
Die Technik: Hier soll es mal ausnahmsweise mal unter Windows laufen, mit der Bash-Kommanodzeile und dem Media Player Classic. Ob eine Unterbrechung kommen soll, wird minütlich entschieden, mit einer Wahrscheinlichkeit von 10 Prozent. Klingt wenig? Nun, bei einem 140-Minuten-Blockbuster wären das im Schnitt 14 Stück - wenig für M&Ms, viel für Schabau ... Umgesetzt wird der Ablauf mit $RANDOM, shuf, while-Schleife, if-Abfrage, printf, sleep und ein paar Variablen. Und ein wenig Mathe, aber nur wenig, keine Sorge ...
Scripting-Spaß
Da es hier ja um Basics geht: Erst der Ablauf im Detail, dann der Code, dann Erklärungen. Hier also nochmal der genaue Ablauf:
- Variablen festlegen (Wahrscheinlichkeit, Player und Zeitspannen)
- Funktion function_play_random definieren:
- Zufallszahl ermitteln
- if-Abfrage: Zufallszahl größer als 90?
- Ja: Filmzeit speichern, zufällige Unterbrechung einspielen, Film fortsetzen
- Nein: Film laufen lassen
- Hauptteil/Ablauf:
- Film starten und Zeit X laufen lassen
- while-Schleife: function_play_random endlos abspielen
Nun die Liste als Code:
#!/bin/bash
##### Variablen
# Wahrscheinlichkeit für Unterbrechung
probability=90
# Dauer des Films vor Spielstart
prelude=300
# Dauer der Unterbrechung
interlude=120
# Dauer zwischen Prüfungen
interval=60
# Pfad zu Media Player Classic
mpc="C:\Program Files\MPC-HC\mpc-hc64.exe"
##### Die Zufällig-Abspielen-Funktion
function_play_random ()
{
r=$(( $RANDOM % 100 + 1 ))
if [ $r -gt $probability ]; then
filmzeit_2=$( printf '%02d:%02d:%02s\n' $((filmzeit/3600)) $((filmzeit%3600/60)) $((filmzeit%60)))
"$mpc" -play -randomize -fullscreen -startpos 00:00:00 -monitor 2 "$(ls /media/playlists/* | shuf -n 1)" &
sleep $interlude
"$mpc" -play -monitor 2 -fullscreen -startpos $filmzeit_2 "$1" &
sleep $interval
filmzeit=$(( $filmzeit+$interval ))
else
sleep $interval
filmzeit=$(( $filmzeit+$interval ))
fi
}
##### Ablauf
##### Prelude: Erstmal 5 Minuten Film, für die Kunst.
"C:\Program Files\MPC-HC\mpc-hc64.exe" -play -fullscreen -monitor 2 "$1" &
filmzeit=$prelude
sleep $prelude
while true; do
function_play_random "$1"
done
Beim Aufrufen des Skripts (random_game.sh) müsst Ihr lediglich den Dateinamen des abzuspielenden Films übergeben:
./random_game.sh ScaryMovie_3.mv4
Fangen wir unten im Code beim Ablauf an: Zunächst wird der übergebene Film ($1) mit dem Media Player Classic ($mpc) abgespielt (-play -randomize -fullscreen -startpos 00:00:00 -monitor 2 sind MPC-Optionen, um die Playliste zufällig und im Vollbild auf einem bestimmten Monitor zu starten). Gleichzeitig (&) wird ein Timer mit sleep gestartet, der die per prelude vorgegebene Zeit (hier 5 Minuten/300 Sekunden) läuft. Die Position des Films wird in der Variablen filmzeit gespeichert - hier zunächst also ebenfalls 300.
Danach läuft die Funktion in Endlosschleife.
Die eigentliche Arbeit steckt natürlich in der Funktion function_play_random. Zunächst wird mit der Bash-internen Funktion $RANDOM eine Zufallszahl r zwischen 1 und 100 ermittelt. Die if-Abfrage prüft dann, ob diese größer als der Wert $probability (hier 90) ist.
Falls r größer als 90 ist: Zunächst wird die aktuelle filmzeit (300) umformatiert und als 00:05:00 in filmzeit_2 gespeichert - so wird es vom Player benötigt, um den Film fortzusetzen. Dann wird die Unterbrechung aufgerufen: "$(ls /media/playlists/*.mpcpl | shuf -n 1)" listet alle Playlisten (.mpcpl) im gegebenen Ordner und das shuf-Kommando mischt diese zufällig durch (shuf von shuffle) und gibt eine davon aus. Das können natürlich auch andere Dateien sein.
Dann läuft wieder ein sleep-Timer mit der in interval gespeicherten Dauer (60 Sekunden). Danach wird der Film an Position filmzeit_2 fortgesetzt und wieder läuft der 60-Sekunden-Timer. Abschließend wird die filmzeit um diese 60 Sekunden erhöht (auf nun also 360).
Falls r nicht größer als 90 ist: Dann wird nur 60 Sekunden gewartet und die Filmzeit aktualisiert.
Mehr, Fragen, filmzeit_2
Man könnte natürlich noch weitere Dinge in Variablen packen, um es variabler zu machen. Oder auf die separate Funktion verzichten, um es weniger variabel zu gestalten. Oder alles viel eleganter lösen ;) Aber es funktioniert und als Fingerübung ist das alles ganz nett, weil Ihr seht, wie man mit Zufällen, Variablen und Zeitspannen ganz praktisch arbeiten kann.
Bei den Erklärungen sind natürlich noch ein, zwei Lücken, jede Syntax bis aufs letzte Zeichen zu erläutern ist eher kontraproduktiv. Aber wenn Euch irgendwas nicht klar ist: Fragen!
Eine nehme ich mal vorweg, wer das auswendig versteht, braucht vermutlich diesen Artikel nicht ;) Was bedeutet das hier?
filmzeit_2=$( printf '%02:%02:%02\n' $((filmzeit/3600)) $((filmzeit%3600/60)) $((filmzeit%60)))
Wenn filmzeit hier 630 Sekunden ist, ist filmzeit_2 entsprechend 00:05:30. printf wird zunächst angewiesen, die folgenden drei Variablen/Berechnungen jeweils zweistellig und durch Doppelpunkt getrennt auszugeben - mit führender Null (%02:). Die filmzeit in Sekunden geteilt durch 3600 ergibt die Stunden als ganze Zahl - hier also 630/3600=0. Die Minuten sind dann der Modulo derselben Werte geteilt durch 60 - also 630 mod 3600 / 630 = 5. Die Sekunden sind folglich 630 mod 60 = 30. Also eben 00:05:30 - und Media Player Classic lässt sich eben mit mpc-hc64.exe -startpos 00:05:30 bei Position 5 Minuten 30 Sekunden starten.
Laut Twitter ist heute bundesweiter Mathe-Abi-Tag - bräuchte es für das bisschen Arithmetik und Wahrscheinlichkeit sicherlich nicht. Dennoch: Viel Erfolg! Wir haben es alle gehasst, aber vielleicht könnt Ihr ja wenigstens mit einem Filmabend zelebrieren :)
Einstiegsbild basiert auf Foto von Marcelo Jaboo von Pexels
P.S.: Um einer weiteren unvermeidlichen Frage vorab gerecht zu werden: