/// <summary> /// Gets a comic from a comic archive entry /// </summary> /// <param name="comicArchiveEntry">Comic archive entry</param> /// <returns>Comic object</returns> public static Comic GetComic(ComicArchiveEntry comicArchiveEntry) { Comic comic = XkcdDatabase.GetComic(comicArchiveEntry.Id); if (comic != null) { return(comic); } var permaLink = $"https://xkcd.com/{comicArchiveEntry.Id}/"; var web = new HtmlWeb(); HtmlDocument doc = web.Load(permaLink); return(GetComic(comicArchiveEntry, permaLink, doc)); }
/// <summary> /// Gets a comic from a comic archive entry, comic url, and html document /// </summary> /// <param name="comicArchiveEntry">Comic archive entry</param> /// <param name="url">Comic permalink</param> /// <param name="doc">Comic webpage html document</param> /// <returns>Comic object</returns> private static Comic GetComic(ComicArchiveEntry comicArchiveEntry, string url, HtmlDocument doc) { string imageUrl = string.Empty; string altText = string.Empty; switch (comicArchiveEntry.Id) { case 1350: imageUrl = "https://imgs.xkcd.com/comics/shouldnt_be_hard.png"; altText = "Every choice, no matter how small, begins a new story."; break; case 1416: imageUrl = "https://imgs.xkcd.com/comics/pixels.png"; altText = "It's turtles all the way down."; break; case 1506: imageUrl = "https://imgs.xkcd.com/comics/xkcloud.png"; altText = string.Empty; // No alt text for this comic break; case 1525: imageUrl = "https://imgs.xkcd.com/comics/emojic_8_ball.png"; altText = string.Empty; // No alt text for this comic break; case 1608: // This comic is interactive, and difficult. // TODO: I should find a better way to display this one imageUrl = string.Empty; altText = string.Empty; break; case 1663: imageUrl = string.Empty; // Interactive with no static image altText = "Relax"; break; case 2067: imageUrl = "https://imgs.xkcd.com/comics/challengers.png"; altText = "Use your mouse or fingers to pan + zoom. To edit the map, submit your ballot on November 6th."; break; case 2198: imageUrl = "https://imgs.xkcd.com/comics/throw.png"; altText = "The keys to successfully throwing a party are location, planning, and one of those aircraft carrier steam catapults."; break; default: HtmlNode comicNode = doc.DocumentNode.Descendants().Where(y => y.Id == "comic").FirstOrDefault(); HtmlNode comicImageNode = comicNode.Descendants().Where(x => x.Name == "img").FirstOrDefault(); if (comicImageNode != null) { if (comicImageNode.Attributes["src"] != null) { imageUrl = $"https:{comicImageNode.Attributes["src"].DeEntitizeValue}"; } if (comicImageNode.Attributes["title"] != null) { altText = comicImageNode.Attributes["title"].DeEntitizeValue; } } break; } var comic = new Comic { Id = comicArchiveEntry.Id, ImageUrl = imageUrl, AltText = altText, Title = comicArchiveEntry.Title, PermaLink = url, Date = comicArchiveEntry.Date }; XkcdDatabase.InsertOrUpdateComic(comic); return(comic); }
/// <summary> /// Gets the first comic (ID=1) /// </summary> /// <returns>The first comic</returns> public static Comic GetFirstComic() { ComicArchiveEntry first = ComicDictionary.OrderBy(x => x.Key).FirstOrDefault().Value; return(GetComic(first)); }
/// <summary> /// Gets the latest comic /// </summary> /// <returns>The latest comic</returns> public static Comic GetLatestComic() { ComicArchiveEntry latest = ComicDictionary.OrderByDescending(x => x.Key).FirstOrDefault().Value; return(GetComic(latest)); }