diff --git a/TorrentToMedia.py b/TorrentToMedia.py index 730ad364..70ebd5ba 100755 --- a/TorrentToMedia.py +++ b/TorrentToMedia.py @@ -97,7 +97,12 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID, if clientAgent != 'manual': core.pause_torrent(clientAgent, inputHash, inputID, inputName) - if uniquePath: + # Incase input is not directory, make sure to create one. + # This way Processing is isolated. + if not os.path.isdir(os.path.join(inputDirectory, inputName)): + basename = os.path.splitext(core.sanitizeName(inputName))[0] + outputDestination = os.path.join(core.OUTPUTDIRECTORY, inputCategory, basename) + elif uniquePath: outputDestination = os.path.normpath( core.os.path.join(core.OUTPUTDIRECTORY, inputCategory, core.sanitizeName(inputName))) else: @@ -197,6 +202,9 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID, logger.info("Calling %s:%s to post-process:%s" % (sectionName, usercat, inputName)) + if core.TORRENT_CHMOD_DIRECTORY: + core.rchmod(outputDestination, core.TORRENT_CHMOD_DIRECTORY) + result = [ 0, "" ] if sectionName == 'UserScript': result = external_script(outputDestination, inputName, inputCategory, section[usercat]) @@ -220,7 +228,9 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID, plex_update(inputCategory) if result[0] != 0: - if clientAgent != 'manual': + if not core.TORRENT_RESUME_ON_FAILURE: + logger.error("A problem was reported in the autoProcess* script. torrent won't resume seeding (settings)") + elif clientAgent != 'manual': logger.error( "A problem was reported in the autoProcess* script. If torrent was paused we will resume seeding") core.resume_torrent(clientAgent, inputHash, inputID, inputName) diff --git a/autoProcessMedia.cfg.spec b/autoProcessMedia.cfg.spec index 1d493f15..4f1cac4d 100644 --- a/autoProcessMedia.cfg.spec +++ b/autoProcessMedia.cfg.spec @@ -57,7 +57,7 @@ extract = 1 # Set this to minimum required size to consider a media file valid (in MB) minSize = 0 - # Enable/Disable deleteing ignored files (samples and invalid media files) + # Enable/Disable deleting ignored files (samples and invalid media files) delete_ignored = 0 ##### Enable if Couchpotato is on a remote server for this category remote_path = 0 @@ -83,11 +83,13 @@ process_method = # force processing of already processed content when running a manual scan. force = 0 + # tell SickRage to delete all source files after processing. + delete_on = 0 extract = 1 nzbExtractionBy = Downloader # Set this to minimum required size to consider a media file valid (in MB) minSize = 0 - # Enable/Disable deleteing ignored files (samples and invalid media files) + # Enable/Disable deleting ignored files (samples and invalid media files) delete_ignored = 0 ##### Enable if SickBeard is on a remote server for this category remote_path = 0 @@ -115,7 +117,7 @@ wait_for = 2 # Set this to minimum required size to consider a media file valid (in MB) minSize = 0 - # Enable/Disable deleteing ignored files (samples and invalid media files) + # Enable/Disable deleting ignored files (samples and invalid media files) delete_ignored = 0 ##### Enable if NzbDrone is on a remote server for this category remote_path = 0 @@ -139,7 +141,7 @@ extract = 1 # Set this to minimum required size to consider a media file valid (in MB) minSize = 0 - # Enable/Disable deleteing ignored files (samples and invalid media files) + # Enable/Disable deleting ignored files (samples and invalid media files) delete_ignored = 0 ##### Enable if HeadPhones is on a remote server for this category remote_path = 0 @@ -163,7 +165,7 @@ extract = 1 # Set this to minimum required size to consider a media file valid (in MB) minSize = 0 - # Enable/Disable deleteing ignored files (samples and invalid media files) + # Enable/Disable deleting ignored files (samples and invalid media files) delete_ignored = 0 ##### Enable if Mylar is on a remote server for this category remote_path = 0 @@ -188,7 +190,7 @@ extract = 1 # Set this to minimum required size to consider a media file valid (in MB) minSize = 0 - # Enable/Disable deleteing ignored files (samples and invalid media files) + # Enable/Disable deleting ignored files (samples and invalid media files) delete_ignored = 0 ##### Enable if Gamez is on a remote server for this category remote_path = 0 @@ -204,7 +206,7 @@ ###### clientAgent - Supported clients: sabnzbd, nzbget clientAgent = sabnzbd ###### SabNZBD (You must edit this if your using nzbToMedia.py with SabNZBD) - sabnzbd_host = localhost + sabnzbd_host = http://localhost sabnzbd_port = 8080 sabnzbd_apikey = ###### Enter the default path to your default download directory (non-category downloads). this directory is protected by safe_mode. @@ -239,6 +241,8 @@ DelugePWD = your password ###### ADVANCED USE - ONLY EDIT IF YOU KNOW WHAT YOU'RE DOING ###### deleteOriginal = 0 + chmodDirecotry = 0 + resumeOnFailure = 1 [Extensions] compressedExtensions = .zip,.rar,.7z,.gz,.bz,.tar,.arj,.1,.01,.001 @@ -262,10 +266,11 @@ subLanguages = eng,spa,fra # transcode. enable to use transcoder transcode = 0 - ###### duplicate =1 will cretae a new file. =0 will replace the original + ###### duplicate =1 will create a new file. =0 will replace the original duplicate = 1 # concat. joins cd1 cd2 etc into a single video. concat = 1 + # IgnoreExtensions is a comma-separated list of extensions that will not be transcoded. ignoreExtensions = .avi,.mkv,.mp4 # outputFastStart. 1 will use -movflags + faststart. 0 will disable this from being used. outputFastStart = 0 @@ -279,9 +284,9 @@ audioLanguage = eng # allAudioLanguages. 1 will keep all audio tracks (uses AudioCodec3) where available. allAudioLanguages = 0 - # allSubLanguages. 1 will keep all exisiting sub languages. 0 will discare those not in your list above. + # allSubLanguages. 1 will keep all existing sub languages. 0 will discard those not in your list above. allSubLanguages = 0 - # embedSubs. 1 will embded external sub/srt subs into your video if this is supported. + # embedSubs. 1 will embed external sub/srt subs into your video if this is supported. embedSubs = 1 # burnInSubtitle. burns the default sub language into your video (needed for players that don't support subs) burnInSubtitle = 0 @@ -347,7 +352,7 @@ #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 - #Set user_script_runOnce = 0 to run for each file, or 1 to only run once (presumably on teh entire directory). + #Set user_script_runOnce = 0 to run for each file, or 1 to only run once (presumably on the entire directory). user_script_runOnce = 0 #Specify the successcodes returned by the user script as a comma separated list. Linux default is 0 user_script_successCodes = 0 @@ -371,5 +376,5 @@ [Custom] # enter a list (comma separated) of Group Tags you want removed from filenames to help with subtitle matching. # e.g remove_group = [rarbag],-NZBgeek - # be careful if your "group" is a common "real" word. Please report if you have any group replacments that would fall in this category. + # be careful if your "group" is a common "real" word. Please report if you have any group replacements that would fall in this category. remove_group = diff --git a/core/__init__.py b/core/__init__.py index 7024e7a4..8fcfad28 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -56,8 +56,8 @@ FORK_SICKRAGE = "sickrage" FORKS[FORK_DEFAULT] = {"dir": None} FORKS[FORK_FAILED] = {"dirName": None, "failed": None} FORKS[FORK_FAILED_TORRENT] = {"dir": None, "failed": None, "process_method": None} -FORKS[FORK_SICKRAGE] = {"dir": None, "failed": None, "process_method": None, "force": None} -ALL_FORKS = {"dir": None, "dirName": None, "failed": None, "process_method": None, "force": None} +FORKS[FORK_SICKRAGE] = {"dir": None, "failed": None, "process_method": None, "force": None, "delete_on": None} +ALL_FORKS = {"dir": None, "dirName": None, "failed": None, "process_method": None, "force": None, "delete_on": None} SICKBEARD_FAILED = [FORK_FAILED, FORK_FAILED_TORRENT, FORK_SICKRAGE] SICKBEARD_TORRENT = [FORK_FAILED_TORRENT, FORK_SICKRAGE] @@ -98,7 +98,9 @@ USELINK = None OUTPUTDIRECTORY = None NOFLATTEN = [] DELETE_ORIGINAL = None +TORRENT_CHMOD_DIRECTORY = None TORRENT_DEFAULTDIR = None +TORRENT_RESUME_ON_FAILURE = None REMOTEPATHS = [] @@ -210,9 +212,9 @@ def initialize(section=None): ACODEC2, ACODEC2_ALLOW, ABITRATE2, ACODEC3, ACODEC3_ALLOW, ABITRATE3, ALLOWSUBS, SEXTRACT, SEMBED, SLANGUAGES, \ SINCLUDE, SUBSDIR, SCODEC, OUTPUTFASTSTART, OUTPUTQUALITYPERCENT, BURN, GETSUBS, HWACCEL, LOG_DIR, LOG_FILE, \ NICENESS, LOG_DEBUG, FORCE_CLEAN, FFMPEG_PATH, FFMPEG, FFPROBE, AUDIOCONTAINER, EXTCONTAINER, TORRENT_CLASS, \ - DELETE_ORIGINAL, PASSWORDSFILE, USER_DELAY, USER_SCRIPT, USER_SCRIPT_CLEAN, USER_SCRIPT_MEDIAEXTENSIONS, \ + DELETE_ORIGINAL, TORRENT_CHMOD_DIRECTORY, PASSWORDSFILE, USER_DELAY, USER_SCRIPT, USER_SCRIPT_CLEAN, USER_SCRIPT_MEDIAEXTENSIONS, \ USER_SCRIPT_PARAM, USER_SCRIPT_RUNONCE, USER_SCRIPT_SUCCESSCODES, DOWNLOADINFO, CHECK_MEDIA, SAFE_MODE, \ - TORRENT_DEFAULTDIR, NZB_DEFAULTDIR, REMOTEPATHS, LOG_ENV, PID_FILE, MYAPP, ACHANNELS, ACHANNELS2, ACHANNELS3, \ + TORRENT_DEFAULTDIR, TORRENT_RESUME_ON_FAILURE, NZB_DEFAULTDIR, REMOTEPATHS, LOG_ENV, PID_FILE, MYAPP, ACHANNELS, ACHANNELS2, ACHANNELS3, \ PLEXSSL, PLEXHOST, PLEXPORT, PLEXTOKEN, PLEXSEC if __INITIALIZED__: @@ -339,6 +341,8 @@ def initialize(section=None): if isinstance(NOFLATTEN, str): NOFLATTEN = NOFLATTEN.split(',') if isinstance(CATEGORIES, str): CATEGORIES = CATEGORIES.split(',') DELETE_ORIGINAL = int(CFG["Torrent"]["deleteOriginal"]) + TORRENT_CHMOD_DIRECTORY = int(CFG["Torrent"]["chmodDirecotry"], 8) + TORRENT_RESUME_ON_FAILURE = int(CFG["Torrent"]["resumeOnFailure"]) UTORRENTWEBUI = CFG["Torrent"]["uTorrentWEBui"] # http://localhost:8090/gui/ UTORRENTUSR = CFG["Torrent"]["uTorrentUSR"] # mysecretusr UTORRENTPWD = CFG["Torrent"]["uTorrentPWD"] # mysecretpwr @@ -740,3 +744,15 @@ def restart(): status = p.returncode os._exit(status) + +def rchmod(path, mod): + logger.log("Changing file mode of %s to %s" % (path, oct(mod))) + os.chmod(path, mod) + if not os.path.isdir(path): + return # Skip files + + for root, dirs, files in os.walk(path): + for d in dirs: + os.chmod(os.path.join(root, d), mod) + for f in files: + os.chmod(os.path.join(root, f), mod) diff --git a/core/autoProcess/autoProcessTV.py b/core/autoProcess/autoProcessTV.py index b202177e..da4e6972 100644 --- a/core/autoProcess/autoProcessTV.py +++ b/core/autoProcess/autoProcessTV.py @@ -104,6 +104,10 @@ class autoProcessTV: force = int(core.CFG[section][inputCategory]["force"]) except: force = 0 + try: + delete_on = int(core.CFG[section][inputCategory]["delete_on"]) + except: + delete_on = 0 try: extract = int(section[inputCategory]["extract"]) except: @@ -211,6 +215,12 @@ class autoProcessTV: else: del fork_params[param] + if param == "delete_on": + if delete_on: + fork_params[param] = delete_on + else: + del fork_params[param] + # delete any unused params so we don't pass them to SB by mistake [fork_params.pop(k) for k,v in fork_params.items() if v is None] diff --git a/core/nzbToMediaUtil.py b/core/nzbToMediaUtil.py index f6491274..c5f3b050 100644 --- a/core/nzbToMediaUtil.py +++ b/core/nzbToMediaUtil.py @@ -798,7 +798,10 @@ def find_download(clientAgent, download_id): if clientAgent == 'deluge': return False if clientAgent == 'sabnzbd': - baseURL = "http://%s:%s/api" % (core.SABNZBDHOST, core.SABNZBDPORT) + if "http" in core.SABNZBDHOST: + baseURL = "%s:%s/api" % (core.SABNZBDHOST, core.SABNZBDPORT) + else: + baseURL = "http://%s:%s/api" % (core.SABNZBDHOST, core.SABNZBDPORT) url = baseURL params = {} params['apikey'] = core.SABNZBDAPIKEY @@ -819,7 +822,10 @@ def find_download(clientAgent, download_id): def get_nzoid(inputName): nzoid = None logger.debug("Searching for nzoid from SAbnzbd ...") - baseURL = "http://%s:%s/api" % (core.SABNZBDHOST, core.SABNZBDPORT) + if "http" in core.SABNZBDHOST: + baseURL = "%s:%s/api" % (core.SABNZBDHOST, core.SABNZBDPORT) + else: + baseURL = "http://%s:%s/api" % (core.SABNZBDHOST, core.SABNZBDPORT) url = baseURL params = {} params['apikey'] = core.SABNZBDAPIKEY @@ -1057,7 +1063,7 @@ def server_responding(baseURL): def plex_update(category): if core.PLEXSSL: - ulr = 'https://' + url = 'https://' else: url = 'http://' url = url + core.PLEXHOST + ':' + core.PLEXPORT + '/library/sections/' diff --git a/core/transcoder/transcoder.py b/core/transcoder/transcoder.py index 51d789cf..9ef83ad7 100644 --- a/core/transcoder/transcoder.py +++ b/core/transcoder/transcoder.py @@ -277,8 +277,6 @@ def buildCommands(file, newDir, movieName, bitbucket): audio_cmd.extend(['-c:a:' + str(used_audio), core.ACODEC]) else: audio_cmd.extend(['-c:a:' + str(used_audio), 'copy']) - if core.ACODEC == 'aac': - audio_cmd.extend(['-strict', '-2']) elif audio3: # just pick the default audio track map_cmd.extend(['-map', '0:' + str(audio3[0]["index"])]) a_mapped.extend([audio3[0]["index"]]) @@ -292,8 +290,6 @@ def buildCommands(file, newDir, movieName, bitbucket): audio_cmd.extend(['-c:a:' + str(used_audio), core.ACODEC]) else: audio_cmd.extend(['-c:a:' + str(used_audio), 'copy']) - if core.ACODEC == 'aac': - audio_cmd.extend(['-strict', '-2']) if core.ACHANNELS and channels and channels > core.ACHANNELS: audio_cmd.extend(['-ac:a:' + str(used_audio), str(core.ACHANNELS)]) @@ -307,6 +303,8 @@ def buildCommands(file, newDir, movieName, bitbucket): audio_cmd.extend(['-q:a:' + str(used_audio), str(core.OUTPUTQUALITYPERCENT)]) if audio_cmd[1] == 'copy': audio_cmd[1] = core.ACODEC + if audio_cmd[1] == 'aac': + audio_cmd[2:2] = ['-strict', '-2'] if core.ACODEC2_ALLOW: used_audio += 1 @@ -334,8 +332,6 @@ def buildCommands(file, newDir, movieName, bitbucket): audio_cmd2.extend(['-c:a:' + str(used_audio), core.ACODEC2]) else: audio_cmd2.extend(['-c:a:' + str(used_audio), 'copy']) - if core.ACODEC2 == 'aac': - audio_cmd2.extend(['-strict', '-2']) elif audio3: # just pick the default audio track map_cmd.extend(['-map', '0:' + str(audio3[0]["index"])]) a_mapped.extend([audio3[0]["index"]]) @@ -349,8 +345,6 @@ def buildCommands(file, newDir, movieName, bitbucket): audio_cmd2.extend(['-c:a:' + str(used_audio), core.ACODEC2]) else: audio_cmd2.extend(['-c:a:' + str(used_audio), 'copy']) - if core.ACODEC2 == 'aac': - audio_cmd2.extend(['-strict', '-2']) if core.ACHANNELS2 and channels and channels > core.ACHANNELS2: audio_cmd2.extend(['-ac:a:' + str(used_audio), str(core.ACHANNELS2)]) @@ -364,6 +358,8 @@ def buildCommands(file, newDir, movieName, bitbucket): audio_cmd2.extend(['-q:a:' + str(used_audio), str(core.OUTPUTQUALITYPERCENT)]) if audio_cmd2[1] == 'copy': audio_cmd2[1] = core.ACODEC2 + if audio_cmd2[1] == 'aac': + audio_cmd2[2:2] = ['-strict', '-2'] audio_cmd.extend(audio_cmd2) if core.AINCLUDE and audio3 and core.ACODEC3: @@ -386,8 +382,6 @@ def buildCommands(file, newDir, movieName, bitbucket): audio_cmd3.extend(['-c:a:' + str(used_audio), core.ACODEC3]) else: audio_cmd3.extend(['-c:a:' + str(used_audio), 'copy']) - if core.ACODEC3 == 'aac': - audio_cmd3.extend(['-strict', '-2']) if core.ACHANNELS3 and channels and channels > core.ACHANNELS3: audio_cmd3.extend(['-ac:a:' + str(used_audio), str(core.ACHANNELS3)]) @@ -401,6 +395,8 @@ def buildCommands(file, newDir, movieName, bitbucket): audio_cmd3.extend(['-q:a:' + str(used_audio), str(core.OUTPUTQUALITYPERCENT)]) if audio_cmd3[1] == 'copy': audio_cmd3[1] = core.ACODEC3 + if audio_cmd3[1] == 'aac': + audio_cmd3[2:2] = ['-strict', '-2'] audio_cmd.extend(audio_cmd3) s_mapped = []