diff --git a/README.md b/README.md
index 974e1cfcb..373b7a655 100644
--- a/README.md
+++ b/README.md
@@ -52,7 +52,7 @@ Funding developers is a way to contribute to open source projects you appreciate
* Edit tags on audio files
* Fetch tags from MusicBrainz
* Album cover art from [Last.fm](https://www.last.fm/), [Musicbrainz](https://musicbrainz.org/), [Discogs](https://www.discogs.com/), [Musixmatch](https://www.musixmatch.com/), [Deezer](https://www.deezer.com/), [Tidal](https://www.tidal.com/), [Qobuz](https://www.qobuz.com/) and [Spotify](https://www.spotify.com/)
- * Song lyrics from [Genius](https://genius.com/), [Musixmatch](https://www.musixmatch.com/), [ChartLyrics](http://www.chartlyrics.com/), [lyrics.ovh](https://lyrics.ovh/), [lololyrics.com](https://www.lololyrics.com/), [songlyrics.com](https://www.songlyrics.com/) and [azlyrics.com](https://www.azlyrics.com/)
+ * Song lyrics from [Genius](https://genius.com/), [Musixmatch](https://www.musixmatch.com/), [ChartLyrics](http://www.chartlyrics.com/), [lyrics.ovh](https://lyrics.ovh/), [lololyrics.com](https://www.lololyrics.com/), [songlyrics.com](https://www.songlyrics.com/), [azlyrics.com](https://www.azlyrics.com/), [elyrics.net](https://www.elyrics.net/) and [lyricsmode.com](https://www.lyricsmode.com/)
* Support for multiple backends
* Audio analyzer
* Audio equalizer
diff --git a/debian/control.in b/debian/control.in
index e84dabc19..e38eb70a4 100644
--- a/debian/control.in
+++ b/debian/control.in
@@ -52,7 +52,7 @@ Description: music player and music collection organizer
- Edit tags on audio files
- Automatically retrieve tags from MusicBrainz
- Album cover art from Last.fm, Musicbrainz, Discogs, Musixmatch, Deezer, Tidal, Qobuz and Spotify
- - Song lyrics from Genius, Musixmatch, ChartLyrics, lyrics.ovh, lololyrics.com, songlyrics.com and azlyrics.com
+ - Song lyrics from Genius, Musixmatch, ChartLyrics, lyrics.ovh, lololyrics.com, songlyrics.com, azlyrics.com, elyrics.net and lyricsmode.com
- Audio analyzer
- Audio equalizer
- Transfer music to mass-storage USB players, MTP compatible devices and iPod Nano/Classic
diff --git a/dist/unix/org.strawberrymusicplayer.strawberry.appdata.xml b/dist/unix/org.strawberrymusicplayer.strawberry.appdata.xml
index 810073531..32e3d1bc8 100644
--- a/dist/unix/org.strawberrymusicplayer.strawberry.appdata.xml
+++ b/dist/unix/org.strawberrymusicplayer.strawberry.appdata.xml
@@ -29,7 +29,7 @@
Edit tags on audio files
Automatically retrieve tags from MusicBrainz
Album cover art from Last.fm, Musicbrainz, Discogs, Musixmatch, Deezer, Tidal, Qobuz and Spotify
- Song lyrics from Genius, Musixmatch, ChartLyrics, lyrics.ovh, lololyrics.com, songlyrics.com and azlyrics.com
+ Song lyrics from Genius, Musixmatch, ChartLyrics, lyrics.ovh, lololyrics.com, songlyrics.com, azlyrics.com, elyrics.net and lyricsmode.com
Support for multiple backends
Audio analyzer and equalizer
Transfer music to mass-storage USB players, MTP compatible devices and iPod Nano/Classic
diff --git a/dist/unix/strawberry.spec.in b/dist/unix/strawberry.spec.in
index 9a6aa7fe6..9ef5c29a5 100644
--- a/dist/unix/strawberry.spec.in
+++ b/dist/unix/strawberry.spec.in
@@ -118,7 +118,7 @@ Features:
- Edit tags on audio files
- Automatically retrieve tags from MusicBrainz
- Album cover art from Last.fm, Musicbrainz, Discogs, Musixmatch, Deezer, Tidal, Qobuz and Spotify
- - Song lyrics from Genius, Musixmatch, ChartLyrics, lyrics.ovh, lololyrics.com, songlyrics.com and azlyrics.com
+ - Song lyrics from Genius, Musixmatch, ChartLyrics, lyrics.ovh, lololyrics.com, songlyrics.com, azlyrics.com, elyrics.net and lyricsmode.com
- Support for multiple backends
- Audio analyzer
- Audio equalizer
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f1719f7d6..447968411 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -186,6 +186,8 @@ set(SOURCES
lyrics/chartlyricsprovider.cpp
lyrics/songlyricscomlyricsprovider.cpp
lyrics/azlyricscomlyricsprovider.cpp
+ lyrics/elyricsnetlyricsprovider.cpp
+ lyrics/lyricsmodecomlyricsprovider.cpp
providers/musixmatchprovider.cpp
@@ -426,6 +428,8 @@ set(HEADERS
lyrics/chartlyricsprovider.h
lyrics/songlyricscomlyricsprovider.h
lyrics/azlyricscomlyricsprovider.h
+ lyrics/elyricsnetlyricsprovider.h
+ lyrics/lyricsmodecomlyricsprovider.h
settings/settingsdialog.h
settings/settingspage.h
diff --git a/src/core/application.cpp b/src/core/application.cpp
index a481d213f..84c39b5a3 100644
--- a/src/core/application.cpp
+++ b/src/core/application.cpp
@@ -66,6 +66,8 @@
#include "lyrics/chartlyricsprovider.h"
#include "lyrics/songlyricscomlyricsprovider.h"
#include "lyrics/azlyricscomlyricsprovider.h"
+#include "lyrics/elyricsnetlyricsprovider.h"
+#include "lyrics/lyricsmodecomlyricsprovider.h"
#include "scrobbler/audioscrobbler.h"
#include "scrobbler/lastfmscrobbler.h"
@@ -166,6 +168,8 @@ class ApplicationImpl {
lyrics_providers->AddProvider(new ChartLyricsProvider(app->network()));
lyrics_providers->AddProvider(new SongLyricsComLyricsProvider(app->network()));
lyrics_providers->AddProvider(new AzLyricsComLyricsProvider(app->network()));
+ lyrics_providers->AddProvider(new ElyricsNetLyricsProvider(app->network()));
+ lyrics_providers->AddProvider(new LyricsModeComLyricsProvider(app->network()));
lyrics_providers->ReloadSettings();
return lyrics_providers;
}),
diff --git a/src/lyrics/elyricsnetlyricsprovider.cpp b/src/lyrics/elyricsnetlyricsprovider.cpp
new file mode 100644
index 000000000..8e10b80c9
--- /dev/null
+++ b/src/lyrics/elyricsnetlyricsprovider.cpp
@@ -0,0 +1,54 @@
+/*
+ * Strawberry Music Player
+ * Copyright 2023, Jonas Kvinge
+ *
+ * Strawberry is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Strawberry is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Strawberry. If not, see .
+ *
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "core/shared_ptr.h"
+#include "core/networkaccessmanager.h"
+#include "lyricssearchrequest.h"
+#include "elyricsnetlyricsprovider.h"
+
+const char ElyricsNetLyricsProvider::kUrl[] = "https://www.elyrics.net/read/";
+const char ElyricsNetLyricsProvider::kStartTag[] = "]*>";
+const char ElyricsNetLyricsProvider::kEndTag[] = "<\\/div>";
+const char ElyricsNetLyricsProvider::kLyricsStart[] = "
";
+
+ElyricsNetLyricsProvider::ElyricsNetLyricsProvider(SharedPtr
network, QObject *parent)
+ : HtmlLyricsProvider("elyrics.net", true, kStartTag, kEndTag, kLyricsStart, false, network, parent) {}
+
+QUrl ElyricsNetLyricsProvider::Url(const LyricsSearchRequest &request) {
+
+ return QUrl(kUrl + request.artist[0].toLower() + "/" + StringFixup(request.artist) + "-lyrics/" + StringFixup(request.title) + "-lyrics.html");
+
+}
+
+QString ElyricsNetLyricsProvider::StringFixup(QString string) {
+
+ return string
+ .replace(' ', '-')
+ .replace(QRegularExpression("[^\\w0-9_-]", QRegularExpression::UseUnicodePropertiesOption), "_")
+ .simplified()
+ .toLower();
+
+}
diff --git a/src/lyrics/elyricsnetlyricsprovider.h b/src/lyrics/elyricsnetlyricsprovider.h
new file mode 100644
index 000000000..8a5ee0a92
--- /dev/null
+++ b/src/lyrics/elyricsnetlyricsprovider.h
@@ -0,0 +1,54 @@
+/*
+ * Strawberry Music Player
+ * Copyright 2023, Jonas Kvinge
+ *
+ * Strawberry is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Strawberry is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Strawberry. If not, see .
+ *
+ */
+
+#ifndef ELYRICSNETLYRICSPROVIDER_H
+#define ELYRICSNETLYRICSPROVIDER_H
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "core/shared_ptr.h"
+#include "core/networkaccessmanager.h"
+#include "htmllyricsprovider.h"
+#include "lyricssearchrequest.h"
+
+class ElyricsNetLyricsProvider : public HtmlLyricsProvider {
+ Q_OBJECT
+
+ public:
+ explicit ElyricsNetLyricsProvider(SharedPtr network, QObject *parent = nullptr);
+
+ protected:
+ QUrl Url(const LyricsSearchRequest &request) override;
+
+ private:
+ QString StringFixup(QString string);
+
+ private:
+ static const char kUrl[];
+ static const char kStartTag[];
+ static const char kEndTag[];
+ static const char kLyricsStart[];
+};
+
+#endif // ELYRICSNETLYRICSPROVIDER_H
diff --git a/src/lyrics/htmllyricsprovider.cpp b/src/lyrics/htmllyricsprovider.cpp
index 3c677da97..fb9f3bfab 100644
--- a/src/lyrics/htmllyricsprovider.cpp
+++ b/src/lyrics/htmllyricsprovider.cpp
@@ -158,7 +158,9 @@ QString HtmlLyricsProvider::ParseLyricsFromHTML(const QString &content, const QR
lyrics.append(content.mid(start_lyrics_idx, end_lyrics_idx - start_lyrics_idx)
.remove('\r')
.remove('\n')
- .remove(QRegularExpression(""))
+ .remove(QRegularExpression("]*>[^<]*"))
+ .remove(QRegularExpression(""))
+ .remove(QRegularExpression("]*>×
"))
.replace(QRegularExpression("
]*>"), "\n")
.remove(QRegularExpression("<[^>]*>"))
.trimmed());
diff --git a/src/lyrics/lyricsmodecomlyricsprovider.cpp b/src/lyrics/lyricsmodecomlyricsprovider.cpp
new file mode 100644
index 000000000..d4a2fcbab
--- /dev/null
+++ b/src/lyrics/lyricsmodecomlyricsprovider.cpp
@@ -0,0 +1,54 @@
+/*
+ * Strawberry Music Player
+ * Copyright 2023, Jonas Kvinge
+ *
+ * Strawberry is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Strawberry is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Strawberry. If not, see .
+ *
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "core/shared_ptr.h"
+#include "core/networkaccessmanager.h"
+#include "lyricssearchrequest.h"
+#include "lyricsmodecomlyricsprovider.h"
+
+const char LyricsModeComLyricsProvider::kUrl[] = "https://www.lyricsmode.com/lyrics/";
+const char LyricsModeComLyricsProvider::kStartTag[] = "]*>";
+const char LyricsModeComLyricsProvider::kEndTag[] = "<\\/div>";
+const char LyricsModeComLyricsProvider::kLyricsStart[] = "
]*>";
+
+LyricsModeComLyricsProvider::LyricsModeComLyricsProvider(SharedPtr network, QObject *parent)
+ : HtmlLyricsProvider("lyricsmode.com", true, kStartTag, kEndTag, kLyricsStart, false, network, parent) {}
+
+QUrl LyricsModeComLyricsProvider::Url(const LyricsSearchRequest &request) {
+
+ return QUrl(kUrl + request.artist[0].toLower() + "/" + StringFixup(request.artist) + "/" + StringFixup(request.title) + ".html");
+
+}
+
+QString LyricsModeComLyricsProvider::StringFixup(QString string) {
+
+ return string
+ .replace(' ', '_')
+ .remove(QRegularExpression("[^\\w0-9_-]", QRegularExpression::UseUnicodePropertiesOption))
+ .simplified()
+ .toLower();
+
+}
diff --git a/src/lyrics/lyricsmodecomlyricsprovider.h b/src/lyrics/lyricsmodecomlyricsprovider.h
new file mode 100644
index 000000000..55021d823
--- /dev/null
+++ b/src/lyrics/lyricsmodecomlyricsprovider.h
@@ -0,0 +1,54 @@
+/*
+ * Strawberry Music Player
+ * Copyright 2023, Jonas Kvinge
+ *
+ * Strawberry is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Strawberry is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Strawberry. If not, see .
+ *
+ */
+
+#ifndef LYRICSMODECOMLYRICSPROVIDER_H
+#define LYRICSMODECOMLYRICSPROVIDER_H
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "core/shared_ptr.h"
+#include "core/networkaccessmanager.h"
+#include "htmllyricsprovider.h"
+#include "lyricssearchrequest.h"
+
+class LyricsModeComLyricsProvider : public HtmlLyricsProvider {
+ Q_OBJECT
+
+ public:
+ explicit LyricsModeComLyricsProvider(SharedPtr network, QObject *parent = nullptr);
+
+ protected:
+ QUrl Url(const LyricsSearchRequest &request) override;
+
+ private:
+ QString StringFixup(QString string);
+
+ private:
+ static const char kUrl[];
+ static const char kStartTag[];
+ static const char kEndTag[];
+ static const char kLyricsStart[];
+};
+
+#endif // LYRICSMODECOMLYRICSPROVIDER_H