一切、ぼくがろくにバックアップも取らず、色々なツールを試したがゆえの事なのだが。
機能はシンプルで、ファイルを読み込んで、フォルダ分けするだけ。こういうシンプルな機能のツールって気にいるのが無かったりしない??という訳で、無責任に公開します。
コードを表に出すのは初めてなので、少し怖いですが、目につくような所があればご指摘等頂ければ有難いです。
案外MP3のタグまわりはモジュールに投げたので楽だったのだがww、文字コードってハマるとつらいのね。。
参考
http://netlog.jpn.org/r271-635/2012/03/perl_mp3tag_id3v2.html
#!/usr/bin/perl
use warnings;
use MP3::Tag;
use Encode;
use Encode::Guess qw/shift-jis euc-jp 7bit-jis/;
use File::Copy 'move';
my @list = glob("*.mp3" );
foreach $name (@list){
my $mp3 = MP3::Tag->new($name) or die;
$mp3->get_tags() or die;
if (exists $mp3->{ID3v2}){
my $id3v2 = $mp3->{ID3v2};
my $title = $id3v2->get_frame('TIT2');
my $artist = $id3v2->get_frame('TPE1');
my $album = $id3v2->get_frame('TALB');
my $year = $id3v2->get_frame('TYER');
my $track = $id3v2->get_frame('TRCK');
my $genre = $id3v2->get_frame('TCON');
my $comment_hash = $id3v2->get_frame('COMM');
my $comment = undef;
if (defined($comment_hash)){
my %comments = %{$comment_hash};
$comment = $comments{'Text'};
}
my $copyright = $id3v2->get_frame('TCOP');
my $diskno = $id3v2->get_frame('TPOS');
my $decoder = Encode::Guess->guess($title);
ref($decoder) || die "Can't guess: $decoder";
my $utf8_flagged = utf8::is_utf8($title);
if ($utf8_flagged) {
Encode::_utf8_off($title);
}
$title = $decoder->decode($title);
decode $decoder, $track;
@t = split(/\//,$track);
$track = "0" . $t[0];
$title = substr($track,-2,2) . " " . $title . ".mp3";
if(defined($diskno)){
decode $decoder, $diskno;
@d = split(/\//,$diskno);
$title = $d[0] . "-" . $title;
}
encode 'utf8', $title;
$album =~ s/\\|\`|\/|\.|\:|\*|\?|\"|\>|\<|//g;
$artist =~ s/\\|\`|\/|\.|\:|\*|\?|\"|\>|\<|//g;
rename $name , $title;
if ( !-d "./" . $artist) {
mkdir "$artist";
}
if ( !-d "./" . $artist . "/" . $album) {
mkdir "$artist/$album";
}
move( $name , "./$artist/$album/$title");
}
$mp3->close();
}