--- /dev/null
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.chromecast.internal.action;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.chromecast.internal.handler.ChromecastHandler;
+import org.openhab.core.automation.annotation.ActionInput;
+import org.openhab.core.automation.annotation.ActionOutput;
+import org.openhab.core.automation.annotation.RuleAction;
+import org.openhab.core.thing.binding.ThingActions;
+import org.openhab.core.thing.binding.ThingActionsScope;
+import org.openhab.core.thing.binding.ThingHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The {@link ChromecastActions} class defines rule actions for playing URLs
+ *
+ * @author Scott Hanson - Added Actions
+ */
+@ThingActionsScope(name = "chromecast")
+@NonNullByDefault
+public class ChromecastActions implements ThingActions {
+
+ private final Logger logger = LoggerFactory.getLogger(ChromecastActions.class);
+
+ private @Nullable ChromecastHandler handler;
+
+ @RuleAction(label = "@text/playURLActionLabel", description = "@text/playURLActionDescription")
+ public @ActionOutput(name = "success", type = "java.lang.Boolean") Boolean playURL(
+ @ActionInput(name = "url") @Nullable String url) {
+ if (url == null) {
+ logger.warn("Cannot Play as URL is missing.");
+ return false;
+ }
+
+ final ChromecastHandler handler = this.handler;
+ if (handler == null) {
+ logger.warn("Handler is null, cannot play.");
+ return false;
+ } else {
+ return handler.playURL(url, null);
+ }
+ }
+
+ @RuleAction(label = "@text/playURLTypeActionLabel", description = "@text/playURLTypeActionDescription")
+ public @ActionOutput(name = "success", type = "java.lang.Boolean") Boolean playURL(
+ @ActionInput(name = "url") @Nullable String url,
+ @ActionInput(name = "mediaType") @Nullable String mediaType) {
+ if (url == null) {
+ logger.warn("Cannot Play as URL is missing.");
+ return false;
+ }
+
+ final ChromecastHandler handler = this.handler;
+ if (handler == null) {
+ logger.warn("Handler is null, cannot tweet.");
+ return false;
+ } else {
+ return handler.playURL(url, mediaType);
+ }
+ }
+
+ public static boolean playURL(ThingActions actions, @Nullable String url) {
+ return ((ChromecastActions) actions).playURL(url);
+ }
+
+ public static boolean playURL(ThingActions actions, @Nullable String url, @Nullable String mediaType) {
+ return ((ChromecastActions) actions).playURL(url, mediaType);
+ }
+
+ @Override
+ public void setThingHandler(@Nullable ThingHandler handler) {
+ if (handler instanceof ChromecastHandler) {
+ this.handler = (ChromecastHandler) handler;
+ }
+ }
+
+ @Override
+ public @Nullable ThingHandler getThingHandler() {
+ return handler;
+ }
+}
package org.openhab.binding.chromecast.internal.handler;
import java.io.IOException;
+import java.util.Collection;
import java.util.Collections;
import java.util.Locale;
import java.util.Set;
import org.openhab.binding.chromecast.internal.ChromecastEventReceiver;
import org.openhab.binding.chromecast.internal.ChromecastScheduler;
import org.openhab.binding.chromecast.internal.ChromecastStatusUpdater;
+import org.openhab.binding.chromecast.internal.action.ChromecastActions;
import org.openhab.binding.chromecast.internal.config.ChromecastConfig;
import org.openhab.core.audio.AudioFormat;
import org.openhab.core.audio.AudioHTTPServer;
import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.ThingStatusDetail;
import org.openhab.core.thing.binding.BaseThingHandler;
+import org.openhab.core.thing.binding.ThingHandlerService;
import org.openhab.core.types.Command;
import org.openhab.core.types.State;
import org.slf4j.Logger;
* @author Markus Rathgeb, Kai Kreuzer - Initial contribution
* @author Daniel Walters - Online status fix, handle playuri channel and refactor play media code
* @author Jason Holmes - Media Status. Refactor the monolith into separate classes.
+ * @author Scott Hanson - Added Actions.
*/
@NonNullByDefault
public class ChromecastHandler extends BaseThingHandler implements AudioSink {
}
}
+ @Override
+ public Collection<Class<? extends ThingHandlerService>> getServices() {
+ return Collections.singletonList(ChromecastActions.class);
+ }
+
+ public boolean playURL(String url, @Nullable String mediaType) {
+ Coordinator localCoordinator = coordinator;
+ if (localCoordinator != null) {
+ localCoordinator.commander.playMedia(null, url, mediaType);
+ return true;
+ }
+ return false;
+ }
+
private static class Coordinator {
private final Logger logger = LoggerFactory.getLogger(Coordinator.class);