FLAC support
[id3fs.git] / lib / ID3FS / File / Flac.pm
index faf11e1..0f9999f 100644 (file)
@@ -2,6 +2,7 @@ package ID3FS::File::Flac;
 
 use strict;
 use warnings;
+use Audio::FLAC::Header;
 
 sub new
 {
@@ -9,10 +10,73 @@ sub new
     my $class=ref($proto) || $proto;
     my $self={};
     bless($self,$class);
-    # FIXME
-    print "FLAC UNIMPLEMENTED\n";
+
     $self->{path}=shift;
+    my $flac=Audio::FLAC::Header->new($self->{path});
+    $self->{tags}=$flac->tags();
     return $self;
 }
 
+sub get
+{
+    my ($self, $tag, $verbose)=@_;
+    if(exists($self->{tags}->{$tag})   &&
+       defined($self->{tags}->{$tag})  &&
+       length($self->{tags}->{$tag})   &&
+       $self->{tags}->{$tag} =~ /\S+/)
+    {
+       my $val=$self->{tags}->{$tag};
+       $val =~ s/\//-/g; # drop slashes
+       return $val;
+    }
+    else
+    {
+       warn("$self->{path}: no $tag defined in FLAC comments\n") if($verbose);
+       return undef;
+    }
+}
+
+sub artist    { shift->get("ARTIST", 1); }
+sub album     { shift->get("ALBUM", 1);  }
+sub audiotype { return "flac";           }
+sub haspic    { return undef;            } # FIXME
+sub v1genre   { return undef;            } # ID3 only
+
+# We don't care if year is not set
+sub year
+{
+    my ($self)=@_;
+    my $date=shift->get("DATE", 0);
+    return undef unless($date);
+    if($date =~/(\d\d\d\d)/)
+    {
+       $date=$1;
+    }
+    return $date;
+}
+
+sub tags
+{
+    my $self=shift;
+    my $genre=$self->get("GENRE");
+    return({}) unless($genre);
+    my @tags=split(/\s*,\s*/, $genre);
+    for my $tag (@tags)
+    {
+       if($tag=~/([^\/]+)\/(.*)/)
+       {
+           my $tagname=$1;
+           my $tagval=$2;
+           $tagval=~s/\//-/g;
+           $self->{tags}->{$tagname}=$tagval;
+       }
+       else
+       {
+           $self->{tags}->{$tag}=undef;
+       }
+    }
+    return $self->{tags};
+}
+
 1;
+