X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=lib%2FApp%2FMusicExpo.pm;h=f2ee745352df6ba497f590da6593c9f4b9db5f4b;hb=f7964165707b3e45f93960236a695596fa62bcd1;hp=3f8bc42d80152cb8559d6770640cc87470eeb42b;hpb=e2ce550b37beeeb7bac65d412b3f942e32cbd07a;p=app-musicexpo.git diff --git a/lib/App/MusicExpo.pm b/lib/App/MusicExpo.pm index 3f8bc42..f2ee745 100644 --- a/lib/App/MusicExpo.pm +++ b/lib/App/MusicExpo.pm @@ -3,15 +3,10 @@ use 5.014000; use strict; use warnings; -our $VERSION = '1.001_000'; +our $VERSION = '1.001_001'; -use Audio::FLAC::Header qw//; use HTML::Template::Compiled qw//; use Memoize qw/memoize/; -use MP3::Info qw/get_mp3tag/; -use Ogg::Vorbis::Header::PurePerl; -use MP4::Info qw/get_mp4tag get_mp4info/; -use Audio::Opusfile qw//; use DB_File qw//; use Encode qw/encode/; @@ -54,7 +49,7 @@ sub flacinfo{ sub mp3info{ my $file=$_[0]; - my %tag = map { encode 'UTF-8', $_ } %{get_mp3tag $file}; + my %tag = map { encode 'UTF-8', $_ } %{MP3::Info::get_mp3tag $file}; my @trkn = split m#/#s, $tag{TRACKNUM} // ''; freeze +{ @@ -96,8 +91,8 @@ sub mp4_format ($){ ## no critic (ProhibitSubroutinePrototypes) sub mp4info{ my $file=$_[0]; - my %tag = map { ref() ? $_ : encode 'UTF-8', $_ } %{get_mp4tag $file}; - my %info = %{get_mp4info $file}; + my %tag = map { ref() ? $_ : encode 'UTF-8', $_ } %{MP4::Info::get_mp4tag $file}; + my %info = %{MP4::Info::get_mp4info $file}; freeze +{ format => mp4_format $info{ENCODING}, @@ -132,23 +127,35 @@ sub opusinfo { freeze \%data; } -my %info = ( - '.flac' => \&flacinfo, - '.mp3' => \&mp3info, - '.ogg' => \&vorbisinfo, - '.oga' => \&vorbisinfo, - '.mp4' => \&mp4info, - '.aac' => \&mp4info, - '.m4a' => \&mp4info, - '.opus' => \&opusinfo, +my @optional_modules = ( + [ 'Audio::FLAC::Header', \&flacinfo, '.flac' ], + [ 'MP3::Info', \&mp3info, '.mp3' ], + [ 'Ogg::Vorbis::Header::PurePerl', \&vorbisinfo, '.ogg', '.oga' ], + [ 'MP4::Info', \&mp4info, '.mp4', '.aac', '.m4a' ], + [ 'Audio::Opusfile', \&opusinfo, '.opus' ] ); +my %info; + +for (@optional_modules) { + my ($module, $coderef, @extensions_handled) = @$_; + if (eval "require $module") { + $info{$_} = $coderef for @extensions_handled + } +} + +unless (%info) { + warn 'No tags-reading module detected. Install one of the following modules: ' . join ', ', map { $_->[0] } @optional_modules; +} + sub normalizer{ "$_[0]|".(stat $_[0])[9] } sub make_fragment{ join '-', map { lc =~ y/a-z0-9/_/csr } @_ } +sub extensions_handled { keys %info } + sub run { if ($cache) { tie my %cache, 'DB_File', $cache, O_RDWR|O_CREAT, 0644; ## no critic (ProhibitTie) @@ -158,6 +165,7 @@ sub run { my %files; for my $file (@ARGV) { my ($basename, undef, $suffix) = fileparse $file, keys %info; + next unless $suffix; $files{$basename} //= []; push @{$files{$basename}}, thaw scalar $info{$suffix}->($file); }