paginate large playlists

This commit is contained in:
Laptop
2024-09-15 13:10:11 +03:00
parent 41e7a70b94
commit 9bfd873c9c
8 changed files with 73 additions and 24 deletions

View File

@@ -468,36 +468,21 @@ func (p Playlist) FormatDescription() string {
return desc
}
type missingtrack struct {
type MissingTrack struct {
ID int64
Index int
}
func (p *Playlist) GetMissingTracks() error {
func GetTracks(ids string) ([]Track, error) {
cid, err := GetClientID()
if err != nil {
return err
}
missing := []missingtrack{}
for i, track := range p.Tracks {
if track.Title == "" {
missing = append(missing, missingtrack{ID: track.ID, Index: i})
}
}
var st string
for i, track := range missing {
st += strconv.FormatInt(track.ID, 10)
if i != len(missing)-1 {
st += ","
}
return nil, err
}
req := fasthttp.AcquireRequest()
defer fasthttp.ReleaseRequest(req)
req.SetRequestURI("https://api-v2.soundcloud.com/tracks?ids=" + st + "&client_id=" + cid)
req.SetRequestURI("https://api-v2.soundcloud.com/tracks?ids=" + ids + "&client_id=" + cid)
req.Header.Set("User-Agent", cfg.UserAgent)
req.Header.Set("Accept-Encoding", "gzip, deflate, br, zstd")
@@ -506,7 +491,7 @@ func (p *Playlist) GetMissingTracks() error {
err = DoWithRetry(req, resp)
if err != nil {
return err
return nil, err
}
data, err := resp.BodyUncompressed()
@@ -516,6 +501,49 @@ func (p *Playlist) GetMissingTracks() error {
var res []Track
err = cfg.JSON.Unmarshal(data, &res)
return res, err
}
func JoinMissingTracks(missing []MissingTrack) (st string) {
for i, track := range missing {
st += strconv.FormatInt(track.ID, 10)
if i != len(missing)-1 {
st += ","
}
}
return
}
func GetMissingTracks(missing []MissingTrack) (res []Track, next []MissingTrack, err error) {
if len(missing) > 50 {
next = missing[50:]
missing = missing[:50]
}
res, err = GetTracks(JoinMissingTracks(missing))
return
}
func GetNextMissingTracks(raw string) (res []Track, next []string, err error) {
missing := strings.Split(raw, ",")
if len(missing) > 50 {
next = missing[50:]
missing = missing[:50]
}
res, err = GetTracks(strings.Join(missing, ","))
return
}
func (p *Playlist) GetMissingTracks() error {
missing := []MissingTrack{}
for i, track := range p.Tracks {
if track.Title == "" {
missing = append(missing, MissingTrack{ID: track.ID, Index: i})
}
}
res, next, err := GetMissingTracks(missing)
if err != nil {
return err
}
@@ -528,5 +556,7 @@ func (p *Playlist) GetMissingTracks() error {
}
}
p.MissingTracks = JoinMissingTracks(next)
return nil
}

View File

@@ -98,4 +98,6 @@ type Playlist struct {
Album bool `json:"is_album"`
Author User `json:"user"`
Tracks []Track `json:"tracks"`
MissingTracks string `json:"-"`
}