diff --git a/tiddl/cli/commands/download/__init__.py b/tiddl/cli/commands/download/__init__.py index 43493bb..0c9ef9a 100644 --- a/tiddl/cli/commands/download/__init__.py +++ b/tiddl/cli/commands/download/__init__.py @@ -253,7 +253,7 @@ def download_callback( album_artist=track_metadata.artist, cover_data=track_metadata.cover_data, date=track_metadata.date, - credits=track_metadata.credits, + credits_contributors=track_metadata.credits, comment=track_metadata.album_review, ) diff --git a/tiddl/core/metadata/track.py b/tiddl/core/metadata/track.py index 32841ac..049ea2c 100644 --- a/tiddl/core/metadata/track.py +++ b/tiddl/core/metadata/track.py @@ -106,6 +106,25 @@ def add_m4a_metadata(track_path: Path, metadata: Metadata) -> None: mutagen.save() +def sort_credits_contributors( + entries: list[AlbumItemsCredits.ItemWithCredits.CreditsEntry], +): + """ + Sorts the contributors within each CreditsEntry alphabetically by surname. + + It assumes the surname is the last word in the contributor's name. + """ + + def get_surname(name: str) -> str: + parts = name.split() + return parts[-1] if parts else "" + + for entry in entries: + entry.contributors.sort( + key=lambda contributor: get_surname(contributor.name).lower() + ) + + def add_track_metadata( path: Path, track: Track, @@ -113,11 +132,18 @@ def add_track_metadata( album_artist: str = "", lyrics: str = "", cover_data: bytes | None = None, - credits: list[AlbumItemsCredits.ItemWithCredits.CreditsEntry] | None = None, + credits_contributors: ( + list[AlbumItemsCredits.ItemWithCredits.CreditsEntry] | None + ) = None, comment: str = "", ) -> None: """Add FLAC or M4A metadata based on file extension.""" + if credits_contributors is None: + credits_contributors = [] + + sort_credits_contributors(credits_contributors) + metadata = Metadata( title=f"{track.title} ({track.version})" if track.version else track.title, track_number=str(track.trackNumber), @@ -131,7 +157,7 @@ def add_track_metadata( bpm=str(track.bpm or ""), lyrics=lyrics or None, cover_data=cover_data, - credits=credits or [], + credits=credits_contributors, comment=comment, )