my $REQUESTS = [ { uri => "http://post.audioscrobbler.com", params => [ hs => 'true', p => '1.1', c => $CLIENT_ID, v => $CLIENT_VER, u => $USER, ], responses => [ { name => 'Successful handshake', content_pattern => qr/^UPTODATE\n([^\n]+)\n([^\n]+)\nINTERVAL (.*)/, requests => sub { my ($md5, $submit, $interval) = @_; my $hash = md5_hex(md5_hex($PASS) . $md5); print "Pausing $interval\n"; sleep $interval; return ( { uri => $submit, params => [ u => $USER, s => $hash, 'a[0]' => 'Test Artist', 't[0]' => 'Test Track', 'b[0]' => 'Test Album', 'm[0]' => '', 'l[0]' => 5*60, 'i[0]' => strftime("%Y-%m-%d %H:%M:%S", gmtime), ], responses => [ { name => 'Successful submission', content_pattern => qr/^OK\nINTERVAL (.*)/, requests => sub { print "Pausing $_[0]\n"; sleep $_[0]; return; }, }, { name => 'Failed submission', content_pattern => qr/^FAILED ([^\n]*)/, requests => sub { print "Failure: $_[0]\n"; return; }, }, { name => 'Failed authentication', content_pattern => qr/^BADAUTH/, }, ] }, ); }, }, { content_pattern => qr/^UPDATE/ }, { content_pattern => qr/^FAILED/ }, { content_pattern => qr/^BADUSER/ }, ], }, ]; #### sub handle_requests { my ($agent, $requests, @params) = @_; my @requests; if (ref $requests eq 'ARRAY') { @requests = @$requests; } elsif (ref $requests eq 'CODE') { @requests = $requests->(@params); } for (@requests) { my $uri = URI->new($_->{uri}); $uri->query_form($_->{params}); print "Request: $uri\n"; my $response = $agent->get($uri); unless ($response->is_success) { die $response->status_line; } for (@{ $_->{responses} }) { if (my @groups = $response->content =~ $_->{content_pattern}) { my $name = $_->{name} || "Matched $_->{content_pattern}"; print "Response: $name\n"; handle_requests($agent, $_->{requests}, @groups); } } } }