Sodagraph commited on
Commit
efb5a4e
·
1 Parent(s): 7be6cd6
Dockerfile CHANGED
@@ -41,22 +41,9 @@ COPY backend/ ./backend/
41
  ENV TRANSFORMERS_CACHE="/tmp/hf_cache"
42
  ENV HF_HOME="/tmp/hf_cache"
43
 
44
- # Ollama 설치 및 모델 다운로드 단계 제거 ✨
45
- # 부분은 Hugging Face Spaces 환경에서 관리됩니다.
46
- # RUN curl -fsSL https://ollama.com/install.sh | sh
47
- # RUN sh -c "ollama serve & \
48
- # ATTEMPTS=0; \
49
- # while ! curl -s http://localhost:11434 > /dev/null && ATTEMPTS < 30; do \
50
- # ATTEMPTS=$((ATTEMPTS+1)); \
51
- # echo 'Waiting for Ollama server to start... (Attempt '$ATTEMPTS'/30)'; \
52
- # sleep 2; \
53
- # done; \
54
- # if [ $ATTEMPTS -eq 30 ]; then \
55
- # echo 'Ollama server did not start in time. Exiting.'; \
56
- # exit 1; \
57
- # fi; \
58
- # echo 'Ollama server started. Pulling model...'; \
59
- # ollama pull hf.co/DevQuasar/naver-hyperclovax.HyperCLOVAX-SEED-Text-Instruct-0.5B-GGUF:F16"
60
 
61
  # 프론트엔드 빌드 결과물을 백엔드 앱이 접근할 수 있는 경로로 복사합니다.
62
  # /app/static 폴더를 만들고 그 안에 Vue.js 빌드 결과물을 넣습니다.
@@ -72,4 +59,4 @@ EXPOSE 7860
72
  # 백엔드 main.py의 `OLLAMA_API_BASE_URL` 환경 변수가 `http://127.0.0.1:11434`로 설정되어 있는지 확인하세요.
73
  # (Hugging Face Spaces에서 Ollama SDK를 사용하면 보통 이 주소로 접근 가능합니다.)
74
  # 수정: ${PORT:-7860} 대신 7860을 직접 사용하거나, sh -c로 쉘이 환경 변수를 해석하도록 합니다.
75
- CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port ${PORT:-7860} --app-dir backend/app"]
 
41
  ENV TRANSFORMERS_CACHE="/tmp/hf_cache"
42
  ENV HF_HOME="/tmp/hf_cache"
43
 
44
+ COPY install_ollama.sh /usr/local/bin/
45
+ RUN chmod +x /usr/local/bin/install_ollama.sh
46
+ RUN install_ollama.sh
 
 
 
 
 
 
 
 
 
 
 
 
 
47
 
48
  # 프론트엔드 빌드 결과물을 백엔드 앱이 접근할 수 있는 경로로 복사합니다.
49
  # /app/static 폴더를 만들고 그 안에 Vue.js 빌드 결과물을 넣습니다.
 
59
  # 백엔드 main.py의 `OLLAMA_API_BASE_URL` 환경 변수가 `http://127.0.0.1:11434`로 설정되어 있는지 확인하세요.
60
  # (Hugging Face Spaces에서 Ollama SDK를 사용하면 보통 이 주소로 접근 가능합니다.)
61
  # 수정: ${PORT:-7860} 대신 7860을 직접 사용하거나, sh -c로 쉘이 환경 변수를 해석하도록 합니다.
