2424import java .io .IOException ;
2525import java .util .List ;
2626import java .util .Objects ;
27+ import java .util .Optional ;
2728
2829/**
2930 * @author Gianlu
@@ -128,7 +129,7 @@ private void handleFrame(@NotNull Spirc.MessageType type, @NotNull Spirc.Frame s
128129 break ;
129130 case kMessageTypeReplace :
130131 if (frame != null && frame .endpoint == Remote3Frame .Endpoint .UpdateContext ) {
131- updatedTracks (frame );
132+ updatedTracks (frame , true );
132133 stateUpdated ();
133134 }
134135 break ;
@@ -236,14 +237,14 @@ private int getPosition() {
236237 }
237238
238239 private void handleShuffle () {
239- if (state .getShuffle ()) shuffleTracks ();
240+ if (state .getShuffle ()) shuffleTracks (false );
240241 else unshuffleTracks ();
241242 stateUpdated ();
242243 }
243244
244- private void shuffleTracks () {
245+ private void shuffleTracks (boolean fully ) {
245246 if (tracksProvider instanceof PlaylistProvider )
246- ((PlaylistProvider ) tracksProvider ).shuffleTracks (session .random ());
247+ ((PlaylistProvider ) tracksProvider ).shuffleTracks (session .random (), fully );
247248 else
248249 LOGGER .warn ("Cannot shuffle TracksProvider: " + tracksProvider );
249250 }
@@ -262,7 +263,7 @@ private void handleSeek(int pos) {
262263 stateUpdated ();
263264 }
264265
265- private void updatedTracks (@ NotNull Remote3Frame frame ) {
266+ private void updatedTracks (@ NotNull Remote3Frame frame , boolean fromFrame ) {
266267 if (frame .context .uri != null ) {
267268 state .update (frame );
268269
@@ -273,9 +274,16 @@ private void updatedTracks(@NotNull Remote3Frame frame) {
273274 tracksProvider = new PlaylistProvider (session , state .state , conf );
274275 }
275276
276- state .setRepeat (frame .options .playerOptionsOverride .repeatingContext );
277- state .setShuffle (frame .options .playerOptionsOverride .shufflingContext );
278- if (state .getShuffle () && conf .defaultUnshuffleBehaviour ()) shuffleTracks ();
277+ Optional .ofNullable (frame .options .playerOptionsOverride .repeatingContext ).ifPresent (state ::setRepeat );
278+ Optional .ofNullable (frame .options .playerOptionsOverride .shufflingContext ).ifPresent (state ::setShuffle );
279+
280+ if (fromFrame ) {
281+ if (state .getShuffle () && conf .defaultUnshuffleBehaviour ())
282+ shuffleTracks (true );
283+ } else {
284+ if (state .getShuffle ())
285+ shuffleTracks (true );
286+ }
279287 }
280288
281289 @ Override
@@ -351,10 +359,10 @@ private void handleLoad(@NotNull Remote3Frame frame) {
351359
352360 LOGGER .debug (String .format ("Loading context, uri: %s" , frame .context .uri ));
353361
354- updatedTracks (frame );
362+ updatedTracks (frame , frame . context . pages != null );
355363
356364 if (state .getTrackCount () > 0 ) {
357- state .setPositionMs (frame .options .seekTo );
365+ state .setPositionMs (frame .options .seekTo == - 1 ? 0 : frame . options . seekTo );
358366 state .setPositionMeasuredAt (TimeProvider .currentTimeMillis ());
359367 loadTrack (!frame .options .initiallyPaused );
360368 } else {
@@ -613,15 +621,15 @@ void update(@NotNull Remote3Frame frame) {
613621
614622 for (Remote3Track track : tracks ) state .addTrack (track .toTrackRef ());
615623
616- if (frame .options != null && frame .options .skipTo != null )
624+ if (frame .options != null && frame .options .skipTo != null && frame . options . skipTo . trackIndex != - 1 )
617625 state .setPlayingTrackIndex (frame .options .skipTo .trackIndex );
618626 else
619627 state .setPlayingTrackIndex (0 );
620628 }
621629
622630 if (frame .options != null && frame .options .playerOptionsOverride != null ) {
623- state . setRepeat (frame .options .playerOptionsOverride .repeatingContext );
624- state . setShuffle (frame .options .playerOptionsOverride .shufflingContext );
631+ Optional . ofNullable (frame .options .playerOptionsOverride .repeatingContext ). ifPresent ( state :: setRepeat );
632+ Optional . ofNullable (frame .options .playerOptionsOverride .shufflingContext ). ifPresent ( state :: setShuffle );
625633 }
626634 }
627635
0 commit comments