public override int DiscoverDynamicCategories() { string data = MyGetWebData(homeUrl); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(data); RssLink home = new RssLink() { Name = "Netflix Home", HasSubCategories = true, Url = homeUrl}; home.SetState(NetflixUtils.HomeCategoriesState); Settings.Categories.Add(home); RssLink myList = new RssLink() { Name = "My List", HasSubCategories = !enableMylListPlayNow, Url = myListUrl }; myList.SetState(NetflixUtils.SinglePageCategoriesState); myList.SetPlayNow(enableMylListPlayNow); myList.SetRememberDiscoveredItems(false); Settings.Categories.Add(myList); if (!IsKidsProfile) { try { Category genres = new Category() { Name = "Browse", HasSubCategories = true, SubCategories = new List<Category>() }; HtmlNodeCollection genreNodes = doc.DocumentNode.SelectNodes("//a[contains(@href, 'netflix.com/WiGenre')]"); if (genreNodes != null) { foreach (HtmlNode a in genreNodes) { RssLink rl = new RssLink() { Name = a.InnerText.Trim(), Url = a.GetAttributeValue("href", ""), HasSubCategories = true, ParentCategory = genres }; rl.SetState(NetflixUtils.MultiplePageCategoriesState); genres.SubCategories.Add(rl); } } genres.SubCategoriesDiscovered = genres.SubCategories.Count > 0; Settings.Categories.Add(genres); } catch { } } RssLink kids = new RssLink() { Name = "Kids", HasSubCategories = true, Url = kidsUrl }; kids.SetState(NetflixUtils.KidsState); Settings.Categories.Add(kids); RssLink profiles = new RssLink() { Name = ProfileCategoryName, HasSubCategories = true }; profiles.SetState(NetflixUtils.ProfilesState); Settings.Categories.Add(profiles); if (enableHelp) { RssLink help = new RssLink() { Name = "Help", HasSubCategories = true }; help.SetState(NetflixUtils.HelpState); Settings.Categories.Add(help); } Settings.DynamicCategoriesDiscovered = Settings.Categories.Count > (enableHelp ? 4 : 3) || IsKidsProfile; return Settings.Categories.Count; }
private List<Category> GetHomeCategories(string data, Category parentCategory) { List<Category> cats = new List<Category>(); Regex rgx = new Regex(@"nf\.constants\.page\.contextData =(.*); }\(netflix\)\);"); Match m = rgx.Match(data); JObject json = null; if (m.Success) { string jsonData = m.Groups[1].Value; json = (JObject)JsonConvert.DeserializeObject(jsonData); } HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(data); try { HtmlNodeCollection mrows = doc.DocumentNode.SelectSingleNode("//div[@class = 'mrows']").SelectNodes("div[contains(@class, 'mrow')]"); foreach (HtmlNode mrow in mrows.Where(mr => mr.GetAttributeValue("class", "") == "mrow" || mr.GetAttributeValue("class", "").Contains("evidence"))) { HtmlNode name = mrow.SelectSingleNode(".//h3"); HtmlNode imageNode = mrow.SelectSingleNode(".//img"); string img = ""; if (imageNode != null) { img = imageNode.GetAttributeValue("src", ""); if (string.IsNullOrEmpty(img)) img = imageNode.GetAttributeValue("hsrc", ""); } RssLink cat = new RssLink() { Name = name.InnerText.Trim(), HasSubCategories = !enableHomePlayNow, Thumb = img, ParentCategory = parentCategory, }; string html = mrow.OuterHtml; if (json != null) { HtmlNode slider = mrow.SelectSingleNode(".//div[starts-with(@id, 'slider_')]"); if (slider != null) { string sliderId = slider.GetAttributeValue("id", ""); JToken initData = json["sliders"]["data"]["initData"].FirstOrDefault(n => n["domId"].Value<string>() == sliderId); if (initData != null) { string remainderHTML = initData["remainderHTML"].Value<string>(); if (!string.IsNullOrEmpty(remainderHTML)) html += remainderHTML; } } } cat.SetData(html); cat.SetState(NetflixUtils.SinglePageCategoriesState); cat.SetPlayNow(enableHomePlayNow); cats.Add(cat); } } catch { } return cats; }