Improved code in Transcoder class.

Video files are now checked for corruption befoer being sent for post-processing by either SickBeard, NzbDrone, or CouchPotato.

Added ffmpeg_path option to Transcoder section allowing end-user to set where there ffmpeg is located.
This commit is contained in:
echel0n 2014-04-19 16:50:29 -07:00
commit b8ebf0cb64
6 changed files with 193 additions and 128 deletions

View file

@ -9,6 +9,7 @@ import nzbtomedia
import platform
from subprocess import Popen
from nzbtomedia.Transcoder import Transcoder
from nzbtomedia.autoProcess.autoProcessComics import autoProcessComics
from nzbtomedia.autoProcess.autoProcessGames import autoProcessGames
from nzbtomedia.autoProcess.autoProcessMovie import autoProcessMovie
@ -16,7 +17,7 @@ from nzbtomedia.autoProcess.autoProcessMusic import autoProcessMusic
from nzbtomedia.autoProcess.autoProcessTV import autoProcessTV
from nzbtomedia.extractor import extractor
from nzbtomedia.nzbToMediaUtil import category_search, sanitizeFileName, is_sample, copy_link, parse_args, flatten, get_dirnames, \
remove_read_only, cleanup_directories, create_torrent_class, pause_torrent, resume_torrent
remove_read_only, cleanup_directories, create_torrent_class, pause_torrent, resume_torrent, listMediaFiles
from nzbtomedia import logger
def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID, clientAgent):
@ -49,8 +50,14 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
if nzbtomedia.CFG["SickBeard"][inputCategory]:
Torrent_NoLink = int(nzbtomedia.CFG["SickBeard"][inputCategory]["Torrent_NoLink"]) # 0
if Torrent_NoLink == 1:
status = 0
# Check video files for corruption
for video in listMediaFiles(inputDirectory):
if not nzbtomedia.FFPROBE and Transcoder().isVideoGood(video):
status = 1
logger.info("Calling autoProcessTV to post-process: %s",inputName)
result = autoProcessTV().processEpisode(inputDirectory, inputName, 0, clientAgent=clientAgent, inputCategory=inputCategory)
result = autoProcessTV().processEpisode(inputDirectory, inputName, status, clientAgent=clientAgent, inputCategory=inputCategory)
if result != 0:
logger.error("A problem was reported in the autoProcessTV script.")
@ -187,10 +194,20 @@ def processTorrent(inputDirectory, inputName, inputCategory, inputHash, inputID,
result = 0
if nzbtomedia.CFG['CouchPotato'][inputCategory]:
# Check video files for corruption
for video in listMediaFiles(inputDirectory):
if not nzbtomedia.FFPROBE and Transcoder().isVideoGood(video):
status = 1
logger.info("Calling CouchPotato:" + inputCategory + " to post-process: %s" % (inputName))
download_id = inputHash
result = autoProcessMovie().process(outputDestination, inputName, status, clientAgent, download_id, inputCategory)
elif nzbtomedia.CFG['SickBeard'][inputCategory]:
# Check video files for corruption
for video in listMediaFiles(inputDirectory):
if not nzbtomedia.FFPROBE and Transcoder().isVideoGood(video):
status = 1
logger.info("Calling Sick-Beard:" + inputCategory + " to post-process: %s" % (inputName))
result = autoProcessTV().processEpisode(outputDestination, inputName, status, clientAgent, inputCategory)
elif nzbtomedia.CFG['NzbDrone'][inputCategory]:

View file

@ -169,6 +169,8 @@
[Transcoder]
transcode = 0
# Set ffmpeg_path to the location where ffmpeg is located
ffmpeg_path =
###### duplicate =1 will cretae a new file. =0 will replace the original
duplicate = 1
# Only works on Linux. Highest priority is -20, lowest priority is 19.

View file

@ -276,18 +276,17 @@
import os
import sys
import nzbtomedia
from nzbtomedia.Transcoder import Transcoder
from nzbtomedia.autoProcess.autoProcessComics import autoProcessComics
from nzbtomedia.autoProcess.autoProcessGames import autoProcessGames
from nzbtomedia.autoProcess.autoProcessMovie import autoProcessMovie
from nzbtomedia.autoProcess.autoProcessMusic import autoProcessMusic
from nzbtomedia.autoProcess.autoProcessTV import autoProcessTV
from nzbtomedia.nzbToMediaUtil import get_dirnames, cleanup_directories
from nzbtomedia.nzbToMediaUtil import get_dirnames, cleanup_directories, listMediaFiles
from nzbtomedia import logger
# post-processing
def process(nzbDir, inputName=None, status=0, clientAgent='manual', download_id=None, inputCategory=None):
result = 0
# auto-detect section
section = nzbtomedia.CFG.findsection(inputCategory)
if section:
@ -296,8 +295,16 @@ def process(nzbDir, inputName=None, status=0, clientAgent='manual', download_id=
logger.error("We could not find a section with containing a download category labeled %s in your autoProcessMedia.cfg, Exiting!" % inputCategory)
if nzbtomedia.CFG["CouchPotato"][inputCategory]:
# Check video files for corruption
for video in listMediaFiles(nzbDir):
if not nzbtomedia.FFPROBE and Transcoder().isVideoGood(video):
status = 1
result = autoProcessMovie().process(nzbDir, inputName, status, clientAgent, download_id, inputCategory)
elif nzbtomedia.CFG["SickBeard", "NzbDrone"][inputCategory]:
# Check video files for corruption
for video in listMediaFiles(nzbDir):
if not nzbtomedia.FFPROBE and Transcoder().isVideoGood(video):
status = 1
result = autoProcessTV().processEpisode(nzbDir, inputName, status, clientAgent, inputCategory)
elif nzbtomedia.CFG["HeadPhones"][inputCategory]:
result = autoProcessMusic().process(nzbDir, inputName, status, clientAgent, inputCategory)
@ -305,6 +312,8 @@ def process(nzbDir, inputName=None, status=0, clientAgent='manual', download_id=
result = autoProcessComics().processEpisode(nzbDir, inputName, status, clientAgent, inputCategory)
elif nzbtomedia.CFG["Gamez"][inputCategory]:
result = autoProcessGames().process(nzbDir, inputName, status, clientAgent, inputCategory)
else:
result = -1
if result == 0:
# Clean up any leftover files

View file

@ -1,121 +1,120 @@
import errno
import os
import sys
import platform
import nzbtomedia
from subprocess import call
from subprocess import call, Popen
from lib import guessit
from nzbtomedia import logger
from nzbToMediaUtil import listMediaFiles
class Transcoder:
def Transcode_directory(self, dirName):
if os.name == 'nt':
ffmpeg = os.path.join(os.path.dirname(sys.argv[0]), 'ffmpeg\\bin\\ffmpeg.exe') # note, will need to package in this dir.
useNiceness = False
if not os.path.isfile(ffmpeg): # problem
logger.error("ffmpeg not found. ffmpeg needs to be located at: %s" % (ffmpeg))
logger.info("Cannot transcode files in folder %s" % (dirName))
return 1 # failure
def isVideoGood(self, videofile):
if platform.system() == 'Windows':
bitbucket = open('NUL')
else:
if call(['which', 'ffmpeg']) != 0:
res = call([os.path.join(os.path.dirname(sys.argv[0]),'getffmpeg.sh')])
if res or call(['which', 'ffmpeg']) != 0: # did not install or ffmpeg still not found.
logger.error("Failed to install ffmpeg. Please install manually")
logger.info("Cannot transcode files in folder %s" % (dirName))
return 1 # failure
else:
ffmpeg = 'ffmpeg'
else:
ffmpeg = 'ffmpeg'
useNiceness = True
bitbucket = open('/dev/null')
niceness = None
if useNiceness:niceness = nzbtomedia.NICENESS
command = [nzbtomedia.FFPROBE, videofile]
try:
logger.info('Checking if %s has any corruption, please stand by ...' % (videofile))
result = call(command, stdout=bitbucket, stderr=bitbucket)
except:
logger.error("Checking video %s for corruption has failed" % (videofile))
return False
map(lambda ext: ext.strip(), nzbtomedia.MEDIACONTAINER)
map(lambda ext: ext.strip(), nzbtomedia.IGNOREEXTENSIONS)
if result == 0:
logger.info("Video %s has no corruption." % (videofile))
return True
else:
logger.error("Video %s is corrupted!" % (videofile))
return False
def Transcode_directory(self, dirName):
if platform.system() == 'Windows':
bitbucket = open('NUL')
else:
bitbucket = open('/dev/null')
logger.info("Checking for files to be transcoded")
final_result = 0 # initialize as successful
for dirpath, dirnames, filenames in os.walk(dirName):
for file in filenames:
filePath = os.path.join(dirpath, file)
name, ext = os.path.splitext(filePath)
if ext in nzbtomedia.MEDIACONTAINER: # If the file is a video file
if ext in nzbtomedia.IGNOREEXTENSIONS:
logger.info("No need to transcode video type %s" % (ext))
continue
if ext == nzbtomedia.OUTPUTVIDEOEXTENSION: # we need to change the name to prevent overwriting itself.
nzbtomedia.OUTPUTVIDEOEXTENSION = '-transcoded' + nzbtomedia.OUTPUTVIDEOEXTENSION # adds '-transcoded.ext'
newfilePath = os.path.normpath(name + nzbtomedia.OUTPUTVIDEOEXTENSION)
for file in listMediaFiles(dirName):
name, ext = os.path.splitext(file)
if ext in [i.replace(".","") for i in nzbtomedia.MEDIACONTAINER]:
continue
if ext == nzbtomedia.OUTPUTVIDEOEXTENSION: # we need to change the name to prevent overwriting itself.
nzbtomedia.OUTPUTVIDEOEXTENSION = '-transcoded' + nzbtomedia.OUTPUTVIDEOEXTENSION # adds '-transcoded.ext'
command = [ffmpeg, '-loglevel', 'warning', '-i', filePath, '-map', '0'] # -map 0 takes all input streams
newfilePath = os.path.normpath(name + nzbtomedia.OUTPUTVIDEOEXTENSION)
if useNiceness:
command = ['nice', '-%d' % niceness] + command
command = [nzbtomedia.FFMPEG, '-loglevel', 'warning', '-i', file, '-map', '0'] # -map 0 takes all input streams
if platform.system() != 'Windows':
if len(nzbtomedia.OUTPUTVIDEOCODEC) > 0:
command.append('-c:v')
command.append(nzbtomedia.OUTPUTVIDEOCODEC)
if nzbtomedia.OUTPUTVIDEOCODEC == 'libx264' and nzbtomedia.OUTPUTVIDEOPRESET:
command.append('-preset')
command.append(nzbtomedia.OUTPUTVIDEOPRESET)
else:
command.append('-c:v')
command.append('copy')
if len(nzbtomedia.OUTPUTVIDEOFRAMERATE) > 0:
command.append('-r')
command.append(str(nzbtomedia.OUTPUTVIDEOFRAMERATE))
if len(nzbtomedia.OUTPUTVIDEOBITRATE) > 0:
command.append('-b:v')
command.append(str(nzbtomedia.OUTPUTVIDEOBITRATE))
if len(nzbtomedia.OUTPUTAUDIOCODEC) > 0:
command.append('-c:a')
command.append(nzbtomedia.OUTPUTAUDIOCODEC)
if nzbtomedia.OUTPUTAUDIOCODEC == 'aac': # Allow users to use the experimental AAC codec that's built into recent versions of ffmpeg
command.append('-strict')
command.append('-2')
else:
command.append('-c:a')
command.append('copy')
if len(nzbtomedia.OUTPUTAUDIOBITRATE) > 0:
command.append('-b:a')
command.append(str(nzbtomedia.OUTPUTAUDIOBITRATE))
if nzbtomedia.OUTPUTFASTSTART > 0:
command.append('-movflags')
command.append('+faststart')
if nzbtomedia.OUTPUTQUALITYPERCENT > 0:
command.append('-q:a')
command.append(str(nzbtomedia.OUTPUTQUALITYPERCENT))
if len(nzbtomedia.OUTPUTSUBTITLECODEC) > 0: # Not every subtitle codec can be used for every video container format!
command.append('-c:s')
command.append(nzbtomedia.OUTPUTSUBTITLECODEC) # http://en.wikibooks.org/wiki/FFMPEG_An_Intermediate_Guide/subtitle_options
else:
command.append('-sn') # Don't copy the subtitles over
command.append(newfilePath)
command = ['nice', '-%d' % nzbtomedia.NICENESS] + command
try: # Try to remove the file that we're transcoding to just in case. (ffmpeg will return an error if it already exists for some reason)
os.remove(newfilePath)
except OSError, e:
if e.errno != errno.ENOENT: # Ignore the error if it's just telling us that the file doesn't exist
logger.debug("Error when removing transcoding target: %s" % (e))
except Exception, e:
logger.debug("Error when removing transcoding target: %s" % (e))
if len(nzbtomedia.OUTPUTVIDEOCODEC) > 0:
command.append('-c:v')
command.append(nzbtomedia.OUTPUTVIDEOCODEC)
if nzbtomedia.OUTPUTVIDEOCODEC == 'libx264' and nzbtomedia.OUTPUTVIDEOPRESET:
command.append('-preset')
command.append(nzbtomedia.OUTPUTVIDEOPRESET)
else:
command.append('-c:v')
command.append('copy')
if len(nzbtomedia.OUTPUTVIDEOFRAMERATE) > 0:
command.append('-r')
command.append(str(nzbtomedia.OUTPUTVIDEOFRAMERATE))
if len(nzbtomedia.OUTPUTVIDEOBITRATE) > 0:
command.append('-b:v')
command.append(str(nzbtomedia.OUTPUTVIDEOBITRATE))
if len(nzbtomedia.OUTPUTAUDIOCODEC) > 0:
command.append('-c:a')
command.append(nzbtomedia.OUTPUTAUDIOCODEC)
if nzbtomedia.OUTPUTAUDIOCODEC == 'aac': # Allow users to use the experimental AAC codec that's built into recent versions of ffmpeg
command.append('-strict')
command.append('-2')
else:
command.append('-c:a')
command.append('copy')
if len(nzbtomedia.OUTPUTAUDIOBITRATE) > 0:
command.append('-b:a')
command.append(str(nzbtomedia.OUTPUTAUDIOBITRATE))
if nzbtomedia.OUTPUTFASTSTART > 0:
command.append('-movflags')
command.append('+faststart')
if nzbtomedia.OUTPUTQUALITYPERCENT > 0:
command.append('-q:a')
command.append(str(nzbtomedia.OUTPUTQUALITYPERCENT))
if len(nzbtomedia.OUTPUTSUBTITLECODEC) > 0: # Not every subtitle codec can be used for every video container format!
command.append('-c:s')
command.append(nzbtomedia.OUTPUTSUBTITLECODEC) # http://en.wikibooks.org/wiki/FFMPEG_An_Intermediate_Guide/subtitle_options
else:
command.append('-sn') # Don't copy the subtitles over
command.append(newfilePath)
logger.info("Transcoding video: %s" % (file))
cmd = ""
for item in command:
cmd = cmd + " " + item
logger.debug("calling command:%s" % (cmd))
result = 1 # set result to failed in case call fails.
try:
result = call(command)
except:
logger.error("Transcoding of video %s has failed" % (filePath))
if result == 0:
logger.info("Transcoding of video %s to %s succeeded" % (filePath, newfilePath))
if nzbtomedia.DUPLICATE == 0: # we get rid of the original file
os.unlink(filePath)
else:
logger.error("Transcoding of video %s to %s failed" % (filePath, newfilePath))
# this will be 0 (successful) it all are successful, else will return a positive integer for failure.
final_result = final_result + result
try: # Try to remove the file that we're transcoding to just in case. (ffmpeg will return an error if it already exists for some reason)
os.remove(newfilePath)
except OSError, e:
if e.errno != errno.ENOENT: # Ignore the error if it's just telling us that the file doesn't exist
logger.debug("Error when removing transcoding target: %s" % (e))
except Exception, e:
logger.debug("Error when removing transcoding target: %s" % (e))
logger.info("Transcoding video: %s" % (file))
cmd = ""
for item in command:
cmd = cmd + " " + item
logger.debug("calling command:%s" % (cmd))
result = 1 # set result to failed in case call fails.
try:
result = call(command, stdout=bitbucket, stderr=bitbucket)
except:
logger.error("Transcoding of video %s has failed" % (file))
if result == 0:
logger.info("Transcoding of video %s to %s succeeded" % (file, newfilePath))
if nzbtomedia.DUPLICATE == 0: # we get rid of the original file
os.unlink(file)
else:
logger.error("Transcoding of video %s to %s failed" % (file, newfilePath))
# this will be 0 (successful) it all are successful, else will return a positive integer for failure.
final_result = final_result + result
return final_result

View file

@ -94,6 +94,7 @@ SECTIONS = []
SUBSECTIONS = {}
TRANSCODE = None
FFMPEG_PATH = None
DUPLICATE = None
IGNOREEXTENSIONS = None
OUTPUTVIDEOEXTENSION = None
@ -106,6 +107,8 @@ OUTPUTAUDIOBITRATE = None
OUTPUTSUBTITLECODEC = None
OUTPUTFASTSTART = None
OUTPUTQUALITYPERCENT = None
FFMPEG = None
FFPROBE = None
NICENESS = None
USER_SCRIPT_CATEGORIES = None
@ -132,7 +135,7 @@ def initialize(section=None):
TRANSCODE, GIT_PATH, GIT_USER, GIT_BRANCH, GIT_REPO, SYS_ENCODING, NZB_CLIENTAGENT, SABNZBDHOST, SABNZBDPORT, SABNZBDAPIKEY, \
DUPLICATE, IGNOREEXTENSIONS, OUTPUTVIDEOEXTENSION, OUTPUTVIDEOCODEC, OUTPUTVIDEOPRESET, OUTPUTVIDEOFRAMERATE, \
OUTPUTVIDEOBITRATE, OUTPUTAUDIOCODEC, OUTPUTAUDIOBITRATE, OUTPUTSUBTITLECODEC, OUTPUTFASTSTART, OUTPUTQUALITYPERCENT, \
NICENESS, LOG_DEBUG, FORCE_CLEAN
NICENESS, LOG_DEBUG, FORCE_CLEAN, FFMPEG_PATH, FFMPEG, FFPROBE
if __INITIALIZED__:
return False
@ -242,6 +245,7 @@ def initialize(section=None):
SAMPLEIDS = (CFG["Extensions"]["SampleIDs"]) # sample,-s.
TRANSCODE = int(CFG["Transcoder"]["transcode"])
FFMPEG_PATH = CFG["Transcoder"]["ffmpeg_path"]
DUPLICATE = int(CFG["Transcoder"]["duplicate"])
IGNOREEXTENSIONS = (CFG["Transcoder"]["ignoreExtensions"])
OUTPUTVIDEOEXTENSION = CFG["Transcoder"]["outputVideoExtension"].strip()
@ -256,6 +260,40 @@ def initialize(section=None):
OUTPUTQUALITYPERCENT = int(CFG["Transcoder"]["outputQualityPercent"])
NICENESS = int(CFG["Transcoder"]["niceness"])
# Setup FFMPEG and FFPROBE locations
if platform.system() == 'Windows':
FFMPEG = os.path.join(FFMPEG_PATH, 'ffmpeg.exe')
FFPROBE = os.path.join(FFMPEG_PATH, 'ffprobe.exe')
if TRANSCODE and not os.path.isfile(FFMPEG): # problem
logger.error("%s not found, insure that it does exist and that you've set the correct ffmpeg_path in your autoProcessMedia.cfg" % FFMPEG)
logger.error("Cannot transcode files, disabling transcoding!")
TRANSCODE = 0
FFMPEG = None
if not os.path.isfile(FFPROBE): # problem
logger.error(
"%s not found, insure that it does exist and that you've set the correct ffmpeg_path in your autoProcessMedia.cfg" % FFPROBE)
logger.error("Cannot detect corrupt video files, disabling!")
FFPROBE = None
else:
FFMPEG = 'ffmpeg'
FFPROBE = 'ffprobe'
if subprocess.call(['which', 'ffmpeg']) != 0:
res = subprocess.call([os.path.join(PROGRAM_DIR, 'getffmpeg.sh')])
if res or subprocess.call(['which', 'ffmpeg']) != 0: # did not install or ffmpeg still not found.
logger.error("Failed to install ffmpeg. Please install manually")
logger.info("Cannot transcode video files, disabling transcoding!")
TRANSCODE = 0
FFMPEG = None
if subprocess.call(['which', 'ffprobe']) != 0:
res = subprocess.call([os.path.join(PROGRAM_DIR, 'getffmpeg.sh')])
if res or subprocess.call(['which', 'ffprobe']) != 0:
logger.error("Failed to install ffprobe. Please install manually")
logger.info("Cannot detect corrupt video files, disabling corrupt video detection!")
FFPROBE = None
USER_SCRIPT_CATEGORIES = CFG["UserScript"]["user_script_categories"]
if not "NONE" in USER_SCRIPT_CATEGORIES:
USER_SCRIPT_MEDIAEXTENSIONS = (CFG["UserScript"]["user_script_mediaExtensions"])

View file

@ -67,20 +67,20 @@ def category_search(inputDirectory, inputName, inputCategory, root, categories):
if not inputName: inputName = os.path.split(os.path.normpath(inputDirectory))[1]
return inputDirectory, inputName, inputCategory, root, single
if inputCategory and os.path.isdir(os.path.join(inputDirectory, inputCategory)):
if inputCategory and os.path.isdir(os.path.join(inputDirectory, inputCategory).replace("\\","/")):
logger.info(
"SEARCH: Found category directory %s in input directory directory %s" % (inputCategory, inputDirectory))
inputDirectory = os.path.join(inputDirectory, inputCategory)
inputDirectory = os.path.join(inputDirectory, inputCategory).replace("\\","/")
logger.info("SEARCH: Setting inputDirectory to %s" % (inputDirectory))
if inputName and os.path.isdir(os.path.join(inputDirectory, inputName)):
if inputName and os.path.isdir(os.path.join(inputDirectory, inputName).replace("\\","/")):
logger.info("SEARCH: Found torrent directory %s in input directory directory %s" % (inputName, inputDirectory))
inputDirectory = os.path.join(inputDirectory, inputName)
inputDirectory = os.path.join(inputDirectory, inputName).replace("\\","/")
logger.info("SEARCH: Setting inputDirectory to %s" % (inputDirectory))
tordir = True
if inputName and os.path.isdir(os.path.join(inputDirectory, sanitizeFileName(inputName))):
if inputName and os.path.isdir(os.path.join(inputDirectory, sanitizeFileName(inputName)).replace("\\","/")):
logger.info("SEARCH: Found torrent directory %s in input directory directory %s" % (
sanitizeFileName(inputName), inputDirectory))
inputDirectory = os.path.join(inputDirectory, sanitizeFileName(inputName))
inputDirectory = os.path.join(inputDirectory, sanitizeFileName(inputName).replace("\\","/"))
logger.info("SEARCH: Setting inputDirectory to %s" % (inputDirectory))
tordir = True
@ -179,8 +179,8 @@ def flatten(outputDestination):
if dirpath == outputDestination:
continue # No need to try and move files in the root destination directory
for filename in filenames:
source = os.path.join(dirpath, filename)
target = os.path.join(outputDestination, filename)
source = os.path.join(dirpath, filename).replace("\\","/")
target = os.path.join(outputDestination, filename).replace("\\","/")
try:
shutil.move(source, target)
except:
@ -197,7 +197,7 @@ def removeEmptyFolders(path):
files = os.listdir(path)
if len(files):
for f in files:
fullpath = os.path.join(path, f)
fullpath = os.path.join(path, f).replace("\\","/")
if os.path.isdir(fullpath):
removeEmptyFolders(fullpath)
@ -214,7 +214,7 @@ def remove_read_only(path):
for dirpath, dirnames, filenames in os.walk(path):
for filename in filenames:
logger.debug("Removing Read Only Flag for: %s" % (filename))
os.chmod(os.path.join(dirpath, filename), stat.S_IWRITE)
os.chmod(os.path.join(dirpath, filename).replace("\\","/"), stat.S_IWRITE)
#Wake function
@ -389,7 +389,7 @@ def get_dirnames(section, subsections=None):
watch_dir = None
try:
outputDirectory = os.path.join(nzbtomedia.OUTPUTDIRECTORY, subsection)
outputDirectory = os.path.join(nzbtomedia.OUTPUTDIRECTORY, subsection).replace("\\","/")
if not os.path.exists(outputDirectory):
outputDirectory = None
except:
@ -400,26 +400,26 @@ def get_dirnames(section, subsections=None):
for mediafile in listMediaFiles(watch_dir):
parentDir = os.path.dirname(mediafile)
if parentDir == watch_dir:
p = os.path.join(parentDir, (os.path.splitext(os.path.splitext(mediafile)[0])[0]))
p = os.path.join(parentDir, (os.path.splitext(os.path.splitext(mediafile)[0])[0])).replace("\\","/")
if not os.path.exists(p):
os.mkdir(p)
shutil.move(mediafile, p)
dirNames.extend([os.path.join(watch_dir, o) for o in os.listdir(watch_dir) if
os.path.isdir(os.path.join(watch_dir, o))])
dirNames.extend([os.path.join(watch_dir, o).replace("\\","/") for o in os.listdir(watch_dir) if
os.path.isdir(os.path.join(watch_dir, o).replace("\\","/"))])
if outputDirectory:
# search for single files and move them into there own folder for post-processing
for mediafile in listMediaFiles(outputDirectory):
parentDir = os.path.dirname(mediafile)
if parentDir == outputDirectory:
p = os.path.join(parentDir, (os.path.splitext(os.path.splitext(mediafile)[0])[0]))
p = os.path.join(parentDir, (os.path.splitext(os.path.splitext(mediafile)[0])[0]).replace("\\","/"))
if not os.path.exists(p):
os.mkdir(p)
shutil.move(mediafile, p)
dirNames.extend([os.path.join(outputDirectory, o) for o in os.listdir(outputDirectory) if
os.path.isdir(os.path.join(outputDirectory, o))])
dirNames.extend([os.path.join(outputDirectory, o).replace("\\","/") for o in os.listdir(outputDirectory) if
os.path.isdir(os.path.join(outputDirectory, o).replace("\\","/"))])
if not dirNames:
logger.warning("%s:%s has no directories identified for post-processing" % (section, subsection))
@ -441,7 +441,7 @@ def cleanup_directories(inputCategory, processCategories, result, directory):
file_list = []
for dirpath, dirnames, filenames in os.walk(directory):
for file in filenames:
filePath = os.path.join(dirpath, file)
filePath = os.path.join(dirpath, file).replace("\\","/")
fileName, fileExtension = os.path.splitext(file)
if fileExtension in nzbtomedia.MEDIACONTAINER or fileExtension in nzbtomedia.METACONTAINER:
num_files_new += 1
@ -607,7 +607,7 @@ def listMediaFiles(path):
files = []
for curFile in os.listdir(path):
fullCurFile = os.path.join(path, curFile)
fullCurFile = os.path.join(path, curFile).replace("\\","/")
# if it's a folder do it recursively
if os.path.isdir(fullCurFile) and not curFile.startswith('.') and not curFile == 'Extras':