#!/usr/bin/env python import os import os.path as op import sys import json import subprocess from multiprocessing.dummy import Pool def _get_files(root): for dirpath, dirnames, filenames in os.walk(root): for filename in filenames: yield op.join(dirpath, filename) for dirname in dirnames: _get_files(op.join(dirpath, dirname)) def _probe_file(filepath): try: raw_data = subprocess.check_output(['ffprobe', '-v', '0', '-of', 'json', '-show_streams', '-show_format', filepath]) except Exception as e: print(f'[✗] {filepath}') return None else: print(f'[✓] {filepath}') return json.loads(raw_data) def _main(output, dirs): files = sorted(f for d in dirs for f in _get_files(d)) print(f'processing {len(files)} files...') db = [result for result in Pool().imap(_probe_file, files) if result] print(f'writing {output} database') with open(output, 'w') as f: f.write(json.dumps(db, indent=4)) if __name__ == '__main__': output = sys.argv[1] dirs = sys.argv[2:] _main(output, dirs)