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

cbxk1xg
 2011-07-27 17:44
#150808 #150808
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
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

View full thread Konvertieren: Von "ich würde gern wissen was Du bist" nach utf-8