From 99804c0304318e55a736e3e8e3013cc2f2030c45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Dudzi=C5=84ski?= <56404247+oskvr37@users.noreply.github.com> Date: Tue, 28 Apr 2026 21:27:31 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Credits=20entries=20in=20metadat?= =?UTF-8?q?a=20are=20now=20safe=20(#343)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tiddl/core/metadata/track.py | 39 ++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tiddl/core/metadata/track.py b/tiddl/core/metadata/track.py index 212bef5..b3fe5f0 100644 --- a/tiddl/core/metadata/track.py +++ b/tiddl/core/metadata/track.py @@ -1,3 +1,6 @@ +import logging +import unicodedata + from dataclasses import dataclass, field from pathlib import Path from datetime import datetime @@ -9,6 +12,9 @@ from mutagen.mp4 import MP4 as MutagenMP4, MP4Cover from tiddl.core.api.models import AlbumItemsCredits, Track +log = logging.getLogger("tiddl") + + @dataclass(slots=True) class Metadata: title: str @@ -125,6 +131,38 @@ def sort_credits_contributors( ) +def normalize_credits_keys( + entries: list[AlbumItemsCredits.ItemWithCredits.CreditsEntry], +) -> None: + valid_entries: list[AlbumItemsCredits.ItemWithCredits.CreditsEntry] = [] + + for entry in entries: + try: + raw_key = entry.type.upper() + + safe_key = ( + # NFKD splits accented chars (É → E + combining accent), + unicodedata.normalize("NFKD", raw_key) + .encode("ascii", "ignore") + .decode("ascii") + .replace("=", "") + .strip() + ) + + print(raw_key, safe_key) + + entry.type = safe_key + + if safe_key: + valid_entries.append(entry) + + except Exception as e: + log.debug(f"Skipping invalid credit tag '{entry.type}': {e}") + + # replace the contents of the original list + entries[:] = valid_entries + + def add_track_metadata( path: Path, track: Track, @@ -143,6 +181,7 @@ def add_track_metadata( credits_contributors = [] sort_credits_contributors(credits_contributors) + normalize_credits_keys(credits_contributors) metadata = Metadata( title=f"{track.title} ({track.version})" if track.version else track.title,