- my $file=$_[0];
- my $ogg=Ogg::Vorbis::Header::PurePerl->new($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')) || '?',
- path => $file,
- }
+ my $file=$_[0];
+ my $ogg=Ogg::Vorbis::Header::PurePerl->new($file);
+
+ freeze +{
+ format => 'Vorbis',
+ title => scalar $ogg->comment('TITLE'),
+ artist => scalar $ogg->comment('artist'),
+ year => scalar $ogg->comment('DATE'),
+ album => scalar $ogg->comment('ALBUM'),
+ tracknumber => scalar $ogg->comment('TRACKNUMBER'),
+ tracktotal => scalar $ogg->comment('TRACKTOTAL'),
+ genre => scalar $ogg->comment('GENRE'),
+ file => scalar fileparse $file,
+ }
+}
+
+sub mp4_format ($){ ## no critic (ProhibitSubroutinePrototypes)
+ my $encoding = $_[0];
+ return 'AAC' if $encoding eq 'mp4a';
+ return 'ALAC' if $encoding eq 'alac';
+ "MP4-$encoding"
+}
+
+sub mp4info{
+ my $file=$_[0];
+ 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},
+ 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,
+ };
+}
+
+sub opusinfo {
+ my $file = $_[0];
+ my $of = Audio::Opusfile->new_from_file($file);
+ my $tags = $of->tags;
+
+ my %data = (
+ format => 'Opus',
+ title => $tags->query('TITLE'),
+ artist => $tags->query('ARTIST'),
+ year => $tags->query('DATE'),
+ album => $tags->query('ALBUM'),
+ tracknumber => $tags->query('TRACKNUMBER'),
+ tracktotal => $tags->query('TRACKTOTAL'),
+ genre => $tags->query('GENRE'),
+ file => scalar fileparse $file,
+ );
+
+ freeze \%data;
+}
+
+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) {
+ carp 'No tags-reading module detected. Install one of the following modules: ' . join ', ', map { $_->[0] } @optional_modules;