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 comment { return(shift->set("comment", @_)); }
78 sub audiotype { return(shift->set("audiotype")); }
79 sub haspic { return(shift->set("haspic")); }
80 sub path { return(shift->{path}); }
82 sub delete_artist { shift->{audiofile}->delete_artist(); }
83 sub delete_album { shift->{audiofile}->delete_album(); }
84 sub delete_track { shift->{audiofile}->delete_track(); }
85 sub delete_tracknum { shift->{audiofile}->delete_tracknum(); }
86 sub delete_year { shift->{audiofile}->delete_year(); }
87 sub delete_v1genre { shift->{audiofile}->delete_v1genre(); }
88 sub delete_comment { shift->{audiofile}->delete_comment(); }
89 sub delete_all { shift->{audiofile}->delete_all(); }
90 sub delete_genre { shift->{audiofile}->delete_genre(); }
91 sub delete_tags { shift->{audiofile}->delete_tags(@_); }
92 sub channels { shift->{audiofile}->channels(); }
93 sub bitrate { shift->{audiofile}->bitrate(); }
94 sub samplerate { shift->{audiofile}->samplerate(@_); }
101 $year=$self->format_year($year);
102 $self->{audiofile}->year($year);
106 $year=$self->{audiofile}->year();
113 my ($self, $year)=@_;
116 $year=$self->sanitise($self->stripslashes($year));
117 if(defined($year) && $year =~/(\d{4})/)
128 my @tags=split(/\s*,\s*/, $tags);
129 $self->{audiofile}->add_tags(@tags);
135 my @intags=$self->{audiofile}->tags();
137 return() unless(@intags);
138 @intags = grep { defined($_); } @intags;
139 # combine then split on commas
140 # so multiple comma-delimited tags will work
141 @intags=split(/\s*,\s*/, join(', ', @intags));
142 for my $tag (@intags)
144 next unless(length($tag));
145 next unless($tag =~ /\S+/);
146 $tag=$self->sanitise($tag);
147 my ($tagname, $tagval)=($tag, undef);
148 if($tag=~/^([^\/]+)\/(.*)/)
150 ($tagname, $tagval)=($1, $2);
152 push(@outtags, [ $tagname, $tagval ]);
159 shift->{audiofile}->write();
164 my ($self, $text)=@_;
165 $text =~ s/[^[:print:]]//g if(defined($text));
171 my ($self, $text)=@_;
172 $text =~ s/\//-/g if(defined($text));