Improve lyrics searcher

This commit is contained in:
Jonas Kvinge
2019-06-06 18:22:41 +02:00
parent 427808226f
commit 059c4beb30
8 changed files with 30 additions and 31 deletions

View File

@@ -112,7 +112,9 @@ void ChartLyricsProvider::HandleSearchReply(QNetworkReply *reply, quint64 id, co
result.score = 0.0;
if (result.artist.toLower() == artist.toLower()) result.score += 1.0;
if (result.title.toLower() == title.toLower()) result.score += 1.0;
results << result;
if (result.artist.toLower() == artist.toLower() || result.title.toLower() == title.toLower()) {
results << result;
}
}
result = LyricsSearchResult();
}

View File

@@ -30,7 +30,6 @@
#include "lyricsfetchersearch.h"
const int LyricsFetcher::kMaxConcurrentRequests = 5;
const QRegExp LyricsFetcher::kRemoveNonAlpha("[^a-zA-Z0-9\\d\\s]");
LyricsFetcher::LyricsFetcher(LyricsProviders *lyrics_providers, QObject *parent)
: QObject(parent),
@@ -49,10 +48,8 @@ quint64 LyricsFetcher::Search(const QString &artist, const QString &album, const
LyricsSearchRequest request;
request.artist = artist;
request.album = album;
request.album.remove(kRemoveNonAlpha);
request.album.remove(Song::kAlbumRemoveMisc);
request.title = title;
request.title.remove(kRemoveNonAlpha);
request.title.remove(Song::kTitleRemoveMisc);
request.id = next_id_++;
AddRequest(request);
@@ -97,15 +94,15 @@ void LyricsFetcher::StartRequests() {
LyricsFetcherSearch *search = new LyricsFetcherSearch(request, this);
active_requests_.insert(request.id, search);
connect(search, SIGNAL(SearchFinished(quint64, LyricsSearchResults)), SLOT(SingleSearchFinished(quint64, LyricsSearchResults)));
connect(search, SIGNAL(LyricsFetched(quint64, const QString&)), SLOT(SingleLyricsFetched(quint64, const QString&)));
connect(search, SIGNAL(SearchFinished(const quint64, LyricsSearchResults)), SLOT(SingleSearchFinished(const quint64, LyricsSearchResults)));
connect(search, SIGNAL(LyricsFetched(const quint64, const QString&, const QString&)), SLOT(SingleLyricsFetched(const quint64, const QString&, const QString&)));
search->Start(lyrics_providers_);
}
}
void LyricsFetcher::SingleSearchFinished(quint64 request_id, LyricsSearchResults results) {
void LyricsFetcher::SingleSearchFinished(const quint64 request_id, LyricsSearchResults results) {
LyricsFetcherSearch *search = active_requests_.take(request_id);
if (!search) return;
@@ -114,11 +111,11 @@ void LyricsFetcher::SingleSearchFinished(quint64 request_id, LyricsSearchResults
}
void LyricsFetcher::SingleLyricsFetched(quint64 request_id, const QString &lyrics) {
void LyricsFetcher::SingleLyricsFetched(const quint64 request_id, const QString &provider, const QString &lyrics) {
LyricsFetcherSearch *search = active_requests_.take(request_id);
if (!search) return;
search->deleteLater();
emit LyricsFetched(request_id, lyrics);
emit LyricsFetched(request_id, provider, lyrics);
}

View File

@@ -37,7 +37,7 @@ class LyricsProviders;
class LyricsFetcherSearch;
struct LyricsSearchRequest {
quint64 id;
quint64 id = -1;
QString artist;
QString album;
QString title;
@@ -49,7 +49,7 @@ struct LyricsSearchResult {
QString album;
QString title;
QString lyrics;
float score;
float score = 0.0;
};
Q_DECLARE_METATYPE(LyricsSearchResult);
@@ -64,18 +64,17 @@ class LyricsFetcher : public QObject {
virtual ~LyricsFetcher() {}
static const int kMaxConcurrentRequests;
static const QRegExp kRemoveNonAlpha;
quint64 Search(const QString &artist, const QString &album, const QString &title);
void Clear();
signals:
void LyricsFetched(quint64, const QString &lyrics);
void SearchFinished(quint64, const LyricsSearchResults &results);
void LyricsFetched(const quint64 request_id, const QString &provider, const QString &lyrics);
void SearchFinished(const quint64 request_id, const LyricsSearchResults &results);
private slots:
void SingleSearchFinished(quint64, LyricsSearchResults results);
void SingleLyricsFetched(quint64, const QString &lyrics);
void SingleSearchFinished(const quint64 request_id, LyricsSearchResults results);
void SingleLyricsFetched(const quint64 request_id, const QString &provider, const QString &lyrics);
void StartRequests();
private:

View File

@@ -59,7 +59,7 @@ void LyricsFetcherSearch::TerminateSearch() {
void LyricsFetcherSearch::Start(LyricsProviders *lyrics_providers) {
for (LyricsProvider *provider : lyrics_providers->List()) {
connect(provider, SIGNAL(SearchFinished(quint64, QList<LyricsSearchResult>)), SLOT(ProviderSearchFinished(quint64, QList<LyricsSearchResult>)));
connect(provider, SIGNAL(SearchFinished(const quint64, QList<LyricsSearchResult>)), SLOT(ProviderSearchFinished(const quint64, QList<LyricsSearchResult>)));
const int id = lyrics_providers->NextId();
const bool success = provider->StartSearch(request_.artist, request_.album, request_.title, id);
if (success) pending_requests_[id] = provider;
@@ -69,7 +69,7 @@ void LyricsFetcherSearch::Start(LyricsProviders *lyrics_providers) {
}
void LyricsFetcherSearch::ProviderSearchFinished(quint64 id, const QList<LyricsSearchResult> &results) {
void LyricsFetcherSearch::ProviderSearchFinished(const quint64 id, const QList<LyricsSearchResult> &results) {
if (!pending_requests_.contains(id)) return;
LyricsProvider *provider = pending_requests_.take(id);
@@ -99,7 +99,8 @@ void LyricsFetcherSearch::AllProvidersFinished() {
for (LyricsSearchResult result : results_) {
if (result_use.lyrics.isEmpty() || result.score > result_use.score) result_use = result;
}
emit LyricsFetched(request_.id, result_use.lyrics);
qLog(Debug) << "Using lyrics from" << result_use.provider << "for" << request_.artist << request_.title << "with score" << result_use.score;
emit LyricsFetched(request_.id, result_use.provider, result_use.lyrics);
}
emit SearchFinished(request_.id, results_);

View File

@@ -44,11 +44,11 @@ class LyricsFetcherSearch : public QObject {
void Cancel();
signals:
void SearchFinished(quint64, const LyricsSearchResults &results);
void LyricsFetched(quint64, const QString &lyrics);
void SearchFinished(const quint64, const LyricsSearchResults &results);
void LyricsFetched(const quint64, const QString &provider, const QString &lyrics);
private slots:
void ProviderSearchFinished(quint64 id, const QList<LyricsSearchResult> &results);
void ProviderSearchFinished(const quint64 id, const QList<LyricsSearchResult> &results);
void TerminateSearch();
private: