]*>"), QRegularExpression("<\\/div>"), QRegularExpression("
"), true);
}
if (!lyrics.isEmpty()) {
diff --git a/src/lyrics/lyricsprovider.cpp b/src/lyrics/lyricsprovider.cpp
index 5eb9d5fe0..9ad55726c 100644
--- a/src/lyrics/lyricsprovider.cpp
+++ b/src/lyrics/lyricsprovider.cpp
@@ -30,40 +30,58 @@
LyricsProvider::LyricsProvider(const QString &name, const bool enabled, const bool authentication_required, NetworkAccessManager *network, QObject *parent)
: QObject(parent), network_(network), name_(name), enabled_(enabled), order_(0), authentication_required_(authentication_required) {}
-QString LyricsProvider::ParseLyricsFromHTML(const QString &content, const QRegularExpression &start_tag, const QRegularExpression &end_tag, const QRegularExpression &lyrics_start) {
+QString LyricsProvider::ParseLyricsFromHTML(const QString &content, const QRegularExpression &start_tag, const QRegularExpression &end_tag, const QRegularExpression &lyrics_start, const bool multiple) {
- QRegularExpressionMatch rematch = lyrics_start.match(content);
- if (!rematch.hasMatch()) return QString();
+ QString lyrics;
+ qint64 start_idx = 0;
- const qint64 start_lyrics_tag_idx = rematch.capturedEnd();
-
- // Find the index of the end tag.
- qint64 start_tag_idx = 0;
- qint64 end_tag_idx = 0;
- qint64 idx = start_lyrics_tag_idx;
- int tags = 1;
do {
- QRegularExpressionMatch rematch_start_tag = QRegularExpression(start_tag).match(content, idx);
- start_tag_idx = rematch_start_tag.hasMatch() ? rematch_start_tag.capturedStart() : -1;
- QRegularExpressionMatch rematch_end_tag = QRegularExpression(end_tag).match(content, idx);
- end_tag_idx = rematch_end_tag.hasMatch() ? rematch_end_tag.capturedStart() : -1;
- if (rematch_start_tag.hasMatch() && start_tag_idx <= end_tag_idx) {
- ++tags;
- idx = start_tag_idx + rematch_start_tag.capturedLength();
+
+ QRegularExpressionMatch rematch = lyrics_start.match(content, start_idx);
+ if (!rematch.hasMatch()) break;
+
+ const qint64 start_lyrics_tag_idx = rematch.capturedEnd();
+
+ // Find the index of the end tag.
+ qint64 start_tag_idx = 0;
+ qint64 end_tag_idx = 0;
+ qint64 end_tag_length = 0;
+ qint64 idx = start_lyrics_tag_idx;
+ int tags = 1;
+ do {
+ QRegularExpressionMatch rematch_start_tag = QRegularExpression(start_tag).match(content, idx);
+ start_tag_idx = rematch_start_tag.hasMatch() ? rematch_start_tag.capturedStart() : -1;
+ QRegularExpressionMatch rematch_end_tag = QRegularExpression(end_tag).match(content, idx);
+ if (rematch_end_tag.hasMatch()) {
+ end_tag_idx = rematch_end_tag.capturedStart();
+ end_tag_length = rematch_end_tag.capturedLength();
+ }
+ else {
+ end_tag_idx = -1;
+ end_tag_length = 0;
+ }
+ if (rematch_start_tag.hasMatch() && start_tag_idx <= end_tag_idx) {
+ ++tags;
+ idx = start_tag_idx + rematch_start_tag.capturedLength();
+ }
+ else if (rematch_end_tag.hasMatch()) {
+ --tags;
+ idx = end_tag_idx + rematch_end_tag.capturedLength();
+ }
}
- else if (rematch_end_tag.hasMatch()) {
- --tags;
- idx = end_tag_idx + rematch_end_tag.capturedLength();
+ while (tags > 0 || end_tag_idx >= start_tag_idx);
+
+ start_idx = end_tag_idx + end_tag_length;
+
+ if (end_tag_idx > 0 || start_lyrics_tag_idx < end_tag_idx) {
+ lyrics.append(content.mid(start_lyrics_tag_idx, end_tag_idx - start_lyrics_tag_idx)
+ .replace(QRegularExpression("
]+>"), "\n")
+ .remove(QRegularExpression("<[^>]*>"))
+ .trimmed());
}
+
}
- while (tags > 0 || end_tag_idx >= start_tag_idx);
-
- if (end_tag_idx <= 0 || start_lyrics_tag_idx >= end_tag_idx) return QString();
-
- QString lyrics = content.mid(start_lyrics_tag_idx, end_tag_idx - start_lyrics_tag_idx)
- .replace(QRegularExpression("
]+>"), "\n")
- .remove(QRegularExpression("<[^>]*>"))
- .trimmed();
+ while (start_idx > 0 && multiple);
if (lyrics.length() > 6000 || lyrics.contains("there are no lyrics to", Qt::CaseInsensitive)) {
return QString();
diff --git a/src/lyrics/lyricsprovider.h b/src/lyrics/lyricsprovider.h
index f4446d27d..9acbc4dd6 100644
--- a/src/lyrics/lyricsprovider.h
+++ b/src/lyrics/lyricsprovider.h
@@ -57,7 +57,7 @@ class LyricsProvider : public QObject {
virtual void Error(const QString &error, const QVariant &debug = QVariant()) = 0;
protected:
- QString ParseLyricsFromHTML(const QString &content, const QRegularExpression &start_tag, const QRegularExpression &end_tag, const QRegularExpression &lyrics_start);
+ QString ParseLyricsFromHTML(const QString &content, const QRegularExpression &start_tag, const QRegularExpression &end_tag, const QRegularExpression &lyrics_start, const bool multiple);
signals:
void AuthenticationComplete(bool, QStringList = QStringList());