私は次のコードを持っています:
$mech->get($someurl, ":content_file" => "$i.flv");
だから私はURLの内容を取得してflvファイルとして保存しています。残りのダウンロード量を1秒ごとに印刷したいのですが。WWW :: Mechanizeでこれを達成する方法はありますか?
私は次のコードを持っています:
$mech->get($someurl, ":content_file" => "$i.flv");
だから私はURLの内容を取得してflvファイルとして保存しています。残りのダウンロード量を1秒ごとに印刷したいのですが。WWW :: Mechanizeでこれを達成する方法はありますか?
WWW::Mechanize
get
メソッドはLWP::UserAgentの「行儀の良い」オーバーロードであると言いget
ます。LWP :: UserAgentのドキュメントを見るとcontent_cb
、ダウンロードしたファイルの各チャンクで呼び出されるキーを提供できます。
$mech->get( $someurl, ":content_cb" => \&callback );
sub callback
{
my( $data, $response, $proto ) = @_;
# save $data to $i.flv
# print download notification
}
私を正しい答えに導いてくれたPeterKovacsの答えに感謝します。思ったより少し凝っていたので、(ホラー)自分の質問に答えることにしました。
Peterが示したように、次のようにコールバックを設定できます。
$m->get($u, ":content_cb" => \&callback);
しかし、2つのうち1つしか選択できないため、:content_file値を使用してコンテンツを保存することはできません。コールバック関数にデータが渡され、代わりにファイルに書き込むことになりました。
また、friedoが指摘したように、コンテンツの合計サイズを含む応答オブジェクトを取得します。したがって、これまでに受信したコンテンツの現在の合計を保持し、それを合計コンテンツで割ることにより、コンテンツの何パーセントがダウンロードされたかを知ることができます。完全なコールバック関数は次のとおりです。
open (VID,">$i.flv") or die "$!";
$total = 0;
sub callback
{
my( $data, $response, $proto ) = @_;
print VID "$data"; # write data to file
$total+= length($data);
$size = $response->header('Content-Length');
print floor(($total/$size)*100),"% downloaded\n"; # print percent downloaded
}
それが誰かに役立つことを願っています。