mirror of
https://github.com/clinton-hall/nzbToMedia.git
synced 2025-07-14 01:02:55 -07:00
Merge pull request #1050 from clinton-hall/code-cleanup-3
Code cleanup 3
This commit is contained in:
commit
0ce7582da5
24 changed files with 824 additions and 816 deletions
|
@ -1,28 +1,26 @@
|
||||||
#!/usr/bin/env python2
|
#!/usr/bin/env python2
|
||||||
|
# coding=utf-8
|
||||||
import datetime
|
import datetime
|
||||||
import os
|
import os
|
||||||
import time
|
|
||||||
import shutil
|
|
||||||
import sys
|
import sys
|
||||||
import core
|
import core
|
||||||
|
|
||||||
from subprocess import Popen
|
from libs.six import text_type
|
||||||
from core import logger, nzbToMediaDB
|
from core import logger, nzbToMediaDB
|
||||||
from core.nzbToMediaUtil import convert_to_ascii, CharReplace, plex_update
|
from core.nzbToMediaUtil import convert_to_ascii, CharReplace, plex_update, replace_links
|
||||||
from core.nzbToMediaUserScript import external_script
|
from core.nzbToMediaUserScript import external_script
|
||||||
|
|
||||||
|
|
||||||
def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID, clientAgent):
|
def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID, clientAgent):
|
||||||
status = 1 # 1 = failed | 0 = success
|
status = 1 # 1 = failed | 0 = success
|
||||||
root = 0
|
root = 0
|
||||||
foundFile = 0
|
foundFile = 0
|
||||||
uniquePath = 1
|
|
||||||
|
|
||||||
if clientAgent != 'manual' and not core.DOWNLOADINFO:
|
if clientAgent != 'manual' and not core.DOWNLOADINFO:
|
||||||
logger.debug('Adding TORRENT download info for directory {0} to database'.format(inputDirectory))
|
logger.debug('Adding TORRENT download info for directory {0} to database'.format(inputDirectory))
|
||||||
|
|
||||||
myDB = nzbToMediaDB.DBConnection()
|
myDB = nzbToMediaDB.DBConnection()
|
||||||
|
|
||||||
encoded = False
|
|
||||||
inputDirectory1 = inputDirectory
|
inputDirectory1 = inputDirectory
|
||||||
inputName1 = inputName
|
inputName1 = inputName
|
||||||
|
|
||||||
|
@ -32,31 +30,33 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
controlValueDict = {"input_directory": unicode(inputDirectory1)}
|
controlValueDict = {"input_directory": text_type(inputDirectory1)}
|
||||||
newValueDict = {"input_name": unicode(inputName1),
|
newValueDict = {"input_name": text_type(inputName1),
|
||||||
"input_hash": unicode(inputHash),
|
"input_hash": text_type(inputHash),
|
||||||
"input_id": unicode(inputID),
|
"input_id": text_type(inputID),
|
||||||
"client_agent": unicode(clientAgent),
|
"client_agent": text_type(clientAgent),
|
||||||
"status": 0,
|
"status": 0,
|
||||||
"last_update": datetime.date.today().toordinal()
|
"last_update": datetime.date.today().toordinal()
|
||||||
}
|
}
|
||||||
myDB.upsert("downloads", newValueDict, controlValueDict)
|
myDB.upsert("downloads", newValueDict, controlValueDict)
|
||||||
|
|
||||||
logger.debug("Received Directory: {0} | Name: {1} | Category: {2}".format(inputDirectory, inputName, inputCategory))
|
logger.debug("Received Directory: {0} | Name: {1} | Category: {2}".format(inputDirectory, inputName, inputCategory))
|
||||||
|
|
||||||
inputDirectory, inputName, inputCategory, root = core.category_search(inputDirectory, inputName,
|
inputDirectory, inputName, inputCategory, root = core.category_search(inputDirectory, inputName,
|
||||||
inputCategory, root,
|
inputCategory, root,
|
||||||
core.CATEGORIES) # Confirm the category by parsing directory structure
|
core.CATEGORIES) # Confirm the category by parsing directory structure
|
||||||
if inputCategory == "":
|
if inputCategory == "":
|
||||||
inputCategory = "UNCAT"
|
inputCategory = "UNCAT"
|
||||||
|
|
||||||
usercat = inputCategory
|
usercat = inputCategory
|
||||||
try:
|
try:
|
||||||
inputName = inputName.encode(core.SYS_ENCODING)
|
inputName = inputName.encode(core.SYS_ENCODING)
|
||||||
except: pass
|
except UnicodeError:
|
||||||
|
pass
|
||||||
try:
|
try:
|
||||||
inputDirectory = inputDirectory.encode(core.SYS_ENCODING)
|
inputDirectory = inputDirectory.encode(core.SYS_ENCODING)
|
||||||
except: pass
|
except UnicodeError:
|
||||||
|
pass
|
||||||
|
|
||||||
logger.debug("Determined Directory: {0} | Name: {1} | Category: {2}".format(inputDirectory, inputName, inputCategory))
|
logger.debug("Determined Directory: {0} | Name: {1} | Category: {2}".format(inputDirectory, inputName, inputCategory))
|
||||||
|
|
||||||
|
@ -86,30 +86,15 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
inputCategory))
|
inputCategory))
|
||||||
return [-1, ""]
|
return [-1, ""]
|
||||||
|
|
||||||
try:
|
Torrent_NoLink = int(section[usercat].get("Torrent_NoLink", 0))
|
||||||
Torrent_NoLink = int(section[usercat]["Torrent_NoLink"])
|
keep_archive = int(section[usercat].get("keep_archive", 0))
|
||||||
except:
|
extract = int(section[usercat].get('extract', 0))
|
||||||
Torrent_NoLink = 0
|
uniquePath = int(section[usercat].get("unique_path", 1))
|
||||||
|
|
||||||
try:
|
|
||||||
keep_archive = int(section[usercat]["keep_archive"])
|
|
||||||
except:
|
|
||||||
keep_archive = 0
|
|
||||||
|
|
||||||
try:
|
|
||||||
extract = int(section[usercat]['extract'])
|
|
||||||
except:
|
|
||||||
extract = 0
|
|
||||||
|
|
||||||
try:
|
|
||||||
uniquePath = int(section[usercat]["unique_path"])
|
|
||||||
except:
|
|
||||||
uniquePath = 1
|
|
||||||
|
|
||||||
if clientAgent != 'manual':
|
if clientAgent != 'manual':
|
||||||
core.pause_torrent(clientAgent, inputHash, inputID, inputName)
|
core.pause_torrent(clientAgent, inputHash, inputID, inputName)
|
||||||
|
|
||||||
# Incase input is not directory, make sure to create one.
|
# In case input is not directory, make sure to create one.
|
||||||
# This way Processing is isolated.
|
# This way Processing is isolated.
|
||||||
if not os.path.isdir(os.path.join(inputDirectory, inputName)):
|
if not os.path.isdir(os.path.join(inputDirectory, inputName)):
|
||||||
basename = os.path.basename(inputDirectory)
|
basename = os.path.basename(inputDirectory)
|
||||||
|
@ -124,7 +109,8 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
core.os.path.join(core.OUTPUTDIRECTORY, inputCategory))
|
core.os.path.join(core.OUTPUTDIRECTORY, inputCategory))
|
||||||
try:
|
try:
|
||||||
outputDestination = outputDestination.encode(core.SYS_ENCODING)
|
outputDestination = outputDestination.encode(core.SYS_ENCODING)
|
||||||
except: pass
|
except UnicodeError:
|
||||||
|
pass
|
||||||
|
|
||||||
if outputDestination in inputDirectory:
|
if outputDestination in inputDirectory:
|
||||||
outputDestination = inputDirectory
|
outputDestination = inputDirectory
|
||||||
|
@ -134,7 +120,7 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
if core.SAFE_MODE and outputDestination == core.TORRENT_DEFAULTDIR:
|
if core.SAFE_MODE and outputDestination == core.TORRENT_DEFAULTDIR:
|
||||||
logger.error(
|
logger.error(
|
||||||
'The output directory:[{0}] is the Download Directory. Edit outputDirectory in autoProcessMedia.cfg. Exiting'.format(
|
'The output directory:[{0}] is the Download Directory. Edit outputDirectory in autoProcessMedia.cfg. Exiting'.format(
|
||||||
inputDirectory))
|
inputDirectory))
|
||||||
return [-1, ""]
|
return [-1, ""]
|
||||||
|
|
||||||
logger.debug("Scanning files in directory: {0}".format(inputDirectory))
|
logger.debug("Scanning files in directory: {0}".format(inputDirectory))
|
||||||
|
@ -164,12 +150,13 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
"Setting outputDestination to {0} to preserve folder structure".format(os.path.dirname(targetFile)))
|
"Setting outputDestination to {0} to preserve folder structure".format(os.path.dirname(targetFile)))
|
||||||
try:
|
try:
|
||||||
targetFile = targetFile.encode(core.SYS_ENCODING)
|
targetFile = targetFile.encode(core.SYS_ENCODING)
|
||||||
except: pass
|
except UnicodeError:
|
||||||
|
pass
|
||||||
if root == 1:
|
if root == 1:
|
||||||
if not foundFile:
|
if not foundFile:
|
||||||
logger.debug("Looking for {0} in: {1}".format(inputName, inputFile))
|
logger.debug("Looking for {0} in: {1}".format(inputName, inputFile))
|
||||||
if (core.sanitizeName(inputName) in core.sanitizeName(inputFile)) or (
|
if any([core.sanitizeName(inputName) in core.sanitizeName(inputFile),
|
||||||
core.sanitizeName(fileName) in core.sanitizeName(inputName)):
|
core.sanitizeName(fileName) in core.sanitizeName(inputName)]):
|
||||||
foundFile = True
|
foundFile = True
|
||||||
logger.debug("Found file {0} that matches Torrent Name {1}".format(fullFileName, inputName))
|
logger.debug("Found file {0} that matches Torrent Name {1}".format(fullFileName, inputName))
|
||||||
else:
|
else:
|
||||||
|
@ -183,7 +170,7 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
logger.debug("Looking for files with modified/created dates less than 5 minutes old.")
|
logger.debug("Looking for files with modified/created dates less than 5 minutes old.")
|
||||||
if (mtime_lapse < datetime.timedelta(minutes=5)) or (ctime_lapse < datetime.timedelta(minutes=5)):
|
if (mtime_lapse < datetime.timedelta(minutes=5)) or (ctime_lapse < datetime.timedelta(minutes=5)):
|
||||||
foundFile = True
|
foundFile = True
|
||||||
logger.debug("Found file {0} with date modifed/created less than 5 minutes ago.".format(fullFileName))
|
logger.debug("Found file {0} with date modified/created less than 5 minutes ago.".format(fullFileName))
|
||||||
else:
|
else:
|
||||||
continue # This file has not been recently moved or created, skip it
|
continue # This file has not been recently moved or created, skip it
|
||||||
|
|
||||||
|
@ -200,7 +187,7 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
logger.debug('Checking for archives to extract in directory: {0}'.format(inputDirectory))
|
logger.debug('Checking for archives to extract in directory: {0}'.format(inputDirectory))
|
||||||
core.extractFiles(inputDirectory, outputDestination, keep_archive)
|
core.extractFiles(inputDirectory, outputDestination, keep_archive)
|
||||||
|
|
||||||
if not inputCategory in core.NOFLATTEN: #don't flatten hp in case multi cd albums, and we need to copy this back later.
|
if inputCategory not in core.NOFLATTEN: # don't flatten hp in case multi cd albums, and we need to copy this back later.
|
||||||
core.flatten(outputDestination)
|
core.flatten(outputDestination)
|
||||||
|
|
||||||
# Now check if video files exist in destination:
|
# Now check if video files exist in destination:
|
||||||
|
@ -217,7 +204,7 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
logger.warning("Found no media files in {0}".format(outputDestination))
|
logger.warning("Found no media files in {0}".format(outputDestination))
|
||||||
|
|
||||||
# Only these sections can handling failed downloads so make sure everything else gets through without the check for failed
|
# Only these sections can handling failed downloads so make sure everything else gets through without the check for failed
|
||||||
if not sectionName in ['CouchPotato', 'SickBeard', 'NzbDrone']:
|
if sectionName not in ['CouchPotato', 'SickBeard', 'NzbDrone']:
|
||||||
status = 0
|
status = 0
|
||||||
|
|
||||||
logger.info("Calling {0}:{1} to post-process:{2}".format(sectionName, usercat, inputName))
|
logger.info("Calling {0}:{1} to post-process:{2}".format(sectionName, usercat, inputName))
|
||||||
|
@ -225,25 +212,25 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
if core.TORRENT_CHMOD_DIRECTORY:
|
if core.TORRENT_CHMOD_DIRECTORY:
|
||||||
core.rchmod(outputDestination, core.TORRENT_CHMOD_DIRECTORY)
|
core.rchmod(outputDestination, core.TORRENT_CHMOD_DIRECTORY)
|
||||||
|
|
||||||
result = [ 0, "" ]
|
result = [0, ""]
|
||||||
if sectionName == 'UserScript':
|
if sectionName == 'UserScript':
|
||||||
result = external_script(outputDestination, inputName, inputCategory, section[usercat])
|
result = external_script(outputDestination, inputName, inputCategory, section[usercat])
|
||||||
|
|
||||||
elif sectionName == 'CouchPotato':
|
elif sectionName == 'CouchPotato':
|
||||||
result = core.autoProcessMovie().process(sectionName,outputDestination, inputName, status, clientAgent, inputHash,
|
result = core.autoProcessMovie().process(sectionName, outputDestination, inputName, status, clientAgent, inputHash,
|
||||||
inputCategory)
|
inputCategory)
|
||||||
elif sectionName in ['SickBeard','NzbDrone']:
|
elif sectionName in ['SickBeard', 'NzbDrone']:
|
||||||
if inputHash:
|
if inputHash:
|
||||||
inputHash = inputHash.upper()
|
inputHash = inputHash.upper()
|
||||||
result = core.autoProcessTV().processEpisode(sectionName,outputDestination, inputName, status, clientAgent,
|
result = core.autoProcessTV().processEpisode(sectionName, outputDestination, inputName, status, clientAgent,
|
||||||
inputHash, inputCategory)
|
inputHash, inputCategory)
|
||||||
elif sectionName == 'HeadPhones':
|
elif sectionName == 'HeadPhones':
|
||||||
result = core.autoProcessMusic().process(sectionName,outputDestination, inputName, status, clientAgent, inputCategory)
|
result = core.autoProcessMusic().process(sectionName, outputDestination, inputName, status, clientAgent, inputCategory)
|
||||||
elif sectionName == 'Mylar':
|
elif sectionName == 'Mylar':
|
||||||
result = core.autoProcessComics().processEpisode(sectionName,outputDestination, inputName, status, clientAgent,
|
result = core.autoProcessComics().processEpisode(sectionName, outputDestination, inputName, status, clientAgent,
|
||||||
inputCategory)
|
inputCategory)
|
||||||
elif sectionName == 'Gamez':
|
elif sectionName == 'Gamez':
|
||||||
result = core.autoProcessGames().process(sectionName,outputDestination, inputName, status, clientAgent, inputCategory)
|
result = core.autoProcessGames().process(sectionName, outputDestination, inputName, status, clientAgent, inputCategory)
|
||||||
|
|
||||||
plex_update(inputCategory)
|
plex_update(inputCategory)
|
||||||
|
|
||||||
|
@ -265,8 +252,8 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
logger.debug('Checking for sym-links to re-direct in: {0}'.format(inputDirectory))
|
logger.debug('Checking for sym-links to re-direct in: {0}'.format(inputDirectory))
|
||||||
for dirpath, dirs, files in os.walk(inputDirectory):
|
for dirpath, dirs, files in os.walk(inputDirectory):
|
||||||
for file in files:
|
for file in files:
|
||||||
logger.debug('Checking symlink: {0}'.format(os.path.join(dirpath,file)))
|
logger.debug('Checking symlink: {0}'.format(os.path.join(dirpath, file)))
|
||||||
core.replace_links(os.path.join(dirpath,file))
|
replace_links(os.path.join(dirpath, file))
|
||||||
core.remove_torrent(clientAgent, inputHash, inputID, inputName)
|
core.remove_torrent(clientAgent, inputHash, inputID, inputName)
|
||||||
|
|
||||||
if not sectionName == 'UserScript': # for user script, we assume this is cleaned by the script or option USER_SCRIPT_CLEAN
|
if not sectionName == 'UserScript': # for user script, we assume this is cleaned by the script or option USER_SCRIPT_CLEAN
|
||||||
|
@ -291,7 +278,7 @@ def main(args):
|
||||||
logger.debug("Options passed into TorrentToMedia: {0}".format(args))
|
logger.debug("Options passed into TorrentToMedia: {0}".format(args))
|
||||||
|
|
||||||
# Post-Processing Result
|
# Post-Processing Result
|
||||||
result = [ 0, "" ]
|
result = [0, ""]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
inputDirectory, inputName, inputCategory, inputHash, inputID = core.parse_args(clientAgent, args)
|
inputDirectory, inputName, inputCategory, inputHash, inputID = core.parse_args(clientAgent, args)
|
||||||
|
@ -323,32 +310,25 @@ def main(args):
|
||||||
os.path.basename(dirName))
|
os.path.basename(dirName))
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
clientAgent = text_type(core.DOWNLOADINFO[0].get('client_agent', ''))
|
||||||
clientAgent = str(core.DOWNLOADINFO[0]['client_agent'])
|
inputHash = text_type(core.DOWNLOADINFO[0].get('input_hash', ''))
|
||||||
except:
|
inputID = text_type(core.DOWNLOADINFO[0].get('input_id', ''))
|
||||||
clientAgent = 'manual'
|
|
||||||
try:
|
|
||||||
inputHash = str(core.DOWNLOADINFO[0]['input_hash'])
|
|
||||||
except:
|
|
||||||
inputHash = None
|
|
||||||
try:
|
|
||||||
inputID = str(core.DOWNLOADINFO[0]['input_id'])
|
|
||||||
except:
|
|
||||||
inputID = None
|
|
||||||
|
|
||||||
if clientAgent.lower() not in core.TORRENT_CLIENTS and clientAgent != 'manual':
|
if clientAgent and clientAgent.lower() not in core.TORRENT_CLIENTS:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
dirName = dirName.encode(core.SYS_ENCODING)
|
dirName = dirName.encode(core.SYS_ENCODING)
|
||||||
except: pass
|
except UnicodeError:
|
||||||
|
pass
|
||||||
inputName = os.path.basename(dirName)
|
inputName = os.path.basename(dirName)
|
||||||
try:
|
try:
|
||||||
inputName = inputName.encode(core.SYS_ENCODING)
|
inputName = inputName.encode(core.SYS_ENCODING)
|
||||||
except: pass
|
except UnicodeError:
|
||||||
|
pass
|
||||||
|
|
||||||
results = processTorrent(dirName, inputName, subsection, inputHash, inputID,
|
results = processTorrent(dirName, inputName, subsection, inputHash or None, inputID or None,
|
||||||
clientAgent)
|
clientAgent or 'manual')
|
||||||
if results[0] != 0:
|
if results[0] != 0:
|
||||||
logger.error("A problem was reported when trying to perform a manual run for {0}:{1}.".format(
|
logger.error("A problem was reported when trying to perform a manual run for {0}:{1}.".format(
|
||||||
section, subsection))
|
section, subsection))
|
||||||
|
|
|
@ -265,8 +265,9 @@ def initialize(section=None):
|
||||||
# On non-unicode builds this will raise an AttributeError, if encoding type is not valid it throws a LookupError
|
# On non-unicode builds this will raise an AttributeError, if encoding type is not valid it throws a LookupError
|
||||||
sys.setdefaultencoding(SYS_ENCODING)
|
sys.setdefaultencoding(SYS_ENCODING)
|
||||||
except:
|
except:
|
||||||
print('Sorry, you MUST add the nzbToMedia folder to the PYTHONPATH environment variable')
|
print('Sorry, you MUST add the nzbToMedia folder to the PYTHONPATH environment variable'
|
||||||
print('or find another way to force Python to use ' + SYS_ENCODING + ' for string encoding.')
|
'\nor find another way to force Python to use {codec} for string encoding.'.format
|
||||||
|
(codec=SYS_ENCODING))
|
||||||
if 'NZBOP_SCRIPTDIR' in os.environ:
|
if 'NZBOP_SCRIPTDIR' in os.environ:
|
||||||
sys.exit(NZBGET_POSTPROCESS_ERROR)
|
sys.exit(NZBGET_POSTPROCESS_ERROR)
|
||||||
else:
|
else:
|
||||||
|
@ -333,8 +334,9 @@ def initialize(section=None):
|
||||||
logger.error("Update wasn't successful, not restarting. Check your log for more information.")
|
logger.error("Update wasn't successful, not restarting. Check your log for more information.")
|
||||||
|
|
||||||
# Set Current Version
|
# Set Current Version
|
||||||
logger.info(
|
logger.info('nzbToMedia Version:{version} Branch:{branch} ({system} {release})'.format
|
||||||
'nzbToMedia Version:' + NZBTOMEDIA_VERSION + ' Branch:' + GIT_BRANCH + ' (' + platform.system() + ' ' + platform.release() + ')')
|
(version=NZBTOMEDIA_VERSION, branch=GIT_BRANCH,
|
||||||
|
system=platform.system(), release=platform.release()))
|
||||||
|
|
||||||
if int(CFG["WakeOnLan"]["wake"]) == 1:
|
if int(CFG["WakeOnLan"]["wake"]) == 1:
|
||||||
WakeUp()
|
WakeUp()
|
||||||
|
@ -842,7 +844,7 @@ def restart():
|
||||||
|
|
||||||
if popen_list:
|
if popen_list:
|
||||||
popen_list += SYS_ARGV
|
popen_list += SYS_ARGV
|
||||||
logger.log(u"Restarting nzbToMedia with " + str(popen_list))
|
logger.log(u"Restarting nzbToMedia with {args}".format(args=popen_list))
|
||||||
logger.close()
|
logger.close()
|
||||||
p = subprocess.Popen(popen_list, cwd=os.getcwd())
|
p = subprocess.Popen(popen_list, cwd=os.getcwd())
|
||||||
p.wait()
|
p.wait()
|
||||||
|
|
|
@ -46,7 +46,7 @@ class autoProcessMovie(object):
|
||||||
|
|
||||||
if not result['success']:
|
if not result['success']:
|
||||||
if 'error' in result:
|
if 'error' in result:
|
||||||
logger.error(str(result['error']))
|
logger.error('{0}'.format(result['error']))
|
||||||
else:
|
else:
|
||||||
logger.error("no media found for id {0}".format(params['id']))
|
logger.error("no media found for id {0}".format(params['id']))
|
||||||
return results
|
return results
|
||||||
|
@ -262,7 +262,7 @@ class autoProcessMovie(object):
|
||||||
if release_id:
|
if release_id:
|
||||||
logger.postprocess("Setting failed release {0} to ignored ...".format(inputName), section)
|
logger.postprocess("Setting failed release {0} to ignored ...".format(inputName), section)
|
||||||
|
|
||||||
url = baseURL + "/release.ignore"
|
url = "{url}/release.ignore".format(url=baseURL)
|
||||||
params = {'id': release_id}
|
params = {'id': release_id}
|
||||||
|
|
||||||
logger.debug("Opening URL: {0} with PARAMS: {1}".format(url, params), section)
|
logger.debug("Opening URL: {0} with PARAMS: {1}".format(url, params), section)
|
||||||
|
|
|
@ -42,18 +42,17 @@ class InitialSchema(nzbToMediaDB.SchemaUpgrade):
|
||||||
cur_db_version = self.checkDBVersion()
|
cur_db_version = self.checkDBVersion()
|
||||||
|
|
||||||
if cur_db_version < MIN_DB_VERSION:
|
if cur_db_version < MIN_DB_VERSION:
|
||||||
logger.log_error_and_exit("Your database version (" + str(
|
logger.log_error_and_exit(u"Your database version ({current}) is too old to migrate "
|
||||||
cur_db_version) + ") is too old to migrate from what this version of nzbToMedia supports (" + \
|
u"from what this version of nzbToMedia supports ({min})."
|
||||||
str(MIN_DB_VERSION) + ").\n" + \
|
u"\nPlease remove nzbtomedia.db file to begin fresh.".format
|
||||||
"Please remove nzbtomedia.db file to begin fresh."
|
(current=cur_db_version, min=MIN_DB_VERSION))
|
||||||
)
|
|
||||||
|
|
||||||
if cur_db_version > MAX_DB_VERSION:
|
if cur_db_version > MAX_DB_VERSION:
|
||||||
logger.log_error_and_exit("Your database version (" + str(
|
logger.log_error_and_exit(u"Your database version ({current}) has been incremented "
|
||||||
cur_db_version) + ") has been incremented past what this version of nzbToMedia supports (" + \
|
u"past what this version of nzbToMedia supports ({max})."
|
||||||
str(MAX_DB_VERSION) + ").\n" + \
|
u"\nIf you have used other forks of nzbToMedia, your database "
|
||||||
"If you have used other forks of nzbToMedia, your database may be unusable due to their modifications."
|
u"may be unusable due to their modifications.".format
|
||||||
)
|
(current=cur_db_version, max=MAX_DB_VERSION))
|
||||||
if cur_db_version < MAX_DB_VERSION: # We need to upgrade.
|
if cur_db_version < MAX_DB_VERSION: # We need to upgrade.
|
||||||
queries = [
|
queries = [
|
||||||
"CREATE TABLE downloads2 (input_directory TEXT, input_name TEXT, input_hash TEXT, input_id TEXT, client_agent TEXT, status INTEGER, last_update NUMERIC, CONSTRAINT pk_downloadID PRIMARY KEY (input_directory, input_name));",
|
"CREATE TABLE downloads2 (input_directory TEXT, input_name TEXT, input_hash TEXT, input_id TEXT, client_agent TEXT, status INTEGER, last_update NUMERIC, CONSTRAINT pk_downloadID PRIMARY KEY (input_directory, input_name));",
|
||||||
|
|
|
@ -70,7 +70,7 @@ def extract(filePath, outputDestination):
|
||||||
if ext[1] in (".gz", ".bz2", ".lzma"):
|
if ext[1] in (".gz", ".bz2", ".lzma"):
|
||||||
# Check if this is a tar
|
# Check if this is a tar
|
||||||
if os.path.splitext(ext[0])[1] == ".tar":
|
if os.path.splitext(ext[0])[1] == ".tar":
|
||||||
cmd = EXTRACT_COMMANDS[".tar" + ext[1]]
|
cmd = EXTRACT_COMMANDS[".tar{ext}".format(ext=ext[1])]
|
||||||
elif ext[1] in (".1", ".01", ".001") and os.path.splitext(ext[0])[1] in (".rar", ".zip", ".7z"):
|
elif ext[1] in (".1", ".01", ".001") and os.path.splitext(ext[0])[1] in (".rar", ".zip", ".7z"):
|
||||||
cmd = EXTRACT_COMMANDS[os.path.splitext(ext[0])[1]]
|
cmd = EXTRACT_COMMANDS[os.path.splitext(ext[0])[1]]
|
||||||
elif ext[1] in (".cb7", ".cba", ".cbr", ".cbt", ".cbz"): # don't extract these comic book archives.
|
elif ext[1] in (".cb7", ".cba", ".cbr", ".cbt", ".cbz"): # don't extract these comic book archives.
|
||||||
|
@ -131,7 +131,7 @@ def extract(filePath, outputDestination):
|
||||||
continue
|
continue
|
||||||
cmd2 = cmd
|
cmd2 = cmd
|
||||||
# append password here.
|
# append password here.
|
||||||
passcmd = "-p" + password
|
passcmd = "-p{pwd}".format(pwd=password)
|
||||||
cmd2.append(passcmd)
|
cmd2.append(passcmd)
|
||||||
p = Popen(cmd2, stdout=devnull, stderr=devnull, startupinfo=info) # should extract files fine.
|
p = Popen(cmd2, stdout=devnull, stderr=devnull, startupinfo=info) # should extract files fine.
|
||||||
res = p.wait()
|
res = p.wait()
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
from six import iteritems
|
||||||
|
|
||||||
|
|
||||||
class GitHub(object):
|
class GitHub(object):
|
||||||
|
@ -19,10 +20,11 @@ class GitHub(object):
|
||||||
Access the API at the path given and with the optional params given.
|
Access the API at the path given and with the optional params given.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
url = 'https://api.github.com/' + '/'.join(path)
|
url = 'https://api.github.com/{path}'.format(path='/'.join(path))
|
||||||
|
|
||||||
if params and type(params) is dict:
|
if params and type(params) is dict:
|
||||||
url += '?' + '&'.join([str(x) + '=' + str(params[x]) for x in params.keys()])
|
url += '?{params}'.format(params='&'.join(['{key}={value}'.format(key=k, value=v)
|
||||||
|
for k, v in iteritems(params)]))
|
||||||
|
|
||||||
data = requests.get(url, verify=False)
|
data = requests.get(url, verify=False)
|
||||||
|
|
||||||
|
@ -59,6 +61,6 @@ class GitHub(object):
|
||||||
Returns a deserialized json object containing the compare info. See http://developer.github.com/v3/repos/commits/
|
Returns a deserialized json object containing the compare info. See http://developer.github.com/v3/repos/commits/
|
||||||
"""
|
"""
|
||||||
access_API = self._access_API(
|
access_API = self._access_API(
|
||||||
['repos', self.github_repo_user, self.github_repo, 'compare', base + '...' + head],
|
['repos', self.github_repo_user, self.github_repo, 'compare', '{base}...{head}'.format(base=base, head=head)],
|
||||||
params={'per_page': per_page})
|
params={'per_page': per_page})
|
||||||
return access_API
|
return access_API
|
||||||
|
|
|
@ -136,7 +136,7 @@ class NTMRotatingLogHandler(object):
|
||||||
i: Log number to ues
|
i: Log number to ues
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return self.log_file_path + ('.' + str(i) if i else '')
|
return self.log_file_path + ('.{0}'.format(i) if i else '')
|
||||||
|
|
||||||
def _num_logs(self):
|
def _num_logs(self):
|
||||||
"""
|
"""
|
||||||
|
@ -193,9 +193,9 @@ class NTMRotatingLogHandler(object):
|
||||||
self.writes_since_check += 1
|
self.writes_since_check += 1
|
||||||
|
|
||||||
try:
|
try:
|
||||||
message = u"{0}: {1}".format(str(section).upper(), toLog)
|
message = u"{0}: {1}".format(section.upper(), toLog)
|
||||||
except:
|
except UnicodeError:
|
||||||
message = u"{0}: Message contains non-utf-8 string".format(str(section).upper())
|
message = u"{0}: Message contains non-utf-8 string".format(section.upper())
|
||||||
|
|
||||||
out_line = message
|
out_line = message
|
||||||
|
|
||||||
|
|
|
@ -238,7 +238,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
process_section(section, subsection)
|
process_section(section, subsection)
|
||||||
|
|
||||||
# create a backup of our old config
|
# create a backup of our old config
|
||||||
CFG_OLD.filename = core.CONFIG_FILE + ".old"
|
CFG_OLD.filename ="{config}.old".format(config=core.CONFIG_FILE)
|
||||||
CFG_OLD.write()
|
CFG_OLD.write()
|
||||||
|
|
||||||
# write our new config to autoProcessMedia.cfg
|
# write our new config to autoProcessMedia.cfg
|
||||||
|
@ -270,7 +270,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
envKeys = ['AUTO_UPDATE', 'CHECK_MEDIA', 'SAFE_MODE']
|
envKeys = ['AUTO_UPDATE', 'CHECK_MEDIA', 'SAFE_MODE']
|
||||||
cfgKeys = ['auto_update', 'check_media', 'safe_mode']
|
cfgKeys = ['auto_update', 'check_media', 'safe_mode']
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_' + envKeys[index]
|
key = 'NZBPO_{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
@ -280,7 +280,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
envKeys = ['MOUNTPOINTS']
|
envKeys = ['MOUNTPOINTS']
|
||||||
cfgKeys = ['mount_points']
|
cfgKeys = ['mount_points']
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_' + envKeys[index]
|
key = 'NZBPO_{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
@ -294,7 +294,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
'wait_for', 'watch_dir']
|
'wait_for', 'watch_dir']
|
||||||
if envCatKey in os.environ:
|
if envCatKey in os.environ:
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_CPS' + envKeys[index]
|
key = 'NZBPO_CPS{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
@ -311,7 +311,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
'delete_failed', 'Torrent_NoLink', 'nzbExtractionBy', 'remote_path', 'process_method']
|
'delete_failed', 'Torrent_NoLink', 'nzbExtractionBy', 'remote_path', 'process_method']
|
||||||
if envCatKey in os.environ:
|
if envCatKey in os.environ:
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_SB' + envKeys[index]
|
key = 'NZBPO_SB{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
@ -328,7 +328,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
cfgKeys = ['enabled', 'apikey', 'host', 'port', 'ssl', 'web_root', 'wait_for', 'watch_dir', 'remote_path']
|
cfgKeys = ['enabled', 'apikey', 'host', 'port', 'ssl', 'web_root', 'wait_for', 'watch_dir', 'remote_path']
|
||||||
if envCatKey in os.environ:
|
if envCatKey in os.environ:
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_HP' + envKeys[index]
|
key = 'NZBPO_HP{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
@ -345,7 +345,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
'remote_path']
|
'remote_path']
|
||||||
if envCatKey in os.environ:
|
if envCatKey in os.environ:
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_MY' + envKeys[index]
|
key = 'NZBPO_MY{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
@ -360,7 +360,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
cfgKeys = ['enabled', 'apikey', 'host', 'port', 'ssl', 'web_root', 'watch_dir', 'library', 'remote_path']
|
cfgKeys = ['enabled', 'apikey', 'host', 'port', 'ssl', 'web_root', 'watch_dir', 'library', 'remote_path']
|
||||||
if envCatKey in os.environ:
|
if envCatKey in os.environ:
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_GZ' + envKeys[index]
|
key = 'NZBPO_GZ{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
@ -377,7 +377,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
'Torrent_NoLink', 'nzbExtractionBy', 'wait_for', 'delete_failed', 'remote_path']
|
'Torrent_NoLink', 'nzbExtractionBy', 'wait_for', 'delete_failed', 'remote_path']
|
||||||
if envCatKey in os.environ:
|
if envCatKey in os.environ:
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_ND' + envKeys[index]
|
key = 'NZBPO_ND{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
@ -392,7 +392,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
envKeys = ['COMPRESSEDEXTENSIONS', 'MEDIAEXTENSIONS', 'METAEXTENSIONS']
|
envKeys = ['COMPRESSEDEXTENSIONS', 'MEDIAEXTENSIONS', 'METAEXTENSIONS']
|
||||||
cfgKeys = ['compressedExtensions', 'mediaExtensions', 'metaExtensions']
|
cfgKeys = ['compressedExtensions', 'mediaExtensions', 'metaExtensions']
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_' + envKeys[index]
|
key = 'NZBPO_{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
@ -402,7 +402,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
envKeys = ['NICENESS', 'IONICE_CLASS', 'IONICE_CLASSDATA']
|
envKeys = ['NICENESS', 'IONICE_CLASS', 'IONICE_CLASSDATA']
|
||||||
cfgKeys = ['niceness', 'ionice_class', 'ionice_classdata']
|
cfgKeys = ['niceness', 'ionice_class', 'ionice_classdata']
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_' + envKeys[index]
|
key = 'NZBPO_{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
@ -430,7 +430,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
'outputSubtitleCodec', 'outputAudioChannels', 'outputAudioTrack2Channels',
|
'outputSubtitleCodec', 'outputAudioChannels', 'outputAudioTrack2Channels',
|
||||||
'outputAudioOtherChannels']
|
'outputAudioOtherChannels']
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_' + envKeys[index]
|
key = 'NZBPO_{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
@ -440,7 +440,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
envKeys = ['WAKE', 'HOST', 'PORT', 'MAC']
|
envKeys = ['WAKE', 'HOST', 'PORT', 'MAC']
|
||||||
cfgKeys = ['wake', 'host', 'port', 'mac']
|
cfgKeys = ['wake', 'host', 'port', 'mac']
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_WOL' + envKeys[index]
|
key = 'NZBPO_WOL{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
@ -454,7 +454,7 @@ class ConfigObj(configobj.ConfigObj, Section):
|
||||||
'user_script_successCodes', 'user_script_clean', 'delay', 'remote_path']
|
'user_script_successCodes', 'user_script_clean', 'delay', 'remote_path']
|
||||||
if envCatKey in os.environ:
|
if envCatKey in os.environ:
|
||||||
for index in range(len(envKeys)):
|
for index in range(len(envKeys)):
|
||||||
key = 'NZBPO_' + envKeys[index]
|
key = 'NZBPO_{index}'.format(index=envKeys[index])
|
||||||
if key in os.environ:
|
if key in os.environ:
|
||||||
option = cfgKeys[index]
|
option = cfgKeys[index]
|
||||||
value = os.environ[key]
|
value = os.environ[key]
|
||||||
|
|
|
@ -56,28 +56,29 @@ class DBConnection(object):
|
||||||
while attempt < 5:
|
while attempt < 5:
|
||||||
try:
|
try:
|
||||||
if args is None:
|
if args is None:
|
||||||
logger.log(self.filename + ": " + query, logger.DB)
|
logger.log("{name}: {query}".format(name=self.filename, query=query), logger.DB)
|
||||||
cursor = self.connection.cursor()
|
cursor = self.connection.cursor()
|
||||||
cursor.execute(query)
|
cursor.execute(query)
|
||||||
sqlResult = cursor.fetchone()[0]
|
sqlResult = cursor.fetchone()[0]
|
||||||
else:
|
else:
|
||||||
logger.log(self.filename + ": " + query + " with args " + str(args), logger.DB)
|
logger.log("{name}: {query} with args {args}".format
|
||||||
|
(name=self.filename, query=query, args=args), logger.DB)
|
||||||
cursor = self.connection.cursor()
|
cursor = self.connection.cursor()
|
||||||
cursor.execute(query, args)
|
cursor.execute(query, args)
|
||||||
sqlResult = cursor.fetchone()[0]
|
sqlResult = cursor.fetchone()[0]
|
||||||
|
|
||||||
# get out of the connection attempt loop since we were successful
|
# get out of the connection attempt loop since we were successful
|
||||||
break
|
break
|
||||||
except sqlite3.OperationalError as e:
|
except sqlite3.OperationalError as error:
|
||||||
if "unable to open database file" in e.args[0] or "database is locked" in e.args[0]:
|
if "unable to open database file" in error.args[0] or "database is locked" in error.args[0]:
|
||||||
logger.log(u"DB error: " + str(e), logger.WARNING)
|
logger.log(u"DB error: {msg}".format(msg=error), logger.WARNING)
|
||||||
attempt += 1
|
attempt += 1
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
else:
|
else:
|
||||||
logger.log(u"DB error: " + str(e), logger.ERROR)
|
logger.log(u"DB error: {msg}".format(msg=error), logger.ERROR)
|
||||||
raise
|
raise
|
||||||
except sqlite3.DatabaseError as e:
|
except sqlite3.DatabaseError as error:
|
||||||
logger.log(u"Fatal error executing query: " + str(e), logger.ERROR)
|
logger.log(u"Fatal error executing query: {msg}".format(msg=error), logger.ERROR)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
return sqlResult
|
return sqlResult
|
||||||
|
@ -98,26 +99,26 @@ class DBConnection(object):
|
||||||
sqlResult.append(self.connection.execute(qu[0]))
|
sqlResult.append(self.connection.execute(qu[0]))
|
||||||
elif len(qu) > 1:
|
elif len(qu) > 1:
|
||||||
if logTransaction:
|
if logTransaction:
|
||||||
logger.log(qu[0] + " with args " + str(qu[1]), logger.DEBUG)
|
logger.log(u"{query} with args {args}".format(query=qu[0], args=qu[1]), logger.DEBUG)
|
||||||
sqlResult.append(self.connection.execute(qu[0], qu[1]))
|
sqlResult.append(self.connection.execute(qu[0], qu[1]))
|
||||||
self.connection.commit()
|
self.connection.commit()
|
||||||
logger.log(u"Transaction with " + str(len(querylist)) + u" query's executed", logger.DEBUG)
|
logger.log(u"Transaction with {x} query's executed".format(x=len(querylist)), logger.DEBUG)
|
||||||
return sqlResult
|
return sqlResult
|
||||||
except sqlite3.OperationalError as e:
|
except sqlite3.OperationalError as error:
|
||||||
sqlResult = []
|
sqlResult = []
|
||||||
if self.connection:
|
if self.connection:
|
||||||
self.connection.rollback()
|
self.connection.rollback()
|
||||||
if "unable to open database file" in e.args[0] or "database is locked" in e.args[0]:
|
if "unable to open database file" in error.args[0] or "database is locked" in error.args[0]:
|
||||||
logger.log(u"DB error: " + str(e), logger.WARNING)
|
logger.log(u"DB error: {msg}".format(msg=error), logger.WARNING)
|
||||||
attempt += 1
|
attempt += 1
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
else:
|
else:
|
||||||
logger.log(u"DB error: " + str(e), logger.ERROR)
|
logger.log(u"DB error: {msg}".format(msg=error), logger.ERROR)
|
||||||
raise
|
raise
|
||||||
except sqlite3.DatabaseError as e:
|
except sqlite3.DatabaseError as error:
|
||||||
if self.connection:
|
if self.connection:
|
||||||
self.connection.rollback()
|
self.connection.rollback()
|
||||||
logger.log(u"Fatal error executing query: " + str(e), logger.ERROR)
|
logger.log(u"Fatal error executing query: {msg}".format(msg=error), logger.ERROR)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
return sqlResult
|
return sqlResult
|
||||||
|
@ -132,24 +133,25 @@ class DBConnection(object):
|
||||||
while attempt < 5:
|
while attempt < 5:
|
||||||
try:
|
try:
|
||||||
if args is None:
|
if args is None:
|
||||||
logger.log(self.filename + ": " + query, logger.DB)
|
logger.log(u"{name}: {query}".format(name=self.filename, query=query), logger.DB)
|
||||||
sqlResult = self.connection.execute(query)
|
sqlResult = self.connection.execute(query)
|
||||||
else:
|
else:
|
||||||
logger.log(self.filename + ": " + query + " with args " + str(args), logger.DB)
|
logger.log(u"{name}: {query} with args {args}".format
|
||||||
|
(name=self.filename, query=query, args=args), logger.DB)
|
||||||
sqlResult = self.connection.execute(query, args)
|
sqlResult = self.connection.execute(query, args)
|
||||||
self.connection.commit()
|
self.connection.commit()
|
||||||
# get out of the connection attempt loop since we were successful
|
# get out of the connection attempt loop since we were successful
|
||||||
break
|
break
|
||||||
except sqlite3.OperationalError as e:
|
except sqlite3.OperationalError as error:
|
||||||
if "unable to open database file" in e.args[0] or "database is locked" in e.args[0]:
|
if "unable to open database file" in error.args[0] or "database is locked" in error.args[0]:
|
||||||
logger.log(u"DB error: " + str(e), logger.WARNING)
|
logger.log(u"DB error: {msg}".format(msg=error), logger.WARNING)
|
||||||
attempt += 1
|
attempt += 1
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
else:
|
else:
|
||||||
logger.log(u"DB error: " + str(e), logger.ERROR)
|
logger.log(u"DB error: {msg}".format(msg=error), logger.ERROR)
|
||||||
raise
|
raise
|
||||||
except sqlite3.DatabaseError as e:
|
except sqlite3.DatabaseError as error:
|
||||||
logger.log(u"Fatal error executing query: " + str(e), logger.ERROR)
|
logger.log(u"Fatal error executing query: {msg}".format(msg=error), logger.ERROR)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
return sqlResult
|
return sqlResult
|
||||||
|
@ -167,17 +169,28 @@ class DBConnection(object):
|
||||||
|
|
||||||
changesBefore = self.connection.total_changes
|
changesBefore = self.connection.total_changes
|
||||||
|
|
||||||
genParams = lambda myDict: [x + " = ?" for x in myDict.keys()]
|
genParams = lambda myDict: ["{key} = ?".format(key=k) for k in myDict.keys()]
|
||||||
|
|
||||||
query = "UPDATE " + tableName + " SET " + ", ".join(genParams(valueDict)) + " WHERE " + " AND ".join(
|
self.action(
|
||||||
genParams(keyDict))
|
"UPDATE {table} "
|
||||||
|
"SET {params} "
|
||||||
self.action(query, valueDict.values() + keyDict.values())
|
"WHERE {conditions}".format(
|
||||||
|
table=tableName,
|
||||||
|
params=", ".join(genParams(valueDict)),
|
||||||
|
conditions=" AND ".join(genParams(keyDict))),
|
||||||
|
valueDict.values() + keyDict.values()
|
||||||
|
)
|
||||||
|
|
||||||
if self.connection.total_changes == changesBefore:
|
if self.connection.total_changes == changesBefore:
|
||||||
query = "INSERT OR IGNORE INTO " + tableName + " (" + ", ".join(valueDict.keys() + keyDict.keys()) + ")" + \
|
self.action(
|
||||||
" VALUES (" + ", ".join(["?"] * len(valueDict.keys() + keyDict.keys())) + ")"
|
"INSERT OR IGNORE INTO {table} ({columns}) "
|
||||||
self.action(query, valueDict.values() + keyDict.values())
|
"VALUES ({values})".format(
|
||||||
|
table=tableName,
|
||||||
|
columns=", ".join(valueDict.keys() + keyDict.keys()),
|
||||||
|
values=", ".join(["?"] * len(valueDict.keys() + keyDict.keys()))
|
||||||
|
)
|
||||||
|
, valueDict.values() + keyDict.values()
|
||||||
|
)
|
||||||
|
|
||||||
def tableInfo(self, tableName):
|
def tableInfo(self, tableName):
|
||||||
# FIXME ? binding is not supported here, but I cannot find a way to escape a string manually
|
# FIXME ? binding is not supported here, but I cannot find a way to escape a string manually
|
||||||
|
@ -222,17 +235,22 @@ def prettyName(class_name):
|
||||||
|
|
||||||
def _processUpgrade(connection, upgradeClass):
|
def _processUpgrade(connection, upgradeClass):
|
||||||
instance = upgradeClass(connection)
|
instance = upgradeClass(connection)
|
||||||
logger.log(u"Checking " + prettyName(upgradeClass.__name__) + " database upgrade", logger.DEBUG)
|
logger.log(u"Checking {name} database upgrade".format
|
||||||
|
(name=prettyName(upgradeClass.__name__)), logger.DEBUG)
|
||||||
if not instance.test():
|
if not instance.test():
|
||||||
logger.log(u"Database upgrade required: " + prettyName(upgradeClass.__name__), logger.MESSAGE)
|
logger.log(u"Database upgrade required: {name}".format
|
||||||
|
(name=prettyName(upgradeClass.__name__)), logger.MESSAGE)
|
||||||
try:
|
try:
|
||||||
instance.execute()
|
instance.execute()
|
||||||
except sqlite3.DatabaseError as e:
|
except sqlite3.DatabaseError as error:
|
||||||
print("Error in " + str(upgradeClass.__name__) + ": " + str(e))
|
print(u"Error in {name}: {msg}".format
|
||||||
|
(name=upgradeClass.__name__, msg=error))
|
||||||
raise
|
raise
|
||||||
logger.log(upgradeClass.__name__ + " upgrade completed", logger.DEBUG)
|
logger.log(u"{name} upgrade completed".format
|
||||||
|
(name=upgradeClass.__name__), logger.DEBUG)
|
||||||
else:
|
else:
|
||||||
logger.log(upgradeClass.__name__ + " upgrade not required", logger.DEBUG)
|
logger.log(u"{name} upgrade not required".format
|
||||||
|
(name=upgradeClass.__name__), logger.DEBUG)
|
||||||
|
|
||||||
for upgradeSubClass in upgradeClass.__subclasses__():
|
for upgradeSubClass in upgradeClass.__subclasses__():
|
||||||
_processUpgrade(connection, upgradeSubClass)
|
_processUpgrade(connection, upgradeSubClass)
|
||||||
|
|
|
@ -80,8 +80,8 @@ def external_script(outputDestination, torrentName, torrentLabel, settings):
|
||||||
continue
|
continue
|
||||||
cmd = ""
|
cmd = ""
|
||||||
for item in command:
|
for item in command:
|
||||||
cmd = cmd + " " + item
|
cmd = "{cmd} {item}".format(cmd=cmd, item=item)
|
||||||
logger.info("Running script {0} on file {1}.".format(cmd, filePath), "USERSCRIPT")
|
logger.info("Running script {cmd} on file {path}.".format(cmd=cmd, path=filePath), "USERSCRIPT")
|
||||||
try:
|
try:
|
||||||
p = Popen(command)
|
p = Popen(command)
|
||||||
res = p.wait()
|
res = p.wait()
|
||||||
|
|
|
@ -342,11 +342,12 @@ def rmReadOnly(filename):
|
||||||
file_attribute = os.stat(filename)[0]
|
file_attribute = os.stat(filename)[0]
|
||||||
if not file_attribute & stat.S_IWRITE:
|
if not file_attribute & stat.S_IWRITE:
|
||||||
# File is read-only, so make it writeable
|
# File is read-only, so make it writeable
|
||||||
logger.debug('Read only mode on file ' + filename + ' Will try to make it writeable')
|
logger.debug('Read only mode on file {name}. Attempting to make it writeable'.format
|
||||||
|
(name=filename))
|
||||||
try:
|
try:
|
||||||
os.chmod(filename, stat.S_IWRITE)
|
os.chmod(filename, stat.S_IWRITE)
|
||||||
except:
|
except:
|
||||||
logger.warning('Cannot change permissions of ' + filename, logger.WARNING)
|
logger.warning('Cannot change permissions of {file}'.format(file=filename), logger.WARNING)
|
||||||
|
|
||||||
|
|
||||||
# Wake function
|
# Wake function
|
||||||
|
@ -1156,11 +1157,11 @@ def server_responding(baseURL):
|
||||||
def plex_update(category):
|
def plex_update(category):
|
||||||
if core.FAILED:
|
if core.FAILED:
|
||||||
return
|
return
|
||||||
if core.PLEXSSL:
|
url = '{scheme}://{host}:{port}/library/sections/'.format(
|
||||||
url = "https://"
|
scheme='https' if core.PLEXSSL else 'http',
|
||||||
else:
|
host=core.PLEXHOST,
|
||||||
url = "http://"
|
port=core.PLEXPORT,
|
||||||
url = url + core.PLEXHOST + ':' + core.PLEXPORT + '/library/sections/'
|
)
|
||||||
section = None
|
section = None
|
||||||
if not core.PLEXSEC:
|
if not core.PLEXSEC:
|
||||||
return
|
return
|
||||||
|
@ -1170,7 +1171,7 @@ def plex_update(category):
|
||||||
section = item[1]
|
section = item[1]
|
||||||
|
|
||||||
if section:
|
if section:
|
||||||
url = url + section + '/refresh?X-Plex-Token=' + core.PLEXTOKEN
|
url = '{url}{section}/refresh?X-Plex-Token={token}'.format(url=url, section=section, token=core.PLEXTOKEN)
|
||||||
requests.get(url, timeout=(60, 120), verify=False)
|
requests.get(url, timeout=(60, 120), verify=False)
|
||||||
logger.debug("Plex Library has been refreshed.", 'PLEX')
|
logger.debug("Plex Library has been refreshed.", 'PLEX')
|
||||||
else:
|
else:
|
||||||
|
@ -1180,27 +1181,27 @@ def plex_update(category):
|
||||||
def backupVersionedFile(old_file, version):
|
def backupVersionedFile(old_file, version):
|
||||||
numTries = 0
|
numTries = 0
|
||||||
|
|
||||||
new_file = old_file + '.' + 'v' + str(version)
|
new_file = '{old}.v{version}'.format(old=old_file, version=version)
|
||||||
|
|
||||||
while not os.path.isfile(new_file):
|
while not os.path.isfile(new_file):
|
||||||
if not os.path.isfile(old_file):
|
if not os.path.isfile(old_file):
|
||||||
logger.log(u"Not creating backup, " + old_file + " doesn't exist", logger.DEBUG)
|
logger.log(u"Not creating backup, {file} doesn't exist".format(file=old_file), logger.DEBUG)
|
||||||
break
|
break
|
||||||
|
|
||||||
try:
|
try:
|
||||||
logger.log(u"Trying to back up " + old_file + " to " + new_file, logger.DEBUG)
|
logger.log(u"Trying to back up {old} to {new]".format(old=old_file, new=new_file), logger.DEBUG)
|
||||||
shutil.copy(old_file, new_file)
|
shutil.copy(old_file, new_file)
|
||||||
logger.log(u"Backup done", logger.DEBUG)
|
logger.log(u"Backup done", logger.DEBUG)
|
||||||
break
|
break
|
||||||
except Exception as e:
|
except Exception as error:
|
||||||
logger.log(u"Error while trying to back up " + old_file + " to " + new_file + " : " + str(e),
|
logger.log(u"Error while trying to back up {old} to {new} : {msg}".format
|
||||||
logger.WARNING)
|
(old=old_file, new=new_file, msg=error), logger.WARNING)
|
||||||
numTries += 1
|
numTries += 1
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
logger.log(u"Trying again.", logger.DEBUG)
|
logger.log(u"Trying again.", logger.DEBUG)
|
||||||
|
|
||||||
if numTries >= 10:
|
if numTries >= 10:
|
||||||
logger.log(u"Unable to back up " + old_file + " to " + new_file + " please do it manually.", logger.ERROR)
|
logger.log(u"Unable to back up {old} to {new} please do it manually.".format(old=old_file, new=new_file), logger.ERROR)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
@ -1242,7 +1243,7 @@ class RunningProcess(object):
|
||||||
|
|
||||||
class WindowsProcess(object):
|
class WindowsProcess(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.mutexname = "nzbtomedia_" + core.PID_FILE.replace('\\', '/') # {D0E858DF-985E-4907-B7FB-8D732C3FC3B9}"
|
self.mutexname = "nzbtomedia_{pid}".format(pid=core.PID_FILE.replace('\\', '/')) # {D0E858DF-985E-4907-B7FB-8D732C3FC3B9}"
|
||||||
if platform.system() == 'Windows':
|
if platform.system() == 'Windows':
|
||||||
from win32event import CreateMutex
|
from win32event import CreateMutex
|
||||||
from win32api import CloseHandle, GetLastError
|
from win32api import CloseHandle, GetLastError
|
||||||
|
@ -1274,7 +1275,7 @@ class PosixProcess(object):
|
||||||
def alreadyrunning(self):
|
def alreadyrunning(self):
|
||||||
try:
|
try:
|
||||||
self.lock_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
|
self.lock_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
|
||||||
self.lock_socket.bind('\0' + self.pidpath)
|
self.lock_socket.bind('\0{path}'.format(path=self.pidpath))
|
||||||
self.lasterror = False
|
self.lasterror = False
|
||||||
return self.lasterror
|
return self.lasterror
|
||||||
except socket.error as e:
|
except socket.error as e:
|
||||||
|
|
|
@ -129,7 +129,7 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
elif core.CONCAT and re.match("(.+)[cC][dD][0-9]", name):
|
elif core.CONCAT and re.match("(.+)[cC][dD][0-9]", name):
|
||||||
name = re.sub("([\ \.\-\_\=\:]+[cC][dD][0-9])", "", name)
|
name = re.sub("([\ \.\-\_\=\:]+[cC][dD][0-9])", "", name)
|
||||||
if ext == core.VEXTENSION and newDir == dir: # we need to change the name to prevent overwriting itself.
|
if ext == core.VEXTENSION and newDir == dir: # we need to change the name to prevent overwriting itself.
|
||||||
core.VEXTENSION = '-transcoded' + core.VEXTENSION # adds '-transcoded.ext'
|
core.VEXTENSION = '-transcoded{ext}'.format(ext=core.VEXTENSION) # adds '-transcoded.ext'
|
||||||
else:
|
else:
|
||||||
img, data = iteritems(file).next()
|
img, data = iteritems(file).next()
|
||||||
name = data['name']
|
name = data['name']
|
||||||
|
@ -165,7 +165,7 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
if core.VBITRATE:
|
if core.VBITRATE:
|
||||||
video_cmd.extend(['-b:v', str(core.VBITRATE)])
|
video_cmd.extend(['-b:v', str(core.VBITRATE)])
|
||||||
if core.VRESOLUTION:
|
if core.VRESOLUTION:
|
||||||
video_cmd.extend(['-vf', 'scale=' + core.VRESOLUTION])
|
video_cmd.extend(['-vf', 'scale={vres}'.format(vres=core.VRESOLUTION)])
|
||||||
if core.VPRESET:
|
if core.VPRESET:
|
||||||
video_cmd.extend(['-preset', core.VPRESET])
|
video_cmd.extend(['-preset', core.VPRESET])
|
||||||
if core.VCRF:
|
if core.VCRF:
|
||||||
|
@ -222,13 +222,19 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
w_scale = width / float(scale.split(':')[0])
|
w_scale = width / float(scale.split(':')[0])
|
||||||
h_scale = height / float(scale.split(':')[1])
|
h_scale = height / float(scale.split(':')[1])
|
||||||
if w_scale > h_scale: # widescreen, Scale by width only.
|
if w_scale > h_scale: # widescreen, Scale by width only.
|
||||||
scale = scale.split(':')[0] + ":" + str(int((height / w_scale) / 2) * 2)
|
scale = "{width}:{height}".format(
|
||||||
|
width=scale.split(':')[0],
|
||||||
|
height=int((height / w_scale) / 2) * 2,
|
||||||
|
)
|
||||||
if w_scale > 1:
|
if w_scale > 1:
|
||||||
video_cmd.extend(['-vf', 'scale=' + scale])
|
video_cmd.extend(['-vf', 'scale={width}'.format(width=scale)])
|
||||||
else: # lower or mathcing ratio, scale by height only.
|
else: # lower or matching ratio, scale by height only.
|
||||||
scale = str(int((width / h_scale) / 2) * 2) + ":" + scale.split(':')[1]
|
scale = "{width}:{height}".format(
|
||||||
|
width=int((width / h_scale) / 2) * 2,
|
||||||
|
height=scale.split(':')[1],
|
||||||
|
)
|
||||||
if h_scale > 1:
|
if h_scale > 1:
|
||||||
video_cmd.extend(['-vf', 'scale=' + scale])
|
video_cmd.extend(['-vf', 'scale={height}'.format(height=scale)])
|
||||||
if core.VBITRATE:
|
if core.VBITRATE:
|
||||||
video_cmd.extend(['-b:v', str(core.VBITRATE)])
|
video_cmd.extend(['-b:v', str(core.VBITRATE)])
|
||||||
if core.VPRESET:
|
if core.VPRESET:
|
||||||
|
@ -242,7 +248,7 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
video_cmd[1] = core.VCODEC
|
video_cmd[1] = core.VCODEC
|
||||||
if core.VCODEC == 'copy': # force copy. therefore ignore all other video transcoding.
|
if core.VCODEC == 'copy': # force copy. therefore ignore all other video transcoding.
|
||||||
video_cmd = ['-c:v', 'copy']
|
video_cmd = ['-c:v', 'copy']
|
||||||
map_cmd.extend(['-map', '0:' + str(video["index"])])
|
map_cmd.extend(['-map', '0:{index}'.format(index=video["index"])])
|
||||||
break # Only one video needed
|
break # Only one video needed
|
||||||
|
|
||||||
used_audio = 0
|
used_audio = 0
|
||||||
|
@ -259,40 +265,34 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
audio3 = []
|
audio3 = []
|
||||||
|
|
||||||
if audio2: # right language and codec...
|
if audio2: # right language and codec...
|
||||||
map_cmd.extend(['-map', '0:' + str(audio2[0]["index"])])
|
map_cmd.extend(['-map', '0:{index}'.format(index=audio2[0]["index"])])
|
||||||
a_mapped.extend([audio2[0]["index"]])
|
a_mapped.extend([audio2[0]["index"]])
|
||||||
bitrate = int(audio2[0].get("bit_rate", 0)) / 1000
|
bitrate = int(audio2[0].get("bit_rate", 0)) / 1000
|
||||||
channels = int(audio2[0].get("channels", 0))
|
channels = int(audio2[0].get("channels", 0))
|
||||||
audio_cmd.extend(['-c:a:' + str(used_audio), 'copy'])
|
audio_cmd.extend(['-c:a:{0}'.format(used_audio), 'copy'])
|
||||||
elif audio1: # right language wrong codec.
|
elif audio1: # right language wrong codec.
|
||||||
map_cmd.extend(['-map', '0:' + str(audio1[0]["index"])])
|
map_cmd.extend(['-map', '0:{index}'.format(index=audio1[0]["index"])])
|
||||||
a_mapped.extend([audio1[0]["index"]])
|
a_mapped.extend([audio1[0]["index"]])
|
||||||
bitrate = int(audio1[0].get("bit_rate", 0)) / 1000
|
bitrate = int(audio1[0].get("bit_rate", 0)) / 1000
|
||||||
channels = int(audio1[0].get("channels", 0))
|
channels = int(audio1[0].get("channels", 0))
|
||||||
if core.ACODEC:
|
audio_cmd.extend(['-c:a:{0}'.format(used_audio), core.ACODEC if core.ACODEC else 'copy'])
|
||||||
audio_cmd.extend(['-c:a:' + str(used_audio), core.ACODEC])
|
|
||||||
else:
|
|
||||||
audio_cmd.extend(['-c:a:' + str(used_audio), 'copy'])
|
|
||||||
elif audio3: # just pick the default audio track
|
elif audio3: # just pick the default audio track
|
||||||
map_cmd.extend(['-map', '0:' + str(audio3[0]["index"])])
|
map_cmd.extend(['-map', '0:{index}'.format(index=audio3[0]["index"])])
|
||||||
a_mapped.extend([audio3[0]["index"]])
|
a_mapped.extend([audio3[0]["index"]])
|
||||||
bitrate = int(audio3[0].get("bit_rate", 0)) / 1000
|
bitrate = int(audio3[0].get("bit_rate", 0)) / 1000
|
||||||
channels = int(audio3[0].get("channels", 0))
|
channels = int(audio3[0].get("channels", 0))
|
||||||
if core.ACODEC:
|
audio_cmd.extend(['-c:a:{0}'.format(used_audio), core.ACODEC if core.ACODEC else 'copy'])
|
||||||
audio_cmd.extend(['-c:a:' + str(used_audio), core.ACODEC])
|
|
||||||
else:
|
|
||||||
audio_cmd.extend(['-c:a:' + str(used_audio), 'copy'])
|
|
||||||
|
|
||||||
if core.ACHANNELS and channels and channels > core.ACHANNELS:
|
if core.ACHANNELS and channels and channels > core.ACHANNELS:
|
||||||
audio_cmd.extend(['-ac:a:' + str(used_audio), str(core.ACHANNELS)])
|
audio_cmd.extend(['-ac:a:{0}'.format(used_audio), str(core.ACHANNELS)])
|
||||||
if audio_cmd[1] == 'copy':
|
if audio_cmd[1] == 'copy':
|
||||||
audio_cmd[1] = core.ACODEC
|
audio_cmd[1] = core.ACODEC
|
||||||
if core.ABITRATE and not (core.ABITRATE * 0.9 < bitrate < core.ABITRATE * 1.1):
|
if core.ABITRATE and not (core.ABITRATE * 0.9 < bitrate < core.ABITRATE * 1.1):
|
||||||
audio_cmd.extend(['-b:a:' + str(used_audio), str(core.ABITRATE)])
|
audio_cmd.extend(['-b:a:{0}'.format(used_audio), str(core.ABITRATE)])
|
||||||
if audio_cmd[1] == 'copy':
|
if audio_cmd[1] == 'copy':
|
||||||
audio_cmd[1] = core.ACODEC
|
audio_cmd[1] = core.ACODEC
|
||||||
if core.OUTPUTQUALITYPERCENT:
|
if core.OUTPUTQUALITYPERCENT:
|
||||||
audio_cmd.extend(['-q:a:' + str(used_audio), str(core.OUTPUTQUALITYPERCENT)])
|
audio_cmd.extend(['-q:a:{0}'.format(used_audio), str(core.OUTPUTQUALITYPERCENT)])
|
||||||
if audio_cmd[1] == 'copy':
|
if audio_cmd[1] == 'copy':
|
||||||
audio_cmd[1] = core.ACODEC
|
audio_cmd[1] = core.ACODEC
|
||||||
if audio_cmd[1] in ['aac', 'dts']:
|
if audio_cmd[1] in ['aac', 'dts']:
|
||||||
|
@ -302,40 +302,40 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
used_audio += 1
|
used_audio += 1
|
||||||
audio4 = [item for item in audio1 if item["codec_name"] in core.ACODEC2_ALLOW]
|
audio4 = [item for item in audio1 if item["codec_name"] in core.ACODEC2_ALLOW]
|
||||||
if audio4: # right language and codec.
|
if audio4: # right language and codec.
|
||||||
map_cmd.extend(['-map', '0:' + str(audio4[0]["index"])])
|
map_cmd.extend(['-map', '0:{index}'.format(index=audio4[0]["index"])])
|
||||||
a_mapped.extend([audio4[0]["index"]])
|
a_mapped.extend([audio4[0]["index"]])
|
||||||
bitrate = int(audio4[0].get("bit_rate", 0)) / 1000
|
bitrate = int(audio4[0].get("bit_rate", 0)) / 1000
|
||||||
channels = int(audio4[0].get("channels", 0))
|
channels = int(audio4[0].get("channels", 0))
|
||||||
audio_cmd2.extend(['-c:a:' + str(used_audio), 'copy'])
|
audio_cmd2.extend(['-c:a:{0}'.format(used_audio), 'copy'])
|
||||||
elif audio1: # right language wrong codec.
|
elif audio1: # right language wrong codec.
|
||||||
map_cmd.extend(['-map', '0:' + str(audio1[0]["index"])])
|
map_cmd.extend(['-map', '0:{index}'.format(index=audio1[0]["index"])])
|
||||||
a_mapped.extend([audio1[0]["index"]])
|
a_mapped.extend([audio1[0]["index"]])
|
||||||
bitrate = int(audio1[0].get("bit_rate", 0)) / 1000
|
bitrate = int(audio1[0].get("bit_rate", 0)) / 1000
|
||||||
channels = int(audio1[0].get("channels", 0))
|
channels = int(audio1[0].get("channels", 0))
|
||||||
if core.ACODEC2:
|
if core.ACODEC2:
|
||||||
audio_cmd2.extend(['-c:a:' + str(used_audio), core.ACODEC2])
|
audio_cmd2.extend(['-c:a:{0}'.format(used_audio), core.ACODEC2])
|
||||||
else:
|
else:
|
||||||
audio_cmd2.extend(['-c:a:' + str(used_audio), 'copy'])
|
audio_cmd2.extend(['-c:a:{0}'.format(used_audio), 'copy'])
|
||||||
elif audio3: # just pick the default audio track
|
elif audio3: # just pick the default audio track
|
||||||
map_cmd.extend(['-map', '0:' + str(audio3[0]["index"])])
|
map_cmd.extend(['-map', '0:{index}'.format(index=audio3[0]["index"])])
|
||||||
a_mapped.extend([audio3[0]["index"]])
|
a_mapped.extend([audio3[0]["index"]])
|
||||||
bitrate = int(audio3[0].get("bit_rate", 0)) / 1000
|
bitrate = int(audio3[0].get("bit_rate", 0)) / 1000
|
||||||
channels = int(audio3[0].get("channels", 0))
|
channels = int(audio3[0].get("channels", 0))
|
||||||
if core.ACODEC2:
|
if core.ACODEC2:
|
||||||
audio_cmd2.extend(['-c:a:' + str(used_audio), core.ACODEC2])
|
audio_cmd2.extend(['-c:a:{0}'.format(used_audio), core.ACODEC2])
|
||||||
else:
|
else:
|
||||||
audio_cmd2.extend(['-c:a:' + str(used_audio), 'copy'])
|
audio_cmd2.extend(['-c:a:{0}'.format(used_audio), 'copy'])
|
||||||
|
|
||||||
if core.ACHANNELS2 and channels and channels > core.ACHANNELS2:
|
if core.ACHANNELS2 and channels and channels > core.ACHANNELS2:
|
||||||
audio_cmd2.extend(['-ac:a:' + str(used_audio), str(core.ACHANNELS2)])
|
audio_cmd2.extend(['-ac:a:{0}'.format(used_audio), str(core.ACHANNELS2)])
|
||||||
if audio_cmd2[1] == 'copy':
|
if audio_cmd2[1] == 'copy':
|
||||||
audio_cmd2[1] = core.ACODEC2
|
audio_cmd2[1] = core.ACODEC2
|
||||||
if core.ABITRATE2 and not (core.ABITRATE2 * 0.9 < bitrate < core.ABITRATE2 * 1.1):
|
if core.ABITRATE2 and not (core.ABITRATE2 * 0.9 < bitrate < core.ABITRATE2 * 1.1):
|
||||||
audio_cmd2.extend(['-b:a:' + str(used_audio), str(core.ABITRATE2)])
|
audio_cmd2.extend(['-b:a:{0}'.format(used_audio), str(core.ABITRATE2)])
|
||||||
if audio_cmd2[1] == 'copy':
|
if audio_cmd2[1] == 'copy':
|
||||||
audio_cmd2[1] = core.ACODEC2
|
audio_cmd2[1] = core.ACODEC2
|
||||||
if core.OUTPUTQUALITYPERCENT:
|
if core.OUTPUTQUALITYPERCENT:
|
||||||
audio_cmd2.extend(['-q:a:' + str(used_audio), str(core.OUTPUTQUALITYPERCENT)])
|
audio_cmd2.extend(['-q:a:{0}'.format(used_audio), str(core.OUTPUTQUALITYPERCENT)])
|
||||||
if audio_cmd2[1] == 'copy':
|
if audio_cmd2[1] == 'copy':
|
||||||
audio_cmd2[1] = core.ACODEC2
|
audio_cmd2[1] = core.ACODEC2
|
||||||
if audio_cmd2[1] in ['aac', 'dts']:
|
if audio_cmd2[1] in ['aac', 'dts']:
|
||||||
|
@ -347,28 +347,28 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
if audio["index"] in a_mapped:
|
if audio["index"] in a_mapped:
|
||||||
continue
|
continue
|
||||||
used_audio += 1
|
used_audio += 1
|
||||||
map_cmd.extend(['-map', '0:' + str(audio["index"])])
|
map_cmd.extend(['-map', '0:{index}'.format(index=audio["index"])])
|
||||||
audio_cmd3 = []
|
audio_cmd3 = []
|
||||||
bitrate = int(audio.get("bit_rate", 0)) / 1000
|
bitrate = int(audio.get("bit_rate", 0)) / 1000
|
||||||
channels = int(audio.get("channels", 0))
|
channels = int(audio.get("channels", 0))
|
||||||
if audio["codec_name"] in core.ACODEC3_ALLOW:
|
if audio["codec_name"] in core.ACODEC3_ALLOW:
|
||||||
audio_cmd3.extend(['-c:a:' + str(used_audio), 'copy'])
|
audio_cmd3.extend(['-c:a:{0}'.format(used_audio), 'copy'])
|
||||||
else:
|
else:
|
||||||
if core.ACODEC3:
|
if core.ACODEC3:
|
||||||
audio_cmd3.extend(['-c:a:' + str(used_audio), core.ACODEC3])
|
audio_cmd3.extend(['-c:a:{0}'.format(used_audio), core.ACODEC3])
|
||||||
else:
|
else:
|
||||||
audio_cmd3.extend(['-c:a:' + str(used_audio), 'copy'])
|
audio_cmd3.extend(['-c:a:{0}'.format(used_audio), 'copy'])
|
||||||
|
|
||||||
if core.ACHANNELS3 and channels and channels > core.ACHANNELS3:
|
if core.ACHANNELS3 and channels and channels > core.ACHANNELS3:
|
||||||
audio_cmd3.extend(['-ac:a:' + str(used_audio), str(core.ACHANNELS3)])
|
audio_cmd3.extend(['-ac:a:{0}'.format(used_audio), str(core.ACHANNELS3)])
|
||||||
if audio_cmd3[1] == 'copy':
|
if audio_cmd3[1] == 'copy':
|
||||||
audio_cmd3[1] = core.ACODEC3
|
audio_cmd3[1] = core.ACODEC3
|
||||||
if core.ABITRATE3 and not (core.ABITRATE3 * 0.9 < bitrate < core.ABITRATE3 * 1.1):
|
if core.ABITRATE3 and not (core.ABITRATE3 * 0.9 < bitrate < core.ABITRATE3 * 1.1):
|
||||||
audio_cmd3.extend(['-b:a:' + str(used_audio), str(core.ABITRATE3)])
|
audio_cmd3.extend(['-b:a:{0}'.format(used_audio), str(core.ABITRATE3)])
|
||||||
if audio_cmd3[1] == 'copy':
|
if audio_cmd3[1] == 'copy':
|
||||||
audio_cmd3[1] = core.ACODEC3
|
audio_cmd3[1] = core.ACODEC3
|
||||||
if core.OUTPUTQUALITYPERCENT > 0:
|
if core.OUTPUTQUALITYPERCENT > 0:
|
||||||
audio_cmd3.extend(['-q:a:' + str(used_audio), str(core.OUTPUTQUALITYPERCENT)])
|
audio_cmd3.extend(['-q:a:{0}'.format(used_audio), str(core.OUTPUTQUALITYPERCENT)])
|
||||||
if audio_cmd3[1] == 'copy':
|
if audio_cmd3[1] == 'copy':
|
||||||
audio_cmd3[1] = core.ACODEC3
|
audio_cmd3[1] = core.ACODEC3
|
||||||
if audio_cmd3[1] in ['aac', 'dts']:
|
if audio_cmd3[1] in ['aac', 'dts']:
|
||||||
|
@ -386,7 +386,7 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
if core.BURN and not subs1 and not burnt and os.path.isfile(file):
|
if core.BURN and not subs1 and not burnt and os.path.isfile(file):
|
||||||
for subfile in get_subs(file):
|
for subfile in get_subs(file):
|
||||||
if lan in os.path.split(subfile)[1]:
|
if lan in os.path.split(subfile)[1]:
|
||||||
video_cmd.extend(['-vf', 'subtitles=' + subfile])
|
video_cmd.extend(['-vf', 'subtitles={subs}'.format(subs=subfile)])
|
||||||
burnt = 1
|
burnt = 1
|
||||||
for sub in subs1:
|
for sub in subs1:
|
||||||
if core.BURN and not burnt and os.path.isfile(inputFile):
|
if core.BURN and not burnt and os.path.isfile(inputFile):
|
||||||
|
@ -395,11 +395,11 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
if subStreams[index]["index"] == sub["index"]:
|
if subStreams[index]["index"] == sub["index"]:
|
||||||
subloc = index
|
subloc = index
|
||||||
break
|
break
|
||||||
video_cmd.extend(['-vf', 'subtitles=' + inputFile + ':si=' + str(subloc)])
|
video_cmd.extend(['-vf', 'subtitles={sub}:si={loc}'.format(sub=inputFile, loc=subloc)])
|
||||||
burnt = 1
|
burnt = 1
|
||||||
if not core.ALLOWSUBS:
|
if not core.ALLOWSUBS:
|
||||||
break
|
break
|
||||||
map_cmd.extend(['-map', '0:' + str(sub["index"])])
|
map_cmd.extend(['-map', '0:{index}'.format(index=sub["index"])])
|
||||||
s_mapped.extend([sub["index"]])
|
s_mapped.extend([sub["index"]])
|
||||||
|
|
||||||
if core.SINCLUDE:
|
if core.SINCLUDE:
|
||||||
|
@ -408,7 +408,7 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
break
|
break
|
||||||
if sub["index"] in s_mapped:
|
if sub["index"] in s_mapped:
|
||||||
continue
|
continue
|
||||||
map_cmd.extend(['-map', '0:' + str(sub["index"])])
|
map_cmd.extend(['-map', '0:{index}'.format(index=sub["index"])])
|
||||||
s_mapped.extend([sub["index"]])
|
s_mapped.extend([sub["index"]])
|
||||||
|
|
||||||
if core.OUTPUTFASTSTART:
|
if core.OUTPUTFASTSTART:
|
||||||
|
@ -430,9 +430,10 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
continue
|
continue
|
||||||
lan = os.path.splitext(os.path.splitext(subfile)[0])[1]
|
lan = os.path.splitext(os.path.splitext(subfile)[0])[1]
|
||||||
command.extend(['-i', subfile])
|
command.extend(['-i', subfile])
|
||||||
meta_cmd.extend(['-metadata:s:s:' + str(len(s_mapped) + n), 'language=' + lan[1:]])
|
meta_cmd.extend(['-metadata:s:s:{x}'.format(x=len(s_mapped) + n),
|
||||||
|
'language={lang}'.format(lang=lan[1:])])
|
||||||
n += 1
|
n += 1
|
||||||
map_cmd.extend(['-map', str(n) + ':0'])
|
map_cmd.extend(['-map', '{x}:0'.format(x=n)])
|
||||||
|
|
||||||
if not core.ALLOWSUBS or (not s_mapped and not n):
|
if not core.ALLOWSUBS or (not s_mapped and not n):
|
||||||
sub_cmd.extend(['-sn'])
|
sub_cmd.extend(['-sn'])
|
||||||
|
@ -500,8 +501,8 @@ def extract_subs(file, newfilePath, bitbucket):
|
||||||
if os.path.isfile(outputFile):
|
if os.path.isfile(outputFile):
|
||||||
outputFile = os.path.join(subdir, "{0}.{1}.{2}.srt".format(name, lan, n))
|
outputFile = os.path.join(subdir, "{0}.{1}.{2}.srt".format(name, lan, n))
|
||||||
|
|
||||||
command = [core.FFMPEG, '-loglevel', 'warning', '-i', file, '-vn', '-an', '-codec:' + str(idx), 'srt',
|
command = [core.FFMPEG, '-loglevel', 'warning', '-i', file, '-vn', '-an',
|
||||||
outputFile]
|
'-codec:{index}'.format(index=idx), 'srt', outputFile]
|
||||||
if platform.system() != 'Windows':
|
if platform.system() != 'Windows':
|
||||||
command = core.NICENESS + command
|
command = core.NICENESS + command
|
||||||
|
|
||||||
|
@ -604,7 +605,9 @@ def ripISO(item, newDir, bitbucket):
|
||||||
if core.CONCAT:
|
if core.CONCAT:
|
||||||
combined.extend(concat)
|
combined.extend(concat)
|
||||||
continue
|
continue
|
||||||
name = '{0}.cd{1}'.format(os.path.splitext(os.path.split(item)[1])[0], str(n + 1))
|
name = '{name}.cd{x}'.format(
|
||||||
|
name=os.path.splitext(os.path.split(item)[1])[0], x=n + 1
|
||||||
|
)
|
||||||
newFiles.append({item: {'name': name, 'files': concat}})
|
newFiles.append({item: {'name': name, 'files': concat}})
|
||||||
if core.CONCAT:
|
if core.CONCAT:
|
||||||
name = os.path.splitext(os.path.split(item)[1])[0]
|
name = os.path.splitext(os.path.split(item)[1])[0]
|
||||||
|
@ -627,14 +630,14 @@ def combineVTS(vtsPath):
|
||||||
while True:
|
while True:
|
||||||
vtsName = 'VTS_{0:02d}_{1:d}.VOB'.format(n + 1, m)
|
vtsName = 'VTS_{0:02d}_{1:d}.VOB'.format(n + 1, m)
|
||||||
if os.path.isfile(os.path.join(vtsPath, vtsName)):
|
if os.path.isfile(os.path.join(vtsPath, vtsName)):
|
||||||
concat = concat + os.path.join(vtsPath, vtsName) + '|'
|
concat += '{file}|'.format(file=os.path.join(vtsPath, vtsName))
|
||||||
m += 1
|
m += 1
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
if not concat:
|
if not concat:
|
||||||
break
|
break
|
||||||
if core.CONCAT:
|
if core.CONCAT:
|
||||||
combined = combined + concat + '|'
|
combined += '{files}|'.format(files=concat)
|
||||||
continue
|
continue
|
||||||
newFiles.append('concat:{0}'.format(concat[:-1]))
|
newFiles.append('concat:{0}'.format(concat[:-1]))
|
||||||
if core.CONCAT:
|
if core.CONCAT:
|
||||||
|
@ -650,7 +653,7 @@ def combineCD(combine):
|
||||||
files = [file for file in combine if
|
files = [file for file in combine if
|
||||||
n + 1 == int(re.match(".+[cC][dD]([0-9]+).", file).groups()[0]) and item in file]
|
n + 1 == int(re.match(".+[cC][dD]([0-9]+).", file).groups()[0]) and item in file]
|
||||||
if files:
|
if files:
|
||||||
concat = concat + files[0] + '|'
|
concat += '{file}|'.format(file=files[0])
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
if concat:
|
if concat:
|
||||||
|
@ -661,7 +664,7 @@ def combineCD(combine):
|
||||||
def print_cmd(command):
|
def print_cmd(command):
|
||||||
cmd = ""
|
cmd = ""
|
||||||
for item in command:
|
for item in command:
|
||||||
cmd = cmd + " " + str(item)
|
cmd = "{cmd} {item}".format(cmd=cmd, item=item)
|
||||||
logger.debug("calling command:{0}".format(cmd))
|
logger.debug("calling command:{0}".format(cmd))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -141,15 +141,14 @@ class Client(object):
|
||||||
else:
|
else:
|
||||||
self._query_timeout = DEFAULT_TIMEOUT
|
self._query_timeout = DEFAULT_TIMEOUT
|
||||||
urlo = urlparse(address)
|
urlo = urlparse(address)
|
||||||
if urlo.scheme == '':
|
if not urlo.scheme:
|
||||||
base_url = 'http://' + address + ':' + str(port)
|
self.url = 'http://{host}:{port}/transmission/rpc/'.format(host=address, port=port)
|
||||||
self.url = base_url + '/transmission/rpc/'
|
|
||||||
else:
|
else:
|
||||||
if urlo.port:
|
if urlo.port:
|
||||||
self.url = urlo.scheme + '://' + urlo.hostname + ':' + str(urlo.port) + urlo.path
|
self.url = '{url.scheme}://{url.hostname}:{url.port}{url.path}'.format(url=urlo)
|
||||||
else:
|
else:
|
||||||
self.url = urlo.scheme + '://' + urlo.hostname + urlo.path
|
self.url = '{url.scheme}://{url.hostname}{url.path}'.format(url=urlo)
|
||||||
LOGGER.info('Using custom URL "' + self.url + '".')
|
LOGGER.info('Using custom URL {url!r}.'.format(url=self.url))
|
||||||
if urlo.username and urlo.password:
|
if urlo.username and urlo.password:
|
||||||
user = urlo.username
|
user = urlo.username
|
||||||
password = urlo.password
|
password = urlo.password
|
||||||
|
@ -256,7 +255,7 @@ class Client(object):
|
||||||
try:
|
try:
|
||||||
data = json.loads(http_data)
|
data = json.loads(http_data)
|
||||||
except ValueError as error:
|
except ValueError as error:
|
||||||
LOGGER.error('Error: ' + str(error))
|
LOGGER.error('Error: {msg}'.format(msg=error))
|
||||||
LOGGER.error('Request: {request!r}'.format(request=query))
|
LOGGER.error('Request: {request!r}'.format(request=query))
|
||||||
LOGGER.error('HTTP data: {data!r}'.format(data=http_data))
|
LOGGER.error('HTTP data: {data!r}'.format(data=http_data))
|
||||||
raise
|
raise
|
||||||
|
|
|
@ -31,7 +31,7 @@ def format_speed(size):
|
||||||
Format bytes per second speed into IEC prefixes, B/s, KiB/s, MiB/s ...
|
Format bytes per second speed into IEC prefixes, B/s, KiB/s, MiB/s ...
|
||||||
"""
|
"""
|
||||||
(size, unit) = format_size(size)
|
(size, unit) = format_size(size)
|
||||||
return size, unit + '/s'
|
return size, '{unit}/s'.format(unit=unit)
|
||||||
|
|
||||||
|
|
||||||
def format_timedelta(delta):
|
def format_timedelta(delta):
|
||||||
|
|
|
@ -127,7 +127,7 @@ class UTorrentClient(object):
|
||||||
|
|
||||||
def _action(self, params, body=None, content_type=None):
|
def _action(self, params, body=None, content_type=None):
|
||||||
# about token, see https://github.com/bittorrent/webui/wiki/TokenSystem
|
# about token, see https://github.com/bittorrent/webui/wiki/TokenSystem
|
||||||
url = self.base_url + '?token=' + self.token + '&' + urlencode(params)
|
url = '{url}?token={token}&{params}'.format(url=self.url, token=self.token, params=urlencode(params))
|
||||||
request = Request(url)
|
request = Request(url)
|
||||||
|
|
||||||
if body:
|
if body:
|
||||||
|
|
|
@ -38,7 +38,7 @@ class MultiPartForm(object):
|
||||||
# Once the list is built, return a string where each
|
# Once the list is built, return a string where each
|
||||||
# line is separated by '\r\n'.
|
# line is separated by '\r\n'.
|
||||||
parts = []
|
parts = []
|
||||||
part_boundary = '--' + self.boundary
|
part_boundary = '--{boundary}'.format(boundary=self.boundary)
|
||||||
|
|
||||||
# Add the form fields
|
# Add the form fields
|
||||||
parts.extend(
|
parts.extend(
|
||||||
|
@ -64,6 +64,6 @@ class MultiPartForm(object):
|
||||||
# Flatten the list and add closing boundary marker,
|
# Flatten the list and add closing boundary marker,
|
||||||
# then return CR+LF separated data
|
# then return CR+LF separated data
|
||||||
flattened = list(itertools.chain(*parts))
|
flattened = list(itertools.chain(*parts))
|
||||||
flattened.append('--' + self.boundary + '--')
|
flattened.append('--{boundary}--'.format(boundary=self.boundary))
|
||||||
flattened.append('')
|
flattened.append('')
|
||||||
return '\r\n'.join(flattened)
|
return '\r\n'.join(flattened)
|
||||||
|
|
|
@ -68,7 +68,7 @@ class CheckVersion(object):
|
||||||
logger.log(u"Version checking is disabled, not checking for the newest version")
|
logger.log(u"Version checking is disabled, not checking for the newest version")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
logger.log(u"Checking if " + self.install_type + " needs an update")
|
logger.log(u"Checking if {install} needs an update".format(install=self.install_type))
|
||||||
if not self.updater.need_update():
|
if not self.updater.need_update():
|
||||||
core.NEWEST_VERSION_STRING = None
|
core.NEWEST_VERSION_STRING = None
|
||||||
logger.log(u"No update needed")
|
logger.log(u"No update needed")
|
||||||
|
@ -113,18 +113,19 @@ class GitUpdateManager(UpdateManager):
|
||||||
test_cmd = 'version'
|
test_cmd = 'version'
|
||||||
|
|
||||||
if core.GIT_PATH:
|
if core.GIT_PATH:
|
||||||
main_git = '"' + core.GIT_PATH + '"'
|
main_git = '"{git}"'.format(git=core.GIT_PATH)
|
||||||
else:
|
else:
|
||||||
main_git = 'git'
|
main_git = 'git'
|
||||||
|
|
||||||
logger.log(u"Checking if we can use git commands: " + main_git + ' ' + test_cmd, logger.DEBUG)
|
logger.log(u"Checking if we can use git commands: {git} {cmd}".format
|
||||||
|
(git=main_git, cmd=test_cmd), logger.DEBUG)
|
||||||
output, err, exit_status = self._run_git(main_git, test_cmd)
|
output, err, exit_status = self._run_git(main_git, test_cmd)
|
||||||
|
|
||||||
if exit_status == 0:
|
if exit_status == 0:
|
||||||
logger.log(u"Using: " + main_git, logger.DEBUG)
|
logger.log(u"Using: {git}".format(git=main_git), logger.DEBUG)
|
||||||
return main_git
|
return main_git
|
||||||
else:
|
else:
|
||||||
logger.log(u"Not using: " + main_git, logger.DEBUG)
|
logger.log(u"Not using: {git}".format(git=main_git), logger.DEBUG)
|
||||||
|
|
||||||
# trying alternatives
|
# trying alternatives
|
||||||
|
|
||||||
|
@ -142,18 +143,20 @@ class GitUpdateManager(UpdateManager):
|
||||||
logger.log(u"Trying known alternative git locations", logger.DEBUG)
|
logger.log(u"Trying known alternative git locations", logger.DEBUG)
|
||||||
|
|
||||||
for cur_git in alternative_git:
|
for cur_git in alternative_git:
|
||||||
logger.log(u"Checking if we can use git commands: " + cur_git + ' ' + test_cmd, logger.DEBUG)
|
logger.log(u"Checking if we can use git commands: {git} {cmd}".format
|
||||||
|
(git=cur_git, cmd=test_cmd), logger.DEBUG)
|
||||||
output, err, exit_status = self._run_git(cur_git, test_cmd)
|
output, err, exit_status = self._run_git(cur_git, test_cmd)
|
||||||
|
|
||||||
if exit_status == 0:
|
if exit_status == 0:
|
||||||
logger.log(u"Using: " + cur_git, logger.DEBUG)
|
logger.log(u"Using: {git}".format(git=cur_git), logger.DEBUG)
|
||||||
return cur_git
|
return cur_git
|
||||||
else:
|
else:
|
||||||
logger.log(u"Not using: " + cur_git, logger.DEBUG)
|
logger.log(u"Not using: {git}".format(git=cur_git), logger.DEBUG)
|
||||||
|
|
||||||
# Still haven't found a working git
|
# Still haven't found a working git
|
||||||
logger.debug(
|
logger.debug('Unable to find your git executable - '
|
||||||
'Unable to find your git executable - Set git_path in your autoProcessMedia.cfg OR delete your .git folder and run from source to enable updates.')
|
'Set git_path in your autoProcessMedia.cfg OR '
|
||||||
|
'delete your .git folder and run from source to enable updates.')
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -167,10 +170,11 @@ class GitUpdateManager(UpdateManager):
|
||||||
exit_status = 1
|
exit_status = 1
|
||||||
return output, err, exit_status
|
return output, err, exit_status
|
||||||
|
|
||||||
cmd = git_path + ' ' + args
|
cmd = '{git} {args}'.format(git=git_path, args=args)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
logger.log(u"Executing " + cmd + " with your shell in " + core.PROGRAM_DIR, logger.DEBUG)
|
logger.log(u"Executing {cmd} with your shell in {directory}".format
|
||||||
|
(cmd=cmd, directory=core.PROGRAM_DIR), logger.DEBUG)
|
||||||
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
|
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
|
||||||
shell=True, cwd=core.PROGRAM_DIR)
|
shell=True, cwd=core.PROGRAM_DIR)
|
||||||
output, err = p.communicate()
|
output, err = p.communicate()
|
||||||
|
@ -179,29 +183,23 @@ class GitUpdateManager(UpdateManager):
|
||||||
if output:
|
if output:
|
||||||
output = output.strip()
|
output = output.strip()
|
||||||
if core.LOG_GIT:
|
if core.LOG_GIT:
|
||||||
logger.log(u"git output: " + output, logger.DEBUG)
|
logger.log(u"git output: {output}".format(output=output), logger.DEBUG)
|
||||||
|
|
||||||
except OSError:
|
except OSError:
|
||||||
logger.log(u"Command " + cmd + " didn't work")
|
logger.log(u"Command {cmd} didn't work".format(cmd=cmd))
|
||||||
exit_status = 1
|
exit_status = 1
|
||||||
|
|
||||||
|
exit_status = 128 if ('fatal:' in output) or err else exit_status
|
||||||
if exit_status == 0:
|
if exit_status == 0:
|
||||||
logger.log(cmd + u" : returned successful", logger.DEBUG)
|
logger.log(u"{cmd} : returned successful".format(cmd=cmd), logger.DEBUG)
|
||||||
exit_status = 0
|
exit_status = 0
|
||||||
|
elif core.LOG_GIT and exit_status in (1, 128):
|
||||||
elif exit_status == 1:
|
logger.log(u"{cmd} returned : {output}".format
|
||||||
if core.LOG_GIT:
|
(cmd=cmd, output=output), logger.DEBUG)
|
||||||
logger.log(cmd + u" returned : " + output, logger.DEBUG)
|
|
||||||
exit_status = 1
|
|
||||||
|
|
||||||
elif exit_status == 128 or 'fatal:' in output or err:
|
|
||||||
if core.LOG_GIT:
|
|
||||||
logger.log(cmd + u" returned : " + output, logger.DEBUG)
|
|
||||||
exit_status = 128
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if core.LOG_GIT:
|
if core.LOG_GIT:
|
||||||
logger.log(cmd + u" returned : " + output + u", treat as error for now", logger.DEBUG)
|
logger.log(u"{cmd} returned : {output}, treat as error for now".format
|
||||||
|
(cmd=cmd, output=output), logger.DEBUG)
|
||||||
exit_status = 1
|
exit_status = 1
|
||||||
|
|
||||||
return output, err, exit_status
|
return output, err, exit_status
|
||||||
|
@ -285,21 +283,18 @@ class GitUpdateManager(UpdateManager):
|
||||||
logger.log(u"git didn't return numbers for behind and ahead, not using it", logger.DEBUG)
|
logger.log(u"git didn't return numbers for behind and ahead, not using it", logger.DEBUG)
|
||||||
return
|
return
|
||||||
|
|
||||||
logger.log(
|
logger.log(u"cur_commit = {current} % (newest_commit)= {new}, "
|
||||||
u"cur_commit = " + str(self._cur_commit_hash) + u" % (newest_commit)= " + str(self._newest_commit_hash) +
|
u"num_commits_behind = {x}, num_commits_ahead = {y}".format
|
||||||
u", num_commits_behind = " + str(self._num_commits_behind) + u", num_commits_ahead = " +
|
(current=self._cur_commit_hash, new=self._newest_commit_hash,
|
||||||
str(self._num_commits_ahead), logger.DEBUG)
|
x=self._num_commits_behind, y=self._num_commits_ahead), logger.DEBUG)
|
||||||
|
|
||||||
def set_newest_text(self):
|
def set_newest_text(self):
|
||||||
if self._num_commits_ahead:
|
if self._num_commits_ahead:
|
||||||
logger.log(u"Local branch is ahead of " + self.branch + ". Automatic update not possible.", logger.ERROR)
|
logger.log(u"Local branch is ahead of {branch}. Automatic update not possible.".format
|
||||||
elif self._num_commits_behind > 0:
|
(branch=self.branch), logger.ERROR)
|
||||||
newest_text = 'There is a newer version available '
|
elif self._num_commits_behind:
|
||||||
newest_text += " (you're " + str(self._num_commits_behind) + " commit"
|
logger.log(u"There is a newer version available (you're {x} commit{s} behind)".format
|
||||||
if self._num_commits_behind > 1:
|
(x=self._num_commits_behind, s=u's' if self._num_commits_behind > 1 else u''), logger.MESSAGE)
|
||||||
newest_text += 's'
|
|
||||||
newest_text += ' behind)'
|
|
||||||
logger.log(newest_text, logger.MESSAGE)
|
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -313,8 +308,8 @@ class GitUpdateManager(UpdateManager):
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
self._check_github_for_update()
|
self._check_github_for_update()
|
||||||
except Exception as e:
|
except Exception as error:
|
||||||
logger.log(u"Unable to contact github, can't check for update: " + repr(e), logger.ERROR)
|
logger.log(u"Unable to contact github, can't check for update: {msg!r}".format(msg=error), logger.ERROR)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if self._num_commits_behind > 0:
|
if self._num_commits_behind > 0:
|
||||||
|
@ -328,7 +323,7 @@ class GitUpdateManager(UpdateManager):
|
||||||
on the call's success.
|
on the call's success.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
output, err, exit_status = self._run_git(self._git_path, 'pull origin ' + self.branch) # @UnusedVariable
|
output, err, exit_status = self._run_git(self._git_path, 'pull origin {branch}'.format(branch=self.branch)) # @UnusedVariable
|
||||||
|
|
||||||
if exit_status == 0:
|
if exit_status == 0:
|
||||||
return True
|
return True
|
||||||
|
@ -357,8 +352,8 @@ class SourceUpdateManager(UpdateManager):
|
||||||
try:
|
try:
|
||||||
with open(version_file, 'r') as fp:
|
with open(version_file, 'r') as fp:
|
||||||
self._cur_commit_hash = fp.read().strip(' \n\r')
|
self._cur_commit_hash = fp.read().strip(' \n\r')
|
||||||
except EnvironmentError as e:
|
except EnvironmentError as error:
|
||||||
logger.log(u"Unable to open 'version.txt': " + str(e), logger.DEBUG)
|
logger.log(u"Unable to open 'version.txt': {msg}".format(msg=error), logger.DEBUG)
|
||||||
|
|
||||||
if not self._cur_commit_hash:
|
if not self._cur_commit_hash:
|
||||||
self._cur_commit_hash = None
|
self._cur_commit_hash = None
|
||||||
|
@ -371,8 +366,8 @@ class SourceUpdateManager(UpdateManager):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self._check_github_for_update()
|
self._check_github_for_update()
|
||||||
except Exception as e:
|
except Exception as error:
|
||||||
logger.log(u"Unable to contact github, can't check for update: " + repr(e), logger.ERROR)
|
logger.log(u"Unable to contact github, can't check for update: {msg!r}".format(msg=error), logger.ERROR)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if not self._cur_commit_hash or self._num_commits_behind > 0:
|
if not self._cur_commit_hash or self._num_commits_behind > 0:
|
||||||
|
@ -418,9 +413,8 @@ class SourceUpdateManager(UpdateManager):
|
||||||
# when _cur_commit_hash doesn't match anything _num_commits_behind == 100
|
# when _cur_commit_hash doesn't match anything _num_commits_behind == 100
|
||||||
self._num_commits_behind += 1
|
self._num_commits_behind += 1
|
||||||
|
|
||||||
logger.log(
|
logger.log(u"cur_commit = {current} % (newest_commit)= {new}, num_commits_behind = {x}".format
|
||||||
u"cur_commit = " + str(self._cur_commit_hash) + u" % (newest_commit)= " + str(self._newest_commit_hash) +
|
(current=self._cur_commit_hash, new=self._newest_commit_hash, x=self._num_commits_behind), logger.DEBUG)
|
||||||
u", num_commits_behind = " + str(self._num_commits_behind), logger.DEBUG)
|
|
||||||
|
|
||||||
def set_newest_text(self):
|
def set_newest_text(self):
|
||||||
|
|
||||||
|
@ -430,12 +424,8 @@ class SourceUpdateManager(UpdateManager):
|
||||||
if not self._cur_commit_hash:
|
if not self._cur_commit_hash:
|
||||||
logger.log(u"Unknown current version number, don't know if we should update or not", logger.ERROR)
|
logger.log(u"Unknown current version number, don't know if we should update or not", logger.ERROR)
|
||||||
elif self._num_commits_behind > 0:
|
elif self._num_commits_behind > 0:
|
||||||
newest_text = 'There is a newer version available'
|
logger.log(u"There is a newer version available (you're {x} commit{s} behind)".format
|
||||||
newest_text += " (you're " + str(self._num_commits_behind) + " commit"
|
(x=self._num_commits_behind, s=u's' if self._num_commits_behind > 1 else u''), logger.MESSAGE)
|
||||||
if self._num_commits_behind > 1:
|
|
||||||
newest_text += "s"
|
|
||||||
newest_text += " behind)"
|
|
||||||
logger.log(newest_text, logger.MESSAGE)
|
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -443,8 +433,8 @@ class SourceUpdateManager(UpdateManager):
|
||||||
"""
|
"""
|
||||||
Downloads the latest source tarball from github and installs it over the existing version.
|
Downloads the latest source tarball from github and installs it over the existing version.
|
||||||
"""
|
"""
|
||||||
base_url = 'https://github.com/' + self.github_repo_user + '/' + self.github_repo
|
tar_download_url = 'https://github.com/{org}/{repo}/tarball/{branch}'.format(
|
||||||
tar_download_url = base_url + '/tarball/' + self.branch
|
org=self.github_repo_user, repo=self.github_repo, branch=self.branch)
|
||||||
version_path = os.path.join(core.PROGRAM_DIR, u'version.txt')
|
version_path = os.path.join(core.PROGRAM_DIR, u'version.txt')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -452,45 +442,48 @@ class SourceUpdateManager(UpdateManager):
|
||||||
sb_update_dir = os.path.join(core.PROGRAM_DIR, u'sb-update')
|
sb_update_dir = os.path.join(core.PROGRAM_DIR, u'sb-update')
|
||||||
|
|
||||||
if os.path.isdir(sb_update_dir):
|
if os.path.isdir(sb_update_dir):
|
||||||
logger.log(u"Clearing out update folder " + sb_update_dir + " before extracting")
|
logger.log(u"Clearing out update folder {dir} before extracting".format(dir=sb_update_dir))
|
||||||
shutil.rmtree(sb_update_dir)
|
shutil.rmtree(sb_update_dir)
|
||||||
|
|
||||||
logger.log(u"Creating update folder " + sb_update_dir + " before extracting")
|
logger.log(u"Creating update folder {dir} before extracting".format(dir=sb_update_dir))
|
||||||
os.makedirs(sb_update_dir)
|
os.makedirs(sb_update_dir)
|
||||||
|
|
||||||
# retrieve file
|
# retrieve file
|
||||||
logger.log(u"Downloading update from " + repr(tar_download_url))
|
logger.log(u"Downloading update from {url!r}".format(url=tar_download_url))
|
||||||
tar_download_path = os.path.join(sb_update_dir, u'nzbtomedia-update.tar')
|
tar_download_path = os.path.join(sb_update_dir, u'nzbtomedia-update.tar')
|
||||||
urllib.urlretrieve(tar_download_url, tar_download_path)
|
urllib.urlretrieve(tar_download_url, tar_download_path)
|
||||||
|
|
||||||
if not os.path.isfile(tar_download_path):
|
if not os.path.isfile(tar_download_path):
|
||||||
logger.log(u"Unable to retrieve new version from " + tar_download_url + ", can't update", logger.ERROR)
|
logger.log(u"Unable to retrieve new version from {url}, can't update".format
|
||||||
|
(url=tar_download_url), logger.ERROR)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if not tarfile.is_tarfile(tar_download_path):
|
if not tarfile.is_tarfile(tar_download_path):
|
||||||
logger.log(u"Retrieved version from " + tar_download_url + " is corrupt, can't update", logger.ERROR)
|
logger.log(u"Retrieved version from {url} is corrupt, can't update".format
|
||||||
|
(url=tar_download_url), logger.ERROR)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# extract to sb-update dir
|
# extract to sb-update dir
|
||||||
logger.log(u"Extracting file " + tar_download_path)
|
logger.log(u"Extracting file {path}".format(path=tar_download_path))
|
||||||
tar = tarfile.open(tar_download_path)
|
tar = tarfile.open(tar_download_path)
|
||||||
tar.extractall(sb_update_dir)
|
tar.extractall(sb_update_dir)
|
||||||
tar.close()
|
tar.close()
|
||||||
|
|
||||||
# delete .tar.gz
|
# delete .tar.gz
|
||||||
logger.log(u"Deleting file " + tar_download_path)
|
logger.log(u"Deleting file {path}".format(path=tar_download_path))
|
||||||
os.remove(tar_download_path)
|
os.remove(tar_download_path)
|
||||||
|
|
||||||
# find update dir name
|
# find update dir name
|
||||||
update_dir_contents = [x for x in os.listdir(sb_update_dir) if
|
update_dir_contents = [x for x in os.listdir(sb_update_dir) if
|
||||||
os.path.isdir(os.path.join(sb_update_dir, x))]
|
os.path.isdir(os.path.join(sb_update_dir, x))]
|
||||||
if len(update_dir_contents) != 1:
|
if len(update_dir_contents) != 1:
|
||||||
logger.log(u"Invalid update data, update failed: " + str(update_dir_contents), logger.ERROR)
|
logger.log(u"Invalid update data, update failed: {0}".format(update_dir_contents), logger.ERROR)
|
||||||
return False
|
return False
|
||||||
content_dir = os.path.join(sb_update_dir, update_dir_contents[0])
|
content_dir = os.path.join(sb_update_dir, update_dir_contents[0])
|
||||||
|
|
||||||
# walk temp folder and move files to main folder
|
# walk temp folder and move files to main folder
|
||||||
logger.log(u"Moving files from " + content_dir + " to " + core.PROGRAM_DIR)
|
logger.log(u"Moving files from {source} to {destination}".format
|
||||||
|
(source=content_dir, destination=core.PROGRAM_DIR))
|
||||||
for dirname, dirnames, filenames in os.walk(content_dir): # @UnusedVariable
|
for dirname, dirnames, filenames in os.walk(content_dir): # @UnusedVariable
|
||||||
dirname = dirname[len(content_dir) + 1:]
|
dirname = dirname[len(content_dir) + 1:]
|
||||||
for curfile in filenames:
|
for curfile in filenames:
|
||||||
|
@ -505,8 +498,9 @@ class SourceUpdateManager(UpdateManager):
|
||||||
os.chmod(new_path, stat.S_IWRITE)
|
os.chmod(new_path, stat.S_IWRITE)
|
||||||
os.remove(new_path)
|
os.remove(new_path)
|
||||||
os.renames(old_path, new_path)
|
os.renames(old_path, new_path)
|
||||||
except Exception as e:
|
except Exception as error:
|
||||||
logger.log(u"Unable to update " + new_path + ': ' + str(e), logger.DEBUG)
|
logger.log(u"Unable to update {path}: {msg}".format
|
||||||
|
(path=new_path, msg=error), logger.DEBUG)
|
||||||
os.remove(old_path) # Trash the updated file without moving in new path
|
os.remove(old_path) # Trash the updated file without moving in new path
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -518,13 +512,15 @@ class SourceUpdateManager(UpdateManager):
|
||||||
try:
|
try:
|
||||||
with open(version_path, 'w') as ver_file:
|
with open(version_path, 'w') as ver_file:
|
||||||
ver_file.write(self._newest_commit_hash)
|
ver_file.write(self._newest_commit_hash)
|
||||||
except EnvironmentError as e:
|
except EnvironmentError as error:
|
||||||
logger.log(u"Unable to write version file, update not complete: " + str(e), logger.ERROR)
|
logger.log(u"Unable to write version file, update not complete: {msg}".format
|
||||||
|
(msg=error), logger.ERROR)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as error:
|
||||||
logger.log(u"Error while trying to update: " + str(e), logger.ERROR)
|
logger.log(u"Error while trying to update: {msg}".format
|
||||||
logger.log(u"Traceback: " + traceback.format_exc(), logger.DEBUG)
|
(msg=error), logger.ERROR)
|
||||||
|
logger.log(u"Traceback: {error}".format(error=traceback.format_exc()), logger.DEBUG)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#!/usr/bin/env python2
|
#!/usr/bin/env python2
|
||||||
#
|
# coding=utf-8
|
||||||
##############################################################################
|
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
# ##############################################################################
|
||||||
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
|
||||||
# Post-Process to CouchPotato, SickBeard, NzbDrone, Mylar, Gamez, HeadPhones.
|
# Post-Process to CouchPotato, SickBeard, NzbDrone, Mylar, Gamez, HeadPhones.
|
||||||
#
|
#
|
||||||
|
@ -9,242 +10,243 @@
|
||||||
#
|
#
|
||||||
# NOTE: This script requires Python to be installed on your system.
|
# NOTE: This script requires Python to be installed on your system.
|
||||||
|
|
||||||
##############################################################################
|
# ##############################################################################
|
||||||
### OPTIONS ###
|
# ### OPTIONS ###
|
||||||
|
|
||||||
## General
|
# ## General
|
||||||
|
|
||||||
# Auto Update nzbToMedia (0, 1).
|
# Auto Update nzbToMedia (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
||||||
#auto_update=0
|
# auto_update=0
|
||||||
|
|
||||||
# Check Media for corruption (0, 1).
|
# Check Media for corruption (0, 1).
|
||||||
#
|
#
|
||||||
# Enable/Disable media file checking using ffprobe.
|
# Enable/Disable media file checking using ffprobe.
|
||||||
#check_media=1
|
# check_media=1
|
||||||
|
|
||||||
# Safe Mode protection of DestDir (0, 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.
|
# Enable/Disable a safety check to ensure we don't process all downloads in the default_downloadDirectory by mistake.
|
||||||
#safe_mode=1
|
# safe_mode=1
|
||||||
|
|
||||||
## CouchPotato
|
# ## CouchPotato
|
||||||
|
|
||||||
# CouchPotato script category.
|
# CouchPotato script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with CouchPotatoServer.
|
# category that gets called for post-processing with CouchPotatoServer.
|
||||||
#cpsCategory=movie
|
# cpsCategory=movie
|
||||||
|
|
||||||
# CouchPotato api key.
|
# CouchPotato api key.
|
||||||
#cpsapikey=
|
# cpsapikey=
|
||||||
|
|
||||||
# CouchPotato host.
|
# CouchPotato host.
|
||||||
#
|
#
|
||||||
# The ipaddress for your CouchPotato server. e.g For the Same system use localhost or 127.0.0.1
|
# The ipaddress for your CouchPotato server. e.g For the Same system use localhost or 127.0.0.1
|
||||||
#cpshost=localhost
|
# cpshost=localhost
|
||||||
|
|
||||||
# CouchPotato port.
|
# CouchPotato port.
|
||||||
#cpsport=5050
|
# cpsport=5050
|
||||||
|
|
||||||
# CouchPotato uses ssl (0, 1).
|
# CouchPotato uses ssl (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if using ssl, else set to 0.
|
# Set to 1 if using ssl, else set to 0.
|
||||||
#cpsssl=0
|
# cpsssl=0
|
||||||
|
|
||||||
# CouchPotato URL_Base
|
# CouchPotato URL_Base
|
||||||
#
|
#
|
||||||
# set this if using a reverse proxy.
|
# set this if using a reverse proxy.
|
||||||
#cpsweb_root=
|
# cpsweb_root=
|
||||||
|
|
||||||
# CouchPotato watch directory.
|
# CouchPotato watch directory.
|
||||||
#
|
#
|
||||||
# set this to where your CouchPotato completed downloads are.
|
# set this to where your CouchPotato completed downloads are.
|
||||||
#cpswatch_dir=
|
# cpswatch_dir=
|
||||||
|
|
||||||
# CouchPotato Postprocess Method (renamer, manage).
|
# CouchPotato Postprocess Method (renamer, manage).
|
||||||
#
|
#
|
||||||
# use "renamer" for CPS renamer (default) or "manage" to call a manage update.
|
# use "renamer" for CPS renamer (default) or "manage" to call a manage update.
|
||||||
#cpsmethod=renamer
|
# cpsmethod=renamer
|
||||||
|
|
||||||
# CouchPotato Delete Failed Downloads (0, 1).
|
# CouchPotato Delete Failed Downloads (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to delete failed, or 0 to leave files in place.
|
# set to 1 to delete failed, or 0 to leave files in place.
|
||||||
#cpsdelete_failed=0
|
# cpsdelete_failed=0
|
||||||
|
|
||||||
# CouchPotato wait_for
|
# CouchPotato wait_for
|
||||||
#
|
#
|
||||||
# Set the number of minutes to wait after calling the renamer, to check the movie has changed status.
|
# Set the number of minutes to wait after calling the renamer, to check the movie has changed status.
|
||||||
#cpswait_for=2
|
# cpswait_for=2
|
||||||
|
|
||||||
# CouchPotatoServer and NZBGet are a different system (0, 1).
|
# CouchPotatoServer and NZBGet are a different system (0, 1).
|
||||||
#
|
#
|
||||||
# Enable to replace local path with the path as per the mountPoints below.
|
# Enable to replace local path with the path as per the mountPoints below.
|
||||||
#cpsremote_path=0
|
# cpsremote_path=0
|
||||||
|
|
||||||
## Network
|
# ## Network
|
||||||
|
|
||||||
# Network Mount Points (Needed for remote path above)
|
# Network Mount Points (Needed for remote path above)
|
||||||
#
|
#
|
||||||
# Enter Mount points as LocalPath,RemotePath and separate each pair with '|'
|
# Enter Mount points as LocalPath,RemotePath and separate each pair with '|'
|
||||||
# e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\
|
# e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\
|
||||||
#mountPoints=
|
# mountPoints=
|
||||||
|
|
||||||
## Extensions
|
# ## Extensions
|
||||||
|
|
||||||
# Media Extensions
|
# Media Extensions
|
||||||
#
|
#
|
||||||
# This is a list of media extensions that are used to verify that the download does contain valid media.
|
# 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
|
# mediaExtensions=.mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg,.vob,.iso,.ts
|
||||||
|
|
||||||
## Posix
|
# ## Posix
|
||||||
|
|
||||||
# Niceness for external tasks Extractor and Transcoder.
|
# 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).
|
# Set the Niceness value for the nice command. These range from -20 (most favorable to the process) to 19 (least favorable to the process).
|
||||||
#niceness=10
|
# niceness=10
|
||||||
|
|
||||||
# ionice scheduling class (0, 1, 2, 3).
|
# 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.
|
# Set the ionice scheduling class. 0 for none, 1 for real time, 2 for best-effort, 3 for idle.
|
||||||
#ionice_class=2
|
# ionice_class=2
|
||||||
|
|
||||||
# ionice scheduling class data.
|
# 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.
|
# 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
|
# ionice_classdata=4
|
||||||
|
|
||||||
## Transcoder
|
# ## Transcoder
|
||||||
|
|
||||||
# getSubs (0, 1).
|
# getSubs (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to download subtitles.
|
# set to 1 to download subtitles.
|
||||||
#getSubs=0
|
# getSubs=0
|
||||||
|
|
||||||
# subLanguages.
|
# subLanguages.
|
||||||
#
|
#
|
||||||
# subLanguages. create a list of languages in the order you want them in your subtitles.
|
# subLanguages. create a list of languages in the order you want them in your subtitles.
|
||||||
#subLanguages=eng,spa,fra
|
# subLanguages=eng,spa,fra
|
||||||
|
|
||||||
# Transcode (0, 1).
|
# Transcode (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to transcode, otherwise set to 0.
|
# set to 1 to transcode, otherwise set to 0.
|
||||||
#transcode=0
|
# transcode=0
|
||||||
|
|
||||||
# create a duplicate, or replace the original (0, 1).
|
# create a duplicate, or replace the original (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to cretae a new file or 0 to replace the original
|
# set to 1 to create a new file or 0 to replace the original
|
||||||
#duplicate=1
|
# duplicate=1
|
||||||
|
|
||||||
# ignore extensions.
|
# ignore extensions.
|
||||||
#
|
#
|
||||||
# list of extensions that won't be transcoded.
|
# list of extensions that won't be transcoded.
|
||||||
#ignoreExtensions=.avi,.mkv
|
# ignoreExtensions=.avi,.mkv
|
||||||
|
|
||||||
# outputFastStart (0,1).
|
# outputFastStart (0,1).
|
||||||
#
|
#
|
||||||
# outputFastStart. 1 will use -movflags + faststart. 0 will disable this from being used.
|
# outputFastStart. 1 will use -movflags + faststart. 0 will disable this from being used.
|
||||||
#outputFastStart=0
|
# outputFastStart=0
|
||||||
|
|
||||||
# outputVideoPath.
|
# outputVideoPath.
|
||||||
#
|
#
|
||||||
# outputVideoPath. Set path you want transcoded videos moved to. Leave blank to disable.
|
# outputVideoPath. Set path you want transcoded videos moved to. Leave blank to disable.
|
||||||
#outputVideoPath=
|
# outputVideoPath=
|
||||||
|
|
||||||
# processOutput (0,1).
|
# processOutput (0,1).
|
||||||
#
|
#
|
||||||
# processOutput. 1 will send the outputVideoPath to SickBeard/CouchPotato. 0 will send original files.
|
# processOutput. 1 will send the outputVideoPath to SickBeard/CouchPotato. 0 will send original files.
|
||||||
#processOutput=0
|
# processOutput=0
|
||||||
|
|
||||||
# audioLanguage.
|
# audioLanguage.
|
||||||
#
|
#
|
||||||
# audioLanguage. set the 3 letter language code you want as your primary audio track.
|
# audioLanguage. set the 3 letter language code you want as your primary audio track.
|
||||||
#audioLanguage=eng
|
# audioLanguage=eng
|
||||||
|
|
||||||
# allAudioLanguages (0,1).
|
# allAudioLanguages (0,1).
|
||||||
#
|
#
|
||||||
# allAudioLanguages. 1 will keep all audio tracks (uses AudioCodec3) where available.
|
# allAudioLanguages. 1 will keep all audio tracks (uses AudioCodec3) where available.
|
||||||
#allAudioLanguages=0
|
# allAudioLanguages=0
|
||||||
|
|
||||||
# allSubLanguages (0,1).
|
# allSubLanguages (0,1).
|
||||||
#
|
#
|
||||||
# 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
|
# allSubLanguages=0
|
||||||
|
|
||||||
# embedSubs (0,1).
|
# embedSubs (0,1).
|
||||||
#
|
#
|
||||||
# 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
|
# embedSubs=1
|
||||||
|
|
||||||
# burnInSubtitle (0,1).
|
# burnInSubtitle (0,1).
|
||||||
#
|
#
|
||||||
# burnInSubtitle. burns the default sub language into your video (needed for players that don't support subs)
|
# burnInSubtitle. burns the default sub language into your video (needed for players that don't support subs)
|
||||||
#burnInSubtitle=0
|
# burnInSubtitle=0
|
||||||
|
|
||||||
# extractSubs (0,1).
|
# extractSubs (0,1).
|
||||||
#
|
#
|
||||||
# extractSubs. 1 will extract subs from the video file and save these as external srt files.
|
# extractSubs. 1 will extract subs from the video file and save these as external srt files.
|
||||||
#extractSubs=0
|
# extractSubs=0
|
||||||
|
|
||||||
# externalSubDir.
|
# externalSubDir.
|
||||||
#
|
#
|
||||||
# externalSubDir. set the directory where subs should be saved (if not the same directory as the video)
|
# externalSubDir. set the directory where subs should be saved (if not the same directory as the video)
|
||||||
#externalSubDir=
|
# externalSubDir=
|
||||||
|
|
||||||
# outputDefault (None, iPad, iPad-1080p, iPad-720p, Apple-TV2, iPod, iPhone, PS3, xbox, Roku-1080p, Roku-720p, Roku-480p, mkv, mp4-scene-release).
|
# outputDefault (None, iPad, iPad-1080p, iPad-720p, Apple-TV2, iPod, iPhone, PS3, xbox, Roku-1080p, Roku-720p, Roku-480p, mkv, mp4-scene-release).
|
||||||
#
|
#
|
||||||
# outputDefault. Loads default configs for the selected device. The remaining options below are ignored.
|
# 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.
|
# If you want to use your own profile, set None and set the remaining options below.
|
||||||
#outputDefault=None
|
# outputDefault=None
|
||||||
|
|
||||||
# hwAccel (0,1).
|
# hwAccel (0,1).
|
||||||
#
|
#
|
||||||
# hwAccel. 1 will set ffmpeg to enable hardware acceleration (this requires a recent ffmpeg).
|
# hwAccel. 1 will set ffmpeg to enable hardware acceleration (this requires a recent ffmpeg).
|
||||||
#hwAccel=0
|
# hwAccel=0
|
||||||
|
|
||||||
# ffmpeg output settings.
|
# ffmpeg output settings.
|
||||||
#outputVideoExtension=.mp4
|
# outputVideoExtension=.mp4
|
||||||
#outputVideoCodec=libx264
|
# outputVideoCodec=libx264
|
||||||
#VideoCodecAllow=
|
# VideoCodecAllow=
|
||||||
#outputVideoPreset=medium
|
# outputVideoPreset=medium
|
||||||
#outputVideoFramerate=24
|
# outputVideoFramerate=24
|
||||||
#outputVideoBitrate=800k
|
# outputVideoBitrate=800k
|
||||||
#outputAudioCodec=ac3
|
# outputAudioCodec=ac3
|
||||||
#AudioCodecAllow=
|
# AudioCodecAllow=
|
||||||
#outputAudioChannels=6
|
# outputAudioChannels=6
|
||||||
#outputAudioBitrate=640k
|
# outputAudioBitrate=640k
|
||||||
#outputQualityPercent=
|
# outputQualityPercent=
|
||||||
#outputAudioTrack2Codec=libfaac
|
# outputAudioTrack2Codec=libfaac
|
||||||
#AudioCodec2Allow=
|
# AudioCodec2Allow=
|
||||||
#outputAudioTrack2Channels=2
|
# outputAudioTrack2Channels=2
|
||||||
#outputAudioTrack2Bitrate=160k
|
# outputAudioTrack2Bitrate=160k
|
||||||
#outputAudioOtherCodec=libmp3lame
|
# outputAudioOtherCodec=libmp3lame
|
||||||
#AudioOtherCodecAllow=
|
# AudioOtherCodecAllow=
|
||||||
#outputAudioOtherChannels=2
|
# outputAudioOtherChannels=2
|
||||||
#outputAudioOtherBitrate=128k
|
# outputAudioOtherBitrate=128k
|
||||||
#outputSubtitleCodec=
|
# outputSubtitleCodec=
|
||||||
|
|
||||||
## WakeOnLan
|
# ## WakeOnLan
|
||||||
|
|
||||||
# use WOL (0, 1).
|
# 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.
|
# 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
|
# wolwake=0
|
||||||
|
|
||||||
# WOL MAC
|
# WOL MAC
|
||||||
#
|
#
|
||||||
# enter the mac address of the system to be woken.
|
# enter the mac address of the system to be woken.
|
||||||
#wolmac=00:01:2e:2D:64:e1
|
# wolmac=00:01:2e:2D:64:e1
|
||||||
|
|
||||||
# Set the Host and Port of a server to verify system has woken.
|
# Set the Host and Port of a server to verify system has woken.
|
||||||
#wolhost=192.168.1.37
|
# wolhost=192.168.1.37
|
||||||
#wolport=80
|
# wolport=80
|
||||||
|
|
||||||
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
# ##############################################################################
|
||||||
|
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
|
||||||
##############################################################################
|
|
||||||
import sys
|
import sys
|
||||||
import nzbToMedia
|
import nzbToMedia
|
||||||
|
|
||||||
section = "CouchPotato"
|
section = "CouchPotato"
|
||||||
result = nzbToMedia.main(sys.argv, section)
|
result = nzbToMedia.main(sys.argv, section)
|
||||||
sys.exit(result)
|
sys.exit(result)
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#!/usr/bin/env python2
|
#!/usr/bin/env python2
|
||||||
|
# coding=utf-8
|
||||||
#
|
#
|
||||||
##############################################################################
|
# ##############################################################################
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
|
||||||
# Post-Process to CouchPotato, SickBeard, NzbDrone, Mylar, Gamez, HeadPhones.
|
# Post-Process to CouchPotato, SickBeard, NzbDrone, Mylar, Gamez, HeadPhones.
|
||||||
#
|
#
|
||||||
|
@ -9,98 +10,99 @@
|
||||||
#
|
#
|
||||||
# NOTE: This script requires Python to be installed on your system.
|
# NOTE: This script requires Python to be installed on your system.
|
||||||
|
|
||||||
##############################################################################
|
# ##############################################################################
|
||||||
#
|
#
|
||||||
### OPTIONS ###
|
# ### OPTIONS ###
|
||||||
|
|
||||||
## General
|
# ## General
|
||||||
|
|
||||||
# Auto Update nzbToMedia (0, 1).
|
# Auto Update nzbToMedia (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
||||||
#auto_update=0
|
# auto_update=0
|
||||||
|
|
||||||
# Safe Mode protection of DestDir (0, 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.
|
# Enable/Disable a safety check to ensure we don't process all downloads in the default_downloadDirectory by mistake.
|
||||||
#safe_mode=1
|
# safe_mode=1
|
||||||
|
|
||||||
## Gamez
|
# ## Gamez
|
||||||
|
|
||||||
# Gamez script category.
|
# Gamez script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with Gamez.
|
# category that gets called for post-processing with Gamez.
|
||||||
#gzCategory=games
|
# gzCategory=games
|
||||||
|
|
||||||
# Gamez api key.
|
# Gamez api key.
|
||||||
#gzapikey=
|
# gzapikey=
|
||||||
|
|
||||||
# Gamez host.
|
# Gamez host.
|
||||||
#
|
#
|
||||||
# The ipaddress for your Gamez server. e.g For the Same system use localhost or 127.0.0.1
|
# The ipaddress for your Gamez server. e.g For the Same system use localhost or 127.0.0.1
|
||||||
#gzhost=localhost
|
# gzhost=localhost
|
||||||
|
|
||||||
# Gamez port.
|
# Gamez port.
|
||||||
#gzport=8085
|
# gzport=8085
|
||||||
|
|
||||||
# Gamez uses ssl (0, 1).
|
# Gamez uses ssl (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if using ssl, else set to 0.
|
# Set to 1 if using ssl, else set to 0.
|
||||||
#gzssl=0
|
# gzssl=0
|
||||||
|
|
||||||
# Gamez library
|
# Gamez library
|
||||||
#
|
#
|
||||||
# move downloaded games here.
|
# move downloaded games here.
|
||||||
#gzlibrary
|
# gzlibrary
|
||||||
|
|
||||||
# Gamez web_root
|
# Gamez web_root
|
||||||
#
|
#
|
||||||
# set this if using a reverse proxy.
|
# set this if using a reverse proxy.
|
||||||
#gzweb_root=
|
# gzweb_root=
|
||||||
|
|
||||||
# Gamez watch directory.
|
# Gamez watch directory.
|
||||||
#
|
#
|
||||||
# set this to where your Gamez completed downloads are.
|
# set this to where your Gamez completed downloads are.
|
||||||
#gzwatch_dir=
|
# gzwatch_dir=
|
||||||
|
|
||||||
## Posix
|
# ## Posix
|
||||||
|
|
||||||
# Niceness for external tasks Extractor and Transcoder.
|
# 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).
|
# Set the Niceness value for the nice command. These range from -20 (most favorable to the process) to 19 (least favorable to the process).
|
||||||
#niceness=10
|
# niceness=10
|
||||||
|
|
||||||
# ionice scheduling class (0, 1, 2, 3).
|
# 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.
|
# Set the ionice scheduling class. 0 for none, 1 for real time, 2 for best-effort, 3 for idle.
|
||||||
#ionice_class=2
|
# ionice_class=2
|
||||||
|
|
||||||
# ionice scheduling class data.
|
# 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.
|
# 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
|
# ionice_classdata=4
|
||||||
|
|
||||||
## WakeOnLan
|
# ## WakeOnLan
|
||||||
|
|
||||||
# use WOL (0, 1).
|
# 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.
|
# 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
|
# wolwake=0
|
||||||
|
|
||||||
# WOL MAC
|
# WOL MAC
|
||||||
#
|
#
|
||||||
# enter the mac address of the system to be woken.
|
# enter the mac address of the system to be woken.
|
||||||
#wolmac=00:01:2e:2D:64:e1
|
# wolmac=00:01:2e:2D:64:e1
|
||||||
|
|
||||||
# Set the Host and Port of a server to verify system has woken.
|
# Set the Host and Port of a server to verify system has woken.
|
||||||
#wolhost=192.168.1.37
|
# wolhost=192.168.1.37
|
||||||
#wolport=80
|
# wolport=80
|
||||||
|
|
||||||
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
# ##############################################################################
|
||||||
|
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
|
||||||
##############################################################################
|
|
||||||
import sys
|
import sys
|
||||||
import nzbToMedia
|
import nzbToMedia
|
||||||
|
|
||||||
section = "Gamez"
|
section = "Gamez"
|
||||||
result = nzbToMedia.main(sys.argv, section)
|
result = nzbToMedia.main(sys.argv, section)
|
||||||
sys.exit(result)
|
sys.exit(result)
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#!/usr/bin/env python2
|
#!/usr/bin/env python2
|
||||||
#
|
# coding=utf-8
|
||||||
##############################################################################
|
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
# ##############################################################################
|
||||||
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
|
||||||
# Post-Process to HeadPhones.
|
# Post-Process to HeadPhones.
|
||||||
#
|
#
|
||||||
|
@ -9,110 +10,111 @@
|
||||||
#
|
#
|
||||||
# NOTE: This script requires Python to be installed on your system.
|
# NOTE: This script requires Python to be installed on your system.
|
||||||
|
|
||||||
##############################################################################
|
# ##############################################################################
|
||||||
### OPTIONS
|
# ### OPTIONS
|
||||||
|
|
||||||
## General
|
# ## General
|
||||||
|
|
||||||
# Auto Update nzbToMedia (0, 1).
|
# Auto Update nzbToMedia (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
||||||
#auto_update=0
|
# auto_update=0
|
||||||
|
|
||||||
# Safe Mode protection of DestDir (0, 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.
|
# Enable/Disable a safety check to ensure we don't process all downloads in the default_downloadDirectory by mistake.
|
||||||
#safe_mode=1
|
# safe_mode=1
|
||||||
|
|
||||||
## HeadPhones
|
# ## HeadPhones
|
||||||
|
|
||||||
# HeadPhones script category.
|
# HeadPhones script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with HeadHones.
|
# category that gets called for post-processing with HeadHones.
|
||||||
#hpCategory=music
|
# hpCategory=music
|
||||||
|
|
||||||
# HeadPhones api key.
|
# HeadPhones api key.
|
||||||
#hpapikey=
|
# hpapikey=
|
||||||
|
|
||||||
# HeadPhones host.
|
# HeadPhones host.
|
||||||
#
|
#
|
||||||
# The ipaddress for your HeadPhones server. e.g For the Same system use localhost or 127.0.0.1
|
# The ipaddress for your HeadPhones server. e.g For the Same system use localhost or 127.0.0.1
|
||||||
#hphost=localhost
|
# hphost=localhost
|
||||||
|
|
||||||
# HeadPhones port.
|
# HeadPhones port.
|
||||||
#hpport=8181
|
# hpport=8181
|
||||||
|
|
||||||
# HeadPhones uses ssl (0, 1).
|
# HeadPhones uses ssl (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if using ssl, else set to 0.
|
# Set to 1 if using ssl, else set to 0.
|
||||||
#hpssl=0
|
# hpssl=0
|
||||||
|
|
||||||
# HeadPhones web_root
|
# HeadPhones web_root
|
||||||
#
|
#
|
||||||
# set this if using a reverse proxy.
|
# set this if using a reverse proxy.
|
||||||
#hpweb_root=
|
# hpweb_root=
|
||||||
|
|
||||||
# HeadPhones watch directory.
|
# HeadPhones watch directory.
|
||||||
#
|
#
|
||||||
# set this to where your HeadPhones completed downloads are.
|
# set this to where your HeadPhones completed downloads are.
|
||||||
#hpwatch_dir=
|
# hpwatch_dir=
|
||||||
|
|
||||||
# HeadPhones wait_for
|
# HeadPhones wait_for
|
||||||
#
|
#
|
||||||
# Set the number of minutes to wait after initiating HeadPhones post-processing to check if the album status has changed.
|
# Set the number of minutes to wait after initiating HeadPhones post-processing to check if the album status has changed.
|
||||||
#hpwait_for=2
|
# hpwait_for=2
|
||||||
|
|
||||||
# HeadPhones and NZBGet are a different system (0, 1).
|
# HeadPhones and NZBGet are a different system (0, 1).
|
||||||
#
|
#
|
||||||
# Enable to replace local path with the path as per the mountPoints below.
|
# Enable to replace local path with the path as per the mountPoints below.
|
||||||
#hpremote_path=0
|
# hpremote_path=0
|
||||||
|
|
||||||
## Posix
|
# ## Posix
|
||||||
|
|
||||||
# Niceness for external tasks Extractor and Transcoder.
|
# 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).
|
# Set the Niceness value for the nice command. These range from -20 (most favorable to the process) to 19 (least favorable to the process).
|
||||||
#niceness=10
|
# niceness=10
|
||||||
|
|
||||||
# ionice scheduling class (0, 1, 2, 3).
|
# 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.
|
# Set the ionice scheduling class. 0 for none, 1 for real time, 2 for best-effort, 3 for idle.
|
||||||
#ionice_class=2
|
# ionice_class=2
|
||||||
|
|
||||||
# ionice scheduling class data.
|
# 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.
|
# 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
|
# ionice_classdata=4
|
||||||
|
|
||||||
## Network
|
# ## Network
|
||||||
|
|
||||||
# Network Mount Points (Needed for remote path above)
|
# Network Mount Points (Needed for remote path above)
|
||||||
#
|
#
|
||||||
# Enter Mount points as LocalPath,RemotePath and separate each pair with '|'
|
# Enter Mount points as LocalPath,RemotePath and separate each pair with '|'
|
||||||
# e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\
|
# e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\
|
||||||
#mountPoints=
|
# mountPoints=
|
||||||
|
|
||||||
## WakeOnLan
|
# ## WakeOnLan
|
||||||
|
|
||||||
# use WOL (0, 1).
|
# 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.
|
# 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
|
# wolwake=0
|
||||||
|
|
||||||
# WOL MAC
|
# WOL MAC
|
||||||
#
|
#
|
||||||
# enter the mac address of the system to be woken.
|
# enter the mac address of the system to be woken.
|
||||||
#wolmac=00:01:2e:2D:64:e1
|
# wolmac=00:01:2e:2D:64:e1
|
||||||
|
|
||||||
# Set the Host and Port of a server to verify system has woken.
|
# Set the Host and Port of a server to verify system has woken.
|
||||||
#wolhost=192.168.1.37
|
# wolhost=192.168.1.37
|
||||||
#wolport=80
|
# wolport=80
|
||||||
|
|
||||||
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
# ##############################################################################
|
||||||
|
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
|
||||||
##############################################################################
|
|
||||||
import sys
|
import sys
|
||||||
import nzbToMedia
|
import nzbToMedia
|
||||||
|
|
||||||
section = "HeadPhones"
|
section = "HeadPhones"
|
||||||
result = nzbToMedia.main(sys.argv, section)
|
result = nzbToMedia.main(sys.argv, section)
|
||||||
sys.exit(result)
|
sys.exit(result)
|
||||||
|
|
358
nzbToMedia.py
358
nzbToMedia.py
|
@ -1,7 +1,8 @@
|
||||||
#!/usr/bin/env python2
|
#!/usr/bin/env python2
|
||||||
|
# coding=utf-8
|
||||||
#
|
#
|
||||||
##############################################################################
|
# ##############################################################################
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
|
||||||
# Post-Process to CouchPotato, SickBeard, NzbDrone, Mylar, Gamez, HeadPhones.
|
# Post-Process to CouchPotato, SickBeard, NzbDrone, Mylar, Gamez, HeadPhones.
|
||||||
#
|
#
|
||||||
|
@ -9,497 +10,502 @@
|
||||||
#
|
#
|
||||||
# NOTE: This script requires Python to be installed on your system.
|
# NOTE: This script requires Python to be installed on your system.
|
||||||
|
|
||||||
##############################################################################
|
# ##############################################################################
|
||||||
### OPTIONS ###
|
# ### OPTIONS ###
|
||||||
|
|
||||||
## General
|
# ## General
|
||||||
|
|
||||||
# Auto Update nzbToMedia (0, 1).
|
# Auto Update nzbToMedia (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
||||||
#auto_update=0
|
# auto_update=0
|
||||||
|
|
||||||
# Check Media for corruption (0, 1).
|
# Check Media for corruption (0, 1).
|
||||||
#
|
#
|
||||||
# Enable/Disable media file checking using ffprobe.
|
# Enable/Disable media file checking using ffprobe.
|
||||||
#check_media=1
|
# check_media=1
|
||||||
|
|
||||||
# Safe Mode protection of DestDir (0, 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.
|
# Enable/Disable a safety check to ensure we don't process all downloads in the default_downloadDirectory by mistake.
|
||||||
#safe_mode=1
|
# safe_mode=1
|
||||||
|
|
||||||
## CouchPotato
|
# ## CouchPotato
|
||||||
|
|
||||||
# CouchPotato script category.
|
# CouchPotato script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with CouchPotatoServer.
|
# category that gets called for post-processing with CouchPotatoServer.
|
||||||
#cpsCategory=movie
|
# cpsCategory=movie
|
||||||
|
|
||||||
# CouchPotato api key.
|
# CouchPotato api key.
|
||||||
#cpsapikey=
|
# cpsapikey=
|
||||||
|
|
||||||
# CouchPotato host.
|
# CouchPotato host.
|
||||||
#
|
#
|
||||||
# The ipaddress for your CouchPotato server. e.g For the Same system use localhost or 127.0.0.1
|
# The ipaddress for your CouchPotato server. e.g For the Same system use localhost or 127.0.0.1
|
||||||
#cpshost=localhost
|
# cpshost=localhost
|
||||||
|
|
||||||
# CouchPotato port.
|
# CouchPotato port.
|
||||||
#cpsport=5050
|
# cpsport=5050
|
||||||
|
|
||||||
# CouchPotato uses ssl (0, 1).
|
# CouchPotato uses ssl (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if using ssl, else set to 0.
|
# Set to 1 if using ssl, else set to 0.
|
||||||
#cpsssl=0
|
# cpsssl=0
|
||||||
|
|
||||||
# CouchPotato URL_Base
|
# CouchPotato URL_Base
|
||||||
#
|
#
|
||||||
# set this if using a reverse proxy.
|
# set this if using a reverse proxy.
|
||||||
#cpsweb_root=
|
# cpsweb_root=
|
||||||
|
|
||||||
# CouchPotato Postprocess Method (renamer, manage).
|
# CouchPotato Postprocess Method (renamer, manage).
|
||||||
#
|
#
|
||||||
# use "renamer" for CPS renamer (default) or "manage" to call a manage update.
|
# use "renamer" for CPS renamer (default) or "manage" to call a manage update.
|
||||||
#cpsmethod=renamer
|
# cpsmethod=renamer
|
||||||
|
|
||||||
# CouchPotato Delete Failed Downloads (0, 1).
|
# CouchPotato Delete Failed Downloads (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to delete failed, or 0 to leave files in place.
|
# set to 1 to delete failed, or 0 to leave files in place.
|
||||||
#cpsdelete_failed=0
|
# cpsdelete_failed=0
|
||||||
|
|
||||||
# CouchPotato wait_for
|
# CouchPotato wait_for
|
||||||
#
|
#
|
||||||
# Set the number of minutes to wait after calling the renamer, to check the movie has changed status.
|
# Set the number of minutes to wait after calling the renamer, to check the movie has changed status.
|
||||||
#cpswait_for=2
|
# cpswait_for=2
|
||||||
|
|
||||||
# Couchpotato and NZBGet are a different system (0, 1).
|
# Couchpotato and NZBGet are a different system (0, 1).
|
||||||
#
|
#
|
||||||
# Enable to replace local path with the path as per the mountPoints below.
|
# Enable to replace local path with the path as per the mountPoints below.
|
||||||
#cpsremote_path=0
|
# cpsremote_path=0
|
||||||
|
|
||||||
## SickBeard
|
# ## SickBeard
|
||||||
|
|
||||||
# SickBeard script category.
|
# SickBeard script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with SickBeard.
|
# category that gets called for post-processing with SickBeard.
|
||||||
#sbCategory=tv
|
# sbCategory=tv
|
||||||
|
|
||||||
# SickBeard host.
|
# SickBeard host.
|
||||||
#
|
#
|
||||||
# The ipaddress for your SickBeard/SickRage server. e.g For the Same system use localhost or 127.0.0.1
|
# The ipaddress for your SickBeard/SickRage server. e.g For the Same system use localhost or 127.0.0.1
|
||||||
#sbhost=localhost
|
# sbhost=localhost
|
||||||
|
|
||||||
# SickBeard port.
|
# SickBeard port.
|
||||||
#sbport=8081
|
# sbport=8081
|
||||||
|
|
||||||
# SickBeard username.
|
# SickBeard username.
|
||||||
#sbusername=
|
# sbusername=
|
||||||
|
|
||||||
# SickBeard password.
|
# SickBeard password.
|
||||||
#sbpassword=
|
# sbpassword=
|
||||||
|
|
||||||
# SickBeard uses ssl (0, 1).
|
# SickBeard uses ssl (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if using ssl, else set to 0.
|
# Set to 1 if using ssl, else set to 0.
|
||||||
#sbssl=0
|
# sbssl=0
|
||||||
|
|
||||||
# SickBeard web_root
|
# SickBeard web_root
|
||||||
#
|
#
|
||||||
# set this if using a reverse proxy.
|
# set this if using a reverse proxy.
|
||||||
#sbweb_root=
|
# sbweb_root=
|
||||||
|
|
||||||
# SickBeard watch directory.
|
# SickBeard watch directory.
|
||||||
#
|
#
|
||||||
# set this if SickBeard and nzbGet are on different systems.
|
# set this if SickBeard and nzbGet are on different systems.
|
||||||
#sbwatch_dir=
|
# sbwatch_dir=
|
||||||
|
|
||||||
# SickBeard fork.
|
# SickBeard fork.
|
||||||
#
|
#
|
||||||
# set to default or auto to auto-detect the custom fork type.
|
# set to default or auto to auto-detect the custom fork type.
|
||||||
#sbfork=auto
|
# sbfork=auto
|
||||||
|
|
||||||
# SickBeard Delete Failed Downloads (0, 1).
|
# SickBeard Delete Failed Downloads (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to delete failed, or 0 to leave files in place.
|
# set to 1 to delete failed, or 0 to leave files in place.
|
||||||
#sbdelete_failed=0
|
# sbdelete_failed=0
|
||||||
|
|
||||||
# SickBeard process method.
|
# 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.
|
# 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=
|
# sbprocess_method=
|
||||||
|
|
||||||
# SickBeard and NZBGet are a different system (0, 1).
|
# SickBeard and NZBGet are a different system (0, 1).
|
||||||
#
|
#
|
||||||
# Enable to replace local path with the path as per the mountPoints below.
|
# Enable to replace local path with the path as per the mountPoints below.
|
||||||
#sbremote_path=0
|
# sbremote_path=0
|
||||||
|
|
||||||
## NzbDrone
|
# ## NzbDrone
|
||||||
|
|
||||||
# NzbDrone script category.
|
# NzbDrone script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with NzbDrone.
|
# category that gets called for post-processing with NzbDrone.
|
||||||
#ndCategory=tv2
|
# ndCategory=tv2
|
||||||
|
|
||||||
# NzbDrone host.
|
# NzbDrone host.
|
||||||
#
|
#
|
||||||
# The ipaddress for your NzbDrone/Sonarr server. e.g For the Same system use localhost or 127.0.0.1
|
# The ipaddress for your NzbDrone/Sonarr server. e.g For the Same system use localhost or 127.0.0.1
|
||||||
#ndhost=localhost
|
# ndhost=localhost
|
||||||
|
|
||||||
# NzbDrone port.
|
# NzbDrone port.
|
||||||
#ndport=8989
|
# ndport=8989
|
||||||
|
|
||||||
# NzbDrone API key.
|
# NzbDrone API key.
|
||||||
#ndapikey=
|
# ndapikey=
|
||||||
|
|
||||||
# NzbDrone uses SSL (0, 1).
|
# NzbDrone uses SSL (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if using SSL, else set to 0.
|
# Set to 1 if using SSL, else set to 0.
|
||||||
#ndssl=0
|
# ndssl=0
|
||||||
|
|
||||||
# NzbDrone web root.
|
# NzbDrone web root.
|
||||||
#
|
#
|
||||||
# set this if using a reverse proxy.
|
# set this if using a reverse proxy.
|
||||||
#ndweb_root=
|
# ndweb_root=
|
||||||
|
|
||||||
# NzbDrone wait_for
|
# NzbDrone wait_for
|
||||||
#
|
#
|
||||||
# Set the number of minutes to wait after calling the renamer, to check the episode has changed status.
|
# Set the number of minutes to wait after calling the renamer, to check the episode has changed status.
|
||||||
#ndwait_for=2
|
# ndwait_for=2
|
||||||
|
|
||||||
# NzbDrone Delete Failed Downloads (0, 1).
|
# NzbDrone Delete Failed Downloads (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to delete failed, or 0 to leave files in place.
|
# set to 1 to delete failed, or 0 to leave files in place.
|
||||||
#nddelete_failed=0
|
# nddelete_failed=0
|
||||||
|
|
||||||
# NzbDrone and NZBGet are a different system (0, 1).
|
# NzbDrone and NZBGet are a different system (0, 1).
|
||||||
#
|
#
|
||||||
# Enable to replace local path with the path as per the mountPoints below.
|
# Enable to replace local path with the path as per the mountPoints below.
|
||||||
#ndremote_path=0
|
# ndremote_path=0
|
||||||
|
|
||||||
## HeadPhones
|
# ## HeadPhones
|
||||||
|
|
||||||
# HeadPhones script category.
|
# HeadPhones script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with HeadHones.
|
# category that gets called for post-processing with HeadHones.
|
||||||
#hpCategory=music
|
# hpCategory=music
|
||||||
|
|
||||||
# HeadPhones api key.
|
# HeadPhones api key.
|
||||||
#hpapikey=
|
# hpapikey=
|
||||||
|
|
||||||
# HeadPhones host.
|
# HeadPhones host.
|
||||||
#
|
#
|
||||||
# The ipaddress for your HeadPhones server. e.g For the Same system use localhost or 127.0.0.1
|
# The ipaddress for your HeadPhones server. e.g For the Same system use localhost or 127.0.0.1
|
||||||
#hphost=localhost
|
# hphost=localhost
|
||||||
|
|
||||||
# HeadPhones port.
|
# HeadPhones port.
|
||||||
#hpport=8181
|
# hpport=8181
|
||||||
|
|
||||||
# HeadPhones uses ssl (0, 1).
|
# HeadPhones uses ssl (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if using ssl, else set to 0.
|
# Set to 1 if using ssl, else set to 0.
|
||||||
#hpssl=0
|
# hpssl=0
|
||||||
|
|
||||||
# HeadPhones web_root
|
# HeadPhones web_root
|
||||||
#
|
#
|
||||||
# set this if using a reverse proxy.
|
# set this if using a reverse proxy.
|
||||||
#hpweb_root=
|
# hpweb_root=
|
||||||
|
|
||||||
# HeadPhones and NZBGet are a different system (0, 1).
|
# HeadPhones and NZBGet are a different system (0, 1).
|
||||||
#
|
#
|
||||||
# Enable to replace local path with the path as per the mountPoints below.
|
# Enable to replace local path with the path as per the mountPoints below.
|
||||||
#hpremote_path=0
|
# hpremote_path=0
|
||||||
|
|
||||||
## Mylar
|
# ## Mylar
|
||||||
|
|
||||||
# Mylar script category.
|
# Mylar script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with Mylar.
|
# category that gets called for post-processing with Mylar.
|
||||||
#myCategory=comics
|
# myCategory=comics
|
||||||
|
|
||||||
# Mylar host.
|
# Mylar host.
|
||||||
#
|
#
|
||||||
# The ipaddress for your Mylar server. e.g For the Same system use localhost or 127.0.0.1
|
# The ipaddress for your Mylar server. e.g For the Same system use localhost or 127.0.0.1
|
||||||
#myhost=localhost
|
# myhost=localhost
|
||||||
|
|
||||||
# Mylar port.
|
# Mylar port.
|
||||||
#myport=8090
|
# myport=8090
|
||||||
|
|
||||||
# Mylar username.
|
# Mylar username.
|
||||||
#myusername=
|
# myusername=
|
||||||
|
|
||||||
# Mylar password.
|
# Mylar password.
|
||||||
#mypassword=
|
# mypassword=
|
||||||
|
|
||||||
# Mylar uses ssl (0, 1).
|
# Mylar uses ssl (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if using ssl, else set to 0.
|
# Set to 1 if using ssl, else set to 0.
|
||||||
#myssl=0
|
# myssl=0
|
||||||
|
|
||||||
# Mylar web_root
|
# Mylar web_root
|
||||||
#
|
#
|
||||||
# set this if using a reverse proxy.
|
# set this if using a reverse proxy.
|
||||||
#myweb_root=
|
# myweb_root=
|
||||||
|
|
||||||
# Mylar wait_for
|
# Mylar wait_for
|
||||||
#
|
#
|
||||||
# Set the number of minutes to wait after calling the force process, to check the issue has changed status.
|
# Set the number of minutes to wait after calling the force process, to check the issue has changed status.
|
||||||
#myswait_for=1
|
# myswait_for=1
|
||||||
|
|
||||||
# Mylar and NZBGet are a different system (0, 1).
|
# Mylar and NZBGet are a different system (0, 1).
|
||||||
#
|
#
|
||||||
# Enable to replace local path with the path as per the mountPoints below.
|
# Enable to replace local path with the path as per the mountPoints below.
|
||||||
#myremote_path=0
|
# myremote_path=0
|
||||||
|
|
||||||
## Gamez
|
# ## Gamez
|
||||||
|
|
||||||
# Gamez script category.
|
# Gamez script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with Gamez.
|
# category that gets called for post-processing with Gamez.
|
||||||
#gzCategory=games
|
# gzCategory=games
|
||||||
|
|
||||||
# Gamez api key.
|
# Gamez api key.
|
||||||
#gzapikey=
|
# gzapikey=
|
||||||
|
|
||||||
# Gamez host.
|
# Gamez host.
|
||||||
#
|
#
|
||||||
# The ipaddress for your Gamez server. e.g For the Same system use localhost or 127.0.0.1
|
# The ipaddress for your Gamez server. e.g For the Same system use localhost or 127.0.0.1
|
||||||
#gzhost=localhost
|
# gzhost=localhost
|
||||||
|
|
||||||
# Gamez port.
|
# Gamez port.
|
||||||
#gzport=8085
|
# gzport=8085
|
||||||
|
|
||||||
# Gamez uses ssl (0, 1).
|
# Gamez uses ssl (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if using ssl, else set to 0.
|
# Set to 1 if using ssl, else set to 0.
|
||||||
#gzssl=0
|
# gzssl=0
|
||||||
|
|
||||||
# Gamez library
|
# Gamez library
|
||||||
#
|
#
|
||||||
# move downloaded games here.
|
# move downloaded games here.
|
||||||
#gzlibrary
|
# gzlibrary
|
||||||
|
|
||||||
# Gamez web_root
|
# Gamez web_root
|
||||||
#
|
#
|
||||||
# set this if using a reverse proxy.
|
# set this if using a reverse proxy.
|
||||||
#gzweb_root=
|
# gzweb_root=
|
||||||
|
|
||||||
# Gamez and NZBGet are a different system (0, 1).
|
# Gamez and NZBGet are a different system (0, 1).
|
||||||
#
|
#
|
||||||
# Enable to replace local path with the path as per the mountPoints below.
|
# Enable to replace local path with the path as per the mountPoints below.
|
||||||
#gzremote_path=0
|
# gzremote_path=0
|
||||||
|
|
||||||
## Network
|
# ## Network
|
||||||
|
|
||||||
# Network Mount Points (Needed for remote path above)
|
# Network Mount Points (Needed for remote path above)
|
||||||
#
|
#
|
||||||
# Enter Mount points as LocalPath,RemotePath and separate each pair with '|'
|
# Enter Mount points as LocalPath,RemotePath and separate each pair with '|'
|
||||||
# e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\
|
# e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\
|
||||||
#mountPoints=
|
# mountPoints=
|
||||||
|
|
||||||
## Extensions
|
# ## Extensions
|
||||||
|
|
||||||
# Media Extensions
|
# Media Extensions
|
||||||
#
|
#
|
||||||
# This is a list of media extensions that are used to verify that the download does contain valid media.
|
# 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
|
# mediaExtensions=.mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg,.vob,.iso,.ts
|
||||||
|
|
||||||
## Posix
|
# ## Posix
|
||||||
|
|
||||||
# Niceness for external tasks Extractor and Transcoder.
|
# 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).
|
# Set the Niceness value for the nice command. These range from -20 (most favorable to the process) to 19 (least favorable to the process).
|
||||||
#niceness=10
|
# niceness=10
|
||||||
|
|
||||||
# ionice scheduling class (0, 1, 2, 3).
|
# 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.
|
# Set the ionice scheduling class. 0 for none, 1 for real time, 2 for best-effort, 3 for idle.
|
||||||
#ionice_class=2
|
# ionice_class=2
|
||||||
|
|
||||||
# ionice scheduling class data.
|
# 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.
|
# 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
|
# ionice_classdata=4
|
||||||
|
|
||||||
## Transcoder
|
# ## Transcoder
|
||||||
|
|
||||||
# getSubs (0, 1).
|
# getSubs (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to download subtitles.
|
# set to 1 to download subtitles.
|
||||||
#getSubs=0
|
# getSubs=0
|
||||||
|
|
||||||
# subLanguages.
|
# subLanguages.
|
||||||
#
|
#
|
||||||
# subLanguages. create a list of languages in the order you want them in your subtitles.
|
# subLanguages. create a list of languages in the order you want them in your subtitles.
|
||||||
#subLanguages=eng,spa,fra
|
# subLanguages=eng,spa,fra
|
||||||
|
|
||||||
# Transcode (0, 1).
|
# Transcode (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to transcode, otherwise set to 0.
|
# set to 1 to transcode, otherwise set to 0.
|
||||||
#transcode=0
|
# transcode=0
|
||||||
|
|
||||||
# create a duplicate, or replace the original (0, 1).
|
# create a duplicate, or replace the original (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to cretae a new file or 0 to replace the original
|
# set to 1 to cretae a new file or 0 to replace the original
|
||||||
#duplicate=1
|
# duplicate=1
|
||||||
|
|
||||||
# ignore extensions.
|
# ignore extensions.
|
||||||
#
|
#
|
||||||
# list of extensions that won't be transcoded.
|
# list of extensions that won't be transcoded.
|
||||||
#ignoreExtensions=.avi,.mkv
|
# ignoreExtensions=.avi,.mkv
|
||||||
|
|
||||||
# outputFastStart (0,1).
|
# outputFastStart (0,1).
|
||||||
#
|
#
|
||||||
# outputFastStart. 1 will use -movflags + faststart. 0 will disable this from being used.
|
# outputFastStart. 1 will use -movflags + faststart. 0 will disable this from being used.
|
||||||
#outputFastStart=0
|
# outputFastStart=0
|
||||||
|
|
||||||
# outputVideoPath.
|
# outputVideoPath.
|
||||||
#
|
#
|
||||||
# outputVideoPath. Set path you want transcoded videos moved to. Leave blank to disable.
|
# outputVideoPath. Set path you want transcoded videos moved to. Leave blank to disable.
|
||||||
#outputVideoPath=
|
# outputVideoPath=
|
||||||
|
|
||||||
# processOutput (0,1).
|
# processOutput (0,1).
|
||||||
#
|
#
|
||||||
# processOutput. 1 will send the outputVideoPath to SickBeard/CouchPotato. 0 will send original files.
|
# processOutput. 1 will send the outputVideoPath to SickBeard/CouchPotato. 0 will send original files.
|
||||||
#processOutput=0
|
# processOutput=0
|
||||||
|
|
||||||
# audioLanguage.
|
# audioLanguage.
|
||||||
#
|
#
|
||||||
# audioLanguage. set the 3 letter language code you want as your primary audio track.
|
# audioLanguage. set the 3 letter language code you want as your primary audio track.
|
||||||
#audioLanguage=eng
|
# audioLanguage=eng
|
||||||
|
|
||||||
# allAudioLanguages (0,1).
|
# allAudioLanguages (0,1).
|
||||||
#
|
#
|
||||||
# allAudioLanguages. 1 will keep all audio tracks (uses AudioCodec3) where available.
|
# allAudioLanguages. 1 will keep all audio tracks (uses AudioCodec3) where available.
|
||||||
#allAudioLanguages=0
|
# allAudioLanguages=0
|
||||||
|
|
||||||
# allSubLanguages (0,1).
|
# allSubLanguages (0,1).
|
||||||
#
|
#
|
||||||
# allSubLanguages. 1 will keep all exisiting sub languages. 0 will discare those not in your list above.
|
# allSubLanguages. 1 will keep all exisiting sub languages. 0 will discare those not in your list above.
|
||||||
#allSubLanguages=0
|
# allSubLanguages=0
|
||||||
|
|
||||||
# embedSubs (0,1).
|
# embedSubs (0,1).
|
||||||
#
|
#
|
||||||
# embedSubs. 1 will embded external sub/srt subs into your video if this is supported.
|
# embedSubs. 1 will embded external sub/srt subs into your video if this is supported.
|
||||||
#embedSubs=1
|
# embedSubs=1
|
||||||
|
|
||||||
# burnInSubtitle (0,1).
|
# burnInSubtitle (0,1).
|
||||||
#
|
#
|
||||||
# burnInSubtitle. burns the default sub language into your video (needed for players that don't support subs)
|
# burnInSubtitle. burns the default sub language into your video (needed for players that don't support subs)
|
||||||
#burnInSubtitle=0
|
# burnInSubtitle=0
|
||||||
|
|
||||||
# extractSubs (0,1).
|
# extractSubs (0,1).
|
||||||
#
|
#
|
||||||
# extractSubs. 1 will extract subs from the video file and save these as external srt files.
|
# extractSubs. 1 will extract subs from the video file and save these as external srt files.
|
||||||
#extractSubs=0
|
# extractSubs=0
|
||||||
|
|
||||||
# externalSubDir.
|
# externalSubDir.
|
||||||
#
|
#
|
||||||
# externalSubDir. set the directory where subs should be saved (if not the same directory as the video)
|
# externalSubDir. set the directory where subs should be saved (if not the same directory as the video)
|
||||||
#externalSubDir=
|
# externalSubDir=
|
||||||
|
|
||||||
# outputDefault (None, iPad, iPad-1080p, iPad-720p, Apple-TV2, iPod, iPhone, PS3, xbox, Roku-1080p, Roku-720p, Roku-480p, mkv, mp4-scene-release).
|
# outputDefault (None, iPad, iPad-1080p, iPad-720p, Apple-TV2, iPod, iPhone, PS3, xbox, Roku-1080p, Roku-720p, Roku-480p, mkv, mp4-scene-release).
|
||||||
#
|
#
|
||||||
# outputDefault. Loads default configs for the selected device. The remaining options below are ignored.
|
# 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.
|
# If you want to use your own profile, set None and set the remaining options below.
|
||||||
#outputDefault=None
|
# outputDefault=None
|
||||||
|
|
||||||
# hwAccel (0,1).
|
# hwAccel (0,1).
|
||||||
#
|
#
|
||||||
# hwAccel. 1 will set ffmpeg to enable hardware acceleration (this requires a recent ffmpeg).
|
# hwAccel. 1 will set ffmpeg to enable hardware acceleration (this requires a recent ffmpeg).
|
||||||
#hwAccel=0
|
# hwAccel=0
|
||||||
|
|
||||||
# ffmpeg output settings.
|
# ffmpeg output settings.
|
||||||
#outputVideoExtension=.mp4
|
# outputVideoExtension=.mp4
|
||||||
#outputVideoCodec=libx264
|
# outputVideoCodec=libx264
|
||||||
#VideoCodecAllow=
|
# VideoCodecAllow=
|
||||||
#outputVideoPreset=medium
|
# outputVideoPreset=medium
|
||||||
#outputVideoFramerate=24
|
# outputVideoFramerate=24
|
||||||
#outputVideoBitrate=800k
|
# outputVideoBitrate=800k
|
||||||
#outputAudioCodec=ac3
|
# outputAudioCodec=ac3
|
||||||
#AudioCodecAllow=
|
# AudioCodecAllow=
|
||||||
#outputAudioChannels=6
|
# outputAudioChannels=6
|
||||||
#outputAudioBitrate=640k
|
# outputAudioBitrate=640k
|
||||||
#outputQualityPercent=
|
# outputQualityPercent=
|
||||||
#outputAudioTrack2Codec=libfaac
|
# outputAudioTrack2Codec=libfaac
|
||||||
#AudioCodec2Allow=
|
# AudioCodec2Allow=
|
||||||
#outputAudioTrack2Channels=2
|
# outputAudioTrack2Channels=2
|
||||||
#outputAudioTrack2Bitrate=160k
|
# outputAudioTrack2Bitrate=160k
|
||||||
#outputAudioOtherCodec=libmp3lame
|
# outputAudioOtherCodec=libmp3lame
|
||||||
#AudioOtherCodecAllow=
|
# AudioOtherCodecAllow=
|
||||||
#outputAudioOtherChannels=2
|
# outputAudioOtherChannels=2
|
||||||
#outputAudioOtherBitrate=128k
|
# outputAudioOtherBitrate=128k
|
||||||
#outputSubtitleCodec=
|
# outputSubtitleCodec=
|
||||||
|
|
||||||
## WakeOnLan
|
# ## WakeOnLan
|
||||||
|
|
||||||
# use WOL (0, 1).
|
# 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.
|
# 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
|
# wolwake=0
|
||||||
|
|
||||||
# WOL MAC
|
# WOL MAC
|
||||||
#
|
#
|
||||||
# enter the mac address of the system to be woken.
|
# enter the mac address of the system to be woken.
|
||||||
#wolmac=00:01:2e:2D:64:e1
|
# wolmac=00:01:2e:2D:64:e1
|
||||||
|
|
||||||
# Set the Host and Port of a server to verify system has woken.
|
# Set the Host and Port of a server to verify system has woken.
|
||||||
#wolhost=192.168.1.37
|
# wolhost=192.168.1.37
|
||||||
#wolport=80
|
# wolport=80
|
||||||
|
|
||||||
## UserScript
|
# ## UserScript
|
||||||
|
|
||||||
# User Script category.
|
# User Script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with user script (accepts "UNCAT", "ALL", or a defined category).
|
# category that gets called for post-processing with user script (accepts "UNCAT", "ALL", or a defined category).
|
||||||
#usCategory=mine
|
# usCategory=mine
|
||||||
|
|
||||||
# User Script Remote Path (0,1).
|
# User Script Remote Path (0,1).
|
||||||
#
|
#
|
||||||
# Script calls commands on another system.
|
# Script calls commands on another system.
|
||||||
#usremote_path=0
|
# usremote_path=0
|
||||||
|
|
||||||
# User Script extensions.
|
# User Script extensions.
|
||||||
#
|
#
|
||||||
# What extension do you want to process? Specify all the extension, or use "ALL" to process all files.
|
# 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_mediaExtensions=.mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg
|
||||||
|
|
||||||
# User Script Path
|
# User Script Path
|
||||||
#
|
#
|
||||||
# Specify the path to your custom script.
|
# Specify the path to your custom script.
|
||||||
#user_script_path=/nzbToMedia/userscripts/script.sh
|
# user_script_path=/nzbToMedia/userscripts/script.sh
|
||||||
|
|
||||||
# User Script arguments.
|
# User Script arguments.
|
||||||
#
|
#
|
||||||
# Specify the argument(s) passed to script, comma separated in order.
|
# 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.
|
# 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
|
# 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_param=FN
|
||||||
|
|
||||||
# User Script Run Once (0,1).
|
# 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).
|
# 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_runOnce=0
|
||||||
|
|
||||||
# User Script Success Codes.
|
# User Script Success Codes.
|
||||||
#
|
#
|
||||||
# Specify the successcodes returned by the user script as a comma separated list. Linux default is 0
|
# Specify the successcodes returned by the user script as a comma separated list. Linux default is 0
|
||||||
#user_script_successCodes=0
|
# user_script_successCodes=0
|
||||||
|
|
||||||
# User Script Clean After (0,1).
|
# User Script Clean After (0,1).
|
||||||
#
|
#
|
||||||
# Clean after? Note that delay function is used to prevent possible mistake :) Delay is intended as seconds
|
# Clean after? Note that delay function is used to prevent possible mistake :) Delay is intended as seconds
|
||||||
#user_script_clean=1
|
# user_script_clean=1
|
||||||
|
|
||||||
# User Script Delay.
|
# User Script Delay.
|
||||||
#
|
#
|
||||||
# Delay in seconds after processing.
|
# Delay in seconds after processing.
|
||||||
#usdelay=120
|
# usdelay=120
|
||||||
|
|
||||||
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
# ##############################################################################
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
|
||||||
##############################################################################
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import datetime
|
import datetime
|
||||||
|
from libs.six import text_type
|
||||||
|
|
||||||
import core
|
import core
|
||||||
from core.autoProcess.autoProcessComics import autoProcessComics
|
from core.autoProcess.autoProcessComics import autoProcessComics
|
||||||
from core.autoProcess.autoProcessGames import autoProcessGames
|
from core.autoProcess.autoProcessGames import autoProcessGames
|
||||||
|
@ -510,23 +516,23 @@ from core.nzbToMediaUtil import getDirs, extractFiles, cleanDir, update_download
|
||||||
from core.nzbToMediaUserScript import external_script
|
from core.nzbToMediaUserScript import external_script
|
||||||
from core import logger, nzbToMediaDB
|
from core import logger, nzbToMediaDB
|
||||||
|
|
||||||
|
|
||||||
# post-processing
|
# post-processing
|
||||||
def process(inputDirectory, inputName=None, status=0, clientAgent='manual', download_id=None, inputCategory=None, failureLink=None):
|
def process(inputDirectory, inputName=None, status=0, clientAgent='manual', download_id=None, inputCategory=None, failureLink=None):
|
||||||
if core.SAFE_MODE and inputDirectory == core.NZB_DEFAULTDIR:
|
if core.SAFE_MODE and inputDirectory == core.NZB_DEFAULTDIR:
|
||||||
logger.error(
|
logger.error(
|
||||||
'The input directory:[{0}] is the Default Download Directory. Please configure category directories to prevent processing of other media.'.format(
|
'The input directory:[{0}] is the Default Download Directory. Please configure category directories to prevent processing of other media.'.format(
|
||||||
inputDirectory))
|
inputDirectory))
|
||||||
return [-1, ""]
|
return [-1, ""]
|
||||||
|
|
||||||
if not download_id and clientAgent == 'sabnzbd':
|
if not download_id and clientAgent == 'sabnzbd':
|
||||||
download_id = get_nzoid(inputName)
|
download_id = get_nzoid(inputName)
|
||||||
|
|
||||||
if clientAgent != 'manual' and not core.DOWNLOADINFO:
|
if clientAgent != 'manual' and not core.DOWNLOADINFO:
|
||||||
logger.debug('Adding NZB download info for directory {0} to database'.format(inputDirectory))
|
logger.debug('Adding NZB download info for directory {0} to database'.format(inputDirectory))
|
||||||
|
|
||||||
myDB = nzbToMediaDB.DBConnection()
|
myDB = nzbToMediaDB.DBConnection()
|
||||||
|
|
||||||
encoded = False
|
|
||||||
inputDirectory1 = inputDirectory
|
inputDirectory1 = inputDirectory
|
||||||
inputName1 = inputName
|
inputName1 = inputName
|
||||||
|
|
||||||
|
@ -536,14 +542,14 @@ def process(inputDirectory, inputName=None, status=0, clientAgent='manual', down
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
controlValueDict = {"input_directory": unicode(inputDirectory1)}
|
controlValueDict = {"input_directory": text_type(inputDirectory1)}
|
||||||
newValueDict = {"input_name": unicode(inputName1),
|
newValueDict = {"input_name": text_type(inputName1),
|
||||||
"input_hash": unicode(download_id),
|
"input_hash": text_type(download_id),
|
||||||
"input_id": unicode(download_id),
|
"input_id": text_type(download_id),
|
||||||
"client_agent": unicode(clientAgent),
|
"client_agent": text_type(clientAgent),
|
||||||
"status": 0,
|
"status": 0,
|
||||||
"last_update": datetime.date.today().toordinal()
|
"last_update": datetime.date.today().toordinal()
|
||||||
}
|
}
|
||||||
myDB.upsert("downloads", newValueDict, controlValueDict)
|
myDB.upsert("downloads", newValueDict, controlValueDict)
|
||||||
|
|
||||||
# auto-detect section
|
# auto-detect section
|
||||||
|
@ -556,7 +562,7 @@ def process(inputDirectory, inputName=None, status=0, clientAgent='manual', down
|
||||||
if section is None:
|
if section is None:
|
||||||
logger.error(
|
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(
|
'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(
|
||||||
inputCategory))
|
inputCategory))
|
||||||
return [-1, ""]
|
return [-1, ""]
|
||||||
else:
|
else:
|
||||||
usercat = "ALL"
|
usercat = "ALL"
|
||||||
|
@ -564,7 +570,7 @@ def process(inputDirectory, inputName=None, status=0, clientAgent='manual', down
|
||||||
if len(section) > 1:
|
if len(section) > 1:
|
||||||
logger.error(
|
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(
|
'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(
|
||||||
inputCategory, section.keys()))
|
inputCategory, section.keys()))
|
||||||
return [-1, ""]
|
return [-1, ""]
|
||||||
|
|
||||||
if section:
|
if section:
|
||||||
|
@ -575,10 +581,7 @@ def process(inputDirectory, inputName=None, status=0, clientAgent='manual', down
|
||||||
inputCategory))
|
inputCategory))
|
||||||
return [-1, ""]
|
return [-1, ""]
|
||||||
|
|
||||||
try:
|
extract = int(section[usercat].get('extract', 0))
|
||||||
extract = int(section[usercat]['extract'])
|
|
||||||
except:
|
|
||||||
extract = 0
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if int(section[usercat]['remote_path']) and not core.REMOTEPATHS:
|
if int(section[usercat]['remote_path']) and not core.REMOTEPATHS:
|
||||||
|
@ -621,7 +624,7 @@ def process(inputDirectory, inputName=None, status=0, clientAgent='manual', down
|
||||||
if clientAgent != 'manual':
|
if clientAgent != 'manual':
|
||||||
# update download status in our DB
|
# update download status in our DB
|
||||||
update_downloadInfoStatus(inputName, 1)
|
update_downloadInfoStatus(inputName, 1)
|
||||||
if not sectionName in ['UserScript', 'NzbDrone']:
|
if sectionName not in ['UserScript', 'NzbDrone']:
|
||||||
# cleanup our processing folders of any misc unwanted files and empty directories
|
# cleanup our processing folders of any misc unwanted files and empty directories
|
||||||
cleanDir(inputDirectory, sectionName, inputCategory)
|
cleanDir(inputDirectory, sectionName, inputCategory)
|
||||||
|
|
||||||
|
@ -632,9 +635,6 @@ def main(args, section=None):
|
||||||
# Initialize the config
|
# Initialize the config
|
||||||
core.initialize(section)
|
core.initialize(section)
|
||||||
|
|
||||||
# clientAgent for NZBs
|
|
||||||
clientAgent = core.NZB_CLIENTAGENT
|
|
||||||
|
|
||||||
logger.info("#########################################################")
|
logger.info("#########################################################")
|
||||||
logger.info("## ..::[{0}]::.. ##".format(os.path.basename(__file__)))
|
logger.info("## ..::[{0}]::.. ##".format(os.path.basename(__file__)))
|
||||||
logger.info("#########################################################")
|
logger.info("#########################################################")
|
||||||
|
@ -647,7 +647,7 @@ def main(args, section=None):
|
||||||
status = 0
|
status = 0
|
||||||
|
|
||||||
# NZBGet
|
# NZBGet
|
||||||
if os.environ.has_key('NZBOP_SCRIPTDIR'):
|
if 'NZBOP_SCRIPTDIR' in os.environ:
|
||||||
# Check if the script is called from nzbget 11.0 or later
|
# Check if the script is called from nzbget 11.0 or later
|
||||||
if os.environ['NZBOP_VERSION'][0:5] < '11.0':
|
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']))
|
logger.error("NZBGet Version {0} is not supported. Please update NZBGet.".format(os.environ['NZBOP_VERSION']))
|
||||||
|
@ -656,7 +656,7 @@ def main(args, section=None):
|
||||||
logger.info("Script triggered from NZBGet Version {0}.".format(os.environ['NZBOP_VERSION']))
|
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
|
# Check if the script is called from nzbget 13.0 or later
|
||||||
if os.environ.has_key('NZBPP_TOTALSTATUS'):
|
if 'NZBPP_TOTALSTATUS' in os.environ:
|
||||||
if not os.environ['NZBPP_TOTALSTATUS'] == 'SUCCESS':
|
if not os.environ['NZBPP_TOTALSTATUS'] == 'SUCCESS':
|
||||||
logger.info("Download failed with status {0}.".format(os.environ['NZBPP_STATUS']))
|
logger.info("Download failed with status {0}.".format(os.environ['NZBPP_STATUS']))
|
||||||
status = 1
|
status = 1
|
||||||
|
@ -689,13 +689,13 @@ def main(args, section=None):
|
||||||
# Check for download_id to pass to CouchPotato
|
# Check for download_id to pass to CouchPotato
|
||||||
download_id = ""
|
download_id = ""
|
||||||
failureLink = None
|
failureLink = None
|
||||||
if os.environ.has_key('NZBPR_COUCHPOTATO'):
|
if 'NZBPR_COUCHPOTATO' in os.environ:
|
||||||
download_id = os.environ['NZBPR_COUCHPOTATO']
|
download_id = os.environ['NZBPR_COUCHPOTATO']
|
||||||
elif os.environ.has_key('NZBPR_DRONE'):
|
elif 'NZBPR_DRONE' in os.environ:
|
||||||
download_id = os.environ['NZBPR_DRONE']
|
download_id = os.environ['NZBPR_DRONE']
|
||||||
elif os.environ.has_key('NZBPR_SONARR'):
|
elif 'NZBPR_SONARR' in os.environ:
|
||||||
download_id = os.environ['NZBPR_SONARR']
|
download_id = os.environ['NZBPR_SONARR']
|
||||||
if os.environ.has_key('NZBPR__DNZB_FAILURE'):
|
if 'NZBPR__DNZB_FAILURE' in os.environ:
|
||||||
failureLink = os.environ['NZBPR__DNZB_FAILURE']
|
failureLink = os.environ['NZBPR__DNZB_FAILURE']
|
||||||
|
|
||||||
# All checks done, now launching the script.
|
# All checks done, now launching the script.
|
||||||
|
@ -731,7 +731,7 @@ def main(args, section=None):
|
||||||
clientAgent = 'sabnzbd'
|
clientAgent = 'sabnzbd'
|
||||||
logger.info("Script triggered from SABnzbd 0.7.17+")
|
logger.info("Script triggered from SABnzbd 0.7.17+")
|
||||||
result = process(args[1], inputName=args[2], status=args[7], inputCategory=args[5], clientAgent=clientAgent,
|
result = process(args[1], inputName=args[2], status=args[7], inputCategory=args[5], clientAgent=clientAgent,
|
||||||
download_id='', failureLink=''.join(args[8:]))
|
download_id='', failureLink=''.join(args[8:]))
|
||||||
# Generic program
|
# Generic program
|
||||||
elif len(args) > 5 and args[5] == 'generic':
|
elif len(args) > 5 and args[5] == 'generic':
|
||||||
logger.info("Script triggered from generic program")
|
logger.info("Script triggered from generic program")
|
||||||
|
@ -744,7 +744,7 @@ def main(args, section=None):
|
||||||
for subsection in subsections:
|
for subsection in subsections:
|
||||||
if not core.CFG[section][subsection].isenabled():
|
if not core.CFG[section][subsection].isenabled():
|
||||||
continue
|
continue
|
||||||
for dirName in getDirs(section, subsection, link = 'move'):
|
for dirName in getDirs(section, subsection, link='move'):
|
||||||
logger.info("Starting manual run for {0}:{1} - Folder:{2}".format(section, subsection, dirName))
|
logger.info("Starting manual run for {0}:{1} - Folder:{2}".format(section, subsection, dirName))
|
||||||
|
|
||||||
logger.info("Checking database for download info for {0} ...".format(os.path.basename(dirName)))
|
logger.info("Checking database for download info for {0} ...".format(os.path.basename(dirName)))
|
||||||
|
@ -758,49 +758,45 @@ def main(args, section=None):
|
||||||
os.path.basename(dirName))
|
os.path.basename(dirName))
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
clientAgent = text_type(core.DOWNLOADINFO[0].get('client_agent', ''))
|
||||||
clientAgent = str(core.DOWNLOADINFO[0]['client_agent'])
|
download_id = text_type(core.DOWNLOADINFO[0].get('input_id', ''))
|
||||||
except:
|
|
||||||
clientAgent = 'manual'
|
|
||||||
try:
|
|
||||||
download_id = str(core.DOWNLOADINFO[0]['input_id'])
|
|
||||||
except:
|
|
||||||
download_id = None
|
|
||||||
|
|
||||||
if clientAgent.lower() not in core.NZB_CLIENTS and clientAgent != 'manual':
|
if clientAgent and clientAgent.lower() not in core.NZB_CLIENTS:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
dirName = dirName.encode(core.SYS_ENCODING)
|
dirName = dirName.encode(core.SYS_ENCODING)
|
||||||
except: pass
|
except UnicodeError:
|
||||||
|
pass
|
||||||
inputName = os.path.basename(dirName)
|
inputName = os.path.basename(dirName)
|
||||||
try:
|
try:
|
||||||
inputName = inputName.encode(core.SYS_ENCODING)
|
inputName = inputName.encode(core.SYS_ENCODING)
|
||||||
except: pass
|
except UnicodeError:
|
||||||
|
pass
|
||||||
|
|
||||||
results = process(dirName, inputName, 0, clientAgent=clientAgent,
|
results = process(dirName, inputName, 0, clientAgent=clientAgent or 'manual',
|
||||||
download_id=download_id, inputCategory=subsection)
|
download_id=download_id or None, inputCategory=subsection)
|
||||||
if results[0] != 0:
|
if results[0] != 0:
|
||||||
logger.error("A problem was reported when trying to perform a manual run for {0}:{1}.".format(
|
logger.error("A problem was reported when trying to perform a manual run for {0}:{1}.".format
|
||||||
section, subsection))
|
(section, subsection))
|
||||||
result = results
|
result = results
|
||||||
|
|
||||||
if result[0] == 0:
|
if result[0] == 0:
|
||||||
logger.info("The {0} script completed successfully.".format(args[0]))
|
logger.info("The {0} script completed successfully.".format(args[0]))
|
||||||
if result[1]:
|
if result[1]:
|
||||||
print result[1] + "!" # For SABnzbd Status display.
|
print(result[1] + "!")
|
||||||
if os.environ.has_key('NZBOP_SCRIPTDIR'): # return code for nzbget v11
|
if 'NZBOP_SCRIPTDIR' in os.environ: # return code for nzbget v11
|
||||||
del core.MYAPP
|
del core.MYAPP
|
||||||
return (core.NZBGET_POSTPROCESS_SUCCESS)
|
return core.NZBGET_POSTPROCESS_SUCCESS
|
||||||
else:
|
else:
|
||||||
logger.error("A problem was reported in the {0} script.".format(args[0]))
|
logger.error("A problem was reported in the {0} script.".format(args[0]))
|
||||||
if result[1]:
|
if result[1]:
|
||||||
print result[1] + "!" # For SABnzbd Status display.
|
print(result[1] + "!")
|
||||||
if os.environ.has_key('NZBOP_SCRIPTDIR'): # return code for nzbget v11
|
if 'NZBOP_SCRIPTDIR' in os.environ: # return code for nzbget v11
|
||||||
del core.MYAPP
|
del core.MYAPP
|
||||||
return (core.NZBGET_POSTPROCESS_ERROR)
|
return core.NZBGET_POSTPROCESS_ERROR
|
||||||
del core.MYAPP
|
del core.MYAPP
|
||||||
return (result[0])
|
return result[0]
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#!/usr/bin/env python2
|
#!/usr/bin/env python2
|
||||||
#
|
# coding=utf-8
|
||||||
##############################################################################
|
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
# ##############################################################################
|
||||||
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
|
||||||
# Post-Process to Mylar.
|
# Post-Process to Mylar.
|
||||||
#
|
#
|
||||||
|
@ -9,114 +10,115 @@
|
||||||
#
|
#
|
||||||
# NOTE: This script requires Python to be installed on your system.
|
# NOTE: This script requires Python to be installed on your system.
|
||||||
|
|
||||||
##############################################################################
|
# ##############################################################################
|
||||||
#
|
#
|
||||||
### OPTIONS
|
# ### OPTIONS
|
||||||
|
|
||||||
## General
|
# ## General
|
||||||
|
|
||||||
# Auto Update nzbToMedia (0, 1).
|
# Auto Update nzbToMedia (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
||||||
#auto_update=0
|
# auto_update=0
|
||||||
|
|
||||||
# Safe Mode protection of DestDir (0, 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.
|
# Enable/Disable a safety check to ensure we don't process all downloads in the default_downloadDirectory by mistake.
|
||||||
#safe_mode=1
|
# safe_mode=1
|
||||||
|
|
||||||
## Mylar
|
# ## Mylar
|
||||||
|
|
||||||
# Mylar script category.
|
# Mylar script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with Mylar.
|
# category that gets called for post-processing with Mylar.
|
||||||
#myCategory=comics
|
# myCategory=comics
|
||||||
|
|
||||||
# Mylar host.
|
# Mylar host.
|
||||||
#
|
#
|
||||||
# The ipaddress for your Mylar server. e.g For the Same system use localhost or 127.0.0.1
|
# The ip address for your Mylar server. e.g For the Same system use localhost or 127.0.0.1
|
||||||
#myhost=localhost
|
# myhost=localhost
|
||||||
|
|
||||||
# Mylar port.
|
# Mylar port.
|
||||||
#myport=8090
|
# myport=8090
|
||||||
|
|
||||||
# Mylar username.
|
# Mylar username.
|
||||||
#myusername=
|
# myusername=
|
||||||
|
|
||||||
# Mylar password.
|
# Mylar password.
|
||||||
#mypassword=
|
# mypassword=
|
||||||
|
|
||||||
# Mylar uses ssl (0, 1).
|
# Mylar uses ssl (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if using ssl, else set to 0.
|
# Set to 1 if using ssl, else set to 0.
|
||||||
#myssl=0
|
# myssl=0
|
||||||
|
|
||||||
# Mylar web_root
|
# Mylar web_root
|
||||||
#
|
#
|
||||||
# set this if using a reverse proxy.
|
# set this if using a reverse proxy.
|
||||||
#myweb_root=
|
# myweb_root=
|
||||||
|
|
||||||
# Mylar wait_for
|
# Mylar wait_for
|
||||||
#
|
#
|
||||||
# Set the number of minutes to wait after calling the force process, to check the issue has changed status.
|
# Set the number of minutes to wait after calling the force process, to check the issue has changed status.
|
||||||
#myswait_for=1
|
# myswait_for=1
|
||||||
|
|
||||||
# Mylar watch directory.
|
# Mylar watch directory.
|
||||||
#
|
#
|
||||||
# set this to where your Mylar completed downloads are.
|
# set this to where your Mylar completed downloads are.
|
||||||
#mywatch_dir=
|
# mywatch_dir=
|
||||||
|
|
||||||
# Mylar and NZBGet are a different system (0, 1).
|
# Mylar and NZBGet are a different system (0, 1).
|
||||||
#
|
#
|
||||||
# Enable to replace local path with the path as per the mountPoints below.
|
# Enable to replace local path with the path as per the mountPoints below.
|
||||||
#myremote_path=0
|
# myremote_path=0
|
||||||
|
|
||||||
## Posix
|
# ## Posix
|
||||||
|
|
||||||
# Niceness for external tasks Extractor and Transcoder.
|
# 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).
|
# Set the Niceness value for the nice command. These range from -20 (most favorable to the process) to 19 (least favorable to the process).
|
||||||
#niceness=10
|
# niceness=10
|
||||||
|
|
||||||
# ionice scheduling class (0, 1, 2, 3).
|
# 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.
|
# Set the ionice scheduling class. 0 for none, 1 for real time, 2 for best-effort, 3 for idle.
|
||||||
#ionice_class=2
|
# ionice_class=2
|
||||||
|
|
||||||
# ionice scheduling class data.
|
# 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.
|
# 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
|
# ionice_classdata=4
|
||||||
|
|
||||||
## Network
|
# ## Network
|
||||||
|
|
||||||
# Network Mount Points (Needed for remote path above)
|
# Network Mount Points (Needed for remote path above)
|
||||||
#
|
#
|
||||||
# Enter Mount points as LocalPath,RemotePath and separate each pair with '|'
|
# Enter Mount points as LocalPath,RemotePath and separate each pair with '|'
|
||||||
# e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\
|
# e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\
|
||||||
#mountPoints=
|
# mountPoints=
|
||||||
|
|
||||||
## WakeOnLan
|
# ## WakeOnLan
|
||||||
|
|
||||||
# use WOL (0, 1).
|
# 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.
|
# 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
|
# wolwake=0
|
||||||
|
|
||||||
# WOL MAC
|
# WOL MAC
|
||||||
#
|
#
|
||||||
# enter the mac address of the system to be woken.
|
# enter the mac address of the system to be woken.
|
||||||
#wolmac=00:01:2e:2D:64:e1
|
# wolmac=00:01:2e:2D:64:e1
|
||||||
|
|
||||||
# Set the Host and Port of a server to verify system has woken.
|
# Set the Host and Port of a server to verify system has woken.
|
||||||
#wolhost=192.168.1.37
|
# wolhost=192.168.1.37
|
||||||
#wolport=80
|
# wolport=80
|
||||||
|
|
||||||
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
# ##############################################################################
|
||||||
|
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
|
||||||
##############################################################################
|
|
||||||
import sys
|
import sys
|
||||||
import nzbToMedia
|
import nzbToMedia
|
||||||
|
|
||||||
section = "Mylar"
|
section = "Mylar"
|
||||||
result = nzbToMedia.main(sys.argv, section)
|
result = nzbToMedia.main(sys.argv, section)
|
||||||
sys.exit(result)
|
sys.exit(result)
|
||||||
|
|
150
nzbToNzbDrone.py
150
nzbToNzbDrone.py
|
@ -1,7 +1,8 @@
|
||||||
#!/usr/bin/env python2
|
#!/usr/bin/env python2
|
||||||
#
|
# coding=utf-8
|
||||||
##############################################################################
|
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
# ##############################################################################
|
||||||
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
|
||||||
# Post-Process to NzbDrone.
|
# Post-Process to NzbDrone.
|
||||||
#
|
#
|
||||||
|
@ -9,229 +10,230 @@
|
||||||
#
|
#
|
||||||
# NOTE: This script requires Python to be installed on your system.
|
# NOTE: This script requires Python to be installed on your system.
|
||||||
|
|
||||||
##############################################################################
|
# ##############################################################################
|
||||||
### OPTIONS ###
|
# ### OPTIONS ###
|
||||||
|
|
||||||
## General
|
# ## General
|
||||||
|
|
||||||
# Auto Update nzbToMedia (0, 1).
|
# Auto Update nzbToMedia (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
||||||
#auto_update=0
|
# auto_update=0
|
||||||
|
|
||||||
# Check Media for corruption (0, 1).
|
# Check Media for corruption (0, 1).
|
||||||
#
|
#
|
||||||
# Enable/Disable media file checking using ffprobe.
|
# Enable/Disable media file checking using ffprobe.
|
||||||
#check_media=1
|
# check_media=1
|
||||||
|
|
||||||
# Safe Mode protection of DestDir (0, 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.
|
# Enable/Disable a safety check to ensure we don't process all downloads in the default_downloadDirectory by mistake.
|
||||||
#safe_mode=1
|
# safe_mode=1
|
||||||
|
|
||||||
## NzbDrone
|
# ## NzbDrone
|
||||||
|
|
||||||
# NzbDrone script category.
|
# NzbDrone script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with NzbDrone.
|
# category that gets called for post-processing with NzbDrone.
|
||||||
#ndCategory=tv2
|
# ndCategory=tv2
|
||||||
|
|
||||||
# NzbDrone host.
|
# NzbDrone host.
|
||||||
#
|
#
|
||||||
# The ipaddress for your NzbDrone/Sonarr server. e.g For the Same system use localhost or 127.0.0.1
|
# The ip address for your NzbDrone/Sonarr server. e.g For the Same system use localhost or 127.0.0.1
|
||||||
#ndhost=localhost
|
# ndhost=localhost
|
||||||
|
|
||||||
# NzbDrone port.
|
# NzbDrone port.
|
||||||
#ndport=8989
|
# ndport=8989
|
||||||
|
|
||||||
# NzbDrone API key.
|
# NzbDrone API key.
|
||||||
#ndapikey=
|
# ndapikey=
|
||||||
|
|
||||||
# NzbDrone uses ssl (0, 1).
|
# NzbDrone uses ssl (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if using ssl, else set to 0.
|
# Set to 1 if using ssl, else set to 0.
|
||||||
#ndssl=0
|
# ndssl=0
|
||||||
|
|
||||||
# NzbDrone web_root
|
# NzbDrone web_root
|
||||||
#
|
#
|
||||||
# set this if using a reverse proxy.
|
# set this if using a reverse proxy.
|
||||||
#ndweb_root=
|
# ndweb_root=
|
||||||
|
|
||||||
# NzbDrone wait_for
|
# NzbDrone wait_for
|
||||||
#
|
#
|
||||||
# Set the number of minutes to wait after calling the renamer, to check the episode has changed status.
|
# Set the number of minutes to wait after calling the renamer, to check the episode has changed status.
|
||||||
#ndwait_for=2
|
# ndwait_for=2
|
||||||
|
|
||||||
# NzbDrone Delete Failed Downloads (0, 1).
|
# NzbDrone Delete Failed Downloads (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to delete failed, or 0 to leave files in place.
|
# set to 1 to delete failed, or 0 to leave files in place.
|
||||||
#nddelete_failed=0
|
# nddelete_failed=0
|
||||||
|
|
||||||
# NzbDrone and NZBGet are a different system (0, 1).
|
# NzbDrone and NZBGet are a different system (0, 1).
|
||||||
#
|
#
|
||||||
# Enable to replace local path with the path as per the mountPoints below.
|
# Enable to replace local path with the path as per the mountPoints below.
|
||||||
#ndremote_path=0
|
# ndremote_path=0
|
||||||
|
|
||||||
## Network
|
# ## Network
|
||||||
|
|
||||||
# Network Mount Points (Needed for remote path above)
|
# Network Mount Points (Needed for remote path above)
|
||||||
#
|
#
|
||||||
# Enter Mount points as LocalPath,RemotePath and separate each pair with '|'
|
# Enter Mount points as LocalPath,RemotePath and separate each pair with '|'
|
||||||
# e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\
|
# e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\
|
||||||
#mountPoints=
|
# mountPoints=
|
||||||
|
|
||||||
## Extensions
|
# ## Extensions
|
||||||
|
|
||||||
# Media Extensions
|
# Media Extensions
|
||||||
#
|
#
|
||||||
# This is a list of media extensions that are used to verify that the download does contain valid media.
|
# 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
|
# mediaExtensions=.mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg,.vob,.iso,.ts
|
||||||
|
|
||||||
## Posix
|
# ## Posix
|
||||||
|
|
||||||
# Niceness for external tasks Extractor and Transcoder.
|
# 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).
|
# Set the Niceness value for the nice command. These range from -20 (most favorable to the process) to 19 (least favorable to the process).
|
||||||
#niceness=10
|
# niceness=10
|
||||||
|
|
||||||
# ionice scheduling class (0, 1, 2, 3).
|
# 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.
|
# Set the ionice scheduling class. 0 for none, 1 for real time, 2 for best-effort, 3 for idle.
|
||||||
#ionice_class=2
|
# ionice_class=2
|
||||||
|
|
||||||
# ionice scheduling class data.
|
# 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.
|
# 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
|
# ionice_classdata=4
|
||||||
|
|
||||||
## Transcoder
|
# ## Transcoder
|
||||||
|
|
||||||
# getSubs (0, 1).
|
# getSubs (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to download subtitles.
|
# set to 1 to download subtitles.
|
||||||
#getSubs = 0
|
# getSubs = 0
|
||||||
|
|
||||||
# subLanguages.
|
# subLanguages.
|
||||||
#
|
#
|
||||||
# subLanguages. create a list of languages in the order you want them in your subtitles.
|
# subLanguages. create a list of languages in the order you want them in your subtitles.
|
||||||
#subLanguages = eng,spa,fra
|
# subLanguages = eng,spa,fra
|
||||||
|
|
||||||
# Transcode (0, 1).
|
# Transcode (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to transcode, otherwise set to 0.
|
# set to 1 to transcode, otherwise set to 0.
|
||||||
#transcode=0
|
# transcode=0
|
||||||
|
|
||||||
# create a duplicate, or replace the original (0, 1).
|
# create a duplicate, or replace the original (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to cretae a new file or 0 to replace the original
|
# set to 1 to create a new file or 0 to replace the original
|
||||||
#duplicate=1
|
# duplicate=1
|
||||||
|
|
||||||
# ignore extensions.
|
# ignore extensions.
|
||||||
#
|
#
|
||||||
# list of extensions that won't be transcoded.
|
# list of extensions that won't be transcoded.
|
||||||
#ignoreExtensions=.avi,.mkv
|
# ignoreExtensions=.avi,.mkv
|
||||||
|
|
||||||
# outputFastStart (0,1).
|
# outputFastStart (0,1).
|
||||||
#
|
#
|
||||||
# outputFastStart. 1 will use -movflags + faststart. 0 will disable this from being used.
|
# outputFastStart. 1 will use -movflags + faststart. 0 will disable this from being used.
|
||||||
#outputFastStart = 0
|
# outputFastStart = 0
|
||||||
|
|
||||||
# outputVideoPath.
|
# outputVideoPath.
|
||||||
#
|
#
|
||||||
# outputVideoPath. Set path you want transcoded videos moved to. Leave blank to disable.
|
# outputVideoPath. Set path you want transcoded videos moved to. Leave blank to disable.
|
||||||
#outputVideoPath =
|
# outputVideoPath =
|
||||||
|
|
||||||
# processOutput (0,1).
|
# processOutput (0,1).
|
||||||
#
|
#
|
||||||
# processOutput. 1 will send the outputVideoPath to SickBeard/CouchPotato. 0 will send original files.
|
# processOutput. 1 will send the outputVideoPath to SickBeard/CouchPotato. 0 will send original files.
|
||||||
#processOutput = 0
|
# processOutput = 0
|
||||||
|
|
||||||
# audioLanguage.
|
# audioLanguage.
|
||||||
#
|
#
|
||||||
# audioLanguage. set the 3 letter language code you want as your primary audio track.
|
# audioLanguage. set the 3 letter language code you want as your primary audio track.
|
||||||
#audioLanguage = eng
|
# audioLanguage = eng
|
||||||
|
|
||||||
# allAudioLanguages (0,1).
|
# allAudioLanguages (0,1).
|
||||||
#
|
#
|
||||||
# allAudioLanguages. 1 will keep all audio tracks (uses AudioCodec3) where available.
|
# allAudioLanguages. 1 will keep all audio tracks (uses AudioCodec3) where available.
|
||||||
#allAudioLanguages = 0
|
# allAudioLanguages = 0
|
||||||
|
|
||||||
# allSubLanguages (0,1).
|
# allSubLanguages (0,1).
|
||||||
#
|
#
|
||||||
# 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
|
# allSubLanguages = 0
|
||||||
|
|
||||||
# embedSubs (0,1).
|
# embedSubs (0,1).
|
||||||
#
|
#
|
||||||
# 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
|
# embedSubs = 1
|
||||||
|
|
||||||
# burnInSubtitle (0,1).
|
# burnInSubtitle (0,1).
|
||||||
#
|
#
|
||||||
# burnInSubtitle. burns the default sub language into your video (needed for players that don't support subs)
|
# burnInSubtitle. burns the default sub language into your video (needed for players that don't support subs)
|
||||||
#burnInSubtitle = 0
|
# burnInSubtitle = 0
|
||||||
|
|
||||||
# extractSubs (0,1).
|
# extractSubs (0,1).
|
||||||
#
|
#
|
||||||
# extractSubs. 1 will extract subs from the video file and save these as external srt files.
|
# extractSubs. 1 will extract subs from the video file and save these as external srt files.
|
||||||
#extractSubs = 0
|
# extractSubs = 0
|
||||||
|
|
||||||
# externalSubDir.
|
# externalSubDir.
|
||||||
#
|
#
|
||||||
# externalSubDir. set the directory where subs should be saved (if not the same directory as the video)
|
# externalSubDir. set the directory where subs should be saved (if not the same directory as the video)
|
||||||
#externalSubDir =
|
# externalSubDir =
|
||||||
|
|
||||||
# outputDefault (None, iPad, iPad-1080p, iPad-720p, Apple-TV2, iPod, iPhone, PS3, xbox, Roku-1080p, Roku-720p, Roku-480p, mkv, mp4-scene-release).
|
# outputDefault (None, iPad, iPad-1080p, iPad-720p, Apple-TV2, iPod, iPhone, PS3, xbox, Roku-1080p, Roku-720p, Roku-480p, mkv, mp4-scene-release).
|
||||||
#
|
#
|
||||||
# outputDefault. Loads default configs for the selected device. The remaining options below are ignored.
|
# 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.
|
# If you want to use your own profile, set None and set the remaining options below.
|
||||||
#outputDefault = None
|
# outputDefault = None
|
||||||
|
|
||||||
# hwAccel (0,1).
|
# hwAccel (0,1).
|
||||||
#
|
#
|
||||||
# hwAccel. 1 will set ffmpeg to enable hardware acceleration (this requires a recent ffmpeg).
|
# hwAccel. 1 will set ffmpeg to enable hardware acceleration (this requires a recent ffmpeg).
|
||||||
#hwAccel=0
|
# hwAccel=0
|
||||||
|
|
||||||
# ffmpeg output settings.
|
# ffmpeg output settings.
|
||||||
#outputVideoExtension=.mp4
|
# outputVideoExtension=.mp4
|
||||||
#outputVideoCodec=libx264
|
# outputVideoCodec=libx264
|
||||||
#VideoCodecAllow =
|
# VideoCodecAllow =
|
||||||
#outputVideoPreset=medium
|
# outputVideoPreset=medium
|
||||||
#outputVideoFramerate=24
|
# outputVideoFramerate=24
|
||||||
#outputVideoBitrate=800k
|
# outputVideoBitrate=800k
|
||||||
#outputAudioCodec=libmp3lame
|
# outputAudioCodec=libmp3lame
|
||||||
#AudioCodecAllow =
|
# AudioCodecAllow =
|
||||||
#outputAudioBitrate=128k
|
# outputAudioBitrate=128k
|
||||||
#outputQualityPercent = 0
|
# outputQualityPercent = 0
|
||||||
#outputAudioTrack2Codec = libfaac
|
# outputAudioTrack2Codec = libfaac
|
||||||
#AudioCodec2Allow =
|
# AudioCodec2Allow =
|
||||||
#outputAudioTrack2Bitrate = 128k
|
# outputAudioTrack2Bitrate = 128k
|
||||||
#outputAudioOtherCodec = libmp3lame
|
# outputAudioOtherCodec = libmp3lame
|
||||||
#AudioOtherCodecAllow =
|
# AudioOtherCodecAllow =
|
||||||
#outputAudioOtherBitrate = 128k
|
# outputAudioOtherBitrate = 128k
|
||||||
#outputSubtitleCodec =
|
# outputSubtitleCodec =
|
||||||
|
|
||||||
## WakeOnLan
|
# ## WakeOnLan
|
||||||
|
|
||||||
# use WOL (0, 1).
|
# 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.
|
# 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
|
# wolwake=0
|
||||||
|
|
||||||
# WOL MAC
|
# WOL MAC
|
||||||
#
|
#
|
||||||
# enter the mac address of the system to be woken.
|
# enter the mac address of the system to be woken.
|
||||||
#wolmac=00:01:2e:2D:64:e1
|
# wolmac=00:01:2e:2D:64:e1
|
||||||
|
|
||||||
# Set the Host and Port of a server to verify system has woken.
|
# Set the Host and Port of a server to verify system has woken.
|
||||||
#wolhost=192.168.1.37
|
# wolhost=192.168.1.37
|
||||||
#wolport=80
|
# wolport=80
|
||||||
|
|
||||||
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
# ##############################################################################
|
||||||
|
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
|
||||||
##############################################################################
|
|
||||||
import sys
|
import sys
|
||||||
import nzbToMedia
|
import nzbToMedia
|
||||||
|
|
||||||
section = "NzbDrone"
|
section = "NzbDrone"
|
||||||
result = nzbToMedia.main(sys.argv, section)
|
result = nzbToMedia.main(sys.argv, section)
|
||||||
sys.exit(result)
|
sys.exit(result)
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#!/usr/bin/env python2
|
#!/usr/bin/env python2
|
||||||
#
|
# coding=utf-8
|
||||||
##############################################################################
|
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
# ##############################################################################
|
||||||
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
|
||||||
# Post-Process to SickBeard.
|
# Post-Process to SickBeard.
|
||||||
#
|
#
|
||||||
|
@ -9,245 +10,246 @@
|
||||||
#
|
#
|
||||||
# NOTE: This script requires Python to be installed on your system.
|
# NOTE: This script requires Python to be installed on your system.
|
||||||
|
|
||||||
##############################################################################
|
# ##############################################################################
|
||||||
### OPTIONS ###
|
# ### OPTIONS ###
|
||||||
|
|
||||||
## General
|
# ## General
|
||||||
|
|
||||||
# Auto Update nzbToMedia (0, 1).
|
# Auto Update nzbToMedia (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
# Set to 1 if you want nzbToMedia to automatically check for and update to the latest version
|
||||||
#auto_update=0
|
# auto_update=0
|
||||||
|
|
||||||
# Check Media for corruption (0, 1).
|
# Check Media for corruption (0, 1).
|
||||||
#
|
#
|
||||||
# Enable/Disable media file checking using ffprobe.
|
# Enable/Disable media file checking using ffprobe.
|
||||||
#check_media=1
|
# check_media=1
|
||||||
|
|
||||||
# Safe Mode protection of DestDir (0, 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.
|
# Enable/Disable a safety check to ensure we don't process all downloads in the default_downloadDirectory by mistake.
|
||||||
#safe_mode=1
|
# safe_mode=1
|
||||||
|
|
||||||
## SickBeard
|
# ## SickBeard
|
||||||
|
|
||||||
# SickBeard script category.
|
# SickBeard script category.
|
||||||
#
|
#
|
||||||
# category that gets called for post-processing with SickBeard.
|
# category that gets called for post-processing with SickBeard.
|
||||||
#sbCategory=tv
|
# sbCategory=tv
|
||||||
|
|
||||||
# SickBeard host.
|
# SickBeard host.
|
||||||
#
|
#
|
||||||
# The ipaddress for your SickBeard/SickRage server. e.g For the Same system use localhost or 127.0.0.1
|
# The ip address for your SickBeard/SickRage server. e.g For the Same system use localhost or 127.0.0.1
|
||||||
#sbhost=localhost
|
# sbhost=localhost
|
||||||
|
|
||||||
# SickBeard port.
|
# SickBeard port.
|
||||||
#sbport=8081
|
# sbport=8081
|
||||||
|
|
||||||
# SickBeard username.
|
# SickBeard username.
|
||||||
#sbusername=
|
# sbusername=
|
||||||
|
|
||||||
# SickBeard password.
|
# SickBeard password.
|
||||||
#sbpassword=
|
# sbpassword=
|
||||||
|
|
||||||
# SickBeard uses ssl (0, 1).
|
# SickBeard uses ssl (0, 1).
|
||||||
#
|
#
|
||||||
# Set to 1 if using ssl, else set to 0.
|
# Set to 1 if using ssl, else set to 0.
|
||||||
#sbssl=0
|
# sbssl=0
|
||||||
|
|
||||||
# SickBeard web_root
|
# SickBeard web_root
|
||||||
#
|
#
|
||||||
# set this if using a reverse proxy.
|
# set this if using a reverse proxy.
|
||||||
#sbweb_root=
|
# sbweb_root=
|
||||||
|
|
||||||
# SickBeard watch directory.
|
# SickBeard watch directory.
|
||||||
#
|
#
|
||||||
# set this to where your SickBeard completed downloads are.
|
# set this to where your SickBeard completed downloads are.
|
||||||
#sbwatch_dir=
|
# sbwatch_dir=
|
||||||
|
|
||||||
# SickBeard fork.
|
# SickBeard fork.
|
||||||
#
|
#
|
||||||
# set to default or auto to auto-detect the custom fork type.
|
# set to default or auto to auto-detect the custom fork type.
|
||||||
#sbfork=auto
|
# sbfork=auto
|
||||||
|
|
||||||
# SickBeard Delete Failed Downloads (0, 1).
|
# SickBeard Delete Failed Downloads (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to delete failed, or 0 to leave files in place.
|
# set to 1 to delete failed, or 0 to leave files in place.
|
||||||
#sbdelete_failed=0
|
# sbdelete_failed=0
|
||||||
|
|
||||||
# SickBeard process method.
|
# 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.
|
# 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=
|
# sbprocess_method=
|
||||||
|
|
||||||
# SickBeard and NZBGet are a different system (0, 1).
|
# SickBeard and NZBGet are a different system (0, 1).
|
||||||
#
|
#
|
||||||
# Enable to replace local path with the path as per the mountPoints below.
|
# Enable to replace local path with the path as per the mountPoints below.
|
||||||
#sbremote_path=0
|
# sbremote_path=0
|
||||||
|
|
||||||
## Network
|
# ## Network
|
||||||
|
|
||||||
# Network Mount Points (Needed for remote path above)
|
# Network Mount Points (Needed for remote path above)
|
||||||
#
|
#
|
||||||
# Enter Mount points as LocalPath,RemotePath and separate each pair with '|'
|
# Enter Mount points as LocalPath,RemotePath and separate each pair with '|'
|
||||||
# e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\
|
# e.g. mountPoints=/volume1/Public/,E:\|/volume2/share/,\\NAS\
|
||||||
#mountPoints=
|
# mountPoints=
|
||||||
|
|
||||||
## Extensions
|
# ## Extensions
|
||||||
|
|
||||||
# Media Extensions
|
# Media Extensions
|
||||||
#
|
#
|
||||||
# This is a list of media extensions that are used to verify that the download does contain valid media.
|
# 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
|
# mediaExtensions=.mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg,.vob,.iso,.ts
|
||||||
|
|
||||||
## Posix
|
# ## Posix
|
||||||
|
|
||||||
# Niceness for external tasks Extractor and Transcoder.
|
# 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).
|
# Set the Niceness value for the nice command. These range from -20 (most favorable to the process) to 19 (least favorable to the process).
|
||||||
#niceness=10
|
# niceness=10
|
||||||
|
|
||||||
# ionice scheduling class (0, 1, 2, 3).
|
# 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.
|
# Set the ionice scheduling class. 0 for none, 1 for real time, 2 for best-effort, 3 for idle.
|
||||||
#ionice_class=2
|
# ionice_class=2
|
||||||
|
|
||||||
# ionice scheduling class data.
|
# 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.
|
# 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
|
# ionice_classdata=4
|
||||||
|
|
||||||
## Transcoder
|
# ## Transcoder
|
||||||
|
|
||||||
# getSubs (0, 1).
|
# getSubs (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to download subtitles.
|
# set to 1 to download subtitles.
|
||||||
#getSubs=0
|
# getSubs=0
|
||||||
|
|
||||||
# subLanguages.
|
# subLanguages.
|
||||||
#
|
#
|
||||||
# subLanguages. create a list of languages in the order you want them in your subtitles.
|
# subLanguages. create a list of languages in the order you want them in your subtitles.
|
||||||
#subLanguages=eng,spa,fra
|
# subLanguages=eng,spa,fra
|
||||||
|
|
||||||
# Transcode (0, 1).
|
# Transcode (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to transcode, otherwise set to 0.
|
# set to 1 to transcode, otherwise set to 0.
|
||||||
#transcode=0
|
# transcode=0
|
||||||
|
|
||||||
# create a duplicate, or replace the original (0, 1).
|
# create a duplicate, or replace the original (0, 1).
|
||||||
#
|
#
|
||||||
# set to 1 to cretae a new file or 0 to replace the original
|
# set to 1 to create a new file or 0 to replace the original
|
||||||
#duplicate=1
|
# duplicate=1
|
||||||
|
|
||||||
# ignore extensions.
|
# ignore extensions.
|
||||||
#
|
#
|
||||||
# list of extensions that won't be transcoded.
|
# list of extensions that won't be transcoded.
|
||||||
#ignoreExtensions=.avi,.mkv
|
# ignoreExtensions=.avi,.mkv
|
||||||
|
|
||||||
# outputFastStart (0,1).
|
# outputFastStart (0,1).
|
||||||
#
|
#
|
||||||
# outputFastStart. 1 will use -movflags + faststart. 0 will disable this from being used.
|
# outputFastStart. 1 will use -movflags + faststart. 0 will disable this from being used.
|
||||||
#outputFastStart=0
|
# outputFastStart=0
|
||||||
|
|
||||||
# outputVideoPath.
|
# outputVideoPath.
|
||||||
#
|
#
|
||||||
# outputVideoPath. Set path you want transcoded videos moved to. Leave blank to disable.
|
# outputVideoPath. Set path you want transcoded videos moved to. Leave blank to disable.
|
||||||
#outputVideoPath=
|
# outputVideoPath=
|
||||||
|
|
||||||
# processOutput (0,1).
|
# processOutput (0,1).
|
||||||
#
|
#
|
||||||
# processOutput. 1 will send the outputVideoPath to SickBeard/CouchPotato. 0 will send original files.
|
# processOutput. 1 will send the outputVideoPath to SickBeard/CouchPotato. 0 will send original files.
|
||||||
#processOutput=0
|
# processOutput=0
|
||||||
|
|
||||||
# audioLanguage.
|
# audioLanguage.
|
||||||
#
|
#
|
||||||
# audioLanguage. set the 3 letter language code you want as your primary audio track.
|
# audioLanguage. set the 3 letter language code you want as your primary audio track.
|
||||||
#audioLanguage=eng
|
# audioLanguage=eng
|
||||||
|
|
||||||
# allAudioLanguages (0,1).
|
# allAudioLanguages (0,1).
|
||||||
#
|
#
|
||||||
# allAudioLanguages. 1 will keep all audio tracks (uses AudioCodec3) where available.
|
# allAudioLanguages. 1 will keep all audio tracks (uses AudioCodec3) where available.
|
||||||
#allAudioLanguages=0
|
# allAudioLanguages=0
|
||||||
|
|
||||||
# allSubLanguages (0,1).
|
# allSubLanguages (0,1).
|
||||||
#
|
#
|
||||||
# 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
|
# allSubLanguages=0
|
||||||
|
|
||||||
# embedSubs (0,1).
|
# embedSubs (0,1).
|
||||||
#
|
#
|
||||||
# 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
|
# embedSubs=1
|
||||||
|
|
||||||
# burnInSubtitle (0,1).
|
# burnInSubtitle (0,1).
|
||||||
#
|
#
|
||||||
# burnInSubtitle. burns the default sub language into your video (needed for players that don't support subs)
|
# burnInSubtitle. burns the default sub language into your video (needed for players that don't support subs)
|
||||||
#burnInSubtitle=0
|
# burnInSubtitle=0
|
||||||
|
|
||||||
# extractSubs (0,1).
|
# extractSubs (0,1).
|
||||||
#
|
#
|
||||||
# extractSubs. 1 will extract subs from the video file and save these as external srt files.
|
# extractSubs. 1 will extract subs from the video file and save these as external srt files.
|
||||||
#extractSubs=0
|
# extractSubs=0
|
||||||
|
|
||||||
# externalSubDir.
|
# externalSubDir.
|
||||||
#
|
#
|
||||||
# externalSubDir. set the directory where subs should be saved (if not the same directory as the video)
|
# externalSubDir. set the directory where subs should be saved (if not the same directory as the video)
|
||||||
#externalSubDir=
|
# externalSubDir=
|
||||||
|
|
||||||
# outputDefault (None, iPad, iPad-1080p, iPad-720p, Apple-TV2, iPod, iPhone, PS3, xbox, Roku-1080p, Roku-720p, Roku-480p, mkv, mp4-scene-release).
|
# outputDefault (None, iPad, iPad-1080p, iPad-720p, Apple-TV2, iPod, iPhone, PS3, xbox, Roku-1080p, Roku-720p, Roku-480p, mkv, mp4-scene-release).
|
||||||
#
|
#
|
||||||
# outputDefault. Loads default configs for the selected device. The remaining options below are ignored.
|
# 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.
|
# If you want to use your own profile, set None and set the remaining options below.
|
||||||
#outputDefault=None
|
# outputDefault=None
|
||||||
|
|
||||||
# hwAccel (0,1).
|
# hwAccel (0,1).
|
||||||
#
|
#
|
||||||
# hwAccel. 1 will set ffmpeg to enable hardware acceleration (this requires a recent ffmpeg).
|
# hwAccel. 1 will set ffmpeg to enable hardware acceleration (this requires a recent ffmpeg).
|
||||||
#hwAccel=0
|
# hwAccel=0
|
||||||
|
|
||||||
# ffmpeg output settings.
|
# ffmpeg output settings.
|
||||||
#outputVideoExtension=.mp4
|
# outputVideoExtension=.mp4
|
||||||
#outputVideoCodec=libx264
|
# outputVideoCodec=libx264
|
||||||
#VideoCodecAllow=
|
# VideoCodecAllow=
|
||||||
#outputVideoPreset=medium
|
# outputVideoPreset=medium
|
||||||
#outputVideoFramerate=24
|
# outputVideoFramerate=24
|
||||||
#outputVideoBitrate=800k
|
# outputVideoBitrate=800k
|
||||||
#outputAudioCodec=ac3
|
# outputAudioCodec=ac3
|
||||||
#AudioCodecAllow=
|
# AudioCodecAllow=
|
||||||
#outputAudioChannels=6
|
# outputAudioChannels=6
|
||||||
#outputAudioBitrate=640k
|
# outputAudioBitrate=640k
|
||||||
#outputQualityPercent=
|
# outputQualityPercent=
|
||||||
#outputAudioTrack2Codec=libfaac
|
# outputAudioTrack2Codec=libfaac
|
||||||
#AudioCodec2Allow=
|
# AudioCodec2Allow=
|
||||||
#outputAudioTrack2Channels=2
|
# outputAudioTrack2Channels=2
|
||||||
#outputAudioTrack2Bitrate=160k
|
# outputAudioTrack2Bitrate=160k
|
||||||
#outputAudioOtherCodec=libmp3lame
|
# outputAudioOtherCodec=libmp3lame
|
||||||
#AudioOtherCodecAllow=
|
# AudioOtherCodecAllow=
|
||||||
#outputAudioOtherChannels=2
|
# outputAudioOtherChannels=2
|
||||||
#outputAudioOtherBitrate=128k
|
# outputAudioOtherBitrate=128k
|
||||||
#outputSubtitleCodec=
|
# outputSubtitleCodec=
|
||||||
|
|
||||||
## WakeOnLan
|
# ## WakeOnLan
|
||||||
|
|
||||||
# use WOL (0, 1).
|
# 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.
|
# 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
|
# wolwake=0
|
||||||
|
|
||||||
# WOL MAC
|
# WOL MAC
|
||||||
#
|
#
|
||||||
# enter the mac address of the system to be woken.
|
# enter the mac address of the system to be woken.
|
||||||
#wolmac=00:01:2e:2D:64:e1
|
# wolmac=00:01:2e:2D:64:e1
|
||||||
|
|
||||||
# Set the Host and Port of a server to verify system has woken.
|
# Set the Host and Port of a server to verify system has woken.
|
||||||
#wolhost=192.168.1.37
|
# wolhost=192.168.1.37
|
||||||
#wolport=80
|
# wolport=80
|
||||||
|
|
||||||
|
# ### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
# ##############################################################################
|
||||||
|
|
||||||
### NZBGET POST-PROCESSING SCRIPT ###
|
|
||||||
##############################################################################
|
|
||||||
import sys
|
import sys
|
||||||
import nzbToMedia
|
import nzbToMedia
|
||||||
|
|
||||||
section = "SickBeard"
|
section = "SickBeard"
|
||||||
result = nzbToMedia.main(sys.argv, section)
|
result = nzbToMedia.main(sys.argv, section)
|
||||||
sys.exit(result)
|
sys.exit(result)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue