script / app.py
yoon2566's picture
Update app.py
f640b97 verified
raw
history blame
2.67 kB
import gradio as gr
from youtube_transcript_api import YouTubeTranscriptApi
from youtube_transcript_api._errors import NoTranscriptFound, TranscriptsDisabled
import re
def extract_video_id(url):
"""YouTube URLμ—μ„œ λΉ„λ””μ˜€ IDλ₯Ό μΆ”μΆœν•˜λŠ” ν•¨μˆ˜"""
video_id = None
if 'youtube.com/watch?v=' in url:
video_id = url.split('youtube.com/watch?v=')[1][:11]
elif 'youtu.be/' in url:
video_id = url.split('youtu.be/')[1][:11]
return video_id
def get_transcript(url):
"""YouTube μ˜μƒμ˜ 슀크립트λ₯Ό μΆ”μΆœν•˜λŠ” ν•¨μˆ˜"""
try:
video_id = extract_video_id(url)
if not video_id:
return "μ˜¬λ°”λ₯Έ YouTube URL을 μž…λ ₯ν•΄μ£Όμ„Έμš”."
try:
# λ¨Όμ € ν•œκ΅­μ–΄ μžλ§‰ μ‹œλ„
transcript_list = YouTubeTranscriptApi.get_transcript(video_id, languages=['ko'])
except NoTranscriptFound:
try:
# ν•œκ΅­μ–΄ μžλ§‰μ΄ μ—†μœΌλ©΄ μ˜μ–΄ μžλ§‰ μ‹œλ„
transcript_list = YouTubeTranscriptApi.get_transcript(video_id, languages=['en'])
except NoTranscriptFound:
try:
# 일반 μžλ§‰μ΄ μ—†μœΌλ©΄ μžλ™ μƒμ„±λœ μžλ§‰ μ‹œλ„
transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)
transcript = transcript_list.find_generated_transcript(['ko', 'en'])
transcript_list = transcript.fetch()
except:
return "이 μ˜μƒμ—λŠ” μžλ§‰μ΄ μ—†κ±°λ‚˜ μžλ§‰μ„ κ°€μ Έμ˜¬ 수 μ—†μŠ΅λ‹ˆλ‹€."
# 전체 슀크립트 ν…μŠ€νŠΈ ꡬ성
full_transcript = ""
for transcript in transcript_list:
text = transcript['text']
timestamp = transcript['start']
minutes = int(timestamp // 60)
seconds = int(timestamp % 60)
full_transcript += f"[{minutes:02d}:{seconds:02d}] {text}\n"
return full_transcript
except TranscriptsDisabled:
return "이 μ˜μƒμ€ μžλ§‰μ΄ λΉ„ν™œμ„±ν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€."
except Exception as e:
return f"였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}"
# Gradio μΈν„°νŽ˜μ΄μŠ€ 생성
iface = gr.Interface(
fn=get_transcript,
inputs=gr.Textbox(label="YouTube URL을 μž…λ ₯ν•˜μ„Έμš”"),
outputs=gr.Textbox(label="μΆ”μΆœλœ 슀크립트", lines=10),
title="YouTube 슀크립트 μΆ”μΆœκΈ°",
description="YouTube μ˜μƒμ˜ URL을 μž…λ ₯ν•˜λ©΄ μžλ™μœΌλ‘œ 슀크립트λ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€. (일반 μžλ§‰ λ˜λŠ” μžλ™ μƒμ„±λœ μžλ§‰)"
)
# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰
if __name__ == "__main__":
iface.launch()