diff --git a/dbquery/dbquery.cpp b/dbquery/dbquery.cpp index 8a94e6e..6fb7118 100644 --- a/dbquery/dbquery.cpp +++ b/dbquery/dbquery.cpp @@ -24,7 +24,8 @@ SongDescription::SongDescription(const QString &songId) { } -map QueryResultsModel::m_coverData = map(); +std::list QueryResultsModel::s_coverNames = std::list(); +map QueryResultsModel::s_coverData = map(); QueryResultsModel::QueryResultsModel(QObject *parent) : QAbstractTableModel(parent) @@ -369,7 +370,23 @@ void HttpResultsModel::parseCoverResults(const QString &albumId, int row, const return; } if (!data.isEmpty()) { - m_coverData[albumId] = data; + // cache the fetched cover + const auto currentCachedCoverCount = s_coverData.size(); + s_coverData[albumId] = data; + if (s_coverData.size() > currentCachedCoverCount) { + s_coverNames.emplace_back(albumId); + + // keep only the last 20 cover images around + while (s_coverNames.size() > 20) { + s_coverData.erase(s_coverNames.front()); + s_coverNames.pop_front(); + } + } else if (s_coverNames.back() != albumId) { + s_coverNames.remove(albumId); + s_coverNames.emplace_back(albumId); + } + + // add the cover to the results m_results[row].cover = data; emit coverAvailable(index(row, 0)); } diff --git a/dbquery/dbquery.h b/dbquery/dbquery.h index b669dce..26f5e53 100644 --- a/dbquery/dbquery.h +++ b/dbquery/dbquery.h @@ -86,7 +86,8 @@ protected: QStringList m_errorList; bool m_resultsAvailable; bool m_fetchingCover; - static std::map m_coverData; + static std::list s_coverNames; + static std::map s_coverData; }; inline const QList &QueryResultsModel::results() const diff --git a/dbquery/lyricswikia.cpp b/dbquery/lyricswikia.cpp index cc31412..ad81559 100644 --- a/dbquery/lyricswikia.cpp +++ b/dbquery/lyricswikia.cpp @@ -54,8 +54,8 @@ bool LyricsWikiaResultsModel::fetchCover(const QModelIndex &index) } // skip if the item belongs to an album which cover has already been fetched - const auto coverData = m_coverData.find(desc.albumId); - if (coverData != m_coverData.end()) { + const auto coverData = s_coverData.find(desc.albumId); + if (coverData != s_coverData.end()) { desc.cover = coverData->second; return true; } diff --git a/dbquery/musicbrainz.cpp b/dbquery/musicbrainz.cpp index 6e39a55..3aaafb3 100644 --- a/dbquery/musicbrainz.cpp +++ b/dbquery/musicbrainz.cpp @@ -59,8 +59,8 @@ bool MusicBrainzResultsModel::fetchCover(const QModelIndex &index) } // skip if the item belongs to an album which cover has already been fetched - const auto coverData = m_coverData.find(desc.albumId); - if (coverData != m_coverData.end()) { + const auto coverData = s_coverData.find(desc.albumId); + if (coverData != s_coverData.end()) { desc.cover = coverData->second; return true; }