1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #!/usr/bin/env python3
- import asyncio
- import os
- import pathlib
- import shlex
- import shutil
- import subprocess
- from nicegui import app, events, ui
- def extract(source: str):
- subprocess.call(shlex.split(f'ffmpeg -i "{source}" -vf fps=1 out_%04d.jpg'))
- async def handle_upload(args: events.UploadEventArguments):
- if 'video' in args.type:
- shutil.rmtree('data', ignore_errors=True)
- os.makedirs('data', exist_ok=True)
- os.chdir('data')
- with open(args.name, 'wb') as f:
- f.write(args.content.read())
- results.clear()
- with results:
- ui.spinner('dots', size='xl')
- await asyncio.to_thread(extract, args.name)
- results.clear()
- with results:
- for path in pathlib.Path('.').glob('*.jpg'):
- ui.image(f'/data/{path.name}').classes('w-96 drop-shadow-md rounded')
- os.chdir('..')
- else:
- ui.notify('Please upload a video file')
- upload.run_method('reset')
- os.makedirs('data', exist_ok=True)
- app.add_static_files('/data', 'data')
- with ui.column().classes('w-full items-center'):
- ui.label('Extract images from video').classes('text-3xl m-3')
- upload = ui.upload(label='pick a video file', auto_upload=True, on_upload=handle_upload)
- results = ui.row().classes('w-full justify-center mt-6')
- ui.run()
|