id3fs-tag: -V: summarize tags in directories
[id3fs.git] / lib / ID3FS / AudioFile / Mp3.pm
index b4f340c..8ec87ef 100644 (file)
@@ -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
 {