baf

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 '';