Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -93,59 +93,65 @@ def download_audio(url, cookies_file_path=None):
|
|
| 93 |
"""Download audio from YouTube URL and return the file path"""
|
| 94 |
if not YT_DLP_AVAILABLE:
|
| 95 |
raise Exception("yt-dlp is not available. Please check the installation.")
|
| 96 |
-
|
| 97 |
try:
|
| 98 |
# Create a temporary directory for downloads
|
| 99 |
temp_dir = tempfile.mkdtemp()
|
| 100 |
output_path = os.path.join(temp_dir, "audio")
|
| 101 |
-
|
|
|
|
| 102 |
ydl_opts = {
|
| 103 |
'format': 'bestaudio[ext=m4a]/bestaudio/best',
|
| 104 |
'outtmpl': output_path + '.%(ext)s',
|
| 105 |
'quiet': True,
|
| 106 |
'no_warnings': True,
|
| 107 |
-
|
| 108 |
-
'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
| 109 |
'referer': 'https://www.youtube.com/',
|
|
|
|
| 110 |
'extractor_retries': 3,
|
| 111 |
'fragment_retries': 3,
|
| 112 |
'retry_sleep_functions': {'http': lambda n: 2 ** n},
|
| 113 |
}
|
| 114 |
-
|
| 115 |
# Add cookies file if provided
|
| 116 |
if cookies_file_path and os.path.exists(cookies_file_path):
|
|
|
|
| 117 |
ydl_opts['cookiefile'] = cookies_file_path
|
| 118 |
-
print(f"Using cookies file: {cookies_file_path}")
|
| 119 |
else:
|
| 120 |
-
print("No cookies file provided
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
|
|
|
|
|
|
| 134 |
with YoutubeDL(ydl_opts) as ydl:
|
| 135 |
info_dict = ydl.extract_info(url, download=True)
|
| 136 |
filename = ydl.prepare_filename(info_dict)
|
| 137 |
-
|
| 138 |
-
#
|
| 139 |
for ext in ['.m4a', '.webm', '.mp4', '.mp3']:
|
| 140 |
potential_file = output_path + ext
|
| 141 |
if os.path.exists(potential_file):
|
|
|
|
| 142 |
return potential_file
|
| 143 |
-
|
| 144 |
-
raise FileNotFoundError(
|
| 145 |
-
|
| 146 |
except Exception as e:
|
|
|
|
|
|
|
| 147 |
if "403" in str(e) or "Forbidden" in str(e):
|
| 148 |
-
raise Exception(f"YouTube blocked the request (403 Forbidden). Please upload
|
| 149 |
else:
|
| 150 |
raise Exception(f"Failed to download audio: {str(e)}")
|
| 151 |
|
|
|
|
| 93 |
"""Download audio from YouTube URL and return the file path"""
|
| 94 |
if not YT_DLP_AVAILABLE:
|
| 95 |
raise Exception("yt-dlp is not available. Please check the installation.")
|
| 96 |
+
|
| 97 |
try:
|
| 98 |
# Create a temporary directory for downloads
|
| 99 |
temp_dir = tempfile.mkdtemp()
|
| 100 |
output_path = os.path.join(temp_dir, "audio")
|
| 101 |
+
|
| 102 |
+
# Base yt-dlp options
|
| 103 |
ydl_opts = {
|
| 104 |
'format': 'bestaudio[ext=m4a]/bestaudio/best',
|
| 105 |
'outtmpl': output_path + '.%(ext)s',
|
| 106 |
'quiet': True,
|
| 107 |
'no_warnings': True,
|
| 108 |
+
'force_ipv4': True,
|
|
|
|
| 109 |
'referer': 'https://www.youtube.com/',
|
| 110 |
+
'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
| 111 |
'extractor_retries': 3,
|
| 112 |
'fragment_retries': 3,
|
| 113 |
'retry_sleep_functions': {'http': lambda n: 2 ** n},
|
| 114 |
}
|
| 115 |
+
|
| 116 |
# Add cookies file if provided
|
| 117 |
if cookies_file_path and os.path.exists(cookies_file_path):
|
| 118 |
+
print(f"✅ Using cookies file: {cookies_file_path}")
|
| 119 |
ydl_opts['cookiefile'] = cookies_file_path
|
|
|
|
| 120 |
else:
|
| 121 |
+
print("⚠️ No valid cookies file provided – likely to hit 403 Forbidden.")
|
| 122 |
+
|
| 123 |
+
# Extra headers to mimic real browser
|
| 124 |
+
ydl_opts['http_headers'] = {
|
| 125 |
+
'User-Agent': ydl_opts['user_agent'],
|
| 126 |
+
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
| 127 |
+
'Accept-Language': 'en-US,en;q=0.5',
|
| 128 |
+
'Accept-Encoding': 'gzip, deflate',
|
| 129 |
+
'DNT': '1',
|
| 130 |
+
'Connection': 'keep-alive',
|
| 131 |
+
'Upgrade-Insecure-Requests': '1',
|
| 132 |
+
'Referer': 'https://www.youtube.com/',
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
print(f"🔧 yt-dlp options:\n{ydl_opts}")
|
| 136 |
+
|
| 137 |
with YoutubeDL(ydl_opts) as ydl:
|
| 138 |
info_dict = ydl.extract_info(url, download=True)
|
| 139 |
filename = ydl.prepare_filename(info_dict)
|
| 140 |
+
|
| 141 |
+
# Search for the downloaded audio file
|
| 142 |
for ext in ['.m4a', '.webm', '.mp4', '.mp3']:
|
| 143 |
potential_file = output_path + ext
|
| 144 |
if os.path.exists(potential_file):
|
| 145 |
+
print(f"✅ Audio file downloaded: {potential_file}")
|
| 146 |
return potential_file
|
| 147 |
+
|
| 148 |
+
raise FileNotFoundError("Downloaded audio file not found.")
|
| 149 |
+
|
| 150 |
except Exception as e:
|
| 151 |
+
import traceback
|
| 152 |
+
traceback.print_exc() # For debugging
|
| 153 |
if "403" in str(e) or "Forbidden" in str(e):
|
| 154 |
+
raise Exception(f"YouTube blocked the request (403 Forbidden). Please upload a valid cookies.txt file. Original error: {str(e)}")
|
| 155 |
else:
|
| 156 |
raise Exception(f"Failed to download audio: {str(e)}")
|
| 157 |
|