Hi Daniel, > [Aim] > An mp3 file contains only an ID3v2 tag whose content should be > moved to a newly created ID3v1 tag and the ID3v2 tag should be deleted. > > [Reproduce] > 1. Fill the ID3v1 tag with information by clicking "von ID3v2" / "from ID3v2" > 2. Click the "Entfernen" ("remove/delete") button > on the right side of the ID3v2 tag > 3. Save the directory contents (Save / Strg-s) > > [Expection] > Now the ID3v2 tag should be gone and an ID3v1 tag should have been > created which contains some of the copied information. > > [Reality] > The ID3v2 tag has been deleted (OK), the ID3v1 tag has disappeared (bug!) > and the tag information cannot be recovered.
I just discovered your bug report. Thanks a lot, I could reproduce it. This seems to be a bug in the id3lib. When updating a tag (V1 or V2) and then stripping the other tag, the updated tag is stripped too. I fixed it by first stripping any empty tags (V1 or V2) and then updating non-empty tags (V1 or V2), see the following patch. This will be fixed in the next release. Regards, Urs --- kid3/kid3/mp3file.cpp.ba1 2005-09-09 20:07:34.000000000 +0200 +++ kid3/kid3/mp3file.cpp 2005-09-09 20:19:35.695272520 +0200 @@ -349,25 +349,28 @@ return FALSE; } - if (tagV1 && (force || changedV1)) { - // There seems to be a bug in id3lib: The V1 genre is not - // removed. So we check here and strip the whole header - // if there are no frames. - if (tagV1->NumFrames() == 0) { - tagV1->Strip(ID3TT_ID3V1); - } else { - tagV1->Update(ID3TT_ID3V1); - } + // There seems to be a bug in id3lib: The V1 genre is not + // removed. So we check here and strip the whole header + // if there are no frames. + if (tagV1 && (force || changedV1) && (tagV1->NumFrames() == 0)) { + tagV1->Strip(ID3TT_ID3V1); changedV1 = FALSE; } - if (tagV2 && (force || changedV2)) { - // Even after removing all frames, HasV2Tag() still returns true, - // so we strip the whole header. - if (tagV2->NumFrames() == 0) { - tagV2->Strip(ID3TT_ID3V2); - } else { - tagV2->Update(ID3TT_ID3V2); - } + // Even after removing all frames, HasV2Tag() still returns true, + // so we strip the whole header. + if (tagV2 && (force || changedV2) && (tagV2->NumFrames() == 0)) { + tagV2->Strip(ID3TT_ID3V2); + changedV2 = FALSE; + } + // There seems to be a bug in id3lib: If I update an ID3v1 and then + // strip the ID3v2 the ID3v1 is removed too and vice versa, so I + // first make any stripping and then the updating. + if (tagV1 && (force || changedV1) && (tagV1->NumFrames() > 0)) { + tagV1->Update(ID3TT_ID3V1); + changedV1 = FALSE; + } + if (tagV2 && (force || changedV2) && (tagV2->NumFrames() > 0)) { + tagV2->Update(ID3TT_ID3V2); changedV2 = FALSE; } if (new_filename != filename) {