I am using Perl with WWW::Mechanize to download an MP3 file which is served in chunks of 400KB (around 20 seconds).
When I save the data with binmode on the file handle, appending each chunk as it arrives, only the first chunk is played correctly; the rest is not.
When I don't use binmode I can't play the whole file -- it plays but sounds interesting!
This is my program
use WWW::Mechanize;
$agent = WWW::Mechanize->new( cookie_jar => {} );
@links = ("http://thehost.com/chunk1","http://thehost.com/chunk2","http://thehost.com/chunk3");
foreach (@links){
$agent->get($_);
my $filename = 'test.mp3';
open(my $fh, '>>', $filename) or die "Could not open file '$filename' $!";
binmode $fh;
print $fh $agent->content;
close $fh;
}
What am I doing wrong?
Update
These are the HTTP headers that are being returned.
Cache-Control: public
Connection: close
Date: Tue, 28 Oct 2014 18:38:37 GMT
Pragma:
Server: Apache
Content-Length: 409600
Content-Type: application/octet-stream
Expires: Sat, 24 Oct 2015 12:08:00 GMT
Access-Control-Allow-Origin: *
Client-Date: Tue, 28 Oct 2014 18:38:28 GMT
Client-Peer: **.**.***.***:80
Client-Response-Num: 1
I suspect the content is served with incorrect headers, and as you are using the API that automatically decodes, this corrupts the octet stream.
Use the
mirrormethod instead and concatenate the files after downloading.