support for multiple composer, performer and disc tags
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 *);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user