86a7c4ba270a9648c9c2cc993075e8e56d307ccb
[id3fs.git] / lib / ID3FS / File / Mp3.pm
1 package ID3FS::File::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     # FIXME
23     $self->{tags}={};
24
25     return $self;
26 }
27
28 sub choose
29 {
30     my ($self, $func, $verbose)=@_;
31     my $thing=undef;
32     if(defined($self->{v2}))
33     {
34         $thing=$self->{v2}->$func();
35     }
36     if(defined($self->{v1}) && (!defined($thing) || !length($thing)))
37     {
38         $thing=$self->{v1}->$func();
39     }
40     if(!defined($thing) || !length($thing))
41     {
42         warn("$self->{path}: no $func defined in ID3 tags\n") if($verbose);
43         return undef;
44     }
45     return $thing;
46 }
47
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
54 sub v1genre
55 {
56     my($self)=@_;
57     if(defined($self->{v1}))
58     {
59         return $self->{v1}->genre();
60     }
61 }
62
63 # FIXME: haspic;
64
65 sub tags
66 {
67     my $self=shift;
68     return $self->{tags};
69 }
70
71 sub get_tags
72 {
73     my ($self)=@_;
74     # MP3::Tag->get_tags shows cryptic debug info via print when it finds
75     # an unhandled id3v2 version, in addition to the warning, so use
76     # select to send prints to /dev/null
77     my $oldout=undef;
78     if(open(NULL,">/dev/null"))
79     {
80         $oldout=select(NULL);
81     }
82     eval { $self->{mp3}->get_tags; };
83     warn("$self->{path}: $@\n") if($@);
84     if(defined($oldout))
85     {
86         select($oldout);
87         close(NULL);
88     }
89 }
90
91 1;
92