Forum: PC-Programmierung Script/Batch um MP3 Dateien zu "mergen" gesucht


von Werner A. (homebrew)


Lesenswert?

Hallo,
da mein Autoradio leider nur 999 MP3 Tracks verwalten kann ist die 
Kapazizät von dem 8GB USB Stick natürlich nicht ausgenutzt.

Ich hab mir nun überlegt, ein Skript zu schreiben, das die MP3 Liste auf 
den Stick durchsucht und jeweils 2 oder 3 Tracks per MP3merge 
zusammenkopiert und die Originaldateien dann auf dem Stick löscht.

Mir ist klar, das damit die ID3 Tags "verloren gehen" aber das fände ich 
OK.
Kennt da jemand was, oder kann mir jemand ein passende Skriptsprache 
empfehlen? Ich würde gerne was nehmen, was ohne installation läuft.
Z.B. ne normale Batch Datei, Autohotkey, ...

Werner

von Εrnst B. (ernst)


Lesenswert?

in der Art?
1
find . -type f -name \*.mp3 -print0 | xargs -0 -n2 mp3merge.sh
mit mp3merge.sh: Script-File das X files als Parameter nimmt, diese 
merged, und danach löscht?

von Werner A. (homebrew)


Lesenswert?

Ja, sowas meine ich.
Jetzt habe ich ja schon schön jeweils 2 Files pro Zeile.
Prinzipiell kann man ja wohl auch per copy a+b c Befehl joinen, aber ich 
habe noch nicht verstanden, wie ich das zeilenweise innerhalb einer 
Batch auswerten kann.

von tom (Gast)


Lesenswert?

Es gibt ein Programm zum aneinanderhängen von mp3-Dateien, das Programm 
heißt mp3Merge. Leider gibt es keine eigene Homepage für das Programm, 
so dass du es am besten mit einer Suchmaschine deiner Wahl suchen musst.

von Matt (Gast)


Lesenswert?

http://mp3wrap.sourceforge.net/ ?

Wie das mit Windows geht, weiß ich nicht, mit bash wäre ein Vorschlag 
für Ernsts mp3merge.sh (ungetestet):

#!/bin/bash
if [ -f "$2" ]; then
     outfile="$(basename "$1" .mp3)"_and_"$(basename "$2")"
     mp3wrap "$outfile" "$1" "$2"
     rm "$1" "$2"
fi

von Werner A. (homebrew)


Lesenswert?

mp3wrap sieht super aus.

Ich habe mir jetzt mal die Windowsversion der Bash gezogen.
Leider bekomme ich nicht raus, wie ich die Parameterübergabe machen 
muss.

Prinzipiell würde ich mir das so vorstellen
1
find . -type f -name \*.mp3 -print0 | xargs -0 -n2 | bash mp3merge.sh
Die gefundenen Dateien werden per Pipe an xargs übergeben, das übergibt 
per pipe die "sortierte liste"  an das shell script.
Leider geht das so nicht.
Hat jemand erfahrung damit, wie man das macht?

von tom (Gast)


Lesenswert?

warum lädst du dir nicht einfach das windoof-programm mp3merge herunter? 
simpler geht es doch wohl kaum, damit kann man auch mehr als nur zwei 
mp3s aneinanderhängen. hier mal ein link 
http://www.technikteam.de/software/download.php?id=637 (stand 
03.06.2008)

von Werner A. (homebrew)


Lesenswert?

@tom
wenn ich Winmerge richtig verstanden habe, muss ich da die Dateien von 
Hand zusammenkopieren.
Ich möchte von ca. 2000 Dateien jeweils 2 Stk. zusammen kopieren.

von Εrnst B. (ernst)


Lesenswert?

Werner A. wrote:
> Prinzipiell würde ich mir das so vorstellen
>
1
find . -type f -name \*.mp3 -print0 | xargs -0 -n2 | bash mp3merge.sh
> Die gefundenen Dateien werden per Pipe an xargs übergeben, das übergibt
> per pipe die "sortierte liste"  an das shell script.
> Leider geht das so nicht.
> Hat jemand erfahrung damit, wie man das macht?

Das letzte "|" ist zuviel.
1
xargs -0 -n2 bash mp3merge.sh
macht folgendes:
lies Nullterminierte Strings von STDIN, und immer wenn zwei vorhanden 
sind, rufe das angegebene Programm mit diesen strings als Parameter auf.
D.H. zusammen mit dem find werden folgende Kommandos ausgeführt:
1
bash mp3merge.sh file1.mp3 file2.mp3
2
bash mp3merge.sh file3.mp3 file4.mp3
3
...
4
usw...
5
...

Wenns ne ungerade Anzahl Files war, wird das Script ein letztes Mal mit 
nur einem File aufgerufen. Macht aber nix, das Beispiel von Matt 
überprüft das, und lässt das File in Frieden.

von Werner A. (homebrew)


Lesenswert?

Tja, jetzt muss ich nur noch die Leerzeichen in den Dateinamen in den 
Griff bekomme. Leider trennt das Leerzeichen ja $1 und $2 ...

von Εrnst B. (ernst)


Lesenswert?

Sollte eigentlich nicht sein.
find mit "-print0" und xargs mit "-0" tauschen die Dateinamen extra über 
Nullterminierte Strings aus, damit eben keine Sonderzeichen/Leerzeichen 
Probleme machen. Sogar Newlines und Tabs im Filenamen kommen da 
unbeschadet durch.
Kann dann eigentlich nur am merge-script liegen. Das Beispiel weiter 
oben packt $1 und $2 allerdings immer in Quotes ("$1" "$2").
Poste doch mal dein Script hier.

