Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import requests
|
3 |
+
import json
|
4 |
+
import gradio as gr
|
5 |
+
import re
|
6 |
+
|
7 |
+
# Hugging Face 환경 변수로부터 RapidAPI 키와 호스트 가져오기
|
8 |
+
AA_KEY = os.getenv("AA_KEY")
|
9 |
+
AA_HOST = "youtube-transcriptor.p.rapidapi.com"
|
10 |
+
|
11 |
+
def get_video_id(youtube_url):
|
12 |
+
# 다양한 YouTube URL 형식에 대한 정규표현식 패턴
|
13 |
+
patterns = [
|
14 |
+
r"(?:v=|\/)([0-9A-Za-z_-]{11}).*", # 일반적인 YouTube URL 및 Shorts URL
|
15 |
+
r"(?:youtu\.be\/|youtube.com\/shorts\/)([0-9A-Za-z_-]{11})", # 단축 URL 및 Shorts URL
|
16 |
+
r"^[0-9A-Za-z_-]{11}$" # 비디오 ID만 입력된 경우
|
17 |
+
]
|
18 |
+
|
19 |
+
# URL에서 쿼리 파라미터 제거
|
20 |
+
url_without_params = youtube_url.split('?')[0]
|
21 |
+
|
22 |
+
for pattern in patterns:
|
23 |
+
match = re.search(pattern, url_without_params)
|
24 |
+
if match:
|
25 |
+
return match.group(1)
|
26 |
+
|
27 |
+
return None
|
28 |
+
|
29 |
+
# 자막 언어 우선순위 리스트
|
30 |
+
LANGUAGE_PRIORITY = ['ko', 'en', 'ja', 'zh']
|
31 |
+
|
32 |
+
# 유튜브 자막을 요청하는 함수 (언어 우선순위를 적용하여 시도)
|
33 |
+
def get_youtube_transcript(youtube_url):
|
34 |
+
# 비디오 ID 추출
|
35 |
+
video_id = get_video_id(youtube_url)
|
36 |
+
if video_id is None:
|
37 |
+
return {"error": "잘못된 유튜브 URL입니다. 비디오 ID를 찾을 수 없습니다."}
|
38 |
+
|
39 |
+
url = "https://youtube-transcriptor.p.rapidapi.com/transcript"
|
40 |
+
|
41 |
+
headers = {
|
42 |
+
"x-rapidapi-key": AA_KEY,
|
43 |
+
"x-rapidapi-host": AA_HOST
|
44 |
+
}
|
45 |
+
|
46 |
+
# 언어 우선순위에 따라 순차적으로 요청을 시도
|
47 |
+
for lang in LANGUAGE_PRIORITY:
|
48 |
+
querystring = {"video_id": video_id, "lang": lang}
|
49 |
+
try:
|
50 |
+
response = requests.get(url, headers=headers, params=querystring)
|
51 |
+
response.raise_for_status() # 오류 상태 코드에 대해 예외 발생
|
52 |
+
|
53 |
+
data = response.json()
|
54 |
+
|
55 |
+
# 자막이 없는 경우 처리
|
56 |
+
if "transcript" not in data or not data["transcript"]:
|
57 |
+
continue
|
58 |
+
|
59 |
+
return {"language": lang, "data": data}
|
60 |
+
|
61 |
+
except requests.exceptions.RequestException as e:
|
62 |
+
print(f"Error for language {lang}: {str(e)}")
|
63 |
+
continue
|
64 |
+
except json.JSONDecodeError as e:
|
65 |
+
print(f"JSON Decode Error for language {lang}: {str(e)}")
|
66 |
+
continue
|
67 |
+
|
68 |
+
# 모든 언어에서 자막을 찾지 못한 경우
|
69 |
+
return {"error": "우선순위 언어로 자막을 찾을 수 없습니다. 해당 동영상에 자막이 없거나 접근할 수 없습니다."}
|
70 |
+
|
71 |
+
# Gradio 인터페이스 정의
|
72 |
+
def youtube_transcript_interface(youtube_url):
|
73 |
+
# 자막 데이터 가져오기
|
74 |
+
transcript_data = get_youtube_transcript(youtube_url)
|
75 |
+
|
76 |
+
# 결과 출력
|
77 |
+
return json.dumps(transcript_data, ensure_ascii=False, indent=2)
|
78 |
+
|
79 |
+
# Gradio 인터페이스 생성
|
80 |
+
interface = gr.Interface(
|
81 |
+
fn=youtube_transcript_interface,
|
82 |
+
inputs="text",
|
83 |
+
outputs="text",
|
84 |
+
title="YouTube 자막 추출기",
|
85 |
+
description="유튜브 URL을 입력하세요."
|
86 |
+
)
|
87 |
+
|
88 |
+
# Gradio 인터페이스 실행
|
89 |
+
interface.launch()
|