Spaces:
Runtime error
Runtime error
Claude commited on
feat: Add Docker support with hola-proxy for YouTube downloads
Browse files- Create Dockerfile with hola-proxy for residential IP proxying
- Add PROXY_URL environment variable support to yt-dlp
- Update README to use Docker SDK
This enables YouTube downloads from HuggingFace Spaces by routing
traffic through Hola's residential proxy network.
- Dockerfile +39 -0
- README.md +1 -3
- app.py +10 -0
Dockerfile
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.11-slim
|
| 2 |
+
|
| 3 |
+
# Install system dependencies
|
| 4 |
+
RUN apt-get update && apt-get install -y \
|
| 5 |
+
ffmpeg \
|
| 6 |
+
wget \
|
| 7 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 8 |
+
|
| 9 |
+
# Install hola-proxy
|
| 10 |
+
RUN wget -O /usr/local/bin/hola-proxy \
|
| 11 |
+
https://github.com/Snawoot/hola-proxy/releases/download/v1.14.0/hola-proxy.linux-amd64 \
|
| 12 |
+
&& chmod +x /usr/local/bin/hola-proxy
|
| 13 |
+
|
| 14 |
+
# Create app directory
|
| 15 |
+
WORKDIR /app
|
| 16 |
+
|
| 17 |
+
# Copy requirements first for caching
|
| 18 |
+
COPY requirements.txt .
|
| 19 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
| 20 |
+
|
| 21 |
+
# Copy application code
|
| 22 |
+
COPY . .
|
| 23 |
+
|
| 24 |
+
# Create startup script
|
| 25 |
+
RUN echo '#!/bin/bash\n\
|
| 26 |
+
# Start hola-proxy in background with residential IPs\n\
|
| 27 |
+
hola-proxy -country us -proxy-type lum -bind-address 127.0.0.1:8080 &\n\
|
| 28 |
+
sleep 2\n\
|
| 29 |
+
# Start the Gradio app\n\
|
| 30 |
+
python app.py\n\
|
| 31 |
+
' > /app/start.sh && chmod +x /app/start.sh
|
| 32 |
+
|
| 33 |
+
# Expose Gradio port
|
| 34 |
+
EXPOSE 7860
|
| 35 |
+
|
| 36 |
+
# Set environment variable for proxy
|
| 37 |
+
ENV PROXY_URL=http://127.0.0.1:8080
|
| 38 |
+
|
| 39 |
+
CMD ["/app/start.sh"]
|
README.md
CHANGED
|
@@ -3,9 +3,7 @@ title: Video Analyzer
|
|
| 3 |
emoji: "🎬"
|
| 4 |
colorFrom: blue
|
| 5 |
colorTo: purple
|
| 6 |
-
sdk:
|
| 7 |
-
sdk_version: "5.9.0"
|
| 8 |
-
python_version: "3.11"
|
| 9 |
app_file: app.py
|
| 10 |
pinned: false
|
| 11 |
license: mit
|
|
|
|
| 3 |
emoji: "🎬"
|
| 4 |
colorFrom: blue
|
| 5 |
colorTo: purple
|
| 6 |
+
sdk: docker
|
|
|
|
|
|
|
| 7 |
app_file: app.py
|
| 8 |
pinned: false
|
| 9 |
license: mit
|
app.py
CHANGED
|
@@ -114,6 +114,11 @@ CHAT_MODELS = [
|
|
| 114 |
]
|
| 115 |
|
| 116 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 117 |
def download_video(url: str, output_dir: str) -> list[dict]:
|
| 118 |
"""Download video from YouTube URL (video or playlist)."""
|
| 119 |
ydl_opts = {
|
|
@@ -125,6 +130,11 @@ def download_video(url: str, output_dir: str) -> list[dict]:
|
|
| 125 |
"retries": 3,
|
| 126 |
}
|
| 127 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
downloaded = []
|
| 129 |
try:
|
| 130 |
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
|
|
| 114 |
]
|
| 115 |
|
| 116 |
|
| 117 |
+
def get_proxy_url() -> str | None:
|
| 118 |
+
"""Get proxy URL from environment for YouTube downloads."""
|
| 119 |
+
return os.environ.get("PROXY_URL")
|
| 120 |
+
|
| 121 |
+
|
| 122 |
def download_video(url: str, output_dir: str) -> list[dict]:
|
| 123 |
"""Download video from YouTube URL (video or playlist)."""
|
| 124 |
ydl_opts = {
|
|
|
|
| 130 |
"retries": 3,
|
| 131 |
}
|
| 132 |
|
| 133 |
+
# Add proxy if configured
|
| 134 |
+
proxy_url = get_proxy_url()
|
| 135 |
+
if proxy_url:
|
| 136 |
+
ydl_opts["proxy"] = proxy_url
|
| 137 |
+
|
| 138 |
downloaded = []
|
| 139 |
try:
|
| 140 |
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|