プレイリスト生成

#!/usr/local/bin/perl
#!/usr/bin/perl
#!/bin/perl
# ヽ(京)ノ
use DirHandle;
use constant MINUTE => 60;
use constant HOUR   => 60 * MINUTE;
use constant DAY    => 24 * HOUR;

use Fatal  qw( open sysopen close seek );

# ISO 6429
    use Term::ANSIColor qw(:constants);
    $Term::ANSIColor::AUTORESET = 1;

do 'config.pl';
do "$ENV{HOME}/autoytb.conf";
$DLDIR ||= '/tmp/';
$base = $DLDIR;
$playlist = 'playlist.pls';

$t = time;
$d = new DirHandle $base;
if (defined $d) {
    while (defined($_ = $d->read)) {
		print "\n";
		next if(/^\.\.?$/); # . .. ignore
		next unless(-d "$base$_"); # dir only
		print GREEN " --- playlist maker* $_";

		if(-f "$base$_/$playlist" ) {
			($write_time)=(stat("$base$_/$playlist"))[9];
			printf(GREEN . " --- exist($base$_/$playlist), " . CYAN . "%u days ago", ($t - $write_time)/DAY);
			
			next if(($t - $write_time)/DAY<2); # 2day?
		}
		print YELLOW " => do";
		&make_playlist("$base$_/");
	}
    undef $d;
}




# DIR のみ取り出す
sub make_playlist
{
	($dir) = @_;

	my %fhash = ();
	# ファイル...
	my $d = new DirHandle $dir;
	if (defined $d) {
   	 	while (defined($_ = $d->read)) {
			next if(/^\.\.?$/); # . .. ignore
			next unless(-f "$dir$_"); # file only
			next unless(/\.(avi|mpeg|flv|wmv|divx?|rm|asf|mov|mp4|3gp|mp3|aac|wma|swf)$/i); # . .. ignore

			my $file = $_;

			# 日本語数字 適当に対応
			s/1/1/g;
			s/2/2/g;
			s/3/3/g;
			s/4/4/g;
			s/5/5/g;
			s/6/6/g;
			s/7/7/g;
			s/8/8/g;
			s/9/9/g;
			s/0/0/g;

			# 漢数字('A`) 日本語のややこしさここに極まり('A`)
			# 二桁以上はこんな感じにしとこう
			# e.g.:三千五百八十九 => 3589
			s/一(十|捨|百|珀|千|阡|万|萬)?/1/g;		s/壱(十|捨|百|珀|千|阡|万|萬)?/1/g;
				s/弌(十|捨|百|珀|千|阡|万|萬)?/1/g;		s/壹(十|捨|百|珀|千|阡|万|萬)?/1/g;

			s/二(十|捨|百|珀|千|阡|万|萬)?/2/g;		s/弐(十|捨|百|珀|千|阡|万|萬)?/2/g;
				s/貮(十|捨|百|珀|千|阡|万|萬)?/2/g;		s/貳(十|捨|百|珀|千|阡|万|萬)?/2/g;

			s/三(十|捨|百|珀|千|阡|万|萬)?/3/g;		s/参(十|捨|百|珀|千|阡|万|萬)?/3/g;
			s/四(十|捨|百|珀|千|阡|万|萬)?/4/g;		s/肆(十|捨|百|珀|千|阡|万|萬)?/4/g;
			s/五(十|捨|百|珀|千|阡|万|萬)?/5/g;		s/伍(十|捨|百|珀|千|阡|万|萬)?/5/g;
			s/六(十|捨|百|珀|千|阡|万|萬)?/6/g;		s/陸(十|捨|百|珀|千|阡|万|萬)?/6/g;
			s/七(十|捨|百|珀|千|阡|万|萬)?/7/g;		s/漆(十|捨|百|珀|千|阡|万|萬)?/7/g;
				s/貭(十|捨|百|珀|千|阡|万|萬)?/7/g;		s/質(十|捨|百|珀|千|阡|万|萬)?/7/g;

			s/八(十|捨|百|珀|千|阡|万|萬)?/8/g;		s/捌(十|捨|百|珀|千|阡|万|萬)?/8/g;
			s/九(十|捨|百|珀|千|阡|万|萬)?/9/g;		s/玖(十|捨|百|珀|千|阡|万|萬)?/9/g;

			s/〇/0/g;		s/零/0/g;

			s/十 /10/g;		s/捨/10/g;
			s/百/100/g;		s/珀/100/g;
			s/千/1000/g;	s/阡/1000/g;
			s/万/10000/g;	s/萬/10000/g;

			# おまえらも結構ややこしいぜ
			s/①/_1_/g;
			s/②/_2_/g;
			s/③/_3_/g;
			s/④/_4_/g;
			s/⑤/_5_/g;
			s/⑥/_6_/g;
			s/⑦/_7_/g;
			s/⑧/_8_/g;
			s/⑨/_9_/g;
			s/⑩/_10_/g;
			s/⑪/_11_/g;
			s/⑫/_12_/g;
			s/⑬/_13_/g;
			s/⑭/_14_/g;
			s/⑮/_15_/g;
			s/⑯/_16_/g;
			s/⑰/_17_/g;
			s/⑱/_18_/g;
			s/⑲/_19_/g;
			s/⑳/_20_/g;

			# フェイク
			s/FIN(AL)?/_9999999999_/ig;
			s/END/_99999999_/ig;
	#		s/OP(enn)?(ing)?/_0_/ig;
	#		s/En?d(ing)?/_9999999_/ig;

			# 数値だけ抜き出し
			while(1)
			{
				/(\d+)/ or last;
				$fhash{$file} .= sprintf( "%032d", $1);
				$_ = $';
			}

			# 最後にファイル名添加して微妙な物を選別できる幼にする
			$fhash{$file} .= $file;
		}

	    undef $d;
	}

	# 数値のみでソーティング
	@keys = sort { $fhash{$a} cmp $fhash{$b} } keys %fhash;
	$entry=$#keys+1;

	# ファイルがなければ次へ
	unless(@keys)
	{
		unlink "$dir$playlist" or do print RED "$dir$playlist ($!)." and do print GREEN "=>ok.";
		return;
	}
	
	print GREEN " => make";
	# playlist.pls として保存 nkfパイプ
	open PLS, "| nkf --cp932 -s > \'$dir$playlist$$.work\'" or die $!;
	# plsファイル生成
	print PLS <<"_PLAYLIST_";
[playlist]
NumberOfEntries=$entry
Version=2
_PLAYLIST_

	$cnt = 1;
	foreach(@keys)
	{
		print PLS "File$cnt=$_\n";
		$cnt ++;
	}
	close PLS;

	rename "$dir$playlist$$.work","$dir$playlist" or die $!;

	print GREEN " => done.";
	return;
};
;