Allow to query makeitpersonal.co for lyrics
This commit is contained in:
parent
a94f2e3675
commit
015dc06c17
|
@ -67,6 +67,7 @@ set(WIDGETS_HEADER_FILES
|
|||
gui/tageditorwidget.h
|
||||
dbquery/dbquery.h
|
||||
dbquery/musicbrainz.h
|
||||
dbquery/makeitpersonal.h
|
||||
dbquery/lyricswikia.h
|
||||
gui/dbquerywidget.h
|
||||
misc/networkaccessmanager.h
|
||||
|
@ -96,6 +97,7 @@ set(WIDGETS_SRC_FILES
|
|||
gui/tageditorwidget.cpp
|
||||
dbquery/dbquery.cpp
|
||||
dbquery/musicbrainz.cpp
|
||||
dbquery/makeitpersonal.cpp
|
||||
dbquery/lyricswikia.cpp
|
||||
gui/dbquerywidget.cpp
|
||||
misc/networkaccessmanager.cpp
|
||||
|
|
|
@ -196,6 +196,7 @@ void restore()
|
|||
v.dbQuery.fields.restore(settings, QStringLiteral("fields"));
|
||||
v.dbQuery.musicBrainzUrl = settings.value(QStringLiteral("musicbrainzurl")).toString();
|
||||
v.dbQuery.lyricsWikiaUrl = settings.value(QStringLiteral("lyricwikiurl")).toString();
|
||||
v.dbQuery.makeItPersonalUrl = settings.value(QStringLiteral("makeitpersonalurl")).toString();
|
||||
v.dbQuery.coverArtArchiveUrl = settings.value(QStringLiteral("coverartarchiveurl")).toString();
|
||||
settings.endGroup();
|
||||
|
||||
|
@ -284,6 +285,7 @@ void save()
|
|||
v.dbQuery.fields.save(settings, QStringLiteral("fields"));
|
||||
settings.setValue(QStringLiteral("musicbrainzurl"), v.dbQuery.musicBrainzUrl);
|
||||
settings.setValue(QStringLiteral("lyricwikiurl"), v.dbQuery.lyricsWikiaUrl);
|
||||
settings.setValue(QStringLiteral("makeitpersonalurl"), v.dbQuery.makeItPersonalUrl);
|
||||
settings.setValue(QStringLiteral("coverartarchiveurl"), v.dbQuery.coverArtArchiveUrl);
|
||||
settings.endGroup();
|
||||
|
||||
|
|
|
@ -90,6 +90,7 @@ struct DbQuery {
|
|||
QString musicBrainzUrl;
|
||||
QString coverArtArchiveUrl;
|
||||
QString lyricsWikiaUrl;
|
||||
QString makeItPersonalUrl;
|
||||
};
|
||||
|
||||
struct RenamingUtility {
|
||||
|
|
|
@ -159,6 +159,7 @@ template <class Function> inline void HttpResultsModel::addReply(QNetworkReply *
|
|||
QueryResultsModel *queryMusicBrainz(SongDescription &&songDescription);
|
||||
QueryResultsModel *queryLyricsWikia(SongDescription &&songDescription);
|
||||
QNetworkReply *queryCoverArtArchive(const QString &albumId);
|
||||
QueryResultsModel *queryMakeItPersonal(SongDescription &&songDescription);
|
||||
|
||||
} // namespace QtGui
|
||||
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
#include "./makeitpersonal.h"
|
||||
|
||||
#include "../application/settings.h"
|
||||
#include "../misc/networkaccessmanager.h"
|
||||
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkRequest>
|
||||
#include <QStringBuilder>
|
||||
#include <QUrlQuery>
|
||||
|
||||
#include <functional>
|
||||
|
||||
using namespace std;
|
||||
using namespace std::placeholders;
|
||||
using namespace Utility;
|
||||
|
||||
namespace QtGui {
|
||||
|
||||
static const QString defaultMakeItPersonalUrl(QStringLiteral("https://makeitpersonal.co"));
|
||||
|
||||
QUrl makeItPersonalApiUrl()
|
||||
{
|
||||
const auto &makeItPersonalUrl = Settings::values().dbQuery.makeItPersonalUrl;
|
||||
return QUrl((makeItPersonalUrl.isEmpty() ? defaultMakeItPersonalUrl : makeItPersonalUrl) + QStringLiteral("/lyrics"));
|
||||
}
|
||||
|
||||
MakeItPersonalResultsModel::MakeItPersonalResultsModel(SongDescription &&initialSongDescription, QNetworkReply *reply)
|
||||
: HttpResultsModel(move(initialSongDescription), reply)
|
||||
{
|
||||
}
|
||||
|
||||
bool MakeItPersonalResultsModel::fetchLyrics(const QModelIndex &index)
|
||||
{
|
||||
Q_UNUSED(index)
|
||||
return true; // lyrics don't need to be fetched separately here
|
||||
}
|
||||
|
||||
void MakeItPersonalResultsModel::parseInitialResults(const QByteArray &data)
|
||||
{
|
||||
// prepare parsing LyricsWikia meta data
|
||||
beginResetModel();
|
||||
m_results.clear();
|
||||
|
||||
SongDescription desc = m_initialDescription;
|
||||
desc.songId = m_initialDescription.artist + m_initialDescription.title;
|
||||
desc.artistId = m_initialDescription.artist;
|
||||
desc.lyrics = QString::fromUtf8(data).trimmed();
|
||||
if (desc.lyrics != QLatin1String("Sorry, We don't have lyrics for this song yet.")) {
|
||||
m_results << move(desc);
|
||||
}
|
||||
|
||||
// promote changes
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
QueryResultsModel *queryMakeItPersonal(SongDescription &&songDescription)
|
||||
{
|
||||
// compose URL
|
||||
QUrlQuery query;
|
||||
query.addQueryItem(QStringLiteral("artist"), songDescription.artist);
|
||||
query.addQueryItem(QStringLiteral("title"), songDescription.title);
|
||||
QUrl url(makeItPersonalApiUrl());
|
||||
url.setQuery(query);
|
||||
|
||||
// make request
|
||||
return new MakeItPersonalResultsModel(move(songDescription), Utility::networkAccessManager().get(QNetworkRequest(url)));
|
||||
}
|
||||
|
||||
} // namespace QtGui
|
|
@ -0,0 +1,23 @@
|
|||
#ifndef QTGUI_MAKE_IT_PERSONAL_H
|
||||
#define QTGUI_MAKE_IT_PERSONAL_H
|
||||
|
||||
#include "./dbquery.h"
|
||||
|
||||
#include <map>
|
||||
|
||||
namespace QtGui {
|
||||
|
||||
class MakeItPersonalResultsModel : public HttpResultsModel {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MakeItPersonalResultsModel(SongDescription &&initialSongDescription, QNetworkReply *reply);
|
||||
bool fetchLyrics(const QModelIndex &index) override;
|
||||
|
||||
protected:
|
||||
void parseInitialResults(const QByteArray &data) override;
|
||||
};
|
||||
|
||||
} // namespace QtGui
|
||||
|
||||
#endif // QTGUI_MAKE_IT_PERSONAL_H
|
|
@ -84,6 +84,10 @@ DbQueryWidget::DbQueryWidget(TagEditorWidget *tagEditorWidget, QWidget *parent)
|
|||
m_searchLyricsWikiaAction->setIcon(searchIcon);
|
||||
m_searchLyricsWikiaAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_L));
|
||||
connect(m_searchLyricsWikiaAction, &QAction::triggered, this, &DbQueryWidget::searchLyricsWikia);
|
||||
m_searchMakeItPersonalAction = m_menu->addAction(tr("Query makeitpersonal"));
|
||||
m_searchMakeItPersonalAction->setIcon(searchIcon);
|
||||
m_searchMakeItPersonalAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_K));
|
||||
connect(m_searchMakeItPersonalAction, &QAction::triggered, this, &DbQueryWidget::searchMakeItPersonal);
|
||||
m_menu->addSeparator();
|
||||
m_insertPresentDataAction = m_menu->addAction(tr("Use present data as search criteria"));
|
||||
m_insertPresentDataAction->setIcon(QIcon::fromTheme(QStringLiteral("edit-copy")));
|
||||
|
@ -117,7 +121,11 @@ void DbQueryWidget::insertSearchTermsFromTagEdit(TagEdit *tagEdit, bool songSpec
|
|||
}
|
||||
|
||||
// set album and artist
|
||||
m_ui->albumLineEdit->setText(tagValueToQString(tagEdit->value(KnownField::Album)));
|
||||
if (m_lastSearchAction == m_searchMakeItPersonalAction) {
|
||||
m_ui->titleLineEdit->setText(tagValueToQString(tagEdit->value(KnownField::Title)));
|
||||
} else {
|
||||
m_ui->albumLineEdit->setText(tagValueToQString(tagEdit->value(KnownField::Album)));
|
||||
}
|
||||
m_ui->artistLineEdit->setText(tagValueToQString(tagEdit->value(KnownField::Artist)));
|
||||
|
||||
if (!songSpecific) {
|
||||
|
@ -187,6 +195,30 @@ void DbQueryWidget::searchLyricsWikia()
|
|||
useQueryResults(queryLyricsWikia(currentSongDescription()));
|
||||
}
|
||||
|
||||
void DbQueryWidget::searchMakeItPersonal()
|
||||
{
|
||||
m_lastSearchAction = m_searchMakeItPersonalAction;
|
||||
|
||||
// check whether enough search terms are supplied
|
||||
if (m_ui->artistLineEdit->text().isEmpty() || m_ui->titleLineEdit->text().isEmpty()) {
|
||||
m_ui->notificationLabel->setNotificationType(NotificationType::Critical);
|
||||
m_ui->notificationLabel->setText(tr("Insufficient search criteria supplied - artist and title are mandatory"));
|
||||
return;
|
||||
}
|
||||
|
||||
// delete current model
|
||||
m_ui->resultsTreeView->setModel(nullptr);
|
||||
delete m_model;
|
||||
|
||||
// show status
|
||||
m_ui->notificationLabel->setNotificationType(NotificationType::Progress);
|
||||
m_ui->notificationLabel->setText(tr("Retrieving lyrics from makeitpersonal ..."));
|
||||
setStatus(false);
|
||||
|
||||
// do actual query
|
||||
useQueryResults(queryMakeItPersonal(currentSongDescription()));
|
||||
}
|
||||
|
||||
void DbQueryWidget::abortSearch()
|
||||
{
|
||||
if (!m_model) {
|
||||
|
|
|
@ -38,6 +38,7 @@ public:
|
|||
public slots:
|
||||
void searchMusicBrainz();
|
||||
void searchLyricsWikia();
|
||||
void searchMakeItPersonal();
|
||||
void abortSearch();
|
||||
void applySelectedResults();
|
||||
void applySpecifiedResults(const QModelIndex &modelIndex);
|
||||
|
@ -78,6 +79,7 @@ private:
|
|||
QAction *m_insertPresentDataAction;
|
||||
QAction *m_searchMusicBrainzAction;
|
||||
QAction *m_searchLyricsWikiaAction;
|
||||
QAction *m_searchMakeItPersonalAction;
|
||||
QAction *m_lastSearchAction;
|
||||
QPoint m_contextMenuPos;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue