fix: use correct 'subsonic-response' key format in JSON responses

ASP.NET Core serializes anonymous objects with camelCase, producing
'subsonicResponse' instead of 'subsonic-response'. Fixed by using
Dictionary with explicit key names for all JSON responses.
This commit is contained in:
V1ck3s
2025-12-08 22:48:27 +01:00
committed by Vickes
parent a5e065dd31
commit 93dfcf3c2e
2 changed files with 49 additions and 45 deletions

View File

@@ -426,22 +426,17 @@ public class SubsonicController : ControllerBase
.Concat(externalResult.Artists.Select(a => ConvertArtistToSubsonicJson(a))) .Concat(externalResult.Artists.Select(a => ConvertArtistToSubsonicJson(a)))
.ToList(); .ToList();
var response = new return CreateSubsonicJsonResponse(new
{ {
subsonicResponse = new status = "ok",
version = "1.16.1",
searchResult3 = new
{ {
status = "ok", song = mergedSongs,
version = "1.16.1", album = mergedAlbums,
searchResult3 = new artist = mergedArtists
{
song = mergedSongs,
album = mergedAlbums,
artist = mergedArtists
}
} }
}; });
return Ok(response);
} }
else else
{ {
@@ -604,11 +599,23 @@ public class SubsonicController : ControllerBase
); );
} }
/// <summary>
/// Crée une réponse JSON Subsonic avec la clé "subsonic-response" (avec tiret)
/// </summary>
private IActionResult CreateSubsonicJsonResponse(object responseContent)
{
var response = new Dictionary<string, object>
{
["subsonic-response"] = responseContent
};
return new JsonResult(response);
}
private IActionResult CreateSubsonicResponse(string format, string elementName, object data) private IActionResult CreateSubsonicResponse(string format, string elementName, object data)
{ {
if (format == "json") if (format == "json")
{ {
return Ok(new { subsonicResponse = new { status = "ok", version = "1.16.1" } }); return CreateSubsonicJsonResponse(new { status = "ok", version = "1.16.1" });
} }
var ns = XNamespace.Get("http://subsonic.org/restapi"); var ns = XNamespace.Get("http://subsonic.org/restapi");
@@ -626,14 +633,11 @@ public class SubsonicController : ControllerBase
{ {
if (format == "json") if (format == "json")
{ {
return Ok(new return CreateSubsonicJsonResponse(new
{ {
subsonicResponse = new status = "failed",
{ version = "1.16.1",
status = "failed", error = new { code, message }
version = "1.16.1",
error = new { code, message }
}
}); });
} }
@@ -655,14 +659,11 @@ public class SubsonicController : ControllerBase
{ {
if (format == "json") if (format == "json")
{ {
return Ok(new return CreateSubsonicJsonResponse(new
{ {
subsonicResponse = new status = "ok",
{ version = "1.16.1",
status = "ok", song = ConvertSongToSubsonicJson(song)
version = "1.16.1",
song = ConvertSongToSubsonicJson(song)
}
}); });
} }
@@ -681,23 +682,20 @@ public class SubsonicController : ControllerBase
{ {
if (format == "json") if (format == "json")
{ {
return Ok(new return CreateSubsonicJsonResponse(new
{ {
subsonicResponse = new status = "ok",
version = "1.16.1",
album = new
{ {
status = "ok", id = album.Id,
version = "1.16.1", name = album.Title,
album = new artist = album.Artist,
{ artistId = album.ArtistId,
id = album.Id, songCount = album.SongCount ?? 0,
name = album.Title, year = album.Year ?? 0,
artist = album.Artist, coverArt = album.Id,
artistId = album.ArtistId, song = album.Songs.Select(s => ConvertSongToSubsonicJson(s)).ToList()
songCount = album.SongCount ?? 0,
year = album.Year ?? 0,
coverArt = album.Id,
song = album.Songs.Select(s => ConvertSongToSubsonicJson(s)).ToList()
}
} }
}); });
} }

6
package-lock.json generated Normal file
View File

@@ -0,0 +1,6 @@
{
"name": "octo-fiesta",
"lockfileVersion": 3,
"requires": true,
"packages": {}
}