]> granicus.if.org Git - taglib/commitdiff
Don't overwrite fields that already exist
authorLukáš Lalinský <lalinsky@gmail.com>
Sat, 19 Mar 2011 06:37:28 +0000 (07:37 +0100)
committerLukáš Lalinský <lalinsky@gmail.com>
Sat, 19 Mar 2011 06:42:47 +0000 (07:42 +0100)
We can have multiple fields in the Vorbis Comment (e.g. two artist names),
but TagUnion only takes the first one, so it will effectively strip the
extra fields.

https://bugs.kde.org/show_bug.cgi?id=268854

taglib/flac/flacfile.cpp
tests/test_flac.cpp

index c8cc1fb85710d398dce82bf9e233e16c530758b7..f882ae7bda6e119c8f57340bdfe5f051fcbb7d04 100644 (file)
@@ -149,7 +149,7 @@ bool FLAC::File::save()
 
   // Create new vorbis comments
 
-  Tag::duplicate(&d->tag, xiphComment(true), true);
+  Tag::duplicate(&d->tag, xiphComment(true), false);
 
   d->xiphCommentData = xiphComment()->render(false);
 
index ba3d99da889cdc5131490161b8cfbc1d289041bd..4b54a7cafdd7451be1d57767451ea09e768be58c 100644 (file)
@@ -5,6 +5,7 @@
 #include <tstringlist.h>
 #include <tbytevectorlist.h>
 #include <flacfile.h>
+#include <xiphcomment.h>
 #include "utils.h"
 
 using namespace std;
@@ -20,6 +21,7 @@ class TestFLAC : public CppUnit::TestFixture
   CPPUNIT_TEST(testReplacePicture);
   CPPUNIT_TEST(testRemoveAllPictures);
   CPPUNIT_TEST(testRepeatedSave);
+  CPPUNIT_TEST(testSaveMultipleValues);
   CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -186,6 +188,26 @@ public:
     CPPUNIT_ASSERT_EQUAL(String("NEW TITLE 2"), tag->title());
   }
 
+  void testSaveMultipleValues()
+  {
+    ScopedFileCopy copy("silence-44-s", ".flac", false);
+    string newname = copy.fileName();
+
+    FLAC::File *f = new FLAC::File(newname.c_str());
+    Ogg::XiphComment* c = f->xiphComment(true);
+    c->addField("ARTIST", "artist 1", true);
+    c->addField("ARTIST", "artist 2", false);
+    f->save();
+    delete f;
+
+    f = new FLAC::File(newname.c_str());
+    c = f->xiphComment(true);
+    Ogg::FieldListMap m = c->fieldListMap();
+    CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), m["ARTIST"].size());
+    CPPUNIT_ASSERT_EQUAL(String("artist 1"), m["ARTIST"][0]);
+    CPPUNIT_ASSERT_EQUAL(String("artist 2"), m["ARTIST"][1]);
+  }
+
 };
 
 CPPUNIT_TEST_SUITE_REGISTRATION(TestFLAC);