Grund
Einmal im Leben möchte ich ein Projekt gut dokumentiert wissen.
Beschreibung
Vom ersten Teil, über „London 1969“ bis hin zu Teil 2 hatte man die Möglichkeit, über eine bestimmte Taste, mehr oder minder zufällig, einen von zwei Tönen wiedergeben zu lassen. Zumindest getrennt von einander einen von beiden Tönen bei bedarf abspielen zu können, ist der Grund dieses Projekts. Schön kryptisch beschrieben. Absolut ausschließend, wenn man nicht weiß, wovon im ersten Satz die Rede ist…
Audios
Der Weg von der Beschaffung, über die Aufbereitung bis hin zur fertigen Datei ist irrelevant. Fakt ist, dass sich für die Shell cvlc empfiehlt, wenn man ohnehin schon VLC nutzt. Ansonsten muss halt auf irgendeine Weise über das Terminal die Wiedergabe von Audios möglich gemacht werden.
Ordnerstruktur
Gehen wir davon aus, dass die Sounds systemweit einsetzbar sein sollen, müssen wir sie folglich in /usr/local/bin hinterlegen; zur besseren Übersicht empfehle ich Unterordner.
baf
bafb.sh
baff.sh
Burp.mp3
Fart.mp3
randbaf
Skripte
In beiden Fällen ist es wichtig, dass der absolute Pfad angegeben wird.
bafb.sh
#!/bin/bash
cvlc --play-and-exit --no-video --quiet /usr/local/bin/baf/Burp.mp3 vlc://quit &> /dev/null
baff.sh
#!/bin/bash
cvlc --play-and-exit --no-video --quiet /usr/local/bin/baf/Fart.mp3 vlc://quit &> /dev/null
Bonus: Ein einziges Skript, das Parameter akzeptiert – baf
#!/usr/bin/env bash
while getopts "bf" opt; do
case $opt in
b) FILE="/usr/local/bin/baf/Burp.mp3" ;;
f) FILE="/usr/local/bin/baf/Fart.mp3" ;;
esac
done
[ -z "$FILE" ] && { echo "Usage: $0 -b|-f"; exit 2; }
cvlc --play-and-exit --no-video --quiet "$FILE" vlc://quit &> /dev/null
Skript, dass immer eine andere Datei wiedergibt
Auch wenn das bei nur zwei auswählbaren Dateien etwas witzlos ist… ABER!!! Wir werden das später (also irgendwann in der Zukunft) bestimmt nochmal irgendwo brauchen!
#!/bin/bash
MP3_DIR="/usr/local/bin/baf/"
LAST_PLAYED_FILE="/tmp/last_played_sound.txt"
# Liste aller MP3s
mapfile -t FILES < <(find "$MP3_DIR" -type f -iname "*.mp3")
# Prüfen ob leer
if [[ ${#FILES[@]} -eq 0 ]]; then
echo "Keine MP3-Dateien gefunden in $MP3_DIR"
exit 1
fi
# Letztes abgespieltes MP3 merken
LAST=""
[[ -f "$LAST_PLAYED_FILE" ]] && LAST=$(<"$LAST_PLAYED_FILE")
# Zufällig wählen, aber nicht dasselbe wie beim letzten Mal
while true; do
CANDIDATE="${FILES[RANDOM % ${#FILES[@]}]}"
[[ "$CANDIDATE" == "$LAST" ]] && continue
break
done
echo "$CANDIDATE" > "$LAST_PLAYED_FILE"
#echo "Spiele ab: $CANDIDATE"
cvlc --play-and-exit --no-video --quiet "$CANDIDATE" vlc://quit &> /dev/null
Weitere Verarbeitung
Wie schon mit espeak, so wird auch diese Arbeit in einige andere Projekte mit einfließen. Bei einem Update beispielsweise:
#!/bin/fish
nala update;
nala upgrade -y;
nala full-upgrade -y;
nala autoremove -y;
nala autopurge -y;
echo '';
/usr/local/bin/baf/bafb.sh;
echo '$> done.';
echo '';