|
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(): |
|
keyword = gr.Textbox(label="keyword", placeholder='ํค์๋๋ฅผ ์
๋ ฅํ์ธ์. (์.๋นํธ์ฝ์ธ)') |
|
OPENAI_API_KEY = gr.Textbox(label="OpenAI API ํค", placeholder="์ฌ๊ธฐ์ OpenAI API ํค๋ฅผ ์
๋ ฅํ์ธ์") |
|
output = gr.JSON(label="๊ฒฐ๊ณผ") |
|
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() |
|
|
|
|