id3fs-tag: implement -o
authorIan Beckwith <ianb@erislabs.net>
Tue, 2 Nov 2010 01:05:05 +0000 (01:05 +0000)
committerIan Beckwith <ianb@erislabs.net>
Tue, 2 Nov 2010 01:05:05 +0000 (01:05 +0000)
bin/id3fs-tag
lib/ID3FS/AudioFile/Mp3.pm

index c79a5b3..0a1aabe 100755 (executable)
@@ -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 );
 }
 
index 2b90b5d..7cd15b9 100644 (file)
@@ -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);