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.
- Remove custom /ping endpoint that returned non-standard JSON format
- Fix wildcard endpoint to return Subsonic-compatible error responses
- All requests now properly relay to/from the real Subsonic server
- Parse Subsonic search3 response (JSON and XML formats)
- Merge local results with external Deezer results
- Local results appear first, then external results
- Add isExternal flag to distinguish sources