/** * Set the file-type specific `compilation' tag. * * See the discussion on top of this file about which tag is used * for which file-type. * * @param file taggit's file-data structure for the processed file * @param tag the tag-data decoded by `taglib_file_tag()' * @param value the string the user wants to set this tag to * * @return void * @sideeffects none */ void taggit_tag_set_compilation(struct taggit_file *file, TagLib_Tag *tag, const char *value) { TagLib::APE::Tag *ape; TagLib::ID3v2::Tag *v2; TagLib::Ogg::XiphComment *ogg; const char *ret; TagLib::MPEG::File::File *f; int mask; ret = (const char *)NULL; switch (file->type) { case FT_MPEG: f = reinterpret_cast<TagLib::MPEG::File::File *>(file->data); mask = setup_get_write_mask(FT_MPEG); if (mask & MP3_ID3V2) { v2 = f->ID3v2Tag(); v2->removeFrames("TPE2"); /* * @TODO: I don't know how to figure out the proper `encoding' * value here. Should we look at the `unicodeStrings' * variable from taglib? */ TagLib::ID3v2::TextIdentificationFrame *frame = new TagLib::ID3v2::TextIdentificationFrame( "TPE2", TagLib::String::Latin1); frame->setText(value); v2->addFrame(frame); } if (mask & MP3_APE) { ape = f->APETag(); ape->addValue("ALBUMARTIST", value, true); } break; case FT_OGGVORBIS: /* @FALLTHROUGH@ */ case FT_OGGFLAC: ogg = reinterpret_cast<TagLib::Ogg::XiphComment *>(tag); ogg->addField("ALBUMARTIST", value, true); break; default: break; } }
int TagLibMetadata::setGrouping(const QString& grp){ if(f == NULL || !f->isValid()){ qDebug("Cannot set grouping tag on invalid file object"); return 1; } TagLib::MPEG::File* fileTestMpeg = dynamic_cast<TagLib::MPEG::File*>(f); if(fileTestMpeg != NULL){ TagLib::ID3v2::Tag* tagTestId3v2 = fileTestMpeg->ID3v2Tag(); if(tagTestId3v2 != NULL){ TagLib::ID3v2::Frame* frm = new TagLib::ID3v2::TextIdentificationFrame("TIT1"); frm->setText(TagLib::String(grp.toUtf8().data())); tagTestId3v2->removeFrames("TIT1"); tagTestId3v2->addFrame(frm); f->save(); return 0; }else{ TagLib::ID3v1::Tag* tagTestId3v1 = fileTestMpeg->ID3v1Tag(); if(tagTestId3v1 != NULL){ #ifdef Q_OS_WIN qDebug("ID3v1 does not support the Grouping tag"); #else qDebug("ID3v1 does not support the Grouping tag (%s)",f->name()); #endif return 1; } } } TagLib::RIFF::AIFF::File* fileTestAiff = dynamic_cast<TagLib::RIFF::AIFF::File*>(f); if(fileTestAiff != NULL){ TagLib::ID3v2::Tag* tagTestId3v2 = fileTestAiff->tag(); if(tagTestId3v2 != NULL){ TagLib::ID3v2::Frame* frm = new TagLib::ID3v2::TextIdentificationFrame("TIT1"); frm->setText(TagLib::String(grp.toUtf8().data())); tagTestId3v2->removeFrames("TIT1"); tagTestId3v2->addFrame(frm); f->save(); return 0; } } TagLib::RIFF::WAV::File* fileTestWav = dynamic_cast<TagLib::RIFF::WAV::File*>(f); if(fileTestWav != NULL){ TagLib::ID3v2::Tag* tagTestId3v2 = fileTestWav->tag(); if(tagTestId3v2 != NULL){ TagLib::ID3v2::Frame* frm = new TagLib::ID3v2::TextIdentificationFrame("TIT1"); frm->setText(TagLib::String(grp.toUtf8().data())); tagTestId3v2->removeFrames("TIT1"); tagTestId3v2->addFrame(frm); f->save(); return 0; } } TagLib::MP4::Tag* tagTestMp4 = dynamic_cast<TagLib::MP4::Tag*>(f->tag()); if(tagTestMp4 != NULL){ TagLib::StringList sl(TagLib::String(grp.toUtf8().data())); tagTestMp4->itemListMap()["\251grp"] = sl; tagTestMp4->save(); f->save(); return 0; } TagLib::ASF::Tag* tagTestAsf = dynamic_cast<TagLib::ASF::Tag*>(f->tag()); if(tagTestAsf != NULL){ tagTestAsf->setAttribute("WM/ContentGroupDescription",TagLib::String(grp.toUtf8().data())); f->save(); return 0; } TagLib::APE::Tag* tagTestApe = dynamic_cast<TagLib::APE::Tag*>(f->tag()); if(tagTestApe != NULL){ tagTestApe->addValue("GROUPING",TagLib::String(grp.toUtf8().data())); f->save(); return 0; } #ifdef Q_OS_WIN qDebug("Grouping tag write failed all tests"); #else qDebug("Grouping tag write failed all tests on %s",f->name()); #endif return 1; }