Improve lyrics searcher
This commit is contained in:
@@ -104,7 +104,7 @@ ContextView::ContextView(QWidget *parent) :
|
|||||||
|
|
||||||
ContextView::~ContextView() { delete ui_; }
|
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;
|
app_ = app;
|
||||||
collectionview_ = collectionview;
|
collectionview_ = collectionview;
|
||||||
@@ -116,7 +116,7 @@ void ContextView::SetApplication(Application *app, CollectionView *collectionvie
|
|||||||
connect(collectionview_, SIGNAL(TotalSongCountUpdated_()), this, SLOT(UpdateNoSong()));
|
connect(collectionview_, SIGNAL(TotalSongCountUpdated_()), this, SLOT(UpdateNoSong()));
|
||||||
connect(collectionview_, SIGNAL(TotalArtistCountUpdated_()), this, SLOT(UpdateNoSong()));
|
connect(collectionview_, SIGNAL(TotalArtistCountUpdated_()), this, SLOT(UpdateNoSong()));
|
||||||
connect(collectionview_, SIGNAL(TotalAlbumCountUpdated_()), 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(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_, SIGNAL(AutomaticCoverSearchDone()), this, SLOT(AutomaticCoverSearchDone()));
|
||||||
connect(album_cover_choice_controller_->search_cover_auto_action(), SIGNAL(triggered()), this, SLOT(SearchCoverAutomatically()));
|
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);
|
SetSong(song);
|
||||||
if (lyrics_.isEmpty() && action_show_lyrics_->isChecked()) {
|
if (lyrics_.isEmpty() && action_show_lyrics_->isChecked()) {
|
||||||
lyrics_fetcher_->Clear();
|
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;
|
if (id != lyrics_id_) return;
|
||||||
lyrics_ = lyrics;
|
lyrics_ = lyrics + "\n\n(Lyrics from " + provider + ")\n";
|
||||||
lyrics_id_ = -1;
|
lyrics_id_ = -1;
|
||||||
if (action_show_lyrics_->isChecked()) {
|
if (action_show_lyrics_->isChecked()) {
|
||||||
ui_->label_play_lyrics->setText(lyrics);
|
ui_->label_play_lyrics->setText(lyrics_);
|
||||||
}
|
}
|
||||||
else ui_->label_play_lyrics->clear();
|
else ui_->label_play_lyrics->clear();
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ class ContextView : public QWidget {
|
|||||||
ContextView(QWidget *parent = nullptr);
|
ContextView(QWidget *parent = nullptr);
|
||||||
~ContextView();
|
~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; }
|
ContextAlbumsView *albums() { return ui_->widget_play_albums; }
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ class ContextView : public QWidget {
|
|||||||
void ActionShowOutput();
|
void ActionShowOutput();
|
||||||
void ActionShowAlbums();
|
void ActionShowAlbums();
|
||||||
void ActionShowLyrics();
|
void ActionShowLyrics();
|
||||||
void UpdateLyrics(quint64 id, const QString lyrics);
|
void UpdateLyrics(const quint64 id, const QString &provider, const QString &lyrics);
|
||||||
void SearchCoverAutomatically();
|
void SearchCoverAutomatically();
|
||||||
void AutomaticCoverSearchDone();
|
void AutomaticCoverSearchDone();
|
||||||
void AlbumArtLoaded(const Song &song, const QString &uri, const QImage &image);
|
void AlbumArtLoaded(const Song &song, const QString &uri, const QImage &image);
|
||||||
|
|||||||
@@ -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()));
|
connect(album_cover_choice_controller_->search_cover_auto_action(), SIGNAL(triggered()), this, SLOT(SearchCoverAutomatically()));
|
||||||
|
|
||||||
ui_->multi_loading_indicator->SetTaskManager(app_->task_manager());
|
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_);
|
ui_->widget_playing->SetApplication(app_, album_cover_choice_controller_);
|
||||||
|
|
||||||
// Initialise the search widget
|
// Initialise the search widget
|
||||||
|
|||||||
@@ -112,7 +112,9 @@ void ChartLyricsProvider::HandleSearchReply(QNetworkReply *reply, quint64 id, co
|
|||||||
result.score = 0.0;
|
result.score = 0.0;
|
||||||
if (result.artist.toLower() == artist.toLower()) result.score += 1.0;
|
if (result.artist.toLower() == artist.toLower()) result.score += 1.0;
|
||||||
if (result.title.toLower() == title.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();
|
result = LyricsSearchResult();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,6 @@
|
|||||||
#include "lyricsfetchersearch.h"
|
#include "lyricsfetchersearch.h"
|
||||||
|
|
||||||
const int LyricsFetcher::kMaxConcurrentRequests = 5;
|
const int LyricsFetcher::kMaxConcurrentRequests = 5;
|
||||||
const QRegExp LyricsFetcher::kRemoveNonAlpha("[^a-zA-Z0-9\\d\\s]");
|
|
||||||
|
|
||||||
LyricsFetcher::LyricsFetcher(LyricsProviders *lyrics_providers, QObject *parent)
|
LyricsFetcher::LyricsFetcher(LyricsProviders *lyrics_providers, QObject *parent)
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
@@ -49,10 +48,8 @@ quint64 LyricsFetcher::Search(const QString &artist, const QString &album, const
|
|||||||
LyricsSearchRequest request;
|
LyricsSearchRequest request;
|
||||||
request.artist = artist;
|
request.artist = artist;
|
||||||
request.album = album;
|
request.album = album;
|
||||||
request.album.remove(kRemoveNonAlpha);
|
|
||||||
request.album.remove(Song::kAlbumRemoveMisc);
|
request.album.remove(Song::kAlbumRemoveMisc);
|
||||||
request.title = title;
|
request.title = title;
|
||||||
request.title.remove(kRemoveNonAlpha);
|
|
||||||
request.title.remove(Song::kTitleRemoveMisc);
|
request.title.remove(Song::kTitleRemoveMisc);
|
||||||
request.id = next_id_++;
|
request.id = next_id_++;
|
||||||
AddRequest(request);
|
AddRequest(request);
|
||||||
@@ -97,15 +94,15 @@ void LyricsFetcher::StartRequests() {
|
|||||||
LyricsFetcherSearch *search = new LyricsFetcherSearch(request, this);
|
LyricsFetcherSearch *search = new LyricsFetcherSearch(request, this);
|
||||||
active_requests_.insert(request.id, search);
|
active_requests_.insert(request.id, search);
|
||||||
|
|
||||||
connect(search, SIGNAL(SearchFinished(quint64, LyricsSearchResults)), SLOT(SingleSearchFinished(quint64, LyricsSearchResults)));
|
connect(search, SIGNAL(SearchFinished(const quint64, LyricsSearchResults)), SLOT(SingleSearchFinished(const quint64, LyricsSearchResults)));
|
||||||
connect(search, SIGNAL(LyricsFetched(quint64, const QString&)), SLOT(SingleLyricsFetched(quint64, const QString&)));
|
connect(search, SIGNAL(LyricsFetched(const quint64, const QString&, const QString&)), SLOT(SingleLyricsFetched(const quint64, const QString&, const QString&)));
|
||||||
|
|
||||||
search->Start(lyrics_providers_);
|
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);
|
LyricsFetcherSearch *search = active_requests_.take(request_id);
|
||||||
if (!search) return;
|
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);
|
LyricsFetcherSearch *search = active_requests_.take(request_id);
|
||||||
if (!search) return;
|
if (!search) return;
|
||||||
search->deleteLater();
|
search->deleteLater();
|
||||||
emit LyricsFetched(request_id, lyrics);
|
emit LyricsFetched(request_id, provider, lyrics);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class LyricsProviders;
|
|||||||
class LyricsFetcherSearch;
|
class LyricsFetcherSearch;
|
||||||
|
|
||||||
struct LyricsSearchRequest {
|
struct LyricsSearchRequest {
|
||||||
quint64 id;
|
quint64 id = -1;
|
||||||
QString artist;
|
QString artist;
|
||||||
QString album;
|
QString album;
|
||||||
QString title;
|
QString title;
|
||||||
@@ -49,7 +49,7 @@ struct LyricsSearchResult {
|
|||||||
QString album;
|
QString album;
|
||||||
QString title;
|
QString title;
|
||||||
QString lyrics;
|
QString lyrics;
|
||||||
float score;
|
float score = 0.0;
|
||||||
};
|
};
|
||||||
Q_DECLARE_METATYPE(LyricsSearchResult);
|
Q_DECLARE_METATYPE(LyricsSearchResult);
|
||||||
|
|
||||||
@@ -64,18 +64,17 @@ class LyricsFetcher : public QObject {
|
|||||||
virtual ~LyricsFetcher() {}
|
virtual ~LyricsFetcher() {}
|
||||||
|
|
||||||
static const int kMaxConcurrentRequests;
|
static const int kMaxConcurrentRequests;
|
||||||
static const QRegExp kRemoveNonAlpha;
|
|
||||||
|
|
||||||
quint64 Search(const QString &artist, const QString &album, const QString &title);
|
quint64 Search(const QString &artist, const QString &album, const QString &title);
|
||||||
void Clear();
|
void Clear();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void LyricsFetched(quint64, const QString &lyrics);
|
void LyricsFetched(const quint64 request_id, const QString &provider, const QString &lyrics);
|
||||||
void SearchFinished(quint64, const LyricsSearchResults &results);
|
void SearchFinished(const quint64 request_id, const LyricsSearchResults &results);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void SingleSearchFinished(quint64, LyricsSearchResults results);
|
void SingleSearchFinished(const quint64 request_id, LyricsSearchResults results);
|
||||||
void SingleLyricsFetched(quint64, const QString &lyrics);
|
void SingleLyricsFetched(const quint64 request_id, const QString &provider, const QString &lyrics);
|
||||||
void StartRequests();
|
void StartRequests();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ void LyricsFetcherSearch::TerminateSearch() {
|
|||||||
void LyricsFetcherSearch::Start(LyricsProviders *lyrics_providers) {
|
void LyricsFetcherSearch::Start(LyricsProviders *lyrics_providers) {
|
||||||
|
|
||||||
for (LyricsProvider *provider : lyrics_providers->List()) {
|
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 int id = lyrics_providers->NextId();
|
||||||
const bool success = provider->StartSearch(request_.artist, request_.album, request_.title, id);
|
const bool success = provider->StartSearch(request_.artist, request_.album, request_.title, id);
|
||||||
if (success) pending_requests_[id] = provider;
|
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;
|
if (!pending_requests_.contains(id)) return;
|
||||||
LyricsProvider *provider = pending_requests_.take(id);
|
LyricsProvider *provider = pending_requests_.take(id);
|
||||||
@@ -99,7 +99,8 @@ void LyricsFetcherSearch::AllProvidersFinished() {
|
|||||||
for (LyricsSearchResult result : results_) {
|
for (LyricsSearchResult result : results_) {
|
||||||
if (result_use.lyrics.isEmpty() || result.score > result_use.score) result_use = result;
|
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_);
|
emit SearchFinished(request_.id, results_);
|
||||||
|
|
||||||
|
|||||||
@@ -44,11 +44,11 @@ class LyricsFetcherSearch : public QObject {
|
|||||||
void Cancel();
|
void Cancel();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void SearchFinished(quint64, const LyricsSearchResults &results);
|
void SearchFinished(const quint64, const LyricsSearchResults &results);
|
||||||
void LyricsFetched(quint64, const QString &lyrics);
|
void LyricsFetched(const quint64, const QString &provider, const QString &lyrics);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void ProviderSearchFinished(quint64 id, const QList<LyricsSearchResult> &results);
|
void ProviderSearchFinished(const quint64 id, const QList<LyricsSearchResult> &results);
|
||||||
void TerminateSearch();
|
void TerminateSearch();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
Reference in New Issue
Block a user