fix: handle yt-dlp path errors
This commit is contained in:
+39
-2
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user