new special tags: channels, samplerate, bitrate
[id3fs.git] / lib / ID3FS / AudioFile.pm
index cac87d3..e020b43 100644 (file)
@@ -1,3 +1,19 @@
+# id3fs - a FUSE-based filesystem for browsing audio metadata
+# Copyright (C) 2010  Ian Beckwith <ianb@erislabs.net>
+#
+# 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 <http://www.gnu.org/licenses/>.
+
 package ID3FS::AudioFile;
 
 use strict;
@@ -13,73 +29,106 @@ 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("$me: $path: 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;
@@ -105,6 +154,11 @@ sub tags
     return @outtags;
 }
 
+sub write
+{
+    shift->{audiofile}->write();
+}
+
 sub sanitise
 {
     my ($self, $text)=@_;