1 package ID3FS::File::Mp3;
10 my $class=ref($proto) || $proto;
15 $self->{mp3}=MP3::Tag->new($self->{path});
18 $self->{v1}=$self->{mp3}->{ID3v1} if(exists($self->{mp3}->{ID3v1}));
20 $self->{v2}=$self->{mp3}->{ID3v2} if(exists($self->{mp3}->{ID3v2}));
30 my ($self, $func, $verbose)=@_;
32 if(defined($self->{v2}))
34 $thing=$self->{v2}->$func();
36 if(defined($self->{v1}) && (!defined($thing) || !length($thing)))
38 $thing=$self->{v1}->$func();
40 if(!defined($thing) || !length($thing))
42 warn("$self->{path}: no $func defined in ID3 tags\n") if($verbose);
48 sub artist { shift->choose("artist", 1); }
49 sub album { shift->choose("album", 1); }
50 # We don't care if year is not set
51 sub year { shift->choose("year", 0); }
52 sub audiotype { return "mp3"; }
53 sub haspic { return undef; } # FIXME
57 if(defined($self->{v1}))
59 return $self->{v1}->genre();
66 return({}) unless(exists($self->{mp3}->{ID3v2}) && defined($self->{mp3}->{ID3v2}));
67 my $genre=$self->{mp3}->{ID3v2}->genre();
68 return({}) unless(defined($genre) && length($genre));
69 my @tags=split(/\s*,\s*/, $genre);
72 if($tag=~/([^\/]+)\/(.*)/)
77 $self->{tags}->{$tagname}=$tagval;
81 $self->{tags}->{$tag}=undef;
90 # MP3::Tag->get_tags shows cryptic debug info via print when it finds
91 # an unhandled id3v2 version, in addition to the warning, so use
92 # select to send prints to /dev/null
94 if(open(NULL,">/dev/null"))
98 eval { $self->{mp3}->get_tags; };
99 warn("$self->{path}: $@\n") if($@);