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);
            }
        }
예제 #2
0
        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);
        }
예제 #4
0
 public static void SaveShortAlbumInfo(ShortAlbumInfo info)
 {
     JsonCacheUtils.SaveIntoJsonCache(info, ShortAlbumClz, info.Id);
 }