Freitag, 12. Februar 2016

BashJuke oder wo war noch mal mein Lieblingsalbum?


Gib mir den Sound zurück.


Ich liebe gute Musik, genau genommen Hard Rock und Heavy Metal! Was lag da also näher, als bei der Arbeit am PC das Album der Wahl auf youtube zu hören. Also den Browser geöffnet, youtube.de in die Adresszeile und die Band gesucht, die mich bei meiner Arbeit begleitet. Dabei waren und sind es nicht nur die Klassiker wie Iron Maiden, Judas Priest oder ACDC, sondern gerne auch Newcomer der Metalszene. Jetzt war es aber immer so, dass nach dem schließen des Browsers die Newcomer-Alben verschwunden waren und mir die Namen der Bands später nicht mehr in den Sinn kamen, denn Lesezeichen hatte ich nicht angelegt. Ärgerlich! So überlegte ich mir, das Angenehme mit dem Nützlichen zu verbinden indem ich ein kleines Tool schrieb, dass es mir ermöglicht, die Alben – genau genommen die Stream-Adressen – zu speichern und bei Bedarf abzuspielen. Es entstand die erste Version von BashJuke.

BashJuke
BashJuke das "Hauptmenü"


 Was sollte BashJuke für mich tun?


Wie immer im Leben basiert alles auf ein Geben und Nehmen, so wollte ich BashJuke eine Streamadresse geben, die ich aus der youtube Adresszeile entnahm, dafür sollte BashJuke mir wohlklingenden Metalsound um die Ohren hauen. Diese Adresse sollte BashJuke in einer csv-Datei speichern und ich wollte diese Adresse aus dieser Datei extrahieren und sie dem VLCMedia Player übergeben, der den gewünschten Stream wiederum abspielt. So öffnete ich den VIM-Editor und schrieb mein Tool.


Lemmys Streamadresse für BashJuke


Wo sollen die Daten noch mal hin?


Zunächst muss BashJuke überprüfen ob die csv-Datei existiert, ich nannte sie soundlist.csv:

#!/bin/bash
clear

if [ -s soundlist.csv ]         # soundlist.csv existiert und ist nicht leer
then
echo "Es stehen abrufbare Alben zur Verfügung. Have fun!"
else
touch soundlist.csv
fi

Ich will Dir den Sound geben, aber sag mir womit.


Als nächstes gilt es zu überprüfen, ob der VLC-Medienplayer installiert ist:

which vlc > /dev/null
if [ $? == 0 ]
then                                            # ...wenn VLC installiert ist, Begrüßungsdialog
cat<<MENUE
bashJuke Version 0.0.2
Under GNU General Public License


Was möchten Sie tun?

1. Ein Album hinzufügen
2. Ein Album anhören
3. Soundliste bearbeiten
4. Beenden
MENUE

else
echo "Installieren Sie bitte den VLC Medien-Player"
fi

Was kann ich für Dich tun?


BashJuke bietet in dieser Version vier Optionen an, die ich ihm übergeben kann. Dazu benötigt er von mir Eingaben:

read -p "Geben Sie eine Option ein: " eingabe           # Option 4 beendet bashJuke

if [ "$eingabe" == "4" ]
then
exit 0
fi

Erst prüfen, dann liefern!


Um das zu tun was ich mir von diesem Tool verspreche, ist die korrekte Eingabe das A und O. BashJuke überprüft sie:

if [ -z "$eingabe" -o -n "`echo \"$eingabe\" | tr -d '[1-4]'`" ]
then                                                                   
echo "Geben Sie bitte eine Option von 1-4 an:"
exit 1
fi
clear


Ich hab da 'nen Stream den ich öfter mal hören will!


Um einen youtube-Stream in der Datei soundlist.csv zu speichern gab ich BashJuke folgenden Code mit auf den Weg:

if [ "$eingabe" == "1" ]                               # Album wird hinzugefügt...
then

