aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2019-10-10 21:19:27 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2019-10-10 21:19:27 +0000
commit94f01fa367af5155ebeb7c9490909de663faedde (patch)
treef77a6a37d0ba2a9cd31bfcdfee46410c1ff36cf6
parent1812e98bf5c409c58071b223700ff2296a2d030e (diff)
downloadqmmp-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.cpp108
-rw-r--r--src/plugins/General/lyrics/lyricsprovider.h17
-rw-r--r--src/plugins/General/lyrics/lyricswindow.cpp10
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())
{