mirror of
https://github.com/clinton-hall/nzbToMedia.git
synced 2025-08-19 12:59:36 -07:00
commit
3377cb338e
15 changed files with 100 additions and 44 deletions
16
README.md
16
README.md
|
@ -1,7 +1,7 @@
|
||||||
nzbToMedia
|
nzbToMedia
|
||||||
================
|
================
|
||||||
|
|
||||||
Provides an efficient way to handle postprocessing for [CouchPotatoServer](https://couchpota.to/ "CouchPotatoServer") and [SickBeard](http://sickbeard.com/ "SickBeard")
|
Provides an [efficient](https://github.com/clinton-hall/nzbToMedia/wiki/Efficient-on-demand-post-processing) way to handle postprocessing for [CouchPotatoServer](https://couchpota.to/ "CouchPotatoServer") and [SickBeard](http://sickbeard.com/ "SickBeard") (and its [forks](https://github.com/clinton-hall/nzbToMedia/wiki/Failed-Download-Handling-%28FDH%29#sick-beard-and-its-forks))
|
||||||
when using one of the popular NZB download clients like [SABnzbd](http://sabnzbd.org/ "SABnzbd") and [NZBGet](http://nzbget.sourceforge.net/ "NZBGet") on low performance systems like a NAS.
|
when using one of the popular NZB download clients like [SABnzbd](http://sabnzbd.org/ "SABnzbd") and [NZBGet](http://nzbget.sourceforge.net/ "NZBGet") on low performance systems like a NAS.
|
||||||
This script is based on sabToSickBeard (written by Nic Wolfe and supplied with SickBeard), with the support for NZBGet being added by [thorli](https://github.com/thorli "thorli") and further contributions by [schumi2004](https://github.com/schumi2004 "schumi2004") and [hugbug](https://sourceforge.net/apps/phpbb/nzbget/memberlist.php?mode=viewprofile&u=67 "hugbug").
|
This script is based on sabToSickBeard (written by Nic Wolfe and supplied with SickBeard), with the support for NZBGet being added by [thorli](https://github.com/thorli "thorli") and further contributions by [schumi2004](https://github.com/schumi2004 "schumi2004") and [hugbug](https://sourceforge.net/apps/phpbb/nzbget/memberlist.php?mode=viewprofile&u=67 "hugbug").
|
||||||
Torrent suport added by [jkaberg](https://github.com/jkaberg "jkaberg") and [berkona](https://github.com/berkona "berkona")
|
Torrent suport added by [jkaberg](https://github.com/jkaberg "jkaberg") and [berkona](https://github.com/berkona "berkona")
|
||||||
|
@ -9,17 +9,17 @@ Corrupt video checking, auto SickBeard fork determination and a whole lot of cod
|
||||||
|
|
||||||
Introduction
|
Introduction
|
||||||
------------
|
------------
|
||||||
Originally this was modified from the SickBeard version to allow for "on-demand" renaming and not have My QNAP TS-412 NAS constantly scanning the download directory.
|
Originally this was modified from the SickBeard version to allow for ["on-demand" renaming](https://github.com/clinton-hall/nzbToMedia/wiki/Efficient-on-demand-post-processing) and not have My QNAP TS-412 NAS constantly scanning the download directory.
|
||||||
Later, a few failed downloads prompted me to incorporate "failed download" handling.
|
Later, a few failed downloads prompted me to incorporate ["failed download" handling](https://github.com/clinton-hall/nzbToMedia/wiki/Failed-Download-Handling-%28FDH%29).
|
||||||
Failed download handling is now provided for SABnzbd, by CouchPotatoServer; however on arm processors (e.g. small NAS systems) this can be un-reliable.
|
Failed download handling is now provided for SABnzbd, by CouchPotatoServer; however on arm processors (e.g. small NAS systems) this can be un-reliable.
|
||||||
|
|
||||||
Failed download handling for SickBeard is available by using the development branch from fork [SickBeard-failed](https://github.com/Tolstyak/Sick-Beard.git "SickBeard-failed")
|
Failed download handling for SickBeard is available by using Tolstyak's fork [SickBeard-failed](https://github.com/hugepants/Sick-Beard)).
|
||||||
To use this feature, in autoProcessTV.cfg set the parameter "fork=failed". Default is "fork=default" and will work with standard version of SickBeard and just ignores failed downloads.
|
To use this feature, in autoProcessTV.cfg set the parameter "fork=failed". Default is "fork=default" and will work with the standard version of SickBeard and just ignores failed downloads.
|
||||||
Additional forks exist for ThePirateBay (does its own extraction and linking). See [SickBeard Forks](https://github.com/clinton-hall/nzbToMedia/wiki/sickbeard-branches "SickBeard Forks") for a list of known forks.
|
Development of Tolstyak's fork ended in 2013, but newer forks exist with significant feature updates such as [Mr-Orange TPB](https://github.com/coach0742/Sick-Beard) (discontinued) and [SickRage](https://github.com/SiCKRAGETV/SickRage) (active). See [SickBeard Forks](https://github.com/clinton-hall/nzbToMedia/wiki/Failed-Download-Handling-%28FDH%29#sick-beard-and-its-forks "SickBeard Forks") for a list of known forks.
|
||||||
|
|
||||||
Full support is provided for [SickRage](https://github.com/echel0n/SickRage "SickRage").
|
Full support is provided for [SickRage](https://github.com/SiCKRAGETV/SickRage).
|
||||||
|
|
||||||
Torrent support has been added with the assistance of jkaberg and berkona. Currently supports uTorrent, Transmissions, Deluge and possibly more.
|
Torrent support has been added with the assistance of jkaberg and berkona. Currently supports uTorrent, Transmission, Deluge and possibly more.
|
||||||
To enable Torrent extraction, on Windows, you need to install [7-zip](http://www.7-zip.org/ "7-zip") or on *nix you need to install the following packages/commands.
|
To enable Torrent extraction, on Windows, you need to install [7-zip](http://www.7-zip.org/ "7-zip") or on *nix you need to install the following packages/commands.
|
||||||
|
|
||||||
"unrar", "unzip", "tar", "7zr"
|
"unrar", "unzip", "tar", "7zr"
|
||||||
|
|
|
@ -102,7 +102,12 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
if clientAgent != 'manual':
|
if clientAgent != 'manual':
|
||||||
core.pause_torrent(clientAgent, inputHash, inputID, inputName)
|
core.pause_torrent(clientAgent, inputHash, inputID, inputName)
|
||||||
|
|
||||||
if uniquePath:
|
# Incase input is not directory, make sure to create one.
|
||||||
|
# This way Processing is isolated.
|
||||||
|
if not os.path.isdir(os.path.join(inputDirectory, inputName)):
|
||||||
|
basename = os.path.splitext(core.sanitizeName(inputName))[0]
|
||||||
|
outputDestination = os.path.join(core.OUTPUTDIRECTORY, inputCategory, basename)
|
||||||
|
elif uniquePath:
|
||||||
outputDestination = os.path.normpath(
|
outputDestination = os.path.normpath(
|
||||||
core.os.path.join(core.OUTPUTDIRECTORY, inputCategory, core.sanitizeName(inputName)))
|
core.os.path.join(core.OUTPUTDIRECTORY, inputCategory, core.sanitizeName(inputName)))
|
||||||
else:
|
else:
|
||||||
|
@ -202,6 +207,9 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
|
|
||||||
logger.info("Calling %s:%s to post-process:%s" % (sectionName, usercat, inputName))
|
logger.info("Calling %s:%s to post-process:%s" % (sectionName, usercat, inputName))
|
||||||
|
|
||||||
|
if core.TORRENT_CHMOD_DIRECTORY:
|
||||||
|
core.rchmod(outputDestination, core.TORRENT_CHMOD_DIRECTORY)
|
||||||
|
|
||||||
result = [ 0, "" ]
|
result = [ 0, "" ]
|
||||||
if sectionName == 'UserScript':
|
if sectionName == 'UserScript':
|
||||||
result = external_script(outputDestination, inputName, inputCategory, section[usercat])
|
result = external_script(outputDestination, inputName, inputCategory, section[usercat])
|
||||||
|
@ -225,7 +233,9 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
|
||||||
plex_update(inputCategory)
|
plex_update(inputCategory)
|
||||||
|
|
||||||
if result[0] != 0:
|
if result[0] != 0:
|
||||||
if clientAgent != 'manual':
|
if not core.TORRENT_RESUME_ON_FAILURE:
|
||||||
|
logger.error("A problem was reported in the autoProcess* script. torrent won't resume seeding (settings)")
|
||||||
|
elif clientAgent != 'manual':
|
||||||
logger.error(
|
logger.error(
|
||||||
"A problem was reported in the autoProcess* script. If torrent was paused we will resume seeding")
|
"A problem was reported in the autoProcess* script. If torrent was paused we will resume seeding")
|
||||||
core.resume_torrent(clientAgent, inputHash, inputID, inputName)
|
core.resume_torrent(clientAgent, inputHash, inputID, inputName)
|
||||||
|
|
|
@ -58,7 +58,7 @@
|
||||||
extract = 1
|
extract = 1
|
||||||
# Set this to minimum required size to consider a media file valid (in MB)
|
# Set this to minimum required size to consider a media file valid (in MB)
|
||||||
minSize = 0
|
minSize = 0
|
||||||
# Enable/Disable deleteing ignored files (samples and invalid media files)
|
# Enable/Disable deleting ignored files (samples and invalid media files)
|
||||||
delete_ignored = 0
|
delete_ignored = 0
|
||||||
##### Enable if Couchpotato is on a remote server for this category
|
##### Enable if Couchpotato is on a remote server for this category
|
||||||
remote_path = 0
|
remote_path = 0
|
||||||
|
@ -85,11 +85,13 @@
|
||||||
process_method =
|
process_method =
|
||||||
# force processing of already processed content when running a manual scan.
|
# force processing of already processed content when running a manual scan.
|
||||||
force = 0
|
force = 0
|
||||||
|
# tell SickRage to delete all source files after processing.
|
||||||
|
delete_on = 0
|
||||||
extract = 1
|
extract = 1
|
||||||
nzbExtractionBy = Downloader
|
nzbExtractionBy = Downloader
|
||||||
# Set this to minimum required size to consider a media file valid (in MB)
|
# Set this to minimum required size to consider a media file valid (in MB)
|
||||||
minSize = 0
|
minSize = 0
|
||||||
# Enable/Disable deleteing ignored files (samples and invalid media files)
|
# Enable/Disable deleting ignored files (samples and invalid media files)
|
||||||
delete_ignored = 0
|
delete_ignored = 0
|
||||||
##### Enable if SickBeard is on a remote server for this category
|
##### Enable if SickBeard is on a remote server for this category
|
||||||
remote_path = 0
|
remote_path = 0
|
||||||
|
@ -118,7 +120,7 @@
|
||||||
wait_for = 2
|
wait_for = 2
|
||||||
# Set this to minimum required size to consider a media file valid (in MB)
|
# Set this to minimum required size to consider a media file valid (in MB)
|
||||||
minSize = 0
|
minSize = 0
|
||||||
# Enable/Disable deleteing ignored files (samples and invalid media files)
|
# Enable/Disable deleting ignored files (samples and invalid media files)
|
||||||
delete_ignored = 0
|
delete_ignored = 0
|
||||||
##### Enable if NzbDrone is on a remote server for this category
|
##### Enable if NzbDrone is on a remote server for this category
|
||||||
remote_path = 0
|
remote_path = 0
|
||||||
|
@ -143,7 +145,7 @@
|
||||||
extract = 1
|
extract = 1
|
||||||
# Set this to minimum required size to consider a media file valid (in MB)
|
# Set this to minimum required size to consider a media file valid (in MB)
|
||||||
minSize = 0
|
minSize = 0
|
||||||
# Enable/Disable deleteing ignored files (samples and invalid media files)
|
# Enable/Disable deleting ignored files (samples and invalid media files)
|
||||||
delete_ignored = 0
|
delete_ignored = 0
|
||||||
##### Enable if HeadPhones is on a remote server for this category
|
##### Enable if HeadPhones is on a remote server for this category
|
||||||
remote_path = 0
|
remote_path = 0
|
||||||
|
@ -168,7 +170,7 @@
|
||||||
extract = 1
|
extract = 1
|
||||||
# Set this to minimum required size to consider a media file valid (in MB)
|
# Set this to minimum required size to consider a media file valid (in MB)
|
||||||
minSize = 0
|
minSize = 0
|
||||||
# Enable/Disable deleteing ignored files (samples and invalid media files)
|
# Enable/Disable deleting ignored files (samples and invalid media files)
|
||||||
delete_ignored = 0
|
delete_ignored = 0
|
||||||
##### Enable if Mylar is on a remote server for this category
|
##### Enable if Mylar is on a remote server for this category
|
||||||
remote_path = 0
|
remote_path = 0
|
||||||
|
@ -194,7 +196,7 @@
|
||||||
extract = 1
|
extract = 1
|
||||||
# Set this to minimum required size to consider a media file valid (in MB)
|
# Set this to minimum required size to consider a media file valid (in MB)
|
||||||
minSize = 0
|
minSize = 0
|
||||||
# Enable/Disable deleteing ignored files (samples and invalid media files)
|
# Enable/Disable deleting ignored files (samples and invalid media files)
|
||||||
delete_ignored = 0
|
delete_ignored = 0
|
||||||
##### Enable if Gamez is on a remote server for this category
|
##### Enable if Gamez is on a remote server for this category
|
||||||
remote_path = 0
|
remote_path = 0
|
||||||
|
@ -210,7 +212,7 @@
|
||||||
###### clientAgent - Supported clients: sabnzbd, nzbget
|
###### clientAgent - Supported clients: sabnzbd, nzbget
|
||||||
clientAgent = sabnzbd
|
clientAgent = sabnzbd
|
||||||
###### SabNZBD (You must edit this if your using nzbToMedia.py with SabNZBD)
|
###### SabNZBD (You must edit this if your using nzbToMedia.py with SabNZBD)
|
||||||
sabnzbd_host = localhost
|
sabnzbd_host = http://localhost
|
||||||
sabnzbd_port = 8080
|
sabnzbd_port = 8080
|
||||||
sabnzbd_apikey =
|
sabnzbd_apikey =
|
||||||
###### Enter the default path to your default download directory (non-category downloads). this directory is protected by safe_mode.
|
###### Enter the default path to your default download directory (non-category downloads). this directory is protected by safe_mode.
|
||||||
|
@ -245,10 +247,12 @@
|
||||||
DelugePWD = your password
|
DelugePWD = your password
|
||||||
###### ADVANCED USE - ONLY EDIT IF YOU KNOW WHAT YOU'RE DOING ######
|
###### ADVANCED USE - ONLY EDIT IF YOU KNOW WHAT YOU'RE DOING ######
|
||||||
deleteOriginal = 0
|
deleteOriginal = 0
|
||||||
|
chmodDirecotry = 0
|
||||||
|
resumeOnFailure = 1
|
||||||
|
|
||||||
[Extensions]
|
[Extensions]
|
||||||
compressedExtensions = .zip,.rar,.7z,.gz,.bz,.tar,.arj,.1,.01,.001
|
compressedExtensions = .zip,.rar,.7z,.gz,.bz,.tar,.arj,.1,.01,.001
|
||||||
mediaExtensions = .mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg,.vob,.iso,.m4v
|
mediaExtensions = .mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg,.vob,.iso,.m4v,.ts
|
||||||
audioExtensions = .mp3, .aac, .ogg, .ape, .m4a, .asf, .wma, .flac
|
audioExtensions = .mp3, .aac, .ogg, .ape, .m4a, .asf, .wma, .flac
|
||||||
metaExtensions = .nfo,.sub,.srt,.jpg,.gif
|
metaExtensions = .nfo,.sub,.srt,.jpg,.gif
|
||||||
|
|
||||||
|
@ -268,10 +272,11 @@
|
||||||
subLanguages = eng,spa,fra
|
subLanguages = eng,spa,fra
|
||||||
# transcode. enable to use transcoder
|
# transcode. enable to use transcoder
|
||||||
transcode = 0
|
transcode = 0
|
||||||
###### duplicate =1 will cretae a new file. =0 will replace the original
|
###### duplicate =1 will create a new file. =0 will replace the original
|
||||||
duplicate = 1
|
duplicate = 1
|
||||||
# concat. joins cd1 cd2 etc into a single video.
|
# concat. joins cd1 cd2 etc into a single video.
|
||||||
concat = 1
|
concat = 1
|
||||||
|
# IgnoreExtensions is a comma-separated list of extensions that will not be transcoded.
|
||||||
ignoreExtensions = .avi,.mkv,.mp4
|
ignoreExtensions = .avi,.mkv,.mp4
|
||||||
# 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
|
||||||
|
@ -285,9 +290,9 @@
|
||||||
audioLanguage = eng
|
audioLanguage = eng
|
||||||
# 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. 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. 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. 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
|
||||||
|
@ -354,7 +359,7 @@
|
||||||
#for example FP,FN,DN, TN, TL for file path (absolute file name with path), file name, absolute directory name (with path), Torrent Name, Torrent Label/Category.
|
#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
|
||||||
#Set user_script_runOnce = 0 to run for each file, or 1 to only run once (presumably on teh entire directory).
|
#Set user_script_runOnce = 0 to run for each file, or 1 to only run once (presumably on the entire directory).
|
||||||
user_script_runOnce = 0
|
user_script_runOnce = 0
|
||||||
#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
|
||||||
|
@ -378,5 +383,5 @@
|
||||||
[Custom]
|
[Custom]
|
||||||
# enter a list (comma separated) of Group Tags you want removed from filenames to help with subtitle matching.
|
# enter a list (comma separated) of Group Tags you want removed from filenames to help with subtitle matching.
|
||||||
# e.g remove_group = [rarbag],-NZBgeek
|
# e.g remove_group = [rarbag],-NZBgeek
|
||||||
# be careful if your "group" is a common "real" word. Please report if you have any group replacments that would fall in this category.
|
# be careful if your "group" is a common "real" word. Please report if you have any group replacements that would fall in this category.
|
||||||
remove_group =
|
remove_group =
|
||||||
|
|
|
@ -56,8 +56,8 @@ FORK_SICKRAGE = "sickrage"
|
||||||
FORKS[FORK_DEFAULT] = {"dir": None}
|
FORKS[FORK_DEFAULT] = {"dir": None}
|
||||||
FORKS[FORK_FAILED] = {"dirName": None, "failed": None}
|
FORKS[FORK_FAILED] = {"dirName": None, "failed": None}
|
||||||
FORKS[FORK_FAILED_TORRENT] = {"dir": None, "failed": None, "process_method": None}
|
FORKS[FORK_FAILED_TORRENT] = {"dir": None, "failed": None, "process_method": None}
|
||||||
FORKS[FORK_SICKRAGE] = {"dir": None, "failed": None, "process_method": None, "force": None}
|
FORKS[FORK_SICKRAGE] = {"dir": None, "failed": None, "process_method": None, "force": None, "delete_on": None}
|
||||||
ALL_FORKS = {"dir": None, "dirName": None, "failed": None, "process_method": None, "force": None}
|
ALL_FORKS = {"dir": None, "dirName": None, "failed": None, "process_method": None, "force": None, "delete_on": None}
|
||||||
SICKBEARD_FAILED = [FORK_FAILED, FORK_FAILED_TORRENT, FORK_SICKRAGE]
|
SICKBEARD_FAILED = [FORK_FAILED, FORK_FAILED_TORRENT, FORK_SICKRAGE]
|
||||||
SICKBEARD_TORRENT = [FORK_FAILED_TORRENT, FORK_SICKRAGE]
|
SICKBEARD_TORRENT = [FORK_FAILED_TORRENT, FORK_SICKRAGE]
|
||||||
|
|
||||||
|
@ -98,7 +98,9 @@ USELINK = None
|
||||||
OUTPUTDIRECTORY = None
|
OUTPUTDIRECTORY = None
|
||||||
NOFLATTEN = []
|
NOFLATTEN = []
|
||||||
DELETE_ORIGINAL = None
|
DELETE_ORIGINAL = None
|
||||||
|
TORRENT_CHMOD_DIRECTORY = None
|
||||||
TORRENT_DEFAULTDIR = None
|
TORRENT_DEFAULTDIR = None
|
||||||
|
TORRENT_RESUME_ON_FAILURE = None
|
||||||
|
|
||||||
REMOTEPATHS = []
|
REMOTEPATHS = []
|
||||||
|
|
||||||
|
@ -210,9 +212,9 @@ def initialize(section=None):
|
||||||
ACODEC2, ACODEC2_ALLOW, ABITRATE2, ACODEC3, ACODEC3_ALLOW, ABITRATE3, ALLOWSUBS, SEXTRACT, SEMBED, SLANGUAGES, \
|
ACODEC2, ACODEC2_ALLOW, ABITRATE2, ACODEC3, ACODEC3_ALLOW, ABITRATE3, ALLOWSUBS, SEXTRACT, SEMBED, SLANGUAGES, \
|
||||||
SINCLUDE, SUBSDIR, SCODEC, OUTPUTFASTSTART, OUTPUTQUALITYPERCENT, BURN, GETSUBS, HWACCEL, LOG_DIR, LOG_FILE, \
|
SINCLUDE, SUBSDIR, SCODEC, OUTPUTFASTSTART, OUTPUTQUALITYPERCENT, BURN, GETSUBS, HWACCEL, LOG_DIR, LOG_FILE, \
|
||||||
NICENESS, LOG_DEBUG, FORCE_CLEAN, FFMPEG_PATH, FFMPEG, FFPROBE, AUDIOCONTAINER, EXTCONTAINER, TORRENT_CLASS, \
|
NICENESS, LOG_DEBUG, FORCE_CLEAN, FFMPEG_PATH, FFMPEG, FFPROBE, AUDIOCONTAINER, EXTCONTAINER, TORRENT_CLASS, \
|
||||||
DELETE_ORIGINAL, PASSWORDSFILE, USER_DELAY, USER_SCRIPT, USER_SCRIPT_CLEAN, USER_SCRIPT_MEDIAEXTENSIONS, \
|
DELETE_ORIGINAL, TORRENT_CHMOD_DIRECTORY, PASSWORDSFILE, USER_DELAY, USER_SCRIPT, USER_SCRIPT_CLEAN, USER_SCRIPT_MEDIAEXTENSIONS, \
|
||||||
USER_SCRIPT_PARAM, USER_SCRIPT_RUNONCE, USER_SCRIPT_SUCCESSCODES, DOWNLOADINFO, CHECK_MEDIA, SAFE_MODE, \
|
USER_SCRIPT_PARAM, USER_SCRIPT_RUNONCE, USER_SCRIPT_SUCCESSCODES, DOWNLOADINFO, CHECK_MEDIA, SAFE_MODE, \
|
||||||
TORRENT_DEFAULTDIR, NZB_DEFAULTDIR, REMOTEPATHS, LOG_ENV, PID_FILE, MYAPP, ACHANNELS, ACHANNELS2, ACHANNELS3, \
|
TORRENT_DEFAULTDIR, TORRENT_RESUME_ON_FAILURE, NZB_DEFAULTDIR, REMOTEPATHS, LOG_ENV, PID_FILE, MYAPP, ACHANNELS, ACHANNELS2, ACHANNELS3, \
|
||||||
PLEXSSL, PLEXHOST, PLEXPORT, PLEXTOKEN, PLEXSEC
|
PLEXSSL, PLEXHOST, PLEXPORT, PLEXTOKEN, PLEXSEC
|
||||||
|
|
||||||
if __INITIALIZED__:
|
if __INITIALIZED__:
|
||||||
|
@ -339,6 +341,8 @@ def initialize(section=None):
|
||||||
if isinstance(NOFLATTEN, str): NOFLATTEN = NOFLATTEN.split(',')
|
if isinstance(NOFLATTEN, str): NOFLATTEN = NOFLATTEN.split(',')
|
||||||
if isinstance(CATEGORIES, str): CATEGORIES = CATEGORIES.split(',')
|
if isinstance(CATEGORIES, str): CATEGORIES = CATEGORIES.split(',')
|
||||||
DELETE_ORIGINAL = int(CFG["Torrent"]["deleteOriginal"])
|
DELETE_ORIGINAL = int(CFG["Torrent"]["deleteOriginal"])
|
||||||
|
TORRENT_CHMOD_DIRECTORY = int(CFG["Torrent"]["chmodDirecotry"], 8)
|
||||||
|
TORRENT_RESUME_ON_FAILURE = int(CFG["Torrent"]["resumeOnFailure"])
|
||||||
UTORRENTWEBUI = CFG["Torrent"]["uTorrentWEBui"] # http://localhost:8090/gui/
|
UTORRENTWEBUI = CFG["Torrent"]["uTorrentWEBui"] # http://localhost:8090/gui/
|
||||||
UTORRENTUSR = CFG["Torrent"]["uTorrentUSR"] # mysecretusr
|
UTORRENTUSR = CFG["Torrent"]["uTorrentUSR"] # mysecretusr
|
||||||
UTORRENTPWD = CFG["Torrent"]["uTorrentPWD"] # mysecretpwr
|
UTORRENTPWD = CFG["Torrent"]["uTorrentPWD"] # mysecretpwr
|
||||||
|
@ -740,3 +744,15 @@ def restart():
|
||||||
status = p.returncode
|
status = p.returncode
|
||||||
|
|
||||||
os._exit(status)
|
os._exit(status)
|
||||||
|
|
||||||
|
def rchmod(path, mod):
|
||||||
|
logger.log("Changing file mode of %s to %s" % (path, oct(mod)))
|
||||||
|
os.chmod(path, mod)
|
||||||
|
if not os.path.isdir(path):
|
||||||
|
return # Skip files
|
||||||
|
|
||||||
|
for root, dirs, files in os.walk(path):
|
||||||
|
for d in dirs:
|
||||||
|
os.chmod(os.path.join(root, d), mod)
|
||||||
|
for f in files:
|
||||||
|
os.chmod(os.path.join(root, f), mod)
|
||||||
|
|
|
@ -3,10 +3,13 @@ import time
|
||||||
import core
|
import core
|
||||||
import requests
|
import requests
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from core.nzbToMediaUtil import convert_to_ascii, remoteDir, server_responding
|
from core.nzbToMediaUtil import convert_to_ascii, remoteDir, server_responding
|
||||||
from core.nzbToMediaSceneExceptions import process_all_exceptions
|
from core.nzbToMediaSceneExceptions import process_all_exceptions
|
||||||
from core import logger
|
from core import logger
|
||||||
|
|
||||||
|
requests.packages.urllib3.disable_warnings()
|
||||||
|
|
||||||
class autoProcessComics:
|
class autoProcessComics:
|
||||||
def processEpisode(self, section, dirName, inputName=None, status=0, clientAgent='manual', inputCategory=None):
|
def processEpisode(self, section, dirName, inputName=None, status=0, clientAgent='manual', inputCategory=None):
|
||||||
if int(status) != 0:
|
if int(status) != 0:
|
||||||
|
|
|
@ -1,10 +1,13 @@
|
||||||
import core
|
import core
|
||||||
import requests
|
import requests
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from core.nzbToMediaUtil import convert_to_ascii, server_responding
|
from core.nzbToMediaUtil import convert_to_ascii, server_responding
|
||||||
from core.nzbToMediaSceneExceptions import process_all_exceptions
|
from core.nzbToMediaSceneExceptions import process_all_exceptions
|
||||||
from core import logger
|
from core import logger
|
||||||
|
|
||||||
|
requests.packages.urllib3.disable_warnings()
|
||||||
|
|
||||||
class autoProcessGames:
|
class autoProcessGames:
|
||||||
def process(self, section, dirName, inputName=None, status=0, clientAgent='manual', inputCategory=None):
|
def process(self, section, dirName, inputName=None, status=0, clientAgent='manual', inputCategory=None):
|
||||||
status = int(status)
|
status = int(status)
|
||||||
|
|
|
@ -8,6 +8,7 @@ from core.nzbToMediaUtil import convert_to_ascii, rmDir, find_imdbid, find_downl
|
||||||
from core import logger
|
from core import logger
|
||||||
from core.transcoder import transcoder
|
from core.transcoder import transcoder
|
||||||
|
|
||||||
|
requests.packages.urllib3.disable_warnings()
|
||||||
|
|
||||||
class autoProcessMovie:
|
class autoProcessMovie:
|
||||||
def get_release(self, baseURL, imdbid=None, download_id=None, release_id=None):
|
def get_release(self, baseURL, imdbid=None, download_id=None, release_id=None):
|
||||||
|
|
|
@ -7,6 +7,8 @@ from core.nzbToMediaUtil import convert_to_ascii, remoteDir, listMediaFiles, ser
|
||||||
from core.nzbToMediaSceneExceptions import process_all_exceptions
|
from core.nzbToMediaSceneExceptions import process_all_exceptions
|
||||||
from core import logger
|
from core import logger
|
||||||
|
|
||||||
|
requests.packages.urllib3.disable_warnings()
|
||||||
|
|
||||||
class autoProcessMusic:
|
class autoProcessMusic:
|
||||||
def get_status(self, url, apikey, dirName):
|
def get_status(self, url, apikey, dirName):
|
||||||
logger.debug("Attempting to get current status for release:%s" % (os.path.basename(dirName)))
|
logger.debug("Attempting to get current status for release:%s" % (os.path.basename(dirName)))
|
||||||
|
|
|
@ -12,6 +12,8 @@ from core.nzbToMediaUtil import convert_to_ascii, flatten, rmDir, listMediaFiles
|
||||||
from core import logger
|
from core import logger
|
||||||
from core.transcoder import transcoder
|
from core.transcoder import transcoder
|
||||||
|
|
||||||
|
requests.packages.urllib3.disable_warnings()
|
||||||
|
|
||||||
class autoProcessTV:
|
class autoProcessTV:
|
||||||
def command_complete(self, url, params, headers, section):
|
def command_complete(self, url, params, headers, section):
|
||||||
r = None
|
r = None
|
||||||
|
@ -104,6 +106,10 @@ class autoProcessTV:
|
||||||
force = int(core.CFG[section][inputCategory]["force"])
|
force = int(core.CFG[section][inputCategory]["force"])
|
||||||
except:
|
except:
|
||||||
force = 0
|
force = 0
|
||||||
|
try:
|
||||||
|
delete_on = int(core.CFG[section][inputCategory]["delete_on"])
|
||||||
|
except:
|
||||||
|
delete_on = 0
|
||||||
try:
|
try:
|
||||||
extract = int(section[inputCategory]["extract"])
|
extract = int(section[inputCategory]["extract"])
|
||||||
except:
|
except:
|
||||||
|
@ -211,6 +217,12 @@ class autoProcessTV:
|
||||||
else:
|
else:
|
||||||
del fork_params[param]
|
del fork_params[param]
|
||||||
|
|
||||||
|
if param == "delete_on":
|
||||||
|
if delete_on:
|
||||||
|
fork_params[param] = delete_on
|
||||||
|
else:
|
||||||
|
del fork_params[param]
|
||||||
|
|
||||||
# delete any unused params so we don't pass them to SB by mistake
|
# delete any unused params so we don't pass them to SB by mistake
|
||||||
[fork_params.pop(k) for k,v in fork_params.items() if v is None]
|
[fork_params.pop(k) for k,v in fork_params.items() if v is None]
|
||||||
|
|
||||||
|
@ -276,6 +288,8 @@ class autoProcessTV:
|
||||||
for line in r.iter_lines():
|
for line in r.iter_lines():
|
||||||
if line:
|
if line:
|
||||||
logger.postprocess("%s" % (line), section)
|
logger.postprocess("%s" % (line), section)
|
||||||
|
if "Moving file from" in line:
|
||||||
|
inputName = os.path.split(line)[1]
|
||||||
if "Processing succeeded" in line or "Successfully processed" in line:
|
if "Processing succeeded" in line or "Successfully processed" in line:
|
||||||
Success = True
|
Success = True
|
||||||
elif section == "NzbDrone":
|
elif section == "NzbDrone":
|
||||||
|
|
|
@ -798,6 +798,9 @@ def find_download(clientAgent, download_id):
|
||||||
if clientAgent == 'deluge':
|
if clientAgent == 'deluge':
|
||||||
return False
|
return False
|
||||||
if clientAgent == 'sabnzbd':
|
if clientAgent == 'sabnzbd':
|
||||||
|
if "http" in core.SABNZBDHOST:
|
||||||
|
baseURL = "%s:%s/api" % (core.SABNZBDHOST, core.SABNZBDPORT)
|
||||||
|
else:
|
||||||
baseURL = "http://%s:%s/api" % (core.SABNZBDHOST, core.SABNZBDPORT)
|
baseURL = "http://%s:%s/api" % (core.SABNZBDHOST, core.SABNZBDPORT)
|
||||||
url = baseURL
|
url = baseURL
|
||||||
params = {}
|
params = {}
|
||||||
|
@ -819,6 +822,9 @@ def find_download(clientAgent, download_id):
|
||||||
def get_nzoid(inputName):
|
def get_nzoid(inputName):
|
||||||
nzoid = None
|
nzoid = None
|
||||||
logger.debug("Searching for nzoid from SAbnzbd ...")
|
logger.debug("Searching for nzoid from SAbnzbd ...")
|
||||||
|
if "http" in core.SABNZBDHOST:
|
||||||
|
baseURL = "%s:%s/api" % (core.SABNZBDHOST, core.SABNZBDPORT)
|
||||||
|
else:
|
||||||
baseURL = "http://%s:%s/api" % (core.SABNZBDHOST, core.SABNZBDPORT)
|
baseURL = "http://%s:%s/api" % (core.SABNZBDHOST, core.SABNZBDPORT)
|
||||||
url = baseURL
|
url = baseURL
|
||||||
params = {}
|
params = {}
|
||||||
|
@ -1057,7 +1063,7 @@ def server_responding(baseURL):
|
||||||
|
|
||||||
def plex_update(category):
|
def plex_update(category):
|
||||||
if core.PLEXSSL:
|
if core.PLEXSSL:
|
||||||
ulr = 'https://'
|
url = 'https://'
|
||||||
else:
|
else:
|
||||||
url = 'http://'
|
url = 'http://'
|
||||||
url = url + core.PLEXHOST + ':' + core.PLEXPORT + '/library/sections/'
|
url = url + core.PLEXHOST + ':' + core.PLEXPORT + '/library/sections/'
|
||||||
|
|
|
@ -277,8 +277,6 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
audio_cmd.extend(['-c:a:' + str(used_audio), core.ACODEC])
|
audio_cmd.extend(['-c:a:' + str(used_audio), core.ACODEC])
|
||||||
else:
|
else:
|
||||||
audio_cmd.extend(['-c:a:' + str(used_audio), 'copy'])
|
audio_cmd.extend(['-c:a:' + str(used_audio), 'copy'])
|
||||||
if core.ACODEC == 'aac':
|
|
||||||
audio_cmd.extend(['-strict', '-2'])
|
|
||||||
elif audio3: # just pick the default audio track
|
elif audio3: # just pick the default audio track
|
||||||
map_cmd.extend(['-map', '0:' + str(audio3[0]["index"])])
|
map_cmd.extend(['-map', '0:' + str(audio3[0]["index"])])
|
||||||
a_mapped.extend([audio3[0]["index"]])
|
a_mapped.extend([audio3[0]["index"]])
|
||||||
|
@ -292,8 +290,6 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
audio_cmd.extend(['-c:a:' + str(used_audio), core.ACODEC])
|
audio_cmd.extend(['-c:a:' + str(used_audio), core.ACODEC])
|
||||||
else:
|
else:
|
||||||
audio_cmd.extend(['-c:a:' + str(used_audio), 'copy'])
|
audio_cmd.extend(['-c:a:' + str(used_audio), 'copy'])
|
||||||
if core.ACODEC == 'aac':
|
|
||||||
audio_cmd.extend(['-strict', '-2'])
|
|
||||||
|
|
||||||
if core.ACHANNELS and channels and channels > core.ACHANNELS:
|
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:' + str(used_audio), str(core.ACHANNELS)])
|
||||||
|
@ -307,6 +303,8 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
audio_cmd.extend(['-q:a:' + str(used_audio), str(core.OUTPUTQUALITYPERCENT)])
|
audio_cmd.extend(['-q:a:' + str(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] == 'aac':
|
||||||
|
audio_cmd[2:2] = ['-strict', '-2']
|
||||||
|
|
||||||
if core.ACODEC2_ALLOW:
|
if core.ACODEC2_ALLOW:
|
||||||
used_audio += 1
|
used_audio += 1
|
||||||
|
@ -334,8 +332,6 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
audio_cmd2.extend(['-c:a:' + str(used_audio), core.ACODEC2])
|
audio_cmd2.extend(['-c:a:' + str(used_audio), core.ACODEC2])
|
||||||
else:
|
else:
|
||||||
audio_cmd2.extend(['-c:a:' + str(used_audio), 'copy'])
|
audio_cmd2.extend(['-c:a:' + str(used_audio), 'copy'])
|
||||||
if core.ACODEC2 == 'aac':
|
|
||||||
audio_cmd2.extend(['-strict', '-2'])
|
|
||||||
elif audio3: # just pick the default audio track
|
elif audio3: # just pick the default audio track
|
||||||
map_cmd.extend(['-map', '0:' + str(audio3[0]["index"])])
|
map_cmd.extend(['-map', '0:' + str(audio3[0]["index"])])
|
||||||
a_mapped.extend([audio3[0]["index"]])
|
a_mapped.extend([audio3[0]["index"]])
|
||||||
|
@ -349,8 +345,6 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
audio_cmd2.extend(['-c:a:' + str(used_audio), core.ACODEC2])
|
audio_cmd2.extend(['-c:a:' + str(used_audio), core.ACODEC2])
|
||||||
else:
|
else:
|
||||||
audio_cmd2.extend(['-c:a:' + str(used_audio), 'copy'])
|
audio_cmd2.extend(['-c:a:' + str(used_audio), 'copy'])
|
||||||
if core.ACODEC2 == 'aac':
|
|
||||||
audio_cmd2.extend(['-strict', '-2'])
|
|
||||||
|
|
||||||
if core.ACHANNELS2 and channels and channels > core.ACHANNELS2:
|
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:' + str(used_audio), str(core.ACHANNELS2)])
|
||||||
|
@ -364,6 +358,8 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
audio_cmd2.extend(['-q:a:' + str(used_audio), str(core.OUTPUTQUALITYPERCENT)])
|
audio_cmd2.extend(['-q:a:' + str(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] == 'aac':
|
||||||
|
audio_cmd2[2:2] = ['-strict', '-2']
|
||||||
audio_cmd.extend(audio_cmd2)
|
audio_cmd.extend(audio_cmd2)
|
||||||
|
|
||||||
if core.AINCLUDE and audio3 and core.ACODEC3:
|
if core.AINCLUDE and audio3 and core.ACODEC3:
|
||||||
|
@ -386,8 +382,6 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
audio_cmd3.extend(['-c:a:' + str(used_audio), core.ACODEC3])
|
audio_cmd3.extend(['-c:a:' + str(used_audio), core.ACODEC3])
|
||||||
else:
|
else:
|
||||||
audio_cmd3.extend(['-c:a:' + str(used_audio), 'copy'])
|
audio_cmd3.extend(['-c:a:' + str(used_audio), 'copy'])
|
||||||
if core.ACODEC3 == 'aac':
|
|
||||||
audio_cmd3.extend(['-strict', '-2'])
|
|
||||||
|
|
||||||
if core.ACHANNELS3 and channels and channels > core.ACHANNELS3:
|
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:' + str(used_audio), str(core.ACHANNELS3)])
|
||||||
|
@ -401,6 +395,8 @@ def buildCommands(file, newDir, movieName, bitbucket):
|
||||||
audio_cmd3.extend(['-q:a:' + str(used_audio), str(core.OUTPUTQUALITYPERCENT)])
|
audio_cmd3.extend(['-q:a:' + str(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] == 'aac':
|
||||||
|
audio_cmd3[2:2] = ['-strict', '-2']
|
||||||
audio_cmd.extend(audio_cmd3)
|
audio_cmd.extend(audio_cmd3)
|
||||||
|
|
||||||
s_mapped = []
|
s_mapped = []
|
||||||
|
|
|
@ -95,7 +95,7 @@
|
||||||
# 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
|
#mediaExtensions=.mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg,.vob,.iso,.ts
|
||||||
|
|
||||||
## Posix
|
## Posix
|
||||||
|
|
||||||
|
|
|
@ -301,7 +301,7 @@
|
||||||
# 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
|
#mediaExtensions=.mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg,.vob,.iso,.ts
|
||||||
|
|
||||||
## Posix
|
## Posix
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,7 @@
|
||||||
# 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
|
#mediaExtensions=.mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg,.vob,.iso,.ts
|
||||||
|
|
||||||
## Posix
|
## Posix
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,7 @@
|
||||||
# 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
|
#mediaExtensions=.mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg,.vob,.iso,.ts
|
||||||
|
|
||||||
## Posix
|
## Posix
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue