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