#!/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 "

Welcome to my little test script.

\n"; my $counter = 0; unlink($database) || print "Database did not exists.
\n"; my $fh = FileHandle->new('>>' . $database) || die "Could not open $database - $_"; my @mp3s = &CreateDB( $search_dir ); $fh->close || die "Could not close $database - $_"; print "total number of mp3s: $counter
\n"; my $t1 = Benchmark->new; my $td = timediff($t1, $t0); my $benchmarktime = timestr($td); print "
\n
\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
\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