private async Task ProcessMovies(EmbyServers server, bool recentlyAdded, string parentId = default) { EmbyItemContainer <EmbyMovie> movies; if (recentlyAdded) { var recentlyAddedAmountToTake = AmountToTake / 2; movies = await Api.RecentlyAddedMovies(server.ApiKey, parentId, 0, recentlyAddedAmountToTake, server.AdministratorId, server.FullUri); // Setting this so we don't attempt to grab more than we need if (movies.TotalRecordCount > recentlyAddedAmountToTake) { movies.TotalRecordCount = recentlyAddedAmountToTake; } } else { movies = await Api.GetAllMovies(server.ApiKey, parentId, 0, AmountToTake, server.AdministratorId, server.FullUri); } var totalCount = movies.TotalRecordCount; var processed = 0; var mediaToAdd = new HashSet <EmbyContent>(); var mediaToUpdate = new HashSet <EmbyContent>(); while (processed < totalCount) { foreach (var movie in movies.Items) { if (movie.Type.Equals("boxset", StringComparison.InvariantCultureIgnoreCase)) { var movieInfo = await Api.GetCollection(movie.Id, server.ApiKey, server.AdministratorId, server.FullUri); foreach (var item in movieInfo.Items) { await ProcessMovies(item, mediaToAdd, mediaToUpdate, server); } } else { // Regular movie await ProcessMovies(movie, mediaToAdd, mediaToUpdate, server); } processed++; } // Get the next batch // Recently Added should never be checked as the TotalRecords should equal the amount to take if (!recentlyAdded) { movies = await Api.GetAllMovies(server.ApiKey, parentId, processed, AmountToTake, server.AdministratorId, server.FullUri); } await _repo.AddRange(mediaToAdd); await _repo.UpdateRange(mediaToUpdate); mediaToAdd.Clear(); } }
private async Task CacheEpisodes(EmbyServers server) { var allEpisodes = await _api.GetAllEpisodes(server.ApiKey, 0, 200, server.AdministratorId, server.FullUri); var total = allEpisodes.TotalRecordCount; var processed = 1; var epToAdd = new HashSet <EmbyEpisode>(); while (processed < total) { foreach (var ep in allEpisodes.Items) { processed++; // Let's make sure we have the parent request, stop those pesky forign key errors, // Damn me having data integrity var parent = await _repo.GetByEmbyId(ep.SeriesId); if (parent == null) { _logger.LogInformation("The episode {0} does not relate to a series, so we cannot save this", ep.Name); continue; } var existingEpisode = await _repo.GetEpisodeByEmbyId(ep.Id); // Make sure it's not in the hashset too var existingInList = epToAdd.Any(x => x.EmbyId == ep.Id); if (existingEpisode == null && !existingInList) { _logger.LogDebug("Adding new episode {0} to parent {1}", ep.Name, ep.SeriesName); // add it epToAdd.Add(new EmbyEpisode { EmbyId = ep.Id, EpisodeNumber = ep.IndexNumber, SeasonNumber = ep.ParentIndexNumber, ParentId = ep.SeriesId, TvDbId = ep.ProviderIds.Tvdb, TheMovieDbId = ep.ProviderIds.Tmdb, ImdbId = ep.ProviderIds.Imdb, Title = ep.Name, AddedAt = DateTime.UtcNow }); } } await _repo.AddRange(epToAdd); epToAdd.Clear(); allEpisodes = await _api.GetAllEpisodes(server.ApiKey, processed, 200, server.AdministratorId, server.FullUri); } if (epToAdd.Any()) { await _repo.AddRange(epToAdd); } }
public async Task <PublicInfo> GetServerInfo([FromBody] EmbyServers server) { var client = await EmbyApi.CreateClient(); var result = await client.GetPublicInformation(server.FullUri); return(result); }
private async Task CacheEpisodes(EmbyServers server) { var allEpisodes = await _api.GetAllEpisodes(server.ApiKey, server.AdministratorId, server.FullUri); var epToAdd = new List <EmbyEpisode>(); foreach (var ep in allEpisodes.Items) { if (ep.LocationType.Equals("Virtual", StringComparison.CurrentCultureIgnoreCase)) { // This means that we don't actully have the file, it's just Emby being nice and showing future stuff continue; } var epInfo = await _api.GetEpisodeInformation(ep.Id, server.ApiKey, server.AdministratorId, server.FullUri); //if (epInfo?.ProviderIds?.Tvdb == null) //{ // continue; //} // Let's make sure we have the parent request, stop those pesky forign key errors, // Damn me having data integrity var parent = await _repo.GetByEmbyId(epInfo.SeriesId); if (parent == null) { _logger.LogInformation("The episode {0} does not relate to a series, so we cannot save this", ep.Name); continue; } var existingEpisode = await _repo.GetEpisodeByEmbyId(ep.Id); if (existingEpisode == null) { // add it epToAdd.Add(new EmbyEpisode { EmbyId = ep.Id, EpisodeNumber = ep.IndexNumber, SeasonNumber = ep.ParentIndexNumber, ParentId = ep.SeriesId, TvDbId = epInfo.ProviderIds.Tvdb, TheMovieDbId = epInfo.ProviderIds.Tmdb, ImdbId = epInfo.ProviderIds.Imdb, Title = ep.Name, AddedAt = DateTime.UtcNow }); } } if (epToAdd.Any()) { await _repo.AddRange(epToAdd); } }
private bool ValidateSettings(EmbyServers server) { if (server?.Ip == null || string.IsNullOrEmpty(server?.ApiKey)) { _logger.LogInformation(LoggingEvents.EmbyContentCacher, $"Server {server?.Name} is not configured correctly"); return(false); } return(true); }
public async Task <bool> Emby([FromBody] EmbyServers settings) { try { var result = await EmbyApi.GetUsers(settings.FullUri, settings.ApiKey); return(result.Any()); } catch (Exception e) { Log.LogError(LoggingEvents.Api, e, "Could not test Emby"); return(false); } }
public async Task <EmbyItemContainer <MediaFolders> > GetLibaries([FromBody] EmbyServers server) { var client = await EmbyApi.CreateClient(); var result = await client.GetLibraries(server.ApiKey, server.FullUri); var mediaFolders = new EmbyItemContainer <MediaFolders> { TotalRecordCount = result.Count, Items = new List <MediaFolders>() }; foreach (var folder in result) { var toAdd = new MediaFolders { Name = folder.Name, Id = folder.ItemId, ServerId = server.ServerId }; var types = folder?.LibraryOptions?.TypeOptions?.Select(x => x.Type); if (!types.Any()) { continue; } if (types.Where(x => x.Equals("Movie", System.StringComparison.InvariantCultureIgnoreCase) || x.Equals("Episode", System.StringComparison.InvariantCultureIgnoreCase)).Count() >= 2) { toAdd.CollectionType = "mixed"; } else if (types.Where(x => x.Equals("Movie", System.StringComparison.InvariantCultureIgnoreCase)).Any()) { toAdd.CollectionType = "movies"; } else if (types.Where(x => x.Equals("Episode", System.StringComparison.InvariantCultureIgnoreCase)).Any()) { toAdd.CollectionType = "tvshows"; } mediaFolders.Items.Add(toAdd); } return(mediaFolders); }
private async Task StartServerCache(EmbyServers server, EmbySettings settings) { if (!ValidateSettings(server)) { return; } //await _repo.ExecuteSql("DELETE FROM EmbyEpisode"); //await _repo.ExecuteSql("DELETE FROM EmbyContent"); if (server.EmbySelectedLibraries.Any() && server.EmbySelectedLibraries.Any(x => x.Enabled)) { var movieLibsToFilter = server.EmbySelectedLibraries.Where(x => x.Enabled && x.CollectionType == "movies"); foreach (var movieParentIdFilder in movieLibsToFilter) { _logger.LogInformation($"Scanning Lib '{movieParentIdFilder.Title}'"); await ProcessMovies(server, movieParentIdFilder.Key); } var tvLibsToFilter = server.EmbySelectedLibraries.Where(x => x.Enabled && x.CollectionType == "tvshows"); foreach (var tvParentIdFilter in tvLibsToFilter) { _logger.LogInformation($"Scanning Lib '{tvParentIdFilter.Title}'"); await ProcessTv(server, tvParentIdFilter.Key); } var mixedLibs = server.EmbySelectedLibraries.Where(x => x.Enabled && x.CollectionType == "mixed"); foreach (var m in mixedLibs) { _logger.LogInformation($"Scanning Lib '{m.Title}'"); await ProcessTv(server, m.Key); await ProcessMovies(server, m.Key); } } else { await ProcessMovies(server); await ProcessTv(server); } }
private async Task StartServerCache(EmbyServers server, bool recentlyAdded) { if (!ValidateSettings(server)) { return; } if (server.EmbySelectedLibraries.Any() && server.EmbySelectedLibraries.Any(x => x.Enabled)) { var movieLibsToFilter = server.EmbySelectedLibraries.Where(x => x.Enabled && x.CollectionType == "movies"); foreach (var movieParentIdFilder in movieLibsToFilter) { _logger.LogInformation($"Scanning Lib '{movieParentIdFilder.Title}'"); await ProcessMovies(server, recentlyAdded, movieParentIdFilder.Key); } var tvLibsToFilter = server.EmbySelectedLibraries.Where(x => x.Enabled && x.CollectionType == "tvshows"); foreach (var tvParentIdFilter in tvLibsToFilter) { _logger.LogInformation($"Scanning Lib '{tvParentIdFilter.Title}'"); await ProcessTv(server, recentlyAdded, tvParentIdFilter.Key); } var mixedLibs = server.EmbySelectedLibraries.Where(x => x.Enabled && x.CollectionType == "mixed"); foreach (var m in mixedLibs) { _logger.LogInformation($"Scanning Lib '{m.Title}'"); await ProcessTv(server, recentlyAdded, m.Key); await ProcessMovies(server, recentlyAdded, m.Key); } } else { await ProcessMovies(server, recentlyAdded); await ProcessTv(server, recentlyAdded); } }
private async Task ProcessMovies(EmbyServers server, string parentId = default) { var movies = await Api.GetAllMovies(server.ApiKey, parentId, 0, 200, server.AdministratorId, server.FullUri); var totalCount = movies.TotalRecordCount; var processed = 1; var mediaToAdd = new HashSet <EmbyContent>(); while (processed < totalCount) { foreach (var movie in movies.Items) { if (movie.Type.Equals("boxset", StringComparison.InvariantCultureIgnoreCase)) { var movieInfo = await Api.GetCollection(movie.Id, server.ApiKey, server.AdministratorId, server.FullUri); foreach (var item in movieInfo.Items) { await ProcessMovies(item, mediaToAdd, server); } processed++; } else { processed++; // Regular movie await ProcessMovies(movie, mediaToAdd, server); } } // Get the next batch movies = await Api.GetAllMovies(server.ApiKey, parentId, processed, 200, server.AdministratorId, server.FullUri); await _repo.AddRange(mediaToAdd); mediaToAdd.Clear(); } }
private async Task CacheEpisodes(EmbyServers server, bool recentlyAdded, string parentIdFilter) { EmbyItemContainer <EmbyEpisodes> allEpisodes; if (recentlyAdded) { var recentlyAddedAmountToTake = AmountToTake; allEpisodes = await Api.RecentlyAddedEpisodes(server.ApiKey, parentIdFilter, 0, recentlyAddedAmountToTake, server.AdministratorId, server.FullUri); if (allEpisodes.TotalRecordCount > recentlyAddedAmountToTake) { allEpisodes.TotalRecordCount = recentlyAddedAmountToTake; } } else { allEpisodes = await Api.GetAllEpisodes(server.ApiKey, parentIdFilter, 0, AmountToTake, server.AdministratorId, server.FullUri); } var total = allEpisodes.TotalRecordCount; var processed = 0; var epToAdd = new HashSet <EmbyEpisode>(); while (processed < total) { foreach (var ep in allEpisodes.Items) { processed++; if (ep.LocationType?.Equals("Virtual", StringComparison.InvariantCultureIgnoreCase) ?? false) { // For some reason Emby is not respecting the `IsVirtualItem` field. continue; } // Let's make sure we have the parent request, stop those pesky forign key errors, // Damn me having data integrity var parent = await _repo.GetByEmbyId(ep.SeriesId); if (parent == null) { _logger.LogInformation("The episode {0} does not relate to a series, so we cannot save this", ep.Name); continue; } var existingEpisode = await _repo.GetEpisodeByEmbyId(ep.Id); // Make sure it's not in the hashset too var existingInList = epToAdd.Any(x => x.EmbyId == ep.Id); if (existingEpisode == null && !existingInList) { // Sanity checks if (ep.IndexNumber == 0) { _logger.LogWarning($"Episode {ep.Name} has no episode number. Skipping."); continue; } _logger.LogDebug("Adding new episode {0} to parent {1}", ep.Name, ep.SeriesName); // add it epToAdd.Add(new EmbyEpisode { EmbyId = ep.Id, EpisodeNumber = ep.IndexNumber, SeasonNumber = ep.ParentIndexNumber, ParentId = ep.SeriesId, TvDbId = ep.ProviderIds.Tvdb, TheMovieDbId = ep.ProviderIds.Tmdb, ImdbId = ep.ProviderIds.Imdb, Title = ep.Name, AddedAt = DateTime.UtcNow }); if (ep.IndexNumberEnd.HasValue && ep.IndexNumberEnd.Value != ep.IndexNumber) { epToAdd.Add(new EmbyEpisode { EmbyId = ep.Id, EpisodeNumber = ep.IndexNumberEnd.Value, SeasonNumber = ep.ParentIndexNumber, ParentId = ep.SeriesId, TvDbId = ep.ProviderIds.Tvdb, TheMovieDbId = ep.ProviderIds.Tmdb, ImdbId = ep.ProviderIds.Imdb, Title = ep.Name, AddedAt = DateTime.UtcNow }); } } } await _repo.AddRange(epToAdd); epToAdd.Clear(); if (!recentlyAdded) { allEpisodes = await Api.GetAllEpisodes(server.ApiKey, parentIdFilter, processed, AmountToTake, server.AdministratorId, server.FullUri); } } if (epToAdd.Any()) { await _repo.AddRange(epToAdd); } }
private async Task ProcessMovies(EmbyMovie movieInfo, ICollection <EmbyContent> content, EmbyServers server) { // Check if it exists var existingMovie = await _repo.GetByEmbyId(movieInfo.Id); var alreadyGoingToAdd = content.Any(x => x.EmbyId == movieInfo.Id); if (existingMovie == null && !alreadyGoingToAdd) { _logger.LogDebug("Adding new movie {0}", movieInfo.Name); content.Add(new EmbyContent { ImdbId = movieInfo.ProviderIds.Imdb, TheMovieDbId = movieInfo.ProviderIds?.Tmdb, Title = movieInfo.Name, Type = EmbyMediaType.Movie, EmbyId = movieInfo.Id, Url = EmbyHelper.GetEmbyMediaUrl(movieInfo.Id, server?.ServerId, server.ServerHostname), AddedAt = DateTime.UtcNow, }); } else { // we have this _logger.LogDebug("We already have movie {0}", movieInfo.Name); } }
private async Task ProcessTv(EmbyServers server, string parentId = default) { // TV Time var mediaToAdd = new HashSet <EmbyContent>(); var tv = await Api.GetAllShows(server.ApiKey, parentId, 0, 200, server.AdministratorId, server.FullUri); var totalTv = tv.TotalRecordCount; var processed = 1; while (processed < totalTv) { foreach (var tvShow in tv.Items) { try { processed++; if (string.IsNullOrEmpty(tvShow.ProviderIds?.Tvdb)) { _logger.LogInformation("Provider Id on tv {0} is null", tvShow.Name); continue; } var existingTv = await _repo.GetByEmbyId(tvShow.Id); if (existingTv == null) { _logger.LogDebug("Adding new TV Show {0}", tvShow.Name); mediaToAdd.Add(new EmbyContent { TvDbId = tvShow.ProviderIds?.Tvdb, ImdbId = tvShow.ProviderIds?.Imdb, TheMovieDbId = tvShow.ProviderIds?.Tmdb, Title = tvShow.Name, Type = EmbyMediaType.Series, EmbyId = tvShow.Id, Url = EmbyHelper.GetEmbyMediaUrl(tvShow.Id, server?.ServerId, server.ServerHostname), AddedAt = DateTime.UtcNow }); } else { _logger.LogDebug("We already have TV Show {0}", tvShow.Name); } } catch (Exception) { throw; } } // Get the next batch tv = await Api.GetAllShows(server.ApiKey, parentId, processed, 200, server.AdministratorId, server.FullUri); await _repo.AddRange(mediaToAdd); mediaToAdd.Clear(); } if (mediaToAdd.Any()) { await _repo.AddRange(mediaToAdd); } }
private async Task StartServerCache(EmbyServers server, EmbySettings settings) { if (!ValidateSettings(server)) { return; } //await _repo.ExecuteSql("DELETE FROM EmbyEpisode"); //await _repo.ExecuteSql("DELETE FROM EmbyContent"); var movies = await _api.GetAllMovies(server.ApiKey, 0, 200, server.AdministratorId, server.FullUri); var totalCount = movies.TotalRecordCount; var processed = 1; var mediaToAdd = new HashSet <EmbyContent>(); while (processed < totalCount) { foreach (var movie in movies.Items) { if (movie.Type.Equals("boxset", StringComparison.InvariantCultureIgnoreCase)) { var movieInfo = await _api.GetCollection(movie.Id, server.ApiKey, server.AdministratorId, server.FullUri); foreach (var item in movieInfo.Items) { await ProcessMovies(item, mediaToAdd, server); } processed++; } else { processed++; // Regular movie await ProcessMovies(movie, mediaToAdd, server); } } // Get the next batch movies = await _api.GetAllMovies(server.ApiKey, processed, 200, server.AdministratorId, server.FullUri); await _repo.AddRange(mediaToAdd); mediaToAdd.Clear(); } // TV Time var tv = await _api.GetAllShows(server.ApiKey, 0, 200, server.AdministratorId, server.FullUri); var totalTv = tv.TotalRecordCount; processed = 1; while (processed < totalTv) { foreach (var tvShow in tv.Items) { try { processed++; if (string.IsNullOrEmpty(tvShow.ProviderIds?.Tvdb)) { _logger.LogInformation("Provider Id on tv {0} is null", tvShow.Name); continue; } var existingTv = await _repo.GetByEmbyId(tvShow.Id); if (existingTv == null) { _logger.LogDebug("Adding new TV Show {0}", tvShow.Name); mediaToAdd.Add(new EmbyContent { TvDbId = tvShow.ProviderIds?.Tvdb, ImdbId = tvShow.ProviderIds?.Imdb, TheMovieDbId = tvShow.ProviderIds?.Tmdb, Title = tvShow.Name, Type = EmbyMediaType.Series, EmbyId = tvShow.Id, Url = EmbyHelper.GetEmbyMediaUrl(tvShow.Id, server.ServerHostname, settings.IsJellyfin), AddedAt = DateTime.UtcNow }); } else { _logger.LogDebug("We already have TV Show {0}", tvShow.Name); } } catch (Exception) { throw; } } // Get the next batch tv = await _api.GetAllShows(server.ApiKey, processed, 200, server.AdministratorId, server.FullUri); await _repo.AddRange(mediaToAdd); mediaToAdd.Clear(); } if (mediaToAdd.Any()) { await _repo.AddRange(mediaToAdd); } }
private async Task ProcessTv(EmbyServers server, bool recentlyAdded, string parentId = default) { // TV Time var mediaToAdd = new HashSet <EmbyContent>(); EmbyItemContainer <EmbySeries> tv; if (recentlyAdded) { var recentlyAddedAmountToTake = AmountToTake / 2; tv = await Api.RecentlyAddedShows(server.ApiKey, parentId, 0, recentlyAddedAmountToTake, server.AdministratorId, server.FullUri); if (tv.TotalRecordCount > recentlyAddedAmountToTake) { tv.TotalRecordCount = recentlyAddedAmountToTake; } } else { tv = await Api.GetAllShows(server.ApiKey, parentId, 0, AmountToTake, server.AdministratorId, server.FullUri); } var totalTv = tv.TotalRecordCount; var processed = 0; while (processed < totalTv) { foreach (var tvShow in tv.Items) { processed++; if (!tvShow.ProviderIds.Any()) { _logger.LogInformation("Provider Id on tv {0} is null", tvShow.Name); continue; } var existingTv = await _repo.GetByEmbyId(tvShow.Id); if (existingTv == null) { _logger.LogDebug("Adding new TV Show {0}", tvShow.Name); mediaToAdd.Add(new EmbyContent { TvDbId = tvShow.ProviderIds?.Tvdb, ImdbId = tvShow.ProviderIds?.Imdb, TheMovieDbId = tvShow.ProviderIds?.Tmdb, Title = tvShow.Name, Type = MediaType.Series, EmbyId = tvShow.Id, Url = EmbyHelper.GetEmbyMediaUrl(tvShow.Id, server?.ServerId, server.ServerHostname), AddedAt = DateTime.UtcNow, }); } else { _logger.LogDebug("We already have TV Show {0}", tvShow.Name); } } // Get the next batch if (!recentlyAdded) { tv = await Api.GetAllShows(server.ApiKey, parentId, processed, AmountToTake, server.AdministratorId, server.FullUri); } await _repo.AddRange(mediaToAdd); mediaToAdd.Clear(); } if (mediaToAdd.Any()) { await _repo.AddRange(mediaToAdd); } }
private async Task StartServerCache(EmbyServers server) { if (!ValidateSettings(server)) { return; } await _repo.ExecuteSql("DELETE FROM EmbyEpisode"); await _repo.ExecuteSql("DELETE FROM EmbyContent"); var movies = await _api.GetAllMovies(server.ApiKey, server.AdministratorId, server.FullUri); var mediaToAdd = new HashSet <EmbyContent>(); foreach (var movie in movies.Items) { if (movie.Type.Equals("boxset", StringComparison.CurrentCultureIgnoreCase)) { var movieInfo = await _api.GetCollection(movie.Id, server.ApiKey, server.AdministratorId, server.FullUri); foreach (var item in movieInfo.Items) { var info = await _api.GetMovieInformation(item.Id, server.ApiKey, server.AdministratorId, server.FullUri); await ProcessMovies(info, mediaToAdd); } } else { // Regular movie var movieInfo = await _api.GetMovieInformation(movie.Id, server.ApiKey, server.AdministratorId, server.FullUri); await ProcessMovies(movieInfo, mediaToAdd); } } // TV Time var tv = await _api.GetAllShows(server.ApiKey, server.AdministratorId, server.FullUri); foreach (var tvShow in tv.Items) { var tvInfo = await _api.GetSeriesInformation(tvShow.Id, server.ApiKey, server.AdministratorId, server.FullUri); if (string.IsNullOrEmpty(tvInfo.ProviderIds?.Tvdb)) { Log.Error("Provider Id on tv {0} is null", tvShow.Name); continue; } var existingTv = await _repo.GetByEmbyId(tvShow.Id); if (existingTv == null) { mediaToAdd.Add(new EmbyContent { TvDbId = tvInfo.ProviderIds?.Tvdb, ImdbId = tvInfo.ProviderIds?.Imdb, TheMovieDbId = tvInfo.ProviderIds?.Tmdb, Title = tvInfo.Name, Type = EmbyMediaType.Series, EmbyId = tvShow.Id, Url = EmbyHelper.GetEmbyMediaUrl(tvShow.Id), AddedAt = DateTime.UtcNow }); } } if (mediaToAdd.Any()) { await _repo.AddRange(mediaToAdd); } }
private async Task ProcessMovies(EmbyMovie movieInfo, ICollection <EmbyContent> content, ICollection <EmbyContent> toUpdate, EmbyServers server) { var quality = movieInfo.MediaStreams?.FirstOrDefault()?.DisplayTitle ?? string.Empty; var has4K = false; if (quality.Contains("4K", CompareOptions.IgnoreCase)) { has4K = true; } // Check if it exists var existingMovie = await _repo.GetByEmbyId(movieInfo.Id); var alreadyGoingToAdd = content.Any(x => x.EmbyId == movieInfo.Id); if (existingMovie == null && !alreadyGoingToAdd) { if (!movieInfo.ProviderIds.Any()) { _logger.LogWarning($"Movie {movieInfo.Name} has no relevant metadata. Skipping."); return; } _logger.LogDebug($"Adding new movie {movieInfo.Name}"); content.Add(new EmbyContent { ImdbId = movieInfo.ProviderIds.Imdb, TheMovieDbId = movieInfo.ProviderIds?.Tmdb, Title = movieInfo.Name, Type = MediaType.Movie, EmbyId = movieInfo.Id, Url = EmbyHelper.GetEmbyMediaUrl(movieInfo.Id, server?.ServerId, server.ServerHostname), AddedAt = DateTime.UtcNow, Quality = has4K ? null : quality, Has4K = has4K }); } else { if (!quality.Equals(existingMovie?.Quality, StringComparison.InvariantCultureIgnoreCase)) { _logger.LogDebug($"We have found another quality for Movie '{movieInfo.Name}', Quality: '{quality}'"); existingMovie.Quality = has4K ? null : quality; existingMovie.Has4K = has4K; // Probably could refactor here // If a 4k movie comes in (we don't store the quality on 4k) // it will always get updated even know it's not changed toUpdate.Add(existingMovie); } else { // we have this _logger.LogDebug($"We already have movie {movieInfo.Name}"); } } }