mirror of
https://github.com/clinton-hall/nzbToMedia.git
synced 2025-07-16 02:02:53 -07:00
cleanup and fixes
- cleaned up logger messages - SIZE_CUTOFF moved to config - useLink changed to true/false (easier to understand) - removed which.py (included in extractor.py) - added a check in the extractor to support transmission (otherwise it will fail), but note that it will not be able to check if an command is executable
This commit is contained in:
parent
51226573f9
commit
f41b576967
5 changed files with 43 additions and 50 deletions
|
@ -125,7 +125,7 @@ def category_search(inputDirectory, inputName, inputCategory, root, categories):
|
|||
def is_sample(filePath, inputName):
|
||||
# 200 MB in bytes
|
||||
# Maybe let the users change this?
|
||||
SIZE_CUTOFF = 200 * 1024 * 1024
|
||||
SIZE_CUTOFF = minSampleSize * 1024 * 1024
|
||||
# Ignore 'sample' in files unless 'sample' in Torrent Name
|
||||
return ('sample' in filePath.lower()) and (not 'sample' in inputName) and (os.path.getsize(filePath) < SIZE_CUTOFF)
|
||||
|
||||
|
@ -168,7 +168,7 @@ def flatten(outputDestination):
|
|||
try:
|
||||
shutil.move(source, target)
|
||||
except OSError:
|
||||
Logger.info("FLATTEN: Could not flatten %s", source)
|
||||
Logger.error("FLATTEN: Could not flatten %s", source)
|
||||
removeEmptyFolders(outputDestination) # Cleanup empty directories
|
||||
|
||||
|
||||
|
@ -191,7 +191,7 @@ def removeEmptyFolders(path):
|
|||
Logger.debug("REMOVER: Removing empty folder: %s", path)
|
||||
os.rmdir(path)
|
||||
|
||||
|
||||
Logger.info("==========================") # Seperate old from new log
|
||||
Logger.info("TorrentToMedia %s", VERSION)
|
||||
config = ConfigParser.ConfigParser()
|
||||
configFilename = os.path.join(os.path.dirname(sys.argv[0]), "autoProcessMedia.cfg")
|
||||
|
@ -223,7 +223,8 @@ tvDestination = os.path.normpath(config.get("SickBeard", "outputDirectory"))
|
|||
movieCategory = config.get("CouchPotato", "category")
|
||||
movieDestination = os.path.normpath(config.get("CouchPotato", "outputDirectory"))
|
||||
# Torrent specific
|
||||
useLink = int(config.get("Torrent", "useLink"))
|
||||
useLink = config.get("Torrent", "useLink")
|
||||
minSampleSize = int(config.get("Torrent", "minSampleSize"))
|
||||
uTorrentWEBui = config.get("Torrent", "uTorrentWEBui")
|
||||
uTorrentUSR = config.get("Torrent", "uTorrentUSR")
|
||||
uTorrentPWD = config.get("Torrent", "uTorrentPWD")
|
||||
|
@ -234,10 +235,6 @@ categories = (config.get("Torrent", "categories")).split(',')
|
|||
categories.append(movieCategory)
|
||||
categories.append(tvCategory) # now have a list of all categories in use.
|
||||
|
||||
# setup uTorrentClass
|
||||
if inputHash:
|
||||
utorrentClass = UTorrentClient(uTorrentWEBui, uTorrentUSR, uTorrentPWD)
|
||||
|
||||
status = int(1) # We start as "failed" until we verify movie file in destination
|
||||
root = int(0)
|
||||
video = int(0)
|
||||
|
@ -282,7 +279,7 @@ for dirpath, dirnames, filenames in os.walk(inputDirectory):
|
|||
fileExtention = os.path.splitext(file)[1]
|
||||
if fileExtention in mediaContainer: # If the file is a video file
|
||||
if is_sample(filePath, inputName): # Ignore samples
|
||||
Logger.info("MAIN: Ignoring %s sample file. Ignoring", filePath)
|
||||
Logger.info("MAIN: Ignoring sample file: %s ", filePath)
|
||||
continue
|
||||
else:
|
||||
video = video + 1
|
||||
|
@ -291,7 +288,7 @@ for dirpath, dirnames, filenames in os.walk(inputDirectory):
|
|||
Logger.info("MAIN: Found video file %s in %s", fileExtention, filePath)
|
||||
state = copy_link(source, target, useLink, outputDestination)
|
||||
if state == False:
|
||||
Logger.info("MAIN: Failed to link file %s", file)
|
||||
Logger.error("MAIN: Failed to link file %s", file)
|
||||
failed_link = 1
|
||||
elif fileExtention in metaContainer:
|
||||
source = filePath
|
||||
|
@ -299,7 +296,7 @@ for dirpath, dirnames, filenames in os.walk(inputDirectory):
|
|||
Logger.info("MAIN: Found metadata file %s for file %s", fileExtention, filePath)
|
||||
state = copy_link(source, target, useLink, outputDestination)
|
||||
if state == False:
|
||||
Logger.info("MAIN: Failed to link file %s", file)
|
||||
Logger.error("MAIN: Failed to link file %s", file)
|
||||
failed_link = 1
|
||||
elif fileExtention in compressedContainer:
|
||||
Logger.info("MAIN: Found compressed archive %s for file %s", fileExtention, filePath)
|
||||
|
@ -310,7 +307,7 @@ for dirpath, dirnames, filenames in os.walk(inputDirectory):
|
|||
except:
|
||||
Logger.warn("Extraction failed for %s", file)
|
||||
else:
|
||||
Logger.info("MAIN: Ignoring unknown filetype %s for file %s", fileExtention, filePath)
|
||||
Logger.debug("MAIN: Ignoring unknown filetype %s for file %s", fileExtention, filePath)
|
||||
continue
|
||||
flatten(outputDestination)
|
||||
|
||||
|
@ -321,7 +318,7 @@ for dirpath, dirnames, filenames in os.walk(outputDestination):
|
|||
fileExtention = os.path.splitext(file)[1]
|
||||
if fileExtention in mediaContainer: # If the file is a video file
|
||||
if is_sample(filePath, inputName):
|
||||
Logger.info("file %s is a sample file. Removing", filePath)
|
||||
Logger.debug("Removing sample file: %s", filePath)
|
||||
os.unlink(filePath) # remove samples
|
||||
else:
|
||||
videofile = filePath
|
||||
|
@ -329,42 +326,47 @@ for dirpath, dirnames, filenames in os.walk(outputDestination):
|
|||
if video2 >= video and video2 > 0: # Check that all video files were moved
|
||||
status = 0
|
||||
|
||||
status = int(status) # just to be safe.
|
||||
if status == 0:
|
||||
if status == 0: #### Maybe we should move this to a more appropriate place?
|
||||
Logger.info("MAIN: Successful run")
|
||||
Logger.debug("MAIN: Calling autoProcess script for successful download.")
|
||||
elif failed_extract == 1 and failed_link == 0: # failed to extract files only.
|
||||
Logger.info("MAIN: Failed to extract a packed file.")
|
||||
Logger.info("MAIN: Failed to extract a compressed archive")
|
||||
Logger.debug("MAIN: Assume this to be password protected file.")
|
||||
Logger.debug("MAIN: Calling autoProcess script for failed download.")
|
||||
else:
|
||||
Logger.info("MAIN: Something failed! Please check logs. Exiting")
|
||||
Logger.error("MAIN: Something failed! Please check logs. Exiting")
|
||||
sys.exit(-1)
|
||||
|
||||
# Hardlink solution with uTorrent
|
||||
if inputHash and useLink:
|
||||
Logger.debug("MAIN: We are using hardlinks with uTorrent, calling uTorrent to pause download")
|
||||
try:
|
||||
Logger.debug("Connecting to uTorrent: %s", uTorrentWEBui)
|
||||
utorrentClass = UTorrentClient(uTorrentWEBui, uTorrentUSR, uTorrentPWD)
|
||||
except:
|
||||
Logger.error("Failed to connect to uTorrent")
|
||||
Logger.debug("MAIN: Stoping torrent %s in uTorrent while processing", inputName)
|
||||
utorrentClass.stop(inputHash)
|
||||
time.sleep(5) # Give uTorrent some time to catch up with the change
|
||||
|
||||
# Now we pass off to CouchPotato or Sick-Beard
|
||||
if inputCategory == movieCategory:
|
||||
Logger.info("MAIN: Calling postprocessing script for CouchPotatoServer") # can we use logger while logfile open?
|
||||
Logger.info("MAIN: Calling CouchPotatoServer to post-process: %s", inputName) # can we use logger while logfile open?
|
||||
autoProcessMovie.process(outputDestination, inputName, status)
|
||||
elif inputCategory == tvCategory:
|
||||
Logger.info("MAIN: Calling postprocessing script for Sick-Beard") # can we use logger while logfile open?
|
||||
Logger.info("MAIN: Calling Sick-Beard to post-process: %s", inputName) # can we use logger while logfile open?
|
||||
autoProcessTV.processEpisode(outputDestination, inputName, status)
|
||||
|
||||
# Check if the file still exists in the post-process directory
|
||||
now = datetime.datetime.now() # set time for timeout
|
||||
while os.path.exists(videofile): # while this file is still here, CPS hasn't finished renaming
|
||||
if (datetime.datetime.now() - now) > datetime.timedelta(minutes=3): # note; minimum 1 minute delay in autoProcessMovie
|
||||
Logger.info("MAIN: The file %s has not been moved after 3 minutes.")
|
||||
Logger.info("MAIN: The file %s has not been moved after 3 minutes.", videofile)
|
||||
break
|
||||
time.sleep(10) #Just stop this looping infinitely and hogging resources for 3 minutes ;)
|
||||
else: # CPS (and SickBeard) have finished. We can now resume seeding.
|
||||
Logger.info("MAIN: The file %s has been moved. Postprocessing appears to have succeeded." % videofile)
|
||||
Logger.info("MAIN: Post-process appears to have succeeded for: %s", videofile)
|
||||
|
||||
# Hardlink solution with uTorrent
|
||||
if inputHash and useLink:
|
||||
Logger.debug("MAIN: We are using hardlinks with uTorrent, calling uTorrent to resume download")
|
||||
Logger.debug("MAIN: Starting torrent %s in uTorrent", inputName)
|
||||
utorrentClass.start(inputHash)
|
||||
|
|
|
@ -28,10 +28,14 @@ watch_dir=
|
|||
failed_fork=0
|
||||
|
||||
[Torrent]
|
||||
# Set to whatever torrent client you use.
|
||||
# Supported values: utorrent, transmission, deluge, other
|
||||
###### Set to whatever torrent client you use.
|
||||
###### Supported values: utorrent, transmission, deluge, other
|
||||
clientAgent = other
|
||||
useLink = 0
|
||||
###### useLink - Set to true or false depending on if you want to use hardlinks
|
||||
useLink = false
|
||||
###### minSampleSize - Minimum required size to consider a file not an sample file (in MB, eg 200mb)
|
||||
minSampleSize = 200
|
||||
###### **insert descriptive comment for categories here** :-)
|
||||
categories = music,music_videos,pictures,software
|
||||
###### uTorrent Hardlink solution (You must edit this if your using TorrentToMedia.py with uTorrent)
|
||||
uTorrentWEBui = http://localhost:8090/gui/
|
||||
|
|
|
@ -73,12 +73,16 @@ def extract(dirpath, file, outputDestination):
|
|||
".7z": ["7zr", "x"],
|
||||
}
|
||||
# Test command exists and if not, remove
|
||||
for cmd in required_cmds:
|
||||
if call(['which', cmd]): #note, returns 0 if exists, or 1 if doesn't exist.
|
||||
for k, v in EXTRACT_COMMANDS.items():
|
||||
if cmd in v[0]:
|
||||
Logger.error("EXTRACTOR: %s not found, disabling support for %s", cmd, k)
|
||||
del EXTRACT_COMMANDS[k]
|
||||
if not os.getenv('TR_TORRENT_DIR'):
|
||||
for cmd in required_cmds:
|
||||
if call(['which', cmd]): #note, returns 0 if exists, or 1 if doesn't exist.
|
||||
for k, v in EXTRACT_COMMANDS.items():
|
||||
if cmd in v[0]:
|
||||
Logger.error("EXTRACTOR: %s not found, disabling support for %s", cmd, k)
|
||||
del EXTRACT_COMMANDS[k]
|
||||
else:
|
||||
Logger.warn("EXTRACTOR: Cannot determine which tool to use when called from Transmission")
|
||||
|
||||
if not EXTRACT_COMMANDS:
|
||||
Logger.warn("EXTRACTOR: No archive extracting programs found, plugin will be disabled")
|
||||
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
def which(program):
|
||||
# Author Credit: Jay @ http://stackoverflow.com/a/377028
|
||||
import os
|
||||
def is_exe(fpath):
|
||||
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
|
||||
|
||||
fpath, fname = os.path.split(program)
|
||||
if fpath:
|
||||
if is_exe(program):
|
||||
return program
|
||||
else:
|
||||
for path in os.environ["PATH"].split(os.pathsep):
|
||||
exe_file = os.path.join(path, program)
|
||||
if is_exe(exe_file):
|
||||
return exe_file
|
||||
|
||||
return None
|
|
@ -36,6 +36,6 @@ elif len(sys.argv) == 4:
|
|||
autoProcessMovie.process(sys.argv[1], sys.argv[2], sys.argv[3])
|
||||
|
||||
else:
|
||||
Logger.debug("Invalid number of arguments received from client.")
|
||||
Logger.warn("Invalid number of arguments received from client.")
|
||||
Logger.info("Running autoProcessMovie as a manual run...")
|
||||
autoProcessMovie.process('Manual Run', 'Manual Run', 0)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue