id3fs-tag: add/replace tags in genre tag
authorIan Beckwith <ianb@erislabs.net>
Sun, 31 Oct 2010 02:12:21 +0000 (02:12 +0000)
committerIan Beckwith <ianb@erislabs.net>
Sun, 31 Oct 2010 02:12:21 +0000 (02:12 +0000)
bin/id3fs-tag
lib/ID3FS/AudioFile.pm
lib/ID3FS/AudioFile/Mp3.pm

index 9b36c21..037dc78 100755 (executable)
@@ -97,10 +97,11 @@ sub do_deletes
        $file->delete_tags($replace_tags[0]);
     }
 
-    return($delete_artist   || $delete_album  || $delete_track   ||
-          $delete_tracknum || $delete_year   || $delete_v1genre ||
-          $delete_comment  || $delete_all    || $delete_genre   ||
-          $delete_tags     || (@replace_tags && $replace_tags[0]));
+    my $donesomething=($delete_artist || $delete_album || $delete_track    ||
+                      $delete_tracknum || $delete_year || $delete_v1genre ||
+                      $delete_comment || $delete_all || $delete_genre     ||
+                      $delete_tags || (@replace_tags && $replace_tags[0]));
+    return($donesomething ? 1 : 0);
 }
 
 sub do_adds
@@ -120,11 +121,13 @@ sub do_adds
        $file->add_tags($replace_tags[1]);
     }
 
-    return(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])));
-
+    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])));
+    return( $donesomething ? 1 : 0 );
 }
 
 sub do_write
@@ -144,6 +147,9 @@ sub do_display
     my $comment=$file->comment();
     my $v1genre=$file->v1genre();
     my @tags=$file->tags();
+    @tags = map { (ref($_) eq "ARRAY") ? join('/', grep {defined;} @{$_}) : $_; } @tags;
+    use Data::Dumper;
+    print Dumper \@tags;
     if($verbose)
     {
        print $file->path(), ":\n";
index 75df244..3091ed0 100644 (file)
@@ -88,7 +88,7 @@ sub delete_v1genre  { shift->{audiofile}->delete_v1genre();  }
 sub delete_comment  { shift->{audiofile}->delete_comment();  }
 sub delete_all      { shift->{audiofile}->delete_all();      }
 sub delete_genre    { shift->{audiofile}->delete_genre();    }
-sub delete_tags     { shift->{audiofile}->delete_tags();     }
+sub delete_tags     { shift->{audiofile}->delete_tags(@_);   }
 
 sub year
 {
@@ -122,7 +122,8 @@ sub format_year
 sub add_tags
 {
     my($self, $tags)=@_;
-    die("FIXME: implement add_tags()\n");
+    my @tags=split(/\s*,\s*/, $tags);
+    $self->{audiofile}->add_tags(@tags);
 }
 
 sub tags
index cce6a29..d8f1355 100644 (file)
@@ -118,10 +118,128 @@ sub get_tags
     }
 }
 
+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;
     $self->{mp3}->update_tags();
 }
 
+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)=@_;
+    my $current=$self->tags();
+    my @current=split(/\s*,\s*/, $current);
+    my %hash=();
+    @hash{@current}=();
+    for my $tag (@tags)
+    {
+       delete($hash{$tag}) if(exists($hash{$tag}));
+    }
+    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->{mp3}->{ID3v1}))
+    {
+       $self->{mp3}->{ID3v1}->remove_tag;
+    }
+    if(exists($self->{mp3}->{ID3v2}))
+    {
+       $self->{mp3}->{ID3v2}->remove_tag;
+    }
+}
+
+sub delete
+{
+    my($self, $thing)=@_;
+
+    if(exists($self->{mp3}->{ID3v1}))
+    {
+       my $action=$thing;
+       $action="genre" if($action eq "v1genre");
+       if($action eq "track")
+       {
+           $self->{mp3}->{ID3v1}->track("00");
+       }
+       else
+       {
+           $self->{mp3}->{ID3v1}->$action(" ");
+       }
+    }
+
+    if(exists($self->{mp3}->{ID3v2}))
+    {
+       if($thing eq "artist")
+       {
+           $self->{mp3}->{ID3v2}->remove_frame("TPE1");
+           $self->{mp3}->{ID3v2}->remove_frame("TPE2");
+       }
+       elsif($thing eq "album")
+       {
+           $self->{mp3}->{ID3v2}->remove_frame("TALB");
+       }
+       elsif($thing eq "song")
+       {
+           $self->{mp3}->{ID3v2}->remove_frame("TIT2");
+       }
+       elsif($thing eq "track")
+       {
+           $self->{mp3}->{ID3v2}->remove_frame("TRCK");
+       }
+       elsif($thing eq "year")
+       {
+           $self->{mp3}->{ID3v2}->remove_frame("TYER");
+           $self->{mp3}->{ID3v2}->remove_frame("TDRC");
+       }
+       elsif($thing eq "comment")
+       {
+           $self->{mp3}->{ID3v2}->remove_frame("COMM");
+       }
+       elsif($thing eq "genre")
+       {
+           $self->{mp3}->{ID3v2}->remove_frame("TCON");
+       }
+    }
+}
+
+sub uniq
+{
+    my ($self, @things)=@_;
+    my %hash=();
+    @hash{@things}=();
+    return(sort keys(%hash));
+}
+
+
 1;