/* ** Extracts cover art embedded in FLAC files. ** */ bool CCover::ExtractFLAC(TagLib::FLAC::File* file, const std::wstring& target) { const TagLib::List<TagLib::FLAC::Picture*>& picList = file->pictureList(); if (!picList.isEmpty()) { // Let's grab the first image TagLib::FLAC::Picture* pic = picList[0]; return WriteCover(pic->data(), target); } return false; }
/* ** Extracts cover art embedded in ID3v2 tags. ** */ bool CCover::ExtractID3(TagLib::ID3v2::Tag* tag, const std::wstring& target) { const TagLib::ID3v2::FrameList& frameList = tag->frameList("APIC"); if (!frameList.isEmpty()) { // Grab the first image TagLib::ID3v2::AttachedPictureFrame* frame = static_cast<TagLib::ID3v2::AttachedPictureFrame*>(frameList.front()); return WriteCover(frame->picture(), target); } return false; }
/* ** Extracts cover art embedded in MP4-like files. ** */ bool CCover::ExtractMP4(TagLib::MP4::File* file, const std::string& target) { TagLib::MP4::Tag* tag = file->tag(); if (tag->itemListMap().contains("covr")) { TagLib::MP4::CoverArtList coverList = tag->itemListMap()["covr"].toCoverArtList(); if (coverList[0].data().size() > 0) { return WriteCover(coverList[0].data(), target); } } return false; }
/* ** Extracts cover art embedded in APE tags. ** */ bool CCover::ExtractAPE(TagLib::APE::Tag* tag, const std::wstring& target) { const TagLib::APE::ItemListMap& listMap = tag->itemListMap(); if (listMap.contains("COVER ART (FRONT)")) { const TagLib::ByteVector nullStringTerminator(1, 0); TagLib::ByteVector item = listMap["COVER ART (FRONT)"].value(); int pos = item.find(nullStringTerminator); // Skip the filename if (++pos > 0) { const TagLib::ByteVector& pic = item.mid(pos); return WriteCover(pic, target); } } return false; }
/* ** Extracts cover art embedded in ASF/WMA files. ** */ bool CCover::ExtractASF(TagLib::ASF::File* file, const std::wstring& target) { const TagLib::ASF::AttributeListMap& attrListMap = file->tag()->attributeListMap(); if (attrListMap.contains("WM/Picture")) { const TagLib::ASF::AttributeList& attrList = attrListMap["WM/Picture"]; if (!attrList.isEmpty()) { // Let's grab the first cover. TODO: Check/loop for correct type TagLib::ASF::Picture wmpic = attrList[0].toPicture(); if (wmpic.isValid()) { return WriteCover(wmpic.picture(), target); } } } return false; }