2013年8月16日金曜日

音楽ファイルの管理の方法 perl

家にある音楽ファイルがitunesで管理するには数が多くなってきたし、どうやら迷子のファイルもあるようだったし、タグに書き込まれてる文字コードもバラバラだし、mp3プレーヤーの中でファイル名が文字化けしたりするので、整理するプログラムを作った。
一切、ぼくがろくにバックアップも取らず、色々なツールを試したがゆえの事なのだが。

機能はシンプルで、ファイルを読み込んで、フォルダ分けするだけ。こういうシンプルな機能のツールって気にいるのが無かったりしない??という訳で、無責任に公開します。
コードを表に出すのは初めてなので、少し怖いですが、目につくような所があればご指摘等頂ければ有難いです。

案外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();
}