From 27ee6e764323553437ce5dd2a81fa45ad8e4a90c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9lestin=20Matte?= Date: Wed, 6 Mar 2024 23:16:29 +0100 Subject: [PATCH] EditTagDialog: Add button to fetch lyrics Co-Authored-By: Jonas Kvinge --- src/context/contextview.cpp | 7 +++++- src/dialogs/edittagdialog.cpp | 34 +++++++++++++++++++++++++++++- src/dialogs/edittagdialog.h | 6 ++++++ src/dialogs/edittagdialog.ui | 8 +++++++ src/lyrics/lyricsfetchersearch.cpp | 3 +++ 5 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/context/contextview.cpp b/src/context/contextview.cpp index affd945cc..7a946b4ac 100644 --- a/src/context/contextview.cpp +++ b/src/context/contextview.cpp @@ -631,7 +631,12 @@ void ContextView::UpdateLyrics(const quint64 id, const QString &provider, const if (static_cast(id) != lyrics_id_) return; - lyrics_ = lyrics + "\n\n(Lyrics from " + provider + ")\n"; + if (lyrics.isEmpty()) { + lyrics_ = "No lyrics found.\n"; + } + else { + lyrics_ = lyrics + "\n\n(Lyrics from " + provider + ")\n"; + } lyrics_id_ = -1; if (action_show_lyrics_->isChecked() && !lyrics_.isEmpty()) { diff --git a/src/dialogs/edittagdialog.cpp b/src/dialogs/edittagdialog.cpp index 7b08545a7..60c242354 100644 --- a/src/dialogs/edittagdialog.cpp +++ b/src/dialogs/edittagdialog.cpp @@ -87,6 +87,7 @@ # include "musicbrainz/tagfetcher.h" # include "trackselectiondialog.h" #endif +#include "lyrics/lyricsfetcher.h" #include "covermanager/albumcoverchoicecontroller.h" #include "covermanager/albumcoverloader.h" #include "covermanager/albumcoverloaderoptions.h" @@ -112,13 +113,15 @@ EditTagDialog::EditTagDialog(Application *app, QWidget *parent) tag_fetcher_(new TagFetcher(app->network(), this)), results_dialog_(new TrackSelectionDialog(this)), #endif + lyrics_fetcher_(new LyricsFetcher(app->lyrics_providers(), this)), image_no_cover_thumbnail_(ImageUtils::GenerateNoCoverImage(QSize(128, 128), devicePixelRatioF())), loading_(false), ignore_edits_(false), summary_cover_art_id_(-1), tags_cover_art_id_(-1), cover_art_is_set_(false), - save_tag_pending_(0) { + save_tag_pending_(0), + lyrics_id_(-1) { QObject::connect(&*app_->album_cover_loader(), &AlbumCoverLoader::AlbumCoverLoaded, this, &EditTagDialog::AlbumCoverLoaded); @@ -128,6 +131,7 @@ EditTagDialog::EditTagDialog(Application *app, QWidget *parent) QObject::connect(results_dialog_, &TrackSelectionDialog::SongChosen, this, &EditTagDialog::FetchTagSongChosen); QObject::connect(results_dialog_, &TrackSelectionDialog::finished, tag_fetcher_, &TagFetcher::Cancel); #endif + QObject::connect(lyrics_fetcher_, &LyricsFetcher::LyricsFetched, this, &EditTagDialog::UpdateLyrics); album_cover_choice_controller_->Init(app_); @@ -193,6 +197,7 @@ EditTagDialog::EditTagDialog(Application *app, QWidget *parent) #ifdef HAVE_MUSICBRAINZ QObject::connect(ui_->fetch_tag, &QPushButton::clicked, this, &EditTagDialog::FetchTag); #endif + QObject::connect(ui_->fetch_lyrics, &QPushButton::clicked, this, &EditTagDialog::FetchLyrics); // Set up the album cover menu cover_menu_ = new QMenu(this); @@ -606,6 +611,8 @@ void EditTagDialog::SelectionChanged() { // Set the editable fields UpdateUI(indexes); + lyrics_id_ = -1; + // If we're editing multiple songs then we have to disable certain tabs const bool multiple = indexes.count() > 1; ui_->tab_widget->setTabEnabled(ui_->tab_widget->indexOf(ui_->tab_summary), !multiple); @@ -1411,6 +1418,31 @@ void EditTagDialog::FetchTagSongChosen(const Song &original_song, const Song &ne } +void EditTagDialog::FetchLyrics() { + + if (ui_->song_list->selectionModel()->selectedIndexes().isEmpty()) return; + const Song &song = data_[ui_->song_list->selectionModel()->selectedIndexes().first().row()].current_; + lyrics_fetcher_->Clear(); + ui_->lyrics->setPlainText(tr("loading...")); + lyrics_id_ = static_cast(lyrics_fetcher_->Search(song.effective_albumartist(), song.artist(), song.album(), song.title())); + +} + +void EditTagDialog::UpdateLyrics(const quint64 id, const QString &provider, const QString &lyrics) { + + Q_UNUSED(provider); + + if (static_cast(id) != lyrics_id_) return; + lyrics_id_ = -1; + if (lyrics.isEmpty()) { + ui_->lyrics->setPlainText(tr("Not found.")); + } + else { + ui_->lyrics->setPlainText(lyrics); + } + +} + void EditTagDialog::SongSaveTagsComplete(TagReaderReply *reply, const QString &filename, Song song, const UpdateCoverAction cover_action) { --save_tag_pending_; diff --git a/src/dialogs/edittagdialog.h b/src/dialogs/edittagdialog.h index 66d4a1135..93be4c888 100644 --- a/src/dialogs/edittagdialog.h +++ b/src/dialogs/edittagdialog.h @@ -57,6 +57,7 @@ class Ui_EditTagDialog; #ifdef HAVE_MUSICBRAINZ class TrackSelectionDialog; class TagFetcher; +class LyricsFetcher; #endif class EditTagDialog : public QDialog { @@ -120,6 +121,8 @@ class EditTagDialog : public QDialog { void SongRated(const float rating); void FetchTag(); void FetchTagSongChosen(const Song &original_song, const Song &new_metadata); + void FetchLyrics(); + void UpdateLyrics(const quint64 id, const QString &provider, const QString &lyrics); void AlbumCoverLoaded(const quint64 id, const AlbumCoverLoaderResult &cover_result); @@ -185,6 +188,7 @@ class EditTagDialog : public QDialog { TagFetcher *tag_fetcher_; TrackSelectionDialog *results_dialog_; #endif + LyricsFetcher *lyrics_fetcher_; const QImage image_no_cover_thumbnail_; @@ -210,6 +214,8 @@ class EditTagDialog : public QDialog { QMap collection_songs_; AlbumCoverLoaderOptions::Types cover_types_; + + qint64 lyrics_id_; }; #endif // EDITTAGDIALOG_H diff --git a/src/dialogs/edittagdialog.ui b/src/dialogs/edittagdialog.ui index eaf5283c5..e1e4da0a7 100644 --- a/src/dialogs/edittagdialog.ui +++ b/src/dialogs/edittagdialog.ui @@ -1131,6 +1131,13 @@ + + + + Complete lyrics automatically + + + @@ -1213,6 +1220,7 @@ fetch_tag comment lyrics + fetch_lyrics diff --git a/src/lyrics/lyricsfetchersearch.cpp b/src/lyrics/lyricsfetchersearch.cpp index 290e74a57..0aa4e7a40 100644 --- a/src/lyrics/lyricsfetchersearch.cpp +++ b/src/lyrics/lyricsfetchersearch.cpp @@ -134,6 +134,9 @@ void LyricsFetcherSearch::AllProvidersFinished() { qLog(Debug) << "Using lyrics from" << results_.last().provider << "for" << request_.artist << request_.title << "with score" << results_.last().score; emit LyricsFetched(id_, results_.last().provider, results_.last().lyrics); } + else { + emit LyricsFetched(id_, QString(), QString()); + } emit SearchFinished(id_, results_);