mirror of
https://github.com/clinton-hall/nzbToMedia.git
synced 2025-08-19 21:03:14 -07:00
more definitive testing of isVideoGood.
This commit is contained in:
parent
ae13aaff68
commit
18d2e661d8
4 changed files with 47 additions and 43 deletions
|
@ -371,7 +371,7 @@ def initialize(section=None):
|
||||||
transcode_defaults = {
|
transcode_defaults = {
|
||||||
'iPad':{
|
'iPad':{
|
||||||
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
||||||
'VRESOLUTION':None,'VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'MPEG-4'],
|
'VRESOLUTION':None,'VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'avc', 'mpeg4', 'msmpeg4', 'MPEG-4'],
|
||||||
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':None,
|
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':None,
|
||||||
'ACODEC2':'ac3','ACODEC2_ALLOW':['ac3'],'ABITRATE2':None,
|
'ACODEC2':'ac3','ACODEC2_ALLOW':['ac3'],'ABITRATE2':None,
|
||||||
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
||||||
|
@ -379,7 +379,7 @@ def initialize(section=None):
|
||||||
},
|
},
|
||||||
'iPad-1080p':{
|
'iPad-1080p':{
|
||||||
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
||||||
'VRESOLUTION':'1920:1080','VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'MPEG-4'],
|
'VRESOLUTION':'1920:1080','VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'avc', 'mpeg4', 'msmpeg4', 'MPEG-4'],
|
||||||
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':None,
|
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':None,
|
||||||
'ACODEC2':'ac3','ACODEC2_ALLOW':['ac3'],'ABITRATE2':None,
|
'ACODEC2':'ac3','ACODEC2_ALLOW':['ac3'],'ABITRATE2':None,
|
||||||
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
||||||
|
@ -387,7 +387,7 @@ def initialize(section=None):
|
||||||
},
|
},
|
||||||
'iPad-720p':{
|
'iPad-720p':{
|
||||||
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
||||||
'VRESOLUTION':'1280:720','VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'MPEG-4'],
|
'VRESOLUTION':'1280:720','VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'avc', 'mpeg4', 'msmpeg4', 'MPEG-4'],
|
||||||
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':None,
|
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':None,
|
||||||
'ACODEC2':'ac3','ACODEC2_ALLOW':['ac3'],'ABITRATE2':None,
|
'ACODEC2':'ac3','ACODEC2_ALLOW':['ac3'],'ABITRATE2':None,
|
||||||
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
||||||
|
@ -395,7 +395,7 @@ def initialize(section=None):
|
||||||
},
|
},
|
||||||
'Apple-TV':{
|
'Apple-TV':{
|
||||||
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
||||||
'VRESOLUTION':'1280:720','VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'MPEG-4'],
|
'VRESOLUTION':'1280:720','VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'avc', 'mpeg4', 'msmpeg4', 'MPEG-4'],
|
||||||
'ACODEC':'ac3','ACODEC_ALLOW':['ac3'],'ABITRATE':None,
|
'ACODEC':'ac3','ACODEC_ALLOW':['ac3'],'ABITRATE':None,
|
||||||
'ACODEC2':'libfaac','ACODEC2_ALLOW':['libfaac'],'ABITRATE2':None,
|
'ACODEC2':'libfaac','ACODEC2_ALLOW':['libfaac'],'ABITRATE2':None,
|
||||||
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
||||||
|
@ -403,7 +403,7 @@ def initialize(section=None):
|
||||||
},
|
},
|
||||||
'iPod':{
|
'iPod':{
|
||||||
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
||||||
'VRESOLUTION':'1280:720','VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'MPEG-4'],
|
'VRESOLUTION':'1280:720','VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'avc', 'mpeg4', 'msmpeg4', 'MPEG-4'],
|
||||||
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':128000,
|
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':128000,
|
||||||
'ACODEC2':None,'ACODEC2_ALLOW':[],'ABITRATE2':None,
|
'ACODEC2':None,'ACODEC2_ALLOW':[],'ABITRATE2':None,
|
||||||
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
||||||
|
@ -411,7 +411,7 @@ def initialize(section=None):
|
||||||
},
|
},
|
||||||
'iPhone':{
|
'iPhone':{
|
||||||
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
||||||
'VRESOLUTION':'460:320','VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'MPEG-4'],
|
'VRESOLUTION':'460:320','VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'avc', 'mpeg4', 'msmpeg4', 'MPEG-4'],
|
||||||
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':128000,
|
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':128000,
|
||||||
'ACODEC2':None,'ACODEC2_ALLOW':[],'ABITRATE2':None,
|
'ACODEC2':None,'ACODEC2_ALLOW':[],'ABITRATE2':None,
|
||||||
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
||||||
|
@ -419,7 +419,7 @@ def initialize(section=None):
|
||||||
},
|
},
|
||||||
'PS3':{
|
'PS3':{
|
||||||
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
||||||
'VRESOLUTION':None,'VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'MPEG-4'],
|
'VRESOLUTION':None,'VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'avc', 'mpeg4', 'msmpeg4', 'MPEG-4'],
|
||||||
'ACODEC':'ac3','ACODEC_ALLOW':['ac3'],'ABITRATE':None,
|
'ACODEC':'ac3','ACODEC_ALLOW':['ac3'],'ABITRATE':None,
|
||||||
'ACODEC2':'libfaac','ACODEC2_ALLOW':['libfaac'],'ABITRATE2':None,
|
'ACODEC2':'libfaac','ACODEC2_ALLOW':['libfaac'],'ABITRATE2':None,
|
||||||
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
||||||
|
@ -427,7 +427,7 @@ def initialize(section=None):
|
||||||
},
|
},
|
||||||
'Roku-480p':{
|
'Roku-480p':{
|
||||||
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
||||||
'VRESOLUTION':None,'VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'MPEG-4'],
|
'VRESOLUTION':None,'VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'avc', 'mpeg4', 'msmpeg4', 'MPEG-4'],
|
||||||
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':128000,
|
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':128000,
|
||||||
'ACODEC2':'ac3','ACODEC2_ALLOW':['ac3'],'ABITRATE2':None,
|
'ACODEC2':'ac3','ACODEC2_ALLOW':['ac3'],'ABITRATE2':None,
|
||||||
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
||||||
|
@ -435,7 +435,7 @@ def initialize(section=None):
|
||||||
},
|
},
|
||||||
'Roku-720p':{
|
'Roku-720p':{
|
||||||
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
||||||
'VRESOLUTION':None,'VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'MPEG-4'],
|
'VRESOLUTION':None,'VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'avc', 'mpeg4', 'msmpeg4', 'MPEG-4'],
|
||||||
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':128000,
|
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':128000,
|
||||||
'ACODEC2':'ac3','ACODEC2_ALLOW':['ac3'],'ABITRATE2':None,
|
'ACODEC2':'ac3','ACODEC2_ALLOW':['ac3'],'ABITRATE2':None,
|
||||||
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
||||||
|
@ -443,7 +443,7 @@ def initialize(section=None):
|
||||||
},
|
},
|
||||||
'Roku-1080p':{
|
'Roku-1080p':{
|
||||||
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
'VEXTENSION':'.mp4','VCODEC':'libx264','VPRESET':None,'VFRAMERATE':None,'VBITRATE':None,
|
||||||
'VRESOLUTION':None,'VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'MPEG-4'],
|
'VRESOLUTION':None,'VCODEC_ALLOW':['libx264', 'h264', 'h.264', 'AVC', 'avc', 'mpeg4', 'msmpeg4', 'MPEG-4'],
|
||||||
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':160000,
|
'ACODEC':'libfaac','ACODEC_ALLOW':['libfaac'],'ABITRATE':160000,
|
||||||
'ACODEC2':'ac3','ACODEC2_ALLOW':['ac3'],'ABITRATE2':None,
|
'ACODEC2':'ac3','ACODEC2_ALLOW':['ac3'],'ABITRATE2':None,
|
||||||
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
'ACODEC3':None,'ACODEC3_ALLOW2':[],'ABITRATE3':None,
|
||||||
|
|
|
@ -161,7 +161,7 @@ class autoProcessMovie:
|
||||||
status = int(status)
|
status = int(status)
|
||||||
for video in listMediaFiles(dirName, media=True, audio=False, meta=False, archives=False):
|
for video in listMediaFiles(dirName, media=True, audio=False, meta=False, archives=False):
|
||||||
num_files += 1
|
num_files += 1
|
||||||
if transcoder.isVideoGood(video):
|
if transcoder.isVideoGood(video, status):
|
||||||
good_files += 1
|
good_files += 1
|
||||||
if not release and not ".cp(tt" in video and imdbid:
|
if not release and not ".cp(tt" in video and imdbid:
|
||||||
videoName, videoExt = os.path.splitext(video)
|
videoName, videoExt = os.path.splitext(video)
|
||||||
|
|
|
@ -91,7 +91,7 @@ class autoProcessTV:
|
||||||
num_files = 0
|
num_files = 0
|
||||||
for video in listMediaFiles(dirName, media=True, audio=False, meta=False, archives=False):
|
for video in listMediaFiles(dirName, media=True, audio=False, meta=False, archives=False):
|
||||||
num_files += 1
|
num_files += 1
|
||||||
if transcoder.isVideoGood(video):
|
if transcoder.isVideoGood(video, status):
|
||||||
good_files += 1
|
good_files += 1
|
||||||
if num_files > 0:
|
if num_files > 0:
|
||||||
if good_files == num_files and not status == 0:
|
if good_files == num_files and not status == 0:
|
||||||
|
@ -108,7 +108,7 @@ class autoProcessTV:
|
||||||
process_all_exceptions(inputName.lower(), dirName)
|
process_all_exceptions(inputName.lower(), dirName)
|
||||||
inputName, dirName = convert_to_ascii(inputName, dirName)
|
inputName, dirName = convert_to_ascii(inputName, dirName)
|
||||||
|
|
||||||
# Now check if tv files exist in destination. Eventually extraction may be done here if nzbExtractionBy == TorrentToMedia
|
# Now check if tv files exist in destination.
|
||||||
if listMediaFiles(dirName, media=True, audio=False, meta=False, archives=False): # Check that a video exists. if not, assume failed.
|
if listMediaFiles(dirName, media=True, audio=False, meta=False, archives=False): # Check that a video exists. if not, assume failed.
|
||||||
flatten(dirName) # to make sure SickBeard can find the video (not in sub-folder)
|
flatten(dirName) # to make sure SickBeard can find the video (not in sub-folder)
|
||||||
elif listMediaFiles(dirName, media=False, audio=False, meta=False, archives=True):
|
elif listMediaFiles(dirName, media=False, audio=False, meta=False, archives=True):
|
||||||
|
@ -119,7 +119,7 @@ class autoProcessTV:
|
||||||
num_files = 0
|
num_files = 0
|
||||||
for video in listMediaFiles(dirName, media=True, audio=False, meta=False, archives=False):
|
for video in listMediaFiles(dirName, media=True, audio=False, meta=False, archives=False):
|
||||||
num_files += 1
|
num_files += 1
|
||||||
if transcoder.isVideoGood(video):
|
if transcoder.isVideoGood(video, status):
|
||||||
good_files += 1
|
good_files += 1
|
||||||
if num_files > 0 and good_files == num_files:
|
if num_files > 0 and good_files == num_files:
|
||||||
logger.info('Found Valid Videos. Setting status Success')
|
logger.info('Found Valid Videos. Setting status Success')
|
||||||
|
|
|
@ -10,47 +10,51 @@ from subprocess import call
|
||||||
from nzbtomedia import logger
|
from nzbtomedia import logger
|
||||||
from nzbtomedia.nzbToMediaUtil import makeDir
|
from nzbtomedia.nzbToMediaUtil import makeDir
|
||||||
|
|
||||||
def isVideoGood(videofile):
|
def isVideoGood(videofile, status):
|
||||||
fileNameExt = os.path.basename(videofile)
|
fileNameExt = os.path.basename(videofile)
|
||||||
fileName, fileExt = os.path.splitext(fileNameExt)
|
fileName, fileExt = os.path.splitext(fileNameExt)
|
||||||
if fileExt not in nzbtomedia.MEDIACONTAINER:
|
if fileExt not in nzbtomedia.MEDIACONTAINER or not nzbtomedia.FFPROBE:
|
||||||
return True
|
if status: # if the download was "failed", assume bad. If it was successful, assume good.
|
||||||
|
|
||||||
if platform.system() == 'Windows':
|
|
||||||
bitbucket = open('NUL')
|
|
||||||
else:
|
|
||||||
bitbucket = open('/dev/null')
|
|
||||||
|
|
||||||
if not nzbtomedia.FFPROBE:
|
|
||||||
return True
|
|
||||||
|
|
||||||
command = [nzbtomedia.FFPROBE, videofile]
|
|
||||||
try:
|
|
||||||
logger.info('Checking [%s] for corruption, please stand by ...' % (fileNameExt), 'TRANSCODER')
|
|
||||||
result = call(command, stdout=bitbucket, stderr=bitbucket)
|
|
||||||
except:
|
|
||||||
logger.error("Checking [%s] for corruption has failed" % (fileNameExt), 'TRANSCODER')
|
|
||||||
return False
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
if result == 0:
|
logger.info('Checking [%s] for corruption, please stand by ...' % (fileNameExt), 'TRANSCODER')
|
||||||
|
video_details, result = getVideoDetails(videofile)
|
||||||
|
|
||||||
|
if result != 0:
|
||||||
|
logger.error("FAILED: [%s] is corrupted!" % (fileNameExt), 'TRANSCODER')
|
||||||
|
return False
|
||||||
|
if video_details.get("error"):
|
||||||
|
logger.info("FAILED: [%s] returned error [%s]." % (fileNameExt, str(video_details.get("error"))), 'TRANSCODER')
|
||||||
|
return False
|
||||||
|
if video_details.get("streams"):
|
||||||
|
videoStreams = [item for item in video_details["streams"] if item["codec_type"] == "video"]
|
||||||
|
audioStreams = [item for item in video_details["streams"] if item["codec_type"] == "audio"]
|
||||||
|
if len(videoStreams) > 0 and len(audioStreams) > 0:
|
||||||
logger.info("SUCCESS: [%s] has no corruption." % (fileNameExt), 'TRANSCODER')
|
logger.info("SUCCESS: [%s] has no corruption." % (fileNameExt), 'TRANSCODER')
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
logger.error("FAILED: [%s] is corrupted!" % (fileNameExt), 'TRANSCODER')
|
logger.info("FAILED: [%s] has %s video streams and %s audio streams. Assume corruption." % (fileNameExt, str(len(videoStreams)), str(len(audioStreams))), 'TRANSCODER')
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def getVideoDetails(videofile):
|
def getVideoDetails(videofile):
|
||||||
video_details = {}
|
video_details = {}
|
||||||
|
result = 1
|
||||||
if not nzbtomedia.FFPROBE:
|
if not nzbtomedia.FFPROBE:
|
||||||
return video_details
|
return video_details
|
||||||
command = [nzbtomedia.FFPROBE, '-v', 'quiet', '-print_format', 'json', '-show_format', '-show_streams', videofile]
|
command = [nzbtomedia.FFPROBE, '-v', 'quiet', '-print_format', 'json', '-show_format', '-show_streams', '-show_error', videofile]
|
||||||
|
try:
|
||||||
proc = subprocess.Popen(command, stdout=subprocess.PIPE)
|
proc = subprocess.Popen(command, stdout=subprocess.PIPE)
|
||||||
proc.wait()
|
result = proc.wait()
|
||||||
video_details = json.loads(proc.stdout.read())
|
video_details = json.loads(proc.stdout.read())
|
||||||
return video_details
|
except:
|
||||||
|
logger.error("Checking [%s] has failed" % (fileNameExt), 'TRANSCODER')
|
||||||
|
return video_details, result
|
||||||
|
|
||||||
def buildCommands(file, newDir):
|
def buildCommands(file, newDir):
|
||||||
video_details = getVideoDetails(file)
|
video_details, result = getVideoDetails(file)
|
||||||
dir, name = os.path.split(file)
|
dir, name = os.path.split(file)
|
||||||
name, ext = os.path.splitext(name)
|
name, ext = os.path.splitext(name)
|
||||||
if ext == nzbtomedia.VEXTENSION and newDir == dir: # we need to change the name to prevent overwriting itself.
|
if ext == nzbtomedia.VEXTENSION and newDir == dir: # we need to change the name to prevent overwriting itself.
|
||||||
|
@ -64,7 +68,7 @@ def buildCommands(file, newDir):
|
||||||
sub_cmd = []
|
sub_cmd = []
|
||||||
other_cmd = []
|
other_cmd = []
|
||||||
|
|
||||||
if not video_details: # we couldn't read streams with ffprobe. Set defaults to try transcoding.
|
if not video_details or not video_details.get("streams"): # we couldn't read streams with ffprobe. Set defaults to try transcoding.
|
||||||
videoStreams = []
|
videoStreams = []
|
||||||
audioStreams = []
|
audioStreams = []
|
||||||
subStreams = []
|
subStreams = []
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue