Initial commit
authorMarius Gavrilescu <Marius Gavrilescu>
Sat, 17 Aug 2013 20:44:09 +0000 (23:44 +0300)
committerMarius Gavrilescu <Marius Gavrilescu>
Sat, 17 Aug 2013 20:44:09 +0000 (23:44 +0300)
Changes [new file with mode: 0644]
MANIFEST [new file with mode: 0644]
Makefile.PL [new file with mode: 0644]
README [new file with mode: 0644]
empty.flac [new file with mode: 0644]
empty.mp3 [new file with mode: 0644]
index.tmpl [new file with mode: 0644]
lib/App/MusicExpo.pm [new file with mode: 0644]
musicexpo [new file with mode: 0755]
t/App-MusicExpo.t [new file with mode: 0644]

diff --git a/Changes b/Changes
new file mode 100644 (file)
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 (file)
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 (file)
index 0000000..2748617
--- /dev/null
@@ -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 <marius@ieval.ro>',
+);
diff --git a/README b/README
new file mode 100644 (file)
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 (file)
index 0000000..b6b9340
Binary files /dev/null and b/empty.flac differ
diff --git a/empty.mp3 b/empty.mp3
new file mode 100644 (file)
index 0000000..ffa3f81
Binary files /dev/null and b/empty.mp3 differ
diff --git a/index.tmpl b/index.tmpl
new file mode 100644 (file)
index 0000000..cc275ad
--- /dev/null
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>Music</title>
+<meta charset="utf-8">
+<link rel="stylesheet" href="/music.css"> 
+
+<table border>
+<thead>
+<tr><th>Title<th>Artist<th>Album<th>Genre<th>Track<th>Year<th>Type
+<tbody><tmpl_loop files>
+<tr><td><a href="<tmpl_var path>"><tmpl_var title></a><td><tmpl_var artist><td><tmpl_var album><td><tmpl_var genre><td><tmpl_var tracknumber>/<tmpl_var tracktotal><td><tmpl_var year><td><tmpl_var format></tmpl_loop>
+</table>
diff --git a/lib/App/MusicExpo.pm b/lib/App/MusicExpo.pm
new file mode 100644 (file)
index 0000000..1595f71
--- /dev/null
@@ -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<template>
+
+Path to the HTML::Template::Compiled template used for generating the music table. Defaults to 'index.tmpl'.
+
+=item B<--prefix> I<prefix>
+
+Prefix for download links. Defaults to '/music/'.
+
+=item B<--cache> I<filename>
+
+Path to the cache file. Created if it does not exist. Defaults to 'cache.db'
+
+=item B<--caching>, B<--no-caching>
+
+Enables or disables caching. Defaults to B<--caching>
+
+=back
+
+=head1 AUTHOR
+
+Marius Gavrilescu, E<lt>marius@ieval.roE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+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/musicexpo b/musicexpo
new file mode 100755 (executable)
index 0000000..c408bb4
--- /dev/null
+++ b/musicexpo
@@ -0,0 +1,70 @@
+#!/usr/bin/perl -wT -CSDA
+use v5.14;
+
+use App::MusicExpo;
+
+App::MusicExpo->run;
+
+__END__
+
+=head1 NAME
+
+musicexpo - script which generates a HTML table of music tags
+
+=head1 SYNOPSIS
+
+    # Creates a table with the songs a.mp3 and b.flac using the template 'index.tmpl' and caching the tags in the file 'cache.db'. The download links point to /music/a.mp3 and /music/b.mp3
+    musicexpo a.mp3 b.flac
+
+    # Disables caching, and the download links point to /download/a.flac, /download/b.flac, /download/c.flac
+    musicexpo --no-caching --prefix /download/ my/music/a.flac my/music/b.flac othermusic/c.flac
+
+    # Caches into /tmp/musicexpocache and uses directory/file.tmpl as template
+    musicexpo --cache /tmp/musicexpocache --template directory/file.tmpl my-music/*.mp3
+
+=head1 DESCRIPTION
+
+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<template>
+
+Path to the HTML::Template::Compiled template used for generating the music table. Defaults to 'index.tmpl'.
+
+=item B<--prefix> I<prefix>
+
+Prefix for download links. Defaults to '/music/'.
+
+=item B<--cache> I<filename>
+
+Path to the cache file. Created if it does not exist. Defaults to 'cache.db'
+
+=item B<--caching>, B<--no-caching>
+
+Enables or disables caching. Defaults to B<--caching>
+
+=back
+
+=head1 AUTHOR
+
+Marius Gavrilescu, E<lt>marius@ieval.roE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+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/t/App-MusicExpo.t b/t/App-MusicExpo.t
new file mode 100644 (file)
index 0000000..33f5b1e
--- /dev/null
@@ -0,0 +1,34 @@
+#!/usr/bin/perl -wT
+use v5.14;
+use warnings;
+
+use Test::More tests => 19;
+
+use Storable qw/thaw/;
+
+BEGIN { use_ok('App::MusicExpo'); }
+
+$App::MusicExpo::caching = 0;
+
+my $flacinfo = thaw App::MusicExpo::flacinfo 'empty.flac';
+my $mp3info = thaw App::MusicExpo::mp3info 'empty.mp3';
+
+is $flacinfo->{format}, 'FLAC', 'flacinfo format';
+is $flacinfo->{title}, 'Cellule', 'flacinfo title';
+is $flacinfo->{artist}, 'Silence', 'flacinfo artist';
+is $flacinfo->{year}, 2005, 'flacinfo year';
+is $flacinfo->{album}, 'L&#39;autre endroit', 'flacinfo album';
+is $flacinfo->{tracknumber}, '01', 'flacinfo tracknumber';
+is $flacinfo->{tracktotal}, '09', 'flacinfo tracktotal';
+is $flacinfo->{genre}, 'Electro', 'flacinfo genre';
+is $flacinfo->{path}, '/music/empty.flac', 'flacinfo path';
+
+is $mp3info->{format}, 'MP3', 'mp3info format';
+is $mp3info->{title}, 'Cellule', 'mp3info title';
+is $mp3info->{artist}, 'Silence', 'mp3info artist';
+is $mp3info->{year}, 2005, 'mp3info year';
+is $mp3info->{album}, 'L&#39;autre endroit', 'mp3info album';
+is $mp3info->{tracknumber}, '01', 'mp3info tracknumber';
+is $mp3info->{tracktotal}, '09', 'mp3info tracktotal';
+is $mp3info->{genre}, 'Electro', 'mp3info genre';
+is $mp3info->{path}, '/music/empty.mp3', 'mp3info path';
This page took 0.020546 seconds and 4 git commands to generate.