Moved option force_clean from Torrent section into General section.

Moved cleanup function from TorrentToMedia into nzbToMediaUtils.

Folder cleanup is performed automatically after a successful postprocess for both nzb and torrent processing scripts.
This commit is contained in:
echel0n 2014-04-12 11:10:28 -07:00
commit 2fbc987e6f
5 changed files with 51 additions and 44 deletions

View file

@ -15,7 +15,7 @@ from nzbtomedia.autoProcess.autoProcessMusic import autoProcessMusic
from nzbtomedia.autoProcess.autoProcessTV import autoProcessTV from nzbtomedia.autoProcess.autoProcessTV import autoProcessTV
from nzbtomedia.extractor import extractor from nzbtomedia.extractor import extractor
from nzbtomedia.nzbToMediaUtil import category_search, safeName, is_sample, copy_link, parse_args, flatten, get_dirnames, \ from nzbtomedia.nzbToMediaUtil import category_search, safeName, is_sample, copy_link, parse_args, flatten, get_dirnames, \
remove_read_only remove_read_only, cleanup_directories
from nzbtomedia.synchronousdeluge.client import DelugeClient from nzbtomedia.synchronousdeluge.client import DelugeClient
from nzbtomedia.utorrent.client import UTorrentClient from nzbtomedia.utorrent.client import UTorrentClient
from nzbtomedia.transmissionrpc.client import Client as TransmissionClient from nzbtomedia.transmissionrpc.client import Client as TransmissionClient
@ -54,9 +54,8 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID)
if result != 0: if result != 0:
logger.error("A problem was reported in the autoProcessTV script.") logger.error("A problem was reported in the autoProcessTV script.")
resume_torrent(nzbtomedia.CLIENTAGENT, TorrentClass, inputHash, inputID, result, inputName) resume_torrent(nzbtomedia.CLIENTAGENT, TorrentClass, inputHash, inputID, result, inputName)
cleanup_output(inputCategory, processCategories, result, outputDestination) cleanup_directories(inputCategory, processCategories, result, outputDestination)
logger.postprocess("All done.") return result
sys.exit()
processOnly = nzbtomedia.CFG[nzbtomedia.SECTIONS].sections processOnly = nzbtomedia.CFG[nzbtomedia.SECTIONS].sections
if not "NONE" in nzbtomedia.USER_SCRIPT_CATEGORIES: # if None, we only process the 5 listed. if not "NONE" in nzbtomedia.USER_SCRIPT_CATEGORIES: # if None, we only process the 5 listed.
@ -66,8 +65,7 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID)
if not inputCategory in processOnly: if not inputCategory in processOnly:
logger.postprocess("No processing to be done for category: %s. Exiting", inputCategory) logger.postprocess("No processing to be done for category: %s. Exiting", inputCategory)
logger.postprocess("All done.") return
sys.exit()
logger.debug("Scanning files in directory: %s", inputDirectory) logger.debug("Scanning files in directory: %s", inputDirectory)
@ -182,7 +180,7 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID)
status = int(0) # hp, my, gz don't support failed. status = int(0) # hp, my, gz don't support failed.
else: else:
logger.error("Something failed! Please check logs. Exiting") logger.error("Something failed! Please check logs. Exiting")
sys.exit(-1) return status
result = 0 result = 0
if nzbtomedia.CFG['CouchPotato'][inputCategory]: if nzbtomedia.CFG['CouchPotato'][inputCategory]:
@ -209,7 +207,7 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID)
logger.error("A problem was reported in the autoProcess* script. If torrent was paused we will resume seeding") logger.error("A problem was reported in the autoProcess* script. If torrent was paused we will resume seeding")
resume_torrent(nzbtomedia.CLIENTAGENT, TorrentClass, inputHash, inputID, result, inputName) resume_torrent(nzbtomedia.CLIENTAGENT, TorrentClass, inputHash, inputID, result, inputName)
cleanup_output(inputCategory, processCategories, result, outputDestination) cleanup_directories(inputCategory, processCategories, result, outputDestination)
return result return result
def create_torrent_class(clientAgent, inputHash): def create_torrent_class(clientAgent, inputHash):
@ -278,25 +276,6 @@ def resume_torrent(clientAgent, TorrentClass, inputHash, inputID, result, inputN
TorrentClass.core.resume_torrent([inputID]) TorrentClass.core.resume_torrent([inputID])
time.sleep(5) time.sleep(5)
def cleanup_output(inputCategory, processCategories, result, outputDestination):
if inputCategory in processCategories and result == 0 and os.path.isdir(outputDestination):
num_files_new = int(0)
file_list = []
for dirpath, dirnames, filenames in os.walk(outputDestination):
for file in filenames:
filePath = os.path.join(dirpath, file)
fileName, fileExtension = os.path.splitext(file)
if fileExtension in nzbtomedia.MEDIACONTAINER or fileExtension in nzbtomedia.METACONTAINER:
num_files_new += 1
file_list.append(file)
if num_files_new is 0 or int(nzbtomedia.CFG["Torrent"]["forceClean"]) is 1:
logger.postprocess("All files have been processed. Cleaning outputDirectory %s", outputDestination)
shutil.rmtree(outputDestination)
else:
logger.postprocess("outputDirectory %s still contains %s media and/or meta files. This directory will not be removed.", outputDestination, num_files_new)
for item in file_list:
logger.debug("media/meta file found: %s", item)
def external_script(outputDestination, torrentName, torrentLabel): def external_script(outputDestination, torrentName, torrentLabel):
final_result = int(0) # start at 0. final_result = int(0) # start at 0.
@ -388,7 +367,7 @@ def main():
inputDirectory, inputName, inputCategory, inputHash, inputID = parse_args(nzbtomedia.CLIENTAGENT) inputDirectory, inputName, inputCategory, inputHash, inputID = parse_args(nzbtomedia.CLIENTAGENT)
except: except:
logger.error("There was a problem loading variables") logger.error("There was a problem loading variables")
sys.exit(-1) return -1
# check if this is a manual run # check if this is a manual run
if inputDirectory is None: if inputDirectory is None:

View file

@ -6,6 +6,7 @@
git_path = git_path =
git_user = git_user =
git_branch = git_branch =
force_clean = 0
[CouchPotato] [CouchPotato]
#### autoProcessing for Movies #### autoProcessing for Movies
@ -137,7 +138,6 @@
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
forceClean = 0
[Extensions] [Extensions]
compressedExtensions = .zip,.rar,.7z,.gz,.bz,.tar,.arj,.1,.01,.001 compressedExtensions = .zip,.rar,.7z,.gz,.bz,.tar,.arj,.1,.01,.001

View file

@ -307,31 +307,39 @@ from nzbtomedia.autoProcess.autoProcessGames import autoProcessGames
from nzbtomedia.autoProcess.autoProcessMovie import autoProcessMovie from nzbtomedia.autoProcess.autoProcessMovie import autoProcessMovie
from nzbtomedia.autoProcess.autoProcessMusic import autoProcessMusic from nzbtomedia.autoProcess.autoProcessMusic import autoProcessMusic
from nzbtomedia.autoProcess.autoProcessTV import autoProcessTV from nzbtomedia.autoProcess.autoProcessTV import autoProcessTV
from nzbtomedia.nzbToMediaUtil import get_dirnames from nzbtomedia.nzbToMediaUtil import get_dirnames, cleanup_directories
from nzbtomedia import logger from nzbtomedia import logger
# post-processing # post-processing
def process(nzbDir, inputName=None, status=0, clientAgent='manual', download_id=None, inputCategory=None): def process(nzbDir, inputName=None, status=0, clientAgent='manual', download_id=None, inputCategory=None):
# auto-detect section
section = nzbtomedia.CFG.findsection(inputCategory)
if nzbtomedia.CFG["CouchPotato"][inputCategory]: if nzbtomedia.CFG["CouchPotato"][inputCategory]:
logger.postprocess("Calling CouchPotatoServer to post-process: %s", inputName) logger.postprocess("Calling CouchPotatoServer to post-process: %s", inputName)
return autoProcessMovie().process(nzbDir, inputName, status, clientAgent, download_id, inputCategory) result = autoProcessMovie().process(nzbDir, inputName, status, clientAgent, download_id, inputCategory)
elif nzbtomedia.CFG["SickBeard", "NzbDrone"][inputCategory]: elif nzbtomedia.CFG["SickBeard", "NzbDrone"][inputCategory]:
logger.postprocess("Calling Sick-Beard to post-process: %s", inputName) logger.postprocess("Calling Sick-Beard to post-process: %s", inputName)
return autoProcessTV().processEpisode(nzbDir, inputName, status, clientAgent, inputCategory) result = autoProcessTV().processEpisode(nzbDir, inputName, status, clientAgent, inputCategory)
elif nzbtomedia.CFG["HeadPhones"][inputCategory]: elif nzbtomedia.CFG["HeadPhones"][inputCategory]:
logger.postprocess("Calling HeadPhones to post-process: %s", inputName) logger.postprocess("Calling HeadPhones to post-process: %s", inputName)
return autoProcessMusic().process(nzbDir, inputName, status, clientAgent, inputCategory) result = autoProcessMusic().process(nzbDir, inputName, status, clientAgent, inputCategory)
elif nzbtomedia.CFG["Mylar"][inputCategory]: elif nzbtomedia.CFG["Mylar"][inputCategory]:
logger.postprocess("Calling Mylar to post-process: %s", inputName) logger.postprocess("Calling Mylar to post-process: %s", inputName)
return autoProcessComics().processEpisode(nzbDir, inputName, status, clientAgent, inputCategory) result = autoProcessComics().processEpisode(nzbDir, inputName, status, clientAgent, inputCategory)
elif nzbtomedia.CFG["Gamez"][inputCategory]: elif nzbtomedia.CFG["Gamez"][inputCategory]:
logger.postprocess("Calling Gamez to post-process: %s", inputName) logger.postprocess("Calling Gamez to post-process: %s", inputName)
return autoProcessGames().process(nzbDir, inputName, status, clientAgent, inputCategory) result = autoProcessGames().process(nzbDir, inputName, status, clientAgent, inputCategory)
else: else:
logger.postprocess("We could not find a section with the download category of %s in your autoProcessMedia.cfg. Exiting.", inputCategory) logger.postprocess("We could not find a section with the download category of %s in your autoProcessMedia.cfg. Exiting.", inputCategory)
return -1 return -1
if result == 0:
# Clean up any leftover files
cleanup_directories(inputCategory, section, result, nzbDir)
return result
def main(): def main():
# Initialize the config # Initialize the config
nzbtomedia.initialize() nzbtomedia.initialize()
@ -432,21 +440,21 @@ def main():
logger.postprocess("nzbToMedia running %s:%s as a manual run on folder %s ...", section, category, dirName) logger.postprocess("nzbToMedia running %s:%s as a manual run on folder %s ...", section, category, dirName)
results = process(dirName, os.path.basename(dirName), 0, inputCategory=category) results = process(dirName, os.path.basename(dirName), 0, inputCategory=category)
if results != 0: if results != 0:
result = results
logger.error("A problem was reported when trying to manually run %s:%s.", section, category) logger.error("A problem was reported when trying to manually run %s:%s.", section, category)
result = results
else: else:
logger.postprocess("nzbToMedia %s:%s is DISABLED, you can enable this in autoProcessMedia.cfg ...", section, category) logger.postprocess("nzbToMedia %s:%s is DISABLED, you can enable this in autoProcessMedia.cfg ...", section, category)
if result == 0: if result == 0:
logger.postprocess("The nzbToMedia script completed successfully.") logger.postprocess("The nzbToMedia script completed successfully.")
if os.environ.has_key('NZBOP_SCRIPTDIR'): # return code for nzbget v11 if os.environ.has_key('NZBOP_SCRIPTDIR'): # return code for nzbget v11
sys.exit(nzbtomedia.NZBGET_POSTPROCESS_SUCCESS) return nzbtomedia.NZBGET_POSTPROCESS_SUCCESS
else: else:
logger.error("A problem was reported in the nzbToMedia script.") logger.error("A problem was reported in the nzbToMedia script.")
if os.environ.has_key('NZBOP_SCRIPTDIR'): # return code for nzbget v11 if os.environ.has_key('NZBOP_SCRIPTDIR'): # return code for nzbget v11
sys.exit(nzbtomedia.NZBGET_POSTPROCESS_ERROR) return nzbtomedia.NZBGET_POSTPROCESS_ERROR
return result return result
if __name__ == '__main__': if __name__ == '__main__':
exit(main()) exit(main())

View file

@ -143,25 +143,28 @@ class ConfigObj(lib.configobj.ConfigObj, Section):
value = 'hard' value = 'hard'
else: else:
value = 'no' value = 'no'
if option == "forceClean":
CFG_NEW['General']['force_clean'] = value
values.pop(option)
return values return values
def process_section(section, subsections=None): def process_section(section, subsections=None):
if subsections: if subsections:
for subsection in subsections: for subsection in subsections:
if subsection in CFG_OLD.sections: if subsection in CFG_OLD.sections:
values = CFG_OLD[subsection] values = cleanup_values(CFG_OLD[subsection], section)
if subsection not in CFG_NEW[section].sections: if subsection not in CFG_NEW[section].sections:
CFG_NEW[section][subsection] = {} CFG_NEW[section][subsection] = {}
for option, value in values.items(): for option, value in values.items():
CFG_NEW[section][subsection][option] = value CFG_NEW[section][subsection][option] = value
elif subsection in CFG_OLD[section].sections: elif subsection in CFG_OLD[section].sections:
values = CFG_OLD[section][subsection] values = cleanup_values(CFG_OLD[section][subsection], section)
if subsection not in CFG_NEW[section].sections: if subsection not in CFG_NEW[section].sections:
CFG_NEW[section][subsection] = {} CFG_NEW[section][subsection] = {}
for option, value in values.items(): for option, value in values.items():
CFG_NEW[section][subsection][option] = value CFG_NEW[section][subsection][option] = value
else: else:
values = CFG_OLD[section] values = cleanup_values(CFG_OLD[section], section)
if section not in CFG_NEW.sections: if section not in CFG_NEW.sections:
CFG_NEW[section] = {} CFG_NEW[section] = {}
for option, value in values.items(): for option, value in values.items():
@ -174,11 +177,9 @@ class ConfigObj(lib.configobj.ConfigObj, Section):
subsection = section subsection = section
section = ''.join([k for k,v in subsections.iteritems() if subsection in v]) section = ''.join([k for k,v in subsections.iteritems() if subsection in v])
process_section(section, subsection) process_section(section, subsection)
#[[v.remove(c) for c in v if c in subsection] for k, v in subsections.items() if k == section]
elif section in subsections.keys(): elif section in subsections.keys():
subsection = subsections[section] subsection = subsections[section]
process_section(section, subsection) process_section(section, subsection)
#[[v.remove(c) for c in v if c in subsection] for k,v in subsections.items() if k == section]
elif section in CFG_OLD.keys(): elif section in CFG_OLD.keys():
process_section(section, subsection) process_section(section, subsection)

View file

@ -424,3 +424,22 @@ def delete(dirName):
shutil.rmtree(dirName, True) shutil.rmtree(dirName, True)
except: except:
logger.error("Unable to delete folder %s", dirName) logger.error("Unable to delete folder %s", dirName)
def cleanup_directories(inputCategory, processCategories, result, directory):
if inputCategory in processCategories and result == 0 and os.path.isdir(directory):
num_files_new = int(0)
file_list = []
for dirpath, dirnames, filenames in os.walk(directory):
for file in filenames:
filePath = os.path.join(dirpath, file)
fileName, fileExtension = os.path.splitext(file)
if fileExtension in nzbtomedia.MEDIACONTAINER or fileExtension in nzbtomedia.METACONTAINER:
num_files_new += 1
file_list.append(file)
if num_files_new is 0 or int(nzbtomedia.CFG["General"]["force_clean"]) == 1:
logger.info("All files have been processed. Cleaning directory %s", directory)
shutil.rmtree(directory)
else:
logger.info("Directory %s still contains %s media and/or meta files. This directory will not be removed.", directory, num_files_new)
for item in file_list:
logger.debug("media/meta file found: %s", item)