LMS (not that one, the other one)

r5yk5

Member
Joined
Apr 23, 2024
Messages
86
A couple of things preventing me from using LMS on my 2nd server rather than Asset upnp.

1. Is it possible to start an album or playlist from a control app (symfonium) and have it continue through to the end even if the phone is disconnected from the network during playback?

2. I can get LMS to index custom tags but is there any way to browse them on a client .....

....maybe I should have put Symfonium in the title .....

Anyway I know a few people here use it so I thought I'd ask.
 
1. Is it possible to start an album or playlist from a control app (symfonium) and have it continue through to the end even if the phone is disconnected from the network during playback?
It's much like DLNA/UPnP (not OpenHome) in this regard, in that the control point holds the queue, so playback would stop (after the current or next track).

2. I can get LMS to index custom tags but is there any way to browse them on a client ....
If they're not part of the OpenSubsonic API then I'm afraid not.

I run MinimServer alongside LMS for exactly these reasons.
 
It's much like DLNA/UPnP (not OpenHome) in this regard, in that the control point holds the queue, so playback would stop (after the current or next track).


If they're not part of the OpenSubsonic API then I'm afraid not.

I run MinimServer alongside LMS for exactly these reasons.

Ok, well that's that then. Thanks for your reply. I'll stick with Emby and Asset :)
 
Ok, well that's that then. Thanks for your reply. I'll stick with Emby and Asset :)
Unfortunately the perfect solution doesn't exist yet so it's all about picking the one with the fewest compromises for your use case.
Does Emby allow custom file tags to be passed to Symfonium?
 
Does Emby allow custom file tags to be passed to Symfonium?
It does but, at album level, from Emby directly rather than embedded tags. Using the collections feature or adding tags to the albums in Emby (which you can do in symfonium anyway, I believe.

1000017730.jpg


1000017729.jpg

1000017728.jpg
 
It's much like DLNA/UPnP (not OpenHome) in this regard, in that the control point holds the queue, so playback would stop (after the current or next track).


If they're not part of the OpenSubsonic API then I'm afraid not.

I run MinimServer alongside LMS for exactly these reasons.

I think I've (well not me, all the wonderful people who make this software) cracked it.

Navidrome, (so not LMS or LMS), and the subsonic upnpdcli plugin by @GioF_71


For custom tags, I've mapped the custom tags I use in my files to tags that are exposed in the subsonic api that I don't use (mood and type). This can be done in the navidrome config.
And with the plugin mentioned above, I can start a playlist or choose a random album on the WHA, go for a shower, put my jeans in the washing machine with my phone still in them and the album/playlist will continue to play.

and I can assign playlists on the server to presets on my wiims.

So far this is actually working better with my wiim setup than emby, so we'll see.
 
I think I've (well not me, all the wonderful people who make this software) cracked it.

Navidrome, (so not LMS or LMS), and the subsonic upnpdcli plugin by @GioF_71
I tried that a while ago (with LMS) but it was incredibly slow at the time, and the pagination of results made things worse, though that was on a rpi.
I'll give it another go as the OpenSubsonic servers are some of the best (if not the best) for indexing.
 
I tried that a while ago (with LMS) but it was incredibly slow at the time, and the pagination of results made things worse, though that was on a rpi.
I'll give it another go as the OpenSubsonic servers are some of the best (if not the best) for indexing.
I'm not finding it slow, not instantaneous like Asset but I'm talking milliseconds. This is on a mini pc with a bit more oomph than a rpi though.
 
I tried that a while ago (with LMS) but it was incredibly slow at the time, and the pagination of results made things worse, though that was on a rpi.
I'll give it another go as the OpenSubsonic servers are some of the best (if not the best) for indexing.
can you give it another try? It's important you use an updated version, currently easily accessible using the 'edge' docker images. The current official upmpdcli binary releases and the `latest` images are still on an old version where a lot of optimizations and corrections (mainly done after this issue) are not available.
This specific comment describes the issue you were probably encountering.
 
Last edited:
can you give it another try? It's important you use an updated version, currently easily accessible using the 'edge' docker images.
I tried `giof71/upmpdcli:edge-full-2025-12-09` and most of the menu selections took between 2.5 and 5 seconds, and that's for 20 items which appears to be default - though the documentation states it's 100 (SUBSONIC_ITEMS_PER_PAGE).

I think it has great potential if the response times were improved, though I personally would want the presentation cleaned up a bit e.g. remove album artist from album title under the Albums hierarchy, likewise [Artist, Album Artist] and [16/44k] e.t.c.

Instead of <dc:creator> I think <upnp:artist role="AlbumArtist"> is more compatible, and I think there are issues with albums that have multiple album artists.

Happy to take a deeper look or provide logs if it'll help debug performance. Maybe I'll try it with Navidrome to see if that fares any better.
 
I tried `giof71/upmpdcli:edge-full-2025-12-09` and most of the menu selections took between 2.5 and 5 seconds, and that's for 20 items which appears to be default - though the documentation states it's 100 (SUBSONIC_ITEMS_PER_PAGE).

Hello, about the elapsed times, can you post some logs?
For example my instance of upmpdcli on lightweight music server, for the recently played albums, says in the logs:

Code:
upmpdcli-1  | CMDTALK: subsonic-app.py: '2025-12-11 21:24:22.904249 _load_albums_by_type roundtrip [1.290] api [0.366] proc total: (cnt [21] avg [0.044] min [0.001] max [0.0
64]) proc caching: (cnt [20] avg [0.021] min [0.012] max [0.036])'

