diff --git a/autoProcessTV.py b/autoProcessTV.py index acfca15a..7593c01d 100644 --- a/autoProcessTV.py +++ b/autoProcessTV.py @@ -1,109 +1,105 @@ -# Author: Nic Wolfe -# URL: http://code.google.com/p/sickbeard/ -# -# This file is part of Sick Beard. -# -# Sick Beard is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Sick Beard is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Sick Beard. If not, see . - - -import sys -import urllib -import os.path -import ConfigParser - -class AuthURLOpener(urllib.FancyURLopener): - def __init__(self, user, pw): - self.username = user - self.password = pw - self.numTries = 0 - urllib.FancyURLopener.__init__(self) - - def prompt_user_passwd(self, host, realm): - if self.numTries == 0: - self.numTries = 1 - return (self.username, self.password) - else: - return ('', '') - - def openit(self, url): - self.numTries = 0 - return urllib.FancyURLopener.open(self, url) - - -def processEpisode(dirName, nzbName=None, status=0): - - status = int(status) - if status > 0: - print "the download failed. nothing to process" - sys.exit() - - config = ConfigParser.ConfigParser() - configFilename = os.path.join(os.path.dirname(sys.argv[0]), "autoProcessTV.cfg") - print "Loading config from", configFilename - - if not os.path.isfile(configFilename): - print "ERROR: You need an autoProcessTV.cfg file - did you rename and edit the .sample?" - sys.exit(-1) - - try: - fp = open(configFilename, "r") - config.readfp(fp) - fp.close() - except IOError, e: - print "Could not read configuration file: ", str(e) - sys.exit(1) - - host = config.get("SickBeard", "host") - port = config.get("SickBeard", "port") - username = config.get("SickBeard", "username") - password = config.get("SickBeard", "password") - try: - ssl = int(config.get("SickBeard", "ssl")) - except (ConfigParser.NoOptionError, ValueError): - ssl = 0 - - try: - web_root = config.get("SickBeard", "web_root") - except ConfigParser.NoOptionError: - web_root = "" - - params = {} - - params['quiet'] = 1 - - params['dir'] = dirName - if nzbName != None: - params['nzbName'] = nzbName - - myOpener = AuthURLOpener(username, password) - - if ssl: - protocol = "https://" - else: - protocol = "http://" - - url = protocol + host + ":" + port + web_root + "/home/postprocess/processEpisode?" + urllib.urlencode(params) - - print "Opening URL:", url - - try: - urlObj = myOpener.openit(url) - except IOError, e: - print "Unable to open URL: ", str(e) - sys.exit(1) - - result = urlObj.readlines() - for line in result: - print line - +# Author: Nic Wolfe +# URL: http://code.google.com/p/sickbeard/ +# +# This file is part of Sick Beard. +# +# Sick Beard is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Sick Beard is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Sick Beard. If not, see . + + +import sys +import urllib +import os.path +import ConfigParser + +class AuthURLOpener(urllib.FancyURLopener): + def __init__(self, user, pw): + self.username = user + self.password = pw + self.numTries = 0 + urllib.FancyURLopener.__init__(self) + + def prompt_user_passwd(self, host, realm): + if self.numTries == 0: + self.numTries = 1 + return (self.username, self.password) + else: + return ('', '') + + def openit(self, url): + self.numTries = 0 + return urllib.FancyURLopener.open(self, url) + + +def processEpisode(dirName, nzbName=None, failed=False): + config = ConfigParser.ConfigParser() + configFilename = os.path.join(os.path.dirname(sys.argv[0]), "autoProcessTV.cfg") + print "Loading config from", configFilename + + if not os.path.isfile(configFilename): + print "ERROR: You need an autoProcessTV.cfg file - did you rename and edit the .sample?" + sys.exit(-1) + + try: + fp = open(configFilename, "r") + config.readfp(fp) + fp.close() + except IOError, e: + print "Could not read configuration file: ", str(e) + sys.exit(1) + + host = config.get("SickBeard", "host") + port = config.get("SickBeard", "port") + username = config.get("SickBeard", "username") + password = config.get("SickBeard", "password") + try: + ssl = int(config.get("SickBeard", "ssl")) + except (ConfigParser.NoOptionError, ValueError): + ssl = 0 + + try: + web_root = config.get("SickBeard", "web_root") + except ConfigParser.NoOptionError: + web_root = "" + + params = {} + + params['quiet'] = 1 + + params['dirName'] = dirName + if nzbName != None: + params['nzbName'] = nzbName + + params['failed'] = failed + + myOpener = AuthURLOpener(username, password) + + if ssl: + protocol = "https://" + else: + protocol = "http://" + + url = protocol + host + ":" + port + web_root + "/home/postprocess/processEpisode?" + urllib.urlencode(params) + + print "Opening URL:", url + + try: + urlObj = myOpener.openit(url) + except IOError, e: + print "Unable to open URL: ", str(e) + sys.exit(1) + + result = urlObj.readlines() + for line in result: + print line + diff --git a/nzbToCouchPotato.py b/nzbToCouchPotato.py index 1fc4cd6b..1d3f1da0 100644 --- a/nzbToCouchPotato.py +++ b/nzbToCouchPotato.py @@ -3,30 +3,18 @@ import sys import autoProcessMovie -# SABnzbd -if len(sys.argv) == 8: -# SABnzbd argv: -# 1 The final directory of the job (full path) -# 2 The original name of the NZB file -# 3 Clean version of the job name (no path info and ".nzb" removed) -# 4 Indexer's report number (if supported) -# 5 User-defined category -# 6 Group that the NZB was posted in e.g. alt.binaries.x -# 7 Status of post processing. 0 = OK, 1=failed verification, 2=failed unpack, 3=1+2 - print "Script triggered from SABnzbd, starting autoProcessMovie..." +if len(sys.argv) < 8: + print "Invalid number of arguments received from client. Please update it." + sys.exit() +else: + print "Script triggered from client, starting autoProcessMovie..." autoProcessMovie.process(sys.argv[1], sys.argv[2], sys.argv[7]) -# NZBGet -elif len(sys.argv) == 3: -# NZBGet argv: -# 1 The final directory of the job (full path) -# 2 The original name of the NZB file -# From NZBGet only successful downloads are triggered so status is set to "0" - print "Script triggered from NZBGet, starting autoProcessMovie..." - - autoProcessMovie.process(sys.argv[1], sys.argv[2], 0) - -else: - print "Invalid number of arguments received from client." - print "Running autoProcessMovie as a manual run..." - autoProcessMovie.process('Manual Run', 'Manual Run', 0) +# sys.argv: +# 1 The final directory of the job (full path) +# 2 The original name of the NZB file +# 3 Clean version of the job name (no path info and ".nzb" removed) +# 4 Indexer's report number (if supported) +# 5 User-defined category +# 6 Group that the NZB was posted in e.g. alt.binaries.x +# 7 Status of post processing. 0 = OK, 1=failed verification, 2=failed unpack, 3=1+2 diff --git a/nzbToSickBeard.py b/nzbToSickBeard.py index a2cb2d7b..8dd360ec 100644 --- a/nzbToSickBeard.py +++ b/nzbToSickBeard.py @@ -21,33 +21,21 @@ # Edited by Clinton Hall to prevent processing of failed downloads. # Also added suppot for NZBGet. With help from thorli - import sys import autoProcessTV -# SABnzbd -if len(sys.argv) == 8: -# SABnzbd argv: -# 1 The final directory of the job (full path) -# 2 The original name of the NZB file -# 3 Clean version of the job name (no path info and ".nzb" removed) -# 4 Indexer's report number (if supported) -# 5 User-defined category -# 6 Group that the NZB was posted in e.g. alt.binaries.x -# 7 Status of post processing. 0 = OK, 1=failed verification, 2=failed unpack, 3=1+2 - print "Script triggered from SABnzbd, starting autoProcessTV..." - autoProcessTV.processEpisode(sys.argv[1], sys.argv[2], sys.argv[7]) - -# NZBGet -elif len(sys.argv) == 3: -# NZBGet argv: -# 1 The final directory of the job (full path) -# 2 The original name of the NZB file -# From NZBGet only successful downloads are triggered so status is set to "0" - print "Script triggered from NZBGet, starting autoProcessTV..." - - autoProcessTV.processEpisode(sys.argv[1], sys.argv[2], 0) - +if len(sys.argv) < 8: + print "Invalid number of arguments received from client. Please update it." + sys.exit() else: - print "Invalid number of arguments received from client." - sys.exit() + print "Script triggered from client, starting autoProcessTV..." + autoProcessTV.processEpisode(sys.argv[1], sys.argv[2], sys.argv[7]) + +# sys.argv: +# 1 The final directory of the job (full path) +# 2 The original name of the NZB file +# 3 Clean version of the job name (no path info and ".nzb" removed) +# 4 Indexer's report number (if supported) +# 5 User-defined category +# 6 Group that the NZB was posted in e.g. alt.binaries.x +# 7 Status of post processing. 0 = OK, 1=failed verification, 2=failed unpack, 3=1+2 diff --git a/nzbget-postprocessing-files/9.0/bin/nzbget-postprocess.sh b/nzbget-postprocessing-files/9.0/bin/nzbget-postprocess.sh index 8d680134..cb1eb1b9 100644 --- a/nzbget-postprocessing-files/9.0/bin/nzbget-postprocess.sh +++ b/nzbget-postprocessing-files/9.0/bin/nzbget-postprocess.sh @@ -164,6 +164,18 @@ if [ "$NZBPP_PARSTATUS" -eq 1 -o "$NZBPP_PARSTATUS" -eq 3 -o "$NZBPP_PARFAILED" echo "[WARNING] Post-Process: Par-check successful, but Par-repair disabled, exiting" else echo "[WARNING] Post-Process: Par-check failed, exiting" + # Send notifications to SickBeard or CouchPotato that Par-check failed + # Uncomment if SickBeard Branch is fixed + #if [ "$SickBeard" = "yes" -a "$NZBPP_CATEGORY" = "$SickBeardCategory" -a -e "$SabToSickBeard" ]; then + # # Call SickBeard's postprocessing script + # echo "[INFO] Post-Process: Running SickBeard's postprocessing script to notify Par-check failed" + #$PythonCmd $SabToSickBeard "$NZBPP_DIRECTORY" "$NZBPP_NZBFILENAME" "" "" "" "" "1" >/dev/null 2>&1 + #fi + if [ "$CouchPotato" = "yes" -a "$NZBPP_CATEGORY" = "$CouchPotatoCategory" -a -e "$nzbToCouchPotato" ]; then + # Call CouchPotato's postprocessing script + echo "[INFO] Post-Process: Running CouchPotato's postprocessing script to notify Par-check failed" + $PythonCmd $nzbToCouchPotato "$NZBPP_DIRECTORY" "$NZBPP_NZBFILENAME" "" "" "" "" "1" >/dev/null 2>&1 + fi fi exit $POSTPROCESS_ERROR fi @@ -226,6 +238,18 @@ if (ls *.rar >/dev/null 2>&1); then if (ls *.[pP][aA][rR]2 >/dev/null 2>&1); then echo "[INFO] Post-Process: Requesting par-repair" exit $POSTPROCESS_PARCHECK_ALL + # Send notifications to SickBeard or CouchPotato that unrar (second pass) failed + # Uncomment if SickBeard Branch is fixed + #if [ "$SickBeard" = "yes" -a "$NZBPP_CATEGORY" = "$SickBeardCategory" -a -e "$SabToSickBeard" ]; then + # # Call SickBeard's postprocessing script + # echo "[INFO] Post-Process: Running SickBeard's postprocessing script to notify unrar (second pass) failed" + # $PythonCmd $SabToSickBeard "$NZBPP_DIRECTORY" "$NZBPP_NZBFILENAME" "" "" "" "" "1">/dev/null 2>&1 + #fi + if [ "$CouchPotato" = "yes" -a "$NZBPP_CATEGORY" = "$CouchPotatoCategory" -a -e "$nzbToCouchPotato" ]; then + # Call CouchPotato's postprocessing script + echo "[INFO] Post-Process: Running CouchPotato's postprocessing script to notify unrar (second pass) failed" + $PythonCmd $nzbToCouchPotato "$NZBPP_DIRECTORY" "$NZBPP_NZBFILENAME" "" "" "" "" "1">/dev/null 2>&1 + fi fi exit $POSTPROCESS_ERROR fi @@ -282,9 +306,9 @@ fi # Clean up echo "[INFO] Post-Process: Cleaning up" chmod -R a+rw . -rm *.nzb >/dev/null 2>&1 -rm *.sfv >/dev/null 2>&1 -rm *.1 >/dev/null 2>&1 +# Clean up list, space seperated from GUI +rm $FileCleanUp >/dev/null 2>&1 +# Removed by default rm _brokenlog.txt >/dev/null 2>&1 if [ "$Unrared" -eq 1 ]; then # Delete par2-file only if there were files for unpacking. @@ -321,30 +345,30 @@ fi # Move categories to /share/yourdirectory and remove download destination directory if [ "$NZBPP_CATEGORY" = "$SickBeardCategory" ]; then - echo "[INFO] Post-Process: Moving TV shows to $TV_DL_DIR" - cp -R "$NZBPP_DIRECTORY" "$TV_DL_DIR" >/dev/null 2>&1 + echo "[INFO] Post-Process: Moving TV shows to $TvDownloadDir" + cp -R "$NZBPP_DIRECTORY" "$TvDownloadDir" >/dev/null 2>&1 if [ "$?" -ne 0 ]; then - echo "[ERROR] Post-Process: Moving to $TV_DL_DIR" + echo "[ERROR] Post-Process: Moving to $TvDownloadDir" exit $POSTPROCESS_ERROR else rm -fr * cd .. rmdir "$NZBPP_DIRECTORY" - NZBPP_DIRECTORY="$TV_DL_DIR" + NZBPP_DIRECTORY="$TvDownloadDir" fi fi if [ "$NZBPP_CATEGORY" = "$CouchPotatoCategory" ]; then - echo "[INFO] Post-Process: Moving Movies to $MOVIES_DL_DIR" - cp -R "$NZBPP_DIRECTORY" "$MOVIES_DL_DIR" >/dev/null 2>&1 + echo "[INFO] Post-Process: Moving Movies to $MoviesDownloadDir" + cp -R "$NZBPP_DIRECTORY" "$MoviesDownloadDir" >/dev/null 2>&1 if [ "$?" -ne 0 ]; then - echo "[ERROR] Post-Process: Moving to $MOVIES_DL_DIR" + echo "[ERROR] Post-Process: Moving to $MoviesDownloadDir" exit $POSTPROCESS_ERROR else rm -fr * cd .. rmdir "$NZBPP_DIRECTORY" - NZBPP_DIRECTORY="$MOVIES_DL_DIR" + NZBPP_DIRECTORY="$MoviesDownloadDir" fi fi @@ -355,13 +379,13 @@ fi if [ "$SickBeard" = "yes" -a "$NZBPP_CATEGORY" = "$SickBeardCategory" -a -e "$NzbToSickBeard" ]; then # Call SickBeard's postprocessing script echo "[INFO] Post-Process: Running SickBeard's postprocessing script" - $PythonCmd $NzbToSickBeard "$NZBPP_DIRECTORY" "$NZBPP_NZBFILENAME" >/dev/null 2>&1 + $PythonCmd $NzbToSickBeard "$NZBPP_DIRECTORY" "$NZBPP_NZBFILENAME" "" "" "" "" "0" >/dev/null 2>&1 fi if [ "$CouchPotato" = "yes" -a "$NZBPP_CATEGORY" = "$CouchPotatoCategory" -a -e "$NzbToCouchPotato" ]; then # Call CouchPotato's postprocessing script echo "[INFO] Post-Process: Running CouchPotato's postprocessing script" - $PythonCmd $NzbToCouchPotato "$NZBPP_DIRECTORY" "$NZBPP_NZBFILENAME" >/dev/null 2>&1 + $PythonCmd $NzbToCouchPotato "$NZBPP_DIRECTORY" "$NZBPP_NZBFILENAME" "" "" "" "" "0" >/dev/null 2>&1 fi # Check if destination directory was set in postprocessing parameters diff --git a/nzbget-postprocessing-files/9.0/webui/nzbget-postprocess.conf b/nzbget-postprocessing-files/9.0/webui/nzbget-postprocess.conf index af6d01c2..61722981 100644 --- a/nzbget-postprocessing-files/9.0/webui/nzbget-postprocess.conf +++ b/nzbget-postprocessing-files/9.0/webui/nzbget-postprocess.conf @@ -36,15 +36,15 @@ PythonCmd=/usr/local/python/bin/python NzbToSickBeard=/usr/local/nzbget/var/nzbToSickBeard.py # Set the full path where completed movies should be placed -# before CouchPotato's Renamer is called -TV_DL_DIR=/usr/local/nzbget/complete/tv +# before SickBeard's Renamer is called +TvDownloadDir=/usr/local/nzbget/complete/tv # Set the full path to nzbToCouchpotato.py for Couchpotato's postprocessing NzbToCouchPotato=/usr/local/nzbget/var/nzbToCouchPotato.py # Set the full path where completed movies should be placed # before CouchPotato's Renamer is called -MOVIES_DL_DIR=/usr/local/nzbget/complete/movies +MoviesDownloadDir=/usr/local/nzbget/complete/movies ############################################################################## ### OPTIONS ### @@ -70,6 +70,8 @@ CouchPotato=yes # Category for Couchpotato's postprocessing. CouchPotatoCategory=movies +# Clean up list. (space seperated, default *.nzb *.sfv *.1) +FileCleanUp=*.nzb *.sfv *.1 ############################################################################## ### POSTPROCESSING-PARAMETERS ###