from youtubesearchpython import VideosSearch, Transcript import gradio as gr import openai import os import requests def search_youtube_videos(keyword): videos_search = VideosSearch(keyword, limit=5) results = videos_search.result() video_urls = [video['link'] for video in results['result']] return video_urls def get_transcript(urls): contents = '' for url in urls: data = Transcript.get(url) text = "" for segment in data['segments']: text += segment['text'] contents += text return contents def summarize_text(contents, OPENAI_API_KEY): API_URL = "https://api.openai.com/v1/chat/completions" payload = { "model": "gpt-4-0125-preview", "messages": [{ "role": "system", "content": "당신은 내용을 요약하는 챗봇입니다." }, { "role": "user", "content": f"유튜브 내용인 '{contents}'에 대해 요약해주세요." }], } headers = { "Content-Type": "application/json", "Authorization": f"Bearer {OPENAI_API_KEY}" } response = requests.post(API_URL, headers=headers, json=payload) if response.status_code == 200: data = response.json() return data["choices"][0]["message"]["content"] else: # 오류 메시지 개선 return f"오류가 발생했습니다. 상태 코드: {response.status_code}, 메시지: {response.json().get('error', {}).get('message', 'Unknown error')}", "" def summarize_youtube_videos(keyword, OPENAI_API_KEY): urls = search_youtube_videos(keyword) contents = get_transcript(urls) summary = summarize_text(contents, OPENAI_API_KEY) return summary with gr.Blocks(css="footer {visibility: hidden;}") as demo: with gr.Tab("youtube"): keyword = gr.Textbox(label="keyword", placeholder='키워드를 입력하세요. (예.비트코인)') OPENAI_API_KEY = gr.Textbox(label="OpenAI API 키", placeholder="OpenAI API 키를 입력하세요") analysis_result = gr.HTML() analysis_btn = gr.Button("submit") analysis_btn.click( fn=summarize_youtube_videos, inputs=[keyword, OPENAI_API_KEY], outputs=[analysis_result] ) demo.launch()