[BACK]Return to CurrentTorrents.pl CVS log [TXT][DIR] Up to [local] / openbsd / OpenBSDTorrents

Diff for /openbsd/OpenBSDTorrents/CurrentTorrents.pl between version 1.27 and 1.30

version 1.27, 2010/01/05 19:43:44 version 1.30, 2010/02/25 18:03:01
Line 1 
Line 1 
 #!/usr/bin/perl -T  #!/usr/bin/perl -T
 #$RedRiver: CurrentTorrents.pl,v 1.26 2009/10/20 19:04:28 andrew Exp $  #$RedRiver: CurrentTorrents.pl,v 1.29 2010/01/08 17:18:35 andrew Exp $
 use strict;  use strict;
 use warnings;  use warnings;
 use diagnostics;  use diagnostics;
Line 8 
Line 8 
 use Fcntl ':flock';  use Fcntl ':flock';
 use File::Basename;  use File::Basename;
   
   use Transmission::Client;
   use Transmission::Utils;
   
 #use YAML;  #use YAML;
   
 use lib 'lib';  use lib 'lib';
Line 30 
Line 33 
 Process_Dir( $OBT->{DIR_FTP} );  Process_Dir( $OBT->{DIR_FTP} );
   
 my %files;  my %files;
 my %keep;  
 my @delete;  my @delete;
 foreach my $DIR ( $OBT->{DIR_NEW_TORRENT}, $OBT->{DIR_TORRENT} ) {  foreach my $DIR ( $OBT->{DIR_NEW_TORRENT}, $OBT->{DIR_TORRENT} ) {
     opendir DIR, $DIR      opendir DIR, $DIR
Line 84 
Line 86 
 }  }
   
 #print Dump \%files;  #print Dump \%files;
   
   my %keep;
   my %seen;
 foreach my $name ( sort keys %{ $files{torrent} } ) {  foreach my $name ( sort keys %{ $files{torrent} } ) {
     next unless $name =~ /^$Name_Filter/;      next unless $name =~ /^$Name_Filter/;
   
       #next if $name =~ /_packages_/xms;
     #print "Checking $name\n";      #print "Checking $name\n";
   
     foreach my $epoch ( sort { $b <=> $a } keys %{ $files{torrent}{$name} } )      my $cn = $files{torrent}{$name};
     {  
   
         #print "\t$epoch\n";  EPOCH: foreach my $epoch ( sort { $a <=> $b } keys %{$cn} ) {
         my $torrent = $files{torrent}{$name}{$epoch}{path};          my $ct = $cn->{$epoch};
           my $cf = $ct->{path};
   
         if ( keys %{ $files{torrent}{$name} } == 1          #print "\t$epoch - $cf\n";
             && $files{torrent}{$name}{$epoch}{dir} eq $OBT->{DIR_TORRENT} )  
         {  
   
             #print "Skipping torrent for $name there is only one.\n";  
             next;  
         }  
   
         my $t;          my $t;
         eval {          eval {
             $t = BT::MetaInfo::Cached->new(              $t
                 $torrent,                  = BT::MetaInfo::Cached->new( $cf,
                 {   cache_root => '/tmp/OBTFileCache'                  { cache_root => '/tmp/OBTFileCache' } );
   
                         #$OBT->{DIR_HOME} . '/FileCache'  
                 }  
             );  
         };          };
   
         if ($@) {          if ($@) {
             warn "Error reading torrent $torrent\n";              warn "Error reading torrent $cf\n";
             push @delete, $files{torrent}{$name}{$epoch};              push @delete, $ct;
             delete $files{torrent}{$name}{$epoch};              delete $cn->{$epoch};
             next;              next EPOCH;
         }          }
   
         $files{torrent}{$name}{$epoch}{comment} = $t->{comment};          $ct->{comment} = $t->{comment};
         my ($path) = $t->{comment} =~ /($OBT->{BASENAME}\/[^\n]+)\n/s;          my ($path) = $t->{comment} =~ /($OBT->{BASENAME}\/[^\n]+)\n/s;
   
         unless ( -e $OBT->{DIR_FTP} . "/$path" ) {          if ( !-e $OBT->{DIR_FTP} . "/$path" ) {
             print              print
                 "Deleting $files{torrent}{$name}{$epoch}{file} the path ($path) doesn't exist.\n";                  'Deleting ',
             push @delete, $files{torrent}{$name}{$epoch};                  $cn->{$epoch}{file}, ' the path (', $path,
             delete $files{torrent}{$name}{$epoch};                  ") doesn't exist.\n";
             next;              push @delete, $ct;
               delete $cn->{$epoch};
               next EPOCH;
         }          }
   
         my $hash = $t->info_hash;          my $hash = unpack( "H*", $t->info_hash );
         $hash = unpack( "H*", $hash );          $ct->{info_hash} = $hash;
   
         undef $t;          undef $t;
   
         $files{torrent}{$name}{$epoch}{info_hash} = $hash;          if ( $seen{$name} && $seen{$name} ne $hash ) {
               print "Removing older [$name] [$hash]\n";
               if ( $keep{$hash}{path} ) {
                   print "\t", $keep{$hash}{path}, "\n";
               }
               push @delete, $ct;
               delete $cn->{$epoch};
               next EPOCH;
           }
           $seen{$name} = $hash;
   
         if ( exists $keep{$name} ) {          if ( keys %{$cn} == 1 && $ct->{dir} eq $OBT->{DIR_TORRENT} ) {
             if ( exists $keep{$name}{$hash} ) {              $keep{$hash} = $ct;
                 if ( $keep{$name}{$hash}{epoch} == $epoch ) {  
                     next;              #print "Keeping only instance of [$name] [$hash]\n\t",
                 }              #    $ct->{path},
                 print "Removing [$name] [$hash]\n\t",              #    "\n";
                     $keep{$name}{$hash}{path},              next EPOCH;
                     "\n";          }
                 push @delete, $keep{$name}{$hash};          elsif ( $keep{$hash} ) {
                 delete $files{torrent}{ $keep{$name}{$hash}{name} }              if ( $keep{$hash}{epoch} == $epoch ) {
                     { $keep{$name}{$hash}{epoch} };                  next EPOCH;
                 $keep{$name}{$hash} = $files{torrent}{$name}{$epoch};  
                 print "Keeping additional instance of  [$name] [$hash]\n\t",  
                     $keep{$name}{$hash}{path},  
                     "\n";  
             }              }
             else {  
                 print "Removing old [$name] [$hash]\n";              print "Removing duplicate [$name] [$hash]\n\t",
                 if ( $keep{$name}{$hash}{path} ) {                  $keep{$hash}{path}, "\n";
                     print "\t", $keep{$name}{$hash}{path}, "\n";              push @delete, $keep{$hash};
                 }              delete $files{torrent}{ $keep{$hash}{name} }
                 push @delete, $files{torrent}{$name}{$epoch};                  { $keep{$hash}{epoch} };
                 delete $files{torrent}{$name}{$epoch};  
             }              $keep{$hash} = $ct;
               print "Keeping additional instance of [$name] [$hash]\n\t",
                   $ct->{path},
                   "\n";
         }          }
         else {          else {
             print "Keeping first instance of $name [$hash]\n\t",              $keep{$hash} = $ct;
                 $files{torrent}{$name}{$epoch}{path},              print "Keeping first instance of [$name] [$hash]\n\t",
                   $ct->{path},
                 "\n";                  "\n";
             $keep{$name}{$hash} = $files{torrent}{$name}{$epoch};  
   
         }          }
     }      }
Line 177 
Line 183 
 #print Dump \%files, \%keep, \@delete;  #print Dump \%files, \%keep, \@delete;
 #exit;  #exit;
   
   my $client = Transmission::Client->new;
   my %seeding;
   foreach my $torrent ( @{ $client->torrents } ) {
   
       #my $status = Transmission::Utils::from_numeric_status($torrent->status);
       my $hash = $torrent->hash_string;
       if ( exists $keep{$hash} ) {
           $seeding{$hash} = $torrent;
       }
       else {
           print "No longer seeding [$hash]\n";
           $torrent->stop or warn $torrent->error_string;
           $client->remove( $torrent->id ) or warn $client->error;
       }
   }
   
   #print Dump \%keep;
   foreach my $hash ( keys %keep ) {
       my $file = $keep{$hash}{file} || q{};
       my $dir  = $keep{$hash}{dir}  || q{};
       if ( $dir eq $OBT->{DIR_NEW_TORRENT} ) {
           print "Moving $file to current torrents\n";
           rename( "$dir/$file", $OBT->{DIR_TORRENT} . "/" . $file )
               or die "Couldn't rename '$file': $!";
   
           my $name  = $keep{$hash}{name};
           my $epoch = $keep{$hash}{epoch};
           $dir = $OBT->{DIR_TORRENT};
   
           if ( exists $files{txt}{$name}{$epoch} ) {
               my $m_file = $files{txt}{$name}{$epoch}{file};
               my $m_dir  = $files{txt}{$name}{$epoch}{dir};
               rename( "$m_dir/$m_file", $OBT->{DIR_TORRENT} . "/" . $m_file )
                   or die "Couldn't rename '$m_file': $!";
           }
       }
   
       if ( !$seeding{$hash} ) {
           print "Starting seed of [$file] [$hash]\n";
           if (!$client->add(
                   filename     => "$dir/$file",
                   download_dir => $OBT->{DIR_FTP},
               )
               )
           {
   
               #warn $client->error, ": $dir/$file\n";
               print "Removing invalid torrent\n\t", $keep{$hash}{path}, "\n";
               push @delete, $keep{$hash};
               delete $files{torrent}{ $keep{$hash}{name} }
                   { $keep{$hash}{epoch} };
           }
       }
   }
   
 foreach (@delete) {  foreach (@delete) {
     print "Deleting '$_->{path}'\n";      if ( $_->{path} ) {
     unlink $_->{path} or die "Couldn't unlink $_->{path}";          print "Deleting '$_->{path}'\n";
           unlink $_->{path} or die "Couldn't unlink $_->{path}";
       }
       else {
           use Data::Dumper;
           print Dumper $_;
       }
 }  }
   
 foreach my $name ( keys %{ $files{ $OBT->{META_EXT} } } ) {  foreach my $name ( keys %{ $files{ $OBT->{META_EXT} } } ) {
Line 192 
Line 259 
     }      }
 }  }
   
 #print Dump \%keep;  $client->start;
 foreach my $name ( keys %keep ) {  
     foreach my $hash ( keys %{ $keep{$name} } ) {  
         my $file = $keep{$name}{$hash}{file} || q{};  
         my $dir  = $keep{$name}{$hash}{dir}  || q{};  
         if ( $dir eq $OBT->{DIR_NEW_TORRENT} ) {  
             print "Moving $file to current torrents\n";  
             rename( "$dir/$file", $OBT->{DIR_TORRENT} . "/" . $file )  
                 or die "Couldn't rename '$file': $!";  
   
             my $name  = $keep{$name}{$hash}{name};  
             my $epoch = $keep{$name}{$hash}{epoch};  
   
             if ( exists $files{txt}{$name}{$epoch} ) {  
                 my $m_file = $files{txt}{$name}{$epoch}{file};  
                 my $m_dir  = $files{txt}{$name}{$epoch}{dir};  
                 rename( "$m_dir/$m_file",  
                     $OBT->{DIR_TORRENT} . "/" . $m_file )  
                     or die "Couldn't rename '$m_file': $!";  
             }  
         }  
     }  
 }  
   
 sub Process_Dir {  sub Process_Dir {
     my $basedir = shift;      my $basedir = shift;

Legend:
Removed from v.1.27  
changed lines
  Added in v.1.30

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>