summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Klotz <uklotz@mixxx.org>2020-03-07 12:16:05 +0100
committerUwe Klotz <uklotz@mixxx.org>2020-03-07 15:26:58 +0100
commit35b89e9ae5af93dc55504c03ef760f3ddac5e069 (patch)
treec1a924b4e28b074e03169a3d3de136704f4f0b49
parent3688aa9c9c2f4c3210c1890f3278c013aed24af1 (diff)
Handle FLAC files with no file tags but only a picture list
-rw-r--r--src/sources/metadatasourcetaglib.cpp27
-rw-r--r--src/track/trackmetadatataglib.cpp48
-rw-r--r--src/track/trackmetadatataglib.h8
3 files changed, 56 insertions, 27 deletions
diff --git a/src/sources/metadatasourcetaglib.cpp b/src/sources/metadatasourcetaglib.cpp
index e2e2f4638c..05bfe60838 100644
--- a/src/sources/metadatasourcetaglib.cpp
+++ b/src/sources/metadatasourcetaglib.cpp
@@ -167,23 +167,34 @@ MetadataSourceTagLib::importTrackMetadataAndCoverImage(
if (!taglib::readAudioProperties(pTrackMetadata, file)) {
break;
}
- // Read cover art directly from the file first. Will be
- // overwritten with cover art contained in on of the tags.
- if (pCoverImage) {
- *pCoverImage = taglib::importCoverImageFromVorbisCommentPictureList(file.pictureList());
- }
+ bool importSucceeded = false;
+ bool coverImageImported = false;
// VorbisComment tag takes precedence over ID3v2 tag
if (taglib::hasXiphComment(file)) {
TagLib::Ogg::XiphComment* pTag = file.xiphComment();
DEBUG_ASSERT(pTag);
taglib::importTrackMetadataFromVorbisCommentTag(pTrackMetadata, *pTag);
- taglib::importCoverImageFromVorbisCommentTag(pCoverImage, *pTag);
- return afterImport(ImportResult::Succeeded);
+ coverImageImported = taglib::importCoverImageFromVorbisCommentTag(pCoverImage, *pTag);
+ importSucceeded = true;
} else if (taglib::hasID3v2Tag(file)) {
const TagLib::ID3v2::Tag* pTag = file.ID3v2Tag();
DEBUG_ASSERT(pTag);
taglib::importTrackMetadataFromID3v2Tag(pTrackMetadata, *pTag);
- taglib::importCoverImageFromID3v2Tag(pCoverImage, *pTag);
+ coverImageImported = taglib::importCoverImageFromID3v2Tag(pCoverImage, *pTag);
+ importSucceeded = true;
+ }
+ // Only import cover images from picture list as a fallback if file tags
+ // are available but no cover image has been found yet! Otherwise until
+ // file tags have been successfully imported once, Mixxx would retry to
+ // import the missing file tags over and over again when loading the
+ // cover image.
+ if (pCoverImage && // cover image is requested
+ importSucceeded &&
+ !coverImageImported) { // no cover image found in file tags
+ // Read cover art directly from the file as a fallback
+ *pCoverImage = taglib::importCoverImageFromVorbisCommentPictureList(file.pictureList());
+ }
+ if (importSucceeded) {
return afterImport(ImportResult::Succeeded);
}
break;
diff --git a/src/track/trackmetadatataglib.cpp b/src/track/trackmetadatataglib.cpp
index f0f216e392..d70673fee2 100644
--- a/src/track/trackmetadatataglib.cpp
+++ b/src/track/trackmetadatataglib.cpp
@@ -1168,9 +1168,9 @@ const T* downcastID3v2Frame(TagLib::ID3v2::Frame* frame) {
return downcastFrame;
}
-void importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& tag) {
+bool importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& tag) {
if (!pCoverArt) {
- return; // nothing to do
+ return false; // nothing to do
}
const auto iterAPIC = tag.frameListMap().find("APIC");
@@ -1178,7 +1178,7 @@ void importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& t
if (kLogger.debugEnabled()) {
kLogger.debug() << "No cover art: None or empty list of ID3v2 APIC frames";
}
- return; // abort
+ return false; // abort
}
const TagLib::ID3v2::FrameList pFrames = iterAPIC->second;
@@ -1195,7 +1195,7 @@ void importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& t
continue;
} else {
*pCoverArt = image;
- return; // success
+ return true; // success
}
}
}
@@ -1214,15 +1214,20 @@ void importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& t
continue;
} else {
*pCoverArt = image;
- return; // success
+ return true; // success
}
}
}
+
+ if (kLogger.debugEnabled()) {
+ kLogger.debug() << "No cover art found in ID3v2 tag";
+ }
+ return false;
}
-void importCoverImageFromAPETag(QImage* pCoverArt, const TagLib::APE::Tag& tag) {
+bool importCoverImageFromAPETag(QImage* pCoverArt, const TagLib::APE::Tag& tag) {
if (!pCoverArt) {
- return; // nothing to do
+ return false; // nothing to do
}
if (tag.itemListMap().contains("COVER ART (FRONT)")) {
@@ -1238,14 +1243,20 @@ void importCoverImageFromAPETag(QImage* pCoverArt, const TagLib::APE::Tag& tag)
<< "Failed to load image from APE tag";
} else {
*pCoverArt = image; // success
+ return true;
}
}
}
+
+ if (kLogger.debugEnabled()) {
+ kLogger.debug() << "No cover art found in APE tag";
+ }
+ return false;
}
-void importCoverImageFromVorbisCommentTag(QImage* pCoverArt, TagLib::Ogg::XiphComment& tag) {
+bool importCoverImageFromVorbisCommentTag(QImage* pCoverArt, TagLib::Ogg::XiphComment& tag) {
if (!pCoverArt) {
- return; // nothing to do
+ return false; // nothing to do
}
#if (TAGLIB_HAS_VORBIS_COMMENT_PICTURES)
@@ -1253,7 +1264,7 @@ void importCoverImageFromVorbisCommentTag(QImage* pCoverArt, TagLib::Ogg::XiphCo
importCoverImageFromVorbisCommentPictureList(tag.pictureList());
if (!image.isNull()) {
*pCoverArt = image;
- return; // done
+ return false; // done
}
#endif
@@ -1287,7 +1298,7 @@ void importCoverImageFromVorbisCommentTag(QImage* pCoverArt, TagLib::Ogg::XiphCo
continue;
} else {
*pCoverArt = image;
- return; // done
+ return true; // done
}
} else {
kLogger.warning()
@@ -1315,18 +1326,20 @@ void importCoverImageFromVorbisCommentTag(QImage* pCoverArt, TagLib::Ogg::XiphCo
continue;
} else {
*pCoverArt = image;
- return; // done
+ return true; // done
}
}
}
+
if (kLogger.debugEnabled()) {
kLogger.debug() << "No cover art found in VorbisComment tag";
}
+ return false;
}
-void importCoverImageFromMP4Tag(QImage* pCoverArt, const TagLib::MP4::Tag& tag) {
+bool importCoverImageFromMP4Tag(QImage* pCoverArt, const TagLib::MP4::Tag& tag) {
if (!pCoverArt) {
- return; // nothing to do
+ return false; // nothing to do
}
if (getItemListMap(tag).contains("covr")) {
@@ -1340,10 +1353,15 @@ void importCoverImageFromMP4Tag(QImage* pCoverArt, const TagLib::MP4::Tag& tag)
continue;
} else {
*pCoverArt = image;
- return; // done
+ return true; // done
}
}
}
+
+ if (kLogger.debugEnabled()) {
+ kLogger.debug() << "No cover art found in MP4 tag";
+ }
+ return false;
}
void importTrackMetadataFromTag(
diff --git a/src/track/trackmetadatataglib.h b/src/track/trackmetadatataglib.h
index 04f287e172..b15838b51e 100644
--- a/src/track/trackmetadatataglib.h
+++ b/src/track/trackmetadatataglib.h
@@ -56,10 +56,10 @@ bool readAudioProperties(
TrackMetadata* pTrackMetadata,
const TagLib::File& file);
-void importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& tag);
-void importCoverImageFromAPETag(QImage* pCoverArt, const TagLib::APE::Tag& tag);
-void importCoverImageFromVorbisCommentTag(QImage* pCoverArt, TagLib::Ogg::XiphComment& tag);
-void importCoverImageFromMP4Tag(QImage* pCoverArt, const TagLib::MP4::Tag& tag);
+bool importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& tag);
+bool importCoverImageFromAPETag(QImage* pCoverArt, const TagLib::APE::Tag& tag);
+bool importCoverImageFromVorbisCommentTag(QImage* pCoverArt, TagLib::Ogg::XiphComment& tag);
+bool importCoverImageFromMP4Tag(QImage* pCoverArt, const TagLib::MP4::Tag& tag);
QImage importCoverImageFromVorbisCommentPictureList(const TagLib::List<TagLib::FLAC::Picture*>& pictures);