Spaces:
Sleeping
Sleeping
import re | |
import gradio as gr | |
from youtube_transcript_api import YouTubeTranscriptApi | |
from youtube_transcript_api._errors import TranscriptsDisabled | |
import traceback | |
import asyncio | |
from concurrent.futures import ThreadPoolExecutor | |
# Criar um executor para executar funções síncronas de forma assíncrona | |
executor = ThreadPoolExecutor(max_workers=4) | |
def extract_video_id(youtube_url): | |
# Regex para extrair o ID do vídeo da URL do YouTube | |
match = re.search(r'(?:youtu\.be\/|(?:www\.)?youtube\.com\/(?:watch\?v=|embed\/|v\/|.+\?v=))([^&]{11})', youtube_url) | |
video_id = match.group(1) if match else None | |
print(f"URL recebida: {youtube_url}") | |
print(f"ID do vídeo extraído: {video_id}") | |
return video_id | |
def get_available_transcripts(video_id): | |
try: | |
transcript_list = YouTubeTranscriptApi.list_transcripts(video_id) | |
available_languages = [t.language_code for t in transcript_list] | |
return f"Transcrições disponíveis: {available_languages}" | |
except TranscriptsDisabled: | |
return "Não há transcrições disponíveis para este vídeo." | |
except Exception as e: | |
return f"Erro ao listar transcrições: {str(e)}" | |
def get_transcript(video_id, language="en"): | |
try: | |
print(f"Tentando obter transcrição para o vídeo ID: {video_id} no idioma: {language}") | |
transcript = YouTubeTranscriptApi.get_transcript(video_id, languages=[language]) | |
print("Transcrição obtida com sucesso.") | |
return "\n".join([f"{t['start']}: {t['text']}" for t in transcript]) | |
except TranscriptsDisabled: | |
return "Erro: As legendas estão desabilitadas para este vídeo." | |
except Exception as e: | |
available_transcripts = get_available_transcripts(video_id) | |
error_message = f"Erro ao obter transcrição: {str(e)}\n{available_transcripts}\n" | |
error_message += traceback.format_exc() | |
return error_message | |
async def async_get_transcript(video_id, language="en"): | |
loop = asyncio.get_event_loop() | |
return await loop.run_in_executor(executor, get_transcript, video_id, language) | |
async def gradio_interface(youtube_url, language): | |
video_id = extract_video_id(youtube_url) | |
if not video_id: | |
return "Erro: URL inválida. Por favor, insira um link válido do YouTube." | |
transcript = await async_get_transcript(video_id, language) | |
return transcript | |
iface = gr.Interface( | |
fn=gradio_interface, | |
inputs=[ | |
gr.Textbox(label="URL do Vídeo (YouTube)", placeholder="Ex: https://www.youtube.com/watch?v=tl1jHm0qC_4"), | |
gr.Dropdown(label="Idioma", choices=["en", "pt", "es", "fr"], value="en") | |
], | |
outputs="text", | |
title="Obter Transcrição de Vídeos do YouTube", | |
description="Insira a URL de um vídeo do YouTube e selecione o idioma da transcrição." | |
) | |
iface.launch(share=True) | |