AtzePengg commited on
Commit ·
37617ef
1
Parent(s): 8343f2c
Add permanent Bear video example with direct URL from Hugging Face
Browse files
app.py
CHANGED
|
@@ -34,26 +34,8 @@ load_dotenv()
|
|
| 34 |
# Get default API key from environment (will be '' if not set)
|
| 35 |
DEFAULT_API_KEY = os.getenv("OPENAI_API_KEY", "")
|
| 36 |
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
# Create a temporary file
|
| 40 |
-
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4")
|
| 41 |
-
temp_filename = temp_file.name
|
| 42 |
-
temp_file.close()
|
| 43 |
-
|
| 44 |
-
# Download the video
|
| 45 |
-
response = requests.get(url, stream=True)
|
| 46 |
-
if response.status_code == 200:
|
| 47 |
-
with open(temp_filename, 'wb') as f:
|
| 48 |
-
for chunk in response.iter_content(chunk_size=8192):
|
| 49 |
-
f.write(chunk)
|
| 50 |
-
return temp_filename
|
| 51 |
-
else:
|
| 52 |
-
print(f"Failed to download video: {response.status_code}")
|
| 53 |
-
return None
|
| 54 |
-
except Exception as e:
|
| 55 |
-
print(f"Error downloading video: {e}")
|
| 56 |
-
return None
|
| 57 |
|
| 58 |
def process_frame(frame_path, style_prompt, api_key):
|
| 59 |
"""Process a single frame with GPT-4o analysis and DALL-E 3 generation"""
|
|
@@ -136,7 +118,13 @@ def stylize_video(video_path, style_prompt, api_key):
|
|
| 136 |
|
| 137 |
# Save the input video to a temporary file
|
| 138 |
if isinstance(video_path, str):
|
| 139 |
-
if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 140 |
# It's a file path, copy it
|
| 141 |
shutil.copy(video_path, input_filename)
|
| 142 |
else:
|
|
@@ -219,28 +207,22 @@ def stylize_video(video_path, style_prompt, api_key):
|
|
| 219 |
print(f"Error: {str(e)}\n{traceback_str}")
|
| 220 |
return None, f"Error: {str(e)}"
|
| 221 |
|
| 222 |
-
def
|
| 223 |
-
"""
|
| 224 |
-
|
| 225 |
-
bear_url = "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4"
|
| 226 |
-
|
| 227 |
-
# Download the video to a temporary file
|
| 228 |
-
temp_video_path = download_video_from_url(bear_url)
|
| 229 |
-
if temp_video_path:
|
| 230 |
-
return temp_video_path, "Studio Ghibli animation with Hayao Miyazaki's distinctive hand-drawn art style"
|
| 231 |
-
else:
|
| 232 |
-
# Return a more descriptive error message
|
| 233 |
-
print("Failed to download sample video. Using fallback.")
|
| 234 |
-
# If download fails, try a direct URL
|
| 235 |
-
return bear_url, "Studio Ghibli animation with Hayao Miyazaki's distinctive hand-drawn art style"
|
| 236 |
|
| 237 |
with gr.Blocks(title="Video-to-Ghibli Style Converter") as iface:
|
| 238 |
gr.Markdown("# Video-to-Ghibli Style Converter")
|
| 239 |
gr.Markdown("Upload a video and convert it to Studio Ghibli animation style using GPT-4o and DALL-E 3.")
|
| 240 |
|
| 241 |
with gr.Row():
|
| 242 |
-
with gr.Column():
|
|
|
|
| 243 |
video_input = gr.Video(label="Upload Video (up to 15 seconds)")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 244 |
api_key = gr.Textbox(
|
| 245 |
label="OpenAI API Key (requires GPT-4o and DALL-E 3 access)",
|
| 246 |
type="password",
|
|
@@ -251,13 +233,12 @@ with gr.Blocks(title="Video-to-Ghibli Style Converter") as iface:
|
|
| 251 |
value="Studio Ghibli animation with Hayao Miyazaki's distinctive hand-drawn art style"
|
| 252 |
)
|
| 253 |
|
| 254 |
-
|
| 255 |
-
submit_btn = gr.Button("Stylize Video", variant="primary")
|
| 256 |
-
example_btn = gr.Button("Use Sample Bear Video")
|
| 257 |
|
| 258 |
-
with gr.Column():
|
|
|
|
| 259 |
video_output = gr.Video(label="Stylized Video")
|
| 260 |
-
status_output = gr.Textbox(label="Status", value="Ready. Upload a video or use the
|
| 261 |
|
| 262 |
submit_btn.click(
|
| 263 |
fn=stylize_video,
|
|
@@ -265,19 +246,19 @@ with gr.Blocks(title="Video-to-Ghibli Style Converter") as iface:
|
|
| 265 |
outputs=[video_output, status_output]
|
| 266 |
)
|
| 267 |
|
| 268 |
-
def
|
| 269 |
-
video, prompt =
|
| 270 |
-
return video, prompt, "
|
| 271 |
|
| 272 |
example_btn.click(
|
| 273 |
-
fn=
|
| 274 |
inputs=None,
|
| 275 |
outputs=[video_input, style_prompt, status_output]
|
| 276 |
)
|
| 277 |
|
| 278 |
gr.Markdown("""
|
| 279 |
## Instructions
|
| 280 |
-
1. Upload a video up to 15 seconds long or use the
|
| 281 |
2. Enter your OpenAI API key with GPT-4o and DALL-E 3 access
|
| 282 |
3. Customize the style prompt if desired
|
| 283 |
4. Click "Stylize Video" and wait for processing
|
|
|
|
| 34 |
# Get default API key from environment (will be '' if not set)
|
| 35 |
DEFAULT_API_KEY = os.getenv("OPENAI_API_KEY", "")
|
| 36 |
|
| 37 |
+
# Embed the Bear.mp4 video directly from a guaranteed source
|
| 38 |
+
BEAR_VIDEO_URL = "https://huggingface.co/spaces/gradio/video_component/resolve/main/files/Bear.mp4"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
|
| 40 |
def process_frame(frame_path, style_prompt, api_key):
|
| 41 |
"""Process a single frame with GPT-4o analysis and DALL-E 3 generation"""
|
|
|
|
| 118 |
|
| 119 |
# Save the input video to a temporary file
|
| 120 |
if isinstance(video_path, str):
|
| 121 |
+
if video_path.startswith('http'):
|
| 122 |
+
# It's a URL, download it
|
| 123 |
+
response = requests.get(video_path, stream=True)
|
| 124 |
+
with open(input_filename, 'wb') as f:
|
| 125 |
+
for chunk in response.iter_content(chunk_size=8192):
|
| 126 |
+
f.write(chunk)
|
| 127 |
+
elif os.path.exists(video_path):
|
| 128 |
# It's a file path, copy it
|
| 129 |
shutil.copy(video_path, input_filename)
|
| 130 |
else:
|
|
|
|
| 207 |
print(f"Error: {str(e)}\n{traceback_str}")
|
| 208 |
return None, f"Error: {str(e)}"
|
| 209 |
|
| 210 |
+
def use_bear_video():
|
| 211 |
+
"""Loads the Bear.mp4 sample video"""
|
| 212 |
+
return BEAR_VIDEO_URL, "Studio Ghibli animation with Hayao Miyazaki's distinctive hand-drawn art style"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 213 |
|
| 214 |
with gr.Blocks(title="Video-to-Ghibli Style Converter") as iface:
|
| 215 |
gr.Markdown("# Video-to-Ghibli Style Converter")
|
| 216 |
gr.Markdown("Upload a video and convert it to Studio Ghibli animation style using GPT-4o and DALL-E 3.")
|
| 217 |
|
| 218 |
with gr.Row():
|
| 219 |
+
with gr.Column(scale=2):
|
| 220 |
+
# Main input column
|
| 221 |
video_input = gr.Video(label="Upload Video (up to 15 seconds)")
|
| 222 |
+
with gr.Row():
|
| 223 |
+
# Add example button in its own row
|
| 224 |
+
example_btn = gr.Button("Use Bear Video Example", variant="secondary")
|
| 225 |
+
|
| 226 |
api_key = gr.Textbox(
|
| 227 |
label="OpenAI API Key (requires GPT-4o and DALL-E 3 access)",
|
| 228 |
type="password",
|
|
|
|
| 233 |
value="Studio Ghibli animation with Hayao Miyazaki's distinctive hand-drawn art style"
|
| 234 |
)
|
| 235 |
|
| 236 |
+
submit_btn = gr.Button("Stylize Video", variant="primary")
|
|
|
|
|
|
|
| 237 |
|
| 238 |
+
with gr.Column(scale=2):
|
| 239 |
+
# Output column
|
| 240 |
video_output = gr.Video(label="Stylized Video")
|
| 241 |
+
status_output = gr.Textbox(label="Status", value="Ready. Upload a video or use the Bear video example.")
|
| 242 |
|
| 243 |
submit_btn.click(
|
| 244 |
fn=stylize_video,
|
|
|
|
| 246 |
outputs=[video_output, status_output]
|
| 247 |
)
|
| 248 |
|
| 249 |
+
def load_bear_and_update_status():
|
| 250 |
+
video, prompt = use_bear_video()
|
| 251 |
+
return video, prompt, "Bear video loaded. Enter your OpenAI API key and click 'Stylize Video'."
|
| 252 |
|
| 253 |
example_btn.click(
|
| 254 |
+
fn=load_bear_and_update_status,
|
| 255 |
inputs=None,
|
| 256 |
outputs=[video_input, style_prompt, status_output]
|
| 257 |
)
|
| 258 |
|
| 259 |
gr.Markdown("""
|
| 260 |
## Instructions
|
| 261 |
+
1. Upload a video up to 15 seconds long or use the Bear video example
|
| 262 |
2. Enter your OpenAI API key with GPT-4o and DALL-E 3 access
|
| 263 |
3. Customize the style prompt if desired
|
| 264 |
4. Click "Stylize Video" and wait for processing
|