62
+ CMD ["sh", "-c", "ollama serve & uvicorn main:app --host 0.0.0.0 --port ${PORT:-7860} --app-dir backend/app"]
backend/app/__init__.py CHANGED
@@ -0,0 +1 @@
 
 
1
+ __version__ = "0.1.0"
backend/app/proxy_manager.py CHANGED
@@ -1,54 +1,31 @@
1
- # ./backend/app/proxy_manager.py
2
-
3
- import os
4
- import requests # requests는 FreeProxy 테스트나 ScrapingBee API 직접 호출 시 유용
5
- from loguru import logger
6
- from dotenv import load_dotenv
7
-
8
- # .env 파일에서 환경 변수 로드
9
- load_dotenv()
10
-
11
- # ScrapingBee API 키 (Proxy Mode를 사용한다면 필요 없을 수 있음)
12
- SCRAPINGBEE_API_KEY = os.getenv("SCRAPINGBEE_API_KEY")
13
-
14
- # ScrapingBee Proxy Mode 주소 (대시보드에서 확인한 실제 프록시 서버 주소)
15
- SCRAPINGBEE_PROXY_ADDRESS = os.getenv("SCRAPINGBEE_PROXY_ADDRESS")
16
-
17
- # FreeProxy 라이브러리 (필요하다면 주석 해제)
18
- # from fp.fp import FreeProxy
19
- # import asyncio # FreeProxy가 비동기로 동작한다면 필요
20
-
21
- async def get_proxy_url() -> str | None:
22
- """
23
- 현재 설정된 프록시 제공자로부터 프록시 URL을 가져옵니다.
24
- 나중에 다른 프록시 제공자로 변경 시 이 함수 내부만 수정하면 됩니다.
25
- """
26
- # ----------------------------------------------------
27
- # ScrapingBee Proxy Mode 사용 예시 (추천)
28
- # ScrapingBee 대시보드에서 얻은 프록시 주소를 사용합니다.
29
- # .env 파일에 SCRAPINGBEE_PROXY_ADDRESS="us.scrapingbee.com:8880" 형태로 설정
30
- if SCRAPINGBEE_PROXY_ADDRESS:
31
- logger.info(f"ScrapingBee Proxy Mode 프록시 사용 시도: {SCRAPINGBEE_PROXY_ADDRESS}")
32
- return SCRAPINGBEE_PROXY_ADDRESS
33
- # ----------------------------------------------------
34
-
35
- # ----------------------------------------------------
36
- # FreeProxy 사용 예시 (폴백 또는 다른 선택지)
37
- # 위에서 ScrapingBee 프록시를 찾지 못했거나 사용하지 않으려는 경우
38
- # 주석을 해제하고 FreeProxy를 사용하도록 설정할 수 있습니다.
39
- # try:
40
- # logger.info("FreeProxy를 사용하여 무료 프록시 가져오기 시도...")
41
- # # Hugging Face Spaces 허용 포트 (80, 443, 8080)만 필터링
42
- # proxy_address = FreeProxy(timeout=1, port=[80, 443, 8080], https=True, rand=True).get()
43
- # if proxy_address:
44
- # logger.info(f"FreeProxy 사용: {proxy_address}")
45
- # return proxy_address
46
- # else:
47
- # logger.warning("사용 가능한 FreeProxy를 찾을 수 없습니다.")
48
- # except Exception as e:
49
- # logger.warning(f"FreeProxy 가져오기 실패: {e}")
50
- # ----------------------------------------------------
51
-
52
- # 어떤 프록시도 설정되지 않았거나 가져오지 못한 경우
53
- logger.warning("어떤 유효한 프록시도 구성되거나 가져올 수 없습니다. 프록시 없이 진행합니다.")
54
- return None
 
1
+ import random
2
+ import asyncio
3
+
4
+ class ProxyManager:
5
+ def __init__(self, proxies):
6
+ if not proxies:
7
+ raise ValueError("Proxy list cannot be empty")
8
+ self.proxies = proxies
9
+
10
+ async def get_proxy_url(self):
11
+ """
12
+ Get a random proxy URL from the list.
13
+ """
14
+ if not self.proxies:
15
+ return None
16
+ return random.choice(self.proxies)
17
+
18
+ # Example proxy list (replace with your actual proxies)
19
+ # It's recommended to use environment variables to store proxies
20
+ # For example: proxies = os.getenv("HTTP_PROXIES", "").split(",")
21
+ proxies = [
22
+ "http://user:pass@host1:port",
23
+ "http://user:pass@host2:port",
24
+ "http://user:pass@host3:port",
25
+ ]
26
+
27
+ proxy_manager = ProxyManager(proxies)
28
+
29
+ # For backward compatibility, if needed
30
+ async def get_proxy_url():
31
+ return await proxy_manager.get_proxy_url()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
backend/app/youtube_parser.py CHANGED
@@ -10,7 +10,7 @@ from urllib.parse import urlparse, parse_qs
10
 
11
  from loguru import logger
12
  from yt_dlp import YoutubeDL
13
- from proxy_manager import get_proxy_url
14
  from dotenv import load_dotenv
15
 
16
  # 환경 변수 로드 (코드의 가장 위에 위치)