Ach ja,
rm "$1" "$2" schreibt man besser als rm -- "$1" "$2", nicht dass jemand 
eine Datei mit Namen "-rf" anlegt ;)

von Werner A. (homebrew)


Lesenswert?

Tja, sollte...

Der Aufruf auf der Kommandozeile sieht so aus:
1
find . -type f -name \*.mp3 -print0 | xargs -0 -n2 bash mp3merge.sh

Das Script hab ich nen bischen abgeändert um nen paar ausgaben zu haben.
1
echo File1: "$1"
2
echo File2: "$2"
3
4
if [ $# -gt 1 ]; then
5
     outfile="$(basename "$1" .mp3)"_and_"$(basename "$2")"
6
   echo OutFile: $outfile
7
     #mp3wrap.exe "$outfile" "$1" "$2"
8
     #rm "$1" "$2"
9
fi

Die Ausgabe sieht so aus:
1
H:\>find . -type f -name \*.mp3 -print0 | xargs -0 -n2 bash mp3merge.sh
2
File1: ./0001-0500/Oh
3
File2: Freunde,
4
OutFile: Oh_and_Freunde,
5
File1: ./0001-0500/Suspicious
6
File2: Jazz.mp3
7
OutFile: Suspicious_and_Jazz.mp3

Wenn ich das richtig verstanden habe macht die Option -print0 bzw. -0 
den String Null-Terminiert. Nur leider werden bei dem Ergebnis keine 
Anführungszeichen drumherum gesetzt. Somit werden die Leerzeichen bei 
der Parameterübergabe an das BashScript leider als verschiedene 
Parameter erkannt.

Wenn ich nur find und xargs aufrufe sieht das so aus:
1
H:\>find . -type f -name \*.mp3 -print0 | xargs -0 -n2
2
./0001-0500/Oh Freunde, nicht diese T÷ne.mp3 ./0001-0500/Returning.mp3
3
./0001-0500/Suspicious Jazz.mp3 ./0001-0500/Einen Noch.mp3

von Εrnst B. (ernst)


Lesenswert?

Versuch mal die Zusatz-Bash einzusparen:
1
chmod +x mp3merge.sh
2
find . -type f -name \*.mp3 -print0 | xargs -0 -n2 ./mp3merge.sh

Vorher Zeile am Anfang von mp3merge.sh einfügen:
1
#!bash


Bei mir funktioniert das übrigens korrekt (mit deinem mp3merge script):
1
> ls
2
A B C.mp3  mp3merge.sh  X Y Z.mp3
3
4
5
> find . -type f -name \*.mp3 -print0 | xargs -0 -n2 bash mp3merge.sh
6
File1: ./X Y Z.mp3
7
File2: ./A B C.mp3
8
OutFile: X Y Z_and_A B C.mp3
9
10
> find . -type f -name \*.mp3 -print0 | xargs -0 -n2 ./mp3merge.sh
11
File1: ./X Y Z.mp3
12
File2: ./A B C.mp3
13
OutFile: X Y Z_and_A B C.mp3

Spasseshalber noch einen Satz von Dateinamen + Verzeichnissen mit 
Sonderzeichen, Leerzeichen etc angelegt:
1
> find . -type f -name \*.mp3 -print0 | xargs -0 -n2 ./mp3merge.sh
2
File1: ./☮☯☂.mp3
3
File2: ./2 2/Ernst.mp3
4
OutFile: ☮☯☂_and_Ernst.mp3
5
File1: ./2 2/鋼.mp3
6
File2: ./2 2/☂.mp3
7
OutFile: 鋼_and_☂.mp3
8
File1: ./1 1/☢☣ ☭ ☮☯☂.mp3
9
File2: ./1 1/☢☣☭☮☯☂.mp3
10
OutFile: ☢☣ ☭ ☮☯☂_and_☢☣☭☮☯☂.mp3
11
File1: ./X Y Z.mp3
12
File2: ./A B C.mp3
13
OutFile: X Y Z_and_A B C.mp3

von Εrnst B. (ernst)


Lesenswert?

Nachtrag: Es kann gut sein, dass die Windows-Bash die 
Parameter-Auflösung anders handhabt (handhaben muss)...

Du hast die Files doch alle auf deinem USB-Stick, oder?
Versuch einfach mal ein Linux von CD zu Booten, und probiers da aus.

Evtl ist auch andLinux (http://www.andlinux.org/) besser als Cygwin 
geeignet, da es einen echten Linux-Kernel unter Windows bootet, sich 
aber trotzdem recht gut in das Windows drumherum integriert.

von Werner A. (homebrew)


Lesenswert?

Stimmt, ich werde heute abend mal probieren, die bash vorher zu starten 
und die find/xargs Kommandozeile da zu starten.
Wäre nochmal ne Idee.
Es gibt ja auch noch verschiedenste Bash Versionen für Windows.
Ich meld mich dann ;-)

von Werner A. (homebrew)


Lesenswert?

Ok, ich hab 2 verschiedene Bash ausprobiert. Bei beiden geht das auch 
nicht.
Ich hab mir gestern abend schonmal ein USB Linux (puppy) geladen, aber 
hat dann im X-Mode gestartet und ich konnte nicht rausfinden, wie ich 
mein USB Laufwerk mounten muss.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.