aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2019-10-08 19:17:24 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2019-10-08 19:17:24 +0000
commit1812e98bf5c409c58071b223700ff2296a2d030e (patch)
treea1518622330b39ba3c5109cedd5fdd21c1a539cd
parent6503d9953ae296d176cba5092f5259932c4c09d7 (diff)
downloadqmmp-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.cpp53
-rw-r--r--src/plugins/General/lyrics/lyricsprovider.h6
-rw-r--r--src/plugins/General/lyrics/lyricswindow.cpp130
-rw-r--r--src/plugins/General/lyrics/lyricswindow.h8
-rw-r--r--src/plugins/General/lyrics/ultimatelyricsparser.cpp10
-rw-r--r--src/plugins/General/lyrics/ultimatelyricsparser.h1
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("&lt;", "<");
- 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;