99d4753553ea8be0502ddcc0d639c78dbae59616
[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(
75                   $self->stripslashes(
76                       $self->{audiofile}->year())));
77     if($year =~/(\d{4})/)
78     {
79         $year=$1;
80     }
81     return $year;
82 }
83
84 sub tags
85 {
86     my $self=shift;
87     my @tags=$self->{audiofile}->tags();
88     return({}) unless(@tags);
89     my $tags={};
90     if(@tags)
91     {
92         @tags = grep { defined($_); } @tags;
93         # combine then split on commas
94         # so multiple comma-delimited tags will work
95         @tags=split(/\s*,\s*/, join(', ', @tags));
96         for my $tag (@tags)
97         {
98             next unless(length($tag));
99             next unless($tag =~ /\S+/);
100             $tag=$self->sanitise($tag);
101
102             if($tag=~/([^\/]+)\/(.*)/)
103             {
104                 my $tagname = $1;
105                 my $tagval  = $self->stripslashes($2);
106                 $tags->{$tagname}=$tagval;
107             }
108             else
109             {
110                 $tags->{$tag}=undef;
111             }
112         }
113     }
114     return $tags;
115 }
116
117 sub sanitise
118 {
119     my ($self, $text)=@_;
120     $text =~ s/[^[:print:]]//g if(defined($text));
121     return $text;
122 }
123
124 sub stripslashes
125 {
126     my ($self, $text)=@_;
127     $text =~ s/\//-/g if(defined($text));
128     return $text;
129 }
130
131 1;