Thread MP3 ID3 Tag (46 answers)
Opened by timehandler at 2012-06-04 15:49

FIFO
 2012-06-06 09:43
#158780 #158780
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Guest timehandler
ich benutze windows.

der ordner wird ja erstellt und existiert vorher nicht, dafür werden ja aus der mp3 datei die tags verwendet, auf groß oder kleinschreibung habe ich da keinen einfluss.


Bei Windows ist Groß-/Kleinschreibung in Dateinamen unerheblich.
Du musst beachten, dass
  • in MP3-Tags evtl. Zeichen auftreten, die in Ordnernamen nicht verwendet werden dürfen.
  • Unter Windows gleichnamige Dateien und Ordner im selben Verzeichnis auftauchen können
  • File::Find::find() rekursiv auch die Unterverzeichnisse durchgeht, ggf. finddepth() anpassen
  • File::Find::find() macht defaultmäßig ein chdir() in die geparsten Verzeichnisse, das musst Du bei Aufrufen von mkdir() etc. in der wanted()-sub beachten. Oder gleich absolute Pfade verwenden.

Wenn ich das richtig verstanden habe, sollen die neuen Ordner aber unterhalb von $cwd erzeugt werden.

Hier mal ein mögliches Konzept als Anregung. Da ich CPAN:MP3::Tag nicht verwende, ist der Code UNGETESTET.

Code (perl): (dl )
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!perl

use warnings;
use strict; 

use MP3::Tag;
use File::Find;
use File::Copy;
use Cwd;

my $cwd    = getcwd;                    # Arbeitsverzeichnis                
my $mp3dir = $cwd;                      # Default

print "Pfad angeben wo die MP3's sind!!! [keine Eingabe - Aktuelles Verzeichnis]\n";

while (my $input = <STDIN>) {
    last if $input !~ /\S/;             # leere Eingabe
    chomp($input);
    if (-d $input) {                    # Verzeichnis existiert?
        $mp3dir = $input;
        last;
    }
    print "Verzeichnis '$input' existiert nicht. Nochmal versuchen.\n";
}

find(\&wanted, $mp3dir);                # Achtung: Rekursive Suche

sub wanted {
    return unless /\.mp3$/i;            # alles was keine *.mp3 Endung hat wird 
                                        # nicht beachtet
    my $filename = $_;
    my $fullpath = $File::Find::name;   
    return if (-d $fullpath);           # Verzeichnisse mit '.mp3' weglassen

    if ($mp3 = MP3::Tag->new($fullpath)) {
        print "$_ (Tags: ", join(", ",$mp3->get_tags),")\n";
        
        my ($title, $track, $artist, $album, $comment, $year, $genre) 
        = $mp3->autoinfo();
        
        print "* Song:    $title\n"
            . "* Track:   $track\n"
            . "* Artist:  $artist\n"
            . "* Album:   $album\n"
            . "* Comment: $comment\n";
           
        my $targetdir = make_dirname_from_tags($artist, $album);
        if (! $targetdir) {
            print "Fehler beim Erzeugen des Ordnernamens!\n";
            return;
        }
        
        if (! -d $targetdir) {          # existiert noch nicht?
            if (! mkdir("$cwd/$targetdir")) {
                warn "Kann Ordner '$cwd/$targetdir' nicht anlegen: $!";
                return;
            }            
        }
        
        move($fullpath, "$cwd/$targetdir/$filename"); 
    }
}

sub make_dirname_from_tags {
# Hier diejenigen Zeichen in den Tags ersetzen, die für Ordner-/Dateinamen
# verboten sind.

    my @tags = @_;
    return if ! @tags;
    for my $tag (@tags) {
        $tag =~ s/[:,]/_/g;     # Zeichenklasse noch anpassen
    }
    return(join ' - ', @tags);
}


Editiert von FIFO: $cwd/ fehlte in mkdir()

Editiert von FIFO: quotes um $cwd/$targetdir fehlten
Last edited: 2012-06-06 18:49:04 +0200 (CEST)
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"

View full thread MP3 ID3 Tag