#!perl.exe use warnings; use POE qw( Wheel::Run::Win32 Filter::Line); use POE::Component::Server::HTTPServer; use POE::Component::Server::HTTPServer::Handler; use POE::Component::JobQueue; use POE::Filter::Reference; use File::Basename; use Data::Dump qw(dump); my $port=8080; my $max_tasks=3; sub _start { my ( $kernel, $heap ) = @_[ KERNEL, HEAP ]; $heap->{child2} = POE::Component::Server::HTTPServer->new( port=>$port, handlers => [ "/add" => \&add_task, "/" => \&root_handler ] ); $heap->{child2}->create_server(); POE::Component::JobQueue->spawn ( Alias => 'passive', WorkerLimit => $max_tasks, Worker => \&make_a_worker, Passive => { } );} # =========== HTTP handlers ======== sub root_handler { my $context = shift; print "\nroot_handler ===request===\n"; print "root_handler: uri: ",$context->{request}->uri,"\n"; $context->{response}->code(200); $context->{response}->content( "

Hi There

\n" ); return H_FINAL; } sub add_task { my $context = shift; print "\nadd_task ===request===\n"; print "add_task uri: ", $context->{request}->uri,"\n"; $context->{request}->uri=~/\/add\?(.*)/; my @job_params=($1); POE::Kernel->post( 'passive', 'enqueue', 'postback', @job_params ); $context->{response}->code(200); $context->{response}->content( "

add task ".join(" ",@job_params)."

\n" ); return H_FINAL; } # =========== JobQueue handlers ======== sub make_a_worker { my ($postback, $message) = @_; POE::Session->create( inline_states => { _start => \&worker_start, worker_child_stdout => \&worker_child_stdout, worker_closed => \&worker_closed, sig_child => \&sig_child }, args => [ @_ ] ); } sub worker_start { my ($kernel, $session, $heap, @args ) = @_[KERNEL, SESSION, HEAP, ARG0 .. $#_]; $heap->{postback}=$args[0]; $heap->{message} =$args[1]; # file name $heap->{SessionID} = $session->ID; print " -start_message_process: ".$heap->{SessionID}."\n"; my @ffmpeg_args=("-y","-i","","-acodec","pcm_s16le","-ar","16000","-ab","16000","-ac","1",""); $ffmpeg_args[2] =$args[1]; my ($name,$path,$suffix) = fileparse($args[1],(".mpg")); $ffmpeg_args[11]="$path\\$name.wav"; $heap->{stage}="ffmpeg"; $heap->{cmdlinefish} = POE::Wheel::Run::Win32->new( Program => "ffmpeg", ProgramArgs => \@ffmpeg_args, StdoutEvent => "worker_child_stdout", StderrEvent => "worker_child_stdout", CloseEvent => "worker_closed", StdioFilter => POE::Filter::Line->new(), # Child speaks in lines. StderrFilter => POE::Filter::Line->new(), # Child speaks in lines. ); } sub worker_child_stdout { my ( $heap, $preargs ) = @_[ HEAP, ARG0 ]; print "-worker_child: session ",$heap->{SessionID}," ",$preargs,"\n"; $heap->{results}=$preargs; } sub worker_closed { my ( $kernel, $heap ) = @_[ KERNEL, HEAP ]; my $postback=$heap->{postback}; my $results=$heap->{results}; if($heap->{stage} eq "ffmpeg") { if($results =~ /video:\d+kB audio:(\d+)kB global headers:\d+kB/) { $results = ($1>0)?"Ok":"fail"; }else{ $results = "fail"; } } else { } $postback->(($results)); print "-worker_closed: $results\n"; } sub sig_child { my ( $heap, $sig, $pid, $exit_val ) = @_[ HEAP, ARG0, ARG1, ARG2 ]; my $details = delete $heap->{cmdlinefish}; print " -sig_child\n"; return 0; } # ========== my @handlers = qw( _start make_a_worker ); # worker_start worker_child_stdout worker_closed root_handler add_task POE::Session->create( package_states => [ main => \@handlers ] ); POE::Kernel->run(); exit 0; __END__