Skip to content

Commit b260c0f

Browse files
committed
feat: Added Events
1 parent 0a01dbf commit b260c0f

14 files changed

+240
-48
lines changed

src/integrationTest/java/net/twasi/obsremotejava/test/OBSRemoteControllerUnsecuredIT.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,33 @@ void test() {
6262
"Source Filter visibility changed on filter '%s' in source '%s'", res.getFilterName(), res.getSourceName()
6363
)));
6464

65-
controller.registerPreviewSceneChangesCallback(res-> System.out.println("Preview Scene changed to: " + res.getSceneName()));
65+
controller.registerPreviewSceneChangesCallback(res -> System.out.println("Preview Scene changed to: " + res.getSceneName()));
6666

67+
controller.registerStreamStartedCallback(() -> System.out.println("Stream Started"));
68+
69+
controller.registerStreamStoppedCallback(() -> System.out.println("Stream Stopped"));
70+
71+
controller.registerRecordingStartedCallback(() -> System.out.println("Recording Started"));
72+
73+
controller.registerRecordingStoppedCallback(() -> System.out.println("Recording Stopped"));
74+
75+
controller.registerOnMediaPlaying(res -> System.out.println("Media Playing source: " + res.getSourceName()));
76+
77+
controller.registerOnMediaPaused(res-> System.out.println("Media Paused source: " + res.getSourceName()));
78+
79+
controller.registerOnMediaRestarted(res-> System.out.println("Media Restarted source: " + res.getSourceName()));
80+
81+
controller.registerOnMediaStopped(res-> System.out.println("Media Stopped source: " + res.getSourceName()));
82+
83+
controller.registerOnMediaNext(res-> System.out.println("Media Next source: " + res.getSourceName()));
84+
85+
controller.registerOnMediaPrevious(res-> System.out.println("Media Previous source: " + res.getSourceName()));
86+
87+
controller.registerOnMediaStarted(res-> System.out.println("Media Started source: " + res.getSourceName()));
88+
89+
controller.registerOnMediaEnded(res-> System.out.println("Media Ended source: " + res.getSourceName()));
90+
91+
controller.registerOnSourceVolumeChanged(res-> System.out.println("Volume Changed source: " + res.getSourceName()));
6792
});
6893

