properties() merges the values of all frames mapping to the same key, in
frame order, so a key can be spread over several frames, e.g. two
comments without a description in different languages give
COMMENT=["hello", "hallo"]. setProperties() only kept a frame if its own
values equal the whole requested list, so none of these frames was kept,
and the list was then written as a single TXXX:COMMENT frame. This made
setProperties(properties()) lossy: the COMM frames and their languages
were replaced by a frame no comment reader looks for.
Before deciding which frames to delete, merge the values of the frames
holding a single key in frameList() order, as properties() does. If the
requested values for a key equal the merged ones, keep all of its frames
and do not create a new frame for it. TIPL and TMCL frames, and every key
whose values changed, are handled as before.
testSetPropertiesKeepsSpreadFrames covers the identity round trip on two
COMM frames, a request matching only one of them (kept as before), a
changed list (still a single TXXX), a key held by a TXXX and a COMM
frame (compared in frame order, not frame ID order), and a save and
reread of an MPEG file.