OpenSubsonic Compatibility Matrix
Last updated: January 13, 2026
Applies to: Melodee 1.8.0+
Compliance Status: Melodee implements OpenSubsonic API response structures that conform to published XSD schema specifications.
- 311 tests validate response schema structure for all implementable JSON endpoints
- 50+ response elements defined with full attribute validation
- 8 error codes (10-80) validated with proper format
- All tests pass (100% pass rate)
- Binary content endpoints return correct content types
This document provides a detailed compatibility matrix for Melodee’s OpenSubsonic API implementation. Use this guide to verify which endpoints and features work with your preferred Subsonic/OpenSubsonic client.
Quick Reference
| Status | Meaning |
|---|---|
| ✅ Supported | Endpoint is implemented and returns expected response structure |
| ⚠️ Partial | Endpoint works but may have limitations or need manual verification |
| ❌ Not Supported | Endpoint is not implemented |
| 🔄 Planned | On roadmap but not yet implemented |
What “✅ Supported” Means
An endpoint marked as “✅ Supported” means:
- The endpoint is implemented in the codebase
- For endpoints with “Schema Validation” tests: Response structure is verified against XSD
- For endpoints with “Manual” tests: Functionality has been verified by a person
It does NOT guarantee:
- Full protocol compliance in all edge cases
- Error handling matches specification
- Performance meets expectations
- All client features work correctly
Core Endpoints
System
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
ping |
✅ Supported | Test connectivity and authentication | Schema Validation |
getLicense |
✅ Supported | Returns valid license data | Schema Validation |
getOpenSubsonicExtensions |
✅ Supported | Lists supported OpenSubsonic extensions | Schema Validation |
Browsing
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
getMusicFolders |
✅ Supported | Returns storage libraries | Schema Validation |
getIndexes |
✅ Supported | Artist index (A-Z listing) | Schema Validation |
getArtists |
✅ Supported | Full artist listing with pagination | Manual |
getArtist |
✅ Supported | Artist details with albums | Schema Validation |
getAlbum |
✅ Supported | Album details with songs | Schema Validation |
getSong |
✅ Supported | Song metadata | Schema Validation |
getGenres |
✅ Supported | Genre listing with counts | Schema Validation |
getMusicDirectory |
✅ Supported | Directory contents | Schema Validation |
Album/Song Lists
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
getAlbumList |
✅ Supported | Albums by various criteria | Schema Validation |
getAlbumList2 |
✅ Supported | Albums (ID3 tag based) | Schema Validation |
getRandomSongs |
✅ Supported | Random song selection | Schema Validation |
getSongsByGenre |
✅ Supported | Songs filtered by genre | Schema Validation |
getNowPlaying |
✅ Supported | Currently playing songs | Schema Validation |
getStarred |
✅ Supported | Starred items (original format) | Schema Validation |
getStarred2 |
✅ Supported | Starred items (ID3 based) | Schema Validation |
Searching
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
search2 |
✅ Supported | Search artists, albums, songs | Manual |
search3 |
✅ Supported | Search (ID3 tag based) | Manual |
Playlists
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
getPlaylists |
✅ Supported | User playlists listing | Schema Validation |
getPlaylist |
✅ Supported | Playlist details with songs | Schema Validation |
createPlaylist |
✅ Supported | Create new playlist | Schema Validation |
updatePlaylist |
✅ Supported | Update playlist (name, songs) | Manual |
deletePlaylist |
✅ Supported | Delete playlist | Manual |
Media Retrieval
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
stream |
✅ Supported | Stream audio with transcoding | Manual |
download |
✅ Supported | Download audio file | Manual |
getCoverArt |
✅ Supported | Album/artist artwork | Manual |
getLyrics |
✅ Supported | Song lyrics | Schema Validation |
getAvatar |
✅ Supported | User avatar images | Manual |
User Data
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
star |
✅ Supported | Star an item | Manual |
unstar |
✅ Supported | Unstar an item | Manual |
setRating |
✅ Supported | Set item rating (1-5) | Manual |
scrobble |
✅ Supported | Submit scrobble to Last.fm | Manual |
getUser |
✅ Supported | Get user information | Schema Validation |
Media Annotation
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
getSimilarSongs |
✅ Supported | Similar songs | Schema Validation |
getSimilarSongs2 |
✅ Supported | Similar songs (ID3 based) | Schema Validation |
getTopSongs |
✅ Supported | Top songs for artist | Schema Validation |
Bookmarks
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
getBookmarks |
✅ Supported | User bookmarks | Schema Validation |
createBookmark |
✅ Supported | Create bookmark | Manual |
deleteBookmark |
✅ Supported | Delete bookmark | Manual |
getPlayQueue |
✅ Supported | Get play queue | Schema Validation |
savePlayQueue |
✅ Supported | Save play queue | Manual |
Media Library Scanning
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
startScan |
✅ Supported | Start library scan | Manual |
getScanStatus |
✅ Supported | Get scan status | Schema Validation |
Jukebox
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
jukeboxControl |
✅ Supported | Server-side playback control | Manual |
Podcasts
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
getPodcasts |
✅ Supported | Podcast channels listing | Manual |
getNewestPodcasts |
✅ Supported | Newest episodes | Manual |
refreshPodcasts |
✅ Supported | Refresh podcast feeds | Manual |
createPodcastChannel |
✅ Supported | Subscribe to channel | Manual |
deletePodcastChannel |
✅ Supported | Unsubscribe from channel | Manual |
deletePodcastEpisode |
✅ Supported | Delete episode | Manual |
downloadPodcastEpisode |
✅ Supported | Download episode | Manual |
streamPodcastEpisode |
✅ Supported | Stream podcast episode | Manual |
Shares
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
getShares |
✅ Supported | User shares listing | Schema Validation |
createShare |
✅ Supported | Create share | Manual |
updateShare |
✅ Supported | Update share | Manual |
deleteShare |
✅ Supported | Delete share | Manual |
Internet Radio
| Endpoint | Status | Notes | Test Coverage |
|---|---|---|---|
getInternetRadioStations |
✅ Supported | List radio stations | Schema Validation |
createInternetRadioStation |
✅ Supported | Add radio station | Manual |
updateInternetRadioStation |
✅ Supported | Update radio station | Manual |
deleteInternetRadioStation |
✅ Supported | Delete radio station | Manual |
OpenSubsonic Extensions
Melodee supports the following OpenSubsonic extensions:
| Extension | Status | Notes |
|---|---|---|
apiKeyAuthentication |
✅ Supported | Authenticate using API keys |
formPost |
✅ Supported | Form-encoded POST requests |
songLyrics |
✅ Supported | Enhanced lyrics with timing |
transcodeOffset |
✅ Supported | Start transcoding from offset |
melodeeExtensions |
✅ Supported | Melodee-specific extensions |
Known Limitations and Differences
Compared to other popular Subsonic servers (Navidrome, Airsonic):
| Feature | Behavior | Notes |
|---|---|---|
| Schema Validation | ✅ Supported | 97 tests validate response structure for all endpoints |
| Streaming | ✅ Implemented | Not yet verified with automated tests |
| Transcoding | ✅ Implemented | Not yet verified with automated tests |
| Authentication | ✅ Implemented | Token-based, legacy deprecated |
| User avatars | ✅ Implemented | Uses Gravatar fallback |
| Chat messages | ❌ Not Implemented | Deprecated in OpenSubsonic spec |
| Video streaming | Not applicable | Music-only server |
| Video podcasts | Not supported | Audio podcasts only |
| Multiple music folders | ✅ Supported | Full support via libraries |
| Album artist tag | ✅ Supported | Uses AlbumArtist when present |
| Compilation albums | ✅ Supported | Full support via isCompilation flag |
| ReplayGain | ⚠️ Partial | Metadata-based, not file-based |
Client Behavior Notes
Symfonium (Android)
| Feature | Status | Notes |
|---|---|---|
| Login | ✅ Works | Token auth works correctly |
| Browse | ✅ Works | Full browsing support |
| Stream | ✅ Works | All formats supported |
| Playlists | ✅ Works | Create/update/delete works |
| Search | ✅ Works | Full search support |
| Favorites | ✅ Works | Stars and ratings work |
| Scrobble | ✅ Works | Last.fm scrobbling works |
| Offline | ✅ Works | Full offline support |
| Chromecast | ✅ Works | DLNA also supported |
Feishin (Desktop)
| Feature | Status | Notes |
|---|---|---|
| Login | ✅ Works | Token auth works correctly |
| Browse | ✅ Works | Full browsing support |
| Stream | ✅ Works | All formats supported |
| Playlists | ✅ Works | Create/update/delete works |
| Search | ✅ Works | Full search support |
| Favorites | ✅ Works | Stars and ratings work |
| Scrobble | ✅ Works | Last.fm scrobbling works |
| Lyrics | ✅ Works | Embedded lyrics display |
| Theme | ✅ Works | Multiple themes supported |
DSub / Ultrasonic (Android)
| Feature | Status | Notes |
|---|---|---|
| Login | ✅ Works | Token auth works correctly |
| Browse | ✅ Works | Full browsing support |
| Stream | ✅ Works | All formats supported |
| Playlists | ✅ Works | Create/update/delete works |
| Search | ✅ Works | Full search support |
| Favorites | ✅ Works | Stars and ratings work |
| Scrobble | ✅ Works | Last.fm scrobbling works |
| Offline | ✅ Works | Full offline support |
| Gapless | ✅ Works | Gapless playback works |
Supersonic (Desktop)
| Feature | Status | Notes |
|---|---|---|
| Login | ✅ Works | Token auth works correctly |
| Browse | ✅ Works | Full browsing support |
| Stream | ✅ Works | All formats supported |
| Playlists | ✅ Works | Create/update/delete works |
| Search | ✅ Works | Full search support |
| Favorites | ✅ Works | Stars and ratings work |
| Scrobble | ✅ Works | Last.fm scrobbling works |
| Caching | ✅ Works | Offline caching supported |
Client Verification
| Client | Platform | Melodee Version | Date Tested | Verified By |
|---|---|---|---|---|
| Symfonium | Android | 1.8.0 | 2026-01-12 | Community |
| Feishin | Desktop (Linux) | 1.8.0 | 2026-01-12 | Community |
| DSub | Android | 1.8.0 | 2026-01-12 | Community |
| Ultrasonic | Android | 1.8.0 | 2026-01-12 | Community |
| Supersonic | Desktop (Linux) | 1.8.0 | 2026-01-12 | Community |
Testing
Automated Tests
Melodee includes an automated test suite that validates OpenSubsonic API compliance. Run tests with:
# Run schema validation tests
dotnet test tests/Melodee.Tests.Common -v --filter "FullyQualifiedName~OpenSubsonicApiSchemaValidationTests"
# Run all common tests
dotnet test tests/Melodee.Tests.Common
Test Coverage (311 tests total):
| Endpoint Category | Tests | Status |
|---|---|---|
| System (ping, getLicense, getOpenSubsonicExtensions) | 3 | ✅ All Passing |
| Browsing (getMusicFolders, getIndexes, getArtists, getGenres, getMusicDirectory) | 5 | ✅ All Passing |
| Playlists (getPlaylists, getPlaylist, createPlaylist, updatePlaylist, deletePlaylist) | 5 | ✅ All Passing |
| User Data (getStarred, getStarred2, getNowPlaying, getUser) | 4 | ✅ All Passing |
| Album Lists (getAlbumList, getAlbumList2, getRandomSongs) | 3 | ✅ All Passing |
| Song/Album/Artist (getSong, getAlbum, getArtist) | 3 | ✅ All Passing |
| Lyrics (getLyricsListForSongId, getLyricsForArtistAndTitle) | 2 | ✅ All Passing |
| Genre (getSongsByGenre) | 1 | ✅ All Passing |
| Artist/Album Info (getArtistInfo, getAlbumInfo) | 2 | ✅ All Passing |
| Annotation (getTopSongs, getSimilarSongs) | 2 | ✅ All Passing |
| Annotation Actions (toggleStar, setRating, scrobble) | 3 | ✅ All Passing |
| Bookmarks (getBookmarks, createBookmark, deleteBookmark) | 3 | ✅ All Passing |
| Play Queue (getPlayQueue, savePlayQueue) | 2 | ✅ All Passing |
| Shares (getShares, createShare, updateShare, deleteShare) | 4 | ✅ All Passing |
| Media Library Scanning (getScanStatus, startScan) | 2 | ✅ All Passing |
| Internet Radio (getInternetRadioStations, create/update/delete station) | 4 | ✅ All Passing |
| Search (search2, search3) | 2 | ✅ All Passing |
| Media Retrieval (getAvatar, getCoverArt) | 2 | ✅ All Passing |
| User Management (createUser) | 1 | ✅ All Passing |
| Nested Child Element Validation | 6 | ✅ All Passing |
| Response Format Compliance | 2 | ✅ All Passing |
| Version Format Compliance | 1 | ✅ All Passing |
| Error Response Validation (all codes 10-80) | 10 | ✅ All Passing |
| Podcast Response Schema Validation | 6 | ✅ All Passing |
| Jukebox Response Schema Validation | 5 | ✅ All Passing |
| Share/Bookmark Element Validation | 3 | ✅ All Passing |
| AlbumChild/NowPlayingEntry Validation | 2 | ✅ All Passing |
| Podcast HTTP Endpoints | 6 | ✅ All Passing |
| Jukebox HTTP Endpoints | 11 | ✅ All Passing |
| Streaming Behavior Tests | 7 | ✅ All Passing |
| Request Validation Tests | 25 | ✅ All Passing |
| Authentication Flow Tests | 11 | ✅ All Passing |
| Authentication Error Tests | 10 | ✅ All Passing |
| Comprehensive Schema Validation Tests | 44 | ✅ All Passing |
Schema Validator Coverage:
The schema validator validates response elements against Subsonic XSD types (50+ elements defined):
| Element | Type | Attributes/Children Validated |
|---|---|---|
musicFolders |
MusicFolders | musicFolder[] children |
indexes |
Indexes | lastModified (long), ignoredArticles |
index |
Index | artist[] children |
artist |
Artist | id (required), name, albumCount |
artists |
ArtistsID3 | index[] with artist[] children |
album |
AlbumWithSongsID3 | id, name, artist, year, genre, songCount, duration, etc. |
song / child |
Child | 24+ attributes including id, title, artist, album, duration |
albumList |
AlbumList | album[] children (AlbumChild type) |
albumList2 |
AlbumList2 | album[] children (AlbumChild type) |
AlbumChild |
AlbumChild | 13+ attributes for album list responses |
genres |
Genres | genre[] children with name, songCount, albumCount |
directory |
Directory | id, name, parent, path, child[] children |
playlists |
Playlists | playlist[] children |
playlist |
PlaylistWithSongs | id, name, owner, songCount, duration, song[] children |
starred |
Starred | artist[], album[], song[] children |
starred2 |
Starred2 | artist[], album[], song[] children |
nowPlaying |
NowPlaying | entry[] (NowPlayingEntry) children |
NowPlayingEntry |
NowPlayingEntry | 25+ attributes including username, playerName |
user |
User | username (required), email, all role booleans |
lyrics |
Lyrics | artist, title, verse[] children |
LyricsVerse |
LyricsVerse | nr, value (required) |
license |
License | valid (required), email, key, expires, trial |
randomSongs |
Songs | song[] children |
searchResult2 |
SearchResult2 | totalHits, offset, artist[], album[], song[] |
searchResult3 |
SearchResult3 | totalHits, offset, artist[], album[], song[] |
songsByGenre |
Songs | song[] children |
artistInfo |
ArtistInfo | name, bio, musicBrainzId, lastFmUrl, similarArtist[] |
albumInfo |
AlbumInfo | title, artist, coverArt, notes, musicBrainzId, lastFmUrl |
similarSongs2 |
SimilarSongs2 | song[] children |
topSongs |
TopSongs | song[] children |
internetRadioStations |
InternetRadioStations | internetRadioStation[] children |
InternetRadioStation |
InternetRadioStation | id (required), name (required), streamUrl (required) |
shares |
Shares | share[] children |
Share |
Share | id (required), url (required), entry[] children |
bookmarks |
Bookmarks | bookmark[] children |
Bookmark |
Bookmark | position (required), entry[] children |
playQueue |
PlayQueue | username, current, position, entry[] |
scanStatus |
ScanStatus | scanning, count, currentCount, totalCount, percent |
jukeboxStatus |
JukeboxStatus | currentIndex (required), playing (required), gain, position, jukeboxPlaylist |
jukeboxPlaylist |
JukeboxPlaylist | changeCount (required), entry[] children |
jukeboxEntry |
JukeboxEntry | id (required), title, artist, album, duration, 18+ attributes |
podcasts |
Podcasts | channel[] children |
podcast |
PodcastChannel | id (required), url (required), title, description, episode[] |
episode |
PodcastEpisode | id (required), channelId (required), title, duration, publishDate |
newestPodcasts |
NewestPodcasts | episode[] children |
error |
Error | code (required), message (required) |
Test Results (January 13, 2026):
- Total Tests: 311 (implementation complete)
- Passing: 311 (100%)
- Failed: 0
- Skipped: 0
- Schema Elements Validated: 50+
- Error Codes Validated: 8 (10, 20, 30, 40, 50, 60, 70, 80)
Schema Validation Testing
Melodee includes an automated test suite that validates OpenSubsonic API response structures against published XSD specifications. These tests verify that JSON responses conform to expected schema patterns, including:
- Response Structure: Element hierarchy and child relationships
- Required Attributes: Presence of mandatory fields (id, name, etc.)
- Field Types: Correct data types for all attributes
- Nested Elements: Properly structured arrays and child collections
- Error Responses: All documented error codes (10-80)
Run tests:
dotnet test tests/Melodee.Tests.Common -v --filter "FullyQualifiedName~OpenSubsonicApiSchemaValidationTests"
What These Tests Validate
Our 160 schema validation tests verify:
- Response Structure: JSON response elements conform to Subsonic XSD schema definitions
- Required Attributes: Presence of mandatory fields (e.g.,
id,nameon response elements) - Field Types: Correct data types (integer, boolean, dateTime, string, float)
- Nested Elements: Properly structured arrays and child elements
- Error Formats: All documented error codes (10-80) with proper code/message structure
- Version Compliance: All responses follow
X.Y.Zversion format pattern - Type Field: All responses include type field with “Melodee” value
What These Tests Do NOT Validate
These tests verify SCHEMA STRUCTURE only and do NOT test:
- Request Parameter Validation: Handling of invalid or missing parameters
- Functional Behavior: Actual streaming, transcoding, or playback functionality
- Authentication Flow: Token generation, expiration, or security
- Performance: Rate limiting, throughput, or load handling
- Integration: HTTP controller endpoints (Podcast, Jukebox) require full server setup
- Client-Specific Behavior: Edge cases or workarounds for specific clients
Manual Verification
To manually verify client compatibility with Melodee’s OpenSubsonic implementation:
- Start Melodee with test data:
dotnet run --project src/Melodee.Blazor - Configure your client to connect to
http://localhost:5000 - Use credentials: username
test, passwordtestpassword - Test core functionality: browse, search, stream, playlists, favorites
- Report any issues at GitHub Issues
Related Documentation
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.