6994
try {

src/main/java/net/twasi/obsremotejava/OBSCommunicator.java

Lines changed: 107 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,16 @@ public class OBSCommunicator {
152152
private Callback<TransitionBeginResponse> onTransitionBegin;
153153
private Callback<TransitionEndResponse> onTransitionEnd;
154154
private Callback<SourceFilterVisibilityChangedResponse> onSourceFilterVisibilityChanged;
155+
private Callback<SourceVolumeChangedResponse> onSourceVolumeChanged;
155156
private Callback<PreviewSceneChangedResponse> onPreviewSceneChanged;
157+
private Callback<MediaEndedResponse> onMediaEnded;
158+
private Callback<MediaStartedResponse> onMediaStarted;
159+
private Callback<MediaPreviousResponse> onMediaPrevious;
160+
private Callback<MediaNextResponse> onMediaNext;
161+
private Callback<MediaStoppedResponse> onMediaStopped;
162+
private Callback<MediaRestartedResponse> onMediaRestarted;
163+
private Callback<MediaPausedResponse> onMediaPaused;
164+
private Callback<MediaPlayingResponse> onMediaPlaying;
156165

157166
private GetVersionResponse versionInfo;
158167

@@ -197,8 +206,7 @@ public void onConnect(Session session) {
197206
Future<Void> fut;
198207
fut = session.getRemote().sendStringByFuture(this.gson.toJson(new GetVersionRequest(this)));
199208
fut.get(2, TimeUnit.SECONDS);
200-
}
201-
catch (Throwable t) {
209+
} catch (Throwable t) {
202210
runOnError("An error occurred while trying to get a session", t);
203211
}
204212
}
@@ -227,32 +235,26 @@ public void onMessage(String msg) {
227235

228236
try {
229237
processIncomingResponse(responseBase, responseType);
230-
}
231-
catch (Throwable t) {
238+
} catch (Throwable t) {
232239
runOnError("Failed to process response '" + responseType.getSimpleName() + "' from websocket", t);
233240
}
234-
}
235-
else if (jsonObject.has("update-type")) {
241+
} else if (jsonObject.has("update-type")) {
236242
try {
237243
EventType eventType = EventType.valueOf(jsonObject.get("update-type").getAsString());
238244

239245
try {
240246
processIncomingEvent(msg, eventType);
241-
}
242-
catch (Throwable t) {
247+
} catch (Throwable t) {
243248
runOnError("Failed to execute callback for event: " + eventType, t);
244249
}
245-
}
246-
catch (IllegalArgumentException ignored) {
250+
} catch (IllegalArgumentException ignored) {
247251
log.trace("Unsupported Event received");
248252
}
249253
}
250-
}
251-
else {
254+
} else {
252255
throw new IllegalArgumentException("Received message is not a JsonObject");
253256
}
254-
}
255-
catch (Throwable t) {
257+
} catch (Throwable t) {
256258
runOnError("Failed to process message from websocket", t);
257259
}
258260
}
@@ -270,8 +272,7 @@ private void processIncomingResponse(ResponseBase responseBase, Class type) {
270272
if (authRequiredResponse.isAuthRequired()) {
271273
log.info("Authentication is required.");
272274
authenticateWithServer(authRequiredResponse.getChallenge(), authRequiredResponse.getSalt());
273-
}
274-
else {
275+
} else {
275276
log.info("Authentication is not required. You're ready to go!");
276277
runOnConnect(versionInfo);
277278
}
@@ -282,8 +283,7 @@ private void processIncomingResponse(ResponseBase responseBase, Class type) {
282283

283284
if ("ok".equals(authenticateResponse.getStatus())) {
284285
runOnConnect(versionInfo);
285-
}
286-
else {
286+
} else {
287287
runOnConnectionFailed("Failed to authenticate with password. Error: " + authenticateResponse.getError(), null);
288288
}
289289

@@ -298,8 +298,7 @@ private void processIncomingResponse(ResponseBase responseBase, Class type) {
298298

299299
try {
300300
callbacks.get(type).run(responseBase);
301-
}
302-
catch (Throwable t) {
301+
} catch (Throwable t) {
303302
runOnError("Failed to execute callback for response: " + type, t);
304303
}
305304
}
@@ -324,39 +323,36 @@ private void processIncomingEvent(String msg, EventType eventType) {
324323
onReplayStopping.run();
325324
break;
326325
case SwitchScenes:
327-
if (onSwitchScenes != null) {
326+
if (onSwitchScenes != null)
328327
onSwitchScenes.run(this.gson.fromJson(msg, SwitchScenesResponse.class));
329-
}
330328
break;
331329
case ScenesChanged:
332-
if (onScenesChanged != null) {
330+
if (onScenesChanged != null)
333331
onScenesChanged.run(new Gson().fromJson(msg, ScenesChangedResponse.class));
334-
}
335332
break;
336333
case SourceFilterVisibilityChanged:
337-
if(onSourceFilterVisibilityChanged != null) {
334+
if (onSourceFilterVisibilityChanged != null)
338335
onSourceFilterVisibilityChanged.run(this.gson.fromJson(msg, SourceFilterVisibilityChangedResponse.class));
339-
}
336+
break;
337+
case SourceVolumeChanged:
338+
if (onSourceVolumeChanged != null)
339+
onSourceVolumeChanged.run(this.gson.fromJson(msg, SourceVolumeChangedResponse.class));
340340
break;
341341
case SwitchTransition:
342-
if (onSwitchTransition != null) {
342+
if (onSwitchTransition != null)
343343
onSwitchTransition.run(this.gson.fromJson(msg, SwitchTransitionResponse.class));
344-
}
345344
break;
346345
case TransitionListChanged:
347-
if (onTransitionListChanged != null) {
346+
if (onTransitionListChanged != null)
348347
onTransitionListChanged.run(this.gson.fromJson(msg, TransitionListChangedResponse.class));
349-
}
350348
break;
351349
case TransitionBegin:
352-
if (onTransitionBegin != null) {
350+
if (onTransitionBegin != null)
353351
onTransitionBegin.run(this.gson.fromJson(msg, TransitionBeginResponse.class));
354-
}
355352
break;
356353
case TransitionEnd:
357-
if (onTransitionEnd != null) {
354+
if (onTransitionEnd != null)
358355
onTransitionEnd.run(this.gson.fromJson(msg, TransitionEndResponse.class));
359-
}
360356
break;
361357
case RecordingStarted:
362358
if (onRecordingStarted != null)
@@ -375,9 +371,40 @@ private void processIncomingEvent(String msg, EventType eventType) {
375371
onStreamStopped.run();
376372
break;
377373
case PreviewSceneChanged:
378-
if (onPreviewSceneChanged != null) {
374+
if (onPreviewSceneChanged != null)
379375
onPreviewSceneChanged.run(this.gson.fromJson(msg, PreviewSceneChangedResponse.class));
380-
}
376+
break;
377+
case MediaPlaying:
378+
if (onMediaPlaying != null)
379+
onMediaPlaying.run(this.gson.fromJson(msg, MediaPlayingResponse.class));
380+
break;
381+
case MediaPaused:
382+
if (onMediaPaused != null)
383+
onMediaPaused.run(this.gson.fromJson(msg, MediaPausedResponse.class));
384+
break;
385+
case MediaRestarted:
386+
if (onMediaRestarted != null)
387+
onMediaRestarted.run(this.gson.fromJson(msg, MediaRestartedResponse.class));
388+
break;
389+
case MediaStopped:
390+
if (onMediaStopped != null)
391+
onMediaStopped.run(this.gson.fromJson(msg, MediaStoppedResponse.class));
392+
break;
393+
case MediaNext:
394+
if (onMediaNext != null)
395+
onMediaNext.run(this.gson.fromJson(msg, MediaNextResponse.class));
396+
break;
397+
case MediaPrevious:
398+
if (onMediaPrevious != null)
399+
onMediaPrevious.run(this.gson.fromJson(msg, MediaPreviousResponse.class));
400+
break;
401+
case MediaStarted:
402+
if (onMediaStarted != null)
403+
onMediaStarted.run(this.gson.fromJson(msg, MediaStartedResponse.class));
404+
break;
405+
case MediaEnded:
406+
if (onMediaEnded != null)
407+
onMediaEnded.run(this.gson.fromJson(msg, MediaEndedResponse.class));
381408
break;
382409
}
383410
}
@@ -404,8 +431,7 @@ private String generateAuthenticationResponseString(String challenge, String sal
404431
MessageDigest digest;
405432
try {
406433
digest = MessageDigest.getInstance("SHA-256");
407-
}
408-
catch (NoSuchAlgorithmException e) {
434+
} catch (NoSuchAlgorithmException e) {
409435
runOnConnectionFailed("Failed to perform password authentication with server", null);
410436
return null;
411437
}
@@ -431,7 +457,9 @@ public void registerOnDisconnect(VoidCallback onDisconnect) {
431457
this.onDisconnect = onDisconnect;
432458
}
433459

434-
public void registerOnClose(CloseCallback closeCallback) { this.onClose = closeCallback; }
460+
public void registerOnClose(CloseCallback closeCallback) {
461+
this.onClose = closeCallback;
462+
}
435463

436464
public void registerOnConnectionFailed(StringCallback onConnectionFailed) {
437465
this.onConnectionFailed = onConnectionFailed;
@@ -469,6 +497,10 @@ public void registerOnSourceFilterVisibilityChanged(Callback<SourceFilterVisibil
469497
this.onSourceFilterVisibilityChanged = onSourceFilterVisibilityChanged;
470498
}
471499

500+
public void registerOnSourceVolumeChanged(Callback<SourceVolumeChangedResponse> onSourceVolumeChanged) {
501+
this.onSourceVolumeChanged = onSourceVolumeChanged;
502+
}
503+
472504
public void registerOnSwitchTransition(Callback<SwitchTransitionResponse> onSwitchTransition) {
473505
this.onSwitchTransition = onSwitchTransition;
474506
}
@@ -501,6 +533,38 @@ public void registerOnStreamStopped(VoidCallback onStreamStopped) {
501533
this.onStreamStopped = onStreamStopped;
502534
}
503535

536+
public void registerOnMediaPlaying(Callback<MediaPlayingResponse> onMediaPlaying) {
537+
this.onMediaPlaying = onMediaPlaying;
538+
}
539+
540+
public void registerOnMediaPaused(Callback<MediaPausedResponse> onMediaPaused) {
541+
this.onMediaPaused = onMediaPaused;
542+
}
543+
544+
public void registerOnMediaRestarted(Callback<MediaRestartedResponse> onMediaRestarted) {
545+
this.onMediaRestarted = onMediaRestarted;
546+
}
547+
548+
public void registerOnMediaStopped(Callback<MediaStoppedResponse> onMediaStopped) {
549+
this.onMediaStopped = onMediaStopped;
550+
}
551+
552+
public void registerOnMediaNext(Callback<MediaNextResponse> onMediaNext) {
553+
this.onMediaNext = onMediaNext;
554+
}
555+
556+
public void registerOnMediaPrevious(Callback<MediaPreviousResponse> onMediaPrevious) {
557+
this.onMediaPrevious = onMediaPrevious;
558+
}
559+
560+
public void registerOnMediaStarted(Callback<MediaStartedResponse> onMediaStarted) {
561+
this.onMediaStarted = onMediaStarted;
562+
}
563+
564+
public void registerOnMediaEnded(Callback<MediaEndedResponse> onMediaEnded) {
565+
this.onMediaEnded = onMediaEnded;
566+
}
567+
504568
public void getScenes(Callback<GetSceneListResponse> callback) {
505569
session.getRemote().sendStringByFuture(this.gson.toJson(new GetSceneListRequest(this)));
506570
callbacks.put(GetSceneListResponse.class, callback);
@@ -803,8 +867,7 @@ private void runOnError(String message, Throwable throwable) {
803867

804868
try {
805869
onError.run(message, throwable);
806-
}
807-
catch (Throwable t) {
870+
} catch (Throwable t) {
808871
log.error("Unable to run onError callback", t);
809872
}
810873
}
@@ -818,8 +881,7 @@ private void runOnConnectionFailed(String message, Throwable throwable) {
818881

819882
try {
820883
onConnectionFailed.run(message);
821-
}
822-
catch (Throwable t) {
884+
} catch (Throwable t) {
823885
log.error("Unable to run OnConnectionFailed callback", t);
824886
}
825887
}
@@ -833,8 +895,7 @@ private void runOnConnect(GetVersionResponse versionInfo) {
833895

834896
try {
835897
onConnect.run(versionInfo);
836-
}
837-
catch (Throwable t) {
898+
} catch (Throwable t) {
838899
log.error("Unable to run OnConnect callback", t);
839900
}
840901
}
@@ -857,7 +918,7 @@ void runOnDisconnect() {
857918
private void runOnClosed(int statusCode, String reason) {
858919
log.debug("Running onClose with statusCode " + statusCode + " and reason: " + reason);
859920

860-
if(this.onClose == null) {
921+
if (this.onClose == null) {
861922
log.debug("No onClose was registered.");
862923
return;
863924
}

src/main/java/net/twasi/obsremotejava/OBSRemoteController.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,38 @@ public void registerStreamStoppedCallback(VoidCallback onRecordingStopped) {
220220
communicator.registerOnStreamStopped(onRecordingStopped);
221221
}
222222

223+
public void registerOnMediaPlaying(Callback<MediaPlayingResponse> onMediaPlaying) {
224+
communicator.registerOnMediaPlaying(onMediaPlaying);
225+
}
226+
227+
public void registerOnMediaPaused(Callback<MediaPausedResponse> onMediaPaused) {
228+
communicator.registerOnMediaPaused(onMediaPaused);
229+
}
230+
231+
public void registerOnMediaRestarted(Callback<MediaRestartedResponse> onMediaRestarted) {
232+
communicator.registerOnMediaRestarted(onMediaRestarted);
233+
}
234+
235+
public void registerOnMediaStopped(Callback<MediaStoppedResponse> onMediaStopped) {
236+
communicator.registerOnMediaStopped(onMediaStopped);
237+
}
238+
239+
public void registerOnMediaNext(Callback<MediaNextResponse> onMediaNext) {
240+
communicator.registerOnMediaNext(onMediaNext);
241+
}
242+
243+
public void registerOnMediaPrevious(Callback<MediaPreviousResponse> onMediaPrevious) {
244+
communicator.registerOnMediaPrevious(onMediaPrevious);
245+
}
246+
247+
public void registerOnMediaStarted(Callback<MediaStartedResponse> onMediaStarted) {
248+
communicator.registerOnMediaStarted(onMediaStarted);
249+
}
250+
251+
public void registerOnMediaEnded(Callback<MediaEndedResponse> onMediaEnded) {
252+
communicator.registerOnMediaEnded(onMediaEnded);
253+
}
254+
223255
public void registerSwitchScenesCallback(Callback<SwitchScenesResponse> onSwitchScenes) {
224256
communicator.registerOnSwitchScenes(onSwitchScenes);
225257
}
@@ -248,6 +280,10 @@ public void registerSourceFilterVisibilityChangedCallback(Callback<SourceFilterV
248280
communicator.registerOnSourceFilterVisibilityChanged(onSourceVisibilityChanged);
249281
}
250282

283+
public void registerOnSourceVolumeChanged(Callback<SourceVolumeChangedResponse> onSourceVolumeChanged) {
284+
communicator.registerOnSourceVolumeChanged(onSourceVolumeChanged);
285+
}
286+
251287
public void registerPreviewSceneChangesCallback(Callback<PreviewSceneChangedResponse> onPreviewSceneChanged) {
252288
communicator.registerOnPreviewSceneChanged(onPreviewSceneChanged);
253289
}

0 commit comments

Comments
 (0)