public async void Init(ShortAlbumInfo info) { this.ShortInfo = info; var detailedInfo = await App.InfoProvider.GetDetailedAlbumInfo(info); this.DetailedInfo = detailedInfo; this.Tracks.Clear(); foreach (var track in detailedInfo.Tracks) { this.Tracks.Add(track); } }
public static DetailedAlbumInfo AlbumInfoFromDetailsPage(string html, ShortAlbumInfo info) { var documentNode = GetDocumentNode(html) ?? throw new ArgumentNullException("documentNode"); var header = documentNode.QuerySelector("div.album-header__metadata.js-album-header__metadata") ?? throw new ArgumentNullException("header"); var title = header.QuerySelector("h1.js-title.album-header__title.h2") .GetAttributeValue("title", null) ?? throw new ArgumentNullException("title"); var artistHeader = header.QuerySelector("h2.album-header__artist-name.h6"); var artistNameContainer = artistHeader.QuerySelector("a") ?? artistHeader; // a is null for 'Various Artists' //TODO also artist URL? var artist = artistNameContainer.InnerText; var releaseYear = header.QuerySelector("div.album-header__release-year").InnerText; var tracksNumberDiv = header.QuerySelector("div.album-header__number-of-tracks"); var numberOfTracks = tracksNumberDiv.QuerySelector("span[data-bind=numberOfTracks]").InnerText; var totalDuration = tracksNumberDiv.QuerySelector("span[data-bind=duration]") .InnerText .TrimStart('(') .TrimEnd(')'); var tracksTableBody = documentNode.QuerySelector(TracksTableBodySelector) ?? throw new ArgumentNullException("tracksTableBody"); var tracks = GetTracks(tracksTableBody); //FIXME can return null so needs reattempts / waiting till the end var copyright = documentNode.QuerySelector("small.album__copyright").InnerText; var imageA = documentNode.QuerySelector("div.image.image--main.image--album.js-album-cover > a"); var largeImageStr = imageA.GetAttributeValue("href", null) ?? throw new ArgumentNullException("href"); var largeImageUrl = new Uri(largeImageStr); var smallImageStr = imageA.QuerySelector("img").GetAttributeValue("src", null) ?? throw new ArgumentNullException("src"); var smallImageUrl = new Uri(smallImageStr); return(new DetailedAlbumInfo(info, tracks, title, artist, releaseYear, totalDuration, copyright, smallImageUrl, largeImageUrl)); }
public async Task <DetailedAlbumInfo> GetDetailedAlbumInfo(ShortAlbumInfo info) { var cached = WimpCache.ReadDetailedAlbumInfo(info.Id); if (cached != null) { return(cached); } var parsed = await Utils.WithRetry(async() => { var html = await SeleniumRequests.GetHtml(info.Url, CancellationToken.None); return(WimpHtmlParsing.AlbumInfoFromDetailsPage(html, info)); }); WimpCache.SaveDetailedAlbumInfo(parsed); return(parsed); }
public static void SaveShortAlbumInfo(ShortAlbumInfo info) { JsonCacheUtils.SaveIntoJsonCache(info, ShortAlbumClz, info.Id); }