In your case, we need to know, of the 2.5 seconds, how long is taken by the api call, and how long for the rest of the processing and caching.
About the numbers, the one in the documentation is just old. I changed it multiple times and the value in the docker project has remained behind. This happens when the docker image project is distinct from the main project, but this is no excuse. I'll fix it asap.

I think it has great potential if the response times were improved, though I personally would want the presentation cleaned up a bit e.g. remove album artist from album title under the Albums hierarchy, likewise [Artist, Album Artist] and [16/44k] e.t.c.

I understand your point. Some things you can already disable like the quality badge (those 16/44k, 24/48k etc). I'll post more details soon on how to do that.
Other aspects like the role of artists cannot currently be disabled, but I will consider making some changes and add documented configurability options.
The objective is to give information to the user, on a protocol that does not support a lot of interactivity, compared to a web interface. We have no context menus (apart when using upplay as the control point).
About multiple authors and roles, see what can be provided for an album with multiple artists, correctly tagged using Picard, and served by Lightweight Music Server:

1765484259403.png

or this other one:

1765484894666.png


Instead of <dc:creator> I think <upnp:artist role="AlbumArtist"> is more compatible, and I think there are issues with albums that have multiple album artists.

Happy to take a deeper look or provide logs if it'll help debug performance. Maybe I'll try it with Navidrome to see if that fares any better.

yes, please, I'm happy to consider ideas.
 
Last edited:
Hello, about the elapsed times, can you post some logs?
For example my instance of upmpdcli on lightweight music server, for the recently played albums, says in the logs:

Code:
upmpdcli-1  | CMDTALK: subsonic-app.py: '2025-12-11 21:24:22.904249 _load_albums_by_type roundtrip [1.290] api [0.366] proc total: (cnt [21] avg [0.044] min [0.001] max [0.0
64]) proc caching: (cnt [20] avg [0.021] min [0.012] max [0.036])'

In your case, we need to know, of the 2.5 seconds, how long is taken by the api call, and how long for the rest of the processing and caching.

I'll try and put some thoughts - and logs - together over the next few days, but to get you started...

My log for recently added:
Code:
CMDTALK: subsonic-app.py: '2025-12-11 20:58:47.359058 _load_albums_by_type roundtrip [3.266] api [0.124] proc total: (cnt [21] avg [0.150] min [0.001] max [0.719]) proc caching: (cnt [20] avg [0.074] min [0.024] max [0.560])'
So it doesn't look like it's the api call.

It looks like releases with multiple album artists are categorised as Appearances, whereas I was expecting them under Release Type: EP:
Code:
CMDTALK: subsonic-app.py: "2025-12-11 21:02:43.704819 Artist [ar-5170] [Jay-Z] release types counters are: [{'album': 15, 'album/compilation': 13, 'album/live': 1, 'ep': 1}]"
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.704878 Artist [ar-5170] [Jay-Z] has [(4)] release types: [None] so we can add by-releasetype album entries!'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.704950 create_artist_albums_entry for [ar-5170] release_types [None] album_entry_name [All Releases [30]]'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.705583 handler_element_artist for [ar-5170] [Jay-Z] -> selected album_id: al-3008'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.705679 Processing release type [album] [Album] ...'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.705744 albums_by_release_type with release_types=[album]'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.706005 create_artist_albums_entry for [ar-5170] release_types [album] album_entry_name [Release Type: Album [4]]'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.706716 Processing release type [album/compilation] [Album / Compilation] ...'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.706789 albums_by_release_type with release_types=[album/compilation]'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.707005 Skipping release type [album/compilation] [Album / Compilation] because there are no albums for artist_id [ar-5170], look in the Appearances'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.707103 Processing release type [album/live] [Album / Live] ...'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.707140 albums_by_release_type with release_types=[album/live]'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.707333 Skipping release type [album/live] [Album / Live] because there are no albums for artist_id [ar-5170], look in the Appearances'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.707396 Processing release type [ep] [Ep] ...'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.707428 albums_by_release_type with release_types=[ep]'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.707589 Skipping release type [ep] [Ep] because there are no albums for artist_id [ar-5170], look in the Appearances'
CMDTALK: subsonic-app.py: '2025-12-11 21:02:43.707633 We add the "Appears on" entry as we have [26] appearances'

