#!/usr/bin/env python # coding=utf-8 # ############################################################################## ### NZBGET POST-PROCESSING SCRIPT ### # Post-Process to CouchPotato, SickBeard, Sonarr, Mylar, Gamez, HeadPhones, # LazyLibrarian, Radarr, Lidarr, Watcher3 # # This script sends the download to your automated media management servers. # # NOTE: This script requires Python to be installed on your system. ############################################################################## ### OPTIONS ### ## General # Auto Update nzbToMedia (0, 1). # # Set to 1 if you want nzbToMedia to automatically check for and update to the latest version #auto_update=0 # Check Media for corruption (0, 1). # # Enable/Disable media file checking using ffprobe. #check_media=1 # Safe Mode protection of DestDir (0, 1). # # Enable/Disable a safety check to ensure we don't process all downloads in the default_downloadDirectory by mistake. #safe_mode=1 # Disable additional extraction checks for failed (0, 1). # # Turn this on to disable additional extraction attempts for failed downloads. Default = 0 this will attempt to extract and verify if media is present. #no_extract_failed = 0 ## CouchPotato # CouchPotato script category. # # category that gets called for post-processing with CouchPotatoServer. #cpsCategory=movie # CouchPotato api key. #cpsapikey= # CouchPotato host. # # The ipaddress for your CouchPotato server. e.g For the Same system use localhost or 127.0.0.1 #cpshost=localhost # CouchPotato port. #cpsport=5050 # CouchPotato uses ssl (0, 1). # # Set to 1 if using ssl, else set to 0. #cpsssl=0 # CouchPotato URL_Base # # set this if using a reverse proxy. #cpsweb_root= # CouchPotato Postprocess Method (renamer, manage). # # use "renamer" for CPS renamer (default) or "manage" to call a manage update. #cpsmethod=renamer # CouchPotato OMDB API Key. # # api key for www.omdbapi.com (used as alternative to imdb to assist with movie identification). #cpsomdbapikey= # CouchPotato Delete Failed Downloads (0, 1). # # set to 1 to delete failed, or 0 to leave files in place. #cpsdelete_failed=0 # CouchPotato wait_for # # Set the number of minutes to wait after calling the renamer, to check the movie has changed status. #cpswait_for=2 # Couchpotato and NZBGet are a different system (0, 1). # # Enable to replace local path with the path as per the mountPoints below. #cpsremote_path=0 ## Radarr # Radarr script category. # # category that gets called for post-processing with NzbDrone. #raCategory=movies2 # Radarr host. # # The ipaddress for your Radarr server. e.g For the Same system use localhost or 127.0.0.1 #rahost=localhost # Radarr port. #raport=7878 # Radarr API key. #raapikey= # Radarr uses ssl (0, 1). # # Set to 1 if using ssl, else set to 0. #rassl=0 # Radarr web_root # # set this if using a reverse proxy. #raweb_root= # Radarr wait_for # # Set the number of minutes to wait after calling the renamer, to check the episode has changed status. #rawait_for=6 # Radarr OMDB API Key. # # api key for www.omdbapi.com (used as alternative to imdb to assist with movie identification). #raomdbapikey= # Radarr import mode (Move, Copy). # # set to define import behaviour Move or Copy #raimportmode=Copy # Radarr Delete Failed Downloads (0, 1). # # set to 1 to delete failed, or 0 to leave files in place. #radelete_failed=0 # Radarr and NZBGet are a different system (0, 1). # # Enable to replace local path with the path as per the mountPoints below. #raremote_path=0 ## Watcher3 # Wather3 script category. # # category that gets called for post-processing with Watcher3. #W3Category=movie # Watcher3 api key. #W3apikey= # Watcher3 host. # # The ipaddress for your Watcher3 server. e.g For the Same system use localhost or 127.0.0.1 #W3host=localhost # Watcher3 port. #W3port=9090 # Watcher3 uses ssl (0, 1). # # Set to 1 if using ssl, else set to 0. #W3ssl=0 # Watcher3 URL_Base # # set this if using a reverse proxy. #W3web_root= # OMDB API Key. # # api key for www.omdbapi.com (used as alternative to imdb to assist with movie identification). #W3omdbapikey= # Watcher3 Delete Failed Downloads (0, 1). # # set to 1 to delete failed, or 0 to leave files in place. #W3delete_failed=0 # Watcher3 wait_for # # Set the number of minutes to wait after calling the renamer, to check the movie has changed status. #W3wait_for=2 # Watcher3 and NZBGet are a different system (0, 1). # # Enable to replace local path with the path as per the mountPoints below. #W3remote_path=0 ## SickBeard # SickBeard script category. # # category that gets called for post-processing with SickBeard. #sbCategory=tv # SickBeard host. # # The ipaddress for your SickBeard/SickRage server. e.g For the Same system use localhost or 127.0.0.1 #sbhost=localhost # SickBeard port. #sbport=8081 # SickBeard api key. For SickChill, Medusa, SiCKRAGE only. #sbapikey= # SickBeard username. #sbusername= # SickBeard password. #sbpassword= # SickBeard uses ssl (0, 1). # # Set to 1 if using ssl, else set to 0. #sbssl=0 # SickBeard web_root # # set this if using a reverse proxy. #sbweb_root= # SickBeard watch directory. # # set this if SickBeard and nzbGet are on different systems. #sbwatch_dir= # SickBeard fork. # # set to default or auto to auto-detect the custom fork type. #sbfork=auto # SickBeard Delete Failed Downloads (0, 1). # # set to 1 to delete failed, or 0 to leave files in place. #sbdelete_failed=0 # SickBeard Ignore associated subtitle check (0, 1). # # set to 1 to ignore subtitles check, or 0 to don't check. #sbignore_subs=0 # SickBeard process method. # # set this to move, copy, hardlink, symlink as appropriate if you want to over-ride SB defaults. Leave blank to use SB default. #sbprocess_method= # SickBeard and NZBGet are a different system (0, 1). # # Enable to replace local path with the path as per the mountPoints below. #sbremote_path=0 ## NzbDrone # NzbDrone script category. # # category that gets called for post-processing with NzbDrone. #ndCategory=tv2 # NzbDrone host. # # The ipaddress for your NzbDrone/Sonarr server. e.g For the Same system use localhost or 127.0.0.1 #ndhost=localhost # NzbDrone port. #ndport=8989 # NzbDrone API key. #ndapikey= # NzbDrone uses SSL (0, 1). # # Set to 1 if using SSL, else set to 0. #ndssl=0 # NzbDrone web root. # # set this if using a reverse proxy. #ndweb_root= # NzbDrone wait_for # # Set the number of minutes to wait after calling the renamer, to check the episode has changed status. #ndwait_for=6 # NzbDrone import mode (Move, Copy). # # set to define import behaviour Move or Copy #ndimportmode=Copy # NzbDrone Delete Failed Downloads (0, 1). # # set to 1 to delete failed, or 0 to leave files in place. #nddelete_failed=0 # NzbDrone and NZBGet are a different system (0, 1). # # Enable to replace local path with the path as per the mountPoints below. #ndremote_path=0 ## HeadPhones # HeadPhones script category. # # category that gets called for post-processing with HeadHones. #hpCategory=music # HeadPhones api key. #hpapikey= # HeadPhones host. # # The ipaddress for your HeadPhones server. e.g For the Same system use localhost or 127.0.0.1 #hphost=localhost # HeadPhones port. #hpport=8181 # HeadPhones uses ssl (0, 1). # # Set to 1 if using ssl, else set to 0. #hpssl=0 # HeadPhones web_root # # set this if using a reverse proxy. #hpweb_root= # HeadPhones Delete Failed Downloads (0, 1). # # set to 1 to delete failed, or 0 to leave files in place. #hpdelete_failed=0 # HeadPhones and NZBGet are a different system (0, 1). # # Enable to replace local path with the path as per the mountPoints below. #hpremote_path=0 ## Lidarr # Lidarr script category. # # category that gets called for post-processing with NzbDrone. #liCategory=music2 # Lidarr host. # # The ipaddress for your Lidarr server. e.g For the Same system use localhost or 127.0.0.1 #lihost=localhost # Lidarr port. #liport=8686 # Lidarr API key. #liapikey= # Lidarr uses ssl (0, 1). # # Set to 1 if using ssl, else set to 0. #lissl=0 # Lidarr web_root # # set this if using a reverse proxy. #liweb_root= # Lidarr wait_for # # Set the number of minutes to wait after calling the renamer, to check the episode has changed status. #liwait_for=6 # Lidarr Delete Failed Downloads (0, 1). # # set to 1 to delete failed, or 0 to leave files in place. #lidelete_failed=0 # Lidarr and NZBGet are a different system (0, 1). # # Enable to replace local path with the path as per the mountPoints below. #liremote_path=0 ## Mylar # Mylar script category. # # category that gets called for post-processing with Mylar. #myCategory=comics # Mylar host. # # The ipaddress for your Mylar server. e.g For the Same system use localhost or 127.0.0.1 #myhost=localhost # Mylar port. #myport=8090 # Mylar api key. #myapikey= # Mylar uses ssl (0, 1). # # Set to 1 if using ssl, else set to 0. #myssl=0 # Mylar web_root # # set this if using a reverse proxy. #myweb_root= # Mylar wait_for # # Set the number of minutes to wait after calling the force process, to check the issue has changed status. #myswait_for=1 # Mylar and NZBGet are a different system (0, 1). # # Enable to replace local path with the path as per the mountPoints below. #myremote_path=0 ## Gamez # Gamez script category. # # category that gets called for post-processing with Gamez. #gzCategory=games # Gamez api key. #gzapikey= # Gamez host. # # The ipaddress for your Gamez server. e.g For the Same system use localhost or 127.0.0.1 #gzhost=localhost # Gamez port. #gzport=8085 # Gamez uses ssl (0, 1). # # Set to 1 if using ssl, else set to 0. #gzssl=0 # Gamez library # # move downloaded games here. #gzlibrary # Gamez web_root # # set this if using a reverse proxy. #gzweb_root= # Gamez and NZBGet are a different system (0, 1). # # Enable to replace local path with the path as per the mountPoints below. #gzremote_path=0 ## LazyLibrarian # LazyLibrarian script category. # # category that gets called for post-processing with LazyLibrarian. #llCategory=books # LazyLibrarian api key. #llapikey= # LazyLibrarian host. # # The ipaddress for your LazyLibrarian server. e.g For the Same system use localhost or 127.0.0.1 #llhost=localhost # LazyLibrarian port. #llport=5299 # LazyLibrarian uses ssl (0, 1). # # Set to 1 if using ssl, else set to 0. #llssl=0 # LazyLibrarian web_root # # set this if using a reverse proxy. #llweb_root= # LazyLibrarian watch directory. # # set this to where your LazyLibrarian completed downloads are. #llwatch_dir= # LazyLibrarian and NZBGet are a different system (0, 1). # # Enable to replace local path with the path as per the mountPoints below. #llremote_path=0 ## Network # Network Mount Points (Needed for remote path above) # # Enter Mount points as LocalPath,RemotePath and separate each pair with '|' # e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\ #mountPoints= ## Extensions # Media Extensions # # This is a list of media extensions that are used to verify that the download does contain valid media. #mediaExtensions=.mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg,.vob,.iso,.ts ## Posix # Niceness for external tasks Extractor and Transcoder. # # Set the Niceness value for the nice command. These range from -20 (most favorable to the process) to 19 (least favorable to the process). # If entering an integer e.g 'niceness=4', this is added to the nice command and passed as 'nice -n4' (Default). # If entering a comma separated list e.g. 'niceness=nice,4' this will be passed as 'nice 4' (Safer). #niceness=nice,-n0 # ionice scheduling class (0, 1, 2, 3). # # Set the ionice scheduling class. 0 for none, 1 for real time, 2 for best-effort, 3 for idle. #ionice_class=2 # ionice scheduling class data. # # Set the ionice scheduling class data. This defines the class data, if the class accepts an argument. For real time and best-effort, 0-7 is valid data. #ionice_classdata=4 ## Transcoder # getSubs (0, 1). # # set to 1 to download subtitles. #getSubs=0 # subLanguages. # # subLanguages. create a list of languages in the order you want them in your subtitles. #subLanguages=eng,spa,fra # Transcode (0, 1). # # set to 1 to transcode, otherwise set to 0. #transcode=0 # create a duplicate, or replace the original (0, 1). # # set to 1 to cretae a new file or 0 to replace the original #duplicate=1 # ignore extensions. # # list of extensions that won't be transcoded. #ignoreExtensions=.avi,.mkv # outputFastStart (0,1). # # outputFastStart. 1 will use -movflags + faststart. 0 will disable this from being used. #outputFastStart=0 # outputVideoPath. # # outputVideoPath. Set path you want transcoded videos moved to. Leave blank to disable. #outputVideoPath= # processOutput (0,1). # # processOutput. 1 will send the outputVideoPath to SickBeard/CouchPotato. 0 will send original files. #processOutput=0 # audioLanguage. # # audioLanguage. set the 3 letter language code you want as your primary audio track. #audioLanguage=eng # allAudioLanguages (0,1). # # allAudioLanguages. 1 will keep all audio tracks (uses AudioCodec3) where available. #allAudioLanguages=0 # allSubLanguages (0,1). # # allSubLanguages. 1 will keep all exisiting sub languages. 0 will discare those not in your list above. #allSubLanguages=0 # embedSubs (0,1). # # embedSubs. 1 will embded external sub/srt subs into your video if this is supported. #embedSubs=1 # burnInSubtitle (0,1). # # burnInSubtitle. burns the default sub language into your video (needed for players that don't support subs) #burnInSubtitle=0 # extractSubs (0,1). # # extractSubs. 1 will extract subs from the video file and save these as external srt files. #extractSubs=0 # externalSubDir. # # externalSubDir. set the directory where subs should be saved (if not the same directory as the video) #externalSubDir= # outputDefault (None, iPad, iPad-1080p, iPad-720p, Apple-TV2, iPod, iPhone, PS3, xbox, Roku-1080p, Roku-720p, Roku-480p, mkv, mkv-bluray, mp4-scene-release). # # outputDefault. Loads default configs for the selected device. The remaining options below are ignored. # If you want to use your own profile, set None and set the remaining options below. #outputDefault=None # hwAccel (0,1). # # hwAccel. 1 will set ffmpeg to enable hardware acceleration (this requires a recent ffmpeg). #hwAccel=0 # ffmpeg output settings. #outputVideoExtension=.mp4 #outputVideoCodec=libx264 #VideoCodecAllow= #outputVideoResolution=720:-1 #outputVideoPreset=medium #outputVideoFramerate=24 #outputVideoBitrate=800k #outputAudioCodec=ac3 #AudioCodecAllow= #outputAudioChannels=6 #outputAudioBitrate=640k #outputQualityPercent= #outputAudioTrack2Codec=libfaac #AudioCodec2Allow= #outputAudioTrack2Channels=2 #outputAudioTrack2Bitrate=160k #outputAudioOtherCodec=libmp3lame #AudioOtherCodecAllow= #outputAudioOtherChannels=2 #outputAudioOtherBitrate=128k #outputSubtitleCodec= ## WakeOnLan # use WOL (0, 1). # # set to 1 to send WOL broadcast to the mac and test the server (e.g. xbmc) on the host and port specified. #wolwake=0 # WOL MAC # # enter the mac address of the system to be woken. #wolmac=00:01:2e:2D:64:e1 # Set the Host and Port of a server to verify system has woken. #wolhost=192.168.1.37 #wolport=80 ## UserScript # User Script category. # # category that gets called for post-processing with user script (accepts "UNCAT", "ALL", or a defined category). #usCategory=mine # User Script Remote Path (0,1). # # Script calls commands on another system. #usremote_path=0 # User Script extensions. # # What extension do you want to process? Specify all the extension, or use "ALL" to process all files. #user_script_mediaExtensions=.mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg # User Script Path # # Specify the path to your custom script. #user_script_path=/nzbToMedia/userscripts/script.sh # User Script arguments. # # Specify the argument(s) passed to script, comma separated in order. # for example FP,FN,DN, TN, TL for file path (absolute file name with path), file name, absolute directory name (with path), Torrent Name, Torrent Label/Category. # So the result is /media/test/script/script.sh FP FN DN TN TL. Add other arguments as needed eg -f, -r #user_script_param=FN # User Script Run Once (0,1). # # Set user_script_runOnce = 0 to run for each file, or 1 to only run once (presumably on teh entire directory). #user_script_runOnce=0 # User Script Success Codes. # # Specify the successcodes returned by the user script as a comma separated list. Linux default is 0 #user_script_successCodes=0 # User Script Clean After (0,1). # # Clean after? Note that delay function is used to prevent possible mistake :) Delay is intended as seconds #user_script_clean=1 # User Script Delay. # # Delay in seconds after processing. #usdelay=120 ### NZBGET POST-PROCESSING SCRIPT ### ############################################################################## from __future__ import ( absolute_import, division, print_function, unicode_literals, ) import datetime import os import sys import eol import cleanup eol.check() cleanup.clean(cleanup.FOLDER_STRUCTURE) import core from core import logger, main_db from core.auto_process import comics, games, movies, music, tv, books from core.auto_process.common import ProcessResult from core.plugins.downloaders.nzb.utils import get_nzoid from core.plugins.plex import plex_update from core.user_scripts import external_script from core.utils import ( char_replace, clean_dir, convert_to_ascii, extract_files, get_dirs, get_download_info, update_download_info_status, ) try: text_type = unicode except NameError: text_type = str # post-processing def process(input_directory, input_name=None, status=0, client_agent='manual', download_id=None, input_category=None, failure_link=None): if core.SAFE_MODE and input_directory == core.NZB_DEFAULT_DIRECTORY: logger.error( 'The input directory:[{0}] is the Default Download Directory. Please configure category directories to prevent processing of other media.'.format( input_directory)) return ProcessResult( message='', status_code=-1, ) if not download_id and client_agent == 'sabnzbd': download_id = get_nzoid(input_name) if client_agent != 'manual' and not core.DOWNLOAD_INFO: logger.debug('Adding NZB download info for directory {0} to database'.format(input_directory)) my_db = main_db.DBConnection() input_directory1 = input_directory input_name1 = input_name try: encoded, input_directory1 = char_replace(input_directory) encoded, input_name1 = char_replace(input_name) except Exception: pass control_value_dict = {'input_directory': text_type(input_directory1)} new_value_dict = { 'input_name': text_type(input_name1), 'input_hash': text_type(download_id), 'input_id': text_type(download_id), 'client_agent': text_type(client_agent), 'status': 0, 'last_update': datetime.date.today().toordinal(), } my_db.upsert('downloads', new_value_dict, control_value_dict) # auto-detect section if input_category is None: input_category = 'UNCAT' usercat = input_category section = core.CFG.findsection(input_category).isenabled() if section is None: section = core.CFG.findsection('ALL').isenabled() if section is None: logger.error( 'Category:[{0}] is not defined or is not enabled. Please rename it or ensure it is enabled for the appropriate section in your autoProcessMedia.cfg and try again.'.format( input_category)) return ProcessResult( message='', status_code=-1, ) else: usercat = 'ALL' if len(section) > 1: logger.error( 'Category:[{0}] is not unique, {1} are using it. Please rename it or disable all other sections using the same category name in your autoProcessMedia.cfg and try again.'.format( input_category, section.keys())) return ProcessResult( message='', status_code=-1, ) if section: section_name = section.keys()[0] logger.info('Auto-detected SECTION:{0}'.format(section_name)) else: logger.error('Unable to locate a section with subsection:{0} enabled in your autoProcessMedia.cfg, exiting!'.format( input_category)) return ProcessResult( status_code=-1, message='', ) cfg = dict(core.CFG[section_name][usercat]) extract = int(cfg.get('extract', 0)) try: if int(cfg.get('remote_path')) and not core.REMOTE_PATHS: logger.error('Remote Path is enabled for {0}:{1} but no Network mount points are defined. Please check your autoProcessMedia.cfg, exiting!'.format( section_name, input_category)) return ProcessResult( status_code=-1, message='', ) except Exception: logger.error('Remote Path {0} is not valid for {1}:{2} Please set this to either 0 to disable or 1 to enable!'.format( cfg.get('remote_path'), section_name, input_category)) input_name, input_directory = convert_to_ascii(input_name, input_directory) if extract == 1 and not (status > 0 and core.NOEXTRACTFAILED): logger.debug('Checking for archives to extract in directory: {0}'.format(input_directory)) extract_files(input_directory) logger.info('Calling {0}:{1} to post-process:{2}'.format(section_name, input_category, input_name)) if section_name in ['CouchPotato', 'Radarr', 'Watcher3']: result = movies.process(section_name, input_directory, input_name, status, client_agent, download_id, input_category, failure_link) elif section_name in ['SickBeard', 'NzbDrone', 'Sonarr']: result = tv.process(section_name, input_directory, input_name, status, client_agent, download_id, input_category, failure_link) elif section_name in ['HeadPhones', 'Lidarr']: result = music.process(section_name, input_directory, input_name, status, client_agent, input_category) elif section_name == 'Mylar': result = comics.process(section_name, input_directory, input_name, status, client_agent, input_category) elif section_name == 'Gamez': result = games.process(section_name, input_directory, input_name, status, client_agent, input_category) elif section_name == 'LazyLibrarian': result = books.process(section_name, input_directory, input_name, status, client_agent, input_category) elif section_name == 'UserScript': result = external_script(input_directory, input_name, input_category, section[usercat]) else: result = ProcessResult( message='', status_code=-1, ) plex_update(input_category) if result.status_code == 0: if client_agent != 'manual': # update download status in our DB update_download_info_status(input_name, 1) if section_name not in ['UserScript', 'NzbDrone', 'Sonarr', 'Radarr', 'Lidarr']: # cleanup our processing folders of any misc unwanted files and empty directories clean_dir(input_directory, section_name, input_category) return result def main(args, section=None): # Initialize the config core.initialize(section) logger.info('#########################################################') logger.info('## ..::[{0}]::.. ##'.format(os.path.basename(__file__))) logger.info('#########################################################') # debug command line options logger.debug('Options passed into nzbToMedia: {0}'.format(args)) # Post-Processing Result result = ProcessResult( message='', status_code=0, ) status = 0 # NZBGet if 'NZBOP_SCRIPTDIR' in os.environ: # Check if the script is called from nzbget 11.0 or later if os.environ['NZBOP_VERSION'][0:5] < '11.0': logger.error('NZBGet Version {0} is not supported. Please update NZBGet.'.format(os.environ['NZBOP_VERSION'])) sys.exit(core.NZBGET_POSTPROCESS_ERROR) logger.info('Script triggered from NZBGet Version {0}.'.format(os.environ['NZBOP_VERSION'])) # Check if the script is called from nzbget 13.0 or later if 'NZBPP_TOTALSTATUS' in os.environ: if not os.environ['NZBPP_TOTALSTATUS'] == 'SUCCESS': logger.info('Download failed with status {0}.'.format(os.environ['NZBPP_STATUS'])) status = 1 else: # Check par status if os.environ['NZBPP_PARSTATUS'] == '1' or os.environ['NZBPP_PARSTATUS'] == '4': logger.warning('Par-repair failed, setting status \'failed\'') status = 1 # Check unpack status if os.environ['NZBPP_UNPACKSTATUS'] == '1': logger.warning('Unpack failed, setting status \'failed\'') status = 1 if os.environ['NZBPP_UNPACKSTATUS'] == '0' and os.environ['NZBPP_PARSTATUS'] == '0': # Unpack was skipped due to nzb-file properties or due to errors during par-check if os.environ['NZBPP_HEALTH'] < 1000: logger.warning( 'Download health is compromised and Par-check/repair disabled or no .par2 files found. Setting status \'failed\'') logger.info('Please check your Par-check/repair settings for future downloads.') status = 1 else: logger.info( 'Par-check/repair disabled or no .par2 files found, and Unpack not required. Health is ok so handle as though download successful') logger.info('Please check your Par-check/repair settings for future downloads.') # Check for download_id to pass to CouchPotato download_id = '' failure_link = None if 'NZBPR_COUCHPOTATO' in os.environ: download_id = os.environ['NZBPR_COUCHPOTATO'] elif 'NZBPR_DRONE' in os.environ: download_id = os.environ['NZBPR_DRONE'] elif 'NZBPR_SONARR' in os.environ: download_id = os.environ['NZBPR_SONARR'] elif 'NZBPR_RADARR' in os.environ: download_id = os.environ['NZBPR_RADARR'] elif 'NZBPR_LIDARR' in os.environ: download_id = os.environ['NZBPR_LIDARR'] if 'NZBPR__DNZB_FAILURE' in os.environ: failure_link = os.environ['NZBPR__DNZB_FAILURE'] # All checks done, now launching the script. client_agent = 'nzbget' result = process(os.environ['NZBPP_DIRECTORY'], input_name=os.environ['NZBPP_NZBNAME'], status=status, client_agent=client_agent, download_id=download_id, input_category=os.environ['NZBPP_CATEGORY'], failure_link=failure_link) # SABnzbd elif 'SAB_SCRIPT' in os.environ: client_agent = 'sabnzbd' logger.info('Script triggered from SABnzbd Version {0}.'.format(os.environ['SAB_VERSION'])) result = process(os.environ['SAB_COMPLETE_DIR'], input_name=os.environ['SAB_FINAL_NAME'], status=int(os.environ['SAB_PP_STATUS']), client_agent=client_agent, download_id=os.environ['SAB_NZO_ID'], input_category=os.environ['SAB_CAT'], failure_link=os.environ['SAB_FAILURE_URL']) # SABnzbd Pre 0.7.17 elif len(args) == core.SABNZB_NO_OF_ARGUMENTS: # 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 client_agent = 'sabnzbd' logger.info('Script triggered from SABnzbd') result = process(args[1], input_name=args[2], status=int(args[7]), input_category=args[5], client_agent=client_agent, download_id='') # SABnzbd 0.7.17+ elif len(args) >= core.SABNZB_0717_NO_OF_ARGUMENTS: # 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 # 8 Failure URL client_agent = 'sabnzbd' logger.info('Script triggered from SABnzbd 0.7.17+') result = process(args[1], input_name=args[2], status=int(args[7]), input_category=args[5], client_agent=client_agent, download_id='', failure_link=''.join(args[8:])) # Generic program elif len(args) > 5 and args[5] == 'generic': logger.info('Script triggered from generic program') result = process(args[1], input_name=args[2], input_category=args[3], download_id=args[4]) else: # Perform Manual Post-Processing logger.warning('Invalid number of arguments received from client, Switching to manual run mode ...') for section, subsections in core.SECTIONS.items(): for subsection in subsections: if not core.CFG[section][subsection].isenabled(): continue for dir_name in get_dirs(section, subsection, link='move'): logger.info('Starting manual run for {0}:{1} - Folder: {2}'.format(section, subsection, dir_name)) logger.info('Checking database for download info for {0} ...'.format(os.path.basename(dir_name))) core.DOWNLOAD_INFO = get_download_info(os.path.basename(dir_name), 0) if core.DOWNLOAD_INFO: logger.info('Found download info for {0}, ' 'setting variables now ...'.format (os.path.basename(dir_name))) client_agent = text_type(core.DOWNLOAD_INFO[0].get('client_agent', 'manual')) download_id = text_type(core.DOWNLOAD_INFO[0].get('input_id', '')) else: logger.info('Unable to locate download info for {0}, ' 'continuing to try and process this release ...'.format (os.path.basename(dir_name))) client_agent = 'manual' download_id = '' if client_agent and client_agent.lower() not in core.NZB_CLIENTS: continue input_name = os.path.basename(dir_name) results = process(dir_name, input_name, 0, client_agent=client_agent, download_id=download_id or None, input_category=subsection) if results.status_code != 0: logger.error('A problem was reported when trying to perform a manual run for {0}:{1}.'.format (section, subsection)) result = results if result.status_code == 0: logger.info('The {0} script completed successfully.'.format(args[0])) if result.message: print(result.message + '!') if 'NZBOP_SCRIPTDIR' in os.environ: # return code for nzbget v11 del core.MYAPP return core.NZBGET_POSTPROCESS_SUCCESS else: logger.error('A problem was reported in the {0} script.'.format(args[0])) if result.message: print(result.message + '!') if 'NZBOP_SCRIPTDIR' in os.environ: # return code for nzbget v11 del core.MYAPP return core.NZBGET_POSTPROCESS_ERROR del core.MYAPP return result.status_code if __name__ == '__main__': exit(main(sys.argv))