Audio-File-0.11/0000711000175000017500000000000010473574670012010 5ustar raflraflAudio-File-0.11/lib/0000711000175000017500000000000010473574670012556 5ustar raflraflAudio-File-0.11/lib/Audio/0000711000175000017500000000000010473574670013617 5ustar raflraflAudio-File-0.11/lib/Audio/File/0000711000175000017500000000000010473574670014476 5ustar raflraflAudio-File-0.11/lib/Audio/File/Ogg/0000711000175000017500000000000010473574670015212 5ustar raflraflAudio-File-0.11/lib/Audio/File/Ogg/AudioProperties.pm0000644000175000017500000000100110104413607020645 0ustar raflraflpackage Audio::File::Ogg::AudioProperties; use strict; use warnings; use base qw( Audio::File::AudioProperties ); use Ogg::Vorbis::Header::PurePerl; our $VERSION = '0.01'; sub init { my $self = shift; $self->{ogg} = Ogg::Vorbis::Header::PurePerl->new( $self->{filename} ) or return; my $ogginfo = $self->{ogg}->info(); $self->length( $ogginfo->{length} ); $self->bitrate( $ogginfo->{bitrate_nominal} ); $self->sample_rate( $ogginfo->{rate} ); $self->channels( $ogginfo->{channels} ); return 1; } 1; Audio-File-0.11/lib/Audio/File/Ogg/Tag.pm0000644000175000017500000000127610205361620016257 0ustar raflraflpackage Audio::File::Ogg::Tag; use strict; use warnings; use base qw( Audio::File::Tag ); use Ogg::Vorbis::Header::PurePerl; our $VERSION = '0.02'; sub init { my $self = shift; $self->{ogg} = Ogg::Vorbis::Header::PurePerl->new( $self->{filename} ) or return; $self->title( $self->{ogg}->comment('title') ); $self->artist( $self->{ogg}->comment('artist') ); $self->album( $self->{ogg}->comment('album') ); $self->comment( $self->{ogg}->comment('comment') ); $self->genre( $self->{ogg}->comment('genre') ); $self->year( $self->{ogg}->comment('date') ); $self->track( $self->{ogg}->comment('tracknumber') ); $self->total( $self->{ogg}->comment('tracktotal') ); return 1; } 1; Audio-File-0.11/lib/Audio/File/Flac/0000711000175000017500000000000010473574670015343 5ustar raflraflAudio-File-0.11/lib/Audio/File/Flac/AudioProperties.pm0000644000175000017500000000101710210630667021012 0ustar raflraflpackage Audio::File::Flac::AudioProperties; use strict; use warnings; use base qw( Audio::File::AudioProperties ); use Audio::FLAC::Header our $VERSION = '0.02'; sub init { my $self = shift; $self->{flac} = Audio::FLAC::Header->new( $self->{filename} ) or return; my $flacinfo = $self->{flac}->info(); $self->length( $self->{flac}->{trackTotalLengthSeconds} ); $self->bitrate( $self->{flac}->{bitRate} ); $self->sample_rate( $flacinfo->{SAMPLERATE} ); $self->channels( $flacinfo->{NUMCHANNELS} ); return 1; } 1; Audio-File-0.11/lib/Audio/File/Flac/Tag.pm0000644000175000017500000000114610210630636016406 0ustar raflraflpackage Audio::File::Flac::Tag; use strict; use warnings; use base qw( Audio::File::Tag ); use Audio::FLAC::Header our $VERSION = '0.03'; sub init { my $self = shift; $self->{flac} = Audio::FLAC::Header->new( $self->{filename} ) or return; my $flactag = $self->{flac}->tags(); $self->title( $flactag->{TITLE} ); $self->artist( $flactag->{ARTIST} ); $self->album( $flactag->{ALBUM} ); $self->comment( $flactag->{DESCRIPTION} ); $self->genre( $flactag->{GENRE} ); $self->year( $flactag->{DATE} ); $self->track( $flactag->{TRACKNUMBER} ); $self->total( $flactag->{TRACKTOTAL} ); return 1; } 1; Audio-File-0.11/lib/Audio/File/AudioProperties.pm0000644000175000017500000000567410205371306020156 0ustar raflraflpackage Audio::File::AudioProperties; use strict; use warnings; our $VERSION = '0.02'; =head1 NAME Audio::File::AudioProperties - abstract an audio files audio properties. =head1 DESCRIPTION Audio::File::AudioProperties is the base class for other file format independant audio property classes like Audio::File::Flac::AudioProperties or Audio::File::Ogg::AudioProperties. You should not use this class yourself exept you're writing an own file format dependant subclass. =head1 METHODS =head2 new Constructor. Creates new Audio::File::AudioProperties object. You shoud not use this method yourself. It's called by the filetype-dependant subclasses of Audio::File::Type automatically. =cut sub new { my($class, $filename) = @_; $class = ref $class || $class; my $self = { filename => $filename }; bless $self, $class; $self->init(@_) or return; return $self; } =head2 init Initializes the object. It's called by the constructor and empty by default. It's ought to be overwritten by subclasses. =cut sub init { } =head2 length Returns the length of the audio file in seconds. =cut sub length { my $self = shift; if( @_ ) { $self->{length} = shift; return 1; } return int $self->{length}; } =head2 bitrate Returns the bitrate of the file. =cut sub bitrate { my $self = shift; if( @_ ) { $self->{bitrate} = shift; return 1; } return int $self->{bitrate}; } =head2 sample_rate Returns the sample rate of the audio file. =cut sub sample_rate { my $self = shift; if( @_ ) { $self->{sample_rate} = shift; return 1; } return $self->{sample_rate}; } =head2 channels Returns the number of channels the audio file has. =cut sub channels { my $self = shift; if( @_ ) { $self->{channels} = shift; return 1; } return $self->{channels}; } =head2 all Get all audio properties. =cut sub all { my $self = shift; if (@_) { my $props = shift; $self->$_($props->{$_}) for keys %{$props}; return 1; } return { length => $self->length(), bitrate => $self->bitrate(), sample_rate => $self->sample_rate(), channels => $self->channels() }; } 1; =head1 SEE ALSO L, L, L =head1 AUTHOR Florian Ragwitz =head1 COPYRIGHT AND LICENSE Copyright (C) 2004 Florian Ragwitz This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. =cut Audio-File-0.11/lib/Audio/File/Ogg.pm0000644000175000017500000000075010205363246015546 0ustar raflraflpackage Audio::File::Ogg; use strict; use warnings; use base qw( Audio::File::Type ); use Audio::File::Ogg::Tag; use Audio::File::Ogg::AudioProperties; our $VERSION = '0.02'; sub init { return 1; } sub _create_tag { my $self = shift; $self->{tag} = Audio::File::Ogg::Tag->new( $self->name() ) or return; return 1; } sub _create_audio_properties { my $self = shift; $self->{audio_properties} = Audio::File::Ogg::AudioProperties->new( $self->name() ) or return; return 1; } 1; Audio-File-0.11/lib/Audio/File/Tag.pm0000644000175000017500000001056210205370666015553 0ustar raflraflpackage Audio::File::Tag; use strict; use warnings; our $VERSION = '0.03'; =head1 NAME Audio::File::Tag - abstracts the tag of an audio file =head1 DESCRIPTION Audio::File::Tag is the base class for other file format independant tag classes like Audio::File::Flac::Tag or Audio::File::Ogg::Tag. You shouldn't use this class yourself exept you're writing an own file format dependant subclass. =head1 METHODS =head2 new Constructor. Creates a new Audio::File::Tag object. You shouldn't use this method yourself. It is called by the filetype-dependant subclasses of Audio::File::Type automatically. =cut sub new { my($class, $filename) = @_; $class = ref $class || $class; my $self = { filename => $filename }; bless $self, $class; $self->init(@_) or return; return $self; } =head2 init Initializes the object. It's called by the constructor and empty by default. It's ought to be overwritten by subclasses. =cut sub init { } =head2 title Using title() you can get or set the tags title field. If called without any argument it'll return the current content of the title field. If you call title() with an scalar argument it will set the title field to what the argument contains. The methods artist(), album(), comment(), genre(), year(), track() and total() are called in the same way. =cut sub title { my $self = shift; if( @_ ) { $self->{title} = shift; return 1; } return $self->{title}; } =head2 artist Set/get the artist field in the files tag. =cut sub artist { my $self = shift; if( @_ ) { $self->{artist} = shift; return 1; } return $self->{artist}; } =head2 album Set/get the album field in the files tag. =cut sub album { my $self = shift; if( @_ ) { $self->{album} = shift; return 1; } return $self->{album}; } =head2 comment Set/get the comment field in the files tag. =cut sub comment { my $self = shift; if( @_ ) { $self->{comment} = shift; return 1; } return $self->{comment}; } =head2 genre Set/get the genre field in the files tag. =cut sub genre { my $self = shift; if( @_ ) { $self->{genre} = shift; return 1; } return $self->{genre}; } =head2 year Set/get the year field in the files tag. =cut sub year { my $self = shift; if( @_ ) { $self->{year} = shift; return 1; } return $self->{year}; } =head2 track Set/get the track field in the files tag. =cut sub track { my $self = shift; if( @_ ) { $self->{track} = shift; return 1; } return $self->{track} + 0; } =head2 total Set/get the total number of tracks. =cut sub total { my $self = shift; if ( @_ ) { $self->{total} = shift; return 1; } return $self->{total} + 0; } =head2 all Set/get all tags. To set the tags pass a hash reference with the names of the tags as keys and the tag values as hash values. Returns a hash reference if no argument is specified. =cut sub all { my $self = shift; if (@_) { my $tags = shift; $self->$_($tags->{$_}) for keys %{$tags}; return 1; } return { title => $self->title(), artist => $self->artist(), album => $self->album(), comment => $self->comment(), genre => $self->genre(), year => $self->year(), track => $self->track(), total => $self->total() }; } =head2 is_empty Returns whether all tag fields are empty or not. =cut sub is_empty { my $self = shift; return ($self->title() && $self->artist() && $self->album() && $self->comment() && $self->genre() && $self->year() && $self->track() && $self->total()); } =head2 save Saves the changed tag information. Not yet implemented. =cut sub save { } 1; =head1 TODO =over 4 =item Implement writing tags =back =head1 AUTHOR Florian Ragwitz =head1 COPYRIGHT AND LICENSE Copyright (C) Florian Ragwitz This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. =cut Audio-File-0.11/lib/Audio/File/Mp3/0000711000175000017500000000000010473574670015135 5ustar raflraflAudio-File-0.11/lib/Audio/File/Mp3/AudioProperties.pm0000644000175000017500000000065110111504062020574 0ustar raflraflpackage Audio::File::Mp3::AudioProperties; use strict; use warnings; use base qw( Audio::File::AudioProperties ); use MP3::Info; our $VERSION = '0.03'; sub init { my $self = shift; my $info = get_mp3info( $self->{filename} ) or return; $self->length( $info->{SECS} ); $self->bitrate( $info->{BITRATE} ); $self->sample_rate( $info->{FREQUENCY} * 1000 ); $self->channels( $info->{STEREO} ? 2 : 1 ); return 1; } 1; Audio-File-0.11/lib/Audio/File/Mp3/Tag.pm0000644000175000017500000000126110473574453016215 0ustar raflraflpackage Audio::File::Mp3::Tag; use strict; use warnings; use base qw( Audio::File::Tag ); use MP3::Tag; our $VERSION = '0.05'; sub init { my $self = shift; $self->{mp3} = MP3::Tag->new( $self->{filename} ) or return; $self->{mp3}->get_tags(); my $info = $self->{mp3}->autoinfo; my $track = $info->{track}; my $pos = index($track, '/'); $self->title ( $info->{ title } ); $self->artist ( $info->{ artist } ); $self->album ( $info->{ album } ); $self->comment( $info->{ comment } ); $self->genre ( $info->{ genre } ); $self->year ( $info->{ year } ); $self->track ( substr($track, 0, $pos) ); $self->total ( substr($track, $pos + 1) ); return 1; } 1; Audio-File-0.11/lib/Audio/File/Type.pm0000644000175000017500000000707710205363224015760 0ustar raflraflpackage Audio::File::Type; use strict; use warnings; our $VERSION = '0.02'; =head1 NAME Audio::File::Type - represents an audio filetype =head1 DESCRIPTION An instance of an object inherited from Audio::File::Type is returned by the constructor of Audio::File. This object currently provides access to the audio files information like its audio properties (bitrate, sample rate, number of channels, ...) and the data stored in the files tag, but also providing access to the raw audio data and other information should be easy to be implemented. =head1 METHODS =head2 new Constructor. In fact you don't need to use it. Please use Audio::File which will call the appropriate constructor corresponding to the files type. =cut sub new { my($class, $filename) = @_; $class = ref $class || $class; my $self = { name => $filename, readonly => 1 }; bless $self, $class; return unless $self->is_readable(); $self->init(@_) or return; return $self; } =head2 init This method will be called by the constructor. It's empty by default and should be overwritten by inheriting subclasses to initialize themselfes. =cut sub init { } sub _create_tag { } sub _create_audio_properties { } =head2 name Returns the name of the audio file. =cut sub name { return shift->{name}; } =head2 is_readable Checks whether the file is readable or not. At the moment it's only used by the constructor, but it will be more usefull with later versions of Audio::File. =cut sub is_readable { return -r shift->{name}; } =head2 is_writeable Checks whether the file is writeable or not. At the moment you'll probably don't need to call this method, but it'll be more usefull as soon as changing the audio file is implemented. =cut sub is_writeable { return -w shift->{name}; } =head2 tag Returns a reference to the files tag object. See the documentation of L to learn about what the tag object does. =cut sub tag { my $self = shift; unless( $self->{tag} ) { $self->_create_tag() or return; } return $self->{tag}; } =head2 audio_properties Returns a reference to the files audio properties object. See the documentation of L to get information about what the audio properties object does. =cut sub audio_properties { my $self = shift; unless( $self->{audio_properties} ) { $self->_create_audio_properties() or return; } return $self->{audio_properties}; } =head2 save Saves the audio file. This is not yet implemented but it should remember me to do it at some time.. :-) =cut sub save { } =head2 type Returns the files type. =cut sub type { (my $type = ref shift) =~ s/.*:://; return lc $type; } =head1 TODO =over 4 =item implement changing the file =back =head1 SEE ALSO L, L, L =head1 AUTHOR Florian Ragwitz =head1 COPYRIGHT AND LICENSE Copyright (C) 2004 Florian Ragwitz This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. =cut Audio-File-0.11/lib/Audio/File/Flac.pm0000644000175000017500000000075510111675476015713 0ustar raflraflpackage Audio::File::Flac; use strict; use warnings; use base qw( Audio::File::Type ); use Audio::File::Flac::Tag; use Audio::File::Flac::AudioProperties; our $VERSION = '0.02'; sub init { return 1; } sub _create_tag { my $self = shift; $self->{tag} = Audio::File::Flac::Tag->new( $self->name() ) or return; return 1; } sub _create_audio_properties { my $self = shift; $self->{audio_properties} = Audio::File::Flac::AudioProperties->new( $self->name() ) or return; return 1; } 1; Audio-File-0.11/lib/Audio/File/Mp3.pm0000644000175000017500000000075010111675507015473 0ustar raflraflpackage Audio::File::Mp3; use strict; use warnings; use base qw( Audio::File::Type ); use Audio::File::Mp3::Tag; use Audio::File::Mp3::AudioProperties; our $VERSION = '0.05'; sub init { return 1; } sub _create_tag { my $self = shift; $self->{tag} = Audio::File::Mp3::Tag->new( $self->name() ) or return; return 1; } sub _create_audio_properties { my $self = shift; $self->{audio_properties} = Audio::File::Mp3::AudioProperties->new( $self->name() ) or return; return 1; } 1; Audio-File-0.11/lib/Audio/File.pm0000644000175000017500000000575410473574655015062 0ustar raflraflpackage Audio::File; use strict; use warnings; our $VERSION = '0.11'; =head1 NAME Audio::File - Audio file abstraction library =head1 SYNOPSIS use Audio::File; my $file = Audio::File->new( "foo.bar" ); print "The ". $file->type() ."-file ". $file->name ." is ". int $file->length() ." seconds long.\n"; print "It's interpreted by ". $file->tag->artist() ." and called ". $file->tag->title() ".\n"; =head1 DESCRIPTION Audio::File abstracts a single audio file, independant of its format. Using this module you can access a files meta-info like title, album, etc. as well as the files audio-properties like its length and bitrate. Currently only the formats flac, ogg vorbis and mp3 are supported, but support for other formats may be easily added. =head1 METHODS =head2 new $file = Audio::File->new( "foobar.flac" ); Constructor. It takes the filename of the your audio file as its only argument and returns an instance of Audio::File::${Type} if the corresponding file type is supported. The file type will be determined using the file extension. Currently flac, ogg and mp3 are supported but new formats may be added easily by creating a Audio::File::${Type} that inherits from Audio::File::Type, which is the base class for all file type classes. The methods and behaviour of the returned are documented in L. =cut sub new { my $class = shift; $class = ref $class || $class; my $self = {}; bless $self, $class; return $self->_create(@_); } sub _create { my($self, $filename) = @_; return unless length($filename) > 4; (my $type = $filename) =~ s/.*\.//; $type = ucfirst lc $type; return unless $type; my $loaded = 0; eval "require Audio::File::$type; \$loaded = 1;"; return "Audio::File::$type"->new( $filename ) if $loaded; } 1; =head1 TODO =over 4 =item * Add possibility to change file and its tags. =item * better (easier) interface? =item * user shouldn't be forced to use Audio::File if he only want's the files tag or audio properties. =item * Add possibility to access raw audio data (Audio::File::Data) That could be done via Audio::Data or equivalent. =back =head1 SEE ALSO L, L, L =head1 AUTHOR Florian Ragwitz =head1 COPYRIGHT AND LICENSE Copyright (C) 2004 Florian Ragwitz This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. =cut Audio-File-0.11/t/0000711000175000017500000000000010473574670012253 5ustar raflraflAudio-File-0.11/t/test.flac0000644000175000017500000014467110205372652014073 0ustar raflraflfLaC"9zAWQO6}Jc~< reference libFLAC 1.1.1 20041001 TITLE=Title ARTIST=Artist ALBUM=Album DATE=2005TRACKNUMBER=02 TRACKTOTAL=03 GENRE=RockDESCRIPTION=Comment TRACKTOTAL=03 TRACKTOTAL=03 TRACKTOTAL=03#"TN2Yzd͎5'LDm{0R9Żp(leFգ2%O4Q =?0dJg#Dw'ga{?(N.}qsX7Wa [kKȈBm٥#l$|.'?E1j vt04/6&\$DN%,Q!ٮGfTq g&:̈́9h"JaOXYҨYIѦhPQᖖ$}Ǖ(TQ;x=IX8ehף0bʕ22ͥ(r^>|!۝Mh,[}孛 FTkY*.!U%k$HlG&LI?DA3jG?dJFYU=oWvkVѰ5tIeg.Q;v"Q 1=_?&[Eƹӥ$eUp[X>0Ei ad@ \6儝˝ޓO?]*ڐ{"%5ݶFWGolKW'O!@]v[-j \h^TF=OB1İ3jK]*a %׻.%X{II _V> ?o{Mmy-Z[JGHm!B͞!`E2'yt٩ u9HtGiN+y4RsMR S>b3SC^ϭQD S|*HֆS}04ǻ/7~|lVdA{AWM\ Mw] =K }HtswxV,_\iSBʭ){vr-zFWv1`fPk#)+W>2IyZ_(yˣBcۛhH%9KDFW:Oג=vB! '֬5%],|9.#d@ O?$98 P>L$j9`O|b?Q%/zq$C$ks*Di1Ynaj+҅W%[Ve FJ^SARKjDC[S|IqP}Į~(d0Of"a"C,*LHp圔I ?ϗLy<~! 7 ó% X˻h`ZW RfF̓'-=Kb~<  (;G I0Jc) HD;X^{/1A~Ks6#Rp}"RP*k iQdRx;2W<^ \#JSzP_ VսVSk֑ҡ4oݗWJTp8D{͊Vfٔ>bbR{T Wyys!#R7`&]'\~`+M@B:PRDv +5q."7@#cDj݌GՒ?aG p|㲡^m$+87-u#MRD0"@*Mk{AjD v^8W3Fzjfk(R|k=Ŗ M\c~Q~ f/؏c nЭ5KdY|+(i5m?vFBesLJY~iG#d܋KM(&JC߲KɜX"mN@nŗ K $=}mr*qz(ЄčF-PU,سX]3ipӉb`J- A sU m; KURgAF\ЊR#BjhL)et Z$v+kH_akj_nfM*(rZ 82EAC)3j&p5PGfۡܤxd H @NrT9KnXxEL8?8lHBzdzDhQXPڠa?u+AWI+ɑn'P#6ݮua22+aYz1z`'HE4tqgA*Ϫ2.1ӐH#O@!,CvAו#&tK0jZ8H& !|BCE|$YRR/DsuSQ՗L4L%Gz3-G"Z?lD촚=bǣDVmfN"Kؖ.z -N!7qb\E@4I`[`?6;H78Xn;)&x/(P`p6gVJ+LCQgDG7{Q[:ޙÙyiql]HRXAX 7>9Rn@q 4B0kC56H޿&R6yWފ H,o%k(9h_Uf$F]ưy-VflY4yIYd.9 8' ^s|~YΆ 1ЦIV$m*9|qf|-DԈyJSq~ ~mw;bd@âFıց8&[/mZdU|-E $GW2=g=\r8]+ŤUT}*J)`:Y6)䆦S˜l͇SP \Qk7:R?Vw7[DU[t_pXE檍&7Gy {50lSsCfH'EWɈ_J8tlBq8A+5]FEՎ'@ógfNJn8Űԋ'U WNubxDL|}Iy#SUqQjTnGǰ M2G#S8b%WjYm{WFxז-)6x.5?'@UǖJvRdjsrH7:z2?>kɸY^u%CБa[%n8Dy{iP{XJ s{os:ltT#p7(m)fmĪ@l"-"ai)y~*C 4<`D^YXFkmWD%ϩ,(Wj{ Y,2ďX]sr7;7|ZarQ8gbt_X眰3H;#x T"6]~py8E^ +&0bXe(0 >R66IKTJي5FUuhMy?)q)JŲ{:z&r}%q =#L}Vg6̷0b& 0ɇ28RQ~Mz"(clMx .I^x-N!7",Uvo’in)'^gbuؐ$BI!eOK2 `w{]$u&֫ZE]?܇/)lOK/RbXкT7ЇzZYj(>?9-= Su邴4ظƳkQugOhg=(&6jZb̑K[UbU5rt1; wH~>ϼ"&s2,sҡM* XLņ:RbCe`rruofBVYS_[=z=VT0[J >uDDpZo=7=3 U6bnsy_i&]Uّ)2f v9$yaZ&4=BՏ-yil%eL6)m!MF'~Fs/U܆WJTZWJe@ZE*% b'QВY aE" G"s!e!+v6F*lJ6r+P-bg7Ed\TNbSc::!GOJOEr5ƒٵĺ:+D񾞲ǭuw2e`SG?hrx_ +-oMjD N³7Yjߙ#ctO{; `ORPωXU@VbׄH|}٬jg!FQGsR')vȗlY$S.sM5u97y$.RsB Gfo(4~H邚3qɩ%WÀI8*ە`dDŽ> a#[{b 10Ry@4-& p)Ϯ)h+Xy_Q:W({[iG蘙j8 5!s"*u碎ɕM{֥}pP7f5)}}ZnGNiu(N[[`mUz0TR:kΜ Zdx*R#BmL_j_bVȥQS4&uM$O'A.Ilʳ?9z(4\ad/igLY8n+# _q.~wmKڈ9r+ "e٨~Z{wPh1D>%bA]C,9aq32vx*ߝV$Y jul'6Olk+xDo7O-8羋RwV'-#ÊMJb^ eeNװH$^DR.e`ҹ]37sRC]̂R D("Yki O)d/CpqRag$*{ RT6=z\)vB:Z"/rN$N^FQh{ZMvL|ħ)yTٯMg8?m$OP> ߪUvU-(HbZNATwVǪc#x8c3#͠TZ-{FFsXN`}~aڟ53օXq^Ôʚ"ai),`DWV?kcBlm5WQ - ZIP vo/,>1-_Qms=IURյib'S{Ųith&8,Rje*QrKavdJkWK_~@?zcEHoo7{A0a$bOg/H?\S9&h-|ʇڒܩ"0H=S36Q=m [5=XxOݴAƫ p@i>AOې]lUfVVU1= WV Fe]dFDZUu-Ge/W;DY/[T[KNl0,5u%@QJdͣB9쩽[F{i}R6iٶ=N,*¹19|u7?ʺTrO΢WJY>'2ҽY@ @4~vݴsNЊi'".gi Ā0 ITOĘ n??I*SR~D`li~perc; P6g[gvjz߀DioL(~J +~/ekXhn֊8a W:KkNשמ\\0qr쐾 Ç:R̩7U2sF^uv$ȦW W GWB 6Dg:ѷz7'ةۼQKǜuҎj5 뎔p7xuwUAK ؛mU-Ӭ*K zHjf*]#|;<|SǒcOnȸe5vPBkm"}cmmΡh l:S ̅P89=06vVeSt߿Y*>Pi4 L:8whBCH:⺅ݔB29gGHڨi۷K[a8\emD>tEQܫucAMq+wSن^(4UZ:-ߪՁ (Vعi;ϞpgѸqQ)X)rHҬdq7Zӂ\|R!u_dIOp(W|M>i9וָ׊NvFi9v=@UXA֝s_[DMOQ?L¡휐[vYGr:?T EDlA9_;6$mG6 )@6O4ėD6Mԃ&L I^%l*pUWky" ?&RIt*^$آt_ x%ʓh,NM<HH_ f^Jۊ:]25s& ؕ8hC ԕm]Aa6i~фc]F@ޛ-gmZy,/$+"\-`3,8 )V%3  t[A44N:]D)agk&Ҡ!{G2k9Rqu_&m8UwSSlyo_9R'GG5ɶyvjnML݊5ʠ/dp MނX=XKoSjmHu7Ah (^H Jވ޼o͔ĜKB %yh|Trf71*Je-7Ry_V]_W+7(U8\ln9 j5zȿVY7SWfݶ6X062h Wc}- 0ءW^M#tj6wOm.NMJVpjW;XԤ6 q#}v""{?UU5D΍1Ί8:Ep].9ц=D9jʓ$$UG[FL!Iƽ4;FUt-uvzFdA&9Xk T q/O'Vu-4ԺgZ5]B|.y*Bڸi&'A?/hE]}~أ iG P늤TaR+]Ln3>ZITXO<_Kx.dR4C9=(-Y"=CwG^% 41_qq/J`f"Gܝ[8YCjsV6En)2VL6^|=&X(k1MHᤋ3ԯCQ.ҁ]\ 4am˕})C#%`BC@[$m 8,Q&O97ܯ$ D!nz˟-TNr m>1#As"5(`Q%Unu?ŰjG|f~0;ښpp 9\)B8ΈM 4(ygi5R*6*%j|gS|o3>s-$A&])vDf"RN uN2ŢZ >M[е.!,bmgT5ZZJku+NDJ[)~lC'I &]nxlOF) b!Nd{(}'1fi%>m)w-u3fvHvvg,_?T42O˜ (q!=dk6HwjUt[mdwh&PQo@+ ݅ӾRef E1.ݵĊ e(zdy/qȢu55zT]Š+p#1NM0UX 4 W6ds=qq @%EaQHyeEip ʺ8ܣR_' <9Qɫ޽-׎h>sjC'K0qȕ+Qbzj9M$1([<0HMO$JPkǕеysDidorx~pKrbz~A o+{C5a=k^&JM$LLA( l335[Z(ԗwL m"Ćr(<8'~Tr۱N&2KzM16e gi5 fdULXMU1 ->0De)諕OYFBMl ^KUX~9Lwf聨M}1+7h*{3VDZPI'2Tk~\ϬJ,B8Bm3dz,GX㞟;эk"!^+'!} :%?k_nw8Ƅ]iz?:N\2&R笄EMH^#^ƬIa8]S|/xK|>sLAdI*\Mv$; U_g.ZL6H&tGgdWvEa4ȄD@ `(MguUu(oŒ%n%y^3yod!#]ȐO.qͮ<,OtGoC.J*4kl'6fWDmzrqcIף8:>ս;6U$ s&܎U'} SPcdč9圛4y.ډϯew9Wؕ 3[xÑ?H26 0O0LBe@eBotZ"9P̸S+ ˵q($a=w^ &H9TLt9m$9J{`$RhER3w<}8xy X吧T ts"qO=/ pSM]X؇~tE((i;@YZrp&ˤ/2,[q$]NpsX d${dXl-0oeΏC#:k%uhr]֌tp;$Eo$T^mhz-F6<-A\Ѫ~7)H.qS+d=J>Q '5N34}4{&/x !j^(5Xq'>cq /9\ô9/L߹ˉ5%熪/x&6#bH'n4CKleHRMxLk']D'C[Po@ǚ79)Kn/8#ϬBO$(3ӜAutľ">dKMT[dX,dOٵC c(§&az# MM}=&=L#@UtR$,:DKֱM w8D~hṖPUwrCX*N !/0pEIZ.H,%}:٨~GmsUCX9|Y:, _T \٣T5"5K=*8Mn5]|.mܙbf12ls b ׍]sD5dpO9X0b"޲oOЊ_˥أ+5  F1VN:Q8+CuH(r+W C6#T*07*a&̨jNޯ+Pe#Pp@ 5ւt݊vsލЇ\c%o@+uENqèP2Zv4k } NՒԲ-KՈ$D kd!#ӗ3 su!RD)֎ę#YGB7-яb\X! ]?jx4j%@uT26 u2Ȕ<! ίdL!dñ7-f*πsפq.'_܍lRgggu%r胫$ ,a))GE1lB}dTNi !z7Q?l:5ΖGCEl{E.@<8-V|%ҊAc'k֛x`:6q?Nf@NME) r\'U$BR ebn';=%pA.폻z#nH5 (| -A)I܍jq=nQ28>>̠ġn"#_Pƅ^)ьި͟l?9')&<?NRaLSQ]Liٛ9B_թO]њH?iߥV˛ * 2m` xk⾣֡8ĆR%f[JAId@9#q`ŋ8X FG\gE'J3nH|# qGCo֤`/TԺO[ 8%QM2g vp5n799+o)NSE: ̸$ J05H⧈;0wSzdρXwa1(3&w=F^5Ddn8pPOb<~t"⨖ݛb61պP'Ոs(x<87yö=XaQR'{|0H7EUӳ\B[+&%goCqlmPn%k/!5UJaxz*X뇬aWצD5u4A~}R~]m]м~@Հj -Y}WW`iM48'4`gӐ "o v i%]N/-Bi\.Prg"aP2(R5JԢ*\-Qi0 lM'R/_Iت1eA[Dq|ЌuP'Iuw $԰Crai10Il{ZČl"A۩.wVyA6Ԫ5R6=]9r?a>*,! %gg^T;`$a/!EUJg?k#+V X\`jRI(lKq̺x$u2茭o;w`C:StpBѦ?Lc[/9B"UJQ[ds]5'D%MI:(-oG> 5X~1 !1BҔ7&9+K)@eil`|{^ nN4eUS'OkG+JB sѥLQCF-'g#DWi\2z:$qfk`nddr ƂZplƔ?@ і\^&;DNQ7{|H񳙗ď"Ao3g]2xhV[Tvd|lǹTu~^-=ZZz75G O:4'r!rD1kDk4l Ѝfn<f;)H 񡧧{ALT[0 zI `}lrd 1Y⋗?kJ)Zq*(qS ,oBz|k.XǙ ]rEϺ"'KrN NjCsDfb[)2P];} XSLu4քo|*^|Dqe-ݕW$7p#FlRa1ka XDO!/LO;Z.I5MyߢdƽYЖѡ_h\ ֓Ȅby]jhq.!.BXHTs:1"R&D?>Q}Ҩ=іE%;Bb92fRĦn ALK(SY̴ȋf JyD]a!5h"4BD&WS&G%rh :\ xAZV!u$iF7+-h-RYlʤؤ9MeQ$gb y\I.Ht)mbjXꥠ|Gu+$ۧ1t@^[.xc.|F .L^?ڑ@!"!1*= N 1iZb~.6G4 mç%IGxB(^?K r{е ȁC)J6ҭ!1lt9d[m z3/SVޠWUD⑦jo7zAXe^9l^4kc?mGVsc @R XUAbRɁ F![MrccuDkM0]ֳ&v I#t~jH&(h"Rϖ';f5tB B KzZQg2bf536pic1|BծYj[A-~hIE\{akC6NtɎ_)3㛘ƧiH4}F7<^[tjiLJ&ƙC#],vw$ĩ3G[,i* K;enG3Ha\́/ |@ ?8 j7waD(q3k! 6(nn~JtC:߸1|%˦—/W+MFC¹:SHPcw_uU_BI,w?jC!!Utq2YKdx,#"\KNwʜZQ܀Ddֲ@G)͂CU0g躭rl Vo0KcFJ@H4 J ̚,)k1,?M>81`+k|Y6qtkA9=1f/Tfj԰BZ$Zlu25)WЉxE& $썞(lX1'ޙPsPN9Ⱦћ Bs1ޜↅXYsN.7sSQAsHPg̮ɪyDYi@X'E"_*,f^HrQ(Ӕaf M4%4J%;+@171ʑjj_![<1lg 8 @CX]|~`O*ȁpEa< \Nb5ߓ\歇p1]x MZ\7+]ٌuhJ%~ )W!G@Qaui8aæIү+GŅ GlV oà=b&CF|;e$!eH3MG#u8u\I _tU 5wLE-a)rʓbT7T6/P3ӼVɞbT^ިRS\k.,@m9B47 &:=h$wA O9= Ki5 %a-ۜ2vâ 0cxltؚ$W @k'[yu J $K[T*['vl4d  B̾'p_+5gZqB1Aoq6xМLl Mҥޫ<$V<(vN5 5N8s/࠹}mī2 'YhaIes>У)ûSќش5פ>GuATBx7 U3wkUwV5(!-l+A,f,;i.c!sN:(a&oz!hJeQ$Ǥ.Eݡ\Cze,|452f8̊M qT Hp,^4X~ǶWF,L^[v%cR\ܿ=w3R1g,v{cETVXЧl\e N"iTLT7"` . N2SV؏.򷕉,a}.-%%H~Z]kRS.7f-O )7CלSln5*hys VmJyr  +%ނ][n&ws\)o <+)h'Dnڮ9L- X`[ha 0Í/ bH4yFLun# B<v`ҿw(_Tl/Z(d!-fթ0u[/W){~/VD4.U@"9MB/z@Ȃ~SGiu$b4Bg uʸlAbkE=^(T᮶/Z$+DE~@GC?d^?1X]:Q zlҗtǂrRw:lx-A ]~!XIB!`(iyu`!@^-tf!VHAW(Z=ZM(R(ZE6+<11X]] 9V0rيQH6WJiKjs քK!Zm[ak} ] L]&?׀!yPE߰.aB<4l`JsNM?YQބ ˔`  a IgXƞ\&'hRҞVж_U6MR? PawGR0Bbcsz|`7>Xj.C<}_P`|td_f.ަ?m%3*\$LcVдr9Y㇅cS >AѠ:PB&7lFZ<\N$Oc"V nX%[V1PNt5H3Rlޑ՗gG2.}&\6p̔y=UfUrUNE W#P}eWbQg e&}y }"̡+#h>,x(Y;Sx]c{tSPyGʄg& nt1xWdY cNkIՎݔb"QY% ",܂x:W#PIh,[`( }\35s_u&ji5**r;Y~=U0 4vq,Wfvl . HyL#{-B}mz+@H#].I5%UD{=G{Hr';g{Co?+e޴k[0jHPCF~iT;MeraT$={x|X$Q,/A<sXǸ-rOWVr\˼̭:)fH!3~"~ptЭs(f<;2\9CwM\@ Gdd&\ 'S#.u(*+wwyLȀ01wV+;qNQ.RBLe3r_⩉/}alHX8kԙ!r(jT?/3%0m`CxZHG箝HHFiew`H3,W.hr<b^;Bkx()JV[us#8qӓ=R!~(Ī {HXJ.эH5Bk/"BmL^> MnTn϶PdOYFlm}d!y g}RTLf>{h{h:HɈE ;8B $>YLl)Mac;ў ϥLŀ"# lsŧ(B&űaPDÆ1׭ M loSEn,2CtERERDK;Bj7;<̾(7U*Exb+KcATPe4KBHtwsPsjy.j,yç`LÅ.QJ9,,OUSK938r DcQ2q1JN=|yOo|.ĒQA>i8\`V(@[I:|+'9I]g8)?*,4ĉX&}NJvvAWLӿDV9Lrd0'iQimT!0.Nq,vRӿh*ԯ߱*dD9O%ǽX\ 0vWcݳ} 'YjOv)0*nd4LpMb#y|I+LԂAҕTRz 5R>iCp1"Dzy Z?2ڍ<)tE앙9]F/[~܅f #!43 BHAɚ딑fKF%ңmW z05t?߅?с]m`_+TDA‰:B0\VaS+Q- V @bKb9_EwJpƜ%(o,rF;D4C-!ջKAQ6>j)O!zݛ_iϓMFV*ђrhZ'%unGl ] H& A֦1[lەZ%P-]2'(YwKvn45U/ȨrA MhhϟH1 OiQc5[v~ԐFA8ki"&QqAb 1lgG)`׆R՛G?q-iI t1]FMy8#:-,-zu(AK1Tm{)KS׭vt-y'pU:{lUZM|8yr~#5G>YqB`+t@j;0UFj||%c&5IPŠ6w2h](pz$ҫ}ketqx!$`:{[X|_)6]ZXtʲR<D'er<((ݐW 0N&t3` ЅQ͐ 6l,TCψxPRs) #J0}DZӘn |0=ŝ]B0 k-\"H5 R0h-ξ$E :$DƤh%c|D}vʋFnrf|^9RD56͑m:,vĮL?$~ ppnuqcuǍ*cw79)W5'@}3͠C-%s.\DU`BW\^3/<傛I1al.P1EoA·F&dBnb'f>qT)s;5hpA< #x֌ ti`ŷb|{LtdQQږ_~*!eDeǏ\#?/vx-`UWZʢc.Ǭ(b=("VB fw'r Vc(@'1ހM*B5g0IY\f-SFwǸ (f+2% ?(yxNaS}GZzxiwJ8)Ғ(cQv9G!#IUDN((Q!w.."ҡdR1+!DSS3W!Q3J: c >kGaђLr80Ϧex}}lE8+@0t&H*x(YT<8Q-kP*IhP` ]NLП93 d?p|Ȑ욡\FaK[UBVfM^_c jRI Ml*]W}iVYvnE4&/R{_ ^\=mMY/39zon\wxh' ͱ*yHu|/(^d-4I|%DV!f+x:}^;)]ؤdXBuL/$exZJ*UBroR)QxJ"US[6*HeW%2_=-52:һJb6W51hMq-jweeֶ^B-€![ө*ϣa-ıjj! ] tpbhT$tSކWnޛaءF*|Z J&-l_rri=vo(Ow&M:Ztק@6tBczoe&aP ne!8ڐnrg#51>|m`@Àv(qxy $"Ɣ߱,cam `Nk<W! j^ԝK.0do@7]= RTZHO&mRX&†o8oOH-wE!o|Ŗ^ScqKo0`Ls)ЕDԍnF#^[E$$ds˒]u[k=GPxc:M8_%TkcNpIHVхZhCC~?(eAmʺd3 Y +O.S՗HrJra(*V#$*ozQhX\O1+׍jց8`etACq9J?$H3m܈JJC?úea6; Rvnʠ.(Zgv8A$wv,)Z4x]sUz|N:Fx4C!PP"z`H,9|#rJ(hLR++;I˞sbof 0ђ\WoM6:#) m93ThĔP|Mr gͨs^CbL8q`ةZa9KLTG+*k^_\xqOl "JPnQ [ݪ|FUV Qm'w3p%M1ʅfRq[j!= :a#@B$[TN/0!Xew铴'mF뽧@:Lbfv\#JN{REUqx ^Hd_g!!mNB\w`EWh/:'H =LTxQ}Kzء[d qq 4dfn#UJ5vdPLEr0cȤ<Йݡ"QlCjBS.l¢;vrF& '\cmjTs&i7_KקM."ɥOu]z?q FU^&/RL% \K͜!+_A9>8ҫE\,d-ڕ HSK@lIܢf)Ae[Yը)$-zE%ؿQڒ BM@5Tov'c$3뗪`gEҔGm06/'ɊEFHV@F  $%D N|6@m% +@.G"3+`PPnz'#>KD"RНBryOЊ.xl%@B0?(*Goeb6<[dfM C*"Sd"wSߡ 2QdX|1mq1~1' IqxSu>]y Vw2[< e"cML|y[F̬:bܨY^-an?[c $-p9oWC߅4FPCgGjVEOY5=C1~ns,tג;T@ڽKx+ @Yj?9UU5A#‹kK:k% Dp|D$W΋ mH:K {7Rv9.ȰU?za)IG!ha^D{gg-` AxZPl߼BiaTvOQ#ZCYUwRtoM%`y`=a* AEҷg)I; DJ֎g+xOl]lSR,XRZEH/%_qm/J˅"Suy#=bFDy;H8ӿO,SI/0RB*r7.%MC} Yr8@Q,45A=/V?K]Mcr8I~BLB^KAsCSnE5"݈kŹp}E#-/@~VYM_$^KCnFdTSv-Kiv(AuL.6CF@\B̄Wύ U_𧟪ޑL(nveLZ>!D3Ii3+&?i?JAJ [5!O΁wqC ̄$}JJ}2^|qXu̔9PR9ʮÛ>8M'=1#.a?!ս+1HЉPSU$"'LQ92RFҮ_$`bЎK‘>7!7H^tsBG=)H*>}.V/c:؎h\IsB يBJ:/+3} o0ŭWzᔃoNOlz0[g[飘ET&Ԍo.I3pvD00["5y0;zZV:HScx `FԴ3D`Mj|/8o6ZjrF@$٣L|NI5 ^,AA)-AHS٨&/=z6?go\aV/J_%nf`"YkeF' p XSq&)L(VQhIf-]Tצ }Mخ>N9? sΆeabEkU ! q]%xJ,'ʃ0/B /P( D1F'6.9~](-(^I򆾲0xG.ArQΎpnr.t)ña09`¯: z vD)Zg" TlҎ~ZՊD [pbvo|<Ρ TԘD" /uq*לZ%>lAٶMEۄzÎy514|]:lE'ܮER>L Ѣ$j%ѐ{L[iVEjh,eW&X}d%CAOfq=۳#7:ObD慌}bfRُkn]Ř")qFdZ)v.ؗewW Iy ^3Z}F^TF{h2lc?Zi *F\4-)/%zŅFڏl.e1!pv`ibtPoמCW,kizxm]2Mb'b ~-`2JF?U NҽE'u5xgdB/Be}pB[Qٙim.5 Ӯ2ܰV4 U bۏejLZcuĄ_|^It#fSUu+x wr""Ug10Tk3=y$$A=+I'iؿ,A@2] CkڍL^\*Kޤ.5bFӂϊ2#:RC5?ʩL+aĺCS,LU< H٧1@$B$9᭎ʢŢTdBDbN6!H_F 5pShWt}صmQbt]lҐ~Ƨb"}uB)tVgT94V5Efزy0%_2cE ;1K~?xbۜS' uz:Q eBnkR2%NJ}wަ=9=JL*X95N[ٔ/2t^B%+- 5X馥;ӛm Z9HRx4r3ߧߚ]2y=Q)ncQ5RSJ+]Ī9 LSE4h(hw;#ǃ, P)`ܼQv!5ʄXQE8 tugJpH*D"K>99-, zd6reC|1ɼD&#'9vT捿rah"+j]Ꟶ$a"!K+dX͇sِeO;?H,Xʥ. pwX+v3(^FuJ9&N_ZQd5Os 4"}58cOISu(WyBT*_$m%Hq,9xIڪQi_(}ZmkG M%db7+E7*ٲWz4. /kƧ z\vTCzSfmƈ܋'4〬AF<2ES{NvbƳf't41% By]Re's%b`/[-ԕboJn6!'qɓܲH2`ãwo f4#gGn\nr/_# RbS2.aiڦSdMѠv{WZٗ_&3L,j,2N H93A+]q.jNu)cA/opϚ`JՃM.[F6oy:a5UF\\Vl(aRBh u/JXSbtXTgBSV[Qtg8O5o|DfAbA2s=ѻ5y{$NBHAhX4 "!'d5!*E"pA vZo/r*& wy-XTФ3.[uBBI3[o5Ϯ)L27Y1tx+RAG-Q^> %KB`i5ڢݕQ-C])th#h'q9F?щ]]$,@dƶC9^!DG!fG6P)긅"?xv!Z xǓˌ0#htTqς@!FDCGmE1-cLfyp'(@4'Asr)i?Ly*Ofj"sӔgi $P\ jh?^ix tt࣊2&N8P|Ui6 ʄL݅xl _e~{w"lqZxCj(MXY ?lj$^'=+ qs%|4BgRA>wXa|=+sh,pn+4J>jÉ:k#Kd:)`9m ̢ͳ! %W!wCAK,HL!H\nt)CT)uFnuhA>ݔ߽*<}9Gft9f4&?Ԡeݭ~[kY XZk߄͡v D 2pޜl e|'`,of8@5nAϖ:id*F <4}K1S3#Uټ9U-^(P A>BBh&;Ն$d-ZQ"|Nъ8Nm6,3Vաol+( $&@&FFQTڽ[=@zc !|GuCy&)0ﲔQ9O|< mo7b"g3Wp*n}'W^,l#^ܡVd { Xn)X}DftL3&hgA*-chfn f3jBQ ء@IJ9ۙkO(Oژ|߲`ʀtTNvNڊ!^.K}Usn c"#4pVi3 0Q\7lz ޱx_!<ڝĄhO7O;"pA_U´E\m\'A6v;,7aXf,çu)6M`b'2]hanԍFC7]tcbq]tVob[4u ,[D ZJCShN,gJ)J`W5L(ϨvF6Em4RFL!&N,v˭%؈e>˂Sdm]tHs4q3P#&"O wņmF98uz%᭑b >N =(  PvbP +s%y)-4CC+'#`Cیh}.Lń&$/_2[zz&*zfvGōl,2 ֑m_Ȥqgu ﹑CԈ `Jtqޘ:%yRn*8hJNrXM)){/a W]lg}׀|˛^uTbۉ3ٽ?0oDGASszHhf 8B8VMHtaXSOp JQ_=_4}XdQHL$`4#C&MC}ҍ k H{ 1BXKDkd嵬,d7ͪe6;:4lm#ە~3=9bbUZ{Pen<:جXf;v7. /g_v탯|q+jE?b5ؽIiAkZRT=k~(~GbTSjlj#9|&r[r,*$s66^bTa|,"Hv(Ɣ$#5.('ubVk+M3SD#4ZԢ/d3/xD QTإ94Cy^[D*m=jzMojRኪ t>!cgv {Z4'XhՑL~ E{/oW/ofH›R.:L{.㬠 lm/FUEG_y0,N`2V&,̀T!FLr]k 1j()sy7dL+窱x@tFOLөU"ɨϐO򹶠vz"73GEwmg(fOsr;ԫ'=1t)3kK^.̱&+'/b@ӋMWDj)b_wC)#M511L 3Mc'U50Һ¶N uCW *Gx3w voT Gz7FV14jZe$)xՂa_^)K!' 8RXf՟{a5e͐4wgIz2pJ{5s;(yR/}7] Ҙ.kNCG93I4VيZXmSQ(o؂'Ͽ6ɽ %9m:}V 6V=-;)pKwŀ;|QJcDO%uDj\"b ykƝBtQ˛%>{ľeqL櫨_fcJ4/\^46'罏4}{!/Makr!=W)J2JՅ?'[Pu g2+o-#wTSixg^3oz;/mnYtF9o}ubcҚc:\VUʫUh'[FidnZ!{xK,hG"?Ll~Q {BUz)% gZ8"#ܱlL&c^pWh@ӌcԄT{"O |_@9F }nѿ_x샸:3Y܎FQ3tJAunhr{- "[v?ES=ObsJB4r603==gM;VAܵ_AS4@!|Q xpnTsP ˇ74Zig̘Y\Be4!s}d.Af-By)rƄ[M;e1؉'%<)32I堏/ڨN#A&jB}BZB=qwޜ9<ǞlJBZ5(MW/P佹{̧\4+RJ )sG]= "Iiz 8I)/|._I bcZār۾6{ K+c]UUQD3Na6Dxg8t%ǺަM<c_N uZJ[(+S43X㲕"zq> bYX:maAB7yjEDnߤ@kNiJ; D \uGtX/g7|7k-B%I"9IHϲ4;e/ DL"C[2B've.QÄ;ܻUZGjFbv') A=B6EdKYf:nok81aAwɖvEAa$_i)d=1'wR7p;" Np,DWwm.^M)LSh +h%&/ȕbrQ$08þ!/$QRrmDm(W7[ ~@,0tb;9KH9@Έv=ս6 >=b-*1&jHNdAJxAˈqYK2YnO\zYLxX$U/YrjBҡ#qAs .ņpRGrY-o^,K2"mڵGޞ?f?[1CVGz@6о蔈~!hI$)}2DtG|j~L]cjTVa!h,bL\gC-@1h_v6h| ":e"xx41kZ[z|O'͊l(@ I2;2 mPÈwHć=Ak)vP T+4j Q}E4~ >_W@Dl&&dH<ӑpg%E@,ɲC82vC`@]B>PSDӗfpXi8fͼ1;$_ DH^p7~8>boH3EsV f@TݳFF6ZQZq p<_#"!*/ <[gq:*_N!KF =%܌C! ̿ݜ❐ O$ !A@bljK쬩SWٟu3rt2'B$R= !y&4S4{ml${FpBD Vb o /4q<R |&S%2Rkl Y\eKr䣳&~,SJV1jf->D$iߔ_l`R'!P iT*tWy^Mmd.Q+Hv4hEgRLY8P/As$, qYZ5z?~rXv`;V r*m\d5.s"Vu R˕KWp|;( _e@b{ JTh "m!&k U\PfQ* 'At'؇^6f&@)Nx[V9 /g8YPөb>;\@Hɒn=ΥȦYҴ˫< _GG /Q Y:b5U,IOM'dz+kӓ$AuX1nZ[? Wn/n%uIhf: xۥ m&-vVJ n*$Q]6'Ek?-:>d z^#+Ќ\iI5&H lD8U~ra)JYou"8!+J"_v`3!q:r\R2OZDX~Z-SSjvǥ-:z;ѝj<ީ u9^8zFIM>.bDk@_vw6?!n6&a``gӊ'b/=7BWgnXD 0] ,.o46Qsh0ڋМTfO ZtO&/)8;oUuG T6iZdӒLf?Ta*UP̪D lU$ac?E[31Zٍ}Mq;D49 51Nd޴E$r;cZ%\R6"f&}1:tr UA$ј`vVaĜ-R9.N۵P7Ԩ0$ a 7IM(2kGj nNSdwo4='Ykfz7D =*j''ZQ9>?&$d\I@/oL{ү α^F)b@k}DHF/؝[moaOd-Z`dYf7oLk*o,O ҉ZWKrO2ps*M'[~xF( eNhC M(/-ZMs>V5~! _H!(o*O9r滐 Xhʣgc%ie)'"I`EwV)#@%G(W 5d\-3ZA *D۷}pq+5V1b :w[/g$KW/1Q;0Й 0r ~DO4+JTN b̴nU8P Aa~ B3PmiRPTC@cTl&1 0=m'1;0L>MHf' n]) *_ ܾ?{Jl$64Q Y[cL(qtC$T1`q+|RZ\ؾb [@FS\utxj8C]͹h鉤T6#"hfэ Ih%!.Sݣ~3 }O!pj7ZL=Ꮚ 43X@9'1`$FwD$I FV!+myU'_ܗAW~qC(Ne1Ou:-C(E"TSP? 5p|7ZY ao郴kNC<(M}0@Uu}#`-5kLY!=Y<܁$>o,@ʆi/D ůjd%ZoR7o S) )^#i? Α^N!G]|A)u=Zgoh4wy6(oB6IY'eb{3Gd8$=[Zk[#v[:WT'G V R:/'mObTCEIznK^Qr@C \wY;Y&?E`EoBF.gr>̤ 5QQLP!{Q5wZZoUأI\6"aFś 4T筅a' _ouYT#Ř=>6w:n&{A9K3m(}#R$E IׇhЪܾF>v%!jϱvց<'k+Z3w#MFC9rL!J׋Kxg#pHއ蠆%ne7U(GӅIC#@OϊЋ(/L_22'c8 %LǎM\)fu(* 2bOQhlY(!-fy `Ee-|oA46Cʧ+<=O"AJIU.$Wi3`t%.Ҡ\M\3ll3XZD~͌IO6?L1FҠv$(=&I&Еeq&Y'*2.%v>9a5HID/y8SxvS#|IK//szNrt&?" ςbM] ޤisRQPs$9Zl'U4LL>tN"Wxsl|VѦDQ;[=ѿ5vj޷!FQ+b*miqߍ \52$JK~`3G54jrоa087u8D#kzVvn!,dVWmow5U?.Y5E,Eg~bM -^ ]/2mЗ>۠"+gmm.z("\7BѢ_IH҉Ɯ]5pbEG }X; #,Lh.侞<ݽ ߟ槵R;QЀM$w&NEqQ˔8NnȟDuOn}|*oB{V_2n#-HzK˜0?ʘe,Sܯ[&|,d |@ȤeHnDz-cC [7nOG#Jqj`g wcY?,2=V58iirݹ8T+TTܲjH͗\lvfy1✉H~%XV`L +@&lw|@t\2&3KZa~ejJh&ë8WzЃqLl鷄ѮPD Nٌ\}g[ɣO#%득4,Qb:gt)Hd]A6Io#PV tO iJ.yċ!`ExWt1[RlSqR݉kuBYݔ59ZO'ye/#IocM晣RonUcGAX4<.{H(ɑeWHM(\`yi4b=PM'Uwa-SO|5 +H{6z`l/' Ķb|gF`z)@+ 1oƄy -2/KV-ob.J#b`bE ^;\,e3rEJi*bLTHE>oT%y``D<>_o1VE䢜I%^!kt'v}5')=Mi1Xk1Xĵk3, N3\Ke*znJe{ \hFa).)E^ԩ%s Vg'a69cZhru{_AMr=VWNςIB#UqK؉?bJPB>ϔ}rpN2$ Ct\ԝvVBݮ=X玂&˓ ;'c+f{'^lzdcu:ML"vy7xɞTY#c"H'ɍOओd xg_O"? 0PA q@r@U-i+PA eS}Se~+2vpHq&^v%w['WԪy7,nٮ>#l "_;fUM 9LQs8 F9BIB' of>LSK֌jaJPZuXApP+'EvgYJ;\[noHCTw{))"WPEqhy!o,˥.ĉǥY:3" {.{n)`IVbV~_wmܽ6ի}#U nÅ!;&ÀVȠeNgz<%Re w@췑˕;)-tϭqBA zp:+E%h)t>+k8|AT說\\qڑ&A4^+s3Qe&G '*l4*HNlOl'40g:o> FCr3#UySFLf4RN٩ԉ\(ڭ"z]x&)Q5\PZi@tbS #MC #ʱKB Pd|<^b# fA ɕ RLnjrŏɡB?7@'On_Bsk ʡnnU-ҏ'|ig G:1}@Ծ`)Qi*+J*daXDo-wEM[IՠU$YAjŝ_20^J]'ELA,)*м;S *'&9zZb:9 `wYkף#:aT@[t@F.}N0òáDH7L'a 36Q Y@3xʳMMQt=4ynSm9ސ37Ee.ELISq}8lU9nUfG_/ k7Et\ nR`P\@3<< DRLvU-$.K Y77] U84Ɇij~"Bm*?!Y8ZiB61N!ߓFkR oy)4V 3՞=\o85^thJ6 gw)$#0wڙw2ZljsR/D)0,nb Wn. gu}4N/yxA)n%9OĢ+͢a3Q0-LWʍE*z1pCu3DQ̾)h8:\FLL?H ~lPGt*- ECZ[$H; _X|*?wrVs;4T, e(1 "RqDpے#-Fypi`O}SlP^ErO\+<*=_tZ/Dg\SwÆkr ^ɾ`Bb*-T͞/%ZkH9FKuvb$X q3e%-sĔX?wKy,lW(kmhpBa6x!+o|D5ddHKF/ʞLi {nÊ2jmk_q/Lvp>Lmqr4;ʉN2FJd(Lރzoa_Ĩm=ڹzFثiLG[gA"ö4b"ۗf[X 9IS65THLL.2uEۯYvvBVS?dj~څ$ 6_K%)4P*Q#5Ьd٣ wZqӧ&+NN5tݻAudio-File-0.11/t/test.mp30000644000175000017500000001400010205372646013646 0ustar raflraflID3 NTIT2TitleTPE1ArtistTALBAlbumTYER2005TRCK02/03TCON(17)COMMXXXID3v1 CommentCommentTLEN@4000 x G|Av%>`n7&{rjp01`?P& Cp8*Y8rYowL$7 ^-.i\p du22` ? )Ց FrtD-痵(ШpaW$rGDi/ۿ}(%؈uR"ο 28*fwՌR9˿cG(LU,El8x/P "msFj52()rYKŒ`DiZuSQ? &p dFޙ aDSJOr %2[;#Q #;* 8baT@qy ЖUhԔ|1tpQ?3RB W:Q)&%+ X @Rgn$`͘2V0H1?-FѿR֓~02 Az8 Bן\^4`A{r(`ΓGQÑZ_ < !:p$q4p??PmS*2}.kv) #e?= rhܞNySF NX$wyÊIZPG*xni$#/odd1 c+I_N Т8F;֖γ˳[Ebfل׺ ϪǏԧ Ⱥ?ZNY 8O ܯPqCP0zUzy |90~8fJ( E?E.i]F` 8B2V >COomݵD?,`PKh Fp6Un[6f2WW=A_Wۤ: ?#.ջzDp ʏF/1JSZУ rfպEJz =˭b+{4s3XCܪ]yA>[Ej> AnltY&*&JH3 Wo6Cg:8,YuT&'[ 4TTH=)n̝HxRC; 8 F!6RmiLsTH$SkEozތ!m%uD[28D_8R].BqAֆRV뤏.:-Vk̪Fb *c=+8 Gg[nr"hS$EgRl+Мvt[Ќm=jVLQB̿sm~.- hᐖ.cL8 R8FTnm>޹Lcmz ̩qŔ^]oI蒀 <Bhξ sE}T'T޿F$іы~[Qj|>ګ8G!ѭT3 xUOTD$]*}!%RkQ0i=x(ECǜ|څ\X|u&V8 ?_69 UşBf]+1qE1 .̧"9c ƾ"`/_Xep/j_茗d8"78>)6J DtFB4̪|d0ҿ0tB37'*@cjvƴXB/ xPBأ Lz:JFи=3WopOD7 ~R6 X8L(1'7ZIp_Cs_(I5 ?=bW> Z8(Bnr0gHΟ30w c_ȏăAhuR2SG P ʄq&{/R'*ŁEE E?HELł'ڈJ ܰTȯZ֎}%2b mrodCh m>N N8* 7Er}J 0@]CvRl9`BV 8FuvG{9XLAmHP\C{ X] NB>巀'}^kcG1ܤ!#UtPCƳ$:m*Th b ΄nԟ :ٿ2ޡgD/ :nt}H\m iV8D巾L{&K>߸)hJ_JwZvhP~OΌDr"v ȫ8 F i1NPqR_k jǚnYp =?u/Ĉ R8 ~Urg$*f&ec(gY}_#3yDF}@đ SXJf å _Z NYu>f"8eTA/ۇβę )P ]ק@t 1 2λ~[W8 bmp堃Wģ I8( Ą/Bg)~KU?^As<"kK_T.Ĭ NPĄ,R6F8mJ8[ TFUU?/ꈿH$ck9Ĵ XA RɳG25 )ɰ8yȦ' Qļ X $vU OzW1!-62Vm18svٴNJKD Xp]bPʘ ]k*p xW_?g _ q *Ր Dkc5䘍JNr*b ;h49cHsV,IMgF Y dt:1r ;7j?8%Y-`p+,l c!%\b Q8&D4i7JF-12Z$)06ܩ(\M񲁀je  q8 d }wܰ ƣHE0VNYi;W" @8 &j 9C2 ,SXPRVgY8`e)JdD}߫z2u88$VܣcS~]{#@U2.njAC##ĊC]6=jt>tD.Gc`QD9 rٶ"!P<&N̘ ߛf";?3{  UMTSP!PUpDWP4[lJ`GO^GLAME3.9R:B6.1ʭĻPĸHTAGTitleArtistAlbum2005CommentAudio-File-0.11/t/Audio-File.t0000644000175000017500000000250610210631166014350 0ustar raflrafl#!/usr/bin/perl use Test::More tests => 49; BEGIN { use_ok('Audio::File'); } my $tags = { Flac => { title => 'Title', artist => 'Artist', album => 'Album', comment => 'Comment', genre => 'Rock', year => 2005, track => 2, total => 3 } }; $tags->{Mp3} = $tags->{Ogg} = $tags->{Flac}; my $audio_properties = { Flac => { length => 4, bitrate => 94910, sample_rate => 8000, channels => 1 }, Ogg => { length => 4, bitrate => 28000, sample_rate => 8000, channels => 1 }, Mp3 => { length => 4, bitrate => 8, sample_rate => 8000, channels => 1 } }; for my $type (keys %{$tags}) { my $file = Audio::File->new('t/test.'.lc($type)); is( ref $file, "Audio::File::${type}", 'Audio::File::new()' ); is( $file->type(), lc $type, 'Audio::File::Type::type()' ); is( ref $file->tag(), "Audio::File::${type}::Tag", "Audio::File::${type}::tag()" ); is( ref $file->audio_properties(), "Audio::File::${type}::AudioProperties", "Audio::File::${type}::audio_properties()" ); for my $test (keys %{$tags->{$type}}) { is( $file->tag()->$test(), $tags->{$type}->{$test}, "Audio::File::${type}::Tag::${test}()" ); } for my $test (keys %{$audio_properties->{$type}}) { is( $file->audio_properties()->$test(), $audio_properties->{$type}->{$test}, "Audio::File::${type}::AudioProperties::${test}()" ); } } Audio-File-0.11/t/test.ogg0000644000175000017500000003565310205372642013740 0ustar raflraflOggS Rmvorbis@`mOggS }[ vorbisXiph.Org libVorbis I 20030909 TITLE=Title ARTIST=Artist ALBUM=Album DATE=2005TRACKNUMBER=02 TRACKTOTAL=03 GENRE=RockCOMMENT=Comment=Comment TRACKTOTAL=03vorbisBCV R!%BJc)RR)%cJhs9'A1.bkiRV!%S [hRT)cRJhs9FsB'c.b[Ic1&SJ(c1cPJ%tBG%t9c1"[ŞJ魅[JR*Td!|F[Jc1cdˁАU@BCV 0EQАU@Eqq$G,BCV@(#9dIi'뺮n۶m۶ !I̐SI&)U99dRƘbQΐS 11)N9 "CHd K=b8"A!Ɛs J!rI D9)LJ(I -"眔NJ&RˤB+8XRH)ĔbN1R)ǐR9Řr1 T1H)sN9 d * 2B!+8$iihi(z(y陦zlyiz)k늪j˦ڶ骶ʲn۞ʶnml,ۺyꙦz麪ڲ꺲홦늪+ۦʲʶʲk麢ڮʮmʺʲ۶ 躶ʮ-lBT3MLuU׵mum[3M5]WEueՕu]ue[LuMWeUeYeveWE׵mU}]ue_meY}uu[eWeYe]Y}SU[7]WM}[}am]WUօUu}eu0,뾮00m ëƱ뾮ܾj۾1nƱm+loq,ʾo/ *˺ڲ˺. jںp̲. +ǯ Cնuo 7v@!+8!c* R !T1!cJJI!* dIJhJ(PJKRj-Z JiZj)Rlc2dI(VJi)sLJƠB*JIeIɠ9HRIPJkJJJmJi-ZIRmZ# dAɜRJIZ朔:*J)RA(%JIJ+JJRZk՘RK5ZIPJkS+5PR JiVkj-PBkK*1cmJi[)[XSK5blJ-9ZkJ-R[LXk %JiZJZJ*ZlZ5b))JlX[l5blXR1XsKՔZXK+5kn5R@ eА@` cAhr9)R9'%sB)eA!99B))[(%Z, M Y D ( c*sBcAsA)cA'%B)B( lДXА@` b 1 tR:)LJ'Z )eJ%ZH 2k%bFXb*B(4d%@c9gb9!41*ƜsBc9!9 BsBBA!RJ B)tBR *pQdsBCVy1J9'%F) [cRjb BJX1!b ZvRj-ZCJXk!b5Z{j-ZsιE6' *4d%@ c9b1CJ1Ƙs)s9c9s1s9Ƙs9s9砃9sAs9!t9 *pQdsBCV1RJ)RJRJ)R!RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ) gXI:+ .4d%9'%1tNJI%5A(sRJ)ZjRJb !Z Vk)R()KJ2$ZK9ZjBJRkuRRIZm-Zk-bl%ZkZL[K-bKb1 npHqBCV!2J9眃B!R1砃B!DJ1會B!1 B1B!R: PJ RJBRJ !B(RJ)!J)RJ)%B(RJ)B(RJ)B(RJ)BRJ)RBRJ)RJ(!RJ)RJ %RJ)RJ)!RJ)RJ)#$"l4LQH h  "$OggS+ S,]^_`bZb``\_\]aY_``cda`[\e^d^_]^\^_ca[_d^a^b^f| eC,̦m*vhXzn=p5tFUFC-ZGjt"z_Y252rQ{3rA H,x#}rmcCZ7RD(L8NlQ+IBy&&G2ÛAu0%~p(Oqy؎@LĮF^ %/Vu=5pȟj$DhߓO[L\V;r&@+Y{DE8xnov`!ĚXCNc6h $HF3GcEC[g?)B쎏Nw?=m{ {J9CNDacA@HzrWcQ'NzB1Y}wͰ©0'*C<_hUo iQ%T.Pq8*)%}_DžW`z] 6@`WFǭ̪FWS51;C tcjOGmg ߤkrϒӛa4+(atMs^lmG̵;NWU N(@Bn?F~3[Aw'{y-qd2|&sC/Yp'GrKqXz^pNh6>W ?sӰoT6.wwG'PA'Ҟ8L^,F  RNJf'1oX ^@}<@Ph;Bӓ~* ʤ;_!UMJIcs:Y#m3b>c0EQ2XLr:)@!g8*o_x-kVEOJ.ʠ-4 !{du{1v+-E*\XY54%=:tZfj嫦"~eݜ̅{zّ٩UsO:{ID#1wwYGNjOsκY\W~~Mn^=\?u! v!:%]Ŀ}{Sk*P38z:yS#__Nnd3Кr @il$D!@6olf@]ޖ:AivWM+vNU@``@AՔ݂wWuM2D+3,D_HHPqbb[s=LJ.N{;  ~F^͉2j2~>%~Zdߖ Q'HƐ0 ;j@BȽSr_Rae~hs|Z)l:K61 ͨ4O#vrS,v d-(mg#e0DlFU` xCLaٜ+e=Vإ7ũ(H,@`d,ptg]$F2y0)!ȧ|uHsF oǚ# K>2>Y(jd'TduZMf~D:XV7WOqgbL["s濺GXqYx1Ph<N[G;Uk=lKb?5(~<l&՚p v$"A(_MobBoӯ?lAi9= ݿgqlYe K. P4 Ƣ?V2ޚze2smw/.q0D*Ҵݷ?YNM0n?i:j~Cb: {>XP@WzN !ђ^\%V&Mc,C?K)mMmpɭ]G}mK+gxҥSԡ@4Ug3!RX#uWdF_P$DȻv#<#U?~rh8Osȶg+<8H, O[Qp֚Y[u:xu Z:rNO6!߆ 2(|ѿ6b%[-^:jxDWb>*cco[Ķ!e7jYh,@'h*Ȥo 3;dt&~+qQhB3@_XX - !ntuHS'iH? jHx S&zZޢO   0;F*5yb׳k<o;>SАeկgEŵrHx)᥹i& OzƘ:^Ld0ҵE 0L(0Hy:ǜ2_&3/~o7_vƚDP=icV 5ޯt>57=kD:BՁPV%(%!!FoN 9SNߤYJP7HW K<{5W]ls,Ѷ5i8/8N3#P4倄 @AB rڕ¢L4],/с_J bI,tO;U^Hbj^kX84@eQ_ CT"|%ai3-ל'2~ܰ:8 ĂfvNM͔y<nERL+ME p~iN6Wb>l%>%_ͼhcOggSX ]-]X__Z^WW^WZ_[][]XX[[^X^`V`T[T\^Y[\_YYZX\[_a^bP;FѨ`W &ϖ-1ђ[*{ΝFlV{wx6BVФ hE_lO1D)9Jі%R ^ <I٦p*HP!%{1yo^W:p3 @1|_%i@iUMDpѰ:m.RT5f'ˁ8{3A ǷМ:|zzsq!zl-56Mr\M>{6NhԵ7eq|AU'hYM<z]݆AB损`e~?U;V"&k<4 :f,ZnC2us2ډjp6z7RU0]8*=cB{m}FZ3տ~a8F5?pGUy:_zZ)fx1Xq1#  X ePߣvyw33A`w1}W7-QzO&Rk()E8;1dz V`f'ʳiы5{K!BNH ZaDJ4PFϮp]}tcl_ژE>?y0Ry2}"g <4V%5dfhOe2[ Qtcτ2!FۘU *Hhmv+S~O{v/oi^ KE1X+PZ!Tf=ܖ]E%Ϥ#k8p0 Fa 6%%:i;?x^vY)`5aF-P*joUd@62^="3"?uh墾 x`l~yYˆ;-]6/Ղg(ħ_ LӤKE0ܣH'1wTP5f;  P-?3Zgmšk7TB]$hPcjdW,AC)1^"DUBR/Vw2Ŏ9m0·-$0YW/;]vOr;5YZ1גht"Jt>($cW_׈鶈tu-X88,+[6Cْƭ*2+DFK)2i!UĩV 6ygFX l1@@teq:60h Q/͆_+Y?L Ifk*H у p 3$*\GɋPkN'ƠUi@ip: jp$ 3>wuc$.Z.JH0OҜ2*Kjiƕ=fN.#pXJV9U Lt.XBi,γOy@@ơD̏C, %Bm2P@;^jPiلK+\WEӑ>riG/<ǣ)ӣ[y1Z`6L [Ԇ2@-]e(dȒ[~攇n9fQ"Er x -|鱟Y?T]d Ӕ9(@D)mF?B*.g+Fa:ejr\E>?6K@m4D˄}gf}b7Ou4 *0agYO}_7Kna:LITB3{IA4Q6.}&b}^akHDU)(+ F~4$"c5hgN CY׭8-EY? ]@l@[%:g42peꋼm)4?֖{5) W{z ^Jhgh;c 8M`^[0]'0/U`P yё~Uo7LRې4Ng5\(2BVbآ4O5zG cⲧ;wW)4껩`C$RhG/蛧өty(ߥMI!Zk1Ivb[M3+Z|^IOT%nz;e( Ð۷7>lq~%0<(*Evi!DwzPg۔d}9!w`}Y0,bb 0 6CK5-5YOi$`Eͦ\ ݩ}g85rEa/Dž> 1ʰ,Xl2 V]Wo@eOT;פˎ_7CIQpvV!p D#h\@(^(#9n=^E>6MW !޻u!cvw) !.N_%icLZ0F7vc1tDc$IR e<]/:@  ZFm?Otְ[Er^ɷ}[W/(5,-A9GuQ9/q4u ep: U`i?+s޻D3DȼUS ,Bf )b xOX<1$h}l$(v <@C[e>kj-kAN,@?~c`7 :316. 'CԏueL@d_)lsŘ 'E75gl}<5)XY:)+@="HMLMye?Ǐ哒h.cqpЂ(]!pvXs<}e6DDJֻ_M0@{P1"giO늅K}S)u} βfL 2Wn'Pb( ~vM0nFD́wHuYkrǒP[{exy\Pq\E=EAHL]չyb?)Bl>!ET~JW2WP?'pX76M7uk8<؝>m/$d|"#x_E(!(%/XYz{60X'뵷{']%,Hdi(F)R\ں&٥>tP')O(Mp41*M aH+7Q0ǗZci ڹZLi0Rtsl>/MevR-)*>YKɂ<‰N5K0XF(0 Ha*:\ҠO`J Pί:N~5qǢ)i^hyHv]PYG^E䈽iU=v)dG|2Z]Ö zհP^\V f @V-2V <1J){4h>Bl5iAvQ8{oLx),jAuƮ^jxxUY|"2Mqh]<$\TrW6+,4bpAMr6e0j<jcsR]0B2*gxvrKX|,N\i R8?<Rq6(rO;Y.H Cܨ{lD>O=6-sVԏ iw]$NYԺ/s`g>Tx ' npk6 Wع'$ÓedVpmL֒:#Z:~~-fž )SGn,Q3aU8ՈdLV;t_wi#(N#<~/8 3,@H?[_t%pR-5z2ʈ]xrL;ffExd||8|qYq]hUzrDZqœ-{9r} 1i# ɧ7mkjK{%y '~>6Z~KɅJ&-Q}b}}߶.2V-:*!q9S^=u''$AX 17jK;F \Pئp$avetݑB >kN"pwU9sSznrꇚ"Qas~q$bH%0]$d 6wt6,om>kol>?{Eڿ:'͎"s &SnMUWY:N["[r9mAST#^;?QD)D}!YY=K"쵎#.% ?q&?I.p <ѻ+X\Audio-File-0.11/Changes0000644000175000017500000000214110473574552013310 0ustar raflraflRevision history for Perl extension Audio::File. 0.11 Fri Aug 25 15:21:22 2006 - Fix a test failure in the mp3 tag tests. 0.10 Mon Feb 28 16:03:12 2005 - Better test suite. - Added Audio::File::Tag::all(). - Added Audio::File::AudioProperties::all(). - Audio::FLAC -> Audio::FLAC::Header. 0.09 Fri Feb 18 00:20:08 2005 - Fixed README. - Removed 'use 5.008004;' from Makefile.PL. - Added test suite. - Added Audio::File::Tag::total(). 0.08 Tue Sep 14 07:45:37 2004 - Fixed problems when loading type-secific plugins using eval in File.pm. 0.06 Mon Aug 30 01:24:26 2004 - Added a better description. 0.05 Sat Aug 21 01:31:12 2004 - yet another damn typo! I really should start testing *before* releasing a new version.. 0.04 Sat Aug 21 01:25:32 2004 - fixed typos of previous fix. 0.03 Sat Aug 21 01:18:45 2004 - fixed Mp3 suppport. 0.02 Thu Aug 5 19:02:21 2004 - fixed README. 0.01 Wed Aug 4 15:58:39 2004 - original version; created by h2xs 1.23 with options -AXO -n Audio::File - implemented basic functionality of reading tags and audio properties for Flac, Ogg and MP3. Audio-File-0.11/MANIFEST0000644000175000017500000000070410205371371013134 0ustar raflraflChanges Makefile.PL MANIFEST META.yml README t/Audio-File.t t/test.flac t/test.mp3 t/test.ogg lib/Audio/File.pm lib/Audio/File/AudioProperties.pm lib/Audio/File/Flac.pm lib/Audio/File/Flac/Tag.pm lib/Audio/File/Flac/AudioProperties.pm lib/Audio/File/Mp3.pm lib/Audio/File/Mp3/Tag.pm lib/Audio/File/Mp3/AudioProperties.pm lib/Audio/File/Ogg.pm lib/Audio/File/Ogg/Tag.pm lib/Audio/File/Ogg/AudioProperties.pm lib/Audio/File/Tag.pm lib/Audio/File/Type.pm Audio-File-0.11/META.yml0000600000175000017500000000070710473574670013265 0ustar raflrafl# http://module-build.sourceforge.net/META-spec.html #XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# name: Audio-File version: 0.11 version_from: lib/Audio/File.pm installdirs: site requires: Audio::FLAC::Header: 0 MP3::Info: 0 MP3::Tag: 0 Ogg::Vorbis::Header::PurePerl: 0 distribution_type: module generated_by: ExtUtils::MakeMaker version 6.30_01 Audio-File-0.11/README0000644000175000017500000000203610473574642012700 0ustar raflraflAudio-File version 0.11 ======================= 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 Ogg::Vorbis::Header::PurePerl MP3::Tag MP3::Info COPYRIGHT AND LICENCE Copyright (C) 2004 by Florian Ragwitz This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Audio-File-0.11/Makefile.PL0000644000175000017500000000122310210630724013746 0ustar raflrafluse ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. WriteMakefile( NAME => 'Audio::File', VERSION_FROM => 'lib/Audio/File.pm', # finds $VERSION PREREQ_PM => { 'Audio::FLAC::Header' => 0, 'Ogg::Vorbis::Header::PurePerl' => 0, 'MP3::Info' => 0, 'MP3::Tag' => 0, }, # e.g., Module::Name => 1.1 ($] >= 5.005 ? ## Add these new keywords supported since 5.005 (ABSTRACT_FROM => 'lib/Audio/File.pm', # retrieve abstract from module AUTHOR => 'Florian Ragwitz ') : ()), );