+sub choose
+{
+ my ($self, $func, $verbose)=@_;
+ my $thing=undef;
+ if(defined($self->{v2}))
+ {
+ $thing=$self->{v2}->$func();
+ }
+ if(defined($self->{v1}) && (!defined($thing) || !length($thing)))
+ {
+ $thing=$self->{v1}->$func();
+ }
+ if(!defined($thing) || !length($thing))
+ {
+ warn("$self->{path}: no $func defined in ID3 tags\n") if($verbose);
+ return undef;
+ }
+ return $thing;
+}
+
+sub artist { shift->choose("artist", 1); }
+sub album { shift->choose("album", 1); }
+# We don't care if year is not set
+sub year { shift->choose("year", 0); }
+sub audiotype { return "mp3"; }
+
+sub v1genre
+{
+ my($self)=@_;
+ if(defined($self->{v1}))
+ {
+ return $self->{v1}->genre();
+ }
+}
+
+# FIXME: haspic;
+
+sub tags
+{
+ my $self=shift;
+ return $self->{tags};
+}
+
+sub get_tags
+{
+ my ($self)=@_;
+ # MP3::Tag->get_tags shows cryptic debug info via print when it finds
+ # an unhandled id3v2 version, in addition to the warning, so use
+ # select to send prints to /dev/null
+ my $oldout=undef;
+ if(open(NULL,">/dev/null"))
+ {
+ $oldout=select(NULL);
+ }
+ eval { $self->{mp3}->get_tags; };
+ warn("$self->{path}: $@\n") if($@);
+ if(defined($oldout))
+ {
+ select($oldout);
+ close(NULL);
+ }
+}
+