@@ -133,9 +133,13 @@ private void handleFrame(@NotNull Spirc.MessageType type, @NotNull Spirc.Frame s
133133 handleSeek (frame .value .getAsInt ());
134134 break ;
135135 case kMessageTypeReplace :
136- if (frame != null && frame .endpoint == Remote3Frame .Endpoint .UpdateContext ) {
137- updatedTracks (frame );
136+ if (frame == null ) break ;
137+
138+ if (frame .endpoint == Remote3Frame .Endpoint .UpdateContext ) {
139+ updateContext (frame );
138140 stateUpdated ();
141+ } else if (frame .endpoint == Remote3Frame .Endpoint .SetQueue ) {
142+ updateTracks (frame );
139143 }
140144 break ;
141145 case kMessageTypeRepeat :
@@ -268,9 +272,14 @@ private void handleSeek(int pos) {
268272 stateUpdated ();
269273 }
270274
271- private void updatedTracks (@ NotNull Remote3Frame frame ) {
275+ private void updateTracks (@ NotNull Remote3Frame frame ) {
276+ state .updateTracks (frame );
277+ stateUpdated ();
278+ }
279+
280+ private void updateContext (@ NotNull Remote3Frame frame ) {
272281 if (frame .context .uri != null ) {
273- state .update (frame );
282+ state .updateContext (frame );
274283
275284 String context = frame .context .uri ;
276285 if (context .startsWith ("spotify:station:" ) || context .startsWith ("spotify:dailymix:" ))
@@ -369,7 +378,7 @@ private void handleLoad(@NotNull Remote3Frame frame) {
369378
370379 LOGGER .debug (String .format ("Loading context, uri: %s" , frame .context .uri ));
371380
372- updatedTracks (frame );
381+ updateContext (frame );
373382
374383 if (state .getTrackCount () > 0 ) {
375384 state .setPositionMs (frame .options .seekTo == -1 ? 0 : frame .options .seekTo );
@@ -466,7 +475,7 @@ private void loadAutoplay() {
466475
467476 try {
468477 MercuryRequests .StationsWrapper json = session .mercury ().sendSync (MercuryRequests .getStationFor (context ));
469- state .update (json );
478+ state .updateContext (json );
470479
471480 state .setPositionMs (0 );
472481 state .setPositionMeasuredAt (TimeProvider .currentTimeMillis ());
@@ -608,7 +617,31 @@ void seekTo(@Nullable String uri) {
608617 state .setPlayingTrackIndex (pos );
609618 }
610619
611- void update (@ NotNull Remote3Frame frame ) {
620+ void updateTracks (@ NotNull Remote3Frame frame ) {
621+ if (state .getTrackCount () == 0 ) {
622+ LOGGER .warn ("Couldn't update tracks, there are none right now!" );
623+ return ;
624+ }
625+
626+ Spirc .TrackRef current = state .getTrack (state .getPlayingTrackIndex ());
627+ state .clearTrack ();
628+
629+ if (frame .prevTracks != null ) {
630+ for (Remote3Track track : frame .prevTracks )
631+ track .addToState (state );
632+ }
633+
634+ if (current != null )
635+ state .addTrack (current );
636+ state .setPlayingTrackIndex (state .getTrackCount () - 1 );
637+
638+ if (frame .nextTracks != null ) {
639+ for (Remote3Track track : frame .nextTracks )
640+ track .addToState (state );
641+ }
642+ }
643+
644+ void updateContext (@ NotNull Remote3Frame frame ) {
612645 if (frame .context == null )
613646 throw new IllegalArgumentException ("Invalid frame received!" );
614647
@@ -644,7 +677,7 @@ void update(@NotNull Remote3Frame frame) {
644677 List <Remote3Track > tracks = frame .context .pages .get (pageIndex ).tracks ;
645678 for (int i = 0 ; i < tracks .size (); i ++) {
646679 Remote3Track track = tracks .get (i );
647- state . addTrack ( track .toTrackRef () );
680+ track .addToState ( state );
648681
649682 if (Objects .equals (trackUid , track .uri ) || Objects .equals (trackUid , track .uid ))
650683 index = i ;
@@ -664,7 +697,7 @@ void update(@NotNull Remote3Frame frame) {
664697 return ;
665698 }
666699
667- for (Remote3Track track : tracks ) state . addTrack ( track .toTrackRef () );
700+ for (Remote3Track track : tracks ) track .addToState ( state );
668701
669702 if (frame .options != null && frame .options .skipTo != null && frame .options .skipTo .trackIndex != -1 )
670703 state .setPlayingTrackIndex (frame .options .skipTo .trackIndex );
@@ -678,7 +711,7 @@ void update(@NotNull Remote3Frame frame) {
678711 }
679712 }
680713
681- void update (@ NotNull MercuryRequests .StationsWrapper json ) {
714+ void updateContext (@ NotNull MercuryRequests .StationsWrapper json ) {
682715 state .setContextUri (json .uri ());
683716
684717 state .setPlayingTrackIndex (0 );
@@ -717,5 +750,7 @@ void setPlayingTrackIndex(int i) {
717750 int getTrackCount () {
718751 return state .getTrackCount ();
719752 }
753+
754+
720755 }
721756}
0 commit comments