id3fs-tag: -V: summarize tags in directories
[id3fs.git] / lib / ID3FS / AudioFile / Mp3.pm
index bcbd227..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));
 }
@@ -156,7 +177,7 @@ sub write
        }
        else
        {
-           $self->{mp3tag}->{ID3v1}->remove_tag;
+           $self->{mp3tag}->{ID3v1}->write_tag;
        }
     }
     if(exists($self->{mp3tag}->{ID3v2}))
@@ -184,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);
@@ -271,14 +302,6 @@ sub delete
     }
 }
 
-sub uniq
-{
-    my ($self, @things)=@_;
-    my %hash=();
-    @hash{@things}=();
-    return(sort keys(%hash));
-}
-
 
 sub channels
 {