2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.onkyo.internal.handler;
15 import java.util.HashMap;
18 import org.openhab.binding.onkyo.internal.OnkyoBindingConstants;
19 import org.openhab.core.io.transport.upnp.UpnpIOParticipant;
20 import org.openhab.core.io.transport.upnp.UpnpIOService;
21 import org.openhab.core.library.types.StringType;
22 import org.openhab.core.thing.Thing;
23 import org.openhab.core.thing.binding.BaseThingHandler;
24 import org.openhab.core.types.Command;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
29 * The {@link OnkyoUpnpHandler} is a base class for ThingHandlers for devices which support UPnP playback.
31 * @author Paul Frank - Initial contribution
32 * @author Laurent Garnier - Separated into OnkyoUpnpHandler and OnkyoAudioSink
34 public abstract class OnkyoUpnpHandler extends BaseThingHandler implements UpnpIOParticipant {
36 private final Logger logger = LoggerFactory.getLogger(OnkyoUpnpHandler.class);
38 private UpnpIOService service;
40 public OnkyoUpnpHandler(Thing thing, UpnpIOService upnpIOService) {
42 this.service = upnpIOService;
45 protected void handlePlayUri(Command command) {
46 if (command instanceof StringType) {
48 playMedia(command.toString());
50 } catch (IllegalStateException e) {
51 logger.warn("Cannot play URI ({})", e.getMessage());
56 public void playMedia(String url) {
58 removeAllTracksFromQueue();
60 if (!url.startsWith("x-") && (!url.startsWith("http"))) {
61 url = "x-file-cifs:" + url;
64 setCurrentURI(url, "");
70 Map<String, String> inputs = new HashMap<>();
71 inputs.put("InstanceID", "0");
73 Map<String, String> result = service.invokeAction(this, "AVTransport", "Stop", inputs);
75 for (String variable : result.keySet()) {
76 this.onValueReceived(variable, result.get(variable), "AVTransport");
81 Map<String, String> inputs = new HashMap<>();
82 inputs.put("InstanceID", "0");
83 inputs.put("Speed", "1");
84 Map<String, String> result = service.invokeAction(this, "AVTransport", "Play", inputs);
86 for (String variable : result.keySet()) {
87 this.onValueReceived(variable, result.get(variable), "AVTransport");
91 private void removeAllTracksFromQueue() {
92 Map<String, String> inputs = new HashMap<>();
93 inputs.put("InstanceID", "0");
95 Map<String, String> result = service.invokeAction(this, "AVTransport", "RemoveAllTracksFromQueue", inputs);
97 for (String variable : result.keySet()) {
98 this.onValueReceived(variable, result.get(variable), "AVTransport");
102 private void setCurrentURI(String uri, String uriMetaData) {
103 if (uri != null && uriMetaData != null) {
104 Map<String, String> inputs = new HashMap<>();
107 inputs.put("InstanceID", "0");
108 inputs.put("CurrentURI", uri);
109 inputs.put("CurrentURIMetaData", uriMetaData);
110 } catch (NumberFormatException ex) {
111 logger.error("Action Invalid Value Format Exception {}", ex.getMessage());
114 Map<String, String> result = service.invokeAction(this, "AVTransport", "SetAVTransportURI", inputs);
116 for (String variable : result.keySet()) {
117 this.onValueReceived(variable, result.get(variable), "AVTransport");
123 public String getUDN() {
124 return (String) this.getConfig().get(OnkyoBindingConstants.UDN_PARAMETER);
128 public void onValueReceived(String variable, String value, String service) {
129 logger.debug("received variable {} with value {} from service {}", variable, value, service);
133 public void onServiceSubscribed(String service, boolean succeeded) {
137 public void onStatusChanged(boolean status) {