diff --git a/octo-fiesta/Controllers/SubSonicController.cs b/octo-fiesta/Controllers/SubSonicController.cs
index 4cd8b7b..6b53fcd 100644
--- a/octo-fiesta/Controllers/SubSonicController.cs
+++ b/octo-fiesta/Controllers/SubSonicController.cs
@@ -221,7 +221,130 @@ public class SubsonicController : ControllerBase
}
///
- /// Endpoint getAlbum personnalisé
+ /// Endpoint getArtist personnalisé - fusionne les albums locaux et Deezer
+ ///
+ [HttpGet, HttpPost]
+ [Route("rest/getArtist")]
+ [Route("rest/getArtist.view")]
+ public async Task GetArtist()
+ {
+ var parameters = await ExtractAllParameters();
+ var id = parameters.GetValueOrDefault("id", "");
+ var format = parameters.GetValueOrDefault("f", "xml");
+
+ if (string.IsNullOrWhiteSpace(id))
+ {
+ return CreateSubsonicError(format, 10, "Missing id parameter");
+ }
+
+ var (isExternal, provider, externalId) = _localLibraryService.ParseSongId(id);
+
+ if (isExternal)
+ {
+ // Artiste externe - récupérer depuis Deezer avec ses albums
+ var artist = await _metadataService.GetArtistAsync(provider!, externalId!);
+ if (artist == null)
+ {
+ return CreateSubsonicError(format, 70, "Artist not found");
+ }
+
+ var albums = await _metadataService.GetArtistAlbumsAsync(provider!, externalId!);
+ return CreateSubsonicArtistResponse(format, artist, albums);
+ }
+
+ // Artiste local - récupérer depuis Navidrome puis enrichir avec Deezer
+ var navidromeResult = await RelayToSubsonicSafe("rest/getArtist", parameters);
+
+ if (!navidromeResult.Success || navidromeResult.Body == null)
+ {
+ return CreateSubsonicError(format, 70, "Artist not found");
+ }
+
+ // Parser la réponse Navidrome pour extraire le nom de l'artiste et les albums locaux
+ var navidromeContent = Encoding.UTF8.GetString(navidromeResult.Body);
+ string artistName = "";
+ var localAlbums = new List