From 1e85c21d386c3b54f69ef88547174b28fca71740 Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Tue, 2 Nov 2010 01:05:05 +0000 Subject: [PATCH] id3fs-tag: implement -o --- bin/id3fs-tag | 44 ++++++++++++++++++++------------------------ lib/ID3FS/AudioFile/Mp3.pm | 12 +++++++++++- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/bin/id3fs-tag b/bin/id3fs-tag index c79a5b3..0a1aabe 100755 --- a/bin/id3fs-tag +++ b/bin/id3fs-tag @@ -28,7 +28,8 @@ my $help=0; my ($artist, $album, $track, $tracknum, $year, $v1genre, $comment, $delete_artist, $delete_album, $delete_track, $delete_tracknum, $delete_year, $delete_v1genre, $delete_comment, $delete_all, - $delete_genre, $genre, $add_tags, $delete_tags, @replace_tags); + $delete_genre, $genre, $add_tags, $delete_tags, $overwrite_tagvals, + $delete_tagvals); Configure(qw(no_ignore_case)); my $optret=GetOptions( @@ -52,8 +53,9 @@ my $optret=GetOptions( "delete-genre|delete-all-tags|G" => \$delete_genre, "genre|g|replace-all-tags|R=s" => \$genre, "add-tags|tags|t=s" => \$add_tags, + "overwrite-tagvals|tagvals|o=s" => \$overwrite_tagvals, "delete-tags|T=s" => \$delete_tags, - "replace-tags|r=s{2}" => \@replace_tags, + "delete-tags-with-values|O=s" => \$delete_tagvals, ); usage() if(!@ARGV || !$optret || $help); @@ -82,28 +84,27 @@ while(my $filename=shift @ARGV) sub do_deletes { my($file)=@_; - $file->delete_artist() if($delete_artist); - $file->delete_album() if($delete_album); - $file->delete_track() if($delete_track); - $file->delete_tracknum() if($delete_tracknum); - $file->delete_year() if($delete_year); - $file->delete_v1genre() if($delete_v1genre); - $file->delete_comment() if($delete_comment); - $file->delete_genre() if($delete_genre); - $file->delete_tags($delete_tags) if($delete_tags); - if(@replace_tags && $replace_tags[0]) + if($delete_all) { - $file->delete_tags($replace_tags[0]); + $file->delete_all(); + # we don't want to save the tag if we've deleted it + return 0; } - $file->delete_all() if($delete_all); - - # we don't want to save the tag if we've deleted it - return 0 if($delete_all); + $file->delete_artist() if($delete_artist); + $file->delete_album() if($delete_album); + $file->delete_track() if($delete_track); + $file->delete_tracknum() if($delete_tracknum); + $file->delete_year() if($delete_year); + $file->delete_v1genre() if($delete_v1genre); + $file->delete_comment() if($delete_comment); + $file->delete_genre() if($delete_genre); + $file->delete_tags($delete_tags, 0) if($delete_tags); + $file->delete_tags($delete_tagvals, 1) if($delete_tagvals); my $donesomething=($delete_artist || $delete_album || $delete_track || $delete_tracknum || $delete_year || $delete_v1genre || $delete_comment || $delete_genre || $delete_tags || - (@replace_tags && $replace_tags[0])); + $delete_tagvals); return($donesomething ? 1 : 0); } @@ -119,17 +120,12 @@ sub do_adds $file->comment($comment) if($comment); $file->genre($genre) if($genre); $file->add_tags($add_tags) if($add_tags); - if(@replace_tags && $replace_tags[0]) - { - $file->add_tags($replace_tags[1]); - } my $donesomething=(defined($artist) || defined($album) || defined($track) || defined($tracknum) || defined($year) || defined($v1genre) || defined($comment) || defined($genre) || - defined($add_tags) || - (@replace_tags && defined($replace_tags[1]))); + defined($add_tags)); return( $donesomething ? 1 : 0 ); } diff --git a/lib/ID3FS/AudioFile/Mp3.pm b/lib/ID3FS/AudioFile/Mp3.pm index 2b90b5d..7cd15b9 100644 --- a/lib/ID3FS/AudioFile/Mp3.pm +++ b/lib/ID3FS/AudioFile/Mp3.pm @@ -204,14 +204,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); -- 2.11.0