1 # id3fs - a FUSE-based filesystem for browsing audio metadata
2 # Copyright (C) 2010 Ian Beckwith <ianb@erislabs.net>
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 package ID3FS::AudioFile;
21 use ID3FS::AudioFile::Mp3;
22 use ID3FS::AudioFile::Ogg;
23 use ID3FS::AudioFile::Flac;
28 my $class=ref($proto) || $proto;
33 my $ext=($self->{path}=~/.*\.(.*)/)[0];
34 return undef unless($ext);
39 $self->{audiofile}=ID3FS::AudioFile::Mp3->new($self->{path});
43 $self->{audiofile}=ID3FS::AudioFile::Ogg->new($self->{path});
47 $self->{audiofile}=ID3FS::AudioFile::Flac->new($self->{path});
51 print("$me: $self->{path}: Unknown extension: $ext\n");
59 my ($self, $thing, $value)=@_;
62 $value=$self->sanitise($self->stripslashes($value));
63 $self->{audiofile}->$thing($value);
67 $value=$self->sanitise($self->stripslashes($self->{audiofile}->$thing()));
72 sub artist { return(shift->set("artist", @_)); }
73 sub album { return(shift->set("album", @_)); }
74 sub track { return(shift->set("track", @_)); }
75 sub tracknum { return(shift->set("tracknum", @_)); }
76 sub v1genre { return(shift->set("v1genre", @_)); }
77 sub genre { return(shift->set("genre", @_)); }
78 sub comment { return(shift->set("comment", @_)); }
79 sub audiotype { return(shift->set("audiotype")); }
80 sub haspic { return(shift->set("haspic")); }
81 sub path { return(shift->{path}); }
83 sub delete_artist { shift->{audiofile}->delete_artist(); }
84 sub delete_album { shift->{audiofile}->delete_album(); }
85 sub delete_track { shift->{audiofile}->delete_track(); }
86 sub delete_tracknum { shift->{audiofile}->delete_tracknum(); }
87 sub delete_year { shift->{audiofile}->delete_year(); }
88 sub delete_v1genre { shift->{audiofile}->delete_v1genre(); }
89 sub delete_comment { shift->{audiofile}->delete_comment(); }
90 sub delete_all { shift->{audiofile}->delete_all(); }
91 sub delete_genre { shift->{audiofile}->delete_genre(); }
92 sub delete_tags { shift->{audiofile}->delete_tags(@_); }
93 sub channels { shift->{audiofile}->channels(); }
94 sub bitrate { shift->{audiofile}->bitrate(); }
95 sub samplerate { shift->{audiofile}->samplerate(@_); }
102 $year=$self->format_year($year);
103 $self->{audiofile}->year($year);
107 $year=$self->{audiofile}->year();
114 my ($self, $year)=@_;
117 $year=$self->sanitise($self->stripslashes($year));
118 if(defined($year) && $year =~/(\d{4})/)
129 my @tags=split(/\s*,\s*/, $tags);
130 $self->{audiofile}->add_tags(@tags);
136 my @intags=$self->{audiofile}->tags();
138 return() unless(@intags);
139 @intags = grep { defined($_); } @intags;
140 # combine then split on commas
141 # so multiple comma-delimited tags will work
142 @intags=split(/\s*,\s*/, join(', ', @intags));
143 for my $tag (@intags)
145 next unless(length($tag));
146 next unless($tag =~ /\S+/);
147 $tag=$self->sanitise($tag);
148 my ($tagname, $tagval)=($tag, undef);
149 if($tag=~/^([^\/]+)\/(.*)/)
151 ($tagname, $tagval)=($1, $2);
153 push(@outtags, [ $tagname, $tagval ]);
160 shift->{audiofile}->write();
165 my ($self, $text)=@_;
166 $text =~ s/[^[:print:]]//g if(defined($text));
172 my ($self, $text)=@_;
173 $text =~ s/\//-/g if(defined($text));