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) {
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);
}
else if(!entity->info.song->performer &&
strcmp(re->name, "Performer") == 0) {
entity->info.song->performer = str_pool_dup(re->value);
entity->info.song->composer = 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, "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(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) {

View File

@@ -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;

View File

@@ -103,6 +103,7 @@ class TagEditor : public Screen<Window>
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 *);