main.py 1.4 KB

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