Thread Konvertieren: Von "ich würde gern wissen was Du bist" nach utf-8
(29 answers)
Opened by cbxk1xg at 2011-07-26 22:33
Ok, ich hab's. Danke Euch allen!
Es war ein bisschen was von allem dabei. Das Script nimmt nun alle MP3s aus einen Ordner (inkl. Unterordner) und guckt sich jeden ID-Tag der MP3s an, konvertiert nach Bedarf in UTF-8 und gibt 'ne Liste aus. Konfiguriert werden muss unbedingt, je nach Einzelfall, die Liste @TroubleMakers. Um die TroubleMaker zu finden, habe ich mir für alle Tags $encoding_name aus CheckAndConvertUTF8 ausgeben lassen. Erst dann kam ich auf "cyrillic" und Konsorten. Auch rein muss "UTF-8". - Warum das so ist, weiss ich auch selbst noch nicht genau. Ich habe mein Script mal auf über 12.000 MP3s angesetzt. Funktionierte wunderbar! Um Kritik wird gebeten. 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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 #!/usr/bin/perl -wT use Benchmark; my $t0 = Benchmark->new; use strict; use warnings; use diagnostics; use CGI::Carp qw(fatalsToBrowser); open STDERR, '>>', "/var/www/STDERR.txt" || die "Can't redirect STDERR: $!"; use utf8; use Encode; use Encode::Detect::Detector; use FileHandle; use MP3::Tag; my $search_dir = "/media/MediaLibrary/Audio"; my $database = "/var/www/testDB.dat"; # Codepages die beim Konvertieren zu lupenreinem utf8 Ärger machen my @TroubleMakers = ('EUC-', 'UTF-8', 'cyrillic'); print "Content-type: text/html; charset=utf-8\n\n"; print "<h1>Welcome to my little test script.</h1>\n"; my $counter = 0; unlink($database) || print "<b>Database did not exists.</b><br/>\n"; my $fh = FileHandle->new('>>' . $database) || die "Could not open $database - $_"; my @mp3s = &CreateDB( $search_dir ); $fh->close || die "Could not close $database - $_"; print "<b>total number of mp3s: $counter</b><br/>\n"; my $t1 = Benchmark->new; my $td = timediff($t1, $t0); my $benchmarktime = timestr($td); print "<br/>\n<br/>\n".$benchmarktime; sub CreateDB { my @dirs = @_; my (@allfiles, @files) = (); my ($currdir, $filename) = ""; while (@dirs != 0) { $currdir = pop( @dirs ); opendir( ENTRIES, "$currdir/" ); @allfiles = readdir(ENTRIES); closedir(ENTRIES); for $filename (@allfiles) { if (-d "$currdir/$filename") { push( @dirs, "$currdir/$filename" ) if (($filename ne ".") && ($filename ne "..")); } else { my $file = "$currdir/$filename"; my (undef,undef,$SourceExt) = &SeperatePathFileExt($file); if (($SourceExt eq "mp3") && ($file !~ /\.AppleDouble/)) { my %MetaData = (); my $mp3 = MP3::Tag->new( $file ); ($MetaData{title}, $MetaData{track}, $MetaData{artist}, $MetaData{album}, $MetaData{comment}, $MetaData{year}, $MetaData{genre}) = $mp3->autoinfo(); for my $key (keys %MetaData) { $MetaData{$key} = &CheckAndConvertUTF8($MetaData{$key}); } my $string = "$file|$MetaData{title}|$MetaData{track}|$MetaData{artist}|$MetaData{album}|$MetaData{comment}|$MetaData{year}|$MetaData{genre}"; print "$string<br/>\n"; print $fh "$string\n" || return "bad error: $_"; $counter++; } } } } return 1; } sub SeperatePathFileExt { my ($string) = @_; my ($path, $filename, $ext) = ""; if ($string =~ m!^(.*)/([^/]*)$!) { $path = $1; $filename = $2; } else { $path = ""; $filename = $string; } ($ext) = $filename =~ /\.([^.]+?)$/; $ext = lc($ext); $filename =~ s-(.*).$ext$-$1-ig; return ($path, $filename, $ext); } sub CheckAndConvertUTF8 { my ($request) = @_; my $encoding_name = Encode::Detect::Detector::detect($request); unless (defined $encoding_name) {$encoding_name = "undefined";} if ($encoding_name eq "") {$encoding_name = "undefined";} if ((defined $_) && (grep( m/$encoding_name/, @TroubleMakers ))) { if ($encoding_name ne "undefined") { $request = Encode::encode("utf8", Encode::decode($encoding_name, $request)); } if ($encoding_name eq "undefined") { utf8::encode($request); } } # decode und danach gleich ein encode sieht nach Fehler aus, # ist aber keiner ohne geht bei vielen strings schlichtweg nicht. utf8::decode($request); utf8::encode($request); $request =~ s/\015\012|\012|\015/ /sg; # alle Umbrüche gegen Leerzeichen ersetzen $request =~ s-\|-\&\#124\;-g; # pipe ersetzen für csv $request =~ s/ / /sg; # doppelte Leerezeichen gegen einfache Leerzeichen ersetzen return $request; } # EOF |