Compare commits

...

4 Commits

Author SHA1 Message Date
ZHAAREY
a086da99c0 Merge pull request #68 from MDSVJ/main
Enhanced LRC support by @AAGaming00
2025-06-24 19:19:44 +08:00
ZHAAREY
2ee7b50082 Merge pull request #69 from WorldObservationLog/main
fix: unable to collect information about albums with more than 300 tracks
2025-06-24 19:15:56 +08:00
世界观察日志
5d25210432 fix: unable to collect information about albums with more than 300 tracks 2025-06-24 18:43:41 +08:00
MDSVJ
6940c82d70 Enhanced LRC support by @AAGaming00 2025-06-15 23:46:26 -07:00
2 changed files with 1979 additions and 1976 deletions

60
main.go
View File

@@ -356,36 +356,36 @@ func getMeta(albumId string, token string, storefront string) (*structs.AutoGene
} }
if strings.Contains(albumId, "pl.") { if strings.Contains(albumId, "pl.") {
obj.Data[0].Attributes.ArtistName = "Apple Music" obj.Data[0].Attributes.ArtistName = "Apple Music"
if len(obj.Data[0].Relationships.Tracks.Next) > 0 { }
next = obj.Data[0].Relationships.Tracks.Next if len(obj.Data[0].Relationships.Tracks.Next) > 0 {
for { next = obj.Data[0].Relationships.Tracks.Next
req, err := http.NewRequest("GET", fmt.Sprintf("https://amp-api.music.apple.com/%s&l=%s&include=albums", next, Config.Language), nil) for {
if err != nil { req, err := http.NewRequest("GET", fmt.Sprintf("https://amp-api.music.apple.com/%s&l=%s&include=albums", next, Config.Language), nil)
return nil, err if err != nil {
} return nil, err
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) }
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36") req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
req.Header.Set("Origin", "https://music.apple.com") req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
do, err := http.DefaultClient.Do(req) req.Header.Set("Origin", "https://music.apple.com")
if err != nil { do, err := http.DefaultClient.Do(req)
return nil, err if err != nil {
} return nil, err
defer do.Body.Close() }
if do.StatusCode != http.StatusOK { defer do.Body.Close()
return nil, errors.New(do.Status) if do.StatusCode != http.StatusOK {
} return nil, errors.New(do.Status)
obj2 := new(structs.AutoGeneratedTrack) }
err = json.NewDecoder(do.Body).Decode(&obj2) obj2 := new(structs.AutoGeneratedTrack)
if err != nil { err = json.NewDecoder(do.Body).Decode(&obj2)
return nil, err if err != nil {
} return nil, err
for _, value := range obj2.Data { }
obj.Data[0].Relationships.Tracks.Data = append(obj.Data[0].Relationships.Tracks.Data, value) for _, value := range obj2.Data {
} obj.Data[0].Relationships.Tracks.Data = append(obj.Data[0].Relationships.Tracks.Data, value)
next = obj2.Next }
if len(next) == 0 { next = obj2.Next
break if len(next) == 0 {
} break
} }
} }
} }

View File

@@ -26,7 +26,6 @@ type SongLyrics struct {
} `json:"data"` } `json:"data"`
} }
func Get(storefront, songId, lrcType, language, lrcFormat, token, mediaUserToken string) (string, error) { func Get(storefront, songId, lrcType, language, lrcFormat, token, mediaUserToken string) (string, error) {
if len(mediaUserToken) < 50 { if len(mediaUserToken) < 50 {
return "", errors.New("MediaUserToken not set") return "", errors.New("MediaUserToken not set")
@@ -166,7 +165,7 @@ func conventSyllableTTMLToLRC(ttml string) (string, error) {
return "", err return "", err
} }
var lrcLines []string var lrcLines []string
parseTime := func(timeValue string) (string, error) { parseTime := func(timeValue string, newLine bool) (string, error) {
var h, m, s, ms int var h, m, s, ms int
if strings.Contains(timeValue, ":") { if strings.Contains(timeValue, ":") {
_, err = fmt.Sscanf(timeValue, "%d:%d:%d.%d", &h, &m, &s, &ms) _, err = fmt.Sscanf(timeValue, "%d:%d:%d.%d", &h, &m, &s, &ms)
@@ -183,7 +182,11 @@ func conventSyllableTTMLToLRC(ttml string) (string, error) {
} }
m += h * 60 m += h * 60
ms = ms / 10 ms = ms / 10
return fmt.Sprintf("[%02d:%02d.%02d]", m, s, ms), nil if newLine {
return fmt.Sprintf("[%02d:%02d.%02d]<%02d:%02d.%02d>", m, s, ms, m, s, ms), nil
} else {
return fmt.Sprintf("<%02d:%02d.%02d>", m, s, ms), nil
}
} }
divs := parsedTTML.FindElement("tt").FindElement("body").FindElements("div") divs := parsedTTML.FindElement("tt").FindElement("body").FindElements("div")
//get trans //get trans
@@ -217,11 +220,11 @@ func conventSyllableTTMLToLRC(ttml string) (string, error) {
if lyric.SelectAttr("begin") == nil { if lyric.SelectAttr("begin") == nil {
continue continue
} }
beginTime, err := parseTime(lyric.SelectAttr("begin").Value) beginTime, err := parseTime(lyric.SelectAttr("begin").Value, i == 0)
if err != nil { if err != nil {
return "", err return "", err
} }
endTime, err = parseTime(lyric.SelectAttr("end").Value) endTime, err = parseTime(lyric.SelectAttr("end").Value, false)
if err != nil { if err != nil {
return "", err return "", err
} }