Skip to content

Commit 5cfae00

Browse files
committed
Added metadataAvailable and playbackHaltStateChanged events + use state time instead of codec time
1 parent 9a8a515 commit 5cfae00

3 files changed

Lines changed: 50 additions & 3 deletions

File tree

api/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ The currently available events are:
2828
- `playbackPaused`
2929
- `playbackResumed`
3030
- `trackSeeked`
31+
- `metadataAvailable`
32+
- `playbackHaltStateChanged`
3133

3234
## Examples
3335

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import xyz.gianlu.librespot.mercury.model.PlayableId;
1515
import xyz.gianlu.librespot.player.Player;
1616

17-
public class EventsHandler extends WebSocketProtocolHandshakeHandler implements Player.EventsListener {
17+
public final class EventsHandler extends WebSocketProtocolHandshakeHandler implements Player.EventsListener {
1818
private static final Logger LOGGER = Logger.getLogger(EventsHandler.class);
1919

2020
public EventsHandler(@NotNull Session session) {
@@ -68,4 +68,22 @@ public void onTrackSeeked(long trackTime) {
6868
obj.addProperty("trackTime", trackTime);
6969
dispatch(obj);
7070
}
71+
72+
@Override
73+
public void onMetadataAvailable(Metadata.@Nullable Track track, Metadata.@Nullable Episode episode) {
74+
JsonObject obj = new JsonObject();
75+
obj.addProperty("event", "metadataAvailable");
76+
if (track != null) obj.add("track", ProtobufToJson.convert(track));
77+
if (episode != null) obj.add("episode", ProtobufToJson.convert(episode));
78+
dispatch(obj);
79+
}
80+
81+
@Override
82+
public void onPlaybackHaltStateChanged(boolean halted, long trackTime) {
83+
JsonObject obj = new JsonObject();
84+
obj.addProperty("event", "playbackHaltStateChanged");
85+
obj.addProperty("trackTime", trackTime);
86+
obj.addProperty("halted", halted);
87+
dispatch(obj);
88+
}
7189
}

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ private void updateStateWithHandler() {
241241
if ((track = trackHandler.track()) != null) state.enrichWithMetadata(track);
242242
else if ((episode = trackHandler.episode()) != null) state.enrichWithMetadata(episode);
243243
else LOGGER.warn("Couldn't update metadata!");
244+
245+
events.metadataAvailable();
244246
}
245247

246248
@Override
@@ -367,6 +369,8 @@ public void playbackHalted(@NotNull TrackHandler handler, int chunk) {
367369

368370
state.setState(true, false, true);
369371
state.updated();
372+
373+
events.playbackHaltStateChanged(true);
370374
}
371375
}
372376

@@ -378,6 +382,8 @@ public void playbackResumedFromHalt(@NotNull TrackHandler handler, int chunk, lo
378382
state.setPosition(state.getPosition() - diff);
379383
state.setState(true, false, false);
380384
state.updated();
385+
386+
events.playbackHaltStateChanged(false);
381387
}
382388
}
383389

@@ -703,20 +709,24 @@ public interface EventsListener {
703709
void onPlaybackResumed(long trackTime);
704710

705711
void onTrackSeeked(long trackTime);
712+
713+
void onMetadataAvailable(@Nullable Metadata.Track track, @Nullable Metadata.Episode episode);
714+
715+
void onPlaybackHaltStateChanged(boolean halted, long trackTime);
706716
}
707717

708718
private class EventsDispatcher {
709719
private final ExecutorService executorService = Executors.newSingleThreadExecutor(new NameThreadFactory((r) -> "player-events-" + r.hashCode()));
710720
private final List<EventsListener> listeners = new ArrayList<>();
711721

712722
void dispatchPlaybackPaused() {
713-
long trackTime = time();
723+
long trackTime = state.getPosition();
714724
for (EventsListener l : new ArrayList<>(listeners))
715725
executorService.execute(() -> l.onPlaybackPaused(trackTime));
716726
}
717727

718728
void dispatchPlaybackResumed() {
719-
long trackTime = time();
729+
long trackTime = state.getPosition();
720730
for (EventsListener l : new ArrayList<>(listeners))
721731
executorService.execute(() -> l.onPlaybackResumed(trackTime));
722732
}
@@ -751,5 +761,22 @@ public void dispatchSeek(int pos) {
751761
for (EventsListener l : new ArrayList<>(listeners))
752762
executorService.execute(() -> l.onTrackSeeked(pos));
753763
}
764+
765+
public void metadataAvailable() {
766+
if (trackHandler == null) return;
767+
768+
Metadata.Track track = trackHandler.track();
769+
Metadata.Episode episode = trackHandler.episode();
770+
if (track == null && episode == null) return;
771+
772+
for (EventsListener l : new ArrayList<>(listeners))
773+
executorService.execute(() -> l.onMetadataAvailable(track, episode));
774+
}
775+
776+
public void playbackHaltStateChanged(boolean halted) {
777+
long trackTime = state.getPosition();
778+
for (EventsListener l : new ArrayList<>(listeners))
779+
executorService.execute(() -> l.onPlaybackHaltStateChanged(halted, trackTime));
780+
}
754781
}
755782
}

0 commit comments

Comments
 (0)