-
-
Notifications
You must be signed in to change notification settings - Fork 115
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
.lrc
lyrics?
#371
Comments
are there any subsonic clients that support lyrics? |
I use iSub and it has a lyrics window, that's how I found out about it. I wish Subsonic had a time-synced lyrics thing as well |
I am planning on adding it to Supersonic in the near- to mid-future. Feishin (Sonixd's successor) supports lyrics but not the Subsonic API yet, I think it's waiting for OpenSubsonic |
Just seeing this, Symfonium support them too, We need to extend OpenSubsonic API to support songId to getLyrics to have this properly added to Subsonic. Will make the API request later. |
This OpenSubsonic thing is cool! I wonder if I could ask about timed lyrics there. |
The lyrics are returned as is, so if they have the offsets they will be synced on the clients if they support it. |
Perhaps the timings like |
I could go through each of my |
OpenSubsonic RfC for lyrics API improvements is up opensubsonic/open-subsonic-api#60 |
This is amazing news! |
I see the lyrics API has the label "In production" which means this can be worked on now? |
Is there a |
https://pkg.go.dev/github.com/env25/mpdlrc/lrc could work! |
while I'm in no way proficient with go, I might just know enough to attempt an implementation on this. Maybe someone more experienced can provide me with some rough pointers where one should start with this, what things to consider? Then I could try getting my hands dirty. |
We're in the same boat. I have no experience with Go, I'm better with Rust. I do know that you should use a |
While I assume that the main contributers would already be on top of the situation, let me just quickly sum up some relevant links for this lyrics spec for the curious:
gonic already implements the getLyrics endpoint, which should be able to share unsynced lyrics. But looking at the code, I don't think it does anything. Just looking at the simple Most importantly, Navidrome seems to already have lyrics support and is also written in go: https://github.com/navidrome/navidrome/blob/master/model/lyrics.go. They don't use any parsing libraries, rather opting for simple regex (which imho is completely sufficient). This may be rather straightforward to apply to gonic. |
would we also support lyrics in audio metadata? and what would the priority be over .lrc files? also, is there any software such as beets or picard that can find and embed/store lyrics? |
If its possible to implement reading from the tag with audiotags, I see no harm in supporting both sources. The OSS spec supports multiple lyrics per individual song, so no problem there. Edit: TagLib appears to support both Prioritization seems more like a client issue to me; if a client supports the For lyric clients, I found this from a quick search: https://lrclib.net/. Note the API and the available client. Or if you want something in go, maybe this is to your liking: https://github.com/fashni/MxLRC-Go. On another note, does the server need to broadcast the fact that a song has lyrics? I checked my gonic HTTP logs when playing music with Synfonium, and it does not by default query any lyrics endpoints. I see that navidrome has lyrics as part of their song object, but cannot figure out if they broadcast it to clients automatically. And the OSS spec doesn't specify the contents of songs at all. |
So I take it we will have to fix the existing stubbed |
|
FYI lyrics support is being built in Supersonic now and will be in the next release - so it would be a good time for someone to pick up this ticket and do a PR :) |
I've decided to work on both lyric endpoints, currently only fetching from the .lrc files. Does anyone know of any clients that support the new endpoint for synced lyrics? Tempo on android has it on a WIP branch I presume, otherwise it's a debug build.
I tried it out, make sure to also support the synced lyrics. |
Symfonium fully support it. |
I've been contributing to Spezifisch's hard fork of stmp (called stmps), and synced lyrics is something I'd like to add support for. I've also submitted PRs to gonic, and one thing I've learned is that the core team needs to be on-board with the implementation approach, or else there's a bunch of back-and-forth and code rewrites. Can we get a ruling here about what the core developers would like to see in an implementation? For example, whether or not there are database changes for on-disk assets causes a lot of churn, and @TorchedSammy -- there's a chicken/egg issue here. I haven't added lyrics support to stmps yet because neither of the servers I use (gonic, mainly, but I also test stmps changes against Navidrome) support synced lyrics. Would you like to coordinate on development of this? What I'd need is an endpoint that returns (one or more) synced lyrics from an So, for your implementation:
If I can get these answers, I'll do my stmps work based on your branch and send you information so you can see it work in a client. I do recommend getting sign-off on your design from the gonic team first; of course I'm mainly concerned about API changes, but I'd also feel better if I knew there's a good chance of the patch being merged into mainline. |
I've noticed the Subsonic protocol supports lyrics. I have a couple
.lrc
files lying around that I'd like to add to gonic to complete my music collection, especially with certain streaming services considering paywalling lyrics. My suggestion is to have the.lrc
file have the same name as the audio file, minus its extension and plus.lrc
. An example using the folder structure in the README:The
.lrc
format is super easy to deal with, it's just plaintext with timestamps. There are some optional tags at the beginning of lyric files, check out the Wikipedia page for a good list.The text was updated successfully, but these errors were encountered: