use File::Find;
use Archive::Tar;
use Thread;
use DBI;
use Unicode::String;
$datenbank = "dbi:mysql:database=mp3;host=localhost;port=3306";
$user = "root";
$passwd = "";
$time = time();
print "Pfad realtiv zum Script angeben(./): ";
$url = <stdin>;
chomp $url;
$dbh = DBI->connect($datenbank, $user, $passwd) or die $DBI::errstr;
find(\&getTar, "$url");
$dbh->disconnect();
print "Benötigte Zeit in Sek.: ".$time-time."\n";
# Funktion für File::Find zum herausfinfenob .tar oder nicht
#--------------------------------------------------------------------------------
sub getTar()
{
if($_ =~/.tar/)
{
print "Open $_\n";
readTar($_);
print "Close $_\n";
}
}
# Funktion zum laden und auslesen des Archives
#--------------------------------------------------------------------------------
sub readTar()
{
my $tar;
my $content;
my @scontent;
$tar = Archive::Tar->new;
$tar->read($_[0],1);
my @tarfilelist = $tar->list_files();
foreach (@tarfilelist)
{
$lange = $#tarfilelist;
$n++;
#print "###############################\n ";
print "$n/$lange File:".$_." reading\n";
#print "###############################\n";
$content = $tar->get_content($_);
@scontent = split "\n", $content;
#print $scontent[2];
getTagTar(@scontent);
}
$tar->clear;
}
sub getTagTar()
{
# Einstellungen
#------------------------------------------------------------------------------------
$visualisierung = 0; # 0 = Aus, 1 = Ein
# Arrays bei jeden Durchlauf zurücksetzen
#------------------------------------------------------------------------------------
my @artist;
my @title;
my @srow;
my @ssrow;
my @zeile;
my $coment;
my $album;
my $gerne;
my $year;
my $id;
my $tr;
my $ti;
my $alb;
my $art;
# Zeilen einzeln auswerten
#---------------------------------------------------------------------------------
$track = 0;
foreach $string (@_)
{
my $row = new Unicode::String($string);
$row = $row->utf8();
chomp $row;
$row =~ s/_/ /g;
# Album und Artist bestimmen
# $temp_artist = $artist wenn nur ein Artist vorhanden ist
#-----------------------------------------------------------------------------
if($row =~ /DTITLE/)
{
$row =~ s/DTITLE=//;
($temp_artist, $album) = split " / ", $row;
$temp_artist = delspace($temp_artist);
$album = delspace($album);
}
# Jahr bestimmen
#----------------------------------------------------------------------------
elsif($row =~ /DYEAR/)
{
$row =~ s/DYEAR=//;
$year = delspace($row);
}
# Gerne bestimmen
#----------------------------------------------------------------------------
elsif($row =~ /DGENRE/)
{
$row =~ s/DGENRE=//;
$gerne = delspace($row);
}
# Titel bestimmen
# Wenn $row "-" oder "/" --> Aufteilung in Artist und Titel sonst wird $temp_artist verwendet
#----------------------------------------------------------------------------
elsif($row =~ /TTITLE/)
{
$row =~ s/TTITLE//;
@srow = split "=", $row;
if($row =~ /-/ and !($row =~ /\//))
{
@ssrow = split "-", $srow[1];
$ssrow[0] = delspace("$ssrow[0]");
$ssrow[1] = delspace("$ssrow[1]");
if($ssrow[0] =~ /\d/ and !($ssrow[0] =~ /\D/))
{
$artist[$track] = delspace("$ssrow[1]");
$title[$track] = $temp_artist;
}
else
{
$title[$track] = delspace($ssrow[1]);
$artist[$track] = delspace($ssrow[0]);
$coment = $temp_artist;
}
}
elsif($row =~ /\// or ($row =~ /-/ and ($row =~ /\//)))
{
@ssrow = split "/", $srow[1];
if($#ssrow > 2)
{
$title[$track] = delspace($ssrow[2]);
$artist[$track] = delspace("$ssrow[0]/$ssrow[1]");
}
else
{
$title[$track] = delspace($ssrow[2]);
$artist[$track] = delspace($ssrow[0]);
}
$coment = $temp_artist;
}
else
{
$title[$track] = delspace($srow[1]);
$artist[$track] = $temp_artist;
}
@hssrow = split "-", $$title[$track];
if($hssrow[0] =~ /\d/ and !($hssrow[0] =~ /\D/))
{
$title[$track] = $hssrow[1];
}
($tr, $ti) = split " ", $title[$track];
$tr = delspace("$tr");
if($tr =~ /\d/ and !($tr =~ /\D/) and $coment)
{
$title[$track] = $ti;
$artist[$track] = $coment;
$coment = "";
}
$track++;
}
elsif($row =~/DISCID/)
{
$row =~ s/DISCID=//;
$id = delspace($row);
}
# Tracknummern entfernen
($art, $alb) = split "-", $artist[$track];
$alb = delspace("$alb");
if($alb == $alblum)
{
delspace("$art");
$artist[$track] = $art;
}
($art, $alb) = split " ", $artist[$track];
$art = delspace("$art");
if($art =~ /\d/ and !($art =~ /\D/) or $art =~ /\.\:/)
{
$artist[$track] = delspace("$alb");
$title[$track] = $coment;
}
# Tracknummer erhöhen
if($row =~ /TTITLE/)
{
$track++;
}
}
# Ausgabe
#------------------------------------------------------------------------------------
if($visualisierung)
{
print "Kommentar:\t$coment\nAlbum\t\t$album($id)\nGerne\t\t$gerne\nJahr\t\t$year\n";
$track = 0;
foreach(@title)
{
print $track . "\t" . $artist[$track] . "\t" . $title[$track] . "\n";
$track++;
}
}
$track = 0;
# In Datenbank schreiben
#------------------------------------------------------------------------------------
foreach(@title)
{
if($artist[$track] and $title[$track] and !($artist[$track] =~/\?.*\?.*\?/) and !($title[$track] =~/\?.*\?.*\?/) and !($track =~/\?.*\?.*\?/) and !($album =~/\?.*\?.*\?/) and !($gerne =~/\?.*\?.*\?/) and !($year =~/\?.*\?.*\?/) and !($id =~/\?.*\?.*\?/) and !($coment =~/\?.*\?.*\?/) and ($artist[$track] =~/\w/) and ($title[$track] =~/\w/) and ($track =~/\w/) and ($album =~/\w/) and ($gerne =~/\w/) and ($year =~/\w/) and ($id =~/\w/) and ($coment =~/\w/) and $title[$track] =~ /.$/ and $artist[$track] =~ /.$/ and $album =~ /.$/)
{
writeDB($artist[$track], $title[$track], $album, $track, $gerne, $year, $coment, $id);
}
$track++;
}
}
# Funktion für die Datenbank
#----------------------------------------------------------------------------------------------------------------
sub writeDB()
{
# Nötig wenn keine Keys definiert sind
#my $statement = qq{SELECT artist, title, album, track, gerne, year, coment, id FROM perl_cddb WHERE artist = "$_[0]" AND title = "$_[1]" AND album = "$_[2]" AND track = "$_[3]" AND gerne = "$_[4]" AND year = "$_[5]" AND coment = "$_[6]" AND id = "$_[7]";};
#my $sth = $dbh->prepare($statement);
#my $rv = $sth->execute;
#my @spalte = $sth->fetchrow_array();
#$rv = $sth->finish;
#if(!@spalte)
{
$statement = qq{INSERT INTO perl_cddb (artist, title, album, track, gerne, year, coment, id) VALUES ("$_[0]", "$_[1]", "$_[2]", "$_[3]", "$_[4]", "$_[5]", "$_[6]", "$_[7]");};
$sth = $dbh->prepare($statement);
$rv = $sth->execute;
$rv = $sth->finish;
}
}
sub delspace()
{
$_[0] =~ s/^\s+//; # Führende Leerzeichen,
$_[0] =~ s/^\W+//; # Fürfrende nicht Wortzeichen,
$_[0] =~ s/\s+$//; # Beendende Leerzeichen enzfernene
return $_[0];
}