From 94f01fa367af5155ebeb7c9490909de663faedde Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Thu, 10 Oct 2019 21:19:27 +0000 Subject: partial lyrics extractor implementation git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9088 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/General/lyrics/lyricsprovider.cpp | 108 ++++++++++++++++++++++---- src/plugins/General/lyrics/lyricsprovider.h | 17 ++-- src/plugins/General/lyrics/lyricswindow.cpp | 10 ++- 3 files changed, 107 insertions(+), 28 deletions(-) (limited to 'src/plugins/General') 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 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 replaceMap = generateReplaceMap(track); QMap::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 replaceMap = generateReplaceMap(track); + + for(const Rule &rule : qAsConst(m_extractRules)) + { + Rule tmpRule = rule; + + for(Item &item : tmpRule) + { + QMap::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 LyricsProvider::generateReplaceMap(const TrackInfo &track) const +{ + QMap 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(" #include -#include +#include class PlayListTrack; class TrackInfo; @@ -21,15 +21,10 @@ public: void addRule(const QList > &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 Rule; + QString fixCase(const QString &title) const; + QMap 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 m_urlFormats; QList m_extractRules; QList 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("


"); + } } - - qDebug() << "+++++"; } else if(redirectTarget.isValid()) { -- cgit v1.2.3-13-gbd6f