X-Git-Url: https://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2FID3FS%2FAudioFile%2FMp3.pm;h=8ec87ef5032353b8ebf1323d7a937ae64154513c;hb=9ef40433a1ba4044561f5941b07ba0d90a085942;hp=b4f340c0b6691ffbb89e76aa69a94f4017b8ae77;hpb=4f5ee0606c8b9726493ffab0e97872c670498184;p=id3fs.git diff --git a/lib/ID3FS/AudioFile/Mp3.pm b/lib/ID3FS/AudioFile/Mp3.pm index b4f340c..8ec87ef 100644 --- a/lib/ID3FS/AudioFile/Mp3.pm +++ b/lib/ID3FS/AudioFile/Mp3.pm @@ -18,6 +18,7 @@ package ID3FS::AudioFile::Mp3; use strict; use warnings; +use ID3FS::AudioFile; use MP3::Tag; use MP3::Info; @@ -69,16 +70,36 @@ sub choose return $thing; } -sub year { return(shift->set("year", @_)); } -sub artist { return(shift->set("artist", @_)); } -sub album { return(shift->set("album", @_)); } -sub track { return(shift->set("title", @_)); } -sub tracknum { return(shift->set("track", @_)); } -sub comment { return(shift->set("comment", @_)); } +sub year { return(shift->set("year", @_)); } +sub artist { return(shift->set("artist", @_)); } +sub album { return(shift->set("album", @_)); } +sub track { return(shift->set("title", @_)); } +sub tracknum { return(shift->set("track", @_)); } +sub comment { return(shift->set("comment", @_)); } sub audiotype { return "mp3"; } sub haspic { return undef; } # NEXTVERSION +# we only set v2 genre +sub genre +{ + my ($self, $value)=@_; + if($value) + { + if(exists($self->{mp3tag}->{ID3v2})) + { + $self->{mp3tag}->{ID3v2}->remove_frame("TCON"); + } + else + { + $self->{mp3tag}->new_tag("ID3v2"); + } + $self->{mp3tag}->{ID3v2}->add_frame("TCON", $value); + + } + return($self->{mp3tag}->{ID3v2}->genre()); +} + sub v1genre { my($self, $val)=@_; @@ -125,7 +146,7 @@ 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 @merged=ID3FS::AudioFile::uniq(@tags, @existing); my $genre=join(', ', @merged); return($self->set("genre", $genre)); } @@ -133,7 +154,44 @@ sub add_tags sub write { my $self=shift; - $self->{mp3tag}->update_tags(); + 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"); } @@ -147,14 +205,24 @@ sub delete_genre { shift->delete("genre"); } sub delete_tags { - my($self, @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); @@ -201,7 +269,6 @@ sub delete if(exists($self->{mp3tag}->{ID3v2})) { - print "2: remove: $thing\n"; if($thing eq "artist") { $self->{mp3tag}->{ID3v2}->remove_frame("TPE1"); @@ -235,14 +302,6 @@ sub delete } } -sub uniq -{ - my ($self, @things)=@_; - my %hash=(); - @hash{@things}=(); - return(sort keys(%hash)); -} - sub channels {