private async Task CacheGuideResponse(DateTimeOffset startDate, DateTimeOffset endDate, CancellationToken cancellationToken) { using (var releaser = await _guideLock.LockAsync()) { if (_guide != null && (DateTime.Now - _guide.FetchTime).Hours < 1) { return; } _logger.Info("[MythTV] Start CacheGuideResponse"); await EnsureSetup(); var options = GetOptions(cancellationToken, "/Guide/GetProgramGuide?StartTime={0}&EndTime={1}&Details=1", FormatMythDate(startDate), FormatMythDate(endDate)); // This can be slow so default 20 sec timeout can be too short options.TimeoutMs = 60000; using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) { _guide = new GuideResponse(stream, _jsonSerializer); } } _logger.Info("[MythTV] End CacheGuideResponse"); }
public async Task <IEnumerable <ProgramInfo> > GetProgramsAsync(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken) { _logger.Info("[MythTV] Start GetPrograms Async, retrieve programs for: {0}", channelId); EnsureSetup(); List <ProgramInfo> ret = new List <ProgramInfo>(); var options = GetOptions(cancellationToken, "/Guide/GetProgramGuide?StartTime={0}&EndTime={1}&StartChanId={2}&NumChannels=1&Details=1", FormateMythDate(startDateUtc), FormateMythDate(endDateUtc), channelId); using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) { var data = GuideResponse.ParseGuide(stream, _jsonSerializer, _logger); foreach (var item in data.Channels) { foreach (var prog in item.Programs) { List <string> categories = new List <string>(); categories.AddRange(prog.Category.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries)); ProgramInfo val = new ProgramInfo() { Name = prog.Title, EpisodeTitle = prog.SubTitle, Overview = prog.Description, Audio = ProgramAudio.Stereo, //Hardcode for now (ProgramAudio)item.AudioProps, ChannelId = item.ChanId.ToString(), EndDate = (DateTime)prog.EndTime, StartDate = (DateTime)prog.StartTime, Id = string.Format("StartTime={0}&ChanId={1}", ((DateTime)prog.StartTime).Ticks, item.ChanId), IsSeries = GeneralHelpers.ContainsWord(prog.CatType, "series", StringComparison.OrdinalIgnoreCase), IsMovie = GeneralHelpers.ContainsWord(prog.CatType, "movie", StringComparison.OrdinalIgnoreCase), IsRepeat = prog.Repeat, IsNews = GeneralHelpers.ContainsWord(prog.Category, "news", StringComparison.OrdinalIgnoreCase), IsKids = GeneralHelpers.ContainsWord(prog.Category, "animation", StringComparison.OrdinalIgnoreCase), IsSports = GeneralHelpers.ContainsWord(prog.Category, "sport", StringComparison.OrdinalIgnoreCase) || GeneralHelpers.ContainsWord(prog.Category, "motor sports", StringComparison.OrdinalIgnoreCase) || GeneralHelpers.ContainsWord(prog.Category, "football", StringComparison.OrdinalIgnoreCase) || GeneralHelpers.ContainsWord(prog.Category, "cricket", StringComparison.OrdinalIgnoreCase) }; val.Genres.AddRange(categories); if (!string.IsNullOrWhiteSpace(item.IconURL)) { val.HasImage = true; val.ImageUrl = string.Format("{0}{1}", Plugin.Instance.Configuration.WebServiceUrl, item.IconURL); } else { val.HasImage = false; } ret.Add(val); } } } return(ret); }