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 /src/plugins/General/lyrics/lyricsprovider.cpp | |
| 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
Diffstat (limited to 'src/plugins/General/lyrics/lyricsprovider.cpp')
| -rw-r--r-- | src/plugins/General/lyrics/lyricsprovider.cpp | 108 |
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; +} |