I should be able to track down the call responsible for "Skipping release type [ep] [Ep] because there are no albums for artist_id [ar-5170]" in the LMS logs, but I don't have time right now.
 
> It looks like releases with multiple album artists are categorised as Appearances, whereas I was expecting them under Release Type: EP:

that might be because the artist ar-5170 is not the main artist on those album? Can you verify this?
If in doubt you might post the result of api calls to the getAlbum method for the specific albums you find in appearances, unexpectedly. So we can understand what's going on.
 
about the response time... which server are you using?
Api call is fast, but processing suggest that maybe finding some cover art might take some extra time.
If this is the case, subsequent requests for the same contents should become faster.

Maybe enable verbose logging adding

subsonicverboselogging = 1

to an upmpdcli-additional.txt file that should be mounted as /user/config/upmpdcli-additional.txt
e.g.:

- ./upmpdcli-additional.txt:/user/config/upmpdcli-additional.txt:ro

that's because there are quite a lot of options in the subsonic plugin, and only a few have the corresponding env variable in the docker image.
It currently just takes too long for me to implement those variables.
I was thinking to rebuild the docker image run script in python, that would make adding support for all the configuration variables much easier, but also, the script rewrite would take a lot of time and would probably cause regressions, which I'd rather avoid for now.
 
> It looks like releases with multiple album artists are categorised as Appearances, whereas I was expecting them under Release Type: EP:

that might be because the artist ar-5170 is not the main artist on those album? Can you verify this?
The album has two album artists:

