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 )