rendered paste body#!/usr/bin/perl
use Encode 'from_to';
use MP3::Tag;
$from_enc = (shift or 'shiftjis');
$to_enc = (shift or 'euc-jp');
while($filename = shift) {
mp3tag_enc($filename);
}
sub mp3tag_enc {
my $filename = shift or return;
$mp3 = MP3::Tag->new($filename);
# scan file for existing tags
$mp3->get_tags;
if (exists $mp3->{ID3v1}) {
# read some information from the tag
$id3v1 = $mp3->{ID3v1}; # $id3v1 is only a shortcut for $mp3->{ID3v1}
@tagdata = $id3v1->all();
foreach $tag (@tagdata) {
from_to($tag, $from_enc, $to_enc, 1);
}
# change the tag contents
$id3v1->all(@tagdata);
$id3v1->write_tag;
}
if (exists $mp3->{ID3v2}) {
$id3v2 = $mp3->{ID3v2};
$frameIDs_hash = $id3v2->get_frame_ids;
foreach my $frame (keys %$frameIDs_hash) {
my ($info, $name) = $id3v2->get_frame($frame);
if (ref $info) {
print "$name ($frame):\n";
while(my ($key,$val)=each %$info) {
if ($key ne '_Data') {
print " * $key => $val\n";
} else {
print " * $key => *\n";
}
}
} else {
if ($frame =~ /^T/) {
from_to($info, $from_enc, $to_enc, 1);
$id3v2->change_frame($frame, $info);
} else {
print "$name ($frame): $info\n";
}
}
}
# update the tag
$id3v2->write_tag();
}
$mp3->close();
}