Created
April 24, 2012 23:04
-
-
Save gypark/2484469 to your computer and use it in GitHub Desktop.
MP3 Duduper Core
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
use 5.010; | |
use utf8; | |
use strict; | |
use warnings; | |
use autodie; | |
use File::Find; | |
use MP3::Info; | |
use Digest::MD5 qw/ md5_hex /; | |
use Fcntl qw/ :seek /; | |
use Encode qw/ encode decode decode_utf8 /; | |
use Dancer; | |
binmode STDIN, ':utf8'; | |
binmode STDOUT, ':utf8'; | |
my %mp3; | |
my $file_encode = 'utf8'; | |
my @directories_to_search = ( shift || q{.} ); | |
find(\&wanted, @directories_to_search); | |
for my $key (keys %mp3) { | |
next if @{$mp3{$key}} == 1; | |
say "$key =>"; | |
say " $_" for @{$mp3{$key}}; | |
say ""; | |
} | |
sub wanted { | |
say($File::Find::name), return if -d; # 디렉토리의 경우, 진행사항을 표시하고 건너뜀 | |
return if -s == 0; # 파일 크기가 0 인경우 건너뜀 | |
return if /^\./; # 파일명이 . 으로 시작하는 파일은 무시 | |
return unless -R; # 읽기 권한이 없는 경우 건너뜀 | |
return unless /\.mp3$/i; # 파일명이 .mp3로 끝나는 파일만 검사 | |
my $info = get_mp3info($_); | |
if (!$info) { | |
warn("ERROR: $File::Find::name\n"); | |
return; | |
} | |
# MP3의 오디오 스트림의 MD5를 구해서 Key 생성후 배열에 저장 | |
my $key = get_mp3_md5($_, $info); | |
push @{ $mp3{$key} }, decode($file_encode, $File::Find::name); | |
} | |
sub get_mp3_md5 { | |
my $file = shift; | |
my $info = shift || get_mp3info($file); | |
my $data; | |
open my $fh, '<', $file; | |
binmode $fh; | |
seek $fh, $info->{OFFSET}, SEEK_SET; | |
read $fh, $data, $info->{SIZE}; | |
close $fh; | |
return md5_hex($data); | |
} | |
# --------------------------------------------------------- | |
# Let's Dance | |
# --------------------------------------------------------- | |
set content_type 'application/json'; | |
set serializer => 'JSON'; | |
set charset => 'utf-8'; | |
set layout => undef; | |
set public => '.'; | |
get '/' => sub { | |
content_type 'text/html'; | |
send_file 'index.html'; | |
}; | |
get '/list' => sub { | |
return \%mp3; | |
}; | |
post '/remove' => sub { | |
if (params->{file}) { | |
my $file = decode_utf8(params->{file}); | |
if (unlink encode($file_encode, $file)) { | |
return { | |
result => 'ok', | |
file => params->{file}, | |
}; | |
} | |
else { | |
debug("Could not unlink $file : $!"); | |
return { | |
result => 'error', | |
message => $!, | |
file => params->{file}, | |
}; | |
} | |
} | |
else { | |
return { | |
result => 'error', | |
message => 'parameter is missing', | |
}; | |
} | |
}; | |
dance; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment