Fix cover metadata bugs: concurrency locks and FFmpeg video stream stripping

This commit is contained in:
joel
2026-07-20 17:26:26 +02:00
parent 293aa5a907
commit c2d050ed71
2 changed files with 48 additions and 26 deletions
+22 -2
View File
@@ -115,6 +115,9 @@ def _build_ffmpeg_cmd(
else:
cmd.append("-n")
# Keine Video/Bilder-Streams übernehmen (verhindert Konflikte mit eigenen Covern)
cmd.append("-vn")
cmd.append(str(output_path))
return cmd
@@ -190,6 +193,8 @@ def convert_file_entry(
audio_settings: dict | None = None,
threads: int = 0,
progress_callback: Callable[[int, int, str], None] | None = None,
cover_data: bytes | None = None,
cover_mime: str = "image/jpeg",
) -> tuple[int, str, str | None]:
"""Konvertiert eine Datei und schreibt die Metadaten.
@@ -227,7 +232,6 @@ def convert_file_entry(
# ID3-Metadaten nur für MP3 schreiben
if output_format == "mp3":
cover_path = Path(meta["cover"]) if meta.get("cover") else None
apply_id3_tags(
mp3_path=output_file,
title=title,
@@ -235,7 +239,8 @@ def convert_file_entry(
album=meta.get("album", ""),
track_number=index + 1,
year=meta.get("year", ""),
cover_path=cover_path,
cover_data=cover_data,
cover_mime=cover_mime,
)
return (index, f"{title}.{output_format}", None)
@@ -266,6 +271,19 @@ def run_batch_conversion(
successful_files = []
errors = []
# Cover-Bild einmalig in den Arbeitsspeicher laden, um Dateisperren (Locking)
# bei parallelem Zugriff durch Windows Defender/Antivirus zu vermeiden
cover_data = None
cover_mime = "image/jpeg"
cover_path_str = meta.get("cover")
if cover_path_str:
cp = Path(cover_path_str)
if cp.exists():
if cp.suffix.lower() == ".png":
cover_mime = "image/png"
with open(cp, "rb") as f:
cover_data = f.read()
with ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = {
executor.submit(
@@ -280,6 +298,8 @@ def run_batch_conversion(
audio_settings=audio_settings,
threads=0,
progress_callback=progress_callback,
cover_data=cover_data,
cover_mime=cover_mime,
): idx
for idx, entry in enumerate(entries)
}