Spaces:
Running
Running
| """ | |
| Split tab for Video Model Studio UI | |
| """ | |
| import gradio as gr | |
| import logging | |
| from typing import Dict, Any, List, Optional | |
| from .base_tab import BaseTab | |
| logger = logging.getLogger(__name__) | |
| class SplitTab(BaseTab): | |
| """Split tab for scene detection and video splitting""" | |
| def __init__(self, app_state): | |
| super().__init__(app_state) | |
| self.id = "split_tab" | |
| self.title = "2️⃣ Split" | |
| def create(self, parent=None) -> gr.TabItem: | |
| """Create the Split tab UI components""" | |
| with gr.TabItem(self.title, id=self.id) as tab: | |
| with gr.Row(): | |
| self.components["split_title"] = gr.Markdown("## Splitting of 0 videos (0 bytes)") | |
| with gr.Row(): | |
| with gr.Column(): | |
| self.components["detect_btn"] = gr.Button("Split videos into single-camera shots", variant="primary") | |
| self.components["detect_status"] = gr.Textbox(label="Status", interactive=False) | |
| with gr.Column(): | |
| self.components["video_list"] = gr.Dataframe( | |
| headers=["name", "status"], | |
| label="Videos to split", | |
| interactive=False, | |
| wrap=True | |
| ) | |
| return tab | |
| def connect_events(self) -> None: | |
| """Connect event handlers to UI components""" | |
| # Scene detection button event | |
| self.components["detect_btn"].click( | |
| fn=self.start_scene_detection, | |
| inputs=[self.app.tabs["import_tab"].components["enable_automatic_video_split"]], | |
| outputs=[self.components["detect_status"]] | |
| ) | |
| def refresh(self) -> Dict[str, Any]: | |
| """Refresh the video list with current data""" | |
| videos = self.list_unprocessed_videos() | |
| return { | |
| "video_list": videos | |
| } | |
| def list_unprocessed_videos(self) -> gr.Dataframe: | |
| """Update list of unprocessed videos""" | |
| videos = self.app.splitter.list_unprocessed_videos() | |
| # videos is already in [[name, status]] format from splitting_service | |
| return gr.Dataframe( | |
| headers=["name", "status"], | |
| value=videos, | |
| interactive=False | |
| ) | |
| async def start_scene_detection(self, enable_splitting: bool) -> str: | |
| """Start background scene detection process | |
| Args: | |
| enable_splitting: Whether to split videos into scenes | |
| """ | |
| if self.app.splitter.is_processing(): | |
| return "Scene detection already running" | |
| try: | |
| await self.app.splitter.start_processing(enable_splitting) | |
| return "Scene detection completed" | |
| except Exception as e: | |
| return f"Error during scene detection: {str(e)}" |