package xmlrtorrent; use strict; use Data::Dumper; sub new { my $class = shift; my $self = {@_}; return bless($self, $class); } # This is shamelessly stolen from pythons urlgrabber sub _format_number { my $number = shift; my $SI = shift || 0; my @symbols = ('', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'); my $step = $SI?1000:1024; my $thresh = 999; my $depth = 0; my $max_depth = $#symbols; my $format; while (($number > $thresh) and ($depth < $max_depth)) { $depth += 1; $number /= $step; } if ($number =~ /^[+-]?\d+$/) { # Integer. $format = '%i%s'; } elsif ($number < 9.95) { $format = '%.1f%s'; } else { $format = '%.0f%s'; } return sprintf($format, $number, $symbols[$depth]); } sub load_start { my $self = shift; my $talker = shift; my $URL = shift; my $res; $res = $talker->send_request('load_start', $URL); unless(ref($res)) { $self->{'__ERROR'} = $res; return undef } if ($res->is_fault()) { $self->{'__ERROR'} = $res->value()->{'faultString'}; return undef; } return 1; } sub download_list { my $self = shift; my $talker = shift; my $res; $res = $talker->send_request('d.multicall', '', 'd.get_name=', 'd.get_size_bytes=', 'd.get_bytes_done=', 'd.get_up_rate=', 'd.get_down_rate=', 'd.is_active='); unless(ref($res)) { $self->{'__ERROR'} = $res; return undef } if ($res->is_fault()) { $self->{'__ERROR'} = $res->value()->{'faultString'}; return undef; } my @ret = (); foreach (@{$res->value()}) { push @ret, { 'NAME' => $_->[0]->value(), 'SIZE_BYTES' => _format_number($_->[1]->value()), 'BYTES_DONE' => _format_number($_->[2]->value()), 'UP_RATE' => _format_number($_->[3]->value()), 'DOWN_RATES' => _format_number($_->[4]->value()), 'ACTIVE' => $_->[5]->value(), }; } return \@ret; } sub errstr { my $self = shift; return $self->{'__ERROR'}; } 1;