<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Vidul Nikolaev Petrov: downloader</title>
    <link>http://www.vidul.com/articles/2008/06/09/downloader</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>downloader</title>
      <description>&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_perl "&gt;#!/usr/bin/perl

use strict;
use warnings;
use WWW::Mechanize;
use LWP::Simple;
use Data::Dumper;
use Time::HiRes qw( usleep tv_interval gettimeofday );
$|++;
my $url  = shift || die &amp;quot;no url given!\n&amp;quot;;
my $ext  = shift || 'mp3'; #die &amp;quot;no file extention given!\n&amp;quot;;
my $mech = WWW::Mechanize-&amp;gt;new(agent=&amp;gt;&amp;quot;Mozilla/5.0&amp;quot;);
my $ua   = LWP::UserAgent-&amp;gt;new;
my %seen;

$mech-&amp;gt;get($url);
$ua-&amp;gt;timeout(5);

my $links = $mech-&amp;gt;links;

no warnings;
my $c = 0;
for my $link ( @{$links} ) {
        my $url  = $link-&amp;gt;url_abs;
        my $res  = $ua-&amp;gt;head($url);
        my $http_res   = HTTP::Response-&amp;gt;new($res);
        my $abs_name   = $http_res -&amp;gt;{'_rc'}-&amp;gt;{'_previous'}-&amp;gt;{'_headers'}-&amp;gt;{'location'};
        my ($rel_name) = $abs_name =~ /.+\/(.+)$/;
        my $local_name = $rel_name;

        $seen{$local_name}++ and next;

        if( $rel_name =~ /\Q$ext\E$/i ){
                $rel_name =~ s/\%\d+/ /g;
                $rel_name =~ s/(.{35}).+/$1.../;
                print(pack('A45', &amp;quot;[$rel_name]&amp;quot;), &amp;quot;  is being downloaded ... &amp;quot;);
                my $s_time = q{};
                my $e_time = q{};
                my $flag = [];

                for( 1..5 ){
                        local $SIG{ALRM} = sub { die(&amp;quot;timeout&amp;quot;) };
                        eval {
                           alarm(10);
                           $flag = [head($abs_name)];
                           alarm(0);
                        };
                        next if $@ =~ m|timeout|;
                        last if $@ !~ m|timeout|;
                }

                if( $flag-&amp;gt;[0] ){
                        $c++;
                        $s_time = [gettimeofday];
                        getstore($abs_name, $c.&amp;quot;-&amp;quot;.$local_name);
                        $e_time = tv_interval ($s_time, [gettimeofday]);
                }

                $e_time =  $e_time ? $e_time . &amp;quot; seconds&amp;quot; : 'less than 1 milisecond';
                print &amp;quot;timeout failure in $e_time seconds :(\n&amp;quot; and next if $@;
                print &amp;quot;done in $e_time\n&amp;quot;;
        }
}

`ruby -e 'Dir[&amp;quot;*&amp;quot;].each{|f| File.rename f, f.sub(/^\d+-/, &amp;quot;&amp;quot;)}'`;
`ruby -e 'Dir[&amp;quot;*&amp;quot;].each{|f| File.rename f, f.gsub(/%20/, &amp;quot;_&amp;quot;)}'`;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 09 Jun 2008 02:09:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:a51394b9-1530-46c3-aa0f-585324581bb5</guid>
      <author>root</author>
      <link>http://www.vidul.com/articles/2008/06/09/downloader</link>
      <category>Perl</category>
      <category>administration</category>
    </item>
  </channel>
</rss>
