Add ffdecodetest.py.

This commit is contained in:
voussoir 2022-04-05 11:51:10 -07:00
parent f822d000af
commit 033d381ec5
No known key found for this signature in database
GPG key ID: 5F7554F8C26DACCB

80
ffdecodetest.py Normal file
View 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:]))