Torrent management: main script (process finished torrents.pl): Difference between revisions
(New page: <pre>#!/usr/bin/perl -w use strict; $|++; use CGI qw(:standard); my $scriptdir = "/home/m/scripts/gentoo/tdm/torrent"; # If we're already running, get outta Dodge... # Just count the sc...) |
No edit summary |
||
Line 5: | Line 5: | ||
use CGI qw(:standard); | use CGI qw(:standard); | ||
my $scriptdir = "/home/ | my $scriptdir = "/home/user/scripts/torrent"; | ||
# If we're already running, get outta Dodge... | # If we're already running, get outta Dodge... | ||
Line 32: | Line 32: | ||
# checks should go first! | # checks should go first! | ||
my %titlesearch = ( | my %titlesearch = ( | ||
'[ -_\.]earl[ -_\.]' => '.tv/MyNameIsEarl', | '[ -_\.]earl[ -_\.]' => '.tv/MyNameIsEarl', | ||
'the[ -_\.]office[ -_\.]' => '.tv/TheOffice', | 'the[ -_\.]office[ -_\.]' => '.tv/TheOffice', | ||
Line 60: | Line 56: | ||
# Loop through all "finished" directories. | # Loop through all "finished" directories. | ||
my @finished = `alias ls=ls && cd ~ | my @finished = `alias ls=ls && cd ~/download/torrents/finished && ls -1 2>/dev/null`; | ||
my @alltorrents = `cd ~ | my @alltorrents = `cd ~/download/torrents && ls -1 *.torrent 2>/dev/null`; | ||
my $count = 0; | my $count = 0; | ||
foreach ( @finished ) | foreach ( @finished ) | ||
Line 79: | Line 75: | ||
my $tor = $_; | my $tor = $_; | ||
chomp $tor; | chomp $tor; | ||
my $torfile = `cd ~ | my $torfile = `cd ~/download/torrents && php "$scriptdir/extract_torrent_dir.php" "$tor"`; | ||
#print $torfile; | #print $torfile; | ||
if ( $torfile eq $fin ) | if ( $torfile eq $fin ) | ||
Line 145: | Line 141: | ||
# NOTE: stupid perl can't resolve home dirs [~] !? | # NOTE: stupid perl can't resolve home dirs [~] !? | ||
# NOTE: $symlink may not be an actual symlink if it points to a dir UNDER a symlink. Use -e not -h. | # NOTE: $symlink may not be an actual symlink if it points to a dir UNDER a symlink. Use -e not -h. | ||
my $symtest = "/home/ | my $symtest = "/home/user/download/torrents/archived/symlinks/$symlink"; | ||
if ( ! -e"$symtest" or -e"$symtest/$fin" ) | if ( ! -e"$symtest" or -e"$symtest/$fin" ) | ||
{ | { | ||
Line 171: | Line 167: | ||
$count += 1; | $count += 1; | ||
} | } | ||
exit; | exit; | ||
</pre> | </pre> |
Revision as of 17:10, 7 April 2009
#!/usr/bin/perl -w use strict; $|++; use CGI qw(:standard); my $scriptdir = "/home/user/scripts/torrent"; # If we're already running, get outta Dodge... # Just count the script processes, we only want 1. my $runcount = `pgrep -f "bash process_finished_torrents.pl"|wc -l`; # Funny perl note - to make sure it sees a var as a number, do math on it! # Just add zero, haha. I've also read that you can just chomp it? chomp( $runcount ); $runcount = $runcount + 0; if ( $runcount > 1 ) { print "\n[process_finished_torrents.pl] is already running, quitting...\n"; exit 1; } my $mode = param('mode'); if ( !$mode || ( $mode ne "test" && $mode ne "auto" ) ) { print "\n Usage: process_finished_torrents.pl mode=[auto|test]\n\n"; exit 2; } # ======== SEARCH EXPRESSIONS ========= # Here, we check the top-level file or dir name in [finished], # as well as the torrent name. First hit wins, so more specific/exact # checks should go first! my %titlesearch = ( '[ -_\.]earl[ -_\.]' => '.tv/MyNameIsEarl', 'the[ -_\.]office[ -_\.]' => '.tv/TheOffice', '[ -\[\]\(\)\.]dvdrip[ -\[\]\(\)\.]' => '.movies', '[ -\[\]\(\)\.]dvdscr[ -\[\]\(\)\.]' => '.movies', '[ -\[\]\(\)\.]bluray[ -\[\]\(\)\.]' => '.movies', '^soundtrack' => '.music/Soundtracks', '[^a-z]OST[ -\[\]\(\)\.]*$' => '.music/Soundtracks', 'motion[ -\[\]\(\)\.]picture[ -\[\]\(\)\.]soundtrack' => '.music/Soundtracks', '^various' => '.music/Singles', '^va[ .-_]' => '.music/Singles', '[ -\[\]\(\)\.]mp3[ -\[\]\(\)\.]' => '.music/Albums', '[.]avi$' => '.movies', '[.]mkv$' => '.movies', ); # Here, we search the files within the top-level dir. # We do this only if all titlesearches fail. First hit wins. # NOTE: we haven't needed to implement this yet... my %dirsearch = ( '[.]mp3$' => '.music/Albums', ); # ======== SEARCH EXPRESSIONS end ===== # Loop through all "finished" directories. my @finished = `alias ls=ls && cd ~/download/torrents/finished && ls -1 2>/dev/null`; my @alltorrents = `cd ~/download/torrents && ls -1 *.torrent 2>/dev/null`; my $count = 0; foreach ( @finished ) { my $fin = $_; chomp $fin; # Make a nice count variable for printing. my $countprint = sprintf( "%3d", $count ); # Loop through torrents to find $finished... my $found_torrent = ''; my $torcount = 0; foreach ( @alltorrents ) { # print "$_"; my $tor = $_; chomp $tor; my $torfile = `cd ~/download/torrents && php "$scriptdir/extract_torrent_dir.php" "$tor"`; #print $torfile; if ( $torfile eq $fin ) { $found_torrent = $tor; # Might as well truncate the torrent list as we go, # for better performance when there are lots of torrents... splice(@alltorrents,$torcount,1); last; } $torcount++; } if ( $found_torrent eq '' ) { print "$countprint* No torrent found for $fin!\n"; } else { # Make a guess as to what to do. # Put the result in the symlink array. my $symlink = ''; # Some search terms are for title, others for contents. # Search the title first, it's faster. my $searchstr; foreach $searchstr ( keys( %titlesearch )) { # Here's how to loop through a hash and get each key and value. Whoop! # print $searchstr," => ",$titlesearch{$searchstr},"\n"; if ( $fin =~ m/$searchstr/i || $found_torrent =~ m/$searchstr/i ) { $symlink = $titlesearch{$searchstr}; last; } } # Haven't needed to go this far yet... #if ( $symlink eq '' ) #{ # # Next we'll search within the directory. # foreach $searchstr ( keys( %dirsearch )) # { # } #} if ( $symlink eq '' ) { print "$countprint* Can't determine type for $fin!\n"; } else { my $resultcode = " "; if ( $mode eq "test" ) { $resultcode = "T"; } else { # Are we ready to move the torrent? # Let's make sure the symlink is good, and the destination doesn't already exist... # NOTE: stupid perl can't resolve home dirs [~] !? # NOTE: $symlink may not be an actual symlink if it points to a dir UNDER a symlink. Use -e not -h. my $symtest = "/home/user/download/torrents/archived/symlinks/$symlink"; if ( ! -e"$symtest" or -e"$symtest/$fin" ) { $resultcode = "* Can't move:"; } else { # Now do the deed... my $scriptresult = `$scriptdir/archive_finished_torrent "$found_torrent" "$fin" $symlink`; # Man there are a lot of perlvars! See [http://perldoc.perl.org/search.html?q=perlvar]. # This one gives us the error code from the last backtick operation. if ( $? ) { print "\n\n$scriptresult\n\n"; $resultcode = "* Archive script failed:"; } } } # Print the result. print "$countprint$resultcode $fin | $found_torrent | $symlink\n"; } } $count += 1; } exit;