Fix external track streaming: normalize provider names to lowercase (squidwtf, deezer, qobuz)

This commit is contained in:
2026-02-05 11:40:45 -05:00
parent 629e95ac30
commit 8555b67a38

View File

@@ -986,14 +986,15 @@ public class AdminController : ControllerBase
{ {
// Store external mapping in cache (NO EXPIRATION - manual mappings are permanent) // Store external mapping in cache (NO EXPIRATION - manual mappings are permanent)
var externalMappingKey = $"spotify:external-map:{decodedName}:{request.SpotifyId}"; var externalMappingKey = $"spotify:external-map:{decodedName}:{request.SpotifyId}";
var externalMapping = new { provider = request.ExternalProvider, id = request.ExternalId }; var normalizedProvider = request.ExternalProvider!.ToLowerInvariant(); // Normalize to lowercase
var externalMapping = new { provider = normalizedProvider, id = request.ExternalId };
await _cache.SetAsync(externalMappingKey, externalMapping); await _cache.SetAsync(externalMappingKey, externalMapping);
// Also save to file for persistence across restarts // Also save to file for persistence across restarts
await SaveManualMappingToFileAsync(decodedName, request.SpotifyId, null, request.ExternalProvider!, request.ExternalId!); await SaveManualMappingToFileAsync(decodedName, request.SpotifyId, null, normalizedProvider, request.ExternalId!);
_logger.LogInformation("Manual external mapping saved: {Playlist} - Spotify {SpotifyId} → {Provider} {ExternalId}", _logger.LogInformation("Manual external mapping saved: {Playlist} - Spotify {SpotifyId} → {Provider} {ExternalId}",
decodedName, request.SpotifyId, request.ExternalProvider, request.ExternalId); decodedName, request.SpotifyId, normalizedProvider, request.ExternalId);
} }
// Clear all related caches to force rebuild // Clear all related caches to force rebuild
@@ -1083,7 +1084,8 @@ public class AdminController : ControllerBase
try try
{ {
var metadataService = HttpContext.RequestServices.GetRequiredService<IMusicMetadataService>(); var metadataService = HttpContext.RequestServices.GetRequiredService<IMusicMetadataService>();
var externalSong = await metadataService.GetSongAsync(request.ExternalProvider!, request.ExternalId!); var normalizedProvider = request.ExternalProvider!.ToLowerInvariant(); // Normalize to lowercase
var externalSong = await metadataService.GetSongAsync(normalizedProvider, request.ExternalId!);
if (externalSong != null) if (externalSong != null)
{ {
@@ -1095,7 +1097,7 @@ public class AdminController : ControllerBase
else else
{ {
_logger.LogWarning("Failed to fetch external track metadata for {Provider} ID {Id}", _logger.LogWarning("Failed to fetch external track metadata for {Provider} ID {Id}",
request.ExternalProvider, request.ExternalId); normalizedProvider, request.ExternalId);
} }
} }
catch (Exception ex) catch (Exception ex)
@@ -1141,7 +1143,7 @@ public class AdminController : ControllerBase
artist = trackArtist ?? "Unknown", artist = trackArtist ?? "Unknown",
album = trackAlbum ?? "Unknown", album = trackAlbum ?? "Unknown",
isLocal = isLocalMapping, isLocal = isLocalMapping,
externalProvider = hasExternalMapping ? request.ExternalProvider : null externalProvider = hasExternalMapping ? request.ExternalProvider!.ToLowerInvariant() : null
}; };
return Ok(new return Ok(new