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)