+sub add_tags
+{
+ my($self, @tags)=@_;
+ my $existing=$self->tags();
+ my @existing=split(/\s*,\s*/, $existing) if($existing);
+ my @merged=$self->uniq(@tags, @existing);
+ my $genre=join(', ', @merged);
+ return($self->set("genre", $genre));
+}
+
+sub write
+{
+ my $self=shift;
+ if(exists($self->{mp3tag}->{ID3v1}))
+ {
+ my $del=1;
+ my $artist=$self->{mp3tag}->{ID3v1}->artist();
+ $del=0 if($artist && $artist =~ /\S+/);
+ my $album=$self->{mp3tag}->{ID3v1}->album();
+ $del=0 if($album && $album =~ /\S+/);
+ my $track=$self->{mp3tag}->{ID3v1}->title();
+ $del=0 if($track && $track =~ /\S+/);
+ my $tracknum=$self->{mp3tag}->{ID3v1}->track();
+ $del=0 if($tracknum && $tracknum !~ /^0+$/);
+ my $genre=$self->{mp3tag}->{ID3v1}->genre();
+ $del=0 if($genre && $genre =~ /\S+/);
+ my $comment=$self->{mp3tag}->{ID3v1}->comment();
+ $del=0 if($comment && $comment =~ /\S+/);
+ my $year=$self->{mp3tag}->{ID3v1}->year();
+ $del=0 if($year && $year =~ /\S+/ && $year !~ /^0+$/);
+ if($del)
+ {
+ $self->{mp3tag}->{ID3v1}->remove_tag;
+ }
+ else
+ {
+ $self->{mp3tag}->{ID3v1}->write_tag;
+ }
+ }
+ if(exists($self->{mp3tag}->{ID3v2}))
+ {
+ my $frames=$self->{mp3tag}->{ID3v2}->get_frame_ids();
+ if($frames && scalar(keys(%$frames)))
+ {
+ $self->{mp3tag}->{ID3v2}->write_tag;
+ }
+ else
+ {
+ $self->{mp3tag}->{ID3v2}->remove_tag;
+ }
+ }
+}
+
+sub delete_artist { shift->delete("artist"); }
+sub delete_album { shift->delete("album"); }
+sub delete_track { shift->delete("song"); }
+sub delete_tracknum { shift->delete("track"); }
+sub delete_year { shift->delete("year"); }
+sub delete_v1genre { shift->delete("v1genre"); }
+sub delete_comment { shift->delete("comment"); }
+sub delete_genre { shift->delete("genre"); }
+
+sub delete_tags
+{
+ my($self, $tags, $delvals)=@_;
+ my $current=$self->tags();
+ my @current=split(/\s*,\s*/, $current);
+ my @tags=split(/\s*,\s*/, $tags);
+ my %hash=();
+ @hash{@current}=();
+ for my $tag (@tags)
+ {
+ delete($hash{$tag}) if(exists($hash{$tag}));
+ if($delvals)
+ {
+ my $base=($tag =~ /(.*?)\//)[0];
+ $base=$tag unless($base);
+ for my $curtag (keys %hash)
+ {
+ delete($hash{$curtag}) if($curtag =~ /^$base\//);
+ }
+ }
+ }
+ my @tagsout=sort keys(%hash);
+ my $genre=join(', ', @tagsout);
+ if(length($genre))
+ {
+ return($self->set("genre", $genre));
+ }
+ else
+ {
+ return($self->delete_genre());
+ }
+}
+
+sub delete_all
+{
+ my($self)=@_;
+ if(exists($self->{mp3tag}->{ID3v1}))
+ {
+ $self->{mp3tag}->{ID3v1}->remove_tag;
+ }
+ if(exists($self->{mp3tag}->{ID3v2}))
+ {
+ $self->{mp3tag}->{ID3v2}->remove_tag;
+ }
+}
+
+sub delete
+{
+ my($self, $thing)=@_;
+
+ if(exists($self->{mp3tag}->{ID3v1}) && $thing ne "genre")
+ {
+ my $action=$thing;
+ $action="genre" if($action eq "v1genre");
+ if($action eq "track")
+ {
+ $self->{mp3tag}->{ID3v1}->track("00");
+ }
+ else
+ {
+ $self->{mp3tag}->{ID3v1}->$action(" ");
+ }
+ }
+
+ if(exists($self->{mp3tag}->{ID3v2}))
+ {
+ if($thing eq "artist")
+ {
+ $self->{mp3tag}->{ID3v2}->remove_frame("TPE1");
+ $self->{mp3tag}->{ID3v2}->remove_frame("TPE2");
+ }
+ elsif($thing eq "album")
+ {
+ $self->{mp3tag}->{ID3v2}->remove_frame("TALB");
+ }
+ elsif($thing eq "song")
+ {
+ $self->{mp3tag}->{ID3v2}->remove_frame("TIT2");
+ }
+ elsif($thing eq "track")
+ {
+ $self->{mp3tag}->{ID3v2}->remove_frame("TRCK");
+ }
+ elsif($thing eq "year")
+ {
+ $self->{mp3tag}->{ID3v2}->remove_frame("TYER");
+ $self->{mp3tag}->{ID3v2}->remove_frame("TDRC");
+ }
+ elsif($thing eq "comment")
+ {
+ $self->{mp3tag}->{ID3v2}->remove_frame("COMM");
+ }
+ elsif($thing eq "genre")
+ {
+ $self->{mp3tag}->{ID3v2}->remove_frame("TCON");
+ }
+ }
+}
+
+sub uniq
+{
+ my ($self, @things)=@_;
+ my %hash=();
+ @hash{@things}=();
+ return(sort keys(%hash));
+}
+
+sub channels
+{
+ my($self)=@_;
+ return undef unless($self->{mp3info});
+ return( ($self->{mp3info}->stereo()) ? 2 : 1 );
+}