From 7169ce4dc997fffe30d5e0c60f701b176dc1f310 Mon Sep 17 00:00:00 2001 From: Iscle Date: Fri, 4 Feb 2022 15:13:03 +0100 Subject: [PATCH 1/2] Add onPlaybackFailed callback. Fixes #449 --- .../librespot/api/handlers/EventsHandler.java | 8 ++++++++ .../librespot/player/FileConfiguration.java | 1 + .../xyz/gianlu/librespot/player/Player.java | 12 ++++++++++++ .../gianlu/librespot/player/ShellEvents.java | 17 +++++++++++++++-- player/src/main/resources/default.toml | 1 + 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/xyz/gianlu/librespot/api/handlers/EventsHandler.java b/api/src/main/java/xyz/gianlu/librespot/api/handlers/EventsHandler.java index 4e92dff2..38b6078a 100644 --- a/api/src/main/java/xyz/gianlu/librespot/api/handlers/EventsHandler.java +++ b/api/src/main/java/xyz/gianlu/librespot/api/handlers/EventsHandler.java @@ -90,6 +90,14 @@ public void onPlaybackResumed(@NotNull Player player, long trackTime) { dispatch(obj); } + @Override + public void onPlaybackFailed(@NotNull Player player, Exception e) { + JsonObject obj = new JsonObject(); + obj.addProperty("event", "playbackFailed"); + obj.addProperty("exception", e.getMessage()); + dispatch(obj); + } + @Override public void onTrackSeeked(@NotNull Player player, long trackTime) { JsonObject obj = new JsonObject(); diff --git a/player/src/main/java/xyz/gianlu/librespot/player/FileConfiguration.java b/player/src/main/java/xyz/gianlu/librespot/player/FileConfiguration.java index 5fac3a73..99c4a2f8 100644 --- a/player/src/main/java/xyz/gianlu/librespot/player/FileConfiguration.java +++ b/player/src/main/java/xyz/gianlu/librespot/player/FileConfiguration.java @@ -351,6 +351,7 @@ public ShellEvents.Configuration toEventsShell() { .setOnPlaybackEnded(config.get("shell.onPlaybackEnded")) .setOnPlaybackPaused(config.get("shell.onPlaybackPaused")) .setOnPlaybackResumed(config.get("shell.onPlaybackResumed")) + .setOnPlaybackFailed(config.get("shell.onPlaybackFailed")) .setOnTrackSeeked(config.get("shell.onTrackSeeked")) .setOnMetadataAvailable(config.get("shell.onMetadataAvailable")) .setOnVolumeChanged(config.get("shell.onVolumeChanged")) diff --git a/player/src/main/java/xyz/gianlu/librespot/player/Player.java b/player/src/main/java/xyz/gianlu/librespot/player/Player.java index 6c8ef415..dfc7e198 100644 --- a/player/src/main/java/xyz/gianlu/librespot/player/Player.java +++ b/player/src/main/java/xyz/gianlu/librespot/player/Player.java @@ -382,6 +382,7 @@ public void finishedLoading(@NotNull MetadataWrapper metadata) { public void loadingError(@NotNull Exception ex) { if (ex instanceof PlayableContentFeeder.ContentRestrictedException) { LOGGER.error("Can't load track (content restricted).", ex); + events.playbackFailed(ex); } else { LOGGER.error("Failed loading track.", ex); panicState(PlaybackMetrics.Reason.TRACK_ERROR); @@ -871,6 +872,8 @@ public interface EventsListener { void onPlaybackResumed(@NotNull Player player, long trackTime); + void onPlaybackFailed(@NotNull Player player, Exception e); + void onTrackSeeked(@NotNull Player player, long trackTime); void onMetadataAvailable(@NotNull Player player, @NotNull MetadataWrapper metadata); @@ -1001,6 +1004,10 @@ public void onPlaybackResumed(@NotNull Player player, long trackTime) { onMetadataAvailable(player, metadata); } + @Override + public void onPlaybackFailed(@NotNull Player player, Exception e) { + } + @Override public void onTrackSeeked(@NotNull Player player, long trackTime) { dacpPipe.sendPipeFlush(); @@ -1075,6 +1082,11 @@ void playbackResumed() { executorService.execute(() -> l.onPlaybackResumed(Player.this, trackTime)); } + void playbackFailed(Exception ex) { + for (EventsListener l : new ArrayList<>(listeners)) + executorService.execute(() -> l.onPlaybackFailed(Player.this, ex)); + } + void contextChanged() { String uri = state.getContextUri(); if (uri == null) return; diff --git a/player/src/main/java/xyz/gianlu/librespot/player/ShellEvents.java b/player/src/main/java/xyz/gianlu/librespot/player/ShellEvents.java index 3a3dc3b0..5172ed6e 100644 --- a/player/src/main/java/xyz/gianlu/librespot/player/ShellEvents.java +++ b/player/src/main/java/xyz/gianlu/librespot/player/ShellEvents.java @@ -88,6 +88,11 @@ public void onPlaybackResumed(@NotNull Player player, long trackTime) { exec(conf.onPlaybackResumed, "POSITION=" + trackTime); } + @Override + public void onPlaybackFailed(@NotNull Player player, Exception e) { + exec(conf.onPlaybackFailed, "EXCEPTION=" + e.getMessage()); + } + @Override public void onTrackSeeked(@NotNull Player player, long trackTime) { exec(conf.onTrackSeeked, "POSITION=" + trackTime); @@ -147,6 +152,7 @@ public static class Configuration { public final String onPlaybackEnded; public final String onPlaybackPaused; public final String onPlaybackResumed; + public final String onPlaybackFailed; public final String onTrackSeeked; public final String onMetadataAvailable; public final String onVolumeChanged; @@ -158,7 +164,7 @@ public static class Configuration { public final String onFinishedLoading; public Configuration(boolean enabled, boolean executeWithBash, String onContextChanged, String onTrackChanged, String onPlaybackEnded, String onPlaybackPaused, - String onPlaybackResumed, String onTrackSeeked, String onMetadataAvailable, String onVolumeChanged, + String onPlaybackResumed, String onPlaybackFailed, String onTrackSeeked, String onMetadataAvailable, String onVolumeChanged, String onInactiveSession, String onPanicState, String onConnectionDropped, String onConnectionEstablished, String onStartedLoading, String onFinishedLoading) { this.enabled = enabled; @@ -168,6 +174,7 @@ public Configuration(boolean enabled, boolean executeWithBash, String onContextC this.onPlaybackEnded = onPlaybackEnded; this.onPlaybackPaused = onPlaybackPaused; this.onPlaybackResumed = onPlaybackResumed; + this.onPlaybackFailed = onPlaybackFailed; this.onTrackSeeked = onTrackSeeked; this.onMetadataAvailable = onMetadataAvailable; this.onVolumeChanged = onVolumeChanged; @@ -187,6 +194,7 @@ public static class Builder { private String onPlaybackEnded = ""; private String onPlaybackPaused = ""; private String onPlaybackResumed = ""; + private String onPlaybackFailed = ""; private String onTrackSeeked = ""; private String onMetadataAvailable = ""; private String onVolumeChanged = ""; @@ -235,6 +243,11 @@ public Builder setOnPlaybackResumed(String command) { return this; } + public Builder setOnPlaybackFailed(String command) { + this.onPlaybackFailed = command; + return this; + } + public Builder setOnTrackSeeked(String command) { this.onTrackSeeked = command; return this; @@ -283,7 +296,7 @@ public Builder setOnFinishedLoading(String onFinishedLoading) { @NotNull public Configuration build() { return new Configuration(enabled, executeWithBash, onContextChanged, onTrackChanged, onPlaybackEnded, onPlaybackPaused, onPlaybackResumed, - onTrackSeeked, onMetadataAvailable, onVolumeChanged, onInactiveSession, onPanicState, onConnectionDropped, onConnectionEstablished, + onPlaybackFailed, onTrackSeeked, onMetadataAvailable, onVolumeChanged, onInactiveSession, onPanicState, onConnectionDropped, onConnectionEstablished, onStartedLoading, onFinishedLoading); } } diff --git a/player/src/main/resources/default.toml b/player/src/main/resources/default.toml index 5ea2f7ef..7d5cb04b 100644 --- a/player/src/main/resources/default.toml +++ b/player/src/main/resources/default.toml @@ -74,6 +74,7 @@ onTrackChanged = "" onPlaybackEnded = "" onPlaybackPaused = "" onPlaybackResumed = "" +onPlaybackFailed = "" onTrackSeeked = "" onMetadataAvailable = "" onVolumeChanged = "" From 4511e467f76534485ea1ac06ee28cdef2fea8500 Mon Sep 17 00:00:00 2001 From: Iscle Date: Mon, 7 Feb 2022 12:28:56 +0100 Subject: [PATCH 2/2] Always call onPlaybackFailed() when there's an error loading a track --- player/src/main/java/xyz/gianlu/librespot/player/Player.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/player/src/main/java/xyz/gianlu/librespot/player/Player.java b/player/src/main/java/xyz/gianlu/librespot/player/Player.java index dfc7e198..824ba57f 100644 --- a/player/src/main/java/xyz/gianlu/librespot/player/Player.java +++ b/player/src/main/java/xyz/gianlu/librespot/player/Player.java @@ -380,9 +380,9 @@ public void finishedLoading(@NotNull MetadataWrapper metadata) { @Override public void loadingError(@NotNull Exception ex) { + events.playbackFailed(ex); if (ex instanceof PlayableContentFeeder.ContentRestrictedException) { LOGGER.error("Can't load track (content restricted).", ex); - events.playbackFailed(ex); } else { LOGGER.error("Failed loading track.", ex); panicState(PlaybackMetrics.Reason.TRACK_ERROR);