tweaked error messages
[id3fs.git] / lib / ID3FS / AudioFile.pm
1 package ID3FS::AudioFile;
2
3 use strict;
4 use warnings;
5 use ID3FS::AudioFile::Mp3;
6 use ID3FS::AudioFile::Ogg;
7 use ID3FS::AudioFile::Flac;
8
9 sub new
10 {
11     my $proto=shift;
12     my $class=ref($proto) || $proto;
13     my $self={};
14     bless($self,$class);
15
16     my $path=shift;
17     my $ext=($path=~/.*\.(.*)/)[0];
18     return undef unless($ext);
19     my $me=shift;
20     $ext=lc($ext);
21     if($ext eq "mp3")
22     {
23         $self->{audiofile}=ID3FS::AudioFile::Mp3->new($path);
24     }
25     elsif($ext eq "ogg")
26     {
27         $self->{audiofile}=ID3FS::AudioFile::Ogg->new($path);
28     }
29     elsif($ext eq "flac")
30     {
31         $self->{audiofile}=ID3FS::AudioFile::Flac->new($path);
32     }
33     else
34     {
35         print("$me: $path: Unknown extension: $ext\n");
36         return undef;
37     }
38     return $self;
39 }
40
41 sub artist
42 {
43     my $self=shift;
44     return $self->sanitise($self->stripslashes($self->{audiofile}->artist()));
45 }
46
47 sub album
48 {
49     my $self=shift;
50     return $self->sanitise($self->stripslashes($self->{audiofile}->album()));
51 }
52
53 sub audiotype
54 {
55     my $self=shift;
56     return $self->sanitise($self->stripslashes($self->{audiofile}->audiotype()));
57 }
58
59 sub haspic
60 {
61     return undef; # FIXME
62 #    my $self=shift;
63 #    return $self->{audiofile}->haspic();
64 }
65
66 sub v1genre
67 {
68     my $self=shift;
69     return $self->sanitise($self->stripslashes($self->{audiofile}->v1genre()));
70 }
71
72 sub year
73 {
74     my $self=shift;
75     my $year=$self->sanitise($self->stripslashes($self->{audiofile}->year()));
76     if(defined($year) && $year =~/(\d{4})/)
77     {
78         $year=$1;
79     }
80     return $year;
81 }
82
83 sub tags
84 {
85     my $self=shift;
86     my @tags=$self->{audiofile}->tags();
87     return({}) unless(@tags);
88     my $tags={};
89     if(@tags)
90     {
91         @tags = grep { defined($_); } @tags;
92         # combine then split on commas
93         # so multiple comma-delimited tags will work
94         @tags=split(/\s*,\s*/, join(', ', @tags));
95         for my $tag (@tags)
96         {
97             next unless(length($tag));
98             next unless($tag =~ /\S+/);
99             $tag=$self->sanitise($tag);
100
101             if($tag=~/([^\/]+)\/(.*)/)
102             {
103                 my $tagname = $1;
104                 my $tagval  = $self->stripslashes($2);
105                 $tags->{$tagname}=$tagval;
106             }
107             else
108             {
109                 $tags->{$tag}=undef;
110             }
111         }
112     }
113     return $tags;
114 }
115
116 sub sanitise
117 {
118     my ($self, $text)=@_;
119     $text =~ s/[^[:print:]]//g if(defined($text));
120     return $text;
121 }
122
123 sub stripslashes
124 {
125     my ($self, $text)=@_;
126     $text =~ s/\//-/g if(defined($text));
127     return $text;
128 }
129
130 1;