66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package data
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/PuerkitoBio/goquery"
|
|
"github.com/rramiachraf/dumb/utils"
|
|
)
|
|
|
|
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: utils.TrimURL(album.URL),
|
|
})
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *Artist) Parse(doc *goquery.Document) error {
|
|
return a.parseArtistData(doc)
|
|
}
|