Как добавить индикатор выполнения в WWW :: Mechanize? - PullRequest
7 голосов
/ 21 декабря 2009

У меня есть следующий код:

$mech->get($someurl, ":content_file" => "$i.flv");

Итак, я получаю содержимое URL и сохраняю его в виде файла FLV. Я хотел бы распечатывать каждую секунду или около того, сколько осталось загрузки. Есть ли способ сделать это в WWW :: Mechanize?

Ответы [ 2 ]

8 голосов
/ 21 декабря 2009

Большое спасибо ответу Питера Ковача за то, что он привел меня к правильному ответу. Это оказалось немного сложнее, чем я ожидал, поэтому я решил (ужас) ответить на свой вопрос.

Как показал Питер, я могу установить обратный вызов следующим образом:

$m->get($u, ":content_cb" => \&callback);

Но теперь я не могу сохранить контент, используя значение: 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
}

Надеюсь, это кому-нибудь поможет.

8 голосов
/ 21 декабря 2009

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
 }
...