ytthumbgen / app.py
XOFSOUNDIA's picture
Update app.py
c1c787a verified
import gradio as gr
import replicate
import os
from pytube import YouTube
from urllib.parse import urlparse, parse_qs
import requests
from PIL import Image
from io import BytesIO
# Clé API Replicate récupérée depuis Hugging Face secrets
REPLICATE_API_TOKEN = os.environ.get("REPLICATE_API_TOKEN")
# Nettoyage d'URL YouTube
def clean_youtube_url(url):
parsed_url = urlparse(url)
video_id = parse_qs(parsed_url.query).get("v", [None])[0]
return f"https://www.youtube.com/watch?v={video_id}" if video_id else None
# Fonction principale de génération
def generate_from_youtube(url, style, ambiance):
try:
clean_url = clean_youtube_url(url)
yt = YouTube(clean_url)
title = yt.title
prompt = f"Miniature YouTube pour un clip {style}, ambiance {ambiance}, titre : {title}"
except Exception as e:
prompt = f"Miniature YouTube {style}, ambiance {ambiance}"
try:
output = replicate.run(
"stability-ai/stable-diffusion",
input={
"prompt": prompt,
"image_dimensions": "512x512"
}
)
# Débogage : afficher la sortie brute
print("Résultat Replicate:", output)
if not output or not isinstance(output, list) or not output[0].startswith("http"):
return f"Erreur : le modèle n'a pas renvoyé une image valide.\nRetour : {output}"
# Télécharger l'image et la convertir en objet PIL
response = requests.get(output[0])
image = Image.open(BytesIO(response.content))
return image
except Exception as e:
return f"Erreur génération : {str(e)}"
# Choix de styles musicaux proposés
style_choices = ["Rap", "Afro", "Techno", "R&B", "Pop", "Reggae", "Drill", "Autre"]
# Interface Gradio
interface = gr.Interface(
fn=generate_from_youtube,
inputs=[
gr.Textbox(label="Lien YouTube du clip"),
gr.Dropdown(style_choices, label="Style musical"),
gr.Textbox(label="Ambiance / Détail artistique (ex : sombre, festif, futuriste...)"),
],
outputs=gr.Image(type="pil", label="Miniature générée"),
title="YT Thumbnail Generator 🎬",
description="Colle un lien YouTube et génère automatiquement une miniature stylisée."
)
# Lancement
interface.launch()