private void SyncAll() { var result = _listFetcherAndParser.Fetch(); if (_importListFactory.Enabled().Where(a => ((ImportListDefinition)a.Definition).EnableAuto).Empty()) { _logger.Info("No auto enabled lists, skipping sync and cleaning"); return; } if (!result.AnyFailure) { CleanLibrary(result.Movies.ToList()); } ProcessReports(result); }
private object GetDiscoverMovies() { var includeRecommendations = Request.GetBooleanQueryParameter("includeRecommendations"); var movieLanguge = (Language)_configService.MovieInfoLanguage; var realResults = new List <ImportListMoviesResource>(); var listExclusions = _importExclusionService.GetAllExclusions(); var existingTmdbIds = _movieService.AllMovieTmdbIds(); if (includeRecommendations) { var mapped = new List <Movie>(); var results = _movieService.GetRecommendedTmdbIds(); if (results.Count > 0) { mapped = _movieInfo.GetBulkMovieInfo(results); } realResults.AddRange(MapToResource(mapped.Where(x => x != null), movieLanguge)); realResults.ForEach(x => x.IsRecommendation = true); } var listMovies = MapToResource(_listMovieService.GetAllForLists(_importListFactory.Enabled().Select(x => x.Definition.Id).ToList()), movieLanguge).ToList(); realResults.AddRange(listMovies); var groupedListMovies = realResults.GroupBy(x => x.TmdbId); // Distinct Movies realResults = groupedListMovies.Select(x => { var movie = x.First(); movie.Lists = x.SelectMany(m => m.Lists).ToHashSet(); movie.IsExcluded = listExclusions.Any(e => e.TmdbId == movie.TmdbId); movie.IsExisting = existingTmdbIds.Any(e => e == movie.TmdbId); movie.IsRecommendation = x.Any(m => m.IsRecommendation); return(movie); }).ToList(); return(realResults); }
public ImportListFetchResult Fetch() { var result = new ImportListFetchResult(); var importLists = _importListFactory.Enabled(); if (!importLists.Any()) { _logger.Debug("No available import lists. check your configuration."); return(result); } _logger.Debug("Available import lists {0}", importLists.Count); var taskList = new List <Task>(); var taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None); foreach (var importList in importLists) { _logger.ProgressInfo("Syncing Movies for List: {0}", importList.Name); var importListLocal = importList; var blockedLists = _importListStatusService.GetBlockedProviders().ToDictionary(v => v.ProviderId, v => v); if (blockedLists.TryGetValue(importList.Definition.Id, out ImportListStatus blockedListStatus)) { _logger.Debug("Temporarily ignoring list {0} till {1} due to recent failures.", importList.Definition.Name, blockedListStatus.DisabledTill.Value.ToLocalTime()); result.AnyFailure |= true; //Ensure we don't clean if a list is down continue; } var task = taskFactory.StartNew(() => { try { var importListReports = importListLocal.Fetch(); lock (result) { _logger.Debug("Found {0} from {1}", importListReports.Movies.Count, importList.Name); if (!importListReports.AnyFailure) { // TODO some opportunity to bulk map here if we had the tmdbIds var listMovies = importListReports.Movies.Select(x => { // Is it existing in result var movie = result.Movies.FirstOrDefault(r => r.TmdbId == x.TmdbId); if (movie != null) { movie.ListId = importList.Definition.Id; } return(movie ?? MapMovieReport(x)); }).Where(x => x.TmdbId > 0).ToList(); listMovies = listMovies.DistinctBy(x => x.TmdbId).ToList(); listMovies.ForEach(m => m.ListId = importList.Definition.Id); result.Movies.AddRange(listMovies); _listMovieService.SyncMoviesForList(listMovies, importList.Definition.Id); } result.AnyFailure |= importListReports.AnyFailure; } } catch (Exception e) { _logger.Error(e, "Error during Import List Sync for list {0}", importList.Name); } }).LogExceptions(); taskList.Add(task); } Task.WaitAll(taskList.ToArray()); _logger.Debug("Found {0} reports for all lists", result.Movies.Count); return(result); }