Автор Тема: Perl download script и status bar  (Прочетена 3831 пъти)

Gaara

  • Напреднали
  • *****
  • Публикации: 631
  • Distribution: Debian
  • Window Manager: E17
    • Профил
Perl download script и status bar
« -: May 20, 2007, 23:08 »
Здравейте,
искам да попитам дали някой знае, как може да се направи статус на свалящата се информация, т.е. моят нет е бърз и при свалянето на даден файл, нямам  забавяне, но ако нета е бавен?
Ето и примера, който се опитвам да модифицирам
Примерен код

#!/usr/bin/perl -w
use LWP::Simple;
print "Downloading bg_nets.txt, please wait ...\n";
my $url = "http://ip.ludost.net/cgi/process?country=1&country_list=bg&format_template=prefix&format_name=&format_target=&format_default=";
my $file="bg_nets.txt";
my $response = getstore($url, $file);


Идеята ми е по време на свалянето, да изписва нещо от сорта на
50%[***********                           ]
или някаква друга индикация.

Благодаря предварително.
Активен

Last night, Darth Vader came down from planet Vulcan and told me that if you don't install Debian, he'd melt your brain.

PERMANENT

  • Напреднали
  • *****
  • Публикации: 94
    • Профил
Perl download script и status bar
« Отговор #1 -: May 21, 2007, 11:31 »
Да ти кажа да се работи с модулите на перл не е лесто защото все нещо им куца и трудно се съчетават помежду си.Та по същество... може да ползваш функцията head($url) от модула LWP::Simple за да видиш колко е голям фаила които сваляш след това може да отделиш един дъщерен процес които периодично да проверява колко е голям фаила $file и да изписва каква част се е дръпнала.За да се получи такъв ефект не забравяи че stdout-а на дъщерния процес трябва да е насочен към същия терминал които ползва и главния процесл.Имам някакви бледи спомени че една програма не перл не може да отваря един и същи фаил няколко пъти но ако го правиш в различни процеси предполатам че няма да има проблеми.М/у другото пробваи да направиш нещо от този род

while(getstore($url, $file)){
print '*';
}

може и да стане нещо но малко ме съмнява че ще се получи този ефект '<img'>
Активен

Gaara

  • Напреднали
  • *****
  • Публикации: 631
  • Distribution: Debian
  • Window Manager: E17
    • Профил
Perl download script и status bar
« Отговор #2 -: May 21, 2007, 21:51 »
Цитат (PERMANENT @ Май 21 2007,12:31)
Та по същество... може да ползваш функцията head($url) от модула LWP::Simple за да видиш колко е голям фаила които сваляш след това може да отделиш един дъщерен процес които периодично да проверява колко е голям фаила $file и да изписва каква част се е дръпнала.За да се получи такъв ефект не забравяи че stdout-а на дъщерния процес трябва да е насочен към същия терминал които ползва и главния процесл.

Благодаря за отговора, но с цикъла нищо не стана :'(
Може ли малко инфо да ми препоръчаш, за извадката от отговора ти?
Реших, че ако не открия подходяш вариант, то този процес ще го вкарам във фонов режим. Така няма да държи конзолата и никой няма да разбере за свалянето, стига само да не е с модем  '<img'>
Активен

Last night, Darth Vader came down from planet Vulcan and told me that if you don't install Debian, he'd melt your brain.

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Perl download script и status bar
« Отговор #3 -: May 21, 2007, 22:37 »
Ако целта ти е само това то:

Примерен код

#!/usr/bin/perl

print "Getting file... Please, wait ...\n";

`wget "http://ip.ludost.net/cgi/process?country=1&country_list=bg&format_template=prefix&format_name=&format_target=&format_default=" -O bg_nets.txt`;

print "Done! \n";



'<img'> '<img'>



Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

PERMANENT

  • Напреднали
  • *****
  • Публикации: 94
    • Профил
Perl download script и status bar
« Отговор #4 -: May 22, 2007, 10:38 »
с wget също става '<img'>
Примерен код
#!/usr/bin/perl
use LWP::Simple;
$url='';
$file='';
$file_size=(head($url))[1];
getstore($url,$file);
if(fork()){
$SIG{CHLD}='IGNORE';
while((-s $file)<=$file_size){
#тука правиш някъкви математиески изчисления и принтираш резултата
sleep 1;
}
}

може да има синтактични грешки не съм тествал да ли работи но като цяло това исках да ти предложа
Активен

Gaara

  • Напреднали
  • *****
  • Публикации: 631
  • Distribution: Debian
  • Window Manager: E17
    • Профил
Perl download script и status bar
« Отговор #5 -: May 22, 2007, 23:36 »
Да, с wget става също и за него се бях сетил в самото начало, но ми беше интересно дали може и в пърл. Много благодаря за помоща. Имам почти незначителен напредък, т.е.
Примерен код

