quodlibet / mutagen

Python module for handling audio metadata
https://mutagen.readthedocs.io
GNU General Public License v2.0
1.54k stars 158 forks source link

Name of tag is cut off when displaying (.m4a file) #614

Open Ethan-Core2 opened 1 year ago

Ethan-Core2 commented 1 year ago

Steps to reproduce:

Set filename to the path to a .m4a file.

tags = MP4(filename).tags
tags["title"] = "This is a title"
tags.save(filename)

This will work, which can be verified with exiftool:

exiftool $filename | grep "Title" Returns: Title : This is a title

However, if you try to display it in python, it changes title to titl:

audioA = MP4(filename)
print(audioA.pprint())

Returns:

MPEG-4 audio (AAC LC), 207.62 seconds, 256044 bps (audio/mp4)
titl=This is a title
©too=Lavf58.76.100

I don't think it's just a printing error, as if you try to access the property like this:

toPrint = MP4(filename).tags.get("title", [None])[-1]

Then it doesn't work, (returns None) but if you change title to titl then it will work

phw commented 1 year ago

For MP4 the tag names are atom names and limited to 4 characters. mutagen truncates the given name.

What you really should do is use the proper atom names. You hit a bit of a lucky punch here, as titl seems to be an atom name interpreted by exiftools. But in case of audio files to store the track title the expected atom name is actually ©nam (yes, that's a copyright symbol as first character). Take a look at e.g. https://picard-docs.musicbrainz.org/downloads/MusicBrainz_Picard_Tag_Map.html for some common atom names as typically used.

If you want a simple way to set or read some tags with readable names have a look at mutagen's EasyMP4 class, which is similar to the EasyMP3 one. With it you could do something like this.

from mutagen.easymp4 import EasyMP4

f = EasyMP4('test.m4a')
f.tags["title"] = "foo"
f.tags["album"] = "bar"
f.save()

The you will get something like this:

% mutagen-inspect test.m4a
-- test.m4a
- MPEG-4 audio (AAC LC), 0.11 seconds, 14376 bps (audio/mp4)
©alb=bar
©nam=foo
©too=FAAC 1.24

Or maybe if you want some generic abstraction to use the same approach and names across different tagging formats have a look at the MediaFIle library, which adds a format independent wrapper API over mutagen.