From: Marius Gavrilescu Date: Sat, 17 Aug 2013 20:44:09 +0000 (+0300) Subject: Initial commit X-Git-Tag: 0.002~10 X-Git-Url: http://git.ieval.ro/?p=app-musicexpo.git;a=commitdiff_plain;h=21cd9240d572994ade62bed83cabba9e0c53e4c1 Initial commit --- 21cd9240d572994ade62bed83cabba9e0c53e4c1 diff --git a/Changes b/Changes new file mode 100644 index 0000000..865eb65 --- /dev/null +++ b/Changes @@ -0,0 +1,5 @@ +App::MusicExpo (0.001) 17 Jun 2013 + * Initial release +App::MusicExpo (0.001001) 18 Jun 2013 + * Add EXE_FILES, MIN_PERL_VERSION + * Depend on DB_File \ No newline at end of file diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..b627054 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,10 @@ +Changes +Makefile.PL +MANIFEST +README +t/App-MusicExpo.t +lib/App/MusicExpo.pm +musicexpo +index.tmpl +empty.mp3 +empty.flac diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..2748617 --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,21 @@ +use 5.014; +use ExtUtils::MakeMaker; + +WriteMakefile( + NAME => 'App::MusicExpo', + VERSION => '0.001001', + PREREQ_PM => { + 'Audio::FLAC::Header' => 0, + 'HTML::Entities' => 0, + 'HTML::Template::Compiled' => 0, + 'Memoize' => 0, + 'MP3::Tag' => 0, + 'URI::Escape' => 0, + 'DB_File' => 0, + }, + MIN_PERL_VERSION => 5.014, + EXE_FILES => [ 'musicexpo' ], + LICENSE => 'perl', + ABSTRACT_FROM => 'lib/App/MusicExpo.pm', + AUTHOR => 'Marius Gavrilescu ', +); diff --git a/README b/README new file mode 100644 index 0000000..f00e36e --- /dev/null +++ b/README @@ -0,0 +1,40 @@ +App-MusicExpo version 0.001001 +========================== + +App::MusicExpo creates a HTML table from a list of songs. + +The default template (named index.tmpl here)looks like: + + | Title | Artist | Album | Genre | Track | Year | Type | + |---------+---------+-----------------+---------+-------+------+------| + | Cellule | Silence | L'autre endroit | Electro | 01/09 | 2005 | FLAC | + +where the title is a download link. + +INSTALLATION + +To install this module type the following: + + perl Makefile.PL + make + make test + make install + +DEPENDENCIES + +This module requires these other modules and libraries: + + * Audio::FLAC::Header + * HTML::Entities + * HTML::Template::Compiled + * Memoize + * MP3::Tag + * URI::Escape + +COPYRIGHT AND LICENCE + +Copyright (C) 2013 by Marius Gavrilescu + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.14.2 or, +at your option, any later version of Perl 5 you may have available. diff --git a/empty.flac b/empty.flac new file mode 100644 index 0000000..b6b9340 Binary files /dev/null and b/empty.flac differ diff --git a/empty.mp3 b/empty.mp3 new file mode 100644 index 0000000..ffa3f81 Binary files /dev/null and b/empty.mp3 differ diff --git a/index.tmpl b/index.tmpl new file mode 100644 index 0000000..cc275ad --- /dev/null +++ b/index.tmpl @@ -0,0 +1,11 @@ + +Music + + + + + + +
TitleArtistAlbumGenreTrackYearType +
/ +
diff --git a/lib/App/MusicExpo.pm b/lib/App/MusicExpo.pm new file mode 100644 index 0000000..1595f71 --- /dev/null +++ b/lib/App/MusicExpo.pm @@ -0,0 +1,151 @@ +package App::MusicExpo 0.001; +use v5.14; +use warnings; + +use Audio::FLAC::Header qw//; +use HTML::Entities qw/encode_entities/; +use HTML::Template::Compiled qw//; +use Memoize qw/memoize/; +use MP3::Tag qw//; +use URI::Escape qw/uri_escape/; + +use DB_File qw//; +use File::Basename qw/fileparse/; +use Fcntl qw/O_RDWR O_CREAT/; +use Getopt::Long; +use Storable qw/thaw freeze/; + +################################################## + +our $prefix='/music/'; +our $cache='cache.db'; +our $caching=1; +our $template='index.tmpl'; + +GetOptions ( + "template=s" => \$template, + "prefix=s" => \$prefix, + "cache=s" => \$cache, + "caching!" => \$caching, +); + + +sub fix{ + utf8::decode($_[0]); + encode_entities($_[0]) +} + +sub flacinfo{ + my $file=$_[0]; + my $flac=Audio::FLAC::Header->new($file); + $file = $prefix . uri_escape scalar fileparse $file; + + freeze +{ + format => 'FLAC', + title => fix ($flac->tags('TITLE') // '?'), + artist => fix ($flac->tags('ARTIST') // '?'), + year => fix ($flac->tags('DATE') // '?'), + album => fix ($flac->tags('ALBUM') // '?'), + tracknumber => fix ($flac->tags('TRACKNUMBER') // '?'), + tracktotal => fix ($flac->tags('TRACKTOTAL') // '?'), + genre => fix ($flac->tags('GENRE') // '?'), + path => $file, + } +} + +sub mp3info{ + my $file=$_[0]; + my $mp3=MP3::Tag->new($file); + $file = $prefix . uri_escape scalar fileparse $file; + + freeze +{ + format => 'MP3', + title => fix ($mp3->title || '?'), + artist => fix ($mp3->artist || '?'), + year => fix ($mp3->year || '?'), + album => fix ($mp3->album || '?'), + tracknumber => fix ($mp3->track1 || '?'), + tracktotal => fix ($mp3->track2 || '?'), + genre => fix ($mp3->genre) || '?', + path => $file, + } +} + +sub normalizer{ + "$_[0]|".(stat $_[0])[9] +} + +sub run { + tie my %cache, 'DB_File', $cache, O_RDWR|O_CREAT, 0644 if $caching; + memoize 'flacinfo', NORMALIZER => \&normalizer, LIST_CACHE => 'MERGE', SCALAR_CACHE => [HASH => \%cache] if $caching; + memoize 'mp3info' , NORMALIZER => \&normalizer, LIST_CACHE => 'MERGE', SCALAR_CACHE => [HASH => \%cache] if $caching; + + my @files; + for my $file (@ARGV) { + push @files, thaw flacinfo $file if $file =~ /.flac$/i; + push @files, thaw mp3info $file if $file =~ /.mp3$/i; + } + + my $ht=HTML::Template::Compiled->new(filename => $template); + $ht->param(files=>[sort { $a->{title} cmp $b->{title} } @files]); + print $ht->output; +} + +1; + +__END__ + +=head1 NAME + +App::MusicExpo - script which generates a HTML table of music tags + +=head1 SYNOPSIS + + use App::MusicExpo; + App::MusicExpo->run; + +=head1 DESCRIPTION + +App::MusicExpo creates a HTML table from a list of songs. + +The default template looks like: + + | Title | Artist | Album | Genre | Track | Year | Type | + |---------+---------+-----------------+---------+-------+------+------| + | Cellule | Silence | L'autre endroit | Electro | 01/09 | 2005 | FLAC | + +where the title is a download link. + +=head1 OPTIONS + +=over + +=item B<--template> I