From e5ff4b33ca2396bbc32190f6aec23d4e8bf093c5 Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Sat, 25 Sep 2010 06:42:27 +0100 Subject: [PATCH] FLAC support --- bin/id3fs-index | 2 +- lib/ID3FS/DB.pm | 2 +- lib/ID3FS/File.pm | 2 +- lib/ID3FS/File/Flac.pm | 68 ++++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/bin/id3fs-index b/bin/id3fs-index index 1c479f3..3dd1227 100755 --- a/bin/id3fs-index +++ b/bin/id3fs-index @@ -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( diff --git a/lib/ID3FS/DB.pm b/lib/ID3FS/DB.pm index 97ed883..054a1b1 100644 --- a/lib/ID3FS/DB.pm +++ b/lib/ID3FS/DB.pm @@ -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(); diff --git a/lib/ID3FS/File.pm b/lib/ID3FS/File.pm index 9aa26c4..91462ba 100644 --- a/lib/ID3FS/File.pm +++ b/lib/ID3FS/File.pm @@ -23,7 +23,7 @@ sub new } elsif($ext eq "flac") { - return ID3FS::File::Ogg->new($path); + return ID3FS::File::Flac->new($path); } else { diff --git a/lib/ID3FS/File/Flac.pm b/lib/ID3FS/File/Flac.pm index faf11e1..0f9999f 100644 --- a/lib/ID3FS/File/Flac.pm +++ b/lib/ID3FS/File/Flac.pm @@ -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; + -- 2.11.0