support for multiple composer, performer and disc tags

This commit is contained in:
Andrzej Rybczak
2009-03-04 21:14:11 +01:00
parent 67b7aaae8a
commit 76701883e9
3 changed files with 56 additions and 15 deletions

View File

@@ -1243,17 +1243,35 @@ mpd_InfoEntity * mpd_getNextInfoEntity(mpd_Connection * connection) {
strcmp(re->name, "Genre") == 0) { strcmp(re->name, "Genre") == 0) {
entity->info.song->genre = str_pool_dup(re->value); entity->info.song->genre = str_pool_dup(re->value);
} }
else if(!entity->info.song->composer && else if(strcmp(re->name, "Composer") == 0) {
strcmp(re->name, "Composer") == 0) { char *tmp = 0;
entity->info.song->composer = str_pool_dup(re->value); 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);
} }
else if(!entity->info.song->performer && entity->info.song->composer = tmp ? str_pool_get(tmp) : str_pool_dup(re->value);
strcmp(re->name, "Performer") == 0) { free(tmp);
entity->info.song->performer = str_pool_dup(re->value);
} }
else if(!entity->info.song->disc && else if(strcmp(re->name, "Performer") == 0) {
strcmp(re->name, "Disc") == 0) { char *tmp = 0;
entity->info.song->disc = str_pool_dup(re->value); 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(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 && else if(!entity->info.song->comment &&
strcmp(re->name, "Comment") == 0) { strcmp(re->name, "Comment") == 0) {

View File

@@ -864,21 +864,31 @@ bool TagEditor::WriteTags(Song &s)
MPEG::File file(path_to_file.c_str()); MPEG::File file(path_to_file.c_str());
ID3v2::Tag *tag = file.ID3v2Tag(); ID3v2::Tag *tag = file.ID3v2Tag();
String::Type encoding = String::UTF8; String::Type encoding = String::UTF8;
ByteVector Composer("TCOM"); ByteVector Composer("TCOM");
ByteVector Performer("TOPE"); ByteVector Performer("TOPE");
ByteVector Disc("TPOS"); ByteVector Disc("TPOS");
ID3v2::Frame *ComposerFrame = new ID3v2::TextIdentificationFrame(Composer, encoding);
ID3v2::Frame *PerformerFrame = new ID3v2::TextIdentificationFrame(Performer, encoding); TagLib::StringList list;
ID3v2::Frame *DiscFrame = new ID3v2::TextIdentificationFrame(Disc, encoding);
ComposerFrame->setText(ToWString(s.GetComposer())); GetTagList(list, s.GetComposer());
PerformerFrame->setText(ToWString(s.GetPerformer()));
DiscFrame->setText(ToWString(s.GetDisc()));
tag->removeFrames(Composer); tag->removeFrames(Composer);
ID3v2::TextIdentificationFrame *ComposerFrame = new ID3v2::TextIdentificationFrame(Composer, encoding);
ComposerFrame->setText(list);
tag->addFrame(ComposerFrame); tag->addFrame(ComposerFrame);
GetTagList(list, s.GetPerformer());
tag->removeFrames(Performer); tag->removeFrames(Performer);
ID3v2::TextIdentificationFrame *PerformerFrame = new ID3v2::TextIdentificationFrame(Performer, encoding);
PerformerFrame->setText(list);
tag->addFrame(PerformerFrame); tag->addFrame(PerformerFrame);
GetTagList(list, s.GetDisc());
tag->removeFrames(Disc); tag->removeFrames(Disc);
ID3v2::TextIdentificationFrame *DiscFrame = new ID3v2::TextIdentificationFrame(Disc, encoding);
DiscFrame->setText(list);
tag->addFrame(DiscFrame); tag->addFrame(DiscFrame);
if (!file.save()) if (!file.save())
return false; return false;
} }
@@ -977,6 +987,18 @@ void TagEditor::LowerAllLetters(Song &s)
s.SetComment(conv); 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 TagEditor::TagToString(const MPD::Song &s, void *data)
{ {
std::string result; std::string result;

View File

@@ -103,6 +103,7 @@ class TagEditor : public Screen<Window>
static std::string CapitalizeFirstLetters(const std::string &); static std::string CapitalizeFirstLetters(const std::string &);
static void CapitalizeFirstLetters(MPD::Song &); static void CapitalizeFirstLetters(MPD::Song &);
static void LowerAllLetters(MPD::Song &); static void LowerAllLetters(MPD::Song &);
static void GetTagList(TagLib::StringList &, const std::string &);
static std::string TagToString(const MPD::Song &, void *); static std::string TagToString(const MPD::Song &, void *);