diff --git a/allstarr/Controllers/AdminController.cs b/allstarr/Controllers/AdminController.cs index 90853a6..8dfcc18 100644 --- a/allstarr/Controllers/AdminController.cs +++ b/allstarr/Controllers/AdminController.cs @@ -153,14 +153,19 @@ public class AdminController : ControllerBase { ["name"] = config.Name, ["id"] = config.Id, + ["jellyfinId"] = config.JellyfinId, ["localTracksPosition"] = config.LocalTracksPosition.ToString(), ["trackCount"] = 0, + ["localTracks"] = 0, + ["externalTracks"] = 0, ["lastFetched"] = null as DateTime?, ["cacheAge"] = null as string }; - // Try to get cached playlist data + // Get Spotify playlist track count from cache var cacheFilePath = Path.Combine(CacheDirectory, $"{SanitizeFileName(config.Name)}_spotify.json"); + int spotifyTrackCount = 0; + if (System.IO.File.Exists(cacheFilePath)) { try @@ -171,7 +176,8 @@ public class AdminController : ControllerBase if (root.TryGetProperty("tracks", out var tracks)) { - playlistInfo["trackCount"] = tracks.GetArrayLength(); + spotifyTrackCount = tracks.GetArrayLength(); + playlistInfo["trackCount"] = spotifyTrackCount; } if (root.TryGetProperty("fetchedAt", out var fetchedAt)) @@ -190,6 +196,35 @@ public class AdminController : ControllerBase } } + // Get current Jellyfin playlist track count + if (!string.IsNullOrEmpty(config.JellyfinId)) + { + try + { + var url = $"{_jellyfinSettings.Url}/Playlists/{config.JellyfinId}/Items?Fields=Path"; + var request = new HttpRequestMessage(HttpMethod.Get, url); + request.Headers.Add("X-Emby-Authorization", GetJellyfinAuthHeader()); + + var response = await _jellyfinHttpClient.SendAsync(request); + if (response.IsSuccessStatusCode) + { + var jellyfinJson = await response.Content.ReadAsStringAsync(); + using var jellyfinDoc = JsonDocument.Parse(jellyfinJson); + + if (jellyfinDoc.RootElement.TryGetProperty("Items", out var items)) + { + var localCount = items.GetArrayLength(); + playlistInfo["localTracks"] = localCount; + playlistInfo["externalTracks"] = Math.Max(0, spotifyTrackCount - localCount); + } + } + } + catch (Exception ex) + { + _logger.LogWarning(ex, "Failed to get Jellyfin playlist tracks for {Name}", config.Name); + } + } + playlists.Add(playlistInfo); } diff --git a/allstarr/wwwroot/index.html b/allstarr/wwwroot/index.html index 7b12ea2..f7787c6 100644 --- a/allstarr/wwwroot/index.html +++ b/allstarr/wwwroot/index.html @@ -1067,11 +1067,10 @@ } tbody.innerHTML = data.playlists.map(p => { - // For now, we don't have local/external counts in the API response - // This will show "-" until we add that data - const localExternal = (p.localTracks !== undefined && p.externalTracks !== undefined) - ? `${p.localTracks}/${p.externalTracks}` - : '-'; + // Show local tracks and missing tracks + const localCount = p.localTracks || 0; + const missingCount = p.externalTracks || 0; + const localExternal = `${localCount} local / ${missingCount} missing`; return `