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}));
29 my ($self, $func, $verbose)=@_;
31 if(defined($self->{v2}))
33 $thing=$self->{v2}->$func();
35 if(defined($self->{v1}) && (!defined($thing) || !length($thing)))
37 $thing=$self->{v1}->$func();
39 if(!defined($thing) || !length($thing))
41 warn("$self->{path}: no $func defined in ID3 tags\n") if($verbose);
44 $thing=~s/\//-/g; # drop slashes
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
58 if(defined($self->{v1}))
60 $genre=$self->{v1}->genre();
61 $genre =~ s/\//-/g if(defined($genre));
69 return({}) unless(exists($self->{mp3}->{ID3v2}) && defined($self->{mp3}->{ID3v2}));
70 my $genre=$self->{mp3}->{ID3v2}->genre();
71 return({}) unless(defined($genre) && length($genre));
72 my @tags=split(/\s*,\s*/, $genre);
75 if($tag=~/([^\/]+)\/(.*)/)
80 $self->{tags}->{$tagname}=$tagval;
84 $self->{tags}->{$tag}=undef;
93 # MP3::Tag->get_tags shows cryptic debug info via print when it finds
94 # an unhandled id3v2 version, in addition to the warning, so use
95 # select to send prints to /dev/null
97 if(open(NULL,">/dev/null"))
101 eval { $self->{mp3}->get_tags; };
102 warn("$self->{path}: $@\n") if($@);