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);
45 $thing=~s/\//-/g; # drop slashes
49 sub artist { shift->choose("artist", 1); }
50 sub album { shift->choose("album", 1); }
51 # We don't care if year is not set
52 sub year { shift->choose("year", 0); }
53 sub audiotype { return "mp3"; }
54 sub haspic { return undef; } # FIXME
59 if(defined($self->{v1}))
61 $genre=$self->{v1}->genre();
62 $genre =~ s/\//-/g if(defined($genre));
70 return({}) unless(exists($self->{mp3}->{ID3v2}) && defined($self->{mp3}->{ID3v2}));
71 my $genre=$self->{mp3}->{ID3v2}->genre();
72 return({}) unless(defined($genre) && length($genre));
73 my @tags=split(/\s*,\s*/, $genre);
76 if($tag=~/([^\/]+)\/(.*)/)
81 $self->{tags}->{$tagname}=$tagval;
85 $self->{tags}->{$tag}=undef;
94 # MP3::Tag->get_tags shows cryptic debug info via print when it finds
95 # an unhandled id3v2 version, in addition to the warning, so use
96 # select to send prints to /dev/null
98 if(open(NULL,">/dev/null"))
100 $oldout=select(NULL);
102 eval { $self->{mp3}->get_tags; };
103 warn("$self->{path}: $@\n") if($@);