X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2FID3FS%2FAudioFile.pm;h=e020b4381f92f16bf2e0a5c6370e8aeef47cba58;hb=4f5ee0606c8b9726493ffab0e97872c670498184;hp=8d86314647dd9f23d0d289aa05f0e169f5760980;hpb=644232729028f2110fd4d61f5bff5d874a455022;p=id3fs.git diff --git a/lib/ID3FS/AudioFile.pm b/lib/ID3FS/AudioFile.pm index 8d86314..e020b43 100644 --- a/lib/ID3FS/AudioFile.pm +++ b/lib/ID3FS/AudioFile.pm @@ -1,3 +1,19 @@ +# id3fs - a FUSE-based filesystem for browsing audio metadata +# Copyright (C) 2010 Ian Beckwith +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + package ID3FS::AudioFile; use strict; @@ -13,103 +29,134 @@ sub new my $self={}; bless($self,$class); - my $path=shift; - my $ext=($path=~/.*\.(.*)/)[0]; + $self->{path}=shift; + my $ext=($self->{path}=~/.*\.(.*)/)[0]; return undef unless($ext); + my $me=shift; $ext=lc($ext); if($ext eq "mp3") { - $self->{audiofile}=ID3FS::AudioFile::Mp3->new($path); + $self->{audiofile}=ID3FS::AudioFile::Mp3->new($self->{path}); } elsif($ext eq "ogg") { - $self->{audiofile}=ID3FS::AudioFile::Ogg->new($path); + $self->{audiofile}=ID3FS::AudioFile::Ogg->new($self->{path}); } elsif($ext eq "flac") { - $self->{audiofile}=ID3FS::AudioFile::Flac->new($path); + $self->{audiofile}=ID3FS::AudioFile::Flac->new($self->{path}); } else { - print("Unknown extension: $ext\n"); + print("$me: $self->{path}: Unknown extension: $ext\n"); return undef; } return $self; } -sub artist -{ - my $self=shift; - return $self->sanitise($self->stripslashes($self->{audiofile}->artist())); -} - -sub album +sub set { - my $self=shift; - return $self->sanitise($self->stripslashes($self->{audiofile}->album())); + my ($self, $thing, $value)=@_; + if($value) + { + $value=$self->sanitise($self->stripslashes($value)); + $self->{audiofile}->$thing($value); + } + else + { + $value=$self->sanitise($self->stripslashes($self->{audiofile}->$thing())); + } + return $value; } -sub audiotype -{ - my $self=shift; - return $self->sanitise($self->stripslashes($self->{audiofile}->audiotype())); -} +sub artist { return(shift->set("artist", @_)); } +sub album { return(shift->set("album", @_)); } +sub track { return(shift->set("track", @_)); } +sub tracknum { return(shift->set("tracknum", @_)); } +sub v1genre { return(shift->set("v1genre", @_)); } +sub comment { return(shift->set("comment", @_)); } +sub audiotype { return(shift->set("audiotype")); } +sub haspic { return(shift->set("haspic")); } +sub path { return(shift->{path}); } -sub haspic -{ - return undef; # FIXME -# my $self=shift; -# return $self->{audiofile}->haspic(); -} +sub delete_artist { shift->{audiofile}->delete_artist(); } +sub delete_album { shift->{audiofile}->delete_album(); } +sub delete_track { shift->{audiofile}->delete_track(); } +sub delete_tracknum { shift->{audiofile}->delete_tracknum(); } +sub delete_year { shift->{audiofile}->delete_year(); } +sub delete_v1genre { shift->{audiofile}->delete_v1genre(); } +sub delete_comment { shift->{audiofile}->delete_comment(); } +sub delete_all { shift->{audiofile}->delete_all(); } +sub delete_genre { shift->{audiofile}->delete_genre(); } +sub delete_tags { shift->{audiofile}->delete_tags(@_); } +sub channels { shift->{audiofile}->channels(); } +sub bitrate { shift->{audiofile}->bitrate(); } +sub samplerate { shift->{audiofile}->samplerate(@_); } -sub v1genre +sub year { - my $self=shift; - return $self->sanitise($self->stripslashes($self->{audiofile}->v1genre())); + my ($self, $year)=@_; + if($year) + { + $year=$self->format_year($year); + $self->{audiofile}->year($year); + } + else + { + $year=$self->{audiofile}->year(); + } + return $year; } -sub year +sub format_year { - my $self=shift; - my $year=$self->sanitise($self->stripslashes($self->{audiofile}->year())); - if(defined($year) && $year =~/(\d{4})/) + my ($self, $year)=@_; + if($year) { - $year=$1; + $year=$self->sanitise($self->stripslashes($year)); + if(defined($year) && $year =~/(\d{4})/) + { + $year=$1; + } } return $year; } +sub add_tags +{ + my($self, $tags)=@_; + my @tags=split(/\s*,\s*/, $tags); + $self->{audiofile}->add_tags(@tags); +} + sub tags { my $self=shift; - my @tags=$self->{audiofile}->tags(); - return({}) unless(@tags); - my $tags={}; - if(@tags) + my @intags=$self->{audiofile}->tags(); + my @outtags=(); + return() unless(@intags); + @intags = grep { defined($_); } @intags; + # combine then split on commas + # so multiple comma-delimited tags will work + @intags=split(/\s*,\s*/, join(', ', @intags)); + for my $tag (@intags) { - @tags = grep { defined($_); } @tags; - # combine then split on commas - # so multiple comma-delimited tags will work - @tags=split(/\s*,\s*/, join(', ', @tags)); - for my $tag (@tags) + next unless(length($tag)); + next unless($tag =~ /\S+/); + $tag=$self->sanitise($tag); + my ($tagname, $tagval)=($tag, undef); + if($tag=~/^([^\/]+)\/(.*)/) { - next unless(length($tag)); - next unless($tag =~ /\S+/); - $tag=$self->sanitise($tag); - - if($tag=~/([^\/]+)\/(.*)/) - { - my $tagname = $1; - my $tagval = $self->stripslashes($2); - $tags->{$tagname}=$tagval; - } - else - { - $tags->{$tag}=undef; - } + ($tagname, $tagval)=($1, $2); } + push(@outtags, [ $tagname, $tagval ]); } - return $tags; + return @outtags; +} + +sub write +{ + shift->{audiofile}->write(); } sub sanitise