check for change of missing episodes in NZBDrone. fixes #370 #366

This commit is contained in:
clinton-hall 2014-05-05 12:45:05 +09:30
commit bc3b3eb2c5
5 changed files with 59 additions and 5 deletions

View file

@ -90,6 +90,7 @@
# Enable/Disable linking for Torrents
Torrent_NoLink = 0
extract = 1
wait_for = 2
# Set this to minimum required size to consider a media file valid (in MB)
minSize = 0
# Enable/Disable deleteing ignored files (samples and invalid media files)

View file

@ -140,6 +140,11 @@
# set this if using a reverse proxy.
#ndweb_root=
# NzbDrone wait_for
#
# Set the number of minutes to wait after calling the renamer, to check the episode has changed status.
#ndwait_for=2
## HeadPhones
# HeadPhones script category.

View file

@ -45,6 +45,11 @@
# set this if using a reverse proxy.
#ndweb_root=
# NzbDrone wait_for
#
# Set the number of minutes to wait after calling the renamer, to check the episode has changed status.
#ndwait_for=2
## Extensions
# Media Extensions

View file

@ -11,6 +11,24 @@ from nzbtomedia import logger
from nzbtomedia.transcoder import transcoder
class autoProcessTV:
def numMissing(url1, params, headers):
r = None
try:
r = requests.get(url1, params=params, headers=headers, stream=True, verify=False)
except requests.ConnectionError:
logger.error("Unable to open URL: %s" % (url1), section)
missing = 0
if not r.status_code in [requests.codes.ok, requests.codes.created, requests.codes.accepted]:
logger.error("Server returned status %s" % (str(r.status_code)), section)
missing = 0
else:
try:
res = json.loads(r.content)
missing = int(res['totalRecords'])
except:
missing = 0
return missing
def processEpisode(self, section, dirName, inputName=None, failed=False, clientAgent = "manual", inputCategory=None):
# auto-detect correct fork
fork, fork_params = autoFork(section, inputCategory)
@ -133,6 +151,10 @@ class autoProcessTV:
url = "%s%s:%s%s/home/postprocess/processEpisode" % (protocol,host,port,web_root)
elif section == "NzbDrone":
url = "%s%s:%s%s/api/command" % (protocol, host, port, web_root)
url1 = url = "%s%s:%s%s/api/missing" % (protocol, host, port, web_root)
headers = {"X-Api-Key": apikey}
params = {'sortKey': 'series.title', 'page': 1, 'pageSize': 1, 'sortDir': 'asc'}
data = json.dumps({"name": "DownloadedEpisodesScan", "path": dirName})
logger.debug("Opening URL: %s" % (url),section)
@ -141,21 +163,21 @@ class autoProcessTV:
if section == "SickBeard":
r = requests.get(url, auth=(username, password), params=fork_params, stream=True, verify=False)
elif section == "NzbDrone":
data = json.dumps({"name": "DownloadedEpisodesScan", "path": dirName})
headers = {"X-Api-Key": apikey}
start_numMissing = numMissing(url1, params, headers) # get current number of outstanding eppisodes.
r = requests.post(url, data=data, headers=headers, stream=True, verify=False)
except requests.ConnectionError:
logger.error("Unable to open URL: %s" % (url), section)
return 1 # failure
Success = False
Started = False
for line in r.iter_lines():
if line:
logger.postprocess("%s" % (line), section)
if section == "SickBeard" and "Processing succeeded" in line:
Success = True
elif section == "NzbDrone" and "stateChangeTime" in line:
Success = True
Started = True
if status != 0 and delete_failed and not os.path.dirname(dirName) == dirName:
logger.postprocess("Deleting failed files and folder %s" % (dirName),section)
@ -166,5 +188,26 @@ class autoProcessTV:
return 1
elif Success:
return 0
elif section == "NzbDrone" and Started:
num_processed = 0
total_processed = 0
timeout = time.time() + 60 * wait_for
while (time.time() < timeout): # only wait 2 (default) minutes, then return.
current_numMissing = numMissing(url1, params, headers)
if current_numMissing < start_numMissing:
num_processed = start_numMissing - current_numMissing
if total_processed == num_processed: # we have gone another cycle without any more episodes being completed.
logger.postprocess("%s episodes processed successfully" % (str(total_processed)), section)
return 0
total_processed = num_processed # Set this up for next cycle to see if nay new episodes are completed.
timeout += 10 * wait_for # extend this loop while things are still changing.... multi episode download.
time.sleep(10 * wait_for)
# The status hasn't changed. we have waited 2 minutes which is more than enough. uTorrent can resume seeding now.
logger.warning(
"The number of missing episodes does not appear to have changed status after %s minutes, Please check your logs." % (str(wait_for)),
section)
return 1
else:
return 1 # We did not receive Success confirmation.

View file

@ -315,8 +315,8 @@ class ConfigObj(configobj.ConfigObj, Section):
section = "NzbDrone"
envCatKey = 'NZBPO_NDCATEGORY'
envKeys = ['ENABLED', 'HOST', 'APIKEY', 'PORT', 'USERNAME', 'PASSWORD', 'SSL', 'WEB_ROOT', 'WATCH_DIR', 'FORK', 'DELETE_FAILED', 'TORRENT_NOLINK', 'NZBEXTRACTIONBY']
cfgKeys = ['enabled', 'host', 'apikey', 'port', 'username', 'password', 'ssl', 'web_root', 'watch_dir', 'fork', 'delete_failed', 'Torrent_NoLink', 'nzbExtractionBy']
envKeys = ['ENABLED', 'HOST', 'APIKEY', 'PORT', 'USERNAME', 'PASSWORD', 'SSL', 'WEB_ROOT', 'WATCH_DIR', 'FORK', 'DELETE_FAILED', 'TORRENT_NOLINK', 'NZBEXTRACTIONBY', 'WAIT_FOR']
cfgKeys = ['enabled', 'host', 'apikey', 'port', 'username', 'password', 'ssl', 'web_root', 'watch_dir', 'fork', 'delete_failed', 'Torrent_NoLink', 'nzbExtractionBy', 'wait_for']
if os.environ.has_key(envCatKey):
for index in range(len(envKeys)):
key = 'NZBPO_ND' + envKeys[index]