ubuntuusers.de

Skript überarbeiten

Status: Gelöst | Ubuntu-Version: Xubuntu 18.04 (Bionic Beaver)
Antworten |

hellmi666

Avatar von hellmi666

Anmeldungsdatum:
30. August 2007

Beiträge: 238

Wohnort: Zwickau

Hallo Leute,

ich habe mit meinen beschränkten Kenntnissen ein Skript erstellt, welches mir die ID3-Tags der Musiktitel auf dem mp3-Player neu schreibt und danach ein fatsort durchführt.

Es funktioniert. Einwandfrei wäre aber zu viel gesagt, denn es dauert bei ca. 30 Alben auf dem Player fast eine Stunde, bis es durchgelaufen ist.

Wo befindet sich der Flaschenhals? Geht es irgendwie schneller zu machen? Wenn ja, wie?

Ich hoffe, ihr könnt mir helfen. Hier das Skript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#! /bin/bash

dev=$(sudo blkid | grep -i mp3-PLAYER | cut -d':' -f1)
player=$(ls /run/media/hellmi666 | grep -i mp3-PLAYER)

find /run/media/hellmi666/$player -type f -name '*.mp3' | sort -u | while read song
do
    interpret=$(echo $song | cut -d'/' -f6)
    album=$(echo $song | cut -d'/' -f7)
    titel=$(echo $song | cut -d'/' -f8 | cut -d'-' -f2- | sed -e 's/.mp3//g')
       
    id3v2 -D "$song"
    id3v2 -a "$interpret" -A "$album" -t "$titel" "$song"
done
play .sounds/fertig.wav
sleep 5    
sudo umount /run/media/hellmi666/$player
sleep 2
sudo fatsort $dev
sleep 5

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

hellmi666 schrieb:

Es funktioniert. Einwandfrei wäre aber zu viel gesagt, denn es dauert bei ca. 30 Alben auf dem Player fast eine Stunde, bis es durchgelaufen ist.

Wo befindet sich der Flaschenhals? Geht es irgendwie schneller zu machen? Wenn ja, wie?

Ohne das Skript schon angeschaut zu haben, ist IO ein heißer Kandidat. Da muss ja eine Menge auf den Flash-Speicher des Players geschrieben werden. Du kannst ja mal mit iostat nachschauen, während Du eine große Datei mit dd status=progress conv=fsync if=quelle of=ziel auf den Player kopierst - damit hast Du dann den maximalen Durchsatz ermittelt. Dann lässt Du Dein Skript laufen und schaust wieder mit iostat nach, wie nahe Du an das mögliche Maximum kommst.

Ich schaue mir das Skript später noch mal an, aber soweit sehe ich keine nötigen Änderungen, die etwas mit der Laufzeit zu tun haben. Ich würde ein paar Sachen schlicht anders machen.

hellmi666

(Themenstarter)
Avatar von hellmi666

Anmeldungsdatum:
30. August 2007

Beiträge: 238

Wohnort: Zwickau

Mit dd funktioniert das nicht. es kommt die Meldung

1
dd: konnte '/run/media/hellmi666/MP3-PLAYER' nicht öffnen: Ist ein Verzeichnis

Aber ich muss es doch in "irgendein Verzeichis" kopieren, in eine Datei gehts ja gleich gar nicht.

Ich habe aber festgestellt, wenn ich mein Skript in einem Ordner auf einer Festplatte laufen lasse, ist es nach ein paar Sekunden fertig. Daher vermute ich, dass es an der Verbindung Zwischen PC und Player liegen könnte, obwohl auch die Festplatte (extern) an USB angeschlossen ist. Oder gibt es da noch etwas Anderes zu beachten?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

hellmi666 schrieb:

Mit dd funktioniert das nicht. es kommt die Meldung

1
dd: konnte '/run/media/hellmi666/MP3-PLAYER' nicht öffnen: Ist ein Verzeichnis

Aber ich muss es doch in "irgendein Verzeichis" kopieren, in eine Datei gehts ja gleich gar nicht.

??? Du kannst nicht Dateiinhalt in ein Verzeichnis schreiben. Der dd war nur dazu gedacht, eine große Datei zu schreiben um die Geschwindigkeit zu ermitteln um zu erkennen, ob es überhaupt ein Problem in Deinem Skript gibt.

Ich habe aber festgestellt, wenn ich mein Skript in einem Ordner auf einer Festplatte laufen lasse, ist es nach ein paar Sekunden fertig. Daher vermute ich, dass es an der Verbindung Zwischen PC und Player liegen könnte, obwohl auch die Festplatte (extern) an USB angeschlossen ist. Oder gibt es da noch etwas Anderes zu beachten?

Jetzt ist auf einmal von einer Festplatte die Rede. Am Anfang hieß es MP3-Player. Das ist normalerweise Flash und u.U. langsam.

hellmi666

(Themenstarter)
Avatar von hellmi666

Anmeldungsdatum:
30. August 2007

Beiträge: 238

Wohnort: Zwickau

rklm schrieb:

Jetzt ist auf einmal von einer Festplatte die Rede. Am Anfang hieß es MP3-Player. Das ist normalerweise Flash und u.U. langsam.

Jetzt hast du mich aber falsch verstanden. Ich hatte anfangs die Dateien zuerst auf den mp3-Player kopiert und dann das Skript drüber laufen lassen, was ca. eine Stunde dauerte.

Dann habe ich die Dateien in einen Ordner auf einer externen Festpatte kopiert und das Skript drüber laufen lassen, was ca. 30 - 40 Sekunden dauerte.

Und das, obwohl beide an USB hingen.

Und danach verschob ich diese auf den Player. Zeitgewinn ca. 55 Minuten.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

hellmi666 schrieb:

Und danach verschob ich diese auf den Player. Zeitgewinn ca. 55 Minuten.

Also gelöst?

Ich sehe gerade, die Ermittlung der Metadaten hängt von der Anzahl der Elemente im Pfad ab. Das ist nicht sehr verlässlich. Sobald da ein Verzeichnis mehr oder weniger ist, geht es schief.

hellmi666

(Themenstarter)
Avatar von hellmi666

Anmeldungsdatum:
30. August 2007

Beiträge: 238

Wohnort: Zwickau

rklm schrieb:

Ich schaue mir das Skript später noch mal an, aber soweit sehe ich keine nötigen Änderungen, die etwas mit der Laufzeit zu tun haben. Ich würde ein paar Sachen schlicht anders machen.

rklm schrieb:

Am Anfang hieß es MP3-Player. Das ist normalerweise Flash und u.U. langsam.

rklm schrieb:

Also gelöst?

Also wenn der Zeitverlust nicht auf das Skript zu schieben ist, was ich anfangs aber dachte, sondern auf den Flashspeicher des Players, woran ich nichts ändern kann, dann werde ich es so machen, wie im letzten Post beschrieben. Also gelöst.

rklm vielen Dank für deine Hilfe zur Selbsthilfe. Ohne diesen Thread wäre ich nie auf die Idee gekommen, es anders rum zu probieren.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

hellmi666 schrieb:

rklm vielen Dank für deine Hilfe zur Selbsthilfe. Ohne diesen Thread wäre ich nie auf die Idee gekommen, es anders rum zu probieren.

Bitte! Aus Spaß habe ich mal eine Variante geschrieben (allerdings wenig getestet), die die Dateien aus einem auf der Kommandozeile angegebenen Verzeichnis oder dem Player selber lesen und in einer temporären Datei verarbeiten. Vielleicht findest Du da noch ein paar interessante Kniffe.

 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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/bin/sh

[ -z "$DEBUG" ] || set -x

set -e

# input - use player if missing
source="$1"

if [ -n "$source" -a ! -d "$source" ]; then
  echo "ERROR: not a directory: $source" >&2
  exit 1
fi

# output
export player=$(lsblk --fs -o label,mountpoint --json | jq -r '.blockdevices | map(select(.label=="mp3-PLAYER")) | .[0].mountpoint')

if [ ! -d "$player" ]; then
  echo "ERROR: mountpoint not found" >&2
  exit 2
fi

# tmp storage
export tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' 0 INT TERM

# main
find "${source:-$player}" -type f -iname '*.mp3' -print0 | sort -zu | xargs -r0 sh -e${DEBUG:+x}c '
for song; do
  cp -af "$song" "tmpfile"

  title="${song##*/}"

  album="${song%/*}"
  album="${album##*/}"
  
  interpret="${song%/*/*}"
  interpret="${interpret##*/}"

  if [ -z "$interpret" ]; then
    echo "ERROR: not enough information for $song" >&2
    exit 3
  fi

  id3v2 -D "$tmpfile"
  id3v2 -a "$interpret" -A "$album" -t "$title" "$tmpfile"

  mv -f "$tmpfile" "$player/$interpret/$album/$title"
done
' --

play .sounds/fertig.wav
sleep 5    

sudo umount "$player"
sleep 2

sudo fatsort "-D=$player"
sleep 5

Edit: da fehlte ein export.

hellmi666

(Themenstarter)
Avatar von hellmi666

Anmeldungsdatum:
30. August 2007

Beiträge: 238

Wohnort: Zwickau

rklm schrieb:

Vielleicht findest Du da noch ein paar interessante Kniffe.

Das schaut im ersten Moment für mich etwas zu kompliziert aus. Muss ich mich mal durchwursteln.

Was mich aber sofort wundert, ist, dass von Zeile 29 bis 49 kein Synthaxhighlighting (oder wie das heißt) mehr vorhanden ist. Als wenn ein ' zu viel wäre. Oder muss das so sein?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

hellmi666 schrieb:

Was mich aber sofort wundert, ist, dass von Zeile 29 bis 49 kein Synthaxhighlighting (oder wie das heißt) mehr vorhanden ist. Als wenn ein ' zu viel wäre. Oder muss das so sein?

Ja, muss so, weil das eine Zeichenkette ist.

hellmi666

(Themenstarter)
Avatar von hellmi666

Anmeldungsdatum:
30. August 2007

Beiträge: 238

Wohnort: Zwickau

OK. Ich werde mich damit mal beschäftigen.

Auf alle Fälle danke ich dir für deine kompetente Hilfe. Du bist mein Held.

Antworten |