Skip to content

Commit 9a8a515

Browse files
committed
Added trackTime parameter to events + modified player/current endpoint to include track time
1 parent 1c9a221 commit 9a8a515

4 files changed

Lines changed: 37 additions & 14 deletions

File tree

api/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ This module depends on `librespot-core` and provides an API to interact with the
1414
- `POST \player\set-volume` Set volume to a given `volume` value from 0 to 65536.
1515
- `POST \player\volume-up` Up the volume a little bit.
1616
- `POST \player\volume-down` Lower the volume a little bit.
17-
- `POST \player\current` Retrieve information about the current track.
17+
- `POST \player\current` Retrieve information about the current track (metadata and time).
1818

1919
### Metadata
2020
- `POST \metadata\{type}\{uri}` Retrieve metadata. `type` can be one of `episode`, `track`, `album`, `show`, `artist`, `uri` is the standard Spotify uri.
@@ -27,7 +27,7 @@ The currently available events are:
2727
- `trackChanged`
2828
- `playbackPaused`
2929
- `playbackResumed`
30-
30+
- `trackSeeked`
3131

3232
## Examples
3333

api/src/main/java/xyz/gianlu/librespot/api/handlers/EventsHandler.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,26 @@ public void onTrackChanged(@NotNull PlayableId id, Metadata.@Nullable Track trac
4646
}
4747

4848
@Override
49-
public void onPlaybackPaused() {
49+
public void onPlaybackPaused(long trackTime) {
5050
JsonObject obj = new JsonObject();
5151
obj.addProperty("event", "playbackPaused");
52+
obj.addProperty("trackTime", trackTime);
5253
dispatch(obj);
5354
}
5455

5556
@Override
56-
public void onPlaybackResumed() {
57+
public void onPlaybackResumed(long trackTime) {
5758
JsonObject obj = new JsonObject();
5859
obj.addProperty("event", "playbackResumed");
60+
obj.addProperty("trackTime", trackTime);
61+
dispatch(obj);
62+
}
63+
64+
@Override
65+
public void onTrackSeeked(long trackTime) {
66+
JsonObject obj = new JsonObject();
67+
obj.addProperty("event", "trackSeeked");
68+
obj.addProperty("trackTime", trackTime);
5969
dispatch(obj);
6070
}
6171
}

api/src/main/java/xyz/gianlu/librespot/api/handlers/PlayerHandler.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,25 +59,28 @@ private void load(HttpServerExchange exchange, @Nullable String uri, boolean pla
5959
private void current(HttpServerExchange exchange) {
6060
PlayableId id = session.player().currentPlayableId();
6161

62-
JsonObject obj;
62+
JsonObject obj = new JsonObject();
63+
if (id != null) obj.addProperty("current", id.toSpotifyUri());
64+
65+
long time = session.player().time();
66+
obj.addProperty("trackTime", time);
67+
6368
if (id instanceof TrackId) {
6469
Metadata.Track track = session.player().currentTrack();
6570
if (track == null) {
6671
Utils.internalError(exchange, "Missing track metadata. Try again.");
6772
return;
6873
}
6974

70-
obj = ProtobufToJson.convert(track);
71-
obj.addProperty("uri", id.toSpotifyUri());
75+
obj.add("track", ProtobufToJson.convert(track));
7276
} else if (id instanceof EpisodeId) {
7377
Metadata.Episode episode = session.player().currentEpisode();
7478
if (episode == null) {
7579
Utils.internalError(exchange, "Missing episode metadata. Try again.");
7680
return;
7781
}
7882

79-
obj = ProtobufToJson.convert(episode);
80-
obj.addProperty("uri", id.toSpotifyUri());
83+
obj.add("episode", ProtobufToJson.convert(episode));
8184
} else {
8285
Utils.internalError(exchange, "Invalid PlayableId: " + id);
8386
return;

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class Player implements Closeable, DeviceStateHandler.Listener, PlayerRun
4646
private TrackHandler trackHandler;
4747
private TrackHandler crossfadeHandler;
4848
private TrackHandler preloadTrackHandler;
49-
private ScheduledFuture releaseLineFuture = null;
49+
private ScheduledFuture<?> releaseLineFuture = null;
5050

5151
public Player(@NotNull Player.Configuration conf, @NotNull Session session) {
5252
this.conf = conf;
@@ -384,6 +384,7 @@ public void playbackResumedFromHalt(@NotNull TrackHandler handler, int chunk, lo
384384
private void handleSeek(int pos) {
385385
state.setPosition(pos);
386386
if (trackHandler != null) trackHandler.seek(pos);
387+
events.dispatchSeek(pos);
387388
}
388389

389390
private void panicState() {
@@ -697,23 +698,27 @@ public interface EventsListener {
697698

698699
void onTrackChanged(@NotNull PlayableId id, @Nullable Metadata.Track track, @Nullable Metadata.Episode episode);
699700

700-
void onPlaybackPaused();
701+
void onPlaybackPaused(long trackTime);
701702

702-
void onPlaybackResumed();
703+
void onPlaybackResumed(long trackTime);
704+
705+
void onTrackSeeked(long trackTime);
703706
}
704707

705708
private class EventsDispatcher {
706709
private final ExecutorService executorService = Executors.newSingleThreadExecutor(new NameThreadFactory((r) -> "player-events-" + r.hashCode()));
707710
private final List<EventsListener> listeners = new ArrayList<>();
708711

709712
void dispatchPlaybackPaused() {
713+
long trackTime = time();
710714
for (EventsListener l : new ArrayList<>(listeners))
711-
executorService.execute(l::onPlaybackPaused);
715+
executorService.execute(() -> l.onPlaybackPaused(trackTime));
712716
}
713717

714718
void dispatchPlaybackResumed() {
719+
long trackTime = time();
715720
for (EventsListener l : new ArrayList<>(listeners))
716-
executorService.execute(l::onPlaybackResumed);
721+
executorService.execute(() -> l.onPlaybackResumed(trackTime));
717722
}
718723

719724
void dispatchContextChanged() {
@@ -741,5 +746,10 @@ void dispatchTrackChanged() {
741746
for (EventsListener l : new ArrayList<>(listeners))
742747
executorService.execute(() -> l.onTrackChanged(id, track, episode));
743748
}
749+
750+
public void dispatchSeek(int pos) {
751+
for (EventsListener l : new ArrayList<>(listeners))
752+
executorService.execute(() -> l.onTrackSeeked(pos));
753+
}
744754
}
745755
}

0 commit comments

Comments
 (0)