13ze's picture
Update app.py
d1b9860 verified
import gradio as gr
import yt_dlp as youtube_dl
from pydub import AudioSegment
from pydub.playback import play
import os
import tempfile
# Função para baixar o vídeo e converter para áudio AAC
def download_and_convert(url):
ydl_opts = {
'format': 'bestaudio/best',
'outtmpl': '%(title)s.%(ext)s',
'noplaylist': True,
'quiet': True,
'http_headers': {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
}
try:
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(url, download=True)
video_title = info['title']
video_ext = info['ext']
# Caminho do vídeo baixado
temp_dir = tempfile.mkdtemp()
video_path = os.path.join(temp_dir, f"{video_title}.{video_ext}")
audio_path = os.path.join(temp_dir, f"{video_title}.aac")
# Verifica se o arquivo de vídeo foi baixado
if not os.path.exists(video_path):
return None, temp_dir
# Converter para áudio AAC
video = AudioSegment.from_file(video_path)
video.export(audio_path, format='aac')
# Deletar o arquivo de vídeo original
os.remove(video_path)
return audio_path, temp_dir
except Exception as e:
return str(e), None
# Função para tocar o áudio e preparar o próximo em background
def play_audio_and_prepare_next(urls):
if not urls:
return "Nenhuma URL fornecida."
urls = urls.split('\n')
audio_paths = []
temp_dirs = []
for url in urls:
audio_path, temp_dir = download_and_convert(url)
if audio_path is None:
return f"Erro ao baixar o vídeo: {url}"
if isinstance(audio_path, str) and "ERROR" in audio_path:
return audio_path
audio_paths.append(audio_path)
temp_dirs.append(temp_dir)
# Tocar o áudio
for audio_path, temp_dir in zip(audio_paths, temp_dirs):
audio = AudioSegment.from_file(audio_path)
play(audio)
# Deletar o arquivo de áudio após a reprodução
os.remove(audio_path)
os.rmdir(temp_dir)
return "Reprodução concluída."
# Interface do Gradio
with gr.Blocks() as demo:
gr.Markdown("### YouTube Audio Player")
url_input = gr.Textbox(placeholder="Cole a URL do vídeo ou playlist do YouTube aqui...")
play_button = gr.Button("Tocar")
output = gr.Textbox()
play_button.click(play_audio_and_prepare_next, inputs=url_input, outputs=output)
# Rodar a aplicação no Hugging Face Spaces
demo.launch()