Skip to content

Commit 57260a1

Browse files
committed
Fixed issue when loading artist's songs from Android
1 parent ff3305f commit 57260a1

4 files changed

Lines changed: 51 additions & 33 deletions

File tree

core/src/main/java/xyz/gianlu/librespot/player/Player.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package xyz.gianlu.librespot.player;
22

3+
import com.google.gson.JsonObject;
34
import com.google.gson.JsonParser;
45
import com.google.gson.JsonSyntaxException;
56
import org.apache.log4j.Logger;
@@ -12,11 +13,13 @@
1213
import xyz.gianlu.librespot.core.TimeProvider;
1314
import xyz.gianlu.librespot.mercury.MercuryClient;
1415
import xyz.gianlu.librespot.mercury.MercuryRequests;
16+
import xyz.gianlu.librespot.mercury.RawMercuryRequest;
1517
import xyz.gianlu.librespot.mercury.model.EpisodeId;
1618
import xyz.gianlu.librespot.mercury.model.PlayableId;
1719
import xyz.gianlu.librespot.mercury.model.TrackId;
1820
import xyz.gianlu.librespot.player.codecs.AudioQuality;
1921
import xyz.gianlu.librespot.player.remote.Remote3Frame;
22+
import xyz.gianlu.librespot.player.remote.Remote3Page;
2023
import xyz.gianlu.librespot.player.remote.Remote3Track;
2124
import xyz.gianlu.librespot.player.tracks.PlaylistProvider;
2225
import xyz.gianlu.librespot.player.tracks.ShowProvider;
@@ -27,6 +30,7 @@
2730

