From 21cd9240d572994ade62bed83cabba9e0c53e4c1 Mon Sep 17 00:00:00 2001 From: Marius Gavrilescu Date: Sat, 17 Aug 2013 23:44:09 +0300 Subject: [PATCH 1/1] Initial commit --- Changes | 5 ++ MANIFEST | 10 +++ Makefile.PL | 21 ++++++ README | 40 ++++++++++++ empty.flac | Bin 0 -> 719 bytes empty.mp3 | Bin 0 -> 2717 bytes index.tmpl | 11 ++++ lib/App/MusicExpo.pm | 151 +++++++++++++++++++++++++++++++++++++++++++ musicexpo | 70 ++++++++++++++++++++ t/App-MusicExpo.t | 34 ++++++++++ 10 files changed, 342 insertions(+) create mode 100644 Changes create mode 100644 MANIFEST create mode 100644 Makefile.PL create mode 100644 README create mode 100644 empty.flac create mode 100644 empty.mp3 create mode 100644 index.tmpl create mode 100644 lib/App/MusicExpo.pm create mode 100755 musicexpo create mode 100644 t/App-MusicExpo.t 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 0000000000000000000000000000000000000000..b6b934022fe8021a32408c0a30ed68cfc68abdf5 GIT binary patch literal 719 zcmY+9Z%7ky7{`CDD7P}ES@b5j9XHx79aEd(iK5o5n7-vy8%7T2zAdqF(ezREP?SGLixzh#+F!f?oLWeBXSY@AG_l`uXkv z006fFD*$U=7;TyLuK-};k2GF%&E(Er=3mN1S@JMz0jM;btIEVj0eFBJOp*E}MH=Xp zu!!8#%=-dZt*hSU#_HU)^=?mHLz&?zHzcqEPkRGWBr+V4HXFbP1vVsjLvp0Fy`@BW zzu2-GZ~c$G{Lb#-Aw|NZfj(tW9x@vP$|um?I=9INwo%Tni}QOwr#-lSaFqJ7 z`~3%>BN$@$w9mbEsPNgsrKiqa&us+i`PdiEP#vAk;kexfXP=NB(c&V*`Vv}-7gs=e z@wa^UD*ml$!=j=&^{hUvYfcR=>q1uJmdCiX7|e@`o@a3uPY4iY5ptwSK_i`opsFG! z7B>b|ipa2#Q#F!<2~Jg~;QV+tn@LeA9HwjRgh+CTQ4wn=N{)GsgDk^QbPh<4WS~znK`L> z$siG!8kmTqj}uUh08p2YdSYowQK~{}UP@7ZW=V)kkTXz*6)0n5U|<>&FJhy+da;tHY{SQ5t4acmYOt8J8}E}|Nk~l zG-xo9Su>|aazV=l*9k3(9Eu#iENW*J-(0%2YSpSUXL2rF4Vjv$lXiCDE0@)|$`iL` zie_qR>ZR4)QCfOQHLYDr=F|T_|8s8Zf71W+|NW&;r(|Y+`ZCw)a{u>Kk?A*c9re0DBnzqo%NtDG|Wk1k_zdp$!`-7%mI2XcH!V~EgG-au0-ctRA zJqr}niW)jKIA$?QYkD!gS?J)hAPANb^-O^QH}t^&-vusv_`i5haDMsFuRuTW#RdkZ zeGUwaOMr=9fq}uKfq{W#==q8cE)H>Yhc^Edumfnr54)rSS|bom6{sPICWOLeVB`S+ Dn&Jvq literal 0 HcmV?d00001 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