Skip to content

Commit

Permalink
fix: reload context if client didn't send the entire playlist #70
Browse files Browse the repository at this point in the history
  • Loading branch information
tooxo authored and devgianlu committed Aug 18, 2024
1 parent 84b3c3f commit da0644f
Showing 1 changed file with 31 additions and 1 deletion.
32 changes: 31 additions & 1 deletion spclient/context_resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import (
librespot "github.com/devgianlu/go-librespot"
connectpb "github.com/devgianlu/go-librespot/proto/spotify/connectstate"
log "github.com/sirupsen/logrus"
"golang.org/x/exp/maps"
"io"
"strconv"
"strings"
)

Expand All @@ -17,9 +19,36 @@ type ContextResolver struct {
ctx *connectpb.Context
}

func isTracksComplete(ctx *connectpb.Context) bool {
expectedNumberOfTracks := -1
var err error = nil
for _, key := range maps.Keys(ctx.Metadata) {
if key == "playlist_number_of_tracks" {
expectedNumberOfTracks, err = strconv.Atoi(ctx.Metadata[key])
break
}
}

// this method should not result in errors, it's just a "guess"
if err != nil || expectedNumberOfTracks < 0 {
return true
}

totalLength := 0
for _, page := range ctx.Pages {
totalLength += len(page.Tracks)
if len(page.NextPageUrl) != 0 {
return true
}
}

return expectedNumberOfTracks == totalLength
}

func NewContextResolver(sp *Spclient, ctx *connectpb.Context) (_ *ContextResolver, err error) {
typ := librespot.InferSpotifyIdTypeFromContextUri(ctx.Uri)
if len(ctx.Pages) == 0 {

if len(ctx.Pages) == 0 || !isTracksComplete(ctx) {
ctx, err = sp.ContextResolve(ctx.Uri)
if err != nil {
return nil, fmt.Errorf("failed resolving context %s: %w", ctx.Uri, err)
Expand Down Expand Up @@ -100,6 +129,7 @@ func (r *ContextResolver) Page(idx int) ([]*connectpb.ContextTrack, error) {
for idx >= len(r.ctx.Pages) {
lastPage := r.ctx.Pages[len(r.ctx.Pages)-1]
if len(lastPage.NextPageUrl) == 0 {

return nil, io.EOF
}

Expand Down

0 comments on commit da0644f

Please sign in to comment.