Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use Proc::Daemon;
- use HTTP::Tiny;
- use JSON;
- $daemon = Proc::Daemon->new();
- $sabSlowchecker = $daemon->Init;
- unless ( $sabSlowchecker ) {
- my $settings = {
- sabIP => '10.0.0.10',
- sabPort => '8080',
- sabAPIKey => 'asdasdc5debca44fc195cb46asdasdasd',
- minkbSec => 2000, #~ threshold in Kb/s before flagging download as slow
- threshold => 2, #~ needs to be below minkbSec for at least this amount of loops (interval * threshold = time in seconds), 0 for immediate
- interval => 15, #~ time in seconds between checks
- };
- my $httpClient = HTTP::Tiny->new;
- my $markedAsSlow = 0;
- my $SlowIncr = 0;
- while(1){
- checkSpeed();
- sleep $settings->{interval}
- }
- sub checkSpeed
- {
- my $queue = getData();
- if(!$queue){
- #~ paused, no que, not reachable, bla bla
- return 0;
- }
- #~ no need to check if we are were we need to be when we already are where we are supposed to be.
- if($queue->{speedlimit} ne ''){
- #~ dont want to trigger too soon
- $threshold = int(0.9 * $queue->{speedlimit});
- if(int($queue->{kbpersec}) >= $threshold){
- #~ we're at max speed
- return 0;
- }
- }
- my $first = $queue->{slots}[0];
- if(!$first || $first->{priority} eq 'Low'){
- #~ we need faster downloads!
- return 0;
- }
- my @his = split(':',$first->{timeleft});
- my $seconds = ( $his[0] * 3600 ) + ( $his[1] * 60 ) + $his[2];
- if($seconds < 1){
- #~ yes, I like it shaved
- return 0;
- }
- my $kbsec = int(($first->{mbleft} / $seconds) * 1024);
- if($kbsec < $settings->{minkbSec}){
- #~ ok, it's slow now..
- if($markedAsSlow && $markedAsSlow eq $first->{nzo_id}){
- $SlowIncr++;
- if(($SlowIncr) < $settings->{threshold}){
- return 1;
- }
- my $set = setPriority($first->{nzo_id});
- #~ if ok, free result
- if($set){
- $markedAsSlow = 0;
- $SlowIncr = 0;
- }
- return 1;
- }
- $markedAsSlow = $first->{nzo_id};
- return 0;
- }
- }
- sub getData
- {
- my $response = $httpClient->get('http://' . $settings->{sabIP} . ':' . $settings->{sabPort} . '/api?mode=queue&start=0&limit=1&output=json&apikey=' . $settings->{sabAPIKey});
- if(!$response->{success}){
- return 0;
- }
- my $jsonDecode = decode_json($response->{content});
- if($jsonDecode->{queue}->{paused_all}){
- return 0;
- }
- return $jsonDecode->{queue};
- }
- sub setPriority
- {
- my ($nzo_id) = @_;
- my $response = $httpClient->get('http://' . $settings->{sabIP} . ':' . $settings->{sabPort} . '/api?mode=queue&name=priority&value=' . $nzo_id . '&value2=-1&apikey=' . $settings->{sabAPIKey});
- return $response->{success};
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment