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,9 +426,7 @@ 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", status = "ok",
version = "1.16.1", version = "1.16.1",
@@ -438,10 +436,7 @@ public class SubsonicController : ControllerBase
album = mergedAlbums, album = mergedAlbums,
artist = mergedArtists 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", status = "failed",
version = "1.16.1", version = "1.16.1",
error = new { code, message } 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", status = "ok",
version = "1.16.1", version = "1.16.1",
song = ConvertSongToSubsonicJson(song) song = ConvertSongToSubsonicJson(song)
}
}); });
} }
@@ -681,9 +682,7 @@ public class SubsonicController : ControllerBase
{ {
if (format == "json") if (format == "json")
{ {
return Ok(new return CreateSubsonicJsonResponse(new
{
subsonicResponse = new
{ {
status = "ok", status = "ok",
version = "1.16.1", version = "1.16.1",
@@ -698,7 +697,6 @@ public class SubsonicController : ControllerBase
coverArt = album.Id, coverArt = album.Id,
song = album.Songs.Select(s => ConvertSongToSubsonicJson(s)).ToList() 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": {}
}