JSON:
{
  "subsonic-response": {
    "openSubsonic": true,
    "serverVersion": "v3.73.0",
    "status": "ok",
    "type": "lms",
    "version": "1.16.1",
    "album": {
      "artist": "JAY-Z / Linkin Park",
      "coverArt": "art-7285-1748937841",
      "created": "2014-06-20T00:00:00.000Z",
      "displayArtist": "JAY-Z / Linkin Park",
      "duration": 1278,
      "explicitStatus": "explicit",
      "genre": "Rap",
      "id": "al-3006",
      "isCompilation": false,
      "mediaType": "album",
      "musicBrainzId": "",
      "name": "MTV Ultimate Mash-Ups Presents: Collision Course",
      "playCount": 0,
      "played": "",
      "songCount": 6,
      "sortName": "MTV Ultimate Mash-Ups Presents: Collision Course",
      "version": "",
      "year": 2004,
      "originalReleaseDate": {
        "year": 2004
      },
      "releaseDate": {
        "year": 2004
      },
      "artists": [
        {
          "id": "ar-5170",
          "name": "Jay-Z"
        },
        {
          "id": "ar-8653",
          "name": "Linkin Park"
        }
      ],
      "releaseTypes": [
        "EP"
      ],
      ...


about the response time... which server are you using?
Api call is fast, but processing suggest that maybe finding some cover art might take some extra time.
If this is the case, subsequent requests for the same contents should become faster.
I'm using LMS.

Are you caching all the artwork from LMS before sending the results back to the control point? That might be why it feels relatively slow initially as the display of metadata is usually in parallel with the download of images.

Yes once everything is cached (server and app) it's almost instant.


I'll post my other feedback on your github once I've had a chance to dig a little deeper.
 

Attachments

The album has two album artists:

JSON:
{
  "subsonic-response": {
    "openSubsonic": true,
    "serverVersion": "v3.73.0",
    "status": "ok",
    "type": "lms",
    "version": "1.16.1",
    "album": {
      "artist": "JAY-Z / Linkin Park",
      "coverArt": "art-7285-1748937841",
      "created": "2014-06-20T00:00:00.000Z",
      "displayArtist": "JAY-Z / Linkin Park",
      "duration": 1278,
      "explicitStatus": "explicit",
      "genre": "Rap",
      "id": "al-3006",
      "isCompilation": false,
      "mediaType": "album",
      "musicBrainzId": "",
      "name": "MTV Ultimate Mash-Ups Presents: Collision Course",
      "playCount": 0,
      "played": "",
      "songCount": 6,
      "sortName": "MTV Ultimate Mash-Ups Presents: Collision Course",
      "version": "",
      "year": 2004,
      "originalReleaseDate": {
        "year": 2004
      },
      "releaseDate": {
        "year": 2004
      },
      "artists": [
        {
          "id": "ar-5170",
          "name": "Jay-Z"
        },
        {
          "id": "ar-8653",
          "name": "Linkin Park"
        }
      ],
      "releaseTypes": [
        "EP"
      ],
      ...

Ok, so this happened because the album does not have an "artistid", because there are two main artists.
The algorithm that decides if an album goes in the "Appearances" is based on that missing artistid tag, but I am changing it so that the contents of the "albumartists" and "artists" tags are also considered. So the idea is that an album should go in "Appearances" when the artist appears only as a contributor (performer, composer, etc).

I'm using LMS.

My favorite as well :-)

Are you caching all the artwork from LMS before sending the results back to the control point? That might be why it feels relatively slow initially as the display of metadata is usually in parallel with the download of images.

Yes, it happens in that moment, and generally makes navigation faster after caching is in place as you already noticed. I don't have a lot more options other than upfront caching, at startup, but that will inevitably slow down the upmpdcli startup process.

Yes once everything is cached (server and app) it's almost instant.

Nice to hear that.

I'll post my other feedback on your github once I've had a chance to dig a little deeper.

Cool, will be waiting!
 
@simbun new version 0.8.18 of the subsonic plugin is available with the most recent edge image. It features the change we discussed earlier.
Also the documentation error you found is fixed on the upmpdcli-docker repository.
 
@simbun new version 0.8.18 of the subsonic plugin is available with the most recent edge image. It features the change we discussed earlier.
Looks good.

I've posted my initial observations to the upmpdcli-docker GitHub account.
 
@GioF_71

Hi I have a couple of observations or requests really.

Is it possible to make Songs > Random Songs (List) playable? At the moment you can only play one song at a time.

Within Genres is it possible to have "Random Albums"?

Is it possible to include some or all of the filter categories provided by subsonic (eg Mood) along side Albums, Artists, Song, Genres & Playlists? And if so, can we have "Random Albums" within those categories?

Thank you for making this.
 
@GioF_71

Hi I have a couple of observations or requests really.

Is it possible to make Songs > Random Songs (List) playable? At the moment you can only play one song at a time.

I assume you think you can only play one at a time because of the "Next" button, which leads to a virtually infinite list?
I made the Random display containers in order to allow a "Next" button. Otherwise the page would display terribly on most control points.

But yes, I think I can consider another view (and eventually remove the current) which can display a list of random songs without any next buttons, directly as songs, so the users will be able to play them all.
I just need to verify if most control points, or at least the most common, like BubbleUPnP and mConnect will display a different list every time the "Random Songs (List)" is clicked, without caching, which would cause the user to see the same list every time.
In any case it might be helpful for me to track the requests if you open a discussion or an issue in the upmpdcli-docker repository.
Of course there is the upstream upmpdcli repository where the plugin actually lives, but I'd rather not flood that repository with lots of issues specific to the subsonic plugin. But it's your choice, I'll watch all these repositories for issues I might work on.

Within Genres is it possible to have "Random Albums"?

You mean random albums within the genre? I don't think I can provide really random albums, but when you enter a Genre, you already get the "Albums" entry, which uses getAlbums2 with type=byGenre. It's a paged list so there is a next button after 20 (by default) albums. Those albums are not sorted in a particular way.

Is it possible to include some or all of the filter categories provided by subsonic (eg Mood) along side Albums, Artists, Song, Genres & Playlists?

There is unfortunately no way that I know of to get lists of albums by Moods... not via the subsonic api I mean.
The only option to accomplish features like the one you suggest is by precaching data and querying a local database. Discussed here for example.

And if so, can we have "Random Albums" within those categories?


Thank you for making this.

You're welcome, I am happy you like it. And I am also happy I'm starting to receive feedbacks and good suggestions.
It all started because I wanted to be able to play from Navidrome (then from Lightweight Music Server) to my MPD/upmpdcli based renderers!
 
Back
Top