diff --git a/karaoke_downloader/downloader.py b/karaoke_downloader/downloader.py index 3906337..73a0c80 100644 --- a/karaoke_downloader/downloader.py +++ b/karaoke_downloader/downloader.py @@ -289,23 +289,45 @@ class KaraokeDownloader: # Progress print statement print(f"\U0001F4E5 Downloading {downloaded_count + 1} of {total_to_download} songlist songs...") # Download this song from this channel - output_path = self.downloads_dir / channel_name / f"{artist} - {title} (Karaoke Version).mp4" + # Create a shorter, safer filename + safe_title = title.replace("(From ", "").replace(")", "").replace(" - ", " ").replace(":", "").replace("'", "").replace('"', "") + safe_artist = artist.replace("'", "").replace('"', "") + filename = f"{safe_artist} - {safe_title}.mp4" + # Limit filename length to avoid Windows path issues + if len(filename) > 100: + filename = f"{safe_artist[:30]} - {safe_title[:60]}.mp4" + + output_path = self.downloads_dir / channel_name / filename output_path.parent.mkdir(parents=True, exist_ok=True) print(f"⬇️ Downloading: {artist} - {title} -> {output_path}") video_url = f"https://www.youtube.com/watch?v={video['id']}" dlp_cmd = [ str(self.yt_dlp_path), + "--no-check-certificates", + "--ignore-errors", + "--no-warnings", "-o", str(output_path), - "-f", self.config["download_settings"]["format"], + "-f", "best", # TEMP: Simplified format for debugging video_url ] + print(f"🔧 Running command: {' '.join(dlp_cmd)}") try: - subprocess.run(dlp_cmd, check=True) + result = subprocess.run(dlp_cmd, capture_output=True, text=True, check=True) + print(f"✅ yt-dlp completed successfully") + print(f"📄 yt-dlp stdout: {result.stdout}") except subprocess.CalledProcessError as e: - print(f"❌ yt-dlp failed: {e}") + print(f"❌ yt-dlp failed with exit code {e.returncode}") + print(f"❌ yt-dlp stderr: {e.stderr}") continue - if not output_path.exists() or output_path.stat().st_size == 0: - print(f"❌ Download failed or file is empty: {output_path}") + if not output_path.exists(): + print(f"❌ Download failed: file does not exist: {output_path}") + # Check if yt-dlp saved it somewhere else + possible_files = list(output_path.parent.glob("*.mp4")) + if possible_files: + print(f"🔍 Found these files in the directory: {[f.name for f in possible_files]}") + continue + if output_path.stat().st_size == 0: + print(f"❌ Download failed: file is empty (0 bytes): {output_path}") continue # TEMP: Skipping MP4 validation for debugging # if not self._is_valid_mp4(output_path):