App-MusicExpo
view release on metacpan or search on metacpan
lib/App/MusicExpo.pm view on Meta::CPAN
package App::MusicExpo;
use 5.014000;
use strict;
use warnings;
our $VERSION = '1.002001';
use HTML::Template::Compiled qw//;
use Memoize qw/memoize/;
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';
##################################################
my $default_template;
our $prefix='/music/';
our $cache='';
our $template='';
GetOptions (
'template:s' => \$template,
'prefix:s' => \$prefix,
'cache:s' => \$cache,
);
sub flacinfo{
my $file=$_[0];
my $flac=Audio::FLAC::Header->new($file);
freeze +{
format => 'FLAC',
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 %tag = map { encode 'UTF-8', $_ } %{MP3::Info::get_mp3tag $file};
my @trkn = split m#/#s, $tag{TRACKNUM} // '';
freeze +{
format => 'MP3',
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);
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;
( run in 1.282 second using v1.01-cache-2.11-cpan-39bf76dae61 )