Fix cover metadata bugs: concurrency locks and FFmpeg video stream stripping
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user