2831
import java.io.Closeable;
2932
import java.io.IOException;
33+
import java.io.InputStreamReader;
3034
import java.util.List;
3135
import java.util.Objects;
3236
import java.util.Optional;
@@ -697,7 +701,7 @@ void updateContext(@NotNull Remote3Frame frame) {
697701
throw new IllegalArgumentException("Invalid frame received!");
698702

699703
String oldPlayingUri = null;
700-
if (state.getTrackCount() > 0) {
704+
if (state.getTrackCount() > 0 && Objects.equals(state.getContextUri(), frame.context.uri)) {
701705
Spirc.TrackRef playingTrack = state.getTrack(state.getPlayingTrackIndex());
702706

703707
if (playingTrack.hasUri()) {
@@ -718,14 +722,37 @@ void updateContext(@NotNull Remote3Frame frame) {
718722
int pageIndex = -1;
719723
if (frame.options != null && frame.options.skipTo != null) {
720724
trackUid = frame.options.skipTo.trackUid;
725+
if (trackUid == null) trackUid = frame.options.skipTo.trackUri;
726+
721727
pageIndex = frame.options.skipTo.pageIndex;
722728
}
723729

724730
if (pageIndex == -1) pageIndex = 0;
725731
if (trackUid == null) trackUid = oldPlayingUri;
726732

727733
int index = -1;
728-
List<Remote3Track> tracks = frame.context.pages.get(pageIndex).tracks;
734+
Remote3Page page = frame.context.pages.get(pageIndex);
735+
List<Remote3Track> tracks;
736+
if (page.tracks == null) {
737+
if (page.pageUrl == null) {
738+
LOGGER.fatal("Missing page!");
739+
return;
740+
}
741+
742+
try {
743+
MercuryClient.Response resp = session.mercury().sendSync(RawMercuryRequest.newBuilder()
744+
.setUri(page.pageUrl).setMethod("GET").build());
745+
746+
JsonObject obj = new JsonParser().parse(new InputStreamReader(resp.payload.stream())).getAsJsonObject();
747+
tracks = Remote3Track.array(obj.getAsJsonArray("tracks"));
748+
} catch (IOException ex) {
749+
LOGGER.fatal("Failed retrieving page!", ex);
750+
return;
751+
}
752+
} else {
753+
tracks = page.tracks;
754+
}
755+
729756
for (int i = 0; i < tracks.size(); i++) {
730757
Remote3Track track = tracks.get(i);
731758
track.addToState(state);

core/src/main/java/xyz/gianlu/librespot/player/remote/Remote3Frame.java

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import org.jetbrains.annotations.Nullable;
88
import xyz.gianlu.librespot.common.Utils;
99

10-
import java.util.HashMap;
1110
import java.util.List;
1211

1312
/**
@@ -294,11 +293,13 @@ public static class SkipTo {
294293
public final int pageIndex;
295294
public final int trackIndex;
296295
public final String trackUid;
296+
public final String trackUri;
297297

298298
private SkipTo(@NotNull JsonObject obj) {
299299
pageIndex = (int) Utils.optLong(obj, "page_index", -1);
300300
trackIndex = (int) Utils.optLong(obj, "track_index", -1);
301301
trackUid = Utils.optString(obj, "track_uid", null);
302+
trackUri = Utils.optString(obj, "track_uri", null);
302303
}
303304

304305
@Nullable
@@ -332,13 +333,13 @@ public static PlayerOptionsOverride opt(@NotNull JsonObject obj, @NotNull String
332333
public static class Context {
333334
public final String uri;
334335
public final String url;
335-
public final Metadata metadata;
336+
public final JsonObject metadata;
336337
public final List<Remote3Page> pages;
337338

338339
private Context(@NotNull JsonObject obj) {
339340
uri = Utils.optString(obj, "uri", null);
340341
url = Utils.optString(obj, "url", null);
341-
metadata = Metadata.opt(obj, "metadata");
342+
metadata = obj.getAsJsonObject("metadata");
342343
pages = Remote3Page.opt(obj.getAsJsonArray("pages"));
343344
}
344345

@@ -348,23 +349,5 @@ public static Context opt(@NotNull JsonObject obj, @NotNull String key) {
348349
if (elm == null || !elm.isJsonObject()) return null;
349350
return new Context(elm.getAsJsonObject());
350351
}
351-
352-
public static class Metadata extends HashMap<String, String> {
353-
public static final String TRACK_COUNT = "track_count";
354-
public static final String ZELDA_CONTEXT_URI = "zelda.context_uri";
355-
356-
private Metadata(@NotNull JsonObject obj) {
357-
for (String key : obj.keySet())
358-
put(key, obj.get(key).getAsString());
359-
}
360-
361-
@Nullable
362-
public static Metadata opt(@NotNull JsonObject obj, @NotNull String key) {
363-
JsonElement elm = obj.get(key);
364-
if (elm == null || !elm.isJsonObject()) return null;
365-
return new Metadata(elm.getAsJsonObject());
366-
}
367-
}
368352
}
369-
370353
}

core/src/main/java/xyz/gianlu/librespot/player/remote/Remote3Page.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,20 @@
1717
public class Remote3Page {
1818
public final List<Remote3Track> tracks;
1919
public final String nextPageUrl;
20+
public final String pageUrl;
2021

2122
private Remote3Page(@NotNull JsonObject obj) {
2223
nextPageUrl = Utils.optString(obj, "next_page_url", null);
24+
pageUrl = Utils.optString(obj, "page_url", null);
2325

2426
JsonArray array = obj.getAsJsonArray("tracks");
25-
tracks = new ArrayList<>(array.size());
26-
for (JsonElement elm : array)
27-
tracks.add(new Remote3Track(elm.getAsJsonObject()));
27+
if (array != null) {
28+
tracks = new ArrayList<>(array.size());
29+
for (JsonElement elm : array)
30+
tracks.add(new Remote3Track(elm.getAsJsonObject()));
31+
} else {
32+
tracks = null;
33+
}
2834
}
2935

3036
@Nullable

core/src/main/java/xyz/gianlu/librespot/player/remote/Remote3Track.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,21 @@ public static Remote3Track opt(@NotNull JsonObject obj, @NotNull String key) {
3636
return new Remote3Track(elm.getAsJsonObject());
3737
}
3838

39-
@Nullable
40-
public static List<Remote3Track> optArray(@NotNull JsonObject obj, @NotNull String key) {
41-
JsonElement elm = obj.get(key);
42-
if (elm == null || !elm.isJsonArray()) return null;
43-
JsonArray array = elm.getAsJsonArray();
44-
39+
@NotNull
40+
public static List<Remote3Track> array(@NotNull JsonArray array) {
4541
List<Remote3Track> list = new ArrayList<>(array.size());
4642
for (JsonElement track : array)
4743
list.add(new Remote3Track(track.getAsJsonObject()));
48-
4944
return list;
5045
}
5146

47+
@Nullable
48+
public static List<Remote3Track> optArray(@NotNull JsonObject obj, @NotNull String key) {
49+
JsonElement elm = obj.get(key);
50+
if (elm == null || !elm.isJsonArray()) return null;
51+
return array(elm.getAsJsonArray());
52+
}
53+
5254
public void addToState(@NotNull Spirc.State.Builder builder) {
5355
Spirc.TrackRef ref = toTrackRef();
5456
if (ref != null) builder.addTrack(ref);

0 commit comments

Comments
 (0)