public async ValueTask <MuzlanResponse <IList <ArtistRecord> > > ListPopularArtists(CancellationToken token = default) { var pageUri = _baseUri; try { var content = await _client.TryGetStringAsync(pageUri, token).ConfigureAwait(false); using var document = await _parser.ParseDocumentAsync(content, token).ConfigureAwait(false); var artists = new List <ArtistRecord>(); foreach (var artistElement in document.QuerySelectorAll <IHtmlDivElement>("div.page-content div.row-col div div.padding div.row div div.item")) { var anchor = artistElement.QuerySelector <IHtmlAnchorElement>("div.item-info div.item-title.text-ellipsis a"); var image = artistElement.QuerySelector <IHtmlImageElement>("div.item-media a.item-media-content img.lazy.img-responsive"); var name = anchor.Text.Trim(); var artistUri = new Uri($"https://{_baseUri.DnsSafeHost}/artist/{Uri.EscapeDataString(name)}"); var searchUri = new Uri($"https://{_baseUri.DnsSafeHost}{anchor.PathName}"); var imageUri = new Uri($"https://{_baseUri.DnsSafeHost}{image.Dataset["original"]}"); var artist = new ArtistRecord(name, artistUri, searchUri, imageUri); artists.Add(artist); } return(MuzlanResponse <IList <ArtistRecord> > .FromResult(artists, pageUri)); } catch (Exception ex) { return(MuzlanResponse <IList <ArtistRecord> > .FromException(ex, pageUri)); } }
public async ValueTask <MuzlanResponse <IList <SearchArtistRecord> > > FindArtists( string query, CancellationToken token = default) { var pageUri = new Uri($"https://{_baseUri.DnsSafeHost}/search/{Uri.EscapeDataString(query)}"); try { var content = await _client.TryGetStringAsync( pageUri, token).ConfigureAwait(false); using var document = await _parser.ParseDocumentAsync(content, token).ConfigureAwait(false); var artists = new List <SearchArtistRecord>(); foreach (var artistElement in document.QuerySelectorAll <IHtmlDivElement>("div.page-content div.row-col div.row.item-list:not(#search-result-items)")) { var imageElement = artistElement.QuerySelector <IHtmlAnchorElement>("div.item-media a.item-media-content"); var titleElement = artistElement.QuerySelector <IHtmlAnchorElement>("div.item-info div.item-title.text-ellipsis a"); var descriptionElement = artistElement.QuerySelector <IHtmlDivElement>("div.item-info div.item-except"); var artistName = titleElement.Text.Trim(); var artistUri = new Uri($"https://{_baseUri.DnsSafeHost}/artist/{Uri.EscapeDataString(query)}"); var artistSearchUri = new Uri($"https://{_baseUri.DnsSafeHost}/search/{Uri.EscapeDataString(query)}"); var match = _bgImageRegex.Match(imageElement.OuterHtml); var artistImageUri = new Uri($"https://{_baseUri.DnsSafeHost}{match.Groups[1].Value}"); var description = string.IsNullOrEmpty(descriptionElement.TextContent) ? string.Empty : descriptionElement.TextContent.Trim(); var tags = new List <TagRecord>(); foreach (var tagElement in artistElement.QuerySelectorAll <IHtmlAnchorElement>("div.item-info div.item-meta a.btn")) { var tagName = tagElement.Text.Trim(); var tagUri = new Uri($"https://{_baseUri.DnsSafeHost}{tagElement.PathName}"); tags.Add(new TagRecord(tagName, tagUri)); } var artist = new ArtistRecord(artistName, artistUri, artistSearchUri, artistImageUri); artists.Add(new SearchArtistRecord(artist, tags, description)); } return(MuzlanResponse <IList <SearchArtistRecord> > .FromResult(artists, pageUri)); } catch (Exception ex) { return(MuzlanResponse <IList <SearchArtistRecord> > .FromException(ex, pageUri)); } }