DuckDuckDo
Anmeldungsdatum: 7. Dezember 2018
Beiträge: Zähle...
|
Hallo zusammen, ich versuche eine Bash Script Datei zu erstellen die alle 3 Minuten den nächsten Song auswählt.
Hintergrund ist, dass ich mir einen Raspberry Pi 3 teile und wir eine gemeinsame Musikplaylist darauf laufen lassen.
Damit alles aber fair läuft (Da wurden stellenweise ellenlange Lieder in die Playliste aufgenommen, aber bei meinem "Warriors of the World" von Manowar hieß es dann "Wir müssen was tun!") haben wir uns entschlossen, dass 3 Minuten eine faire Basis sind für ein Maximum. Kann sich jemand meinen Code mal anschauen? Irgendwo hakt es, aber ich bin mit meinem Latein am Ende. Die Datei hatte ich auch nur play.sh genannt. Viele liebe Grüße
DuckDuckDo 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 | #!/bin/bash
MPC='mpc -p 6600'
PLAY_TIME=180
function get_track
{
echo $($MPC status --format "%file%" | awk 'NR==1')
}
function get_state
{
echo $($MPC status | awk 'NR==2')
}
function get_elapsed
{
echo $(echo $1 | awk '{split($3,t,"[/:]"); print (t[1]*60 + t[2])}')
}
LAST_TRACK=""
while : ; do
STATE=`get_state`
echo "state is $STATE"
if echo $STATE | grep -q "playing" ; then
CURRENT_TRACK=`get_track`
if [ "$LAST_TRACK" != "$CURRENT_TRACK" ] ; then
echo "Now playing -> $CURRENT_TRACK"
LAST_TRACK=$CURRENT_TRACK
sleep 5
else
ELAPSED=`get_elapsed "$STATE"`
if [ $ELAPSED -gt $PLAY_TIME ] ; then
echo "Trigger skip ($ELAPSED)"
$MPC next
else
WAIT_TIME=`expr $PLAY_TIME - $ELAPSED`
echo "Keep playing for $WAIT_TIME"
sleep $WAIT_TIME
fi
fi
else
echo "Waiting for playback to start..."
$MPC idle player > /dev/null
fi
done
|
|
dingsbums
Anmeldungsdatum: 13. November 2010
Beiträge: 3532
|
Deine einzelnen Funktionen und die Logik der Schleife hast Du ja sicher getestet. Wo hakt es denn? Woher bekommt der Player die Info, wo und welche Lieder zur Verfügung stehen? Und welche in einem bestimmten Zeitraum schon abgespielt worden sind?
|
DuckDuckDo
(Themenstarter)
Anmeldungsdatum: 7. Dezember 2018
Beiträge: 3
|
dingsbums schrieb: Deine einzelnen Funktionen und die Logik der Schleife hast Du ja sicher getestet. Wo hakt es denn? Woher bekommt der Player die Info, wo und welche Lieder zur Verfügung stehen? Und welche in einem bestimmten Zeitraum schon abgespielt worden sind?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 | #!/bin/bash
MPC='mpc -p 6600'
PLAY_TIME=40
function get_track
{
echo $($MPC status --format "%file%" | awk 'NR==1')
}
function get_state
{
echo $($MPC status | awk 'NR==2')
}
function get_elapsed
{
echo $(echo $1 | awk '{split($3,t,"[/:]"); print (t[1]*60 + t[2])}')
}
LAST_TRACK=""
while : ; do
STATE=`get_state`
echo "state is $STATE"
[mark] if [ $STATE | grep -q "playing" ] ; then[/mark]
CURRENT_TRACK=`get_track`
if [ "$LAST_TRACK" != "$CURRENT_TRACK" ] ; then
echo "Now playing -> $CURRENT_TRACK"
LAST_TRACK=$CURRENT_TRACK
sleep 5
else
ELAPSED=`get_elapsed "$STATE"`
if [ $ELAPSED -gt $PLAY_TIME ] ; then
echo "Trigger skip ($ELAPSED)"
$MPC next
else
WAIT_TIME=`expr $PLAY_TIME - $ELAPSED`
echo "Keep playing for $WAIT_TIME"
sleep $WAIT_TIME
fi
fi
else
echo "Waiting for playback to start..."
$MPC idle player > /dev/null
fi
done
|
Eine fehlerhafte Zeile konnte ich fixen. Am Ende erscheint Syntax error: "done" unexpected (expecting "then")
Aber ein Done am Ende muss doch hin oder? Ich bin ehrlich, ich beschäftige mich erst seit zwei Wochen mit Shell Scripting in Python.
Ich beschäftigte mich sonst hauptsächlich mit SQL Datenbanken XD
|
dingsbums
Anmeldungsdatum: 13. November 2010
Beiträge: 3532
|
Ich rücke immer per TAB ein, das macht die Sache wesentlich übersichtlicher. Dein Fehler war wohl Zeile 23. In 25 hab ich auch mal geändert. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 | #!/bin/bash
MPC='mpc -p 6600'
PLAY_TIME=40
function get_track
{
echo $($MPC status --format "%file%" | awk 'NR==1')
}
function get_state
{
echo $($MPC status | awk 'NR==2')
}
function get_elapsed
{
echo $(echo $1 | awk '{split($3,t,"[/:]"); print (t[1]*60 + t[2])}')
}
LAST_TRACK=""
while : ; do
STATE=`get_state`
echo "state is $STATE"
if [ "$STATE" == "playing" ];
CURRENT_TRACK=`get_track`
if [ ! "$LAST_TRACK" == "$CURRENT_TRACK" ] ; then
echo "Now playing -> $CURRENT_TRACK"
LAST_TRACK="$CURRENT_TRACK"
sleep 5
else
ELAPSED=`get_elapsed "$STATE"`
if [ $ELAPSED -gt $PLAY_TIME ] ; then
echo "Trigger skip ($ELAPSED)"
$MPC next
else
WAIT_TIME=`expr $PLAY_TIME - $ELAPSED`
echo "Keep playing for $WAIT_TIME"
sleep $WAIT_TIME
fi
fi
else
echo "Waiting for playback to start..."
$MPC idle player > /dev/null
fi
done
|
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2503
|
Hab’ noch ein paar Sachen: Die echo -Orgien kann man sich sparen. Da fehlte ein then . Mit mpc current kommst du ohne awk an den aktuell gespielten Titel. Nur in deinem ursprünglichen geposteten Code funktioniert die Erkennung des Status (playing oder was anderes). Habe das mal so umgebaut, dass mit awk direkt gematcht wird, ob die zweite Zeile mit [playing] anfängt – nur, wenn das zutrifft, gibt awk überhaupt etwas aus, also kann man später prüfen, ob $state leer ist oder nicht. Du hattest geprüft, ob $elapsed -gt $play_time , und nur dann wird zum nächsten Titel gesprungen. Heißt, wenn die beiden Zahlen identisch sind, dann machst du ebenfalls ein sleep , aber mit 0 Sekunden. Dadurch geht das Skript nicht kaputt, aber du hast mehrere unnötige und unschöne Ausgaben. (Nur eine Konvention: Shell-Variablen klein schreiben, Umgebungsvariablen groß.) (Im Moment sind Bash-Schreibweisen und POSIX-sh-Schreibweisen fröhlich gemischt. Kann man irgendwann später noch aufräumen.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 | #!/bin/bash
mpc='mpc -p 6600'
play_time=10
function get_track
{
$mpc current --format '%file%'
}
function get_state
{
$mpc | awk 'NR == 2 && /^\[playing\] /'
}
function get_elapsed
{
echo "$1" | awk '{split($3,t,"[/:]"); print (t[1]*60 + t[2])}'
}
last_track=""
while : ; do
state=`get_state`
echo "state is [$state]"
if [ -n "$state" ] ; then
current_track=`get_track`
if [ ! "$last_track" == "$current_track" ] ; then
echo "Now playing -> $current_track"
last_track="$current_track"
sleep 5
else
elapsed=`get_elapsed "$state"`
if [ $elapsed -ge $play_time ] ; then
echo "Trigger skip ($elapsed)"
$mpc next
else
wait_time=`expr $play_time - $elapsed`
echo "Keep playing for $wait_time"
sleep $wait_time
fi
fi
else
echo "Waiting for playback to start..."
$mpc idle player > /dev/null
fi
done
|
Man kann nochmal überlegen, ob man die Variable $mpc so benutzen will. Es gibt auch noch die Umgebungsvariablen $MPD_HOST und $MPD_PORT , die von mpc automatisch ausgewertet werden.
|
DuckDuckDo
(Themenstarter)
Anmeldungsdatum: 7. Dezember 2018
Beiträge: 3
|
Erstmal vielen lieben Dank für die Überarbeitung.
Bin das zum besseren Verständnis nochmal ein paar mal gedanklich durchgegangen. Zu Punkt 3: Das wusste ich noch nicht! Perfekt! Danke
Zu Punkt 5: Da lass ich mir eventuell noch was schickeres einfallen 😀 Das Script funktioniert nun erstmal ordentlich.
Ich spiele noch mit ein paar Varianten rum aber das eigentliche Script ging gerade in den Live Betrieb XD Vielen Dank nochmal!
|