# MP3 リスト作成スクリプト # '01/06/17 # カレント及びサブディレクトリ内から拡張子が .mp3 のファイルを検索し、 # {カレントディレクトリ名}.m3u というファイルにリストを出力する。 # 実行時の引数が存在するディレクトリ名なら、引数名のディレクトリをカレントとして扱う。 # 動作環境 # 日本語版Windows + Perl5 # 関連付けしてWindowsから起動、DOSウインドウ、Copalなどから実行。 # By H.Takahashi # mailto:nanashi@cat.plala.or.jp # '03/10/26 mp3list7.pl # ファイル名並べ替えの改良 # ファイル名に数字を含む場合に順番を考慮 # '03/10/29 # 同上 000と00を区別して扱うように # ($aa <=> $bb) を (($aa <=> $bb) or ($aa cmp $bb)) # にする use Cwd; if(-d $ARGV[0]){ chdir $ARGV[0]; } $cwd_mg = $cwd = cwd(); $cwd =~ s/\\$//; $cwd =~ m|^.*[\\/]([^\\/]*)$|; $dirname = $1; if($dirname eq ''){ $cwd =~ m|^(.*):|; $dirname = $1; } print <<"__MESSAGE__"; MP3ファイルのリストを作成します。 ファイル名は $cwd_mg\\$dirname.m3u です。 __MESSAGE__ open LIST, "> ./$dirname.m3u"; &listing('.'); close LIST; print <<"__MESSAGE__"; $count_dir ヶ所のディレクトリを検索しました。 $count_file 個のMP3ファイルを発見して $cwd_mg\\$dirname.m3u に記録しました。 __MESSAGE__ exit(); # # # sub listing{ my $dir = shift; my $now = $dir; my @sub_dir; my $sub; my $pwd; $count_dir++; opendir DIR, $dir; if($dir eq '.'){ $dir = ''; } else{ $dir .= '\\'; } @dir_list = grep{$_ =~ /\.mp3/i or -d "$now/$_"}(readdir DIR); foreach $file( sort{&filesort($a, $b)}(@dir_list) ){ if($file !~ /[^\.]/){ next; } if( -d "$now/$file" ){ push @sub_dir, $file; next; } print LIST $dir.$file."\n"; print STDOUT $dir.$file."\n"; $count_file++; } closedir DIR; foreach $sub( sort{ $a cmp $b }(@sub_dir) ){ $pwd = ($now eq '.') ?'' :$now.'\\'; &listing($pwd.$sub); } return(); } # '03/10/26 # ファイル名中の数字を考慮したソート関数 sub filesort{ # 考慮しなくていいならそれに越した事はない if($_[0] !~/\d/ or $_[1] !~/\d/){ return($_[0] cmp $_[1]); } my $a = $_[0]; my $b = $_[1]; my $temp; my $flag_n; my $an = 0; # $a,$bそれぞれに対する、比較中の my $bn = 0; # 位置を入れる my $aa; # $a,$bの切り取った my $bb; # 部分 my $break = 0; # 比較結果兼ループ判定 while(not $break){ $flag_n = $aa = $bb = undef; $temp = substr($a, $an, 1); if($temp =~ /\d/){ $flag_n = 1; $aa .= $temp; { $temp = substr($a, $an+1, 1); if($temp =~ /\d/){ $aa .= $temp; $an++; redo; } } } elsif($temp eq ''){ $break = -1; last; } $an++; $temp = substr($b, $bn, 1); if($temp =~ /\d/){ $flag_n = 1; $bb .= $temp; { $temp = substr($b, $bn+1, 1); if($temp =~ /\d/){ $bb .= $temp; $bn++; redo; } } } elsif($temp eq ''){ $break = 1; last; } $bn++; $break = $flag_n ? (($aa <=> $bb) or ($aa cmp $bb)) : ($aa cmp $bb); # '03/10/29 # 実は # $break = ($flag_n and $aa <=> $bb ) or ($aa cmp $bb); # でも良さそうな気がするけど放置で。 } return($break); }