4040import java .io .Closeable ;
4141import java .io .IOException ;
4242import java .util .*;
43+ import java .util .function .Function ;
4344
4445/**
4546 * @author Gianlu
@@ -335,8 +336,8 @@ void enrichWithMetadata(@NotNull TrackOrEpisode metadata) {
335336
336337 private synchronized void enrichWithMetadata (@ NotNull Metadata .Track track ) {
337338 if (state .getTrack () == null ) throw new IllegalStateException ();
338- if (!state .getTrack (). getUri (). equals ( PlayableId . from ( track ). toSpotifyUri () )) {
339- LOGGER .warn ("Failed updating metadata: tracks do not match. {current: {}, expected: {}}" , state .getTrack (). getUri ( ), PlayableId . from (track ). toSpotifyUri ( ));
339+ if (!ProtoUtils . isTrack ( state .getTrack (), track )) {
340+ LOGGER .warn ("Failed updating metadata: tracks do not match. {current: {}, expected: {}}" , ProtoUtils . toString ( state .getTrack ()), ProtoUtils . toString (track ));
340341 return ;
341342 }
342343
@@ -396,8 +397,8 @@ private synchronized void enrichWithMetadata(@NotNull Metadata.Track track) {
396397
397398 private synchronized void enrichWithMetadata (@ NotNull Metadata .Episode episode ) {
398399 if (state .getTrack () == null ) throw new IllegalStateException ();
399- if (!state .getTrack (). getUri (). equals ( PlayableId . from ( episode ). toSpotifyUri () )) {
400- LOGGER .warn ("Failed updating metadata: episodes do not match. {current: {}, expected: {}}" , state .getTrack (). getUri ( ), PlayableId . from (episode ). toSpotifyUri ( ));
400+ if (!ProtoUtils . isEpisode ( state .getTrack (), episode )) {
401+ LOGGER .warn ("Failed updating metadata: episodes do not match. {current: {}, expected: {}}" , ProtoUtils . toString ( state .getTrack ()), ProtoUtils . toString (episode ));
401402 return ;
402403 }
403404
@@ -472,7 +473,15 @@ String transfer(@NotNull TransferStateOuterClass.TransferState cmd) throws AbsSp
472473
473474 PlaybackOuterClass .Playback pb = cmd .getPlayback ();
474475 try {
475- tracksKeeper .initializeFrom (tracks -> ProtoUtils .indexOfTrackByUid (tracks , ps .getCurrentUid ()), pb .getCurrentTrack (), cmd .getQueue ());
476+ tracksKeeper .initializeFrom (tracks -> {
477+ for (int i = 0 ; i < tracks .size (); i ++) {
478+ ContextTrack track = tracks .get (i );
479+ if ((track .hasUid () && ps .getCurrentUid ().equals (track .getUid ())) || ProtoUtils .trackEquals (track , pb .getCurrentTrack ()))
480+ return i ;
481+ }
482+
483+ return -1 ;
484+ }, pb .getCurrentTrack (), cmd .getQueue ());
476485 } catch (IllegalStateException ex ) {
477486 LOGGER .warn ("Failed initializing tracks, falling back to start. {uid: {}}" , ps .getCurrentUid ());
478487 tracksKeeper .initializeStart ();
@@ -848,10 +857,6 @@ public boolean isOk() {
848857 }
849858 }
850859
851- private interface TrackFinder {
852- int find (@ NotNull List <ContextTrack > tracks );
853- }
854-
855860 private static class PlayableIdWithIndex {
856861 private final PlayableId id ;
857862 private final int index ;
@@ -925,14 +930,14 @@ private void updatePrevNextTracks() {
925930
926931 state .clearPrevTracks ();
927932 for (int i = Math .max (0 , index - MAX_PREV_TRACKS ); i < index ; i ++)
928- state .addPrevTracks (ProtoUtils .convertToProvidedTrack (tracks .get (i )));
933+ state .addPrevTracks (ProtoUtils .toProvidedTrack (tracks .get (i )));
929934
930935 state .clearNextTracks ();
931936 for (ContextTrack track : queue )
932- state .addNextTracks (ProtoUtils .convertToProvidedTrack (track ));
937+ state .addNextTracks (ProtoUtils .toProvidedTrack (track ));
933938
934939 for (int i = index + 1 ; i < Math .min (tracks .size (), index + 1 + MAX_NEXT_TRACKS ); i ++)
935- state .addNextTracks (ProtoUtils .convertToProvidedTrack (tracks .get (i )));
940+ state .addNextTracks (ProtoUtils .toProvidedTrack (tracks .get (i )));
936941 }
937942
938943 void updateTrackDuration (int duration ) {
@@ -971,8 +976,8 @@ private void updateLikeDislike() {
971976 * <b>This will also REMOVE a track from the queue if needed. Calling this twice will break the queue.</b>
972977 */
973978 private void updateState () {
974- if (isPlayingQueue ) state .setTrack (ProtoUtils .convertToProvidedTrack (queue .remove ()));
975- else state .setTrack (ProtoUtils .convertToProvidedTrack (tracks .get (getCurrentTrackIndex ())));
979+ if (isPlayingQueue ) state .setTrack (ProtoUtils .toProvidedTrack (queue .remove ()));
980+ else state .setTrack (ProtoUtils .toProvidedTrack (tracks .get (getCurrentTrackIndex ())));
976981
977982 updateLikeDislike ();
978983
@@ -1025,7 +1030,7 @@ synchronized void setQueue(@Nullable List<ContextTrack> prevTracks, @Nullable Li
10251030 synchronized void updateContext (@ NotNull List <ContextPage > updatedPages ) {
10261031 List <ContextTrack > updatedTracks = ProtoUtils .join (updatedPages );
10271032 for (ContextTrack track : updatedTracks ) {
1028- int index = ProtoUtils .indexOfTrackByUri (tracks , track . getUri () );
1033+ int index = ProtoUtils .indexOfTrack (tracks , track );
10291034 if (index == -1 ) continue ;
10301035
10311036 ContextTrack .Builder builder = tracks .get (index ).toBuilder ();
@@ -1058,16 +1063,16 @@ synchronized void initializeStart() throws IOException, MercuryClient.MercuryExc
10581063 setCurrentTrackIndex (0 );
10591064 }
10601065
1061- synchronized void initializeFrom (@ NotNull TrackFinder finder , @ Nullable ContextTrack track , @ Nullable QueueOuterClass .Queue contextQueue ) throws IOException , MercuryClient .MercuryException , AbsSpotifyContext .UnsupportedContextException {
1066+ synchronized void initializeFrom (@ NotNull Function < List < ContextTrack >, Integer > finder , @ Nullable ContextTrack track , @ Nullable QueueOuterClass .Queue contextQueue ) throws IOException , MercuryClient .MercuryException , AbsSpotifyContext .UnsupportedContextException {
10621067 tracks .clear ();
10631068 queue .clear ();
10641069
10651070 while (true ) {
10661071 if (pages .nextPage ()) {
10671072 List <ContextTrack > newTracks = pages .currentPage ();
1068- int index = finder .find (newTracks );
1073+ int index = finder .apply (newTracks );
10691074 if (index == -1 ) {
1070- LOGGER .trace ("Did not find track, going to next page, finder: {}" , finder );
1075+ LOGGER .trace ("Did not find track, going to next page." );
10711076 tracks .addAll (newTracks );
10721077 continue ;
10731078 }
@@ -1076,7 +1081,7 @@ synchronized void initializeFrom(@NotNull TrackFinder finder, @Nullable ContextT
10761081 tracks .addAll (newTracks );
10771082
10781083 setCurrentTrackIndex (index );
1079- LOGGER .trace ("Initialized current track index to {}, finder: {} " , index , finder );
1084+ LOGGER .trace ("Initialized current track index to {}. " , index );
10801085 break ;
10811086 } else {
10821087 cannotLoadMore = true ;
@@ -1111,17 +1116,17 @@ private void enrichCurrentTrack(@NotNull ContextTrack track) {
11111116 ContextTrack .Builder current = tracks .get (index ).toBuilder ();
11121117 ProtoUtils .enrichTrack (current , track );
11131118 tracks .set (index , current .build ());
1114- state .setTrack (ProtoUtils .convertToProvidedTrack (current .build ()));
1119+ state .setTrack (ProtoUtils .toProvidedTrack (current .build ()));
11151120 }
11161121 }
11171122
1118- synchronized void skipTo (@ NotNull String uri ) {
1123+ synchronized void skipTo (@ NotNull ContextTrack track ) {
11191124 if (!queue .isEmpty ()) {
11201125 List <ContextTrack > queueCopy = new ArrayList <>(queue );
11211126
11221127 Iterator <ContextTrack > iterator = queue .iterator ();
11231128 while (iterator .hasNext ()) {
1124- if (Objects . equals (iterator .next (). getUri (), uri )) {
1129+ if (ProtoUtils . trackEquals (iterator .next (), track )) {
11251130 isPlayingQueue = true ;
11261131 updateState ();
11271132 return ;
@@ -1134,15 +1139,15 @@ synchronized void skipTo(@NotNull String uri) {
11341139 queue .addAll (queueCopy );
11351140 }
11361141
1137- int index = ProtoUtils .indexOfTrackByUri (tracks , uri );
1138- if (index == -1 ) throw new IllegalStateException ("Did not find track to skip to: " + uri );
1139-
1140- setCurrentTrackIndex (index );
1141- }
1142+ for (int i = 0 ; i < tracks .size (); i ++) {
1143+ if (ProtoUtils .trackEquals (tracks .get (i ), track )) {
1144+ setCurrentTrackIndex (i );
1145+ enrichCurrentTrack (track );
1146+ return ;
1147+ }
1148+ }
11421149
1143- synchronized void skipTo (@ NotNull ContextTrack track ) {
1144- skipTo (track .getUri ());
1145- enrichCurrentTrack (track );
1150+ throw new IllegalStateException ("Did not find track to skip to: " + ProtoUtils .toString (track ));
11461151 }
11471152
11481153 /**
@@ -1372,6 +1377,7 @@ void addToTracks(int from, @NotNull List<Playlist4ApiProto.Item> items) {
13721377 for (int i = 0 ; i < items .size (); i ++) {
13731378 Playlist4ApiProto .Item item = items .get (i );
13741379 tracks .add (i + from , ContextTrack .newBuilder ()
1380+ .setGid (ByteString .copyFrom (PlayableId .fromUri (item .getUri ()).getGid ()))
13751381 .setUri (item .getUri ())
13761382 .build ());
13771383 }
0 commit comments