From 059c4beb30eee8d0ecf025ad1ae694f56190f21e Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Thu, 6 Jun 2019 18:22:41 +0200 Subject: [PATCH] Improve lyrics searcher --- src/context/contextview.cpp | 12 ++++++------ src/context/contextview.h | 4 ++-- src/core/mainwindow.cpp | 2 +- src/lyrics/chartlyricsprovider.cpp | 4 +++- src/lyrics/lyricsfetcher.cpp | 13 +++++-------- src/lyrics/lyricsfetcher.h | 13 ++++++------- src/lyrics/lyricsfetchersearch.cpp | 7 ++++--- src/lyrics/lyricsfetchersearch.h | 6 +++--- 8 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/context/contextview.cpp b/src/context/contextview.cpp index e5f429cd6..1ee21f448 100644 --- a/src/context/contextview.cpp +++ b/src/context/contextview.cpp @@ -104,7 +104,7 @@ ContextView::ContextView(QWidget *parent) : ContextView::~ContextView() { delete ui_; } -void ContextView::SetApplication(Application *app, CollectionView *collectionview, AlbumCoverChoiceController *album_cover_choice_controller) { +void ContextView::Init(Application *app, CollectionView *collectionview, AlbumCoverChoiceController *album_cover_choice_controller) { app_ = app; collectionview_ = collectionview; @@ -116,7 +116,7 @@ void ContextView::SetApplication(Application *app, CollectionView *collectionvie connect(collectionview_, SIGNAL(TotalSongCountUpdated_()), this, SLOT(UpdateNoSong())); connect(collectionview_, SIGNAL(TotalArtistCountUpdated_()), this, SLOT(UpdateNoSong())); connect(collectionview_, SIGNAL(TotalAlbumCountUpdated_()), this, SLOT(UpdateNoSong())); - connect(lyrics_fetcher_, SIGNAL(LyricsFetched(quint64, const QString)), this, SLOT(UpdateLyrics(quint64, const QString))); + connect(lyrics_fetcher_, SIGNAL(LyricsFetched(const quint64, const QString&, const QString&)), this, SLOT(UpdateLyrics(const quint64, const QString&, const QString&))); connect(app_->current_art_loader(), SIGNAL(ArtLoaded(Song, QString, QImage)), SLOT(AlbumArtLoaded(Song, QString, QImage))); connect(album_cover_choice_controller_, SIGNAL(AutomaticCoverSearchDone()), this, SLOT(AutomaticCoverSearchDone())); connect(album_cover_choice_controller_->search_cover_auto_action(), SIGNAL(triggered()), this, SLOT(SearchCoverAutomatically())); @@ -203,7 +203,7 @@ void ContextView::SongChanged(const Song &song) { SetSong(song); if (lyrics_.isEmpty() && action_show_lyrics_->isChecked()) { lyrics_fetcher_->Clear(); - lyrics_id_ = lyrics_fetcher_->Search(song.artist(), song.album(), song.title()); + lyrics_id_ = lyrics_fetcher_->Search(song.effective_albumartist(), song.album(), song.title()); } } @@ -498,13 +498,13 @@ void ContextView::UpdateSong(const Song &song) { } -void ContextView::UpdateLyrics(quint64 id, const QString lyrics) { +void ContextView::UpdateLyrics(const quint64 id, const QString &provider, const QString &lyrics) { if (id != lyrics_id_) return; - lyrics_ = lyrics; + lyrics_ = lyrics + "\n\n(Lyrics from " + provider + ")\n"; lyrics_id_ = -1; if (action_show_lyrics_->isChecked()) { - ui_->label_play_lyrics->setText(lyrics); + ui_->label_play_lyrics->setText(lyrics_); } else ui_->label_play_lyrics->clear(); diff --git a/src/context/contextview.h b/src/context/contextview.h index d608a9aeb..9f2d201c6 100644 --- a/src/context/contextview.h +++ b/src/context/contextview.h @@ -61,7 +61,7 @@ class ContextView : public QWidget { ContextView(QWidget *parent = nullptr); ~ContextView(); - void SetApplication(Application *app, CollectionView *collectionview, AlbumCoverChoiceController *album_cover_choice_controller); + void Init(Application *app, CollectionView *collectionview, AlbumCoverChoiceController *album_cover_choice_controller); ContextAlbumsView *albums() { return ui_->widget_play_albums; } @@ -130,7 +130,7 @@ class ContextView : public QWidget { void ActionShowOutput(); void ActionShowAlbums(); void ActionShowLyrics(); - void UpdateLyrics(quint64 id, const QString lyrics); + void UpdateLyrics(const quint64 id, const QString &provider, const QString &lyrics); void SearchCoverAutomatically(); void AutomaticCoverSearchDone(); void AlbumArtLoaded(const Song &song, const QString &uri, const QImage &image); diff --git a/src/core/mainwindow.cpp b/src/core/mainwindow.cpp index 437d8a6d6..443357bad 100644 --- a/src/core/mainwindow.cpp +++ b/src/core/mainwindow.cpp @@ -246,7 +246,7 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co connect(album_cover_choice_controller_->search_cover_auto_action(), SIGNAL(triggered()), this, SLOT(SearchCoverAutomatically())); ui_->multi_loading_indicator->SetTaskManager(app_->task_manager()); - context_view_->SetApplication(app_, collection_view_->view(), album_cover_choice_controller_); + context_view_->Init(app_, collection_view_->view(), album_cover_choice_controller_); ui_->widget_playing->SetApplication(app_, album_cover_choice_controller_); // Initialise the search widget diff --git a/src/lyrics/chartlyricsprovider.cpp b/src/lyrics/chartlyricsprovider.cpp index 1120dd424..1295c4c99 100644 --- a/src/lyrics/chartlyricsprovider.cpp +++ b/src/lyrics/chartlyricsprovider.cpp @@ -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(); } diff --git a/src/lyrics/lyricsfetcher.cpp b/src/lyrics/lyricsfetcher.cpp index 40a4c65eb..6e38e6da1 100644 --- a/src/lyrics/lyricsfetcher.cpp +++ b/src/lyrics/lyricsfetcher.cpp @@ -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); } diff --git a/src/lyrics/lyricsfetcher.h b/src/lyrics/lyricsfetcher.h index e39c2ed54..763ff0cd1 100644 --- a/src/lyrics/lyricsfetcher.h +++ b/src/lyrics/lyricsfetcher.h @@ -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: diff --git a/src/lyrics/lyricsfetchersearch.cpp b/src/lyrics/lyricsfetchersearch.cpp index 7211b634b..8ee027af4 100644 --- a/src/lyrics/lyricsfetchersearch.cpp +++ b/src/lyrics/lyricsfetchersearch.cpp @@ -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)), SLOT(ProviderSearchFinished(quint64, QList))); + connect(provider, SIGNAL(SearchFinished(const quint64, QList)), SLOT(ProviderSearchFinished(const quint64, QList))); 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 &results) { +void LyricsFetcherSearch::ProviderSearchFinished(const quint64 id, const QList &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_); diff --git a/src/lyrics/lyricsfetchersearch.h b/src/lyrics/lyricsfetchersearch.h index a1cd3c96a..976cab783 100644 --- a/src/lyrics/lyricsfetchersearch.h +++ b/src/lyrics/lyricsfetchersearch.h @@ -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 &results); + void ProviderSearchFinished(const quint64 id, const QList &results); void TerminateSearch(); private: