ID3 Tags
QuodLibet:: TXXX Frames
ID3 doesn't let you have frames named whatever you want like Ogg Vorbis and APEv2 do. However, it does let you create "TXXX" frames which are text data with an associated "description". Quod Libet uses these frames with a "QuodLibet::<tagname>" description to store tags that don't have ID3 counterparts. For example, labelid is stored as QuodLibet::labelid.
RVA2 / ReplayGain
Quod Libet implements ReplayGain using MP3's RVA2 frame. Unfortunately there is no standard on how to read RVA2 frames to support RG properly. If the description string is "album" the gain is treated as the album/audiophile value. Any other value is read as the track/radio value, but an actual description of "track" will preempt other values.
I've passed this information along to the GStreamer guys and their RVA2 support should match this, once it's completed.
foobar2000-style TXXX:replaygain_* tags are also supported, but migrated to the proper RVA2 format on save.
Other COMM Frames
Language codes in COMM frames with empty descriptors are replaced by \x00\x00\x00 on save. These tend to contain garbage rather than valid language codes anyway, and empty descriptors are usually a sign of comments migrated ID3v1 or other formats that do not support language markers.
Legacy Stuff
QuodLibet:: COMM Frames
Quod Libet used to use COMM frames instead of TXXX frames for its extended tag names. It will still load old COMM tags, but clears then when you save the file again.
Multiframe Hack
Since versions of ID3 prior to 2.4 did not support multiple values in a single text frame, we stored multiple text frames of the same type with one value for each if you tried to save more than one value per frame. This was strictly a violation of the ID3 spec, but we never encounted an ID3 reader that had trouble reading the tags saved this way (and still haven't).
Now that we use Mutagen, we store multiple values in the standard ID3v2.4 format. Old tags are migrated when you edit them.
