Skip to content

Commit 48afd3d

Browse files
committed
Fix HTML entity decoding in SimpMusic lyrics provider
Decode HTML entities (e.g., ' to ') in lyrics returned from SimpMusic API. This fixes the issue where apostrophes and other special characters were displayed as entity references like She's instead of She's.
1 parent 677a2fc commit 48afd3d

2 files changed

Lines changed: 10 additions & 4 deletions

File tree

simpmusic/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ dependencies {
2727
implementation(libs.ktor.client.okhttp)
2828
implementation(libs.ktor.client.content.negotiation)
2929
implementation(libs.ktor.serialization.json)
30+
implementation(libs.jsoup)
3031

3132
coreLibraryDesugaring(libs.desugaring)
3233
}

simpmusic/src/main/kotlin/com/auramusic/simpmusic/SimpMusicLyrics.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,13 @@ import io.ktor.http.HttpHeaders
1414
import io.ktor.http.HttpStatusCode
1515
import io.ktor.serialization.kotlinx.json.json
1616
import kotlinx.serialization.json.Json
17+
import org.jsoup.Jsoup
1718
import kotlin.math.abs
1819

20+
private fun decodeHtmlEntities(text: String?): String {
21+
return Jsoup.parse(text ?: "").text()
22+
}
23+
1924
object SimpMusicLyrics {
2025
private const val BASE_URL = "https://api-lyrics.simpmusic.org/v1/"
2126

@@ -100,7 +105,7 @@ object SimpMusicLyrics {
100105
?: bestMatch?.plainLyrics?.takeIf { it.isNotBlank() }
101106
?: throw IllegalStateException("Lyrics unavailable")
102107

103-
lyrics
108+
decodeHtmlEntities(lyrics)
104109
}
105110

106111
suspend fun getAllLyrics(
@@ -126,15 +131,15 @@ object SimpMusicLyrics {
126131
// Prioritize richSyncLyrics for word-by-word sync
127132
if (track.richSyncLyrics != null && track.richSyncLyrics.isNotBlank() && durationMatch) {
128133
count++
129-
callback(track.richSyncLyrics)
134+
callback(decodeHtmlEntities(track.richSyncLyrics))
130135
} else if (track.syncedLyrics != null && track.syncedLyrics.isNotBlank() && durationMatch) {
131136
count++
132-
callback(track.syncedLyrics)
137+
callback(decodeHtmlEntities(track.syncedLyrics))
133138
}
134139
if (track.plainLyrics != null && track.plainLyrics.isNotBlank() && durationMatch && plain == 0) {
135140
count++
136141
plain++
137-
callback(track.plainLyrics)
142+
callback(decodeHtmlEntities(track.plainLyrics))
138143
}
139144
}
140145
}

0 commit comments

Comments
 (0)