FLAC support
[id3fs.git] / lib / ID3FS / File / Flac.pm
1 package ID3FS::File::Flac;
2
3 use strict;
4 use warnings;
5 use Audio::FLAC::Header;
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     my $flac=Audio::FLAC::Header->new($self->{path});
16     $self->{tags}=$flac->tags();
17     return $self;
18 }
19
20 sub get
21 {
22     my ($self, $tag, $verbose)=@_;
23     if(exists($self->{tags}->{$tag})   &&
24        defined($self->{tags}->{$tag})  &&
25        length($self->{tags}->{$tag})   &&
26        $self->{tags}->{$tag} =~ /\S+/)
27     {
28         my $val=$self->{tags}->{$tag};
29         $val =~ s/\//-/g; # drop slashes
30         return $val;
31     }
32     else
33     {
34         warn("$self->{path}: no $tag defined in FLAC comments\n") if($verbose);
35         return undef;
36     }
37 }
38
39 sub artist    { shift->get("ARTIST", 1); }
40 sub album     { shift->get("ALBUM", 1);  }
41 sub audiotype { return "flac";           }
42 sub haspic    { return undef;            } # FIXME
43 sub v1genre   { return undef;            } # ID3 only
44
45 # We don't care if year is not set
46 sub year
47 {
48     my ($self)=@_;
49     my $date=shift->get("DATE", 0);
50     return undef unless($date);
51     if($date =~/(\d\d\d\d)/)
52     {
53         $date=$1;
54     }
55     return $date;
56 }
57
58 sub tags
59 {
60     my $self=shift;
61     my $genre=$self->get("GENRE");
62     return({}) unless($genre);
63     my @tags=split(/\s*,\s*/, $genre);
64     for my $tag (@tags)
65     {
66         if($tag=~/([^\/]+)\/(.*)/)
67         {
68             my $tagname=$1;
69             my $tagval=$2;
70             $tagval=~s/\//-/g;
71             $self->{tags}->{$tagname}=$tagval;
72         }
73         else
74         {
75             $self->{tags}->{$tag}=undef;
76         }
77     }
78     return $self->{tags};
79 }
80
81 1;
82