private async Task<Tuple<List<Guid>, List<Guid>>> RefreshChannelsInternal(ILiveTvService service, IProgress<double> progress, CancellationToken cancellationToken) { progress.Report(10); var allChannels = await GetChannels(service, cancellationToken).ConfigureAwait(false); var allChannelsList = allChannels.ToList(); var list = new List<LiveTvChannel>(); var numComplete = 0; var parentFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); var parentFolderId = parentFolder.Id; foreach (var channelInfo in allChannelsList) { cancellationToken.ThrowIfCancellationRequested(); try { var item = await GetChannel(channelInfo.Item2, channelInfo.Item1, parentFolderId, cancellationToken).ConfigureAwait(false); list.Add(item); _libraryManager.RegisterItem(item); } catch (OperationCanceledException) { throw; } catch (Exception ex) { _logger.ErrorException("Error getting channel information for {0}", ex, channelInfo.Item2.Name); } numComplete++; double percent = numComplete; percent /= allChannelsList.Count; progress.Report(5 * percent + 10); } progress.Report(15); numComplete = 0; var programs = new List<Guid>(); var channels = new List<Guid>(); var guideDays = GetGuideDays(list.Count); _logger.Info("Refreshing guide with {0} days of guide data", guideDays); cancellationToken.ThrowIfCancellationRequested(); foreach (var currentChannel in list) { channels.Add(currentChannel.Id); cancellationToken.ThrowIfCancellationRequested(); try { var start = DateTime.UtcNow.AddHours(-1); var end = start.AddDays(guideDays); var channelPrograms = await service.GetProgramsAsync(currentChannel.ExternalId, start, end, cancellationToken).ConfigureAwait(false); foreach (var program in channelPrograms) { var programItem = await GetProgram(program, currentChannel, currentChannel.ChannelType, service.Name, cancellationToken).ConfigureAwait(false); programs.Add(programItem.Id); } } catch (OperationCanceledException) { throw; } catch (Exception ex) { _logger.ErrorException("Error getting programs for channel {0}", ex, currentChannel.Name); } numComplete++; double percent = numComplete; percent /= allChannelsList.Count; progress.Report(80 * percent + 10); } progress.Report(100); return new Tuple<List<Guid>, List<Guid>>(channels, programs); }
private async Task<Tuple<List<Guid>, List<Guid>>> RefreshChannelsInternal(ILiveTvService service, IProgress<double> progress, CancellationToken cancellationToken) { progress.Report(10); var allChannels = await GetChannels(service, cancellationToken).ConfigureAwait(false); var allChannelsList = allChannels.ToList(); var list = new List<LiveTvChannel>(); var numComplete = 0; var parentFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); var parentFolderId = parentFolder.Id; foreach (var channelInfo in allChannelsList) { cancellationToken.ThrowIfCancellationRequested(); try { var item = await GetChannel(channelInfo.Item2, channelInfo.Item1, parentFolderId, cancellationToken).ConfigureAwait(false); list.Add(item); } catch (OperationCanceledException) { throw; } catch (Exception ex) { _logger.ErrorException("Error getting channel information for {0}", ex, channelInfo.Item2.Name); } numComplete++; double percent = numComplete; percent /= allChannelsList.Count; progress.Report(5 * percent + 10); } progress.Report(15); numComplete = 0; var programs = new List<Guid>(); var channels = new List<Guid>(); var guideDays = GetGuideDays(); _logger.Info("Refreshing guide with {0} days of guide data", guideDays); cancellationToken.ThrowIfCancellationRequested(); foreach (var currentChannel in list) { channels.Add(currentChannel.Id); cancellationToken.ThrowIfCancellationRequested(); try { var start = DateTime.UtcNow.AddHours(-1); var end = start.AddDays(guideDays); var isMovie = false; var isSports = false; var isNews = false; var isKids = false; var iSSeries = false; var channelPrograms = await service.GetProgramsAsync(currentChannel.ExternalId, start, end, cancellationToken).ConfigureAwait(false); var existingPrograms = _libraryManager.GetItemList(new InternalItemsQuery { IncludeItemTypes = new string[] { typeof(LiveTvProgram).Name }, ChannelIds = new string[] { currentChannel.Id.ToString("N") } }).Cast<LiveTvProgram>().ToDictionary(i => i.Id); var newPrograms = new List<LiveTvProgram>(); var updatedPrograms = new List<LiveTvProgram>(); foreach (var program in channelPrograms) { var programTuple = GetProgram(program, existingPrograms, currentChannel, currentChannel.ChannelType, service.Name, cancellationToken); var programItem = programTuple.Item1; if (programTuple.Item2) { newPrograms.Add(programItem); } else if (programTuple.Item3) { updatedPrograms.Add(programItem); } programs.Add(programItem.Id); if (program.IsMovie) { isMovie = true; } if (program.IsSeries) { iSSeries = true; } if (program.IsSports) { isSports = true; } if (program.IsNews) { isNews = true; } if (program.IsKids) { isKids = true; } } _logger.Debug("Channel {0} has {1} new programs and {2} updated programs", currentChannel.Name, newPrograms.Count, updatedPrograms.Count); if (newPrograms.Count > 0) { await _libraryManager.CreateItems(newPrograms, cancellationToken).ConfigureAwait(false); } // TODO: Do this in bulk foreach (var program in updatedPrograms) { await _libraryManager.UpdateItem(program, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); } foreach (var program in newPrograms) { _providerManager.QueueRefresh(program.Id, new MetadataRefreshOptions(_fileSystem)); } foreach (var program in updatedPrograms) { _providerManager.QueueRefresh(program.Id, new MetadataRefreshOptions(_fileSystem)); } currentChannel.IsMovie = isMovie; currentChannel.IsNews = isNews; currentChannel.IsSports = isSports; currentChannel.IsKids = isKids; currentChannel.IsSeries = iSSeries; await currentChannel.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); } catch (OperationCanceledException) { throw; } catch (Exception ex) { _logger.ErrorException("Error getting programs for channel {0}", ex, currentChannel.Name); } numComplete++; double percent = numComplete; percent /= allChannelsList.Count; progress.Report(80 * percent + 10); } progress.Report(100); return new Tuple<List<Guid>, List<Guid>>(channels, programs); }