import gradio as gr import os import tempfile import shutil from datetime import datetime from pathlib import Path def save_video(video_path, filename=None): """Save video to a temporary file for download""" if video_path is None: return "❌ Please upload or record a video first!", None # Generate filename if not provided if not filename: timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") if hasattr(video_path, 'name'): original_name = Path(video_path.name).stem filename = f"{original_name}_{timestamp}.mp4" else: filename = f"video_{timestamp}.mp4" elif not filename.endswith('.mp4'): filename += '.mp4' # Create temp directory for the download file temp_dir = tempfile.mkdtemp() dest_path = os.path.join(temp_dir, filename) try: # Copy the video to temp location if isinstance(video_path, str) and os.path.exists(video_path): shutil.copy2(video_path, dest_path) else: # Handle Gradio's temporary file object with open(video_path, 'rb') as src: with open(dest_path, 'wb') as dst: shutil.copyfileobj(src, dst) return f"✅ Video ready for download: {filename}", dest_path except Exception as e: return f"❌ Error processing video: {str(e)}", None def clear_all(): """Clear all inputs and outputs""" return None, None, None, "" def update_video_display(video_path): """Update the video display when a new video is uploaded/recorded""" if video_path: return video_path, f"📹 Video loaded: {os.path.basename(video_path) if hasattr(video_path, 'name') else 'Recorded video'}" return None, "" # Create the Gradio interface with gr.Blocks(title="🎥 Simple Video Recorder") as demo: gr.Markdown(""" # 🎥 Simple Video Recorder Record a video using your webcam or upload an existing video file. Then download it with a custom filename! """) with gr.Row(): with gr.Column(scale=1): gr.Markdown("### 📤 Input") video_input = gr.Video( label="Record or Upload Video", sources=["webcam", "upload"], interactive=True, include_audio=True, height=300 ) filename_input = gr.Textbox( label="Download Filename (optional)", placeholder="my_video.mp4 or leave blank for auto-name", info="Leave blank for automatic naming: originalname_timestamp.mp4" ) with gr.Row(): process_btn = gr.Button("📥 Prepare for Download", variant="primary", scale=2) clear_btn = gr.Button("🗑️ Clear All", variant="secondary", scale=1) with gr.Column(scale=1): gr.Markdown("### 📥 Output") status_output = gr.Textbox( label="Status", value="👋 Ready to record or upload a video!", interactive=False, lines=3 ) video_display = gr.Video( label="Preview", interactive=False, height=300 ) download_file = gr.File( label="Download Video", interactive=False, file_types=[".mp4", ".mov", ".avi", ".webm"] ) # Update video display and status when video is uploaded/recorded video_input.change( fn=update_video_display, inputs=[video_input], outputs=[video_display, status_output] ) # Process video for download process_btn.click( fn=save_video, inputs=[video_input, filename_input], outputs=[status_output, download_file] ) # Clear all inputs and outputs clear_btn.click( fn=clear_all, outputs=[video_input, video_display, download_file, status_output] ) # Instructions gr.Markdown(""" ## 📋 How to Use: 1. **Record**: Click the webcam icon to record a video using your camera 2. **Upload**: Click the upload button to select a video file from your computer 3. **Optional**: Enter a custom filename for download (or leave blank for auto-naming) 4. **Prepare**: Click "Prepare for Download" to generate the downloadable file 5. **Download**: Click the download button that appears in the Download section ## 📝 Notes: - Supported formats: MP4, MOV, AVI, WebM - Videos are processed temporarily and can be downloaded immediately - Use "Clear All" to start fresh """) # Launch configuration if __name__ == "__main__": demo.launch( theme="soft", css=""" .gradio-container {max-width: 900px !important;} .video-container {border-radius: 10px; overflow: hidden;} .status-box {background: #f0f7ff; padding: 15px; border-radius: 8px; border-left: 4px solid #4a90e2;} """ )