Hallo Al, Am Mon, 13 Apr 2009, Al Bogner schrieb:
Am Montag 13 April 2009 02:33:19 schrieb David Haller:
Am Don, 09 Apr 2009, Al Bogner schrieb:
Ich überlege ein simples Shell-Skript um meine CDs neu zu ordnen.
Problem sind die CDs mit mehreren Künstlern (Various), wobei ich hier einen Kompromiss eingehe und definiere, dass die CD durch den Albumtitel bestimmt ist, mehrmals ein Album "Best of" ist also ein Problem, das ich vernachlässige.
Abgefragt wird so:
find "$SEARCHDIR" -type f -name "*.mp3" | while IFS= read -r MP3FILE; do echo `/usr/bin/exiftool -q -q -s -s -s -Album "$MP3FILE"`" | "`/usr/bin/exiftool -q -q -s -s -s -Artist "$MP3FILE"` | tee -a "$ALL" done [..] Vielleicht kann exiftool mittlerweile auch Delimiter. Mehrere Felder abfragen ist ja kein Problem.
exiftool -q -q -s -s -s -Album -Artist 01_theme_from_harrys_game- clannad-1989_past_present.mp3
1989 - Past Present Clannad
Die Ausgabe könnte man verwenden. exiftool scheint ein '-' auszugeben, wenn ein Feld leer/unbekannt ist o.ä, d.h. die Ausgabe ist wohl immer zweizeilig? Das könnte man (im awk) passend behandeln.
Das würde alles natürlich gewaltig beschleunigen, dass das am meisten Zeit braucht.
Geht auch perl-intern. Und id3(info) wären vermutlich auch schneller als exiftool (hab da jetzt keinen Vergleich, das exiftool hier auf der ollen Kiste meint nur "Error: Unknown image type" wenn ich's auf ein mp3 ansetze, Ausgabe "-\n-" ;) Aber wenn man (eigenes script oder halt exiftool) sowieso ein perl laufen hat, kann man Image::ExifTool auch "intern" aufrufen, d.h. effizient ohne extra Prozess. Und die Vor- und Nachbehandlung und den ganzen Rest auch gleich miterledigen (s.u.) ;)
BTW: mit id3info z.B. kannst du Album und "Artist" mit einer Abfrage rausziehen. Und '|' ist als Trennzeichen nicht so praktisch (wenn auch schön lesbar).
Das Trennzeichen wäre mir egal, notfalls kann man es ja zum Schluss ersetzen. Die Frage ist nur welches Trennzeichen. Es darf in der CDDB nicht vorkommen.
k.A. was in der CDDB alles vorkommt -- nur sollte das Zeichen nicht in der Shell _und_ in div. Scriptsprachen eine Sonderbedeutung haben und somit mehrfach escaped werden müssen, wenn man's z.B. in ner Regex angeben will ... Im Zweifelsfall ASCII-NUL, ansonsten TAB, ' ', ',', ':', ';', oder ein sonst nur selten verwendetes Sonderzeichen (wie z.B. '§', '¶', '¡' oder '¿' (je nach Zeichensatz zu ergänzen / ersetzen). Ich mag '¡' weil rel. leserlich ;) ¡Dios mio! ;)
Wie würdest du die find-Schleife lösen? Wichtig ist, dass id3info mit UTF-8 klar kommt.
Ich würde (mal wieder) alles in nem perl-script erledigen... ==== #!/usr/bin/perl -w use strict; use File::Find; use MP3::Tag; use Ogg::Vorbis::Header::PurePerl; ## Ogg::Vorbis::Header ist ## evtl. schneller ... my %info; sub wanted { -f $File::Find::name || return; if( m/\.mp3$/i ) { if(my $id3 = MP3::Tag->new($File::Find::name) ) { $info{$File::Find::name}{artist} = $id3->artist(); $info{$File::Find::name}{album} = $id3->album(); } } if( m/\.ogg$/i ) { if( my $ogg = Ogg::Vorbis::Header::PurePerl->new($File::Find::name)) { $info{$File::Find::name}{artist} = $ogg->{COMMENTS}->{artist}->[0]; $info{$File::Find::name}{album} = $ogg->{COMMENTS}->{album}->[0]; } } } scalar(@ARGV) or push(@ARGV, "."); ### DEFAULT setzen find( { wanted => \&wanted, no_chdir => 1, follow => 1 }, @ARGV ); use Data::Dumper; print Dumper(\%info); ==== Aufruf mit den zu durchsuchenden Verzeichnissen, default '.' (s. kommentierte Zeile). Mit dem Hash %info kann man dann alles mögliche anstellen -- oder evtl. einiges schon direkt in der wanted-Funktion miterledigen. Kommt halt darauf an, was hinten rausfallen soll. Und ja, ggfs. kann man auch von/nach UTF-8 oder sonstwas konvertieren. Ebenso wie eine Behandlung weiterer Dateiarten und ggfs. nach Dateiinhalt (langsamer) statt nach Dateiendung. Es gibt auch Perl-Module, die das zumindest für mp3, ogg und flac wohl schon können (Audio::File und Audio::Tag oder so), eines davon greift auf oben verwendete Module zurück (d.h. man erspart sich, selber die Unterscheidung der Dateitypen zu machen). Ich hab auch schon ein bissl mehr als das oben, nur hänge ich etwas, da ich nicht weiß, was du eigentlich als Ausgabe willst. -> PM?
id3info -h [..] Ich werde daraus nicht schlau, wie die Syntax genau lautet.
$ id3info foo.mp3 $ id3 -l foo.mp3 [.. awkscript ..]
Vielen Dank David, wie immer super!
*g*
Fällt dir noch was ein, wie man "Various" ans Ende bringt? Irgendein Sonderzeichen davor half nicht.
Normal sollte ein '~' oder '}' oder so helfen (siehe 'man ascii'), das man vorne anfügt und nach dem 'sort' wieder entfernt. Elegant ist das aber nicht. Achso, die Sortierung hängt von LC_COLLATE ab, setze im Zweifel explizit 'export LC_COLLATE=POSIX', wenn du reproduzierbare Ergebnisse haben willst. Evtl. ist aber sogar ein spezfisches 'sort' in Perl effektiver, falls du nicht sowieso alles in einem perlscript abhandelst. Du kannst in perl so sortieren wie auch immer du willst -- und innerhalb eines größeren Scripts (oder als Modul) ist das auch schön effizient. Wenn du extra ein perl startest kommt es auf die Relation zur Menge der Eingabedaten an und den Zweck an. Einen Interpret "Various" kann man so jedenfalls "nach hinten" schieben. Und mit/in Perl kann man generell prima Dateien suchen, verwursten, Meta-Daten auslesen, verwursten, beliebig sortieren[3], ausgeben ... Es gibt nicht ohne Grund das Tool 'find2perl' ;) find2perl . -type f -name "*.mp3" Die find2perl-Ausgabe verwendet in diesem Beispiel allerdings ein paar Sachen, die unnötig sind, und andererseits fehlen welche (vgl. oben) -- die Ausgabe ist eben als Gerüst gedacht. -dnh PS:
Habe es mir angetan 3 Rechner umzubauen. Dabei bekam ich den starken Verdacht, dass die Rechner, die manchmal unerklärlich einfrieren nur im Runlevel 5 Probleme machen, im Runlevel 3 habe ich das noch nie beobachtet. Vielleicht ein Einergiesparproblem?
Möglich. Und oder ohne "-spar-" (s.u.) ;)
Es scheint unabhängig von nv bzw. nvidia zu sein.
Frieren die Kisten auch ein, wenn du in den RL3 bootest und X dann per startx startest? Nur unter Last oder erst nach x min "idle"? Ansonsten sind generell erstmal die HW / die Treiber verdächtig. Hast du evtl. neue HW in den Kisten? Netzteil ist bei letzterem dann auch verdächtig (ne HDD mehr, die beim Anlaufen bis zu ~30W brauchen kann, kann "zuviel" sein -- oder eben wenn die GraKa loslegt o.ä.). Sowas ähnliches hatte ich IIRC auch (im alten Rechner, als dann 4 Festplatten + DVD-Brenner + TV-Karte drinsteckten), allerdings mehr beim Booten[2] (allerdings mit ner GraKa, die (konstant) nur ein paar wenige Watt (<10W, eher <5W) schluckt, d.h. mit ner neueren GraKa kann diese dann beim Start von X mehr Strom brauchen und somit (erst) der Auslöser sein, was bei mir schon die Platten beim booten waren). Mit nem neuen Netzteil läufts => Überschlagsrechnung bzgl. (Spitzen-) Strombedarf... Oder eine Unverträglichkeit zwischen Steckkarten[1]. Im Zweifelsfall dann mal testhalber den Rechner "abspecken"... Aber ich denke, es gibt einige andere Sachen, die du (einfacher) testen solltest, bevor die zeitaufwendige Bastelei dran ist. Weiteres dann wohl besser im anderen Thread oder per PM, oder? Achso, ich hab noch ein bissl was nachzuholen, hoffe aber, daß ich morgen wieder etwas am Script weiterbasteln kann :) [1] der Dawi DC-154 SATA-Controller hat den alten Rechner reproduzierbar einfrieren lassen, wenn ein bissl was auf dem PCI-Bus los war (oder evtl. auch speziell wenn's zum ISA-Bus ging?), da mochte irgendwas den nicht (ISA/PCI). Im neuen Rechner läuft der Controller seit nun 2 Jahren zuverlässig ... Mach dir deinen eigenen Reim drauf ;) [2] Grub startete erst nachdem alle Platten liefen und ich nochmal nen Reset gemacht hab [3] Nur der Speicherbedarf setzt da Grenzen, da muß man ggfs. aufpassen bzw. passend programmieren. Aber im Vergleich zur Shell ist es i.d.R. kein Nachteil. -- Death: I am last minute stuff! -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org