Template::Plugin::MP3 - Interface to the MP3::Info Module


Template-Plugin-MP3 documentation Contained in the Template-Plugin-MP3 distribution.

Index


Code Index:

NAME

Top

Template::Plugin::MP3 - Interface to the MP3::Info Module

SYNOPSIS

Top

    [% USE mp3 = MP3("Montana.mp3") %]

    [% mp3.title %]
    [% mp3.album %]

    # perldoc MP3::Info for more ideas

DESCRIPTION

Top

Template::Plugin::MP3 provides a simple wrapper for using MP3::Info in object oriented mode; see MP3::Info for more details.

CONSTRUCTOR and CONFIGURATION

Top

Template::Plugin::MP3 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 (name):

    [% USE MP3(name => "A_Token_Of_My_Extreme.mp3", dir => "/mp3") %]

Template::Plugin::MP3 understands the following options:

name

The name of the MP3 file. Note that if both a positional argument and a name parameter are passed the positional argument will take precedence.

dir

Specify a base directory name; will be prepended to the filename, if it is defined.

utf8

Determines whether results should be returned in UTF-8, as handled by MP3::Info's use_mp3_utf8() function. See use_mp3_utf8 in MP3::Info. Note that this requires Unicode::String.

If the constructor cannot create an instance using the filename passed, a plugin.mp3 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 %]

METHODS

Top

Template::Plugin::MP3 provides the following, mostly intuitive, methods:

file

Name of the file.

artist

Name of the artist.

album

Name of the album.

bitrate

Bitrate at which the mp3 was encoded.

size

Size of the file, in bytes.

time, secs, mm, ss, ms

Length of the song, in various permutations. For example:

time

03:37

secs

217.0253125

mm

3

ss

27

ms

25.3125000000125

genre

Genre of the MP3.

tagversion

Full name of the version of the MP3 tag, e.g. "ID3v1.1"

version

Version of the MP3 tag: 1 or 2

MP3::Info defines some other fields that I don't grok; try

    [% MP3.Dump %]

to see them all.

Of course, all of the above methods don't return the advertised value if the tag being read does not contain useful information.

OTHER STUFF

Top

Template::Plugin::MP3 provides access to the @mp3_genres and @winamp_genres arrays via the mp3_genres() and winamp_genres() class methods, or collectively through the genres() class method:

    [% FOREACH genre = MP3.genres %]
       * [% genre;
    END %]

AUTHORS

Top

darren chamberlain <darren@cpan.org>

Doug Gorley <douggorley@shaw.ca>

COPYRIGHT

Top

SEE ALSO

Top

Template::Plugin, MP3::Info


Template-Plugin-MP3 documentation Contained in the Template-Plugin-MP3 distribution.

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__