#!/usr/bin/perl use strict; use warnings; use Getopt::Long; use MP3::Tag; use Encode; # use Data::Dumper; my $gbk; my $convert; my @exclusive; my $result = GetOptions ( "gbk" => \$gbk, "convert" => \$convert, "x=s" => \@exclusive, ); die "Usage error" unless $result; $gbk = 1 if defined $convert; my $regexp; $regexp = "(?:" . join("|", @exclusive) . ")" if @exclusive; for my $file (@ARGV) { my $info = MP3::Tag->new($file); $info->get_tags(); next unless exists $info->{ID3v2}; print $file, "\n"; my $id3v2 = $info->{ID3v2}; my $frameIDs = $id3v2->get_frame_ids; for my $id (keys %{$frameIDs}) { my ($name, @info) = $id3v2->get_frames($id); print "$id: $name: "; for my $item (@info) { if (ref $item eq "HASH") { print "\n"; while (my ($key, $value) = (each %$item)) { if ($key eq "_Data") { print "\t$key => "; print map { $_ =~ /[[:cntrl:]]/ ? "\\x(" . ord($_) . ")" : $_} (split("", $value)); print "\n"; } else { print "\t$key => $value\n"; } } } else { if (defined $gbk) { $item = decode("cp936", $item) unless defined $regexp and $id=~/$regexp/o; $item = encode("utf8", $item); } print $item, "\n"; } print "\n"; } $id3v2->change_frame($id, $name, @info) if defined $convert; } $id3v2->write_tag() if defined $convert; print "\n"; }