@@ -71,8 +71,6 @@ async def get_transcript_with_timestamps(video_id: str) -> list[dict] | None:
71
  logger.info(f"비디오 ID '{video_id}'에 대한 자막 가져오기 시도.")
72
 
73
  processed_chunks = []
74
- proxy_address = await get_proxy_url()
75
-
76
  # yt-dlp 옵션 설정
77
  ydl_opts = {
78
  'writesubtitles': True, # 사용자가 업로드한 수동 자막 파일 쓰기 활성화
@@ -85,14 +83,8 @@ async def get_transcript_with_timestamps(video_id: str) -> list[dict] | None:
85
  'extractor_args': { # 특정 extractor (예: 유튜브)에 대한 추가 인자
86
  'youtube': {'skip': ['dash']} # dash manifest 관련 오류 회피 시도 (유튜브 관련)
87
  }
88
- # 프록시가 필요한 경우, 'proxy': 'http://your.proxy.com:port' 형태로 여기에 추가됩니다.
89
  }
90
-
91
- if proxy_address:
92
- ydl_opts['proxy'] = proxy_address
93
- logger.info(f"yt-dlp에 프록시 적용: {proxy_address}")
94
- else:
95
- logger.info("yt-dlp에 프록시가 적용되지 않았습니다.")
96
 
97
  temp_dir = "./temp_captions"
98
  os.makedirs(temp_dir, exist_ok=True)
 
10
 
11
  from loguru import logger
12
  from yt_dlp import YoutubeDL
13
+ from proxy_manager import proxy_manager
14
  from dotenv import load_dotenv
15
 
16
  # 환경 변수 로드 (코드의 가장 위에 위치)
 
71
  logger.info(f"비디오 ID '{video_id}'에 대한 자막 가져오기 시도.")
72
 
73
  processed_chunks = []
 
 
74
  # yt-dlp 옵션 설정
75
  ydl_opts = {
76
  'writesubtitles': True, # 사용자가 업로드한 수동 자막 파일 쓰기 활성화
 
83
  'extractor_args': { # 특정 extractor (예: 유튜브)에 대한 추가 인자
84
  'youtube': {'skip': ['dash']} # dash manifest 관련 오류 회피 시도 (유튜브 관련)
85
  }
 
86
  }
87
+ logger.info("yt-dlp에 프록시가 적용되지 않았습니다.")
 
 
 
 
 
88
 
89
  temp_dir = "./temp_captions"
90
  os.makedirs(temp_dir, exist_ok=True)
backend/requirements.txt CHANGED
@@ -1,12 +1,10 @@
1
- fastapi==0.111.0
2
- uvicorn==0.30.1
3
- yt-dlp==2025.6.9
4
- loguru==0.7.3
5
- python-dotenv==1.0.1
6
- requests==2.32.3
7
- sentence-transformers==3.2.1
8
- faiss-cpu==1.9.0
9
- numpy==1.26.4
10
- pydantic==2.9.2
11
- torch==2.6.0
12
- httpx
 
1
+ youtube-transcript-api
2
+ requests
3
+ fastapi
4
+ uvicorn
5
+ httpx
6
+ loguru
7
+ yt-dlp
8
+ python-dotenv
9
+ sentence-transformers
10
+ faiss-cpu
 
 
install_ollama.sh ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ # Install Ollama
6
+ curl -fsSL https://ollama.com/install.sh | sh
7
+
8
+ # Start Ollama server in the background
9
+ ollama serve &
10
+
11
+ # Wait for Ollama server to start
12
+ ATTEMPTS=0
13
+ while ! curl -s http://localhost:11434 > /dev/null && [ $ATTEMPTS -lt 30 ]; do
14
+ ATTEMPTS=$((ATTEMPTS+1))
15
+ echo "Waiting for Ollama server to start... (Attempt $ATTEMPTS/30)"
16
+ sleep 2
17
+ done
18
+
19
+ if [ $ATTEMPTS -eq 30 ]; then
20
+ echo "Ollama server did not start in time. Exiting."
21
+ exit 1
22
+ fi
23
+
24
+ echo "Ollama server started. Pulling model..."
25
+
26
+ # Pull the model
27
+ ollama pull hf.co/DevQuasar/naver-hyperclovax.HyperCLOVAX-SEED-Text-Instruct-0.5B-GGUF:F16
28
+
29
+ echo "Model pull complete."