TTML lyrics via subsonic (navidrome)

Issue description:

I’m trying to use TTML lyrics files with Navidrome. I placed a TTML file next to the corresponding audio file in the music library, but the lyrics did not appear. I also tried renaming the file extension to .txt or .lrc, but then the lyrics aren’t parsed correctly and Symfonium displays them with xml tags (the screenshot is taken when using .txt). Is it even possible to use ttml lyrics when serving music via Navidrome?

Logs:

Upload description: ttml navidrome

Additional information:

Reproduction steps:

Media provider:

Subsonic

Screenshots:

If you rename to .txt or .lrc Navidrome will parse as lrc since they do not support ttml.

There’s nothing that can be fixed on Symfonium side, it’s Navidrome that does the parsing.

{
  "subsonic-response": {
    "status": "ok",
    "version": "1.16.1",
    "type": "navidrome",
    "serverVersion": "0.59.0 (cc3cca60)",
    "openSubsonic": true,
    "lyricsList": {
      "structuredLyrics": [
        {
          "displayArtist": "Cheryl Cole",
          "displayTitle": "Fight For This Love",
          "lang": "xxx",
          "line": [
            {
              "value": "<tt>"
            },
            {
              "value": "Cheryl Cole"
            },
            {
              "value": "Andre Merritt"
            },
            {
              "value": "Steve Kipner"
            },
            {
              "value": "Wayne Wilkins"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>T3oo much of anything can make you sick</p>"
            },
            {
              "value": "<p>Even the good can be a curse, curse</p>"
            },
            {
              "value": "<p>Makes it hard to know which road to go down</p>"
            },
            {
              "value": "<p>Knowing too much can get you hurt</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>Is it better, is it worse?</p>"
            },
            {
              "value": "<p>Always sitting in reverse</p>"
            },
            {
              "value": "<p>It's just like we're going backwards (Backwards)</p>"
            },
            {
              "value": "<p>I know where I want this to go</p>"
            },
            {
              "value": "<p>Driving fast, but let's go slow</p>"
            },
            {
              "value": "<p>What I don't wanna do is crash, no</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>Just know that you're not in this thing alone</p>"
            },
            {
              "value": "<p>There's always a place in me that you can call home</p>"
            },
            {
              "value": "<p>Whenever you feel like we're growing apart</p>"
            },
            {
              "value": "<p>Let's just go back, back, back, back, back to the start, oh (Back, back)</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>Anything that's worth having</p>"
            },
            {
              "value": "<p>Sure enough worth fighting for</p>"
            },
            {
              "value": "<p>Quitting's out of the question</p>"
            },
            {
              "value": "<p>When it gets tough, gotta fight some more, oh</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>We gotta fight, fight, fight, fight, fight for this love</p>"
            },
            {
              "value": "<p>We gotta fight, fight, fight, fight, fight for this love</p>"
            },
            {
              "value": "<p>We gotta fight, fight, fight, fight, fight for this love</p>"
            },
            {
              "value": "<p>If it's worth having, it's worth fighting for, oh</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>Now every day ain't gon' be no picnic</p>"
            },
            {
              "value": "<p>Love ain't no walk in the park</p>"
            },
            {
              "value": "<p>All you can do is make the best of it now</p>"
            },
            {
              "value": "<p>Can't be afraid of the dark</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>Just know that you're not in this thing alone</p>"
            },
            {
              "value": "<p>There's always a place in me that you can call home</p>"
            },
            {
              "value": "<p>Whenever you feel like we're growing apart</p>"
            },
            {
              "value": "<p>Let's just go back, back, back, back, back to the start, oh (Back, back)</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>Anything that's worth having</p>"
            },
            {
              "value": "<p>Is sure enough worth fighting for</p>"
            },
            {
              "value": "<p>Quitting's out of the question</p>"
            },
            {
              "value": "<p>When it gets tough, gotta fight some more, oh</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>We gotta fight, fight, fight, fight, fight for this love</p>"
            },
            {
              "value": "<p>We gotta fight, fight, fight, fight, fight for this love</p>"
            },
            {
              "value": "<p>We gotta fight, fight, fight, fight, fight for this love</p>"
            },
            {
              "value": "<p>If it's worth having, it's worth fighting for, oh</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>I don't know where we're heading</p>"
            },
            {
              "value": "<p>I'm willing and ready to go</p>"
            },
            {
              "value": "<p>We've been driving so fast</p>"
            },
            {
              "value": "<p>We just need to slow down and just roll, oh</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>Anything that's worth having</p>"
            },
            {
              "value": "<p>Is sure enough worth fighting for</p>"
            },
            {
              "value": "<p>Quitting's out of the question</p>"
            },
            {
              "value": "<p>When it gets tough, gotta fight some more, oh</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>We gotta fight, fight, fight, fight, fight for this love (Fight, hey)</p>"
            },
            {
              "value": "<p>We gotta fight, fight, fight, fight, fight for this love (No matter how hard it gets)</p>"
            },
            {
              "value": "<p>We gotta fight, fight, fight, fight, fight for this love (We gotta fight, yeah)</p>"
            },
            {
              "value": "<p>If it's worth having, it's worth fighting for</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "<div>"
            },
            {
              "value": "<p>We gotta fight, fight, fight, fight, fight for this love (Fight, fight)</p>"
            },
            {
              "value": "<p>We gotta fight, fight, fight, fight, fight for this love (Fight, hey)</p>"
            },
            {
              "value": "<p>We gotta fight, fight, fight, fight, fight for this love</p>"
            },
            {
              "value": "<p>If it's worth having, it's worth fighting for, oh</p>"
            },
            {
              "value": "</div>"
            },
            {
              "value": "</tt>"
            }
          ],
          "synced": false
        }
      ]
    }
  }
}