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