package MP3::Find::Util;
use strict;
use warnings;
use base qw(Exporter);
use vars qw(@EXPORT_OK);
@EXPORT_OK = qw(build_query get_mp3_metadata);
use Carp;
use MP3::Info;
eval { require MP3::Tag };
my $CAN_USE_ID3V2 = $@ ? 0 : 1;
sub build_query {
my @args = @_;
# first find all the directories
my @dirs;
while (local $_ = shift @args) {
if (/^-/) {
# whoops, there's the beginning of the query
unshift @args, $_;
last;
} else {
push @dirs, $_;
}
}
# now build the query hash
my %query;
my $field;
while (local $_ = shift @args) {
if (/^--?(.*)/) {
$field = uc $1;
} else {
$field ? push @{ $query{$field} }, $_ : die "Need a field name before value '$_'\n";
}
}
return (\@dirs, \%query);
}
sub get_mp3_metadata {
my $args = shift;
my $filename = $args->{filename} or croak "get_mp3_metadata needs a 'filename' argument";
my $mp3 = {
FILENAME => $filename,
%{ get_mp3tag($filename) || {} },
%{ get_mp3info($filename) || {} },
};
if ($CAN_USE_ID3V2 and $args->{use_id3v2}) {
# add ID3v2 tag info, if present
my $mp3_tags = MP3::Tag->new($filename);
unless (defined $mp3_tags) {
warn "Can't get MP3::Tag object for $filename\n";
} else {
$mp3_tags->get_tags;
if (my $id3v2 = $mp3_tags->{ID3v2}) {
for my $frame_id (keys %{ $id3v2->get_frame_ids }) {
my ($info) = $id3v2->get_frame($frame_id);
if (ref $info eq 'HASH') {
# use the "Text" value as the value for this frame, if present
$mp3->{$frame_id} = $info->{Text} if exists $info->{Text};
} else {
$mp3->{$frame_id} = $info;
}
}
}
}
}
return $mp3;
}
# module return
1;