nr=`awk -F";" 'NR {print $1}' soundlist.csv | wc -l`
((nr=$nr+1))

read -p "Geben Sie den Interpret ein: " interpret
clear

read -p "Geben Sie den Namen des Albums ein: " album
clear

read -p "Geben Sie das Jahr ein: " jahr
clear

read -p "Geben Sie die Quelle des Albums ein: " quelle

if [  "$quelle" == "" ]                               # Überprüft, ob Var $quelle leer ist
then
echo "Sie müssen mindestens die Quelle des Albums angeben!"
exit 1
fi

clear

datensatz=($nr\;$interpret\;$album\;$jahr\;$quelle)           # Array erzeugt csv Datei

echo -e ${datensatz[@]}>>soundlist.csv                # ...und der Datensatz an soundlist.csv

                                                      # angehängt
echo "Album hinzugefügt."
cp soundlist.csv soundlist.bak
fi


Hallo BashJuke, einmal Metal bitte!


Um in den Genuss des abgespeicherten Streams zu gelangen ist BashJuke so freundlich mir eine zwar etwas spartanische jedoch funktionierende Suchoption bereitzustellen:

# Album anhören

if [ "$eingabe" == "2" ]
then
clear
echo -e "Suchen Sie Ihr gewünschtes Album\n"

read -p "Geben Sie bitte den Suchbegriff ein: " such
clear
grep -i "$such" soundlist.csv | \
awk -F ";" 'BEGIN { print "\nNr Band Album Jahr"} \

# Gibt Muster auf stout aus
{ printf "%-10s %-15s %-25s %-25s\n", $1, $2, $3, $4 }'
# Filtert Adresse
grep -i "$such" soundlist.csv | awk -F";" '{ print $1, ";", $5 }'>/tmp/album

# Filtert Interpret
band=`grep -i "$such" soundlist.csv | awk -F ";" '{ print $2 }'`
echo "$band" >/tmp/band
artist=`uniq /tmp/band`
rm /tmp/band

echo -e "\nWelches Album von $artist möchten Sie sich anhören?\n"
read -p "Wählen Sie die Option des gewünschten Albums: " hear

# Bereitet Link auf
spiel=`grep -i "^$hear" /tmp/album | awk -F";" '{ print $2 }'`
rm /tmp/album

# Übergibt an vlc
nvlc $spiel
fi


Hey, die Streamadresse ist nicht mehr aktuell gib mir ne neue!


Da es häufiger einmal vorkommt, dass die Streamadressen auf youtube wechseln, ist BashJuke so freundlich mir eine Möglichkeit an die Hand zu geben, um die alte Adresse durch eine Aktuelle zu ersetzen. Der Einsatz von VIM ist hier gefragt:

# Überprüfen, ob vim installiert ist
which vim >/dev/null
if [ $? != 0 ]
then
echo "Installieren Sie bitte den vim-Editor"
elif [ "$eingabe" == "3" ]
then
vim soundlist.csv
fi


Na ja, elegant sieht anders aus!?


Zugegeben, diese Version ist alles andere als elegant und schöner Code ist etwas anderes. Das hier gezeigte Beispiel ist allerdings ein Beispiel dafür, was in der Shell in kurzer Zeit machbar ist um ein nützliches, dem Zweck angemessenes Tool zu schreiben. Es ist auf den speziellen Zweck zugeschnitten und tut, was es tun soll ;-)
Zu einem späteren Zeitpunkt werde ich hier die nach mehreren Versionssprüngen entwickelte aktuelle Version von BashJuke posten, die eine auf Zenity basierende grafische Benutzeroberfläche bereithält.

Ach ja, bevor ich es vergesse: Für den hier im Blog veröffentlichten Code übernehme ich weder irgendeine Haftung noch garantiere ich trotz Tests auf unterschiedlichen Systemen einen reibungslosen Ablauf der Programme.

Bis bald.

Keine Kommentare:

Kommentar veröffentlichen