File Coverage

blib/lib/Audio/File.pm
Criterion Covered Total %
statement 19 19 100.0
branch 3 6 50.0
condition 1 3 33.3
subroutine 4 4 100.0
pod 1 1 100.0
total 28 33 84.8


line stmt bran cond sub pod time code
1             package Audio::File;
2              
3 1     1   35622 use strict;
  1         2  
  1         43  
4 1     1   6 use warnings;
  1         2  
  1         372  
5              
6             our $VERSION = '0.11';
7              
8             =head1 NAME
9              
10             Audio::File - Audio file abstraction library
11              
12             =head1 SYNOPSIS
13              
14             use Audio::File;
15             my $file = Audio::File->new( "foo.bar" );
16              
17             print "The ". $file->type() ."-file ". $file->name
18             ." is ". int $file->length() ." seconds long.\n";
19              
20             print "It's interpreted by ". $file->tag->artist()
21             ." and called ". $file->tag->title() ".\n";
22              
23             =head1 DESCRIPTION
24              
25             Audio::File abstracts a single audio file, independant of its format. Using this
26             module you can access a files meta-info like title, album, etc. as well as the
27             files audio-properties like its length and bitrate.
28              
29             Currently only the formats flac, ogg vorbis and mp3 are supported, but support
30             for other formats may be easily added.
31              
32             =head1 METHODS
33              
34             =head2 new
35              
36             $file = Audio::File->new( "foobar.flac" );
37              
38             Constructor. It takes the filename of the your audio file as its only argument
39             and returns an instance of Audio::File::${Type} if the corresponding file type
40             is supported. The file type will be determined using the file extension.
41             Currently flac, ogg and mp3 are supported but new formats may be added easily by
42             creating a Audio::File::${Type} that inherits from Audio::File::Type, which is
43             the base class for all file type classes.
44              
45             The methods and behaviour of the returned are documented in
46             L.
47              
48             =cut
49              
50             sub new {
51 3     3 1 1424 my $class = shift;
52 3   33     23 $class = ref $class || $class;
53 3         7 my $self = {};
54 3         8 bless $self, $class;
55 3         12 return $self->_create(@_);
56             }
57              
58             sub _create {
59 3     3   8 my($self, $filename) = @_;
60            
61 3 50       14 return unless length($filename) > 4;
62              
63 3         26 (my $type = $filename) =~ s/.*\.//;
64 3         11 $type = ucfirst lc $type;
65 3 50       8 return unless $type;
66              
67 3         6 my $loaded = 0;
68 3         274 eval "require Audio::File::$type; \$loaded = 1;";
69 3 50       147 return "Audio::File::$type"->new( $filename ) if $loaded;
70             }
71              
72             1;
73              
74             =head1 TODO
75              
76             =over 4
77              
78             =item * Add possibility to change file and its tags.
79              
80             =item * better (easier) interface?
81              
82             =item * user shouldn't be forced to use Audio::File if he only want's the files
83             tag or audio properties.
84              
85             =item * Add possibility to access raw audio data (Audio::File::Data)
86              
87             That could be done via Audio::Data or equivalent.
88              
89             =back
90              
91             =head1 SEE ALSO
92              
93             L, L, L
94              
95             =head1 AUTHOR
96              
97             Florian Ragwitz
98              
99             =head1 COPYRIGHT AND LICENSE
100              
101             Copyright (C) 2004 Florian Ragwitz
102              
103             This program is free software; you can redistribute it and/or modify
104             it under the terms of the GNU General Public License as published by
105             the Free Software Foundation; either version 2 of the License, or
106             (at your option) any later version.
107              
108             This program is distributed in the hope that it will be useful,
109             but WITHOUT ANY WARRANTY; without even the implied warranty of
110             MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
111             GNU Library General Public License for more details.
112              
113             You should have received a copy of the GNU General Public License
114             along with this program; if not, write to the Free Software
115             Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
116              
117             =cut