From 93296dbee32dca9353a05d78f347e1562fd8c0db Mon Sep 17 00:00:00 2001 From: fchinembiri Date: Fri, 10 Jul 2026 00:27:33 +0200 Subject: [PATCH] fix: resolve proxy hostname to IP inside tasks.py to satisfy spotDL validation requirements --- apps/musicseerr/tasks.py | 48 ++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/apps/musicseerr/tasks.py b/apps/musicseerr/tasks.py index 5d40018..9516b1e 100644 --- a/apps/musicseerr/tasks.py +++ b/apps/musicseerr/tasks.py @@ -140,6 +140,30 @@ def run_download_task(task_id: str, query: str, proxy_url: str, jobs_dict: dict, temp_dir = f"/tmp/downloads/{task_id}" os.makedirs(temp_dir, exist_ok=True) + # Resolve proxy hostname to IP address for spotDL compatibility (spotDL requires IP in proxy URL) + resolved_proxy_url = proxy_url + if proxy_url: + try: + from urllib.parse import urlparse + import socket + parsed = urlparse(proxy_url) + if parsed.hostname and not parsed.hostname.replace('.', '').isdigit(): + ip = socket.gethostbyname(parsed.hostname) + netloc = ip + if parsed.port: + netloc = f"{ip}:{parsed.port}" + if parsed.username or parsed.password: + auth = "" + if parsed.username: + auth += parsed.username + if parsed.password: + auth += f":{parsed.password}" + netloc = f"{auth}@{netloc}" + resolved_proxy_url = parsed._replace(netloc=netloc).geturl() + logger.info(f"Resolved proxy hostname '{parsed.hostname}' to IP '{ip}'. New proxy URL: '{resolved_proxy_url}'") + except Exception as e: + logger.error(f"Failed to resolve proxy hostname: {e}") + try: is_tubidy = "tubidy" in query.lower() is_spotify = "spotify.com" in query.lower() @@ -151,13 +175,13 @@ def run_download_task(task_id: str, query: str, proxy_url: str, jobs_dict: dict, logger.info(f"[{task_id}] Attempting Priority 1: spotDL for '{query}'") env = os.environ.copy() - if proxy_url: - env["http_proxy"] = proxy_url - env["https_proxy"] = proxy_url + if resolved_proxy_url: + env["http_proxy"] = resolved_proxy_url + env["https_proxy"] = resolved_proxy_url cmd = ["spotdl", "download", query] - if proxy_url: - cmd += ["--proxy", proxy_url] + if resolved_proxy_url: + cmd += ["--proxy", resolved_proxy_url] # Run spotDL in the temp directory result = subprocess.run(cmd, cwd=temp_dir, env=env, capture_output=True, text=True) @@ -174,9 +198,9 @@ def run_download_task(task_id: str, query: str, proxy_url: str, jobs_dict: dict, logger.info(f"[{task_id}] Attempting Priority 2: yt-dlp for '{query}'") env = os.environ.copy() - if proxy_url: - env["http_proxy"] = proxy_url - env["https_proxy"] = proxy_url + if resolved_proxy_url: + env["http_proxy"] = resolved_proxy_url + env["https_proxy"] = resolved_proxy_url # If not a link, treat as search query search_query = query @@ -191,8 +215,8 @@ def run_download_task(task_id: str, query: str, proxy_url: str, jobs_dict: dict, "--yes-playlist", "--output", "%(title)s.%(ext)s" ] - if proxy_url: - cmd += ["--proxy", proxy_url] + if resolved_proxy_url: + cmd += ["--proxy", resolved_proxy_url] cmd.append(search_query) result = subprocess.run(cmd, cwd=temp_dir, env=env, capture_output=True, text=True) @@ -208,7 +232,7 @@ def run_download_task(task_id: str, query: str, proxy_url: str, jobs_dict: dict, logger.info(f"[{task_id}] Attempting Priority 3: Tubidy Scraper for '{query}'") # Scrape MP3 URL - mp3_url = scrape_tubidy_link(query, proxy_url) + mp3_url = scrape_tubidy_link(query, resolved_proxy_url) logger.info(f"[{task_id}] Scraped Tubidy MP3 URL: {mp3_url}") # Formulate filename @@ -222,7 +246,7 @@ def run_download_task(task_id: str, query: str, proxy_url: str, jobs_dict: dict, dest_path = os.path.join(temp_dir, filename) # Download file stream - download_file_stream(mp3_url, dest_path, proxy_url) + download_file_stream(mp3_url, dest_path, resolved_proxy_url) logger.info(f"[{task_id}] Tubidy download completed.") # Tag metadata