X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=lib%2FApp%2FMusicExpo.pm;h=a25a132ba1427f847c361c4760244f9a762b8b9e;hb=b484a12921835e84ece975361da2c7b209beba6b;hp=a55b53ce8497322bc3b5107b5da9dc12d3012725;hpb=3f12a3221f4b752a93dc4bb3780708b0201ddd6e;p=app-musicexpo.git diff --git a/lib/App/MusicExpo.pm b/lib/App/MusicExpo.pm index a55b53c..a25a132 100644 --- a/lib/App/MusicExpo.pm +++ b/lib/App/MusicExpo.pm @@ -8,15 +8,17 @@ our $VERSION = '0.005'; use Audio::FLAC::Header qw//; use HTML::Template::Compiled qw//; use Memoize qw/memoize/; -use MP3::Tag qw//; +use MP3::Info qw/get_mp3tag/; use Ogg::Vorbis::Header::PurePerl; use MP4::Info qw/get_mp4tag get_mp4info/; use DB_File qw//; +use Encode qw/encode/; use File::Basename qw/fileparse/; use Fcntl qw/O_RDWR O_CREAT/; use Getopt::Long; use Storable qw/thaw freeze/; +use sort 'stable'; ################################################## @@ -32,64 +34,55 @@ GetOptions ( "cache:s" => \$cache, ); - -sub fix{ - my $copy = $_[0]; - utf8::decode($copy); - $copy -} - sub flacinfo{ my $file=$_[0]; my $flac=Audio::FLAC::Header->new($file); - $file = scalar fileparse $file; freeze +{ format => 'FLAC', - title => fix ($flac->tags('TITLE') // '?'), - artist => fix ($flac->tags('ARTIST') // '?'), - year => fix ($flac->tags('DATE') // '?'), - album => fix ($flac->tags('ALBUM') // '?'), - tracknumber => fix ($flac->tags('TRACKNUMBER') // '?'), - tracktotal => fix ($flac->tags('TRACKTOTAL') // '?'), - genre => fix ($flac->tags('GENRE') // '?'), - file => $file, + title => $flac->tags('TITLE'), + artist => $flac->tags('ARTIST'), + year => $flac->tags('DATE'), + album => $flac->tags('ALBUM'), + tracknumber => $flac->tags('TRACKNUMBER'), + tracktotal => $flac->tags('TRACKTOTAL'), + genre => $flac->tags('GENRE'), + file => scalar fileparse $file, } } sub mp3info{ my $file=$_[0]; - my $mp3=MP3::Tag->new($file); - $file = scalar fileparse $file; + my %tag = map { encode 'UTF-8', $_ } %{get_mp3tag $file}; + my @trkn = split '/', $tag{TRACKNUM} // ''; freeze +{ format => 'MP3', - title => fix ($mp3->title || '?'), - artist => fix ($mp3->artist || '?'), - year => fix ($mp3->year || '?'), - album => fix ($mp3->album || '?'), - tracknumber => fix ($mp3->track1 || '?'), - tracktotal => fix ($mp3->track2 || '?'), - genre => fix ($mp3->genre) || '?', - file => $file, + title => $tag{TITLE}, + artist => $tag{ARTIST}, + year => $tag{YEAR}, + album => $tag{ALBUM}, + tracknumber => $trkn[0], + tracktotal => $trkn[1], + genre => $tag{GENRE}, + file => scalar fileparse $file, } } sub vorbisinfo{ my $file=$_[0]; my $ogg=Ogg::Vorbis::Header::PurePerl->new($file); - $file = scalar fileparse $file; freeze +{ format => 'Vorbis', - title => fix($ogg->comment('TITLE') || '?'), - artist => fix ($ogg->comment('artist') || '?'), - year => fix ($ogg->comment('DATE') || '?'), - album => fix ($ogg->comment('ALBUM') || '?'), - tracknumber => fix ($ogg->comment('TRACKNUMBER') || '?'), - tracktotal => fix ($ogg->comment('TRACKTOTAL') || '?'), - genre => fix ($ogg->comment('GENRE')) || '?', - file => $file, + title => $ogg->comment('TITLE'), + artist => $ogg->comment('artist'), + year => $ogg->comment('DATE'), + album => $ogg->comment('ALBUM'), + tracknumber => $ogg->comment('TRACKNUMBER'), + tracktotal => $ogg->comment('TRACKTOTAL'), + genre => $ogg->comment('GENRE'), + file => scalar fileparse $file, } } @@ -102,20 +95,19 @@ sub mp4_format ($){ sub mp4info{ my $file=$_[0]; - my %tag = %{get_mp4tag $file}; + my %tag = map { ref() ? $_ : encode 'UTF-8', $_ } %{get_mp4tag $file}; my %info = %{get_mp4info $file}; - $file = scalar fileparse $file; freeze +{ format => mp4_format $info{ENCODING}, - title => $tag{TITLE} || '?', - artist => $tag{ARTIST} || '?', - year => $tag{YEAR} || '?', - album => $tag{ALBUM} || '?', - tracknumber => $tag{TRACKNUM} || '?', - tracktotal => ($tag{TRKN} ? $tag{TRKN}->[1] : undef) || '?', - genre => $tag{GENRE} || '?', - file => $file, + title => $tag{TITLE}, + artist => $tag{ARTIST}, + year => $tag{YEAR}, + album => $tag{ALBUM}, + tracknumber => $tag{TRACKNUM}, + tracktotal => ($tag{TRKN} ? $tag{TRKN}->[1] : undef), + genre => $tag{GENRE}, + file => scalar fileparse $file, }; } @@ -156,9 +148,9 @@ sub run { ); my @files; - for (values %files) { - my @versions = @$_; - my %entry = (%{$versions[0]}, formats => []); + for (sort keys %files) { + my @versions = @{$files{$_}}; + my %entry = (formats => [], map { $_ => '?' } qw/title artist year album tracknumber tracktotal genre/); for my $ver (@versions) { push @{$entry{formats}}, {format => $ver->{format}, file => $ver->{file}}; for my $key (keys %$ver) {