| 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 |
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) {
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());
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;
return volume;
}
+ public @Nullable Double getLastDuration() {
+ return lastDuration;
+ }
+
public @Nullable String getAppSessionId() {
return appSessionId;
}
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);