+package ID3FS::File::Ogg;
+
+use strict;
+use warnings;
+use Ogg::Vorbis::Header;
+
+sub new
+{
+ my $proto=shift;
+ my $class=ref($proto) || $proto;
+ my $self={};
+ bless($self,$class);
+
+ $self->{path}=shift;
+ $self->{ogg}=Ogg::Vorbis::Header->new($self->{path});
+ $self->{comments}=[ $self->{ogg}->comment_tags() ];
+ return $self;
+}
+
+sub get
+{
+ my ($self, $tag, $complain)=@_;
+ for my $commenttype (@{$self->{comments}})
+ {
+ if($commenttype =~ /$tag/i)
+ {
+ my @comments=$self->{ogg}->comment($commenttype);
+ if(@comments)
+ {
+ # take first comment with actual contents
+ while(my $comment=shift @comments)
+ {
+ if(defined($comment) &&
+ length($comment) &&
+ $comment =~ /\S+/)
+ {
+ $comment =~ s/\//-/g; # drop slashes
+ return $comment;
+ }
+ }
+ }
+ }
+ }
+ warn("$self->{path}: no $tag defined in Ogg comments\n") if($complain);
+ return undef;
+}
+
+sub artist { shift->get("Artist", 1); }
+sub album { shift->get("Album", 1); }
+sub audiotype { return "ogg"; }
+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 @comments;
+ for my $commenttype (@{$self->{comments}})
+ {
+ if($commenttype =~ /genre/i)
+ {
+ push(@comments,$self->{ogg}->comment($commenttype));
+ }
+ }
+ my $tags={};
+ if(@comments)
+ {
+ # filter for useful comments
+ @comments= grep { defined($_); } @comments;
+ @comments= grep { length($_); } @comments;
+ @comments= grep { /\S+/; } @comments;
+ # combine then split on commas
+ # so multiple comma-delimited tags will work
+ @comments=split(/\s*,\s*/, join(', ', @comments));
+ for my $comment (@comments)
+ {
+ if($comment=~/([^\/]+)\/(.*)/)
+ {
+ my $tagname=$1;
+ my $tagval=$2;
+ $tagval=~s/\//-/g;
+ $tags->{$tagname}=$tagval;
+ }
+ else
+ {
+ $tags->{$comment}=undef;
+ }
+ }
+ }
+ return $tags;
+}
+
+1;
+