|
""" |
|
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""" |
|
|
|
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() |
|
|
|
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)}" |