From 3f9d17349594042997dd33835bf51552680b29ce Mon Sep 17 00:00:00 2001 From: Deluan Date: Sat, 22 Mar 2025 15:48:07 -0400 Subject: [PATCH] fix(scanner): support ID3v2 embedded images in WAV files Fix #3867 Signed-off-by: Deluan --- adapters/taglib/taglib_wrapper.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/adapters/taglib/taglib_wrapper.cpp b/adapters/taglib/taglib_wrapper.cpp index 188a8b7d7..4c5a9fa1e 100644 --- a/adapters/taglib/taglib_wrapper.cpp +++ b/adapters/taglib/taglib_wrapper.cpp @@ -201,41 +201,42 @@ int taglib_read(const FILENAME_CHAR_T *filename, unsigned long id) { char has_cover(const TagLib::FileRef f) { char hasCover = 0; // ----- MP3 - if (TagLib::MPEG::File * - mp3File{dynamic_cast(f.file())}) { + if (TagLib::MPEG::File * mp3File{dynamic_cast(f.file())}) { if (mp3File->ID3v2Tag()) { const auto &frameListMap{mp3File->ID3v2Tag()->frameListMap()}; hasCover = !frameListMap["APIC"].isEmpty(); } } // ----- FLAC - else if (TagLib::FLAC::File * - flacFile{dynamic_cast(f.file())}) { + else if (TagLib::FLAC::File * flacFile{dynamic_cast(f.file())}) { hasCover = !flacFile->pictureList().isEmpty(); } // ----- MP4 - else if (TagLib::MP4::File * - mp4File{dynamic_cast(f.file())}) { + else if (TagLib::MP4::File * mp4File{dynamic_cast(f.file())}) { auto &coverItem{mp4File->tag()->itemMap()["covr"]}; TagLib::MP4::CoverArtList coverArtList{coverItem.toCoverArtList()}; hasCover = !coverArtList.isEmpty(); } // ----- Ogg - else if (TagLib::Ogg::Vorbis::File * - vorbisFile{dynamic_cast(f.file())}) { + else if (TagLib::Ogg::Vorbis::File * vorbisFile{dynamic_cast(f.file())}) { hasCover = !vorbisFile->tag()->pictureList().isEmpty(); } // ----- Opus - else if (TagLib::Ogg::Opus::File * - opusFile{dynamic_cast(f.file())}) { + else if (TagLib::Ogg::Opus::File * opusFile{dynamic_cast(f.file())}) { hasCover = !opusFile->tag()->pictureList().isEmpty(); } // ----- WMA - if (TagLib::ASF::File * - asfFile{dynamic_cast(f.file())}) { + else if (TagLib::ASF::File * asfFile{dynamic_cast(f.file())}) { const TagLib::ASF::Tag *tag{asfFile->tag()}; hasCover = tag && tag->attributeListMap().contains("WM/Picture"); } + // ----- WAV + else if (TagLib::RIFF::WAV::File * wavFile{ dynamic_cast(f.file()) }) { + if (wavFile->hasID3v2Tag()) { + const auto& frameListMap{ wavFile->ID3v2Tag()->frameListMap() }; + hasCover = !frameListMap["APIC"].isEmpty(); + } + } return hasCover; }