From 24c6219189af1ef3ab7d74f9d8ff489e4d527818 Mon Sep 17 00:00:00 2001 From: Josh Patra Date: Wed, 4 Feb 2026 16:54:56 -0500 Subject: [PATCH] Fix external track counting by checking matched tracks cache - External tracks are injected on-the-fly, not stored in Jellyfin DB - Check spotify:matched:ordered cache to get accurate external count - Calculate external tracks as: total matched - local tracks - This will properly show the two-color progress bar (green local + orange external) - All 225 tests passing --- allstarr/Controllers/AdminController.cs | 27 ++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) 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);