finish refactoring AudioFile
[id3fs.git] / lib / ID3FS / AudioFile / Mp3.pm
1 package ID3FS::AudioFile::Mp3;
2
3 use strict;
4 use warnings;
5 use MP3::Tag;
6
7 sub new
8 {
9     my $proto=shift;
10     my $class=ref($proto) || $proto;
11     my $self={};
12     bless($self,$class);
13
14     $self->{path}=shift;
15     $self->{mp3}=MP3::Tag->new($self->{path});
16     $self->get_tags();
17     $self->{v1}=undef;
18     $self->{v1}=$self->{mp3}->{ID3v1} if(exists($self->{mp3}->{ID3v1}));
19     $self->{v2}=undef;
20     $self->{v2}=$self->{mp3}->{ID3v2} if(exists($self->{mp3}->{ID3v2}));
21
22     $self->{tags}={};
23
24     return $self;
25 }
26
27 sub choose
28 {
29     my ($self, $func, $verbose)=@_;
30     my $thing=undef;
31     if(defined($self->{v2}))
32     {
33         $thing=$self->{v2}->$func();
34     }
35     if(defined($self->{v1}) && (!defined($thing) || !length($thing)))
36     {
37         $thing=$self->{v1}->$func();
38     }
39     if(!defined($thing) || !length($thing))
40     {
41         warn("$self->{path}: no $func defined in ID3 tags\n") if($verbose);
42         return undef;
43     }
44     return $thing;
45 }
46
47 sub artist    { shift->choose("artist", 1); }
48 sub album     { shift->choose("album", 1);  }
49 # We don't care if year is not set
50 sub year      { shift->choose("year", 0);   }
51 sub audiotype { return "mp3";               }
52 sub haspic    { return undef;               } # FIXME
53 sub v1genre
54 {
55     my($self)=@_;
56     my $genre=undef;
57     $genre=$self->{v1}->genre() if(defined($self->{v1}));
58     return $genre;
59 }
60
61 sub tags
62 {
63     my $self=shift;
64     return() unless(exists($self->{mp3}->{ID3v2}) && defined($self->{mp3}->{ID3v2}));
65     return($self->{mp3}->{ID3v2}->genre());
66 }
67
68 sub get_tags
69 {
70     my ($self)=@_;
71     # MP3::Tag->get_tags shows cryptic debug info via print when it finds
72     # an unhandled id3v2 version, in addition to the warning, so use
73     # select to send prints to /dev/null
74     my $oldout=undef;
75     if(open(NULL,">/dev/null"))
76     {
77         $oldout=select(NULL);
78     }
79     eval { $self->{mp3}->get_tags; };
80     warn("$self->{path}: $@\n") if($@);
81     if(defined($oldout))
82     {
83         select($oldout);
84         close(NULL);
85     }
86 }
87
88 1;