aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/General/lyrics/lyricsprovider.cpp
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 /src/plugins/General/lyrics/lyricsprovider.cpp
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
Diffstat (limited to 'src/plugins/General/lyrics/lyricsprovider.cpp')
-rw-r--r--src/plugins/General/lyrics/lyricsprovider.cpp108
1 files changed, 91 insertions, 17 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;
+}