From 2e2bea5f5b0be123366bce2ea8864c64840ed740 Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Sun, 31 Oct 2010 02:12:21 +0000 Subject: [PATCH] id3fs-tag: add/replace tags in genre tag --- bin/id3fs-tag | 24 +++++---- lib/ID3FS/AudioFile.pm | 5 +- lib/ID3FS/AudioFile/Mp3.pm | 118 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 136 insertions(+), 11 deletions(-) diff --git a/bin/id3fs-tag b/bin/id3fs-tag index 9b36c21..037dc78 100755 --- a/bin/id3fs-tag +++ b/bin/id3fs-tag @@ -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"; diff --git a/lib/ID3FS/AudioFile.pm b/lib/ID3FS/AudioFile.pm index 75df244..3091ed0 100644 --- a/lib/ID3FS/AudioFile.pm +++ b/lib/ID3FS/AudioFile.pm @@ -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 diff --git a/lib/ID3FS/AudioFile/Mp3.pm b/lib/ID3FS/AudioFile/Mp3.pm index cce6a29..d8f1355 100644 --- a/lib/ID3FS/AudioFile/Mp3.pm +++ b/lib/ID3FS/AudioFile/Mp3.pm @@ -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; -- 2.11.0