| import subprocess
|
| import json
|
| import os
|
| import torch
|
| import shutil
|
|
|
| import server
|
| import folder_paths
|
|
|
| web = server.web
|
|
|
| @server.PromptServer.instance.routes.post("/VHS_test")
|
| async def test(request):
|
| try:
|
| req_data = await request.json()
|
| output = req_data['output']['gifs'][0]
|
| filename = output['filename']
|
| typ = output['type']
|
| base_args = ["ffprobe", "-v", "error", '-count_packets', "-show_entries", "stream", "-of", "json"]
|
| video = folder_paths.get_annotated_filepath(f'{filename} [{typ}]')
|
| vprobe = json.loads(subprocess.run(base_args + ['-select_streams', 'v:0', video],
|
| capture_output=True, check=True).stdout)['streams'][0]
|
| aprobe = json.loads(subprocess.run(base_args + ['-select_streams', 'a:0', video],
|
| capture_output=True, check=True).stdout)['streams']
|
| probe = {'video': vprobe}
|
| if len(aprobe) > 0:
|
| probe['audio'] = aprobe[0]
|
| errors = []
|
| compare = None
|
| for test in req_data['tests']:
|
| if test['type'] == 'compare':
|
| compare = test
|
| continue
|
| key = test['key']
|
| expected = test['value']
|
| actual = probe[test['type']][key]
|
| if expected != actual:
|
|
|
| errors.append(f'{key}: {expected} != {actual}')
|
| if len(errors) == 0 and compare is not None:
|
| if not os.path.exists(compare['filename']):
|
| os.makedirs(os.path.split(compare['filename'])[0], exist_ok=True)
|
| shutil.copy(video, compare['filename'])
|
| print("Missing comparison file has been initialized from output:", os.path.abspath(compare['filename']))
|
| else:
|
|
|
|
|
|
|
|
|
| diff = subprocess.run(['ffmpeg', '-v', 'error', '-i', video, '-i', compare['filename'], '-filter_complex', 'blend=all_mode=grainextract', '-pix_fmt', 'rgb24', '-f', 'rawvideo', '-'], stdout=subprocess.PIPE, check=True).stdout
|
| diff = torch.frombuffer(diff, dtype=torch.uint8).to(dtype=torch.float32).div_(255)
|
|
|
| d = (diff-0.5).abs().sum()/diff.size(0)
|
| if d > compare['tolerance']:
|
| errors.append(f'Similarity is outside specified tolerance: {d}')
|
| else:
|
| print('d:', d)
|
| return web.json_response(errors)
|
| except Exception as e:
|
| return web.json_response(str(e))
|
|
|