mirror of
https://github.com/clinton-hall/nzbToMedia.git
synced 2025-08-19 21:03:14 -07:00
Resolves userscript issues.
Converted userscript categories to new subsection format.
This commit is contained in:
parent
a81464502e
commit
0d725a78d6
6 changed files with 106 additions and 91 deletions
|
@ -9,12 +9,23 @@ import nzbtomedia
|
|||
from subprocess import Popen
|
||||
from nzbtomedia import logger, nzbToMediaDB
|
||||
|
||||
USER_SCRIPT_MEDIAEXTENSIONS = None
|
||||
USER_SCRIPT = None
|
||||
USER_SCRIPT_PARAM = None
|
||||
USER_SCRIPT_SUCCESSCODES = None
|
||||
USER_SCRIPT_CLEAN = None
|
||||
USER_DELAY = None
|
||||
USER_SCRIPT_RUNONCE = None
|
||||
|
||||
|
||||
def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID, clientAgent):
|
||||
status = 1 # 1 = failed | 0 = success
|
||||
root = 0
|
||||
foundFile = 0
|
||||
|
||||
global USER_DELAY, USER_SCRIPT, USER_SCRIPT_CLEAN, USER_SCRIPT_MEDIAEXTENSIONS, \
|
||||
USER_SCRIPT_PARAM, USER_SCRIPT_RUNONCE, USER_SCRIPT_SUCCESSCODES
|
||||
|
||||
if clientAgent != 'manual':
|
||||
logger.debug('Adding TORRENT download info for directory %s to database' % (inputDirectory))
|
||||
|
||||
|
@ -64,6 +75,15 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
|||
except:
|
||||
extract = 0
|
||||
|
||||
if not "NONE" in nzbtomedia.USER_SCRIPT_CATEGORIES:
|
||||
USER_SCRIPT_MEDIAEXTENSIONS = (section[inputCategory]["user_script_mediaExtensions"])
|
||||
USER_SCRIPT = section[inputCategory]["user_script_path"]
|
||||
USER_SCRIPT_PARAM = (section[inputCategory]["user_script_param"])
|
||||
USER_SCRIPT_SUCCESSCODES = (section[inputCategory]["user_script_successCodes"])
|
||||
USER_SCRIPT_CLEAN = int(section[inputCategory]["user_script_clean"])
|
||||
USER_DELAY = int(section[inputCategory]["delay"])
|
||||
USER_SCRIPT_RUNONCE = int(section[inputCategory]["user_script_runOnce"])
|
||||
|
||||
if clientAgent != 'manual':
|
||||
nzbtomedia.pause_torrent(clientAgent, inputHash, inputID, inputName)
|
||||
|
||||
|
@ -163,7 +183,7 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
|||
result = 0
|
||||
if (inputCategory in nzbtomedia.USER_SCRIPT_CATEGORIES and not "NONE" in nzbtomedia.USER_SCRIPT_CATEGORIES) or (
|
||||
"ALL" in nzbtomedia.USER_SCRIPT_CATEGORIES and not inputCategory in processCategories):
|
||||
logger.info("Processing user script %s." % (nzbtomedia.USER_SCRIPT))
|
||||
logger.info("Processing user script %s." % (USER_SCRIPT))
|
||||
result = external_script(outputDestination, inputName, inputCategory)
|
||||
elif status != 0:
|
||||
logger.error("Something failed! Please check logs. Exiting")
|
||||
|
@ -213,12 +233,12 @@ def external_script(outputDestination, torrentName, torrentLabel):
|
|||
filePath = nzbtomedia.os.path.join(dirpath, file)
|
||||
fileName, fileExtension = os.path.splitext(file)
|
||||
|
||||
if fileExtension in nzbtomedia.USER_SCRIPT_MEDIAEXTENSIONS or "ALL" in nzbtomedia.USER_SCRIPT_MEDIAEXTENSIONS:
|
||||
if fileExtension in USER_SCRIPT_MEDIAEXTENSIONS or "ALL" in USER_SCRIPT_MEDIAEXTENSIONS:
|
||||
num_files = num_files + 1
|
||||
if nzbtomedia.USER_SCRIPT_RUNONCE == 1 and num_files > 1: # we have already run once, so just continue to get number of files.
|
||||
if USER_SCRIPT_RUNONCE == 1 and num_files > 1: # we have already run once, so just continue to get number of files.
|
||||
continue
|
||||
command = [nzbtomedia.USER_SCRIPT]
|
||||
for param in nzbtomedia.USER_SCRIPT_PARAM:
|
||||
command = [USER_SCRIPT]
|
||||
for param in USER_SCRIPT_PARAM:
|
||||
if param == "FN":
|
||||
command.append(file)
|
||||
continue
|
||||
|
@ -232,7 +252,7 @@ def external_script(outputDestination, torrentName, torrentLabel):
|
|||
command.append(torrentLabel)
|
||||
continue
|
||||
elif param == "DN":
|
||||
if nzbtomedia.USER_SCRIPT_RUNONCE == 1:
|
||||
if USER_SCRIPT_RUNONCE == 1:
|
||||
command.append(outputDestination)
|
||||
else:
|
||||
command.append(dirpath)
|
||||
|
@ -247,7 +267,7 @@ def external_script(outputDestination, torrentName, torrentLabel):
|
|||
try:
|
||||
p = Popen(command)
|
||||
res = p.wait()
|
||||
if str(res) in nzbtomedia.USER_SCRIPT_SUCCESSCODES: # Linux returns 0 for successful.
|
||||
if str(res) in USER_SCRIPT_SUCCESSCODES: # Linux returns 0 for successful.
|
||||
logger.info("UserScript %s was successfull" % (command[0]))
|
||||
result = 0
|
||||
else:
|
||||
|
@ -261,20 +281,20 @@ def external_script(outputDestination, torrentName, torrentLabel):
|
|||
result = int(1)
|
||||
final_result = final_result + result
|
||||
|
||||
time.sleep(nzbtomedia.USER_DELAY)
|
||||
time.sleep(USER_DELAY)
|
||||
num_files_new = 0
|
||||
for dirpath, dirnames, filenames in os.walk(outputDestination):
|
||||
for file in filenames:
|
||||
filePath = nzbtomedia.os.path.join(dirpath, file)
|
||||
fileName, fileExtension = os.path.splitext(file)
|
||||
|
||||
if fileExtension in nzbtomedia.USER_SCRIPT_MEDIAEXTENSIONS or nzbtomedia.USER_SCRIPT_MEDIAEXTENSIONS == "ALL":
|
||||
if fileExtension in USER_SCRIPT_MEDIAEXTENSIONS or USER_SCRIPT_MEDIAEXTENSIONS == "ALL":
|
||||
num_files_new = num_files_new + 1
|
||||
|
||||
if nzbtomedia.USER_SCRIPT_CLEAN == int(1) and num_files_new == 0 and final_result == 0:
|
||||
if USER_SCRIPT_CLEAN == int(1) and num_files_new == 0 and final_result == 0:
|
||||
logger.info("All files have been processed. Cleaning outputDirectory %s" % (outputDestination))
|
||||
shutil.rmtree(outputDestination)
|
||||
elif nzbtomedia.USER_SCRIPT_CLEAN == int(1) and num_files_new != 0:
|
||||
elif USER_SCRIPT_CLEAN == int(1) and num_files_new != 0:
|
||||
logger.info("%s files were processed, but %s still remain. outputDirectory will not be cleaned." % (
|
||||
num_files, num_files_new))
|
||||
return final_result
|
||||
|
|
|
@ -240,10 +240,11 @@
|
|||
mac = 00:01:2e:2D:64:e1
|
||||
|
||||
[UserScript]
|
||||
#Use user_script for uncategorized download?
|
||||
#Set the categories to use external script, comma separated.
|
||||
#Use user_script for uncategorized downloads
|
||||
#Set the categories to use external script.
|
||||
#Use "UNCAT" to process non-category downloads, and "ALL" for all. Set to "NONE" to disable external script.
|
||||
user_script_categories = NONE
|
||||
[[UNCAT]]
|
||||
enabled = 0
|
||||
#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
|
||||
#Specify the path to your custom script
|
||||
|
|
|
@ -85,7 +85,6 @@ TORRENT_CLIENTAGENT = None
|
|||
TORRENT_CLASS = None
|
||||
USELINK = None
|
||||
OUTPUTDIRECTORY = None
|
||||
CATEGORIES = []
|
||||
NOFLATTEN = []
|
||||
DELETE_ORIGINAL = None
|
||||
|
||||
|
@ -103,15 +102,15 @@ DELUGEPORT = None
|
|||
DELUGEUSR = None
|
||||
DELUGEPWD = None
|
||||
|
||||
EXTCONTAINER = None
|
||||
COMPRESSEDCONTAINER = None
|
||||
MEDIACONTAINER = None
|
||||
AUDIOCONTAINER = None
|
||||
METACONTAINER = None
|
||||
MINSAMPLESIZE = None
|
||||
SAMPLEIDS = None
|
||||
EXTCONTAINER = []
|
||||
COMPRESSEDCONTAINER = []
|
||||
MEDIACONTAINER = []
|
||||
AUDIOCONTAINER = []
|
||||
METACONTAINER = []
|
||||
|
||||
SECTIONS = []
|
||||
CATEGORIES = []
|
||||
USER_SCRIPT_CATEGORIES = []
|
||||
|
||||
TRANSCODE = None
|
||||
FFMPEG_PATH = None
|
||||
|
@ -131,15 +130,6 @@ FFMPEG = None
|
|||
FFPROBE = None
|
||||
NICENESS = None
|
||||
|
||||
USER_SCRIPT_CATEGORIES = None
|
||||
USER_SCRIPT_MEDIAEXTENSIONS = None
|
||||
USER_SCRIPT = None
|
||||
USER_SCRIPT_PARAM = None
|
||||
USER_SCRIPT_SUCCESSCODES = None
|
||||
USER_SCRIPT_CLEAN = None
|
||||
USER_DELAY = None
|
||||
USER_SCRIPT_RUNONCE = None
|
||||
|
||||
PASSWORDSFILE = None
|
||||
|
||||
__INITIALIZED__ = False
|
||||
|
@ -150,14 +140,13 @@ def initialize(section=None):
|
|||
NZBTOMEDIA_BRANCH, NZBTOMEDIA_VERSION, NEWEST_VERSION, NEWEST_VERSION_STRING, VERSION_NOTIFY, SYS_ARGV, CFG, \
|
||||
SABNZB_NO_OF_ARGUMENTS, SABNZB_0717_NO_OF_ARGUMENTS, CATEGORIES, TORRENT_CLIENTAGENT, USELINK, OUTPUTDIRECTORY, NOFLATTEN, \
|
||||
UTORRENTPWD, UTORRENTUSR, UTORRENTWEBUI, DELUGEHOST, DELUGEPORT, DELUGEUSR, DELUGEPWD, TRANSMISSIONHOST, TRANSMISSIONPORT, \
|
||||
TRANSMISSIONPWD, TRANSMISSIONUSR, COMPRESSEDCONTAINER, MEDIACONTAINER, METACONTAINER, MINSAMPLESIZE, SAMPLEIDS, \
|
||||
SECTIONS, USER_SCRIPT_CATEGORIES, __INITIALIZED__, AUTO_UPDATE, APP_FILENAME, USER_DELAY, USER_SCRIPT_RUNONCE, \
|
||||
APP_NAME, USER_SCRIPT_MEDIAEXTENSIONS, USER_SCRIPT, USER_SCRIPT_PARAM, USER_SCRIPT_SUCCESSCODES, USER_SCRIPT_CLEAN, \
|
||||
TRANSCODE, GIT_PATH, GIT_USER, GIT_BRANCH, GIT_REPO, SYS_ENCODING, NZB_CLIENTAGENT, SABNZBDHOST, SABNZBDPORT, SABNZBDAPIKEY, \
|
||||
TRANSMISSIONPWD, TRANSMISSIONUSR, COMPRESSEDCONTAINER, MEDIACONTAINER, METACONTAINER, SECTIONS, USER_SCRIPT_CATEGORIES, \
|
||||
__INITIALIZED__, AUTO_UPDATE, APP_FILENAME, USER_DELAY, APP_NAME, TRANSCODE, GIT_PATH, GIT_USER, \
|
||||
GIT_BRANCH, GIT_REPO, SYS_ENCODING, NZB_CLIENTAGENT, SABNZBDHOST, SABNZBDPORT, SABNZBDAPIKEY, \
|
||||
DUPLICATE, IGNOREEXTENSIONS, OUTPUTVIDEOEXTENSION, OUTPUTVIDEOCODEC, OUTPUTVIDEOPRESET, OUTPUTVIDEOFRAMERATE, LOG_DB, \
|
||||
OUTPUTVIDEOBITRATE, OUTPUTAUDIOCODEC, OUTPUTAUDIOBITRATE, OUTPUTSUBTITLECODEC, OUTPUTFASTSTART, OUTPUTQUALITYPERCENT, \
|
||||
NICENESS, LOG_DEBUG, FORCE_CLEAN, FFMPEG_PATH, FFMPEG, FFPROBE, AUDIOCONTAINER, EXTCONTAINER, TORRENT_CLASS, DELETE_ORIGINAL,\
|
||||
PASSWORDSFILE
|
||||
NICENESS, LOG_DEBUG, FORCE_CLEAN, FFMPEG_PATH, FFMPEG, FFPROBE, AUDIOCONTAINER, EXTCONTAINER, TORRENT_CLASS, \
|
||||
DELETE_ORIGINAL, PASSWORDSFILE
|
||||
|
||||
if __INITIALIZED__:
|
||||
return False
|
||||
|
@ -323,18 +312,11 @@ def initialize(section=None):
|
|||
logger.warning("Failed to locate ffprobe, video corruption detection disabled!")
|
||||
logger.warning("Install ffmpeg with x264 support to enable this feature ...")
|
||||
|
||||
USER_SCRIPT_CATEGORIES = CFG["UserScript"]["user_script_categories"]
|
||||
if not "NONE" in USER_SCRIPT_CATEGORIES:
|
||||
USER_SCRIPT_MEDIAEXTENSIONS = (CFG["UserScript"]["user_script_mediaExtensions"])
|
||||
USER_SCRIPT = CFG["UserScript"]["user_script_path"]
|
||||
USER_SCRIPT_PARAM = (CFG["UserScript"]["user_script_param"])
|
||||
USER_SCRIPT_SUCCESSCODES = (CFG["UserScript"]["user_script_successCodes"])
|
||||
USER_SCRIPT_CLEAN = int(CFG["UserScript"]["user_script_clean"])
|
||||
USER_DELAY = int(CFG["UserScript"]["delay"])
|
||||
USER_SCRIPT_RUNONCE = int(CFG["UserScript"]["user_script_runOnce"])
|
||||
# userscript
|
||||
map(USER_SCRIPT_CATEGORIES.append, ([subsections[0] for subsections in CFG['UserScript'].items()]))
|
||||
|
||||
# check for script-defied section and if None set to allow sections
|
||||
SECTIONS = CFG[tuple(x for x in CFG if CFG[x].sections) if not section else (section,)]
|
||||
SECTIONS = CFG[tuple(x for x in CFG if CFG[x].sections and CFG[x].isenabled()) if not section else (section,)]
|
||||
map(CATEGORIES.extend,([subsection.sections for section,subsection in SECTIONS.items()]))
|
||||
CATEGORIES = list(set(CATEGORIES))
|
||||
|
||||
|
|
|
@ -10,18 +10,21 @@ class Section(configobj.Section):
|
|||
def isenabled(section):
|
||||
# checks if subsection enabled, returns true/false if subsection specified otherwise returns true/false in {}
|
||||
if not section.sections:
|
||||
if int(section['enabled']) == 1:
|
||||
try:
|
||||
value = list(ConfigObj.find_key(section, 'enabled'))[0]
|
||||
except:value = 0
|
||||
if int(value) == 1:
|
||||
return section
|
||||
else:
|
||||
to_return = copy.deepcopy(section)
|
||||
for section_name, subsections in to_return.items():
|
||||
if subsections.sections:
|
||||
for subsection in subsections:
|
||||
if not int(subsections[subsection]['enabled']) == 1:
|
||||
del subsections[subsection]
|
||||
else:
|
||||
if not int(subsections['enabled']) == 1:
|
||||
del to_return[section_name]
|
||||
try:
|
||||
value = list(ConfigObj.find_key(subsections, 'enabled'))[0]
|
||||
except:value = 0
|
||||
|
||||
if int(value) != 1:
|
||||
del to_return[section_name][subsection]
|
||||
|
||||
# cleanout empty sections and subsections
|
||||
for key in [k for (k, v) in to_return.items() if not v]:
|
||||
|
@ -32,7 +35,11 @@ class Section(configobj.Section):
|
|||
def findsection(section, key):
|
||||
to_return = copy.deepcopy(section)
|
||||
for subsection in to_return:
|
||||
if key not in to_return[subsection]:
|
||||
try:
|
||||
value = list(ConfigObj.find_key(to_return[subsection], key))[0]
|
||||
except:value = None
|
||||
|
||||
if not value:
|
||||
del to_return[subsection]
|
||||
|
||||
# cleanout empty sections and subsections
|
||||
|
@ -74,6 +81,19 @@ class ConfigObj(configobj.ConfigObj, Section):
|
|||
super(configobj.ConfigObj, self).__init__(*args, **kw)
|
||||
self.interpolation = False
|
||||
|
||||
@staticmethod
|
||||
def find_key(node, kv):
|
||||
if isinstance(node, list):
|
||||
for i in node:
|
||||
for x in ConfigObj.find_key(i, kv):
|
||||
yield x
|
||||
elif isinstance(node, dict):
|
||||
if kv in node:
|
||||
yield node[kv]
|
||||
for j in node.values():
|
||||
for x in ConfigObj.find_key(j, kv):
|
||||
yield x
|
||||
|
||||
@staticmethod
|
||||
def migrate():
|
||||
global CFG_NEW, CFG_OLD
|
||||
|
@ -152,19 +172,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
|||
values.pop(option)
|
||||
|
||||
# remove any options that we no longer need so they don't migrate into our new config
|
||||
def find_key(node, kv):
|
||||
if isinstance(node, list):
|
||||
for i in node:
|
||||
for x in find_key(i, kv):
|
||||
yield x
|
||||
elif isinstance(node, dict):
|
||||
if kv in node:
|
||||
yield node[kv]
|
||||
for j in node.values():
|
||||
for x in find_key(j, kv):
|
||||
yield x
|
||||
|
||||
if not list(find_key(CFG_NEW, option)):
|
||||
if not list(ConfigObj.find_key(CFG_NEW, option)):
|
||||
values.pop(option)
|
||||
|
||||
return values
|
||||
|
|
|
@ -436,13 +436,17 @@ def getDirs(section, subsection):
|
|||
os.path.isdir(os.path.join(path, o))])
|
||||
return folders
|
||||
|
||||
try:
|
||||
watch_dir = nzbtomedia.CFG[section][subsection]["watch_dir"]
|
||||
if os.path.exists(watch_dir):
|
||||
to_return.extend(processDir(watch_dir))
|
||||
except:pass
|
||||
|
||||
try:
|
||||
outputDirectory = os.path.join(nzbtomedia.OUTPUTDIRECTORY, subsection)
|
||||
if os.path.exists(outputDirectory):
|
||||
to_return.extend(processDir(outputDirectory))
|
||||
except:pass
|
||||
|
||||
if not to_return:
|
||||
logger.debug("No directories identified in %s:%s for post-processing" % (section,subsection))
|
||||
|
|
|
@ -8,6 +8,6 @@ from nzbtomedia.nzbToMediaUtil import get_downloadInfo
|
|||
# Initialize the config
|
||||
nzbtomedia.initialize()
|
||||
|
||||
test = nzbtomedia.CFG['SickBeard','NzbDrone']['tv']
|
||||
test = nzbtomedia.CFG['SickBeard','NzbDrone']['tv'].isenabled()
|
||||
section = nzbtomedia.CFG.findsection('tv').isenabled()
|
||||
print section
|
Loading…
Add table
Add a link
Reference in a new issue