]> git.basschouten.com Git - openhab-addons.git/commitdiff
[chromecast] Added support for next command (#11510)
authorboc-tothefuture <broconne+github@gmail.com>
Thu, 16 Dec 2021 19:20:22 +0000 (14:20 -0500)
committerGitHub <noreply@github.com>
Thu, 16 Dec 2021 19:20:22 +0000 (20:20 +0100)
* feat(chromecast): added support for next command

Signed-off-by: Brian O'Connell <boc-tothefuture@users.noreply.github.com>
bundles/org.openhab.binding.chromecast/README.md
bundles/org.openhab.binding.chromecast/src/main/java/org/openhab/binding/chromecast/internal/ChromecastCommander.java
bundles/org.openhab.binding.chromecast/src/main/java/org/openhab/binding/chromecast/internal/ChromecastStatusUpdater.java

index 2d9fd4b3c0597cbfb29bc4824346b1a358745412..1139210721687f2b805344f86577c1358b5f1dcb 100644 (file)
@@ -55,7 +55,7 @@ Thing chromecast:audiogroup:bathroom  [ ipAddress="192.168.0.23", port=42139]
 
 | Channel Type ID | Item Type   | Description                                                                                                                                                                           |
 |-----------------|-------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| control         | Player      | Player control; currently only supports play/pause and does not correctly update, if the state changes on the device itself                                                           |
+| control         | Player      | Player control; currently only supports play/pause/next and does not correctly update, if the state changes on the device itself                                                           |
 | stop            | Switch      | Send `ON` to this channel: Stops the Chromecast. If this channel is `ON`, the Chromecast is stopped, otherwise it is in another state (see control channel)                           |
 | volume          | Dimmer      | Control the volume, this is also updated if the volume is changed by another app                                                                                                      |
 | mute            | Switch      | Mute the audio                                                                                                                                                                        |
index 2a031a4bd2defcd3ad074fb111dc5df28b85e0ef..ef7ad91b3bb33ce1da6588c526ec3dbef5728f38 100644 (file)
@@ -134,13 +134,6 @@ public class ChromecastCommander {
 
     private void handleControl(final Command command) {
         try {
-            if (command instanceof NextPreviousType) {
-                // I can't find a way to control next/previous from the API. The Google app doesn't seem to
-                // allow it either, so I suspect there isn't a way.
-                logger.info("{} command not yet implemented", command);
-                return;
-            }
-
             Application app = chromeCast.getRunningApp();
             statusUpdater.updateStatus(ThingStatus.ONLINE);
             if (app == null) {
@@ -166,6 +159,23 @@ public class ChromecastCommander {
                     logger.info("{} command not supported by current media", command);
                 }
             }
+
+            if (command instanceof NextPreviousType) {
+                // Next is implemented by seeking to the end of the current media
+                if (command == NextPreviousType.NEXT) {
+
+                    Double duration = statusUpdater.getLastDuration();
+                    if (duration != null) {
+                        chromeCast.seek(duration.doubleValue() - 5);
+                    } else {
+                        logger.info("{} command failed - unknown media duration", command);
+                    }
+                } else {
+                    logger.info("{} command not yet implemented", command);
+                    return;
+                }
+            }
+
         } catch (final IOException e) {
             logger.debug("{} command failed: {}", command, e.getMessage());
             statusUpdater.updateStatus(ThingStatus.OFFLINE, COMMUNICATION_ERROR, e.getMessage());
index 8e8581c8daf2776c164059110e5d44fdda9d43a0..1ce09bf5c69b64ff2504e9cb66b988186f9bfbc5 100644 (file)
@@ -73,6 +73,9 @@ public class ChromecastStatusUpdater {
     private @Nullable String appSessionId;
     private PercentType volume = PercentType.ZERO;
 
+    // Null is valid value for last duration
+    private @Nullable Double lastDuration = null;
+
     public ChromecastStatusUpdater(Thing thing, ChromecastHandler callback) {
         this.thing = thing;
         this.callback = callback;
@@ -82,6 +85,10 @@ public class ChromecastStatusUpdater {
         return volume;
     }
 
+    public @Nullable Double getLastDuration() {
+        return lastDuration;
+    }
+
     public @Nullable String getAppSessionId() {
         return appSessionId;
     }
@@ -186,6 +193,7 @@ public class ChromecastStatusUpdater {
         if (media != null) {
             metadataType = media.getMetadataType().name();
 
+            lastDuration = media.duration;
             // duration can be null when a new song is about to play.
             if (media.duration != null) {
                 duration = new QuantityType<>(media.duration, Units.SECOND);