PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ID3v2-Tags ändern per Script



djaliced
23-02-2007, 15:06
Hallo mrunixerianer ;),
ich habe folgendes Problem.

Ich möchte gerne ein Shell-Schript schreiben, für das id3v2 (mp3).
Leider hab ich kein Plan vom Shellscript.
Und zwar soll das Script selbständig in einem angegeben Verzeichnis nach schauen, wie viele mp3s vorhanden sind und dies dann umbenennen.

Das ganze soll ca. so ablaufen.


Schau in dem angegebenen Verzeichnis nach, wie viele Dateien vorhanden sind.
Schleife (Durchläufe = Anzahl der Dateien) {
Hole nächsten Dateinamen (wenn vorhanden) und speichere den Interpret und Titel in 2 verschiedene Variablen.
$Variable1 = Interpret
$Variable2 = Titel
# (Die Datei ist immer gleich aufgebaut „<Interpret> - <Titel>)
Lösche den kompletten id3v1/id3v2 Tag.
Schreibe den id3v1-Tag neu
Schreibe den id3v2-Tag neu
}

Das Hauptproblem:
Hole nächsten Dateinamen (wenn vorhanden) und speichere den Interpret und Titel in 2 verschiedene Variablen.
$Variable1 = Interpret
$Variable2 = Titel

Ich weiß nicht wie ich das bewerkstelligen soll.

Kann mir vielleicht jemand von euch einen Tip bzw. Denkansatz geben?

Gruß Olly

jeebee
23-02-2007, 17:21
1)
for i in `ls $verzeichnis`
do
#...
done

2) cut -d'-' um Interpret und Titel aufzutrennen

Schreiben von id3-tags aus der Shell: zb id3v2 (http://id3v2.sourceforge.net/)

craano
24-02-2007, 17:25
Ich habe auch gerade meine Musiksammlung auf Vordermann gebracht.
Wenn Du Lust hast, kannst Du folgendes kleines Skript verwenden:

#!/usr/bin/perl -w
#
#
#
#
my $INPUT='/Pfad/zu/den/mp3s/';
chdir $INPUT;

my @mp3s;
push (@mp3s, glob "*.mp3");
push (@mp3s, glob "*.MP3");

my $anzahl = @mp3s;
print "Es sind $anzahl Songs in $INPUT \n";

foreach (@mp3s) {
my @title = split(/\-/, $_);
my $artist = $title[0];
my $song = $title[1];
print "Tags für $_ werden geschrieben...";
my $befehl = "id3v2 -a \"$artist\" -t \"$song\" \"$_\"";
qx($befehl);
print "done. \n";
}Ist allerdings Perl und kein Shellscript.

Grüße.
craano.

djaliced
25-02-2007, 00:59
thx erstmal,
ich kann zwar kein Perl aber ich hab das Script mal meinen Bedürfnissen angepasst.

Das sieht jetzt so aus



#!/usr/bin/perl -w
#
#
#
#
my $INPUT='/home/olly/tmp/';
chdir $INPUT;

my @mp3s;
push (@mp3s, glob "*.mp3");
push (@mp3s, glob "*.MP3");

my $anzahl = @mp3s;
my $mp3ex = ".mp3";
print "Es sind $anzahl Songs in $INPUT \n";
print "Tags werden gelöscht ...";
my $id3delete = "id3v2 -D *.mp3";
qx($id3delete);
print "done. \n";
foreach (@mp3s) {
my @title = split(/ - /, $_);
my $artist = $title[0];
my $song = $title[1];
my $realsong = substr($song,0,length($song) - 4);
print "Tags für $_ werden geschrieben...";
my $befehl = "id3v2 -a \"$artist\" -t \"$realsong\" \"$_\"";
qx($befehl);
print "done. \n";
}
print "Die mp3s werden gegaint...\n";
my $befehl2 = "mp3gain -r -c -d 5 *.mp3";
qx($befehl2);
print "done. \n";


und es läuft genau so wie ich mir es vorgestellt habe.

Gruß Olly

Thomas Engelke
27-02-2007, 12:05
1)
for i in `ls $verzeichnis`
do
#...
done

Da ist ja wieder einer. Ein Anwärter für den Useless use of backticks (http://partmaps.org/era/unix/award-example-backticks.html)-Award! Gratulation.

Ein einfaches
for f in * do: <befehl>; done; reich absolut aus.

TME

jeebee
27-02-2007, 12:12
tja, was solls, nicht jeder hier ist Shell-Skript-Guru...

rais
27-02-2007, 20:41
Ein einfaches
for f in * do: <befehl>; done; reich absolut aus.

absolut?

for f in *; do <befehl>; done
MfG,

Thomas Engelke
28-02-2007, 08:59
absolut?

for f in *; do <befehl>; done

Hehe, verdiente Kritik. Ich wußte nicht mehr genau, ob das ";" dorthin gehört und hatte in der Kürze keine Testmaschine zur Hand.

Ein Syntaxcheck sagt mehr als 1000 Worte.

TME