Skip to content

Instantly share code, notes, and snippets.

@gypark
Created April 24, 2012 23:04
Show Gist options
  • Save gypark/2484469 to your computer and use it in GitHub Desktop.
Save gypark/2484469 to your computer and use it in GitHub Desktop.
MP3 Duduper Core
#!/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