package data import ( "encoding/json" "strings" "github.com/PuerkitoBio/goquery" ) type ArtistPreview struct { Name string URL string } type Artist struct { Name string Description string Albums []AlbumPreview Image string } type artistMetadata struct { Artist struct { Id int `json:"id"` Name string `json:"name"` Description string `json:"description_preview"` Image string `json:"image_url"` } Albums []struct { Id int `json:"id"` Image string `json:"cover_art_thumbnail_url"` Name string `json:"name"` URL string `json:"url"` } `json:"artist_albums"` } func (a *Artist) parseArtistData(doc *goquery.Document) error { pageMetadata, exists := doc.Find("meta[itemprop='page_data']").Attr("content") if !exists { return nil } var artistMetadataFromPage artistMetadata if err := json.Unmarshal([]byte(pageMetadata), &artistMetadataFromPage); err != nil { return err } a.Name = artistMetadataFromPage.Artist.Name a.Description = artistMetadataFromPage.Artist.Description a.Image = artistMetadataFromPage.Artist.Image for _, album := range artistMetadataFromPage.Albums { a.Albums = append(a.Albums, AlbumPreview{ Name: album.Name, Image: album.Image, URL: strings.Replace(album.URL, "https://genius.com", "", -1), }) } return nil } func (a *Artist) Parse(doc *goquery.Document) error { return a.parseArtistData(doc) }