diff --git a/src/libmpdclient.c b/src/libmpdclient.c index d42a823b..e141b636 100644 --- a/src/libmpdclient.c +++ b/src/libmpdclient.c @@ -1243,17 +1243,35 @@ mpd_InfoEntity * mpd_getNextInfoEntity(mpd_Connection * connection) { strcmp(re->name, "Genre") == 0) { entity->info.song->genre = str_pool_dup(re->value); } - else if(!entity->info.song->composer && - strcmp(re->name, "Composer") == 0) { - entity->info.song->composer = str_pool_dup(re->value); + else if(strcmp(re->name, "Composer") == 0) { + char *tmp = 0; + if (entity->info.song->composer) { + tmp = malloc(strlen(entity->info.song->composer) + strlen(re->value) + 3); + sprintf(tmp, "%s, %s", entity->info.song->composer, re->value); + str_pool_put(entity->info.song->composer); + } + entity->info.song->composer = tmp ? str_pool_get(tmp) : str_pool_dup(re->value); + free(tmp); } - else if(!entity->info.song->performer && - strcmp(re->name, "Performer") == 0) { - entity->info.song->performer = str_pool_dup(re->value); + else if(strcmp(re->name, "Performer") == 0) { + char *tmp = 0; + if (entity->info.song->performer) { + tmp = malloc(strlen(entity->info.song->performer) + strlen(re->value) + 3); + sprintf(tmp, "%s, %s", entity->info.song->performer, re->value); + str_pool_put(entity->info.song->performer); + } + entity->info.song->performer = tmp ? str_pool_get(tmp) : str_pool_dup(re->value); + free(tmp); } - else if(!entity->info.song->disc && - strcmp(re->name, "Disc") == 0) { - entity->info.song->disc = str_pool_dup(re->value); + else if(strcmp(re->name, "Disc") == 0) { + char *tmp = 0; + if (entity->info.song->disc) { + tmp = malloc(strlen(entity->info.song->disc) + strlen(re->value) + 3); + sprintf(tmp, "%s, %s", entity->info.song->disc, re->value); + str_pool_put(entity->info.song->disc); + } + entity->info.song->disc = tmp ? str_pool_get(tmp) : str_pool_dup(re->value); + free(tmp); } else if(!entity->info.song->comment && strcmp(re->name, "Comment") == 0) { diff --git a/src/tag_editor.cpp b/src/tag_editor.cpp index e97978f6..2ac238e7 100644 --- a/src/tag_editor.cpp +++ b/src/tag_editor.cpp @@ -864,21 +864,31 @@ bool TagEditor::WriteTags(Song &s) MPEG::File file(path_to_file.c_str()); ID3v2::Tag *tag = file.ID3v2Tag(); String::Type encoding = String::UTF8; + ByteVector Composer("TCOM"); ByteVector Performer("TOPE"); ByteVector Disc("TPOS"); - ID3v2::Frame *ComposerFrame = new ID3v2::TextIdentificationFrame(Composer, encoding); - ID3v2::Frame *PerformerFrame = new ID3v2::TextIdentificationFrame(Performer, encoding); - ID3v2::Frame *DiscFrame = new ID3v2::TextIdentificationFrame(Disc, encoding); - ComposerFrame->setText(ToWString(s.GetComposer())); - PerformerFrame->setText(ToWString(s.GetPerformer())); - DiscFrame->setText(ToWString(s.GetDisc())); + + TagLib::StringList list; + + GetTagList(list, s.GetComposer()); tag->removeFrames(Composer); + ID3v2::TextIdentificationFrame *ComposerFrame = new ID3v2::TextIdentificationFrame(Composer, encoding); + ComposerFrame->setText(list); tag->addFrame(ComposerFrame); + + GetTagList(list, s.GetPerformer()); tag->removeFrames(Performer); + ID3v2::TextIdentificationFrame *PerformerFrame = new ID3v2::TextIdentificationFrame(Performer, encoding); + PerformerFrame->setText(list); tag->addFrame(PerformerFrame); + + GetTagList(list, s.GetDisc()); tag->removeFrames(Disc); + ID3v2::TextIdentificationFrame *DiscFrame = new ID3v2::TextIdentificationFrame(Disc, encoding); + DiscFrame->setText(list); tag->addFrame(DiscFrame); + if (!file.save()) return false; } @@ -977,6 +987,18 @@ void TagEditor::LowerAllLetters(Song &s) s.SetComment(conv); } +void TagEditor::GetTagList(TagLib::StringList &list, const std::string &s) +{ + list.clear(); + for (size_t i = 0; i != string::npos; i = s.find(",", i)) + { + if (i) + i++; + size_t j = s.find(",", i); + list.append(s.substr(i, j-i)); + } +} + std::string TagEditor::TagToString(const MPD::Song &s, void *data) { std::string result; diff --git a/src/tag_editor.h b/src/tag_editor.h index 444999e2..bd2d2316 100644 --- a/src/tag_editor.h +++ b/src/tag_editor.h @@ -103,6 +103,7 @@ class TagEditor : public Screen static std::string CapitalizeFirstLetters(const std::string &); static void CapitalizeFirstLetters(MPD::Song &); static void LowerAllLetters(MPD::Song &); + static void GetTagList(TagLib::StringList &, const std::string &); static std::string TagToString(const MPD::Song &, void *);