42 lines
2.9 KiB
Python
42 lines
2.9 KiB
Python
import json,pathlib,shutil,subprocess,sys,tempfile,unittest
|
|
sys.path.insert(0,str(pathlib.Path(__file__).resolve().parents[1]/'plugins'))
|
|
import media_preview
|
|
from PIL import Image
|
|
|
|
class PreviewTests(unittest.TestCase):
|
|
@unittest.skipUnless(shutil.which('ffmpeg') and shutil.which('ffprobe'), 'FFmpeg tools required')
|
|
def test_compatible_video_is_verified_without_reencoding(self):
|
|
with tempfile.TemporaryDirectory() as root:
|
|
root=pathlib.Path(root);source=root/'input';output=root/'output';source.mkdir();output.mkdir()
|
|
video=source/'source.mp4'
|
|
subprocess.run(['ffmpeg','-v','error','-f','lavfi','-i','color=c=blue:s=32x32:r=10',
|
|
'-t','0.3','-c:v','libx264','-threads','1','-pix_fmt','yuv420p',str(video)],check=True)
|
|
shutil.copyfile(video,source/'duplicate.mp4')
|
|
result=media_preview.run({'protocol':1,'input_dir':str(source),'output_dir':str(output),
|
|
'settings':{},'workspace_bytes':1024*1024})
|
|
self.assertEqual(result['coverage'],'complete')
|
|
evidence=json.loads((output/'preview-evidence.json').read_text())['previews']
|
|
self.assertEqual(len(evidence),2)
|
|
self.assertTrue(all(row['status']=='verified_source' for row in evidence))
|
|
self.assertEqual(evidence[0]['source_sha256'],evidence[1]['source_sha256'])
|
|
self.assertEqual(list(output.rglob('*.mp4')),[])
|
|
|
|
def test_thumbnail_readback_and_failed_outputs(self):
|
|
with tempfile.TemporaryDirectory() as root:
|
|
root=pathlib.Path(root);source=root/'input';output=root/'output';source.mkdir();output.mkdir()
|
|
Image.new('RGB',(1600,400),'red').save(source/'wide.png')
|
|
(source/'broken.png').write_bytes(b'\x89PNG\r\n\x1a\ntruncated')
|
|
result=media_preview.run({'protocol':1,'input_dir':str(source),'output_dir':str(output),'settings':{},'workspace_bytes':1024*1024})
|
|
self.assertEqual(result['coverage'],'partial')
|
|
evidence=json.loads((output/'preview-evidence.json').read_text())['previews']
|
|
good=next(r for r in evidence if r['source']=='wide.png')
|
|
self.assertEqual(good['status'],'verified');self.assertEqual(good['processing_revision'],3)
|
|
with Image.open(output/good['preview']) as image:self.assertEqual(image.size,(320,80))
|
|
self.assertEqual(next(r for r in evidence if r['source']=='broken.png')['status'],'failed')
|
|
self.assertFalse((output/'previews/broken.png.webp').exists())
|
|
filtered=root/'filtered';filtered.mkdir()
|
|
media_preview.run({'protocol':1,'input_dir':str(source),'output_dir':str(filtered),'settings':{'include_extensions':['.mp4']},'workspace_bytes':1024*1024})
|
|
self.assertEqual(json.loads((filtered/'preview-evidence.json').read_text())['previews'],[])
|
|
|
|
if __name__=='__main__':unittest.main()
|