#!/usr/bin/perl
use strict;
use warnings;
use Term::ProgressBar;
use LWP::Simple;
use File::stat;
my $file="bg_nets.txt";
my $url = "http://ip.ludost.net/cgi/process?country=1&country_list=bg&format_template=prefix&format_name=&format_target=&format_default=";
getstore($url,$file);
my $filesize = stat("bg_nets.txt")->size;
my $progress = Term::ProgressBar->new({count =>$filesize, name=>"Downloading"});
my $j=0;
while($j<=(stat("bg_nets.txt")->size)) {
my $is_power = 0;
for(my $i = 0; 2**$i <= $j; $i++) {
$is_power = 1
if 2**$i == $j;
}
$progress->update($j);
$j++;
}

Файла първо се сваля, след това му се взима големината и чак тогава влиза в цикъла и почват процентите. Мисля, че за толкова малък файл, това ще е достъчно, но ще се  радвам на всяка друга насока от ваша страна '<img'>

Всичко най-свежо от мен.
Активен

Last night, Darth Vader came down from planet Vulcan and told me that if you don't install Debian, he'd melt your brain.

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Perl download script и status bar
« Отговор #6 -: May 23, 2007, 00:20 »
Gaara ... чак ми иде да ти се накарам '<img'>

http://www.google.com/search?....loading

все пак първи линк е '<img'>

ПП: Пробвах го - ОК е '<img'>
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Perl download script и status bar
« Отговор #7 -: May 23, 2007, 02:17 »
Тъкмо се наканих да ти пращам същото, но видях, че VladSun ме е преварил  '<img'>
Все пак ще се отбележа с една лека модификация. Тъй като при онзи скрипт пътя до файла се задава при изпълнението на скрипта, т.е.
/home/user/script http://bla.bla/file
ето как трябва да стане, за да вкараме адреса към файла вътре в скрипта
Примерен код
#!/usr/bin/perl -w
use strict;
use Term::ProgressBar;
use URI;
use LWP::UserAgent;
    
my $ua = LWP::UserAgent->new;
    
my $url = 'http://ip.ludost.net/cgi/process?country=1&country_list=bg&format_template=prefix&format_name=&format_target=&format_default=bg_nets.txt';
print "$url:\n";
    
my $uri = URI->new($url);
my $path = $uri->path;
$path =~ s{.*/}{};
$path = "download" unless length $path;
$path = "X$path" while -e $path;
    
open my $outhandle, ">", $path or die "Cannot create $path: $!";
    
my $bar = Term::ProgressBar->new({ name => 'Download',
    count => 1024,
    ETA => 'linear'});
    
my $output = 0;
my $target_is_set = 0;
my $next_so_far = 0;
$ua->get
    ($url,
    ":content_cb" => sub {
    my ($chunk, $response, $protocol) = @_;
    
    unless ($target_is_set) {
    if (my $cl = $response->content_length) {
   $bar->target($cl);
   $target_is_set = 1;
    } else {
   $bar->target($output + 2 * length $chunk);
    }
    }
    
    $output += length $chunk;
    print {$outhandle} $chunk;
    
    if ($output >= $next_so_far) {
   $next_so_far = $bar->update($output);
    }
    });
    
$bar->target($output);
$bar->update($output);

Скрипта в оригинал е по-гъвкав при използване от потребител, за да си тегли файлчета. Преработката, според мен, е по-лесна за използване в crontab-ове и като boot скрипт.



Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

Gaara

  • Напреднали
  • *****
  • Публикации: 631
  • Distribution: Debian
  • Window Manager: E17
    • Профил
Perl download script и status bar
« Отговор #8 -: May 24, 2007, 13:42 »
Блгодаря ви за помоща. Получи се доста .... свежо  '<img'>

Всичко най ви желая
Активен

Last night, Darth Vader came down from planet Vulcan and told me that if you don't install Debian, he'd melt your brain.

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Perl script
Настройка на програми
skuller 6 2525 Последна публикация Jan 25, 2007, 22:54
от zeridon
perl script date-time
Общ форум
dvbb 3 2391 Последна публикация Apr 01, 2010, 18:35
от dvbb
Perl script за blacklist за squid ПРОБЛЕМ!
Общ форум
mishot 12 3908 Последна публикация Jun 29, 2010, 12:12
от mishot
dovecot STATUS: Mailbox doesn't exist: INBOX
Настройка на програми
theshit 2 1835 Последна публикация Apr 05, 2014, 19:43
от theshit
Status bar - LibreOffice Writer
Настройка на програми
new_2k 14 4049 Последна публикация Mar 22, 2018, 19:52
от new_2k