From 7b29ea57b7466eba7b2fb5cce11a904b37a320f3 Mon Sep 17 00:00:00 2001 From: Louis Mazin Date: Wed, 18 Mar 2026 17:39:41 +0100 Subject: [PATCH] nice --- app/core/download_manager.py | 138 +++++++++-------------------------- config.json | 2 +- data/assets/icon.ico | Bin 8591 -> 0 bytes main.py | 85 ++++++++++++--------- requirements.txt | 3 +- 5 files changed, 88 insertions(+), 140 deletions(-) delete mode 100644 data/assets/icon.ico diff --git a/app/core/download_manager.py b/app/core/download_manager.py index 5d556d0..4c93e04 100644 --- a/app/core/download_manager.py +++ b/app/core/download_manager.py @@ -141,33 +141,41 @@ class AudioDownloadWorker(QThread): if track_album: tags.add(TALB(encoding=3, text=track_album)) - tags.delall("APIC") - if track_cover: - cover_file = Path(track_cover) - if cover_file.exists() and cover_file.is_file(): - mime_type = "image/jpeg" - cover_data = None - if cover_file.suffix.lower() in (".png", ".webp"): - try: - from PIL import Image - import io - img = Image.open(cover_file) - buf = io.BytesIO() - img.convert("RGB").save(buf, format="JPEG") - cover_data = buf.getvalue() - mime_type = "image/jpeg" - except Exception: - with open(cover_file, "rb") as stream: - cover_data = stream.read() - mime_type = "image/png" if cover_file.suffix.lower() == ".png" else "image/webp" - else: - with open(cover_file, "rb") as stream: - cover_data = stream.read() - if cover_data: - tags.add(APIC(encoding=3, mime=mime_type, type=3, desc="Cover", data=cover_data)) tags.save(str(file_path), v2_version=4) + # Use only eyeD3 for cover art (Windows Explorer compatibility) + if track_cover: + try: + import eyed3 + from PIL import Image + import io + audiofile = eyed3.load(str(file_path)) + if audiofile is not None: + if audiofile.tag is None: + audiofile.initTag() + cover_file = Path(track_cover) + if cover_file.exists() and cover_file.is_file(): + # Always convert to JPEG and resize to 999x999 + try: + img = Image.open(cover_file) + img = img.convert("RGB") + img = img.resize((999, 999), Image.LANCZOS) + buf = io.BytesIO() + img.save(buf, format="JPEG") + image_data = buf.getvalue() + mime_type = "image/jpeg" + except Exception as e: + print(f"[eyeD3] Failed to process image: {e}") + image_data = cover_file.read_bytes() + mime_type = "image/jpeg" + audiofile.tag.images.set(3, image_data, mime_type, u"Cover") + # Force ID3v2.3 + audiofile.tag.version = (2, 3, 0) + audiofile.tag.save(version=(2, 3, 0)) + except Exception as e: + print(f"[eyeD3] Failed to embed cover: {e}") + renamed_file = self._rename_output_file(file_path, track_title or fallback_title, track_artist) if renamed_file is not None: self.progress_text.emit(renamed_file.stem) @@ -441,84 +449,10 @@ class DownloadManager(QObject): return False track = self.track_list[index] - clean_mp3_title = mp3_title.strip() or track.get("title", "") - clean_artist = artist.strip() - clean_album = album.strip() - clean_cover = cover_path.strip() - - # Update in-memory metadata - track["mp3_title"] = clean_mp3_title - track["artist"] = clean_artist - track["album"] = clean_album - track["cover_path"] = clean_cover - - # Try to find the file path (assume output dir is known, search for file) - # Use the current filename or try to reconstruct it - output_dir = self.settings_manager.get_config("output_dir") - if not output_dir: - output_dir = "." - output_dir = Path(output_dir) - # Try to find the file by matching artist/title or fallback to most recent - found_file = None - for f in output_dir.glob("*.mp3"): - # Try to match by old artist/title - if f.stem == f"{track.get('artist', '')} - {track.get('mp3_title', '')}": - found_file = f - break - if not found_file: - # fallback: most recent - mp3_files = sorted(output_dir.glob("*.mp3"), key=lambda file_path: file_path.stat().st_mtime, reverse=True) - if mp3_files: - found_file = mp3_files[0] - - if found_file and found_file.exists(): - # Update ID3 tags - try: - id3_delete(str(found_file)) - except Exception: - pass - tags = ID3() - tags.delall("TIT2") - tags.add(TIT2(encoding=3, text=clean_mp3_title or track.get("title", ""))) - tags.delall("TPE1") - if clean_artist: - tags.add(TPE1(encoding=3, text=clean_artist)) - tags.delall("TALB") - if clean_album: - tags.add(TALB(encoding=3, text=clean_album)) - tags.delall("APIC") - if clean_cover: - cover_file = Path(clean_cover) - if cover_file.exists() and cover_file.is_file(): - mime_type = "image/jpeg" - if cover_file.suffix.lower() == ".png": - mime_type = "image/png" - elif cover_file.suffix.lower() == ".webp": - mime_type = "image/webp" - with open(cover_file, "rb") as stream: - cover_data = stream.read() - if cover_data: - tags.add(APIC(encoding=3, mime=mime_type, type=3, desc="Cover", data=cover_data)) - tags.save(str(found_file), v2_version=4) - - # Always rename file to 'artist - title.mp3' - safe_title = self._sanitize_filename_part(clean_mp3_title) - safe_artist = self._sanitize_filename_part(clean_artist) - if safe_artist and safe_title: - base_name = f"{safe_artist} - {safe_title}" - else: - base_name = safe_title or self._sanitize_filename_part(found_file.stem) - target_path = found_file.with_name(f"{base_name}{found_file.suffix}") - if target_path != found_file: - counter = 2 - while target_path.exists(): - target_path = found_file.with_name(f"{base_name} ({counter}){found_file.suffix}") - counter += 1 - try: - found_file.rename(target_path) - except Exception: - pass - + track["mp3_title"] = mp3_title.strip() + track["artist"] = artist.strip() + track["album"] = album.strip() + track["cover_path"] = cover_path.strip() self.list_changed.emit(self.get_tracks()) return True diff --git a/config.json b/config.json index 39bb785..4676091 100644 --- a/config.json +++ b/config.json @@ -1,5 +1,5 @@ { - "app_name": "Application", + "app_name": "Youtube MP3 Downloader", "app_os": "Windows", "app_version": "1.0.0", "architecture": "x64", diff --git a/data/assets/icon.ico b/data/assets/icon.ico deleted file mode 100644 index 2e253057c9af042119c0deade82d37d281d87b92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8591 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 int: global preloaded_window + try: + QApplication.setAttribute(Qt.ApplicationAttribute.AA_ShareOpenGLContexts, True) + except Exception: + return 0 - QApplication.setAttribute(Qt.ApplicationAttribute.AA_ShareOpenGLContexts, True) - - main_manager: MainManager = MainManager.get_instance() - theme_manager = main_manager.get_theme_manager() - settings_manager = main_manager.get_settings_manager() + try: + main_manager: MainManager = MainManager.get_instance() + + theme_manager = main_manager.get_theme_manager() + settings_manager = main_manager.get_settings_manager() + except Exception: + return 0 - app: QApplication = QApplication(sys.argv) - app.setStyleSheet(theme_manager.get_sheet()) - app.setApplicationName(settings_manager.get_config("app_name")) - app.setWindowIcon(QIcon(paths.get_asset_path("icon"))) + try: + app: QApplication = QApplication(sys.argv) + except Exception: + return 0 + + try: + app.setStyleSheet(theme_manager.get_sheet()) + app.setApplicationName(settings_manager.get_config("app_name")) + app.setWindowIcon(QIcon(paths.get_asset_path("icon"))) + except Exception: + return 0 splash_image_path = paths.get_asset_path(settings_manager.get_config("splash_image")) use_splash = splash_image_path and paths.Path(splash_image_path).exists() - + if use_splash: - splash = SplashScreen(preload_function=lambda callback: preload_application(callback, splash)) - splash.show_splash() - + try: + splash = SplashScreen(preload_function=lambda callback: preload_application(callback, splash)) + splash.show_splash() + except Exception as e: + return 0 + def on_splash_finished(success): global preloaded_window if not success: app.quit() return - - if preloaded_window: - preloaded_window.show() - else: - window = MainWindow() - window.show() + try: + if preloaded_window: + preloaded_window.show() + else: + window = MainWindow() + window.show() + except Exception: + app.quit() splash.finished.connect(on_splash_finished) + return app.exec() else: - def dummy_progress(text): pass - success = preload_application(dummy_progress) if not success: return 0 - - window = preloaded_window if preloaded_window else MainWindow() - window.show() - + try: + window = preloaded_window if preloaded_window else MainWindow() + window.show() + except Exception: + return 0 + return app.exec() if __name__ == "__main__": - try: - sys.exit(main()) - except KeyboardInterrupt: - sys.exit(0) \ No newline at end of file + sys.exit(main()) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 039ee52..60c1aed 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,5 @@ pyinstaller python-dotenv requests yt-dlp -mutagen \ No newline at end of file +mutagen +pillow \ No newline at end of file