App version
Production
Issue description
When connecting to a Navidrome server using it’s new Jellyfin API, Symfonium finishes the sync as “successful,” but with 0 tracks.
Looking at the logs, it gets all the albums and artists, but doesn’t make any attempt to get the tracks within the albums. This looks to be a bug on Symfonium’s end because the Navidrome logs only show it receiving 3 HTTP requests, presumably one for artists, albums, and playlists.
Device type
Phone
Media provider
Jellyfin
Steps to reproduce
Connect to Navidrome server using Jellyfin API
Run a sync
I searched existing issues first
on
I understand that logs are mandatory
on
Log upload name / description
aProfessionalFrog-jellyfin-navidrome
Tolriq
September 30, 2026, 1:50pm
2
So let me resume Symfonium works with Jellyfin real servers, works with Navidrome real API.
Fails with Navidrome mimicking Jellyfin API with beta stuff but somehow that would be Symfonium issue ?
Sounds very logical indeed …
master ← zapisanchez:jellyfin-user-root-items/6199
opened 06:49AM - 24 Sep 26 UTC
### Description
Symfonium's Jellyfin sync against Navidrome finishes immediatel… y with "0 tracks in 0 seconds". The last request it makes is an unfiltered `GET /Users/{id}/Items?UserId={id}`: no `ParentId`, no `Recursive`, no filters.
Real Jellyfin answers that request with the **user's libraries** (the children of the user root folder: `CollectionFolder` items with `CollectionType: "music"`). The logic is in `ItemsController.GetItems`:
```csharp
// At the user root an unfiltered, non-recursive request is a plain listing of the user's libraries
if ((recursive.HasValue && recursive.Value) || ids.Length != 0 || item is not UserRootFolder || query.HasFilters)
{
result = folder.GetItems(query);
...
}
else
{
var itemsArray = folder.GetChildren(user, true);
...
}
```
Navidrome defaulted to albums there (`parseTypes` with no `IncludeItemTypes`), so it returned the whole album list. Symfonium looked for a music library in that response, found none and synced nothing.
With this change, `/Items` with no `ParentId`, no `Recursive=true` and no filters returns the same views as `/UserViews`. "No filters" mirrors Jellyfin's `InternalItemsQuery.HasFilters`, limited to the params Navidrome parses: `IncludeItemTypes`, `Ids`, `SearchTerm`, artist, genre, album and studio ids, `Years`, and the favorite/played filters. Any of those, or `Recursive=true`, keeps the current behaviour.
`getUserViews`' library listing moved into a `userViews(ctx)` helper so both endpoints share it.
The issue also mentions the 404 on `Library/VirtualFolders`. That endpoint is admin-only in Jellyfin, so Symfonium already has to cope with it failing for regular users. I left it out of this PR.
### Related Issues
Fixes #6199
### Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Documentation update
- [ ] Refactor
- [ ] Other (please describe):
### Checklist
- [x] My code follows the project’s coding style
- [x] I have tested the changes locally
- [x] I have added or updated documentation as needed
- [x] I have added tests that prove my fix/feature works (or explain why not)
- [x] All existing and new tests pass
### How to Test
- `go test -tags netgo,sqlite_fts5 ./server/jellyfin/...` (unit + e2e)
- Manually: `GET /jellyfin/Users/{id}/Items?UserId={id}` now returns one `CollectionFolder` per accessible library. `GET /jellyfin/Users/{id}/Items?Recursive=true&IncludeItemTypes=MusicAlbum` still returns albums.
New tests in `items_test.go` cover:
- the unfiltered root query returning only the user's accessible libraries
- an unknown `IncludeItemTypes` being treated as absent, as Jellyfin's binder does
- `Recursive`, `IncludeItemTypes`, `SearchTerm`, `Filters` and `Years` still returning items
### Additional Notes
I haven't been able to verify this against Symfonium itself. It would be good if the reporter could confirm with a test build.
Locally, one test in `core/artwork` fails (`fromURL ... localhost`, a DNS lookup of `localhost`). It fails on `master` too and is unrelated to this change.
My apologies, I assumed that it was Symfonium’s job to query album content after receiving the list of albums. I wasn’t familiar with how the Jellyfin API handles syncing.