FLAC support
authorIan Beckwith <ianb@erislabs.net>
Sat, 25 Sep 2010 05:42:27 +0000 (06:42 +0100)
committerIan Beckwith <ianb@erislabs.net>
Sat, 25 Sep 2010 05:42:27 +0000 (06:42 +0100)
bin/id3fs-index
lib/ID3FS/DB.pm
lib/ID3FS/File.pm
lib/ID3FS/File/Flac.pm

index 1c479f3..3dd1227 100755 (executable)
@@ -14,7 +14,7 @@ my $verbose=0;
 my $help=0;
 my $basedir=undef;
 my $dbpath=undef;
-my @extensions=qw(mp3); # ogg flac); # FIXME
+my @extensions=qw(mp3 flac); # ogg); # FIXME
 
 Configure(qw(bundling no_ignore_case));
 my $optret=GetOptions(
index 97ed883..054a1b1 100644 (file)
@@ -379,7 +379,7 @@ sub add
     my $album=$file->album();
     my $v1genre=$file->v1genre();
     my $year=$file->year();
-    my $audiotype=$file->album();
+    my $audiotype=$file->audiotype();
     my $tags=$file->tags();
     my $haspic=$file->haspic();
 
index 9aa26c4..91462ba 100644 (file)
@@ -23,7 +23,7 @@ sub new
     }
     elsif($ext eq "flac")
     {
-       return ID3FS::File::Ogg->new($path);
+       return ID3FS::File::Flac->new($path);
     }
     else
     {
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;
+