diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2019-10-10 21:19:27 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2019-10-10 21:19:27 +0000 |
| commit | 94f01fa367af5155ebeb7c9490909de663faedde (patch) | |
| tree | f77a6a37d0ba2a9cd31bfcdfee46410c1ff36cf6 | |
| parent | 1812e98bf5c409c58071b223700ff2296a2d030e (diff) | |
| download | qmmp-94f01fa367af5155ebeb7c9490909de663faedde.tar.gz qmmp-94f01fa367af5155ebeb7c9490909de663faedde.tar.bz2 qmmp-94f01fa367af5155ebeb7c9490909de663faedde.zip | |
partial lyrics extractor implementation
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9088 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/plugins/General/lyrics/lyricsprovider.cpp | 108 | ||||
| -rw-r--r-- | src/plugins/General/lyrics/lyricsprovider.h | 17 | ||||
| -rw-r--r-- | src/plugins/General/lyrics/lyricswindow.cpp | 10 |
3 files changed, 107 insertions, 28 deletions
diff --git a/src/plugins/General/lyrics/lyricsprovider.cpp b/src/plugins/General/lyrics/lyricsprovider.cpp index 6b9e2ab26..58728ec88 100644 --- a/src/plugins/General/lyrics/lyricsprovider.cpp +++ b/src/plugins/General/lyrics/lyricsprovider.cpp @@ -69,22 +69,7 @@ void LyricsProvider::addInvalidIndicator(const QString &indicator) 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) } - }; - + const QMap<QString, QString> replaceMap = generateReplaceMap(track); QMap<QString, QString>::const_iterator it = replaceMap.constBegin(); while(it != replaceMap.constEnd()) { @@ -101,7 +86,7 @@ QString LyricsProvider::getUrl(const TrackInfo &track) const return url; } -QString LyricsProvider::format(const QByteArray &data) const +QString LyricsProvider::format(const QByteArray &data, const TrackInfo &track) const { QTextCodec *codec = QTextCodec::codecForName(m_charset.toLatin1().constData()); if(!codec) @@ -115,6 +100,31 @@ QString LyricsProvider::format(const QByteArray &data) const return QString(); } + const QMap<QString, QString> replaceMap = generateReplaceMap(track); + + for(const Rule &rule : qAsConst(m_extractRules)) + { + Rule tmpRule = rule; + + for(Item &item : tmpRule) + { + QMap<QString, QString>::const_iterator it = replaceMap.constBegin(); + while(it != replaceMap.constEnd()) + { + item.begin.replace(it.key(), it.value()); + item.url.replace(it.key(), it.value()); + it++; + } + } + + content = extract(content, rule); + } + + for(const Rule &rule : qAsConst(m_excludeRules)) + { + content = exclude(content, rule); + } + return content; } @@ -139,3 +149,67 @@ QString LyricsProvider::fixCase(const QString &title) const return out; } + +QMap<QString, QString> LyricsProvider::generateReplaceMap(const TrackInfo &track) const +{ + 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) } + }; + + return replaceMap; +} + +QString LyricsProvider::extract(const QString &content, const Rule &rule) const +{ + QString out = content; + + for(const Item &item : qAsConst(rule)) + { + if(!item.url.isEmpty()) + { + QString url = item.url; + QString id = rule.count() >= 2 ? out.section(rule[1].begin, 1).section(rule[1].end, 0, 0) : QString(); + url.replace("{id}", id); + return url; + } + else if(!item.tag.isEmpty()) + { + out = out.section(item.tag, 1).section(QString("</") + item.tag.mid(1), 0, 0); + } + else + { + out = out.section(item.begin, 1).section(item.end, 0, 0); + } + } + return out; +} + +QString LyricsProvider::exclude(const QString &content, const LyricsProvider::Rule &rule) const +{ + QString out = content; + + for(const Item &item : qAsConst(rule)) + { + if(!item.tag.isEmpty()) + { + out = out.section(item.tag, 0, 0) + out.section(item.tag, 1).section(QString("</") + item.tag.mid(1), 1); + } + else + { + out = out.section(item.begin, 0, 0) + out.section(item.begin, 1).section(item.end, 1); + } + } + return out; +} diff --git a/src/plugins/General/lyrics/lyricsprovider.h b/src/plugins/General/lyrics/lyricsprovider.h index fb4ce522f..3e9e7bf81 100644 --- a/src/plugins/General/lyrics/lyricsprovider.h +++ b/src/plugins/General/lyrics/lyricsprovider.h @@ -3,7 +3,7 @@ #include <QString> #include <QList> -#include <QPair> +#include <QMap> class PlayListTrack; class TrackInfo; @@ -21,15 +21,10 @@ public: void addRule(const QList<QPair<QString, QString> > &args, bool exclude = false); void addInvalidIndicator(const QString &indicator); QString getUrl(const TrackInfo &track) const; - QString format(const QByteArray &data) const; + QString format(const QByteArray &data, const TrackInfo &track) const; const QString &name() const; private: - QString fixCase(const QString &title) const; - - QString m_name, m_title; - QString m_charset = QLatin1String("utf-8"); - QString m_url; struct UrlFormat { @@ -43,6 +38,14 @@ private: typedef QList<Item> Rule; + QString fixCase(const QString &title) const; + QMap<QString, QString> generateReplaceMap(const TrackInfo &track) const; + QString extract(const QString &content, const Rule &rule) const; + QString exclude(const QString &content, const Rule &rule) const; + + QString m_name, m_title; + QString m_charset = QLatin1String("utf-8"); + QString m_url; QList<UrlFormat> m_urlFormats; QList<Rule> m_extractRules; QList<Rule> m_excludeRules; diff --git a/src/plugins/General/lyrics/lyricswindow.cpp b/src/plugins/General/lyrics/lyricswindow.cpp index dd1fb54e0..d2ef7cd59 100644 --- a/src/plugins/General/lyrics/lyricswindow.cpp +++ b/src/plugins/General/lyrics/lyricswindow.cpp @@ -88,11 +88,13 @@ void LyricsWindow::onRequestFinished(QNetworkReply *reply) LyricsProvider *provider = m_parser.provider(name); if(provider) { - QString content = provider->format(data); - qDebug() << content; + QString content = provider->format(data, m_info); + if(!content.isEmpty()) + { + m_ui.textBrowser->append(content); + m_ui.textBrowser->append("<br><hr><br>"); + } } - - qDebug() << "+++++"; } else if(redirectTarget.isValid()) { |
