Load tag-reading modules on demand
[app-musicexpo.git] / lib / App / MusicExpo.pm
index c1433ca44c23566cf5ec4808f5c38a26930b9955..f2ee745352df6ba497f590da6593c9f4b9db5f4b 100644 (file)
@@ -5,13 +5,8 @@ use warnings;
 
 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);
        }
This page took 0.010295 seconds and 4 git commands to generate.