fix: handle yt-dlp path errors

This commit is contained in:
Your Name
2025-05-22 18:58:31 +03:00
parent 4b56e23a13
commit 63fa3d991e
+39 -2
View File
@@ -5,6 +5,7 @@ import os
import re import re
import subprocess # For direct CLI command execution import subprocess # For direct CLI command execution
import shlex # For safely parsing command arguments import shlex # For safely parsing command arguments
import sys # Added to get executable path information
from pathlib import Path from pathlib import Path
class SignalManager(QObject): class SignalManager(QObject):
@@ -207,7 +208,33 @@ class DownloadThread(QThread):
def _build_yt_dlp_command(self): def _build_yt_dlp_command(self):
"""Build the yt-dlp command line with all options for direct execution.""" """Build the yt-dlp command line with all options for direct execution."""
cmd = ["yt-dlp"] # Use bundled yt-dlp executable instead of system PATH
# Determine if we're running from a PyInstaller bundle
if getattr(sys, 'frozen', False):
# We're running from a PyInstaller bundle
base_path = getattr(sys, '_MEIPASS', os.path.dirname(sys.executable))
yt_dlp_path = os.path.join(base_path, "yt-dlp.exe" if os.name == 'nt' else "yt-dlp")
if os.path.exists(yt_dlp_path):
cmd = [yt_dlp_path]
print(f"DEBUG: Using bundled yt-dlp from: {yt_dlp_path}")
# Check if the bundled executable is actually executable
if not os.access(yt_dlp_path, os.X_OK) and os.name != 'nt': # Skip check on Windows
print(f"WARNING: Bundled yt-dlp exists but is not executable: {yt_dlp_path}")
try:
# Try to make it executable
os.chmod(yt_dlp_path, 0o755)
print(f"Fixed permissions on bundled yt-dlp")
except Exception as e:
print(f"Failed to fix permissions: {e}")
else:
# Fall back to regular command if bundled version not found
cmd = ["yt-dlp"]
print(f"DEBUG: Bundled yt-dlp not found at {yt_dlp_path}, using system PATH")
else:
# We're running from source, use system PATH
cmd = ["yt-dlp"]
print("DEBUG: Using system PATH for yt-dlp")
# Format selection strategy - use format ID if provided or fallback to resolution # Format selection strategy - use format ID if provided or fallback to resolution
if self.format_id: if self.format_id:
@@ -424,6 +451,12 @@ class DownloadThread(QThread):
# Wait for process to complete # Wait for process to complete
return_code = self.process.wait() return_code = self.process.wait()
# Special handling for specific errors
# return code 127 typically means command not found
if return_code == 127:
self.error_signal.emit("Error: yt-dlp executable not found. This could be due to improper installation or a PATH issue.")
return
if return_code == 0: if return_code == 0:
self.progress_signal.emit(100) self.progress_signal.emit(100)
self.status_signal.emit("✅ Download completed!") self.status_signal.emit("✅ Download completed!")
@@ -443,7 +476,11 @@ class DownloadThread(QThread):
if self.cancelled: if self.cancelled:
self.status_signal.emit("Download cancelled") self.status_signal.emit("Download cancelled")
else: else:
self.error_signal.emit(f"Download failed with return code {return_code}") # Provide more descriptive error message for possible yt-dlp conflicts
if return_code == 1:
self.error_signal.emit(f"Download failed with return code {return_code}. This may be due to a conflict with multiple yt-dlp installations. Try uninstalling any system-installed yt-dlp (e.g. through snap or apt) and restart the application.")
else:
self.error_signal.emit(f"Download failed with return code {return_code}")
self.cleanup_partial_files() self.cleanup_partial_files()
except Exception as e: except Exception as e: