dumb/data/lyrics.go

118 lines
2.5 KiB
Go
Raw Normal View History

package data
2022-06-30 21:32:56 +01:00
import (
"encoding/json"
2022-06-30 21:32:56 +01:00
"fmt"
"strings"
2022-06-30 21:32:56 +01:00
"github.com/PuerkitoBio/goquery"
"github.com/sirupsen/logrus"
2022-06-30 21:32:56 +01:00
)
type Song struct {
2024-03-04 17:41:01 +01:00
Artist string
Title string
Image string
Lyrics string
Credits map[string]string
About [2]string
Album struct {
URL string
Name string
Image string
}
2022-06-30 21:32:56 +01:00
}
type songResponse struct {
Response struct {
Song struct {
ArtistNames string `json:"artist_names"`
Image string `json:"song_art_image_thumbnail_url"`
Title string
Description struct {
Plain string
}
Album struct {
2024-03-04 17:41:01 +01:00
URL string `json:"url"`
Name string `json:"name"`
Image string `json:"cover_art_url"`
}
CustomPerformances []customPerformance `json:"custom_performances"`
}
}
}
type customPerformance struct {
Label string
Artists []struct {
Name string
}
}
func (s *Song) parseLyrics(doc *goquery.Document) {
2022-06-30 21:32:56 +01:00
doc.Find("[data-lyrics-container='true']").Each(func(i int, ss *goquery.Selection) {
h, err := ss.Html()
if err != nil {
logrus.Errorln("unable to parse lyrics", err)
2022-06-30 21:32:56 +01:00
}
s.Lyrics += h
2022-06-30 21:32:56 +01:00
})
}
func (s *Song) parseSongData(doc *goquery.Document) {
attr, exists := doc.Find("meta[property='twitter:app:url:iphone']").Attr("content")
2022-06-30 21:32:56 +01:00
if exists {
songID := strings.Replace(attr, "genius://songs/", "", 1)
u := fmt.Sprintf("https://genius.com/api/songs/%s?text_format=plain", songID)
2022-06-30 21:32:56 +01:00
res, err := sendRequest(u)
if err != nil {
logrus.Errorln(err)
}
2022-06-30 21:32:56 +01:00
defer res.Body.Close()
var data songResponse
decoder := json.NewDecoder(res.Body)
err = decoder.Decode(&data)
if err != nil {
logrus.Errorln(err)
}
songData := data.Response.Song
s.Artist = songData.ArtistNames
s.Image = songData.Image
s.Title = songData.Title
s.About[0] = songData.Description.Plain
s.About[1] = truncateText(songData.Description.Plain)
s.Credits = make(map[string]string)
2024-03-04 17:41:01 +01:00
s.Album.Name = songData.Album.Name
s.Album.URL = strings.Replace(songData.Album.URL, "https://genius.com", "", -1)
s.Album.Image = ExtractImageURL(songData.Album.Image)
for _, perf := range songData.CustomPerformances {
var artists []string
for _, artist := range perf.Artists {
artists = append(artists, artist.Name)
}
s.Credits[perf.Label] = strings.Join(artists, ", ")
}
}
}
func truncateText(text string) string {
textArr := strings.Split(text, "")
if len(textArr) > 250 {
return strings.Join(textArr[0:250], "") + "..."
}
return text
}
func (s *Song) Parse(doc *goquery.Document) {
2022-06-30 21:32:56 +01:00
s.parseLyrics(doc)
s.parseSongData(doc)
2022-06-30 21:32:56 +01:00
}