main.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/env python3
  2. import asyncio
  3. import os
  4. import pathlib
  5. import shlex
  6. import shutil
  7. import subprocess
  8. from nicegui import app, events, ui
  9. def extract(source: str):
  10. subprocess.call(shlex.split(f'ffmpeg -i "{source}" -vf fps=1 out_%04d.jpg'))
  11. async def handle_upload(args: events.UploadEventArguments):
  12. if 'video' in args.type:
  13. shutil.rmtree('data', ignore_errors=True)
  14. os.makedirs('data', exist_ok=True)
  15. os.chdir('data')
  16. with open(args.name, 'wb') as f:
  17. f.write(args.content.read())
  18. results.clear()
  19. with results:
  20. ui.spinner('dots', size='xl')
  21. await asyncio.to_thread(extract, args.name)
  22. results.clear()
  23. with results:
  24. for path in pathlib.Path('.').glob('*.jpg'):
  25. ui.image(f'/data/{path.name}').classes('w-96 drop-shadow-md rounded')
  26. os.chdir('..')
  27. else:
  28. ui.notify('Please upload a video file')
  29. upload.run_method('reset')
  30. os.makedirs('data', exist_ok=True)
  31. app.add_static_files('/data', 'data')
  32. with ui.column().classes('w-full items-center'):
  33. ui.label('Extract images from video').classes('text-3xl m-3')
  34. upload = ui.upload(label='pick a video file', auto_upload=True, on_upload=handle_upload)
  35. results = ui.row().classes('w-full justify-center mt-6')
  36. ui.run()