package Template::Plugin::MP3; # ---------------------------------------------------------------------- # $Id: MP3.pm,v 1.1.1.1 2003/06/24 13:42:29 dlc Exp $ # ---------------------------------------------------------------------- use strict; use vars qw( $VERSION $AUTOLOAD ); use base qw( Template::Plugin ); my $ETYPE = "plugin.mp3"; use File::Spec; use MP3::Info (); use Template::Plugin; $VERSION = 1.02; # ---------------------------------------------------------------------- # new($context, $name, \%config) # # Creates a new MP3 instance. Requires the name of an MP3 file, # either as the first positional argument or as the 'name' element of # the configuration hash. The user can also specify a base directory # (using 'dir'), which will be used as a base for the aforementioned # name. # ---------------------------------------------------------------------- sub new { my $config = ref($_[-1]) eq 'HASH' ? pop @_ : { }; my ($class, $context, $file) = @_; my ($dir, $mp3); # Allow filename to be positional or named $file = $config->{'name'} if (! defined $file && defined $config->{'name'}); # Allowances for Template::Plugin::File instances $file = $file->name if (UNIVERSAL::can($file, "name")); # Allow filename to be relative to a root directory $file = File::Spec->catfile($config->{'dir'}, $file) if defined $config->{'dir'}; -e $file or $context->throw($ETYPE, "File '$file' does not exist"); $mp3 = MP3::Info->new($file) || $context->throw($ETYPE, "Can't create MP3::Info object for mp3 file '$file'"); if (defined $config->{'utf8'}) { MP3::Info::use_mp3_utf8($config->{'utf8'}); } bless { _CONTEXT => $context, _MP3 => $mp3, } => $class; } sub AUTOLOAD { my $self = shift; (my $a = $AUTOLOAD) =~ s/.*:://; if (exists $self->{ _MP3 }->{uc $a}) { return $self->{ _MP3 }->$a(@_) ; } else { return; } } sub mp3_genres { [ @MP3::Info::mp3_genres ] } sub winamp_genres { [ @MP3::Info::winamp_genres ] } sub genres { my @mp3_genres = mp3_genres; my @winamp_genres = winamp_genres; return [ @mp3_genres, @winamp_genres ] } 1; __END__ =head1 NAME Template::Plugin::MP3 - Interface to the MP3::Info Module =head1 SYNOPSIS [% USE mp3 = MP3("Montana.mp3") %] [% mp3.title %] [% mp3.album %] # perldoc MP3::Info for more ideas =head1 DESCRIPTION C provides a simple wrapper for using C in object oriented mode; see L for more details. =head1 CONSTRUCTOR and CONFIGURATION C takes a filename as its primary argument: [% USE MP3("Tryin_To_Grow_A_Chin.mp3") %] Optional configuration info can also be specified in the constructor: [% USE MP3("Camarillo_Brillo.mp3", utf8 => 1, dir => "/mp3") %] The name of the file can also be specified as a named parameter (C): [% USE MP3(name => "A_Token_Of_My_Extreme.mp3", dir => "/mp3") %] C understands the following options: =over 8 =item B The name of the MP3 file. Note that if both a positional argument and a C parameter are passed the positional argument will take precedence. =item B Specify a base directory name; will be prepended to the filename, if it is defined. =item B Determines whether results should be returned in UTF-8, as handled by C's use_mp3_utf8() function. See L. Note that this requires L. =back If the constructor cannot create an instance using the filename passed, a C Exception is thrown, which will need to be caught appropriately: [% TRY %] [% USE mp3 = MP3("Willie The Pimp.mp3") %] [% CATCH plugin.mp3 %] Can't find that MP3; are you sure you spelled it right? [% CATCH %] Unexpected exception: [% error %] [% END %] =head1 METHODS C provides the following, mostly intuitive, methods: =over 16 =item B Name of the file. =item B Name of the artist. =item B Name of the album. =item B Bitrate at which the mp3 was encoded. =item B Size of the file, in bytes. =item B