Add ffdecodetest.py.
This commit is contained in:
parent
f822d000af
commit
033d381ec5
1 changed files with 80 additions and 0 deletions
80
ffdecodetest.py
Normal file
80
ffdecodetest.py
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
import os
|
||||||
|
import argparse
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from voussoirkit import betterhelp
|
||||||
|
from voussoirkit import spinal
|
||||||
|
from voussoirkit import pathclass
|
||||||
|
from voussoirkit import pipeable
|
||||||
|
from voussoirkit import vlogging
|
||||||
|
from voussoirkit import winwhich
|
||||||
|
|
||||||
|
log = vlogging.getLogger(__name__, 'ffdecodetest')
|
||||||
|
|
||||||
|
def ffdecodetest_argparse(args):
|
||||||
|
FFMPEG = pathclass.Path(winwhich.which('ffmpeg'))
|
||||||
|
patterns = pipeable.input_many(args.patterns)
|
||||||
|
if args.recurse:
|
||||||
|
files = spinal.walk(glob_filenames=patterns)
|
||||||
|
else:
|
||||||
|
files = (file for pattern in patterns for file in pathclass.glob_files(pattern))
|
||||||
|
|
||||||
|
goods = 0
|
||||||
|
bads = 0
|
||||||
|
|
||||||
|
for file in files:
|
||||||
|
command = [
|
||||||
|
FFMPEG.absolute_path,
|
||||||
|
'-i', file.absolute_path,
|
||||||
|
'-f', 'null',
|
||||||
|
os.devnull,
|
||||||
|
]
|
||||||
|
log.debug(command)
|
||||||
|
process = subprocess.Popen(
|
||||||
|
command,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.STDOUT,
|
||||||
|
)
|
||||||
|
success = True
|
||||||
|
for line in process.stdout:
|
||||||
|
# If you have more comprehensive tests, let me know.
|
||||||
|
if b'Error while decoding' in line or b'broken header' in line:
|
||||||
|
success = False
|
||||||
|
for line in process.stdout:
|
||||||
|
pass
|
||||||
|
break
|
||||||
|
process.communicate()
|
||||||
|
success = success and process.returncode == 0
|
||||||
|
if success:
|
||||||
|
log.info(f'{file.absolute_path} ok.')
|
||||||
|
goods += 1
|
||||||
|
else:
|
||||||
|
log.error(f'{file.absolute_path} failed.')
|
||||||
|
bads += 1
|
||||||
|
|
||||||
|
if bads > 0:
|
||||||
|
log.warning(f'{goods} ok, {bads} failed.')
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
log.info(f'{goods} ok, {bads} failed.')
|
||||||
|
return 0
|
||||||
|
|
||||||
|
@vlogging.main_decorator
|
||||||
|
def main(argv):
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description='''
|
||||||
|
Uses FFMPEG to decode the input files, testing their validity.
|
||||||
|
''',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'patterns',
|
||||||
|
nargs='+',
|
||||||
|
)
|
||||||
|
parser.add_argument('--recurse', action='store_true')
|
||||||
|
parser.set_defaults(func=ffdecodetest_argparse)
|
||||||
|
|
||||||
|
return betterhelp.go(parser, argv)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
raise SystemExit(main(sys.argv[1:]))
|
Loading…
Reference in a new issue