diff --git a/allstarr/Controllers/AdminController.cs b/allstarr/Controllers/AdminController.cs index 35437a2..42983d2 100644 --- a/allstarr/Controllers/AdminController.cs +++ b/allstarr/Controllers/AdminController.cs @@ -249,15 +249,12 @@ public class AdminController : ControllerBase var localCount = 0; var externalMatchedCount = 0; + // Count tracks in Jellyfin playlist + var jellyfinTrackCount = items.GetArrayLength(); + // Count local vs external tracks foreach (var item in items.EnumerateArray()) { - // External tracks from allstarr have ExternalProvider in ProviderIds - // Local tracks have real filesystem paths - var hasPath = item.TryGetProperty("Path", out var pathProp) && - pathProp.ValueKind == JsonValueKind.String && - !string.IsNullOrEmpty(pathProp.GetString()); - // Check if it's an external track by looking at the ID format // External tracks have IDs like "deezer:123456" or "qobuz:123456" var isExternal = false; @@ -271,12 +268,28 @@ public class AdminController : ControllerBase { externalMatchedCount++; } - else if (hasPath) + else { localCount++; } } + // Check matched tracks cache to get accurate external count + // External tracks are injected on-the-fly, not stored in Jellyfin + var matchedTracksKey = $"spotify:matched:ordered:{config.Name}"; + var matchedTracks = await _cache.GetAsync>(matchedTracksKey); + + if (matchedTracks != null && matchedTracks.Count > 0) + { + // Count how many matched tracks are external (not local) + // Assume tracks beyond local count are external + var totalMatched = matchedTracks.Count; + if (totalMatched > localCount) + { + externalMatchedCount = totalMatched - localCount; + } + } + var totalInJellyfin = localCount + externalMatchedCount; var externalMissingCount = Math.Max(0, spotifyTrackCount - totalInJellyfin);