diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2019-10-08 19:17:24 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2019-10-08 19:17:24 +0000 |
| commit | 1812e98bf5c409c58071b223700ff2296a2d030e (patch) | |
| tree | a1518622330b39ba3c5109cedd5fdd21c1a539cd | |
| parent | 6503d9953ae296d176cba5092f5259932c4c09d7 (diff) | |
| download | qmmp-1812e98bf5c409c58071b223700ff2296a2d030e.tar.gz qmmp-1812e98bf5c409c58071b223700ff2296a2d030e.tar.bz2 qmmp-1812e98bf5c409c58071b223700ff2296a2d030e.zip | |
lyrics: request implementation
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9086 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/plugins/General/lyrics/lyricsprovider.cpp | 53 | ||||
| -rw-r--r-- | src/plugins/General/lyrics/lyricsprovider.h | 6 | ||||
| -rw-r--r-- | src/plugins/General/lyrics/lyricswindow.cpp | 130 | ||||
| -rw-r--r-- | src/plugins/General/lyrics/lyricswindow.h | 8 | ||||
| -rw-r--r-- | src/plugins/General/lyrics/ultimatelyricsparser.cpp | 10 | ||||
| -rw-r--r-- | src/plugins/General/lyrics/ultimatelyricsparser.h | 1 |
6 files changed, 85 insertions, 123 deletions
diff --git a/src/plugins/General/lyrics/lyricsprovider.cpp b/src/plugins/General/lyrics/lyricsprovider.cpp index 697ed0eab..6b9e2ab26 100644 --- a/src/plugins/General/lyrics/lyricsprovider.cpp +++ b/src/plugins/General/lyrics/lyricsprovider.cpp @@ -1,5 +1,6 @@ #include <QtDebug> #include <QRegularExpression> +#include <QTextCodec> #include <qmmp/trackinfo.h> #include "lyricsprovider.h" @@ -20,7 +21,7 @@ void LyricsProvider::setTitle(const QString &title) void LyricsProvider::setCharset(const QString &charset) { - m_charser = charset; + m_charset = charset; } void LyricsProvider::setUrl(const QString &url) @@ -65,23 +66,23 @@ void LyricsProvider::addInvalidIndicator(const QString &indicator) m_invalidIndicators << indicator; } -QString LyricsProvider::getUrl(const TrackInfo *track) const +QString LyricsProvider::getUrl(const TrackInfo &track) const { QString url = m_url; QMap<QString, QString> replaceMap = { - { "{artist}", track->value(Qmmp::ARTIST).toLower() }, - { "{artist2}", track->value(Qmmp::ARTIST).toLower().remove(' ') }, - { "{Artist}", track->value(Qmmp::ARTIST) }, - { "{ARTIST}", track->value(Qmmp::ARTIST).toUpper() }, - { "{a}", track->value(Qmmp::ARTIST).left(1).toLower() }, - { "{album}", track->value(Qmmp::ALBUM).toLower() }, - { "{album2}", track->value(Qmmp::ALBUM).toLower().remove(' ') }, - { "{Album}", track->value(Qmmp::ALBUM) }, - { "{title}", track->value(Qmmp::TITLE).toLower() }, - { "{Title}", track->value(Qmmp::TITLE) }, - { "{Title2}", fixCase(track->value(Qmmp::TITLE)) }, - { "{track}", track->value(Qmmp::TRACK) }, - { "{year}", track->value(Qmmp::YEAR) } + { "{artist}", track.value(Qmmp::ARTIST).toLower() }, + { "{artist2}", track.value(Qmmp::ARTIST).toLower().remove(' ') }, + { "{Artist}", track.value(Qmmp::ARTIST) }, + { "{ARTIST}", track.value(Qmmp::ARTIST).toUpper() }, + { "{a}", track.value(Qmmp::ARTIST).left(1).toLower() }, + { "{album}", track.value(Qmmp::ALBUM).toLower() }, + { "{album2}", track.value(Qmmp::ALBUM).toLower().remove(' ') }, + { "{Album}", track.value(Qmmp::ALBUM) }, + { "{title}", track.value(Qmmp::TITLE).toLower() }, + { "{Title}", track.value(Qmmp::TITLE) }, + { "{Title2}", fixCase(track.value(Qmmp::TITLE)) }, + { "{track}", track.value(Qmmp::TRACK) }, + { "{year}", track.value(Qmmp::YEAR) } }; QMap<QString, QString>::const_iterator it = replaceMap.constBegin(); @@ -100,6 +101,28 @@ QString LyricsProvider::getUrl(const TrackInfo *track) const return url; } +QString LyricsProvider::format(const QByteArray &data) const +{ + QTextCodec *codec = QTextCodec::codecForName(m_charset.toLatin1().constData()); + if(!codec) + codec = QTextCodec::codecForName("UTF-8"); + + QString content = codec->toUnicode(data); + + for(const QString &indicator : qAsConst(m_invalidIndicators)) + { + if(content.contains(indicator)) + return QString(); + } + + return content; +} + +const QString &LyricsProvider::name() const +{ + return m_name; +} + QString LyricsProvider::fixCase(const QString &title) const { QString out; diff --git a/src/plugins/General/lyrics/lyricsprovider.h b/src/plugins/General/lyrics/lyricsprovider.h index 9f0f81f9d..fb4ce522f 100644 --- a/src/plugins/General/lyrics/lyricsprovider.h +++ b/src/plugins/General/lyrics/lyricsprovider.h @@ -20,13 +20,15 @@ public: void addUrlFormat(const QString &replace, const QString &with); void addRule(const QList<QPair<QString, QString> > &args, bool exclude = false); void addInvalidIndicator(const QString &indicator); - QString getUrl(const TrackInfo *track) const; + QString getUrl(const TrackInfo &track) const; + QString format(const QByteArray &data) const; + const QString &name() const; private: QString fixCase(const QString &title) const; QString m_name, m_title; - QString m_charser = QLatin1String("utf-8"); + QString m_charset = QLatin1String("utf-8"); QString m_url; struct UrlFormat diff --git a/src/plugins/General/lyrics/lyricswindow.cpp b/src/plugins/General/lyrics/lyricswindow.cpp index b49951a19..dd1fb54e0 100644 --- a/src/plugins/General/lyrics/lyricswindow.cpp +++ b/src/plugins/General/lyrics/lyricswindow.cpp @@ -18,6 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include <QtDebug> #include <QNetworkAccessManager> #include <QNetworkReply> #include <QNetworkProxy> @@ -37,7 +38,7 @@ LyricsWindow::LyricsWindow(const TrackInfo *info, QWidget *parent) setWindowFlags(Qt::Dialog); setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_QuitOnClose, false); - m_requestReply = nullptr; + m_info = *info; m_cachePath = Qmmp::configDir() + "/lyrics/"; //m_ui.artistLineEdit->setText(info); //m_ui.titleLineEdit->setText(title); @@ -56,7 +57,7 @@ LyricsWindow::LyricsWindow(const TrackInfo *info, QWidget *parent) } m_http->setProxy(proxy); } - connect(m_http, SIGNAL(finished (QNetworkReply *)), SLOT(showText(QNetworkReply *))); + connect(m_http, SIGNAL(finished (QNetworkReply *)), SLOT(onRequestFinished(QNetworkReply *))); if(!m_parser.load(":/ultimate_providers.xml")) qWarning("LyricsWindow: unable to load ultimate_providers.xml"); @@ -67,10 +68,8 @@ LyricsWindow::LyricsWindow(const TrackInfo *info, QWidget *parent) if(!cacheDir.mkpath(cacheDir.absolutePath())) qWarning("LyricsWindow: unable to create cache directory"); } - //if(!loadFromCache()) - // on_searchPushButton_clicked(); - - qDebug() << m_parser.providers().first()->getUrl(info); + if(!loadFromCache()) + on_searchPushButton_clicked(); } @@ -78,119 +77,44 @@ LyricsWindow::~LyricsWindow() { } -void LyricsWindow::showText(QNetworkReply *reply) +void LyricsWindow::onRequestFinished(QNetworkReply *reply) { - m_ui.stateLabel->setText(tr("Done")); - if (reply->error() != QNetworkReply::NoError) - { - m_ui.stateLabel->setText(tr("Error")); - m_ui.textBrowser->setText(reply->errorString()); - m_requestReply = nullptr; - reply->deleteLater(); - return; - } - QString content = QString::fromUtf8(reply->readAll().constData()); - //qDebug("=%s=",qPrintable(content)); + QString name = m_tasks.take(reply); + QVariant redirectTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); - if(m_requestReply == reply) + if(reply->error() == QNetworkReply::NoError && reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200) { - m_requestReply = nullptr; - reply->deleteLater(); - QRegExp artist_regexp("<artist>(.*)</artist>"); - artist_regexp.setMinimal(true); - QRegExp song_regexp("<song>(.*)</song>"); - song_regexp.setMinimal(true); - QRegExp lyrics_regexp("<lyrics>(.*)</lyrics>"); - lyrics_regexp.setMinimal(true); - QRegExp url_regexp("<url>(.*)</url>"); - url_regexp.setMinimal(true); - - if(artist_regexp.indexIn(content) < 0) - { - m_ui.textBrowser->setHtml("<b>" + tr("Error") + "</b>"); - return; - } - - if(artist_regexp.indexIn(content) < 0) - { - m_ui.textBrowser->setHtml("<b>" + tr("Error") + "</b>"); - return; - } - else - m_artist = artist_regexp.cap(1); - - if(song_regexp.indexIn(content) < 0) - { - m_ui.textBrowser->setHtml("<b>" + tr("Error") + "</b>"); - return; - } - else - m_title = song_regexp.cap(1); - - if(lyrics_regexp.indexIn(content) < 0) - { - m_ui.textBrowser->setHtml("<b>" + tr("Error") + "</b>"); - return; - } - else if(lyrics_regexp.cap(1) == "Not found") - { - m_ui.textBrowser->setHtml("<b>" + tr("Not found") + "</b>"); - return; - } - - if(url_regexp.indexIn(content) < 0) + QByteArray data = reply->readAll(); + LyricsProvider *provider = m_parser.provider(name); + if(provider) { - m_ui.textBrowser->setHtml("<b>" + tr("Error") + "</b>"); - return; + QString content = provider->format(data); + qDebug() << content; } - QString temp = url_regexp.cap(1).toLatin1(); - qDebug("LyricsWindow: received url = %s", qPrintable(temp)); - temp = QString("https://lyrics.fandom.com/index.php?title=%1&action=edit").arg(temp.section("/", -1)); - - QUrl url = QUrl::fromEncoded(temp.toLatin1()); - QString referer = url_regexp.cap(1); - qDebug("LyricsWindow: request url = %s", url.toEncoded().constData()); - QNetworkRequest request; - request.setUrl(url); - request.setRawHeader("Referer", referer.toLatin1()); - m_ui.stateLabel->setText(tr("Receiving")); - m_http->get(request); - return; + qDebug() << "+++++"; } - content.replace("<", "<"); - QRegExp lyrics_regexp("<lyrics>(.*)</lyrics>"); - lyrics_regexp.indexIn(content); - - QString text = "<h2>" + m_artist + " - " + m_title + "</h2>"; - QString lyrics = lyrics_regexp.cap(1); - lyrics = lyrics.trimmed(); - lyrics.replace("\n", "<br>"); - if(lyrics.isEmpty()) - m_ui.textBrowser->setHtml("<b>" + tr("Not found") + "</b>"); - else + else if(redirectTarget.isValid()) { - text += lyrics; - m_ui.textBrowser->setHtml(text); - saveToCache(text); - + m_tasks.insert(m_http->get(QNetworkRequest(redirectTarget.toUrl())), name); } + reply->deleteLater(); } void LyricsWindow::on_searchPushButton_clicked() { m_ui.stateLabel->setText(tr("Receiving")); - //qDebug() << m_parser.providers().first()->getUrl() - - /*setWindowTitle(QString(tr("Lyrics: %1 - %2")).arg(m_ui.artistLineEdit->text()) - .arg(m_ui.titleLineEdit->text())); - QNetworkRequest request; - request.setUrl(QUrl("https://lyrics.fandom.com/api.php?action=lyrics&artist=" + - m_ui.artistLineEdit->text()+"&song=" + m_ui.titleLineEdit->text() + "&fmt=xml")); - request.setRawHeader("User-Agent", QString("qmmp/%1").arg(Qmmp::strVersion()).toLatin1()); - m_requestReply = m_http->get(request);*/ + for(LyricsProvider *provider : m_parser.providers()) + { + QString url = provider->getUrl(m_info); + qDebug() << provider->name(); + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("User-Agent", QString("qmmp/%1").arg(Qmmp::strVersion()).toLatin1()); + m_tasks.insert(m_http->get(request), provider->name()); + } } QString LyricsWindow::cacheFilePath() const diff --git a/src/plugins/General/lyrics/lyricswindow.h b/src/plugins/General/lyrics/lyricswindow.h index f9964d3c1..87f3d578c 100644 --- a/src/plugins/General/lyrics/lyricswindow.h +++ b/src/plugins/General/lyrics/lyricswindow.h @@ -21,6 +21,8 @@ #define LYRICSWINDOW_H #include <QWidget> +#include <QHash> +#include <qmmp/trackinfo.h> #include "ultimatelyricsparser.h" #include "ui_lyricswindow.h" @@ -40,7 +42,7 @@ public: ~LyricsWindow(); private slots: - void showText(QNetworkReply *reply); + void onRequestFinished(QNetworkReply *reply); void on_searchPushButton_clicked(); QString cacheFilePath() const; bool loadFromCache(); @@ -49,10 +51,10 @@ private slots: private: Ui::LyricsWindow m_ui; QNetworkAccessManager *m_http; - QNetworkReply *m_requestReply; - QString m_artist, m_title; QString m_cachePath; UltimateLyricsParser m_parser; + TrackInfo m_info; + QHash<QNetworkReply *, QString> m_tasks; }; #endif diff --git a/src/plugins/General/lyrics/ultimatelyricsparser.cpp b/src/plugins/General/lyrics/ultimatelyricsparser.cpp index ca74769f6..fb5281bdb 100644 --- a/src/plugins/General/lyrics/ultimatelyricsparser.cpp +++ b/src/plugins/General/lyrics/ultimatelyricsparser.cpp @@ -108,3 +108,13 @@ const QList<LyricsProvider *> &UltimateLyricsParser::providers() { return m_providers; } + +LyricsProvider *UltimateLyricsParser::provider(const QString &name) const +{ + for(LyricsProvider *provider : qAsConst(m_providers)) + { + if(provider->name() == name) + return provider; + } + return nullptr; +} diff --git a/src/plugins/General/lyrics/ultimatelyricsparser.h b/src/plugins/General/lyrics/ultimatelyricsparser.h index fb7ce1df6..4f2967597 100644 --- a/src/plugins/General/lyrics/ultimatelyricsparser.h +++ b/src/plugins/General/lyrics/ultimatelyricsparser.h @@ -16,6 +16,7 @@ public: bool load(const QString &path); const QString &errorString() const; const QList<LyricsProvider *> &providers(); + LyricsProvider *provider(const QString &name) const; private: QString m_errorString; |
