diff --git a/autoProcessMedia.cfg.spec b/autoProcessMedia.cfg.spec index 7e172a67..e9e0f47a 100644 --- a/autoProcessMedia.cfg.spec +++ b/autoProcessMedia.cfg.spec @@ -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) diff --git a/nzbToMedia.py b/nzbToMedia.py index 01c941c9..44ec7c25 100755 --- a/nzbToMedia.py +++ b/nzbToMedia.py @@ -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. diff --git a/nzbToNzbDrone.py b/nzbToNzbDrone.py index 40f4bc6c..eaff3c47 100755 --- a/nzbToNzbDrone.py +++ b/nzbToNzbDrone.py @@ -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 diff --git a/nzbtomedia/autoProcess/autoProcessTV.py b/nzbtomedia/autoProcess/autoProcessTV.py index 8ab64a41..e31114f7 100644 --- a/nzbtomedia/autoProcess/autoProcessTV.py +++ b/nzbtomedia/autoProcess/autoProcessTV.py @@ -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. diff --git a/nzbtomedia/nzbToMediaConfig.py b/nzbtomedia/nzbToMediaConfig.py index 02b94ece..0f275f48 100644 --- a/nzbtomedia/nzbToMediaConfig.py +++ b/nzbtomedia/nzbToMediaConfig.py @@ -316,8 +316,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]