Spaces:
Running
Running
+rtsp
Browse files
app.py
CHANGED
@@ -56,6 +56,9 @@ def download_audio(url, method_choice):
|
|
56 |
if 'youtube.com' in parsed_url.netloc or 'youtu.be' in parsed_url.netloc:
|
57 |
# Use YouTube download methods
|
58 |
audio_file = download_youtube_audio(url, method_choice)
|
|
|
|
|
|
|
59 |
else:
|
60 |
# Use direct download methods
|
61 |
audio_file = download_direct_audio(url, method_choice)
|
@@ -65,6 +68,27 @@ def download_audio(url, method_choice):
|
|
65 |
except Exception as e:
|
66 |
logging.error(f"Error downloading audio: {str(e)}")
|
67 |
return f"Error: {str(e)}", False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
|
69 |
def download_youtube_audio(url, method_choice):
|
70 |
"""
|
@@ -113,38 +137,36 @@ def youtube_dl_method(url):
|
|
113 |
logging.error(f"Error in youtube_dl_method: {str(e)}")
|
114 |
return None
|
115 |
|
116 |
-
def
|
117 |
"""
|
118 |
-
Downloads audio using yt-dlp.
|
119 |
|
120 |
Args:
|
121 |
-
url (str): The
|
122 |
|
123 |
Returns:
|
124 |
str: Path to the downloaded audio file, or None if failed.
|
125 |
"""
|
126 |
-
logging.info("Using yt-dlp method")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
try:
|
128 |
-
ydl_opts = {
|
129 |
-
'format': 'bestaudio/best',
|
130 |
-
'postprocessors': [{
|
131 |
-
'key': 'FFmpegExtractAudio',
|
132 |
-
'preferredcodec': 'mp3',
|
133 |
-
'preferredquality': '192',
|
134 |
-
}],
|
135 |
-
'outtmpl': '%(id)s.%(ext)s',
|
136 |
-
'quiet': True,
|
137 |
-
'no_warnings': True,
|
138 |
-
}
|
139 |
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
output_file = output_file.rsplit('.', 1)[0] + '.mp3'
|
144 |
-
logging.info(f"Downloaded YouTube audio: {output_file}")
|
145 |
-
return output_file
|
146 |
except Exception as e:
|
147 |
-
logging.error(f"Error in
|
148 |
return None
|
149 |
|
150 |
def pytube_method(url):
|
@@ -252,11 +274,11 @@ def requests_method(url):
|
|
252 |
|
253 |
def download_direct_audio(url, method_choice):
|
254 |
"""
|
255 |
-
Downloads audio from a direct URL using the specified method.
|
256 |
|
257 |
Args:
|
258 |
url (str): The direct URL of the audio file.
|
259 |
-
method_choice (str): The method to use for downloading ('wget', 'requests').
|
260 |
|
261 |
Returns:
|
262 |
str: Path to the downloaded audio file, or None if failed.
|
@@ -265,6 +287,9 @@ def download_direct_audio(url, method_choice):
|
|
265 |
methods = {
|
266 |
'wget': wget_method,
|
267 |
'requests': requests_method,
|
|
|
|
|
|
|
268 |
}
|
269 |
method = methods.get(method_choice)
|
270 |
if method is None:
|
|
|
56 |
if 'youtube.com' in parsed_url.netloc or 'youtu.be' in parsed_url.netloc:
|
57 |
# Use YouTube download methods
|
58 |
audio_file = download_youtube_audio(url, method_choice)
|
59 |
+
elif parsed_url.scheme == 'rtsp':
|
60 |
+
# Use RTSP download methods
|
61 |
+
audio_file = download_rtsp_audio(url)
|
62 |
else:
|
63 |
# Use direct download methods
|
64 |
audio_file = download_direct_audio(url, method_choice)
|
|
|
68 |
except Exception as e:
|
69 |
logging.error(f"Error downloading audio: {str(e)}")
|
70 |
return f"Error: {str(e)}", False
|
71 |
+
|
72 |
+
def download_rtsp_audio(url):
|
73 |
+
"""
|
74 |
+
Downloads audio from an RTSP URL using FFmpeg.
|
75 |
+
|
76 |
+
Args:
|
77 |
+
url (str): The RTSP URL.
|
78 |
+
|
79 |
+
Returns:
|
80 |
+
str: Path to the downloaded audio file, or None if failed.
|
81 |
+
"""
|
82 |
+
logging.info("Using FFmpeg to download RTSP stream")
|
83 |
+
output_file = tempfile.mktemp(suffix='.mp3')
|
84 |
+
command = ['ffmpeg', '-i', url, '-acodec', 'libmp3lame', '-ab', '192k', '-y', output_file]
|
85 |
+
try:
|
86 |
+
subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
87 |
+
logging.info(f"Downloaded RTSP audio to: {output_file}")
|
88 |
+
return output_file
|
89 |
+
except Exception as e:
|
90 |
+
logging.error(f"Error downloading RTSP audio: {str(e)}")
|
91 |
+
return None
|
92 |
|
93 |
def download_youtube_audio(url, method_choice):
|
94 |
"""
|
|
|
137 |
logging.error(f"Error in youtube_dl_method: {str(e)}")
|
138 |
return None
|
139 |
|
140 |
+
def yt_dlp_direct_method(url):
|
141 |
"""
|
142 |
+
Downloads audio using yt-dlp (supports various protocols and sites).
|
143 |
|
144 |
Args:
|
145 |
+
url (str): The URL of the audio or webpage containing audio.
|
146 |
|
147 |
Returns:
|
148 |
str: Path to the downloaded audio file, or None if failed.
|
149 |
"""
|
150 |
+
logging.info("Using yt-dlp direct method")
|
151 |
+
output_file = tempfile.mktemp(suffix='.mp3')
|
152 |
+
ydl_opts = {
|
153 |
+
'format': 'bestaudio/best',
|
154 |
+
'outtmpl': output_file,
|
155 |
+
'quiet': True,
|
156 |
+
'no_warnings': True,
|
157 |
+
'postprocessors': [{
|
158 |
+
'key': 'FFmpegExtractAudio',
|
159 |
+
'preferredcodec': 'mp3',
|
160 |
+
'preferredquality': '192',
|
161 |
+
}],
|
162 |
+
}
|
163 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
165 |
+
ydl.download([url])
|
166 |
+
logging.info(f"Downloaded audio to: {output_file}")
|
167 |
+
return output_file
|
|
|
|
|
|
|
168 |
except Exception as e:
|
169 |
+
logging.error(f"Error in yt_dlp_direct_method: {str(e)}")
|
170 |
return None
|
171 |
|
172 |
def pytube_method(url):
|
|
|
274 |
|
275 |
def download_direct_audio(url, method_choice):
|
276 |
"""
|
277 |
+
Downloads audio from a direct URL or podcast URL using the specified method.
|
278 |
|
279 |
Args:
|
280 |
url (str): The direct URL of the audio file.
|
281 |
+
method_choice (str): The method to use for downloading ('wget', 'requests', 'yt-dlp', 'ffmpeg', 'aria2').
|
282 |
|
283 |
Returns:
|
284 |
str: Path to the downloaded audio file, or None if failed.
|
|
|
287 |
methods = {
|
288 |
'wget': wget_method,
|
289 |
'requests': requests_method,
|
290 |
+
'yt-dlp': yt_dlp_direct_method,
|
291 |
+
'ffmpeg': ffmpeg_method,
|
292 |
+
'aria2': aria2_method,
|
293 |
}
|
294 |
method = methods.get(method_choice)
|
295 |
if method is None:
|