Spaces:
Sleeping
Sleeping
import gradio as gr | |
from video_processing import process_video, download_video, find_scenes, analyze_scenes, extract_best_scene, cleanup_temp_files | |
from gradio.themes.base import Base | |
from gradio.themes.utils import colors, fonts, sizes | |
import uuid | |
import os | |
from typing import Iterable | |
class CustomTheme(Base): | |
def __init__( | |
self, | |
*, | |
primary_hue: colors.Color | str = colors.orange, | |
secondary_hue: colors.Color | str = colors.orange, | |
neutral_hue: colors.Color | str = colors.gray, | |
spacing_size: sizes.Size | str = sizes.spacing_md, | |
radius_size: sizes.Size | str = sizes.radius_md, | |
text_size: sizes.Size | str = sizes.text_md, | |
font: fonts.Font | str | Iterable[fonts.Font | str] = ( | |
fonts.GoogleFont("Sora"), | |
"ui-sans-serif", | |
"sans-serif", | |
), | |
font_mono: fonts.Font | str | Iterable[fonts.Font | str] = ( | |
fonts.GoogleFont("Sora"), | |
"ui-monospace", | |
"monospace", | |
), | |
): | |
super().__init__( | |
primary_hue=primary_hue, | |
secondary_hue=secondary_hue, | |
neutral_hue=neutral_hue, | |
spacing_size=spacing_size, | |
radius_size=radius_size, | |
text_size=text_size, | |
font=font, | |
font_mono=font_mono, | |
) | |
super().set( | |
body_background_fill="radial-gradient(circle at center, rgba(235, 87, 38, 1) 0%, rgba(235, 87, 38, 0) 70%), radial-gradient(#eb5726 1px, transparent 1px)", | |
body_text_color="#282828", | |
block_background_fill="#ffffff", | |
block_title_text_color="#eb5726", | |
block_label_text_color="#eb5726", | |
button_primary_background_fill="#eb5726", | |
button_primary_text_color="#ffffff", | |
) | |
custom_theme = CustomTheme() | |
def save_uploaded_file(uploaded_file): | |
upload_dir = "uploaded_videos" | |
os.makedirs(upload_dir, exist_ok=True) | |
file_path = os.path.join(upload_dir, f"{uuid.uuid4()}.mp4") | |
with open(file_path, "wb") as f: | |
f.write(uploaded_file) | |
return file_path | |
def display_results(video_url, video_file, description): | |
if video_url: | |
video_path = download_video(video_url) | |
elif video_file: | |
video_path = save_uploaded_file(video_file) | |
else: | |
return "No video provided", None, None | |
scenes = find_scenes(video_path) | |
if not scenes: | |
return "No scenes detected", None, None | |
best_scene_info = analyze_scenes(video_path, scenes, description) | |
if best_scene_info: | |
best_scene = best_scene_info[0] | |
sentiment_distribution = best_scene_info[4] # Ensure you're accessing the correct index for sentiment_distribution | |
final_clip = extract_best_scene(video_path, best_scene) | |
if final_clip: | |
output_dir = "output" | |
os.makedirs(output_dir, exist_ok=True) | |
final_clip_path = os.path.join(output_dir, f"{uuid.uuid4()}_final_clip.mp4") | |
final_clip.write_videofile(final_clip_path, codec='libx264', audio_codec='aac') | |
cleanup_temp_files() | |
# Check if sentiment_distribution is correctly obtained | |
if sentiment_distribution: | |
plot = create_radial_plot(sentiment_distribution) | |
return final_clip_path, plot | |
else: | |
return final_clip_path, "No sentiment data available" | |
else: | |
return "No matching scene found", None | |
else: | |
return "No suitable scenes found", None | |
# Custom CSS for additional styling | |
css = """ | |
body { | |
background-color: #ffffff; | |
background-image: radial-gradient(#eb5726 1px, transparent 1px); | |
background-size: 10px 10px; | |
background-repeat: repeat; | |
background-attachment: fixed; | |
} | |
#video_url { | |
background-color: #ffffff; | |
color: #282828; | |
border: 2px solid #eb5726; | |
} | |
#description { | |
background-color: #ffffff; | |
color: #282828; | |
border: 2px solid #eb5726; | |
} | |
#submit_button { | |
background-color: #eb5726; | |
color: #ffffff; | |
border: 2px solid #ffffff; | |
} | |
#submit_button:hover { | |
background-color: #f5986e; | |
color: #ffffff; | |
border: 2px solid #ffffff; | |
} | |
label[for="video_url"], label[for="description"] { | |
color: #eb5726 !important; | |
} | |
h3 { | |
color: #eb5726; | |
} | |
.centered-markdown { | |
text-align: center; | |
background-color: #ffffff; | |
padding: 10px; | |
} | |
#sickstadium-title { | |
font-size: 3em !important; | |
font-weight: bold; | |
text-transform: uppercase; | |
} | |
""" | |
with gr.Blocks(theme=custom_theme, css=css) as demo: | |
with gr.Column(): | |
gr.Markdown("# **Sickstadium AI**", elem_classes="centered-markdown", elem_id="sickstadium-title") | |
gr.Markdown("### Upload your videos. Find sick clips. Tell your truth.", elem_classes="centered-markdown") | |
video_url = gr.Textbox(label="Video URL:", elem_id="video_url") | |
video_file = gr.File(label="Upload Video File:", interactive=True, file_types=["video"], type="binary") | |
description = gr.Textbox(label="Describe your clip:", elem_id="description") | |
submit_button = gr.Button("Process Video", elem_id="submit_button") | |
video_output = gr.Video(label="Processed Video", elem_id="video_output") | |
sentiment_plot = gr.Plot(label="Sentiment Distribution", elem_id="sentiment_plot") | |
submit_button.click( | |
fn=display_results, | |
inputs=[video_url, video_file, description], | |
outputs=[video_output, sentiment_plot] | |
) | |
demo.launch() | |