www.mikrocontroller.net

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


Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in der Art?
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?

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht 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
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?

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werner A. wrote:
> Prinzipiell würde ich mir das so vorstellen
>
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.
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:
bash mp3merge.sh file1.mp3 file2.mp3
bash mp3merge.sh file3.mp3 file4.mp3
...
usw...
...

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.

Autor: Werner A. (homebrew)
Datum:

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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, sollte...

Der Aufruf auf der Kommandozeile sieht so aus:
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.
echo File1: "$1"
echo File2: "$2"

if [ $# -gt 1 ]; then
     outfile="$(basename "$1" .mp3)"_and_"$(basename "$2")"
   echo OutFile: $outfile
     #mp3wrap.exe "$outfile" "$1" "$2"
     #rm "$1" "$2"
fi

Die Ausgabe sieht so aus:
H:\>find . -type f -name \*.mp3 -print0 | xargs -0 -n2 bash mp3merge.sh
File1: ./0001-0500/Oh
File2: Freunde,
OutFile: Oh_and_Freunde,
File1: ./0001-0500/Suspicious
File2: Jazz.mp3
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:
H:\>find . -type f -name \*.mp3 -print0 | xargs -0 -n2
./0001-0500/Oh Freunde, nicht diese T÷ne.mp3 ./0001-0500/Returning.mp3
./0001-0500/Suspicious Jazz.mp3 ./0001-0500/Einen Noch.mp3

Autor: Εrnst B✶ (ernst)
Datum:

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

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


Bei mir funktioniert das übrigens korrekt (mit deinem mp3merge script):
> ls
A B C.mp3  mp3merge.sh  X Y Z.mp3


> find . -type f -name \*.mp3 -print0 | xargs -0 -n2 bash mp3merge.sh
File1: ./X Y Z.mp3
File2: ./A B C.mp3
OutFile: X Y Z_and_A B C.mp3

> find . -type f -name \*.mp3 -print0 | xargs -0 -n2 ./mp3merge.sh
File1: ./X Y Z.mp3
File2: ./A B C.mp3
OutFile: X Y Z_and_A B C.mp3

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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.