public static SongInfo GetSongByKey(string key) { string url = BEATSAVER_DETAILS_BASE_URL + key; string pageText = ""; BeatSaverSong song = new BeatSaverSong(); try { var pageTask = WebUtils.TryGetStringAsync(url); pageTask.Wait(); pageText = pageTask.Result; if (string.IsNullOrEmpty(pageText)) { Logger.Warning($"Unable to get web page at {url}"); return(null); } } catch (HttpRequestException) { Logger.Error($"HttpRequestException while trying to populate fields for {key}"); return(null); } catch (AggregateException ae) { ae.WriteExceptions($"Exception while trying to get details for {key}"); } catch (Exception ex) { Logger.Exception("Exception getting page", ex); } song = ParseSongsFromPage(pageText).FirstOrDefault(); song.ScrapedAt = DateTime.Now; return(ScrapedDataProvider.GetOrCreateSong(song)); }
/// <summary> /// Creates a SongInfo from a JObject. Sets the ScrapedAt time for the song. /// </summary> /// <param name="song"></param> /// <returns></returns> public static BeatSaverSong ParseSongFromJson(JObject song) { //JSONObject song = (JSONObject) aKeyValue; string songIndex = song["key"]?.Value <string>(); string songName = song["name"]?.Value <string>(); string author = song["uploader"]?["username"]?.Value <string>(); string songUrl = "https://beatsaver.com/download/" + songIndex; if (BeatSaverSong.TryParseBeatSaver(song, out BeatSaverSong newSong)) { newSong.ScrapedAt = DateTime.Now; SongInfo songInfo = ScrapedDataProvider.GetOrCreateSong(newSong); songInfo.BeatSaverInfo = newSong; return(newSong); } else { if (!(string.IsNullOrEmpty(songIndex))) { // TODO: look at this Logger.Warning($"Couldn't parse song {songIndex}, skipping.");// using sparse definition."); //return new SongInfo(songIndex, songName, songUrl, author); } else { Logger.Error("Unable to identify song, skipping"); } } return(null); }
public void TryParseBeatSaverTest() { string jsonStr = File.ReadAllText("test_detail_page.json"); JToken singleSong = JToken.Parse(jsonStr); bool successful = BeatSaverSong.TryParseBeatSaver(singleSong, out BeatSaverSong song); Console.WriteLine($"{song.name}"); Assert.IsTrue(successful); }
private void LoadSongsFromBeatSaver(HtmlDocument pageDocument) { try { var SongList = pageDocument.DocumentNode.SelectNodes("(//div[contains(@style,'margin-bottom: 15px;')])"); foreach (var song in SongList) { string SongName = "", PictureSrc = "", BeatSaverUrl = "", DownloadLink = "", Downloads = ""; var HeaderNode = song.Descendants("h2").FirstOrDefault(); if (HeaderNode != null) { SongName = WebUtility.HtmlDecode(HeaderNode.InnerText.Trim()); BeatSaverUrl = HeaderNode.Descendants("a").FirstOrDefault().GetAttributeValue("href", "null"); } var PictureSrcNode = song.Descendants("img").FirstOrDefault(); if (PictureSrcNode != null) { PictureSrc = PictureSrcNode.GetAttributeValue("src", "null"); } var DownloadLinkNode = song.Descendants("a").Where(d => d.InnerText == "Download Zip").FirstOrDefault(); if (DownloadLinkNode != null) { DownloadLink = DownloadLinkNode.GetAttributeValue("href", "null"); } var AddBeatSaverSong = new BeatSaverSong { PictureSrc = PictureSrc, SongName = SongName, BeatSaverUrl = BeatSaverUrl, DownloadLink = DownloadLink }; BeatSaverSongsList.Add(AddBeatSaverSong); } } catch { } }