AIRider commited on
Commit
f6753a4
·
verified ·
1 Parent(s): 9c0a72e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +89 -0
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()