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) {
|
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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 *);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user