cac87d30d3ed1f6206f0672b31c5ef46e7c13e78
[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 @intags=$self->{audiofile}->tags();
87     my @outtags=();
88     return() unless(@intags);
89     @intags = grep { defined($_); } @intags;
90     # combine then split on commas
91     # so multiple comma-delimited tags will work
92     @intags=split(/\s*,\s*/, join(', ', @intags));
93     for my $tag (@intags)
94     {
95         next unless(length($tag));
96         next unless($tag =~ /\S+/);
97         $tag=$self->sanitise($tag);
98         my ($tagname, $tagval)=($tag, undef);
99         if($tag=~/^([^\/]+)\/(.*)/)
100         {
101             ($tagname, $tagval)=($1, $2);
102         }
103         push(@outtags, [ $tagname, $tagval ]);
104     }
105     return @outtags;
106 }
107
108 sub sanitise
109 {
110     my ($self, $text)=@_;
111     $text =~ s/[^[:print:]]//g if(defined($text));
112     return $text;
113 }
114
115 sub stripslashes
116 {
117     my ($self, $text)=@_;
118     $text =~ s/\//-/g if(defined($text));
119     return $text;
120 }
121
122 1;