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 async Task <IEnumerable <ShortBandInfo> > SearchBand(
            string search,
            CancellationToken token = default
            )
        {
            var cached = WimpCache.ReadSearchBand(search);

            if (cached != null)
            {
                return(cached);
            }

            var results = await Utils.WithRetry(async() => {
                var url  = WimpUris.GetArtistsSearchUrl(search);
                var html = await SeleniumRequests.GetHtml(url, token);

                return(WimpHtmlParsing.BandsInfoFromSearchResults(html).ToArray());
            }, token);

            WimpCache.SaveSearchBand(search, results);

            return(results);
        }