import gradio as gr from google import genai import requests import json import re import os from urllib.parse import urlparse, parse_qs # Video ID çıkarma fonksiyonu def extract_video_id(url): youtube_regex = r'(https?://)?(www\.)?(youtube|youtu|youtube-nocookie)\.(com|be)/(watch\?v=|embed/|v/|.+\?v=)?([^&=%\?]{11})' match = re.match(youtube_regex, url) if match: return match.group(6) parsed_url = urlparse(url) if parsed_url.netloc in ['youtube.com', 'www.youtube.com']: query_params = parse_qs(parsed_url.query) if 'v' in query_params: return query_params['v'][0] if parsed_url.netloc == 'youtu.be': return parsed_url.path.strip('/') return None # RapidAPI üzerinden transkript alma fonksiyonu def get_transcript_via_rapidapi(video_url): try: video_id = extract_video_id(video_url) if not video_id: return "Geçersiz YouTube URL'si. Lütfen geçerli bir YouTube video URL'si girin." RAPID_API_KEY = os.environ.get("RAPID_API_KEY", "") if not RAPID_API_KEY: return "RapidAPI anahtarı bulunamadı. Lütfen Hugging Face Space ayarlarında RAPID_API_KEY adlı bir secret oluşturun." url = "https://youtube-transcriptor.p.rapidapi.com/transcript" querystring = {"video_id": video_id, "lang": "tr"} headers = { "X-RapidAPI-Key": RAPID_API_KEY, "X-RapidAPI-Host": "youtube-transcriptor.p.rapidapi.com" } response = requests.get(url, headers=headers, params=querystring) if response.status_code == 200: try: data = response.json() if data and 'transcriptionAsText' in data[0]: return data[0]['transcriptionAsText'] return "Transkript verileri beklenen formatta değil. Manuel olarak girmeyi deneyin." except Exception as e: return f"JSON verileri işlenirken hata: {str(e)}. API yanıtı: {response.text[:100]}..." else: return f"API yanıt vermedi (Hata kodu: {response.status_code}). Yanıt: {response.text[:100]}... Lütfen transkripti manuel olarak girin." except Exception as e: return f"Transkript alınırken hata oluştu: {str(e)}. Lütfen transkripti manuel olarak girin." # Gemini API ile metni özetleme def fn_sum_text(transkript_text, word_count, model_sel, lang_sel, action_sel): try: GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY", "") if not GEMINI_API_KEY: return "Gemini API anahtarı bulunamadı. Lütfen Hugging Face Space ayarlarında GEMINI_API_KEY adlı bir secret oluşturun." client = genai.Client(api_key=GEMINI_API_KEY) prompt = f"{transkript_text} metni {word_count} sayıda kelimeyle {lang_sel} dilinde {action_sel}" response = client.models.generate_content( model=model_sel, contents=[prompt] ) return response.text except Exception as e: return f"Özet oluşturulurken hata: {str(e)}" # Her ikisini birleştiren fonksiyon def process_video(video_url, word_count, model_sel, lang_sel, action_sel): transcript = get_transcript_via_rapidapi(video_url) if transcript.startswith("Hata") or transcript.startswith("Geçersiz") or transcript.startswith("API"): return transcript, "" summary = fn_sum_text(transcript, word_count, model_sel, lang_sel, action_sel) return transcript, summary # Gradio arayüzü with gr.Blocks(title="YouTube Transcript Özetleyici") as demo: gr.Markdown(""" # YouTube Transcript Özetleyici ## Nasıl Kullanılır: 1. YouTube video URL'sini girin 2. Özet ayarlarını yapın 3. "Transkript Al ve Özetle" butonuna tıklayın Not: Bu uygulama RapidAPI ve Gemini API'yi kullanır. API anahtarları Hugging Face Space'in secret bölümünde saklanmalıdır. """) with gr.Row(): with gr.Column(): video_url = gr.Textbox( placeholder="https://www.youtube.com/watch?v=...", label="YouTube Video URL'si" ) with gr.Accordion("Özet Ayarları", open=True): word_count = gr.Slider( minimum=50, maximum=1000, value=200, step=10, label="Özet Kelime Sayısı" ) model_sel = gr.Dropdown( choices=[ 'gemini-2.0-flash', 'gemini-2.0-flash-lite', 'gemini-1.5-pro' ], value='gemini-2.0-flash', label="Model Seçimi" ) lang_sel = gr.Dropdown( choices=[ 'Türkçe', 'İngilizce', 'Almanca', 'Fransızca', 'İspanyolca' ], value='Türkçe', label="Dil Seçimi" ) action_sel = gr.Dropdown( choices=[ 'özetle', 'tam çeviri yap', 'madde madde özetle', 'ana başlıkları çıkar' ], value='özetle', label="İşlem Türü" ) auto_process_btn = gr.Button("Transkript Al ve Özetle", variant="primary") with gr.Accordion("Manuel İşlemler", open=False): get_transcript_btn = gr.Button("Sadece Transkripti Al") summarize_btn = gr.Button("Sadece Özetle") with gr.Column(): transcript_text = gr.Textbox( label="Video Transkripti", placeholder="Transkript burada görünecek veya manuel olarak girebilirsiniz...", lines=10 ) summary_text = gr.Textbox( label="Özet Sonucu", lines=10 ) # Buton işlevleri auto_process_btn.click( fn=process_video, inputs=[video_url, word_count, model_sel, lang_sel, action_sel], outputs=[transcript_text, summary_text] ) get_transcript_btn.click( fn=get_transcript_via_rapidapi, inputs=[video_url], outputs=[transcript_text] ) summarize_btn.click( fn=fn_sum_text, inputs=[transcript_text, word_count, model_sel, lang_sel, action_sel], outputs=[summary_text] ) with gr.Accordion("Sorun Giderme", open=False): gr.Markdown(""" ### Sık Karşılaşılan Sorunlar **"Transkript Bulunamadı" Hatası** - Videonun altyazıları bulunmuyor olabilir - Seçilen RapidAPI servisi bu video için altyazı sunmuyor olabilir - Farklı bir RapidAPI endpoint'i deneyebilirsiniz (kod içinde yorum satırlarındaki alternatif endpoint'i kullanın) **Diğer Sorunlar** - Hugging Face Space'in loglarını kontrol edin - RapidAPI kullanım limitinizi aşmış olabilirsiniz """) # Uygulamayı başlat if __name__ == '__main__': demo.launch()