From 1259a402523e72c05e381e4bfbbe2355c2735149 Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Tue, 30 Jan 2018 15:38:25 +0100 Subject: [PATCH 01/10] Added dynamic state descriptions for opening pvr stream channels Signed-off-by: Christoph Weitkamp --- .../META-INF/MANIFEST.MF | 1 + .../binding/kodi/handler/KodiHandler.java | 59 ++++++++++++------ .../KodiDynamicStateDescriptionProvider.java | 62 +++++++++++++++++++ .../kodi/internal/KodiHandlerFactory.java | 13 +++- .../internal/protocol/KodiConnection.java | 47 +++++++++++--- 5 files changed, 156 insertions(+), 26 deletions(-) create mode 100644 addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/KodiDynamicStateDescriptionProvider.java diff --git a/addons/binding/org.openhab.binding.kodi/META-INF/MANIFEST.MF b/addons/binding/org.openhab.binding.kodi/META-INF/MANIFEST.MF index 1d7dceabdfc73..afbc1d93ebe43 100644 --- a/addons/binding/org.openhab.binding.kodi/META-INF/MANIFEST.MF +++ b/addons/binding/org.openhab.binding.kodi/META-INF/MANIFEST.MF @@ -37,5 +37,6 @@ Import-Package: org.openhab.binding.kodi.handler, org.osgi.framework, org.osgi.service.component, + org.osgi.service.component.annotations, org.slf4j Service-Component: OSGI-INF/*.xml diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java index c7a13447035b8..8e0b0fd7e19a9 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java @@ -12,6 +12,8 @@ import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -33,7 +35,9 @@ import org.eclipse.smarthome.core.types.Command; import org.eclipse.smarthome.core.types.RefreshType; import org.eclipse.smarthome.core.types.State; +import org.eclipse.smarthome.core.types.StateOption; import org.eclipse.smarthome.core.types.UnDefType; +import org.openhab.binding.kodi.internal.KodiDynamicStateDescriptionProvider; import org.openhab.binding.kodi.internal.KodiEventListener; import org.openhab.binding.kodi.internal.config.KodiChannelConfig; import org.openhab.binding.kodi.internal.config.KodiConfig; @@ -48,7 +52,6 @@ * @author Paul Frank - Initial contribution * @author Christoph Weitkamp - Added channels for opening PVR TV or Radio streams * @author Andreas Reinhardt & Christoph Weitkamp - Added channels for thumbnail and fanart - * */ public class KodiHandler extends BaseThingHandler implements KodiEventListener { @@ -60,9 +63,13 @@ public class KodiHandler extends BaseThingHandler implements KodiEventListener { private ScheduledFuture statusUpdaterFuture; - public KodiHandler(@NonNull Thing thing) { + private KodiDynamicStateDescriptionProvider stateDescriptionProvider; + + public KodiHandler(@NonNull Thing thing, KodiDynamicStateDescriptionProvider stateDescriptionProvider) { super(thing); connection = new KodiConnection(this); + + this.stateDescriptionProvider = stateDescriptionProvider; } @Override @@ -156,9 +163,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { break; case CHANNEL_PVR_OPEN_TV: if (command instanceof StringType) { - KodiChannelConfig config = getThing().getChannel(channelUID.getId()).getConfiguration() - .as(KodiChannelConfig.class); - playPVRChannel(command, "tv", config); + playPVRChannel(command, "tv", CHANNEL_PVR_OPEN_TV); updateState(CHANNEL_PVR_OPEN_TV, UnDefType.UNDEF); } else if (command.equals(RefreshType.REFRESH)) { updateState(CHANNEL_PVR_OPEN_TV, UnDefType.UNDEF); @@ -166,9 +171,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { break; case CHANNEL_PVR_OPEN_RADIO: if (command instanceof StringType) { - KodiChannelConfig config = getThing().getChannel(channelUID.getId()).getConfiguration() - .as(KodiChannelConfig.class); - playPVRChannel(command, "radio", config); + playPVRChannel(command, "radio", CHANNEL_PVR_OPEN_RADIO); updateState(CHANNEL_PVR_OPEN_RADIO, UnDefType.UNDEF); } else if (command.equals(RefreshType.REFRESH)) { updateState(CHANNEL_PVR_OPEN_RADIO, UnDefType.UNDEF); @@ -247,18 +250,24 @@ public void playURI(Command command) { connection.playURI(command.toString()); } - public void playPVRChannel(final Command command, final String channelType, final KodiChannelConfig config) { - int channelGroupID = connection.getChannelGroupID(channelType, config.getGroup()); - if (channelGroupID <= 0) { - logger.warn("Received unknown PVR channel group {}. Using default.", config.getGroup()); - channelGroupID = (channelType == "tv") ? 1 : 2; - } - int channelID = connection.getChannelID(channelGroupID, command.toString()); + public void playPVRChannel(final Command command, final String channelType, final String channelId) { + KodiChannelConfig config = getThing().getChannel(channelId).getConfiguration().as(KodiChannelConfig.class); + int channelID = connection.getChannelID(getPVRChannelGroupID(channelType, config.getGroup()), + command.toString()); if (channelID > 0) { connection.playPVRChannel(channelID); } else { - logger.debug("Received unknown PVR channel {}", command.toString()); + logger.debug("Received unknown PVR channel '{}'.", command.toString()); + } + } + + private int getPVRChannelGroupID(final String channelType, final String channelGroupName) { + int channelGroupID = connection.getChannelGroupID(channelType, channelGroupName); + if (channelGroupID <= 0) { + logger.warn("Received unknown PVR channel group '{}'. Using default.", channelGroupName); + channelGroupID = (channelType == "tv") ? 1 : 2; } + return channelGroupID; } public void playNotificationSoundURI(Command command) { @@ -284,7 +293,10 @@ public void initialize() { connection.connect(host, getIntConfigParameter(WS_PORT_PARAMETER, 9090), scheduler, getImageBaseUrl()); connectionCheckerFuture = scheduler.scheduleWithFixedDelay(() -> { - if (!connection.checkConnection()) { + if (connection.checkConnection()) { + updatePVRChannelStateDescription("tv", CHANNEL_PVR_OPEN_TV); + updatePVRChannelStateDescription("radio", CHANNEL_PVR_OPEN_RADIO); + } else { updateStatus(ThingStatus.OFFLINE); } }, 1, 10, TimeUnit.SECONDS); @@ -301,6 +313,18 @@ public void initialize() { } } + private void updatePVRChannelStateDescription(final String channelType, final String channelId) { + if (isLinked(channelId)) { + KodiChannelConfig config = getThing().getChannel(channelId).getConfiguration().as(KodiChannelConfig.class); + List channels = connection.getChannelsAsList(getPVRChannelGroupID(channelType, config.getGroup())); + List options = new ArrayList<>(); + for (String channel : channels) { + options.add(new StateOption(channel, channel)); + } + stateDescriptionProvider.setStateOptions(new ChannelUID(getThing().getUID(), channelId), options); + } + } + @Override public void updateConnectionState(boolean connected) { if (connected) { @@ -422,5 +446,4 @@ private State createImage(RawType image) { return image; } } - } diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/KodiDynamicStateDescriptionProvider.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/KodiDynamicStateDescriptionProvider.java new file mode 100644 index 0000000000000..a76f146d3d386 --- /dev/null +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/KodiDynamicStateDescriptionProvider.java @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2010-2018 by the respective copyright holders. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.openhab.binding.kodi.internal; + +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.smarthome.core.thing.Channel; +import org.eclipse.smarthome.core.thing.ChannelUID; +import org.eclipse.smarthome.core.thing.type.DynamicStateDescriptionProvider; +import org.eclipse.smarthome.core.types.StateDescription; +import org.eclipse.smarthome.core.types.StateOption; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; + +/** + * Dynamic provider of state options while leaving other state description fields as original. + * + * @author Gregory Moyer - Initial contribution + * @author Christoph Weitkamp - Adapted to Kodi binding + */ +@Component(service = { DynamicStateDescriptionProvider.class, + KodiDynamicStateDescriptionProvider.class }, immediate = true) +@NonNullByDefault +public class KodiDynamicStateDescriptionProvider implements DynamicStateDescriptionProvider { + private final Map> channelOptionsMap = new ConcurrentHashMap<>(); + + public void setStateOptions(ChannelUID channelUID, List options) { + channelOptionsMap.put(channelUID, options); + } + + @Override + public @Nullable StateDescription getStateDescription(Channel channel, @Nullable StateDescription original, + @Nullable Locale locale) { + List options = channelOptionsMap.get(channel.getUID()); + if (options == null) { + return null; + } + + if (original != null) { + return new StateDescription(original.getMinimum(), original.getMaximum(), original.getStep(), + original.getPattern(), original.isReadOnly(), options); + } + + return new StateDescription(null, null, null, null, false, options); + } + + @Deactivate + public void deactivate() { + channelOptionsMap.clear(); + } +} diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/KodiHandlerFactory.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/KodiHandlerFactory.java index 1a7aff028689f..475809c758fd3 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/KodiHandlerFactory.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/KodiHandlerFactory.java @@ -38,6 +38,7 @@ * handlers. * * @author Paul Frank - Initial contribution + * @author Christoph Weitkamp - Improvements on channels for opening PVR TV or Radio streams */ @Component(service = ThingHandlerFactory.class, immediate = true, configurationPid = "binding.kodi", configurationPolicy = ConfigurationPolicy.OPTIONAL) public class KodiHandlerFactory extends BaseThingHandlerFactory { @@ -52,6 +53,8 @@ public class KodiHandlerFactory extends BaseThingHandlerFactory { private Map> audioSinkRegistrations = new ConcurrentHashMap<>(); + private KodiDynamicStateDescriptionProvider stateDescriptionProvider; + @Override protected void activate(ComponentContext componentContext) { super.activate(componentContext); @@ -69,7 +72,7 @@ protected ThingHandler createHandler(Thing thing) { ThingTypeUID thingTypeUID = thing.getThingTypeUID(); if (thingTypeUID.equals(THING_TYPE_KODI)) { - KodiHandler handler = new KodiHandler(thing); + KodiHandler handler = new KodiHandler(thing, stateDescriptionProvider); // register the Kodi as an audio sink KodiAudioSink audioSink = new KodiAudioSink(handler, audioHTTPServer, createCallbackUrl()); @@ -132,4 +135,12 @@ protected void unsetNetworkAddressService(NetworkAddressService networkAddressSe this.networkAddressService = null; } + @Reference + protected void setDynamicStateDescriptionProvider(KodiDynamicStateDescriptionProvider stateDescriptionProvider) { + this.stateDescriptionProvider = stateDescriptionProvider; + } + + protected void unsetDynamicStateDescriptionProvider(KodiDynamicStateDescriptionProvider stateDescriptionProvider) { + this.stateDescriptionProvider = null; + } } diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java index ff8c7a3c3f63d..2b244f91d24fd 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java @@ -12,7 +12,9 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URLEncoder; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -38,7 +40,6 @@ * @author Paul Frank - Initial contribution * @author Christoph Weitkamp - Added channels for opening PVR TV or Radio streams * @author Andreas Reinhardt & Christoph Weitkamp - Added channels for thumbnail and fanart - * */ public class KodiConnection implements KodiClientSocketEventListener { @@ -50,6 +51,8 @@ public class KodiConnection implements KodiClientSocketEventListener { .asList(new Integer[] { -32, -16, -8, -4, -2, 1, 2, 4, 8, 16, 32 }); private static final ExpiringCacheMap IMAGE_CACHE = new ExpiringCacheMap<>( TimeUnit.MINUTES.toMillis(15)); // 15min + private static final ExpiringCacheMap REQUEST_CACHE = new ExpiringCacheMap<>( + TimeUnit.MINUTES.toMillis(5)); // 5min private URI wsUri; private URI imageUri; @@ -569,9 +572,16 @@ public synchronized void playURI(String uri) { } private synchronized JsonArray getChannelGroups(final String channelType) { - JsonObject params = new JsonObject(); - params.addProperty("channeltype", channelType); - JsonElement response = socket.callMethod("PVR.GetChannelGroups", params); + String method = "PVR.GetChannelGroups"; + String hash = method + "#channeltype=" + channelType; + if (!REQUEST_CACHE.containsKey(hash)) { + REQUEST_CACHE.put(hash, () -> { + JsonObject params = new JsonObject(); + params.addProperty("channeltype", channelType); + return socket.callMethod(method, params); + }); + } + JsonElement response = REQUEST_CACHE.get(hash); if (response instanceof JsonObject) { JsonObject result = response.getAsJsonObject(); @@ -597,9 +607,16 @@ public int getChannelGroupID(final String channelType, final String channelGroup } private synchronized JsonArray getChannels(final int channelGroupID) { - JsonObject params = new JsonObject(); - params.addProperty("channelgroupid", channelGroupID); - JsonElement response = socket.callMethod("PVR.GetChannels", params); + String method = "PVR.GetChannels"; + String hash = method + "#channelgroupid=" + channelGroupID; + if (!REQUEST_CACHE.containsKey(hash)) { + REQUEST_CACHE.put(hash, () -> { + JsonObject params = new JsonObject(); + params.addProperty("channelgroupid", channelGroupID); + return socket.callMethod(method, params); + }); + } + JsonElement response = REQUEST_CACHE.get(hash); if (response instanceof JsonObject) { JsonObject result = response.getAsJsonObject(); @@ -610,6 +627,22 @@ private synchronized JsonArray getChannels(final int channelGroupID) { return null; } + public List getChannelsAsList(final int channelGroupID) { + JsonArray array = getChannels(channelGroupID); + if (array instanceof JsonArray) { + List channels = new ArrayList<>(); + for (JsonElement element : array) { + JsonObject channel = (JsonObject) element; + if (channel.has("label")) { + channels.add(channel.get("label").getAsString()); + } + } + return Collections.unmodifiableList(channels); + } else { + return Collections.emptyList(); + } + } + public int getChannelID(final int channelGroupID, final String channelName) { JsonArray channels = getChannels(channelGroupID); if (channels instanceof JsonArray) { From 4e658c04d1c9b93edb271fd2d338253fde9180aa Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Tue, 6 Feb 2018 16:45:17 +0100 Subject: [PATCH 02/10] Incorporate changes from review Signed-off-by: Christoph Weitkamp --- .../binding/kodi/KodiBindingConstants.java | 2 + .../binding/kodi/handler/KodiHandler.java | 10 ++--- .../internal/protocol/KodiConnection.java | 37 +++++++------------ 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/KodiBindingConstants.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/KodiBindingConstants.java index 5da1ff4b8d188..a61706d247726 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/KodiBindingConstants.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/KodiBindingConstants.java @@ -70,4 +70,6 @@ public class KodiBindingConstants { public static final String MANUFACTURER = "XBMC Foundation"; public static final String UPNP_DEVICE_TYPE = "MediaRenderer"; + public static final String PVR_TV = "tv"; + public static final String PVR_RADIO = "radio"; } diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java index 8e0b0fd7e19a9..c1dae819be30a 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java @@ -163,7 +163,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { break; case CHANNEL_PVR_OPEN_TV: if (command instanceof StringType) { - playPVRChannel(command, "tv", CHANNEL_PVR_OPEN_TV); + playPVRChannel(command, PVR_TV, CHANNEL_PVR_OPEN_TV); updateState(CHANNEL_PVR_OPEN_TV, UnDefType.UNDEF); } else if (command.equals(RefreshType.REFRESH)) { updateState(CHANNEL_PVR_OPEN_TV, UnDefType.UNDEF); @@ -171,7 +171,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { break; case CHANNEL_PVR_OPEN_RADIO: if (command instanceof StringType) { - playPVRChannel(command, "radio", CHANNEL_PVR_OPEN_RADIO); + playPVRChannel(command, PVR_RADIO, CHANNEL_PVR_OPEN_RADIO); updateState(CHANNEL_PVR_OPEN_RADIO, UnDefType.UNDEF); } else if (command.equals(RefreshType.REFRESH)) { updateState(CHANNEL_PVR_OPEN_RADIO, UnDefType.UNDEF); @@ -265,7 +265,7 @@ private int getPVRChannelGroupID(final String channelType, final String channelG int channelGroupID = connection.getChannelGroupID(channelType, channelGroupName); if (channelGroupID <= 0) { logger.warn("Received unknown PVR channel group '{}'. Using default.", channelGroupName); - channelGroupID = (channelType == "tv") ? 1 : 2; + channelGroupID = PVR_TV.equals(channelType) ? 1 : 2; } return channelGroupID; } @@ -294,8 +294,8 @@ public void initialize() { connectionCheckerFuture = scheduler.scheduleWithFixedDelay(() -> { if (connection.checkConnection()) { - updatePVRChannelStateDescription("tv", CHANNEL_PVR_OPEN_TV); - updatePVRChannelStateDescription("radio", CHANNEL_PVR_OPEN_RADIO); + updatePVRChannelStateDescription(PVR_TV, CHANNEL_PVR_OPEN_TV); + updatePVRChannelStateDescription(PVR_RADIO, CHANNEL_PVR_OPEN_RADIO); } else { updateStatus(ThingStatus.OFFLINE); } diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java index 2b244f91d24fd..49709bd549401 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java @@ -371,13 +371,10 @@ private String convertToImageUrl(JsonElement element) { private RawType downloadImage(String url) { if (StringUtils.isNotEmpty(url)) { - if (!IMAGE_CACHE.containsKey(url)) { - IMAGE_CACHE.put(url, () -> { - logger.debug("Trying to download the content of URL {}", url); - return HttpUtil.downloadImage(url); - }); - } - RawType image = IMAGE_CACHE.get(url); + RawType image = IMAGE_CACHE.putIfAbsentAndGet(url, () -> { + logger.debug("Trying to download the content of URL {}", url); + return HttpUtil.downloadImage(url); + }); if (image == null) { logger.debug("Failed to download the content of URL {}", url); return null; @@ -574,14 +571,11 @@ public synchronized void playURI(String uri) { private synchronized JsonArray getChannelGroups(final String channelType) { String method = "PVR.GetChannelGroups"; String hash = method + "#channeltype=" + channelType; - if (!REQUEST_CACHE.containsKey(hash)) { - REQUEST_CACHE.put(hash, () -> { - JsonObject params = new JsonObject(); - params.addProperty("channeltype", channelType); - return socket.callMethod(method, params); - }); - } - JsonElement response = REQUEST_CACHE.get(hash); + JsonElement response = REQUEST_CACHE.putIfAbsentAndGet(hash, () -> { + JsonObject params = new JsonObject(); + params.addProperty("channeltype", channelType); + return socket.callMethod(method, params); + }); if (response instanceof JsonObject) { JsonObject result = response.getAsJsonObject(); @@ -609,14 +603,11 @@ public int getChannelGroupID(final String channelType, final String channelGroup private synchronized JsonArray getChannels(final int channelGroupID) { String method = "PVR.GetChannels"; String hash = method + "#channelgroupid=" + channelGroupID; - if (!REQUEST_CACHE.containsKey(hash)) { - REQUEST_CACHE.put(hash, () -> { - JsonObject params = new JsonObject(); - params.addProperty("channelgroupid", channelGroupID); - return socket.callMethod(method, params); - }); - } - JsonElement response = REQUEST_CACHE.get(hash); + JsonElement response = REQUEST_CACHE.putIfAbsentAndGet(hash, () -> { + JsonObject params = new JsonObject(); + params.addProperty("channelgroupid", channelGroupID); + return socket.callMethod(method, params); + }); if (response instanceof JsonObject) { JsonObject result = response.getAsJsonObject(); From f1cf03095f4baa99f034cf112865c881e38fb144 Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Thu, 8 Feb 2018 08:30:49 +0100 Subject: [PATCH 03/10] Added model for Kodi specific entities Signed-off-by: Christoph Weitkamp --- .../binding/kodi/handler/KodiHandler.java | 8 ++-- .../kodi/internal/model/KodiBaseItem.java | 29 ++++++++++++ .../kodi/internal/model/KodiPVRChannel.java | 29 ++++++++++++ .../internal/model/KodiPVRChannelGroup.java | 42 +++++++++++++++++ .../internal/model/KodiPVRChannelGroups.java | 44 ++++++++++++++++++ .../kodi/internal/model/KodiPVRChannels.java | 44 ++++++++++++++++++ .../internal/protocol/KodiConnection.java | 45 +++++++++++++++---- 7 files changed, 230 insertions(+), 11 deletions(-) create mode 100644 addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiBaseItem.java create mode 100644 addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannel.java create mode 100644 addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannelGroup.java create mode 100644 addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannelGroups.java create mode 100644 addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannels.java diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java index 8e0b0fd7e19a9..89cca4b87d210 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java @@ -41,6 +41,7 @@ import org.openhab.binding.kodi.internal.KodiEventListener; import org.openhab.binding.kodi.internal.config.KodiChannelConfig; import org.openhab.binding.kodi.internal.config.KodiConfig; +import org.openhab.binding.kodi.internal.model.KodiPVRChannel; import org.openhab.binding.kodi.internal.protocol.KodiConnection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -316,10 +317,11 @@ public void initialize() { private void updatePVRChannelStateDescription(final String channelType, final String channelId) { if (isLinked(channelId)) { KodiChannelConfig config = getThing().getChannel(channelId).getConfiguration().as(KodiChannelConfig.class); - List channels = connection.getChannelsAsList(getPVRChannelGroupID(channelType, config.getGroup())); + List channels = connection + .getChannelsAsList(getPVRChannelGroupID(channelType, config.getGroup())); List options = new ArrayList<>(); - for (String channel : channels) { - options.add(new StateOption(channel, channel)); + for (KodiPVRChannel channel : channels) { + options.add(new StateOption(channel.getLabel(), channel.getLabel())); } stateDescriptionProvider.setStateOptions(new ChannelUID(getThing().getUID(), channelId), options); } diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiBaseItem.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiBaseItem.java new file mode 100644 index 0000000000000..cf101f4de9e93 --- /dev/null +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiBaseItem.java @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2010-2018 by the respective copyright holders. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.openhab.binding.kodi.internal.model; + +/** + * Class representing a Kodi base item + * + * @author Christoph Weitkamp - Initial contribution + */ +public abstract class KodiBaseItem { + /** + * The label of the item + */ + protected String label; + + public String getLabel() { + return label; + } + + public void setLabel(final String label) { + this.label = label; + } +} diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannel.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannel.java new file mode 100644 index 0000000000000..2e4f550d49984 --- /dev/null +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannel.java @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2010-2018 by the respective copyright holders. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.openhab.binding.kodi.internal.model; + +/** + * Class representing a Kodi PVR channel + * + * @author Christoph Weitkamp - Initial contribution + */ +public class KodiPVRChannel extends KodiBaseItem { + /** + * The PVR channel id + */ + private int channelId; + + public int getId() { + return channelId; + } + + public void setId(int channelId) { + this.channelId = channelId; + } +} diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannelGroup.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannelGroup.java new file mode 100644 index 0000000000000..36b1a7b2b2440 --- /dev/null +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannelGroup.java @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2010-2018 by the respective copyright holders. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.openhab.binding.kodi.internal.model; + +/** + * Class representing a Kodi PVR channel group + * + * @author Christoph Weitkamp - Initial contribution + */ +public class KodiPVRChannelGroup extends KodiBaseItem { + /** + * The PVR channel group id + */ + private int channelGroupId; + + /** + * The PVR channel type + */ + private String channelType; + + public int getId() { + return channelGroupId; + } + + public void setId(final int channelGroupId) { + this.channelGroupId = channelGroupId; + } + + public String getChannelType() { + return channelType; + } + + public void setChannelType(final String channelType) { + this.channelType = channelType; + } +} diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannelGroups.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannelGroups.java new file mode 100644 index 0000000000000..0b1fd01ba6cae --- /dev/null +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannelGroups.java @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2010-2018 by the respective copyright holders. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.openhab.binding.kodi.internal.model; + +import java.util.List; + +/** + * Class representing a Kodi PVR channel group list + * + * @author Christoph Weitkamp - Initial contribution + */ +public class KodiPVRChannelGroups { + /** + * The PVR channel type + */ + private String channelType; + + /** + * A list of {@link KodiPVRChannelGroup}s + */ + private List channelGroups; + + public String getChannelType() { + return channelType; + } + + public void setChannelType(final String channelType) { + this.channelType = channelType; + } + + public List getChannelgroups() { + return channelGroups; + } + + public void setChannelgroups(List channelGroups) { + this.channelGroups = channelGroups; + } +} diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannels.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannels.java new file mode 100644 index 0000000000000..58650d3ef833e --- /dev/null +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannels.java @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2010-2018 by the respective copyright holders. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.openhab.binding.kodi.internal.model; + +import java.util.List; + +/** + * Class representing a Kodi PVR channel list + * + * @author Christoph Weitkamp - Initial contribution + */ +public class KodiPVRChannels { + /** + * The PVR channel group id of the related {@link KodiPVRChannelGroup} + */ + private int channelGroupId; + + /** + * A list of {@link KodiPVRChannel}s + */ + private List channels; + + public int getChannelGroupId() { + return channelGroupId; + } + + public void setChannelGroupId(int channelGroupId) { + this.channelGroupId = channelGroupId; + } + + public List getChannels() { + return channels; + } + + public void setChannels(List channels) { + this.channels = channels; + } +} diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java index 2b244f91d24fd..a2ea02cc3178a 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java @@ -20,15 +20,21 @@ import java.util.concurrent.TimeUnit; import org.apache.commons.lang.StringUtils; -import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import org.eclipse.smarthome.core.cache.ExpiringCacheMap; import org.eclipse.smarthome.core.library.types.RawType; import org.eclipse.smarthome.io.net.http.HttpUtil; import org.openhab.binding.kodi.internal.KodiEventListener; import org.openhab.binding.kodi.internal.KodiEventListener.KodiState; +import org.openhab.binding.kodi.internal.model.KodiPVRChannel; +import org.openhab.binding.kodi.internal.model.KodiPVRChannelGroup; +import org.openhab.binding.kodi.internal.model.KodiPVRChannelGroups; +import org.openhab.binding.kodi.internal.model.KodiPVRChannels; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -62,6 +68,7 @@ public class KodiConnection implements KodiClientSocketEventListener { private KodiState currentState = KodiState.Stop; private final KodiEventListener listener; + private static final Gson GSON = new GsonBuilder().create(); public KodiConnection(KodiEventListener listener) { this.listener = listener; @@ -132,7 +139,7 @@ public synchronized void playerPrevious() { updatePlayerStatus(); } - private void goToInternal(@NonNull String to) { + private void goToInternal(String to) { int activePlayer = getActivePlayer(); JsonObject params = new JsonObject(); @@ -571,6 +578,8 @@ public synchronized void playURI(String uri) { socket.callMethod("Player.Open", params); } + @Nullable + // public synchronized KodiPVRChannelGroups getChannelGroups(final String channelType) { private synchronized JsonArray getChannelGroups(final String channelType) { String method = "PVR.GetChannelGroups"; String hash = method + "#channeltype=" + channelType; @@ -583,6 +592,10 @@ private synchronized JsonArray getChannelGroups(final String channelType) { } JsonElement response = REQUEST_CACHE.get(hash); + // if( response instanceof JsonElement) { + // KodiPVRChannelGroups channelGroups = GSON.fromJson(response, KodiPVRChannelGroups.class); + // channelGroups.setChannelType(channelType); + // return channelGroups; if (response instanceof JsonObject) { JsonObject result = response.getAsJsonObject(); if (result.has("channelgroups")) { @@ -593,6 +606,12 @@ private synchronized JsonArray getChannelGroups(final String channelType) { } public int getChannelGroupID(final String channelType, final String channelGroupName) { + // KodiPVRChannelGroups channelGroups = getChannelGroups(channelType); + // for (KodiPVRChannelGroup channelGroup : channelGroups.getChannelgroups()) { + // if (StringUtils.equalsIgnoreCase(channelGroup.getLabel(), channelGroupName)) { + // return channelGroup.getId(); + // } + // } JsonArray channelGroups = getChannelGroups(channelType); if (channelGroups instanceof JsonArray) { for (JsonElement element : channelGroups) { @@ -606,6 +625,8 @@ public int getChannelGroupID(final String channelType, final String channelGroup return 0; } + @Nullable + // public synchronized KodiPVRChannels getChannels(final int channelGroupID) { private synchronized JsonArray getChannels(final int channelGroupID) { String method = "PVR.GetChannels"; String hash = method + "#channelgroupid=" + channelGroupID; @@ -618,6 +639,10 @@ private synchronized JsonArray getChannels(final int channelGroupID) { } JsonElement response = REQUEST_CACHE.get(hash); + // if (response instanceof JsonElement) { + // KodiPVRChannels channels = GSON.fromJson(response, KodiPVRChannels.class); + // channels.setChannelGroupId(channelGroupID); + // return channels; if (response instanceof JsonObject) { JsonObject result = response.getAsJsonObject(); if (result.has("channels")) { @@ -627,15 +652,13 @@ private synchronized JsonArray getChannels(final int channelGroupID) { return null; } - public List getChannelsAsList(final int channelGroupID) { + public List getChannelsAsList(final int channelGroupID) { JsonArray array = getChannels(channelGroupID); if (array instanceof JsonArray) { - List channels = new ArrayList<>(); + List channels = new ArrayList<>(); for (JsonElement element : array) { - JsonObject channel = (JsonObject) element; - if (channel.has("label")) { - channels.add(channel.get("label").getAsString()); - } + KodiPVRChannel channel = GSON.fromJson(element, KodiPVRChannel.class); + channels.add(channel); } return Collections.unmodifiableList(channels); } else { @@ -644,6 +667,12 @@ public List getChannelsAsList(final int channelGroupID) { } public int getChannelID(final int channelGroupID, final String channelName) { + // KodiPVRChannels channels = getChannels(channelGroupID); + // for (KodiPVRChannel channel : channels.getChannels()) { + // if (StringUtils.equalsIgnoreCase(channel.getLabel(), channelName)) { + // return channel.getId(); + // } + // } JsonArray channels = getChannels(channelGroupID); if (channels instanceof JsonArray) { for (JsonElement element : channels) { From 9b49743a81414174eafee69674e3fde06bf4584f Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Thu, 8 Feb 2018 10:32:53 +0100 Subject: [PATCH 04/10] Added model for Kodi specific entities Signed-off-by: Christoph Weitkamp --- .../binding/kodi/handler/KodiHandler.java | 16 ++-- .../kodi/internal/model/KodiPVRChannel.java | 12 +++ .../internal/model/KodiPVRChannelGroups.java | 44 --------- .../kodi/internal/model/KodiPVRChannels.java | 44 --------- .../internal/protocol/KodiConnection.java | 95 ++++++------------- 5 files changed, 47 insertions(+), 164 deletions(-) delete mode 100644 addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannelGroups.java delete mode 100644 addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannels.java diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java index 486190bb4931a..ccc873522c53c 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java @@ -252,17 +252,18 @@ public void playURI(Command command) { } public void playPVRChannel(final Command command, final String channelType, final String channelId) { - KodiChannelConfig config = getThing().getChannel(channelId).getConfiguration().as(KodiChannelConfig.class); - int channelID = connection.getChannelID(getPVRChannelGroupID(channelType, config.getGroup()), - command.toString()); + int channelGroupID = getPVRChannelGroupID(channelType, channelId); + int channelID = connection.getChannelID(channelGroupID, command.toString()); if (channelID > 0) { connection.playPVRChannel(channelID); } else { - logger.debug("Received unknown PVR channel '{}'.", command.toString()); + logger.debug("Received unknown PVR channel '{}'.", command); } } - private int getPVRChannelGroupID(final String channelType, final String channelGroupName) { + private int getPVRChannelGroupID(final String channelType, final String channelId) { + KodiChannelConfig config = getThing().getChannel(channelId).getConfiguration().as(KodiChannelConfig.class); + String channelGroupName = config.getGroup(); int channelGroupID = connection.getChannelGroupID(channelType, channelGroupName); if (channelGroupID <= 0) { logger.warn("Received unknown PVR channel group '{}'. Using default.", channelGroupName); @@ -316,9 +317,8 @@ public void initialize() { private void updatePVRChannelStateDescription(final String channelType, final String channelId) { if (isLinked(channelId)) { - KodiChannelConfig config = getThing().getChannel(channelId).getConfiguration().as(KodiChannelConfig.class); - List channels = connection - .getChannelsAsList(getPVRChannelGroupID(channelType, config.getGroup())); + int channelGroupID = getPVRChannelGroupID(channelType, channelId); + List channels = connection.getChannels(channelGroupID); List options = new ArrayList<>(); for (KodiPVRChannel channel : channels) { options.add(new StateOption(channel.getLabel(), channel.getLabel())); diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannel.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannel.java index 2e4f550d49984..2d07ada26e9cc 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannel.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannel.java @@ -18,6 +18,10 @@ public class KodiPVRChannel extends KodiBaseItem { * The PVR channel id */ private int channelId; + /** + * The PVR channel group id + */ + private int channelGroupId; public int getId() { return channelId; @@ -26,4 +30,12 @@ public int getId() { public void setId(int channelId) { this.channelId = channelId; } + + public int getChannelGroupId() { + return channelGroupId; + } + + public void setChannelGroupId(int channelGroupId) { + this.channelGroupId = channelGroupId; + } } diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannelGroups.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannelGroups.java deleted file mode 100644 index 0b1fd01ba6cae..0000000000000 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannelGroups.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2010-2018 by the respective copyright holders. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - */ -package org.openhab.binding.kodi.internal.model; - -import java.util.List; - -/** - * Class representing a Kodi PVR channel group list - * - * @author Christoph Weitkamp - Initial contribution - */ -public class KodiPVRChannelGroups { - /** - * The PVR channel type - */ - private String channelType; - - /** - * A list of {@link KodiPVRChannelGroup}s - */ - private List channelGroups; - - public String getChannelType() { - return channelType; - } - - public void setChannelType(final String channelType) { - this.channelType = channelType; - } - - public List getChannelgroups() { - return channelGroups; - } - - public void setChannelgroups(List channelGroups) { - this.channelGroups = channelGroups; - } -} diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannels.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannels.java deleted file mode 100644 index 58650d3ef833e..0000000000000 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiPVRChannels.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2010-2018 by the respective copyright holders. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - */ -package org.openhab.binding.kodi.internal.model; - -import java.util.List; - -/** - * Class representing a Kodi PVR channel list - * - * @author Christoph Weitkamp - Initial contribution - */ -public class KodiPVRChannels { - /** - * The PVR channel group id of the related {@link KodiPVRChannelGroup} - */ - private int channelGroupId; - - /** - * A list of {@link KodiPVRChannel}s - */ - private List channels; - - public int getChannelGroupId() { - return channelGroupId; - } - - public void setChannelGroupId(int channelGroupId) { - this.channelGroupId = channelGroupId; - } - - public List getChannels() { - return channels; - } - - public void setChannels(List channels) { - this.channels = channels; - } -} diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java index c7978148a4577..8c5dcb3ac90a2 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java @@ -14,13 +14,11 @@ import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.apache.commons.lang.StringUtils; -import org.eclipse.jdt.annotation.Nullable; import org.eclipse.smarthome.core.cache.ExpiringCacheMap; import org.eclipse.smarthome.core.library.types.RawType; import org.eclipse.smarthome.io.net.http.HttpUtil; @@ -28,13 +26,9 @@ import org.openhab.binding.kodi.internal.KodiEventListener.KodiState; import org.openhab.binding.kodi.internal.model.KodiPVRChannel; import org.openhab.binding.kodi.internal.model.KodiPVRChannelGroup; -import org.openhab.binding.kodi.internal.model.KodiPVRChannelGroups; -import org.openhab.binding.kodi.internal.model.KodiPVRChannels; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -68,7 +62,6 @@ public class KodiConnection implements KodiClientSocketEventListener { private KodiState currentState = KodiState.Stop; private final KodiEventListener listener; - private static final Gson GSON = new GsonBuilder().create(); public KodiConnection(KodiEventListener listener) { this.listener = listener; @@ -575,9 +568,7 @@ public synchronized void playURI(String uri) { socket.callMethod("Player.Open", params); } - @Nullable - // public synchronized KodiPVRChannelGroups getChannelGroups(final String channelType) { - private synchronized JsonArray getChannelGroups(final String channelType) { + public synchronized List getChannelGroups(final String channelType) { String method = "PVR.GetChannelGroups"; String hash = method + "#channeltype=" + channelType; JsonElement response = REQUEST_CACHE.putIfAbsentAndGet(hash, () -> { @@ -586,42 +577,32 @@ private synchronized JsonArray getChannelGroups(final String channelType) { return socket.callMethod(method, params); }); - // if( response instanceof JsonElement) { - // KodiPVRChannelGroups channelGroups = GSON.fromJson(response, KodiPVRChannelGroups.class); - // channelGroups.setChannelType(channelType); - // return channelGroups; + List channelGroups = new ArrayList<>(); if (response instanceof JsonObject) { JsonObject result = response.getAsJsonObject(); - if (result.has("channelgroups")) { - return result.get("channelgroups").getAsJsonArray(); + for (JsonElement element : result.get("channelgroups").getAsJsonArray()) { + JsonObject object = (JsonObject) element; + KodiPVRChannelGroup channelGroup = new KodiPVRChannelGroup(); + channelGroup.setId(object.get("channelgroupid").getAsInt()); + channelGroup.setLabel(object.get("label").getAsString()); + channelGroup.setChannelType(channelType); + channelGroups.add(channelGroup); } } - return null; + return channelGroups; } public int getChannelGroupID(final String channelType, final String channelGroupName) { - // KodiPVRChannelGroups channelGroups = getChannelGroups(channelType); - // for (KodiPVRChannelGroup channelGroup : channelGroups.getChannelgroups()) { - // if (StringUtils.equalsIgnoreCase(channelGroup.getLabel(), channelGroupName)) { - // return channelGroup.getId(); - // } - // } - JsonArray channelGroups = getChannelGroups(channelType); - if (channelGroups instanceof JsonArray) { - for (JsonElement element : channelGroups) { - JsonObject channelGroup = (JsonObject) element; - String label = channelGroup.get("label").getAsString(); - if (StringUtils.equalsIgnoreCase(label, channelGroupName)) { - return channelGroup.get("channelgroupid").getAsInt(); - } + List channelGroups = getChannelGroups(channelType); + for (KodiPVRChannelGroup channelGroup : channelGroups) { + if (StringUtils.equalsIgnoreCase(channelGroup.getLabel(), channelGroupName)) { + return channelGroup.getId(); } } return 0; } - @Nullable - // public synchronized KodiPVRChannels getChannels(final int channelGroupID) { - private synchronized JsonArray getChannels(final int channelGroupID) { + public synchronized List getChannels(final int channelGroupID) { String method = "PVR.GetChannels"; String hash = method + "#channelgroupid=" + channelGroupID; JsonElement response = REQUEST_CACHE.putIfAbsentAndGet(hash, () -> { @@ -630,48 +611,26 @@ private synchronized JsonArray getChannels(final int channelGroupID) { return socket.callMethod(method, params); }); - // if (response instanceof JsonElement) { - // KodiPVRChannels channels = GSON.fromJson(response, KodiPVRChannels.class); - // channels.setChannelGroupId(channelGroupID); - // return channels; + List channels = new ArrayList<>(); if (response instanceof JsonObject) { JsonObject result = response.getAsJsonObject(); - if (result.has("channels")) { - return result.get("channels").getAsJsonArray(); - } - } - return null; - } - - public List getChannelsAsList(final int channelGroupID) { - JsonArray array = getChannels(channelGroupID); - if (array instanceof JsonArray) { - List channels = new ArrayList<>(); - for (JsonElement element : array) { - KodiPVRChannel channel = GSON.fromJson(element, KodiPVRChannel.class); + for (JsonElement element : result.get("channels").getAsJsonArray()) { + JsonObject object = (JsonObject) element; + KodiPVRChannel channel = new KodiPVRChannel(); + channel.setId(object.get("channelid").getAsInt()); + channel.setLabel(object.get("label").getAsString()); + channel.setChannelGroupId(channelGroupID); channels.add(channel); } - return Collections.unmodifiableList(channels); - } else { - return Collections.emptyList(); } + return channels; } public int getChannelID(final int channelGroupID, final String channelName) { - // KodiPVRChannels channels = getChannels(channelGroupID); - // for (KodiPVRChannel channel : channels.getChannels()) { - // if (StringUtils.equalsIgnoreCase(channel.getLabel(), channelName)) { - // return channel.getId(); - // } - // } - JsonArray channels = getChannels(channelGroupID); - if (channels instanceof JsonArray) { - for (JsonElement element : channels) { - JsonObject channel = (JsonObject) element; - String label = channel.get("label").getAsString(); - if (StringUtils.equalsIgnoreCase(label, channelName)) { - return channel.get("channelid").getAsInt(); - } + List channels = getChannels(channelGroupID); + for (KodiPVRChannel channel : channels) { + if (StringUtils.equalsIgnoreCase(channel.getLabel(), channelName)) { + return channel.getId(); } } return 0; From da43a3c48f5a8e15570a312733df638fb39b13d4 Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Thu, 8 Feb 2018 11:23:51 +0100 Subject: [PATCH 05/10] Changed README.md Signed-off-by: Christoph Weitkamp --- addons/binding/org.openhab.binding.kodi/README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/addons/binding/org.openhab.binding.kodi/README.md b/addons/binding/org.openhab.binding.kodi/README.md index 73313a4a19fe5..bacc5539b37c2 100644 --- a/addons/binding/org.openhab.binding.kodi/README.md +++ b/addons/binding/org.openhab.binding.kodi/README.md @@ -73,8 +73,8 @@ The Kodi thing supports the following channels: | album | String | Album name of the currently played song | | artist | String | Artist name of the currently played song or director of the currently played movie | | playuri | String | Plays the file with the provided URI | -| pvr-open-tv | String | Opens the PVR TV channel with the provided name | -| pvr-open-radio | String | Opens the PVR Radio channel with the provided name | +| pvr-open-tv | String | Opens the PVR TV channel with the provided name (channel's state options contains available PVR TV channels) | +| pvr-open-radio | String | Opens the PVR Radio channel with the provided name (channel's state options contains available PVR Radio channels) | | pvr-channel | String | Title of the currently played PVR channel | | shownotification | String | Shows the provided notification message on the screen | | input | String | Allows to control Kodi. Valid values are: `Up`, `Down`, `Left`, `Right`, `Select`, `Back`, `Home`, `ContextMenu`, `Info`, `ShowOSD`, `ShowPlayerProcessInfo`, `SendText` and `ExecuteAction` | @@ -88,9 +88,12 @@ The Kodi thing supports the following channels: ### Channel Configuration **group** The PVR channels can be put into user-defined PVR channel groups. -There are two default PVR channel groups. One for PVR TV channels and one for PVR radio channels. The default labels are "All channels" (in german systems "Alle Kanäle"). +There are two default PVR channel groups. +One for PVR TV channels and one for PVR radio channels. +The default labels are "All channels" (in german systems "Alle Kanäle"). You have to adjust this configuration to use the `pvr-open-tv` and `pvr-open-radio` channels properly. You can optionally configure an user-defined PVR channel group. +The PVR channels from Kodi will be populated during runtime into the state options of the `pvr-open-tv` and `pvr-open-radio` channels. A manual setup through a `things/kodi.things` file could look like this: @@ -146,8 +149,8 @@ sitemap demo label="myKodi" Text item=myKodi_showtitle Text item=myKodi_album Text item=myKodi_artist - Selection item=myKodi_pvropentv mappings=[Add your PVR TV channels here ...] - Selection item=myKodi_pvropenchannel mappings=[Add your PVR radio channels here ...] + Selection item=myKodi_pvropentv + Selection item=myKodi_pvropenchannel Text item=myKodi_pvrchannel Selection item=myKodi_input mappings=[Up='Up', Down='Down', Left='Left', Right='Right', Select='Select', Back='Back', Home='Home', ContextMenu='ContextMenu', Info='Info'] Selection item=myKodi_systemcommand mappings=[Shutdown='Herunterfahren', Suspend='Bereitschaft', Reboot='Neustart'] From d2d64a7639fab57a8b4d792060e6acbf80f41d1c Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Thu, 8 Feb 2018 20:16:04 +0100 Subject: [PATCH 06/10] Added NPE safeguard Signed-off-by: Christoph Weitkamp --- .../internal/protocol/KodiConnection.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java index 8c5dcb3ac90a2..9d3399484668a 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java @@ -580,13 +580,15 @@ public synchronized List getChannelGroups(final String chan List channelGroups = new ArrayList<>(); if (response instanceof JsonObject) { JsonObject result = response.getAsJsonObject(); - for (JsonElement element : result.get("channelgroups").getAsJsonArray()) { - JsonObject object = (JsonObject) element; - KodiPVRChannelGroup channelGroup = new KodiPVRChannelGroup(); - channelGroup.setId(object.get("channelgroupid").getAsInt()); - channelGroup.setLabel(object.get("label").getAsString()); - channelGroup.setChannelType(channelType); - channelGroups.add(channelGroup); + if (result.has("channelgroups")) { + for (JsonElement element : result.get("channelgroups").getAsJsonArray()) { + JsonObject object = (JsonObject) element; + KodiPVRChannelGroup channelGroup = new KodiPVRChannelGroup(); + channelGroup.setId(object.get("channelgroupid").getAsInt()); + channelGroup.setLabel(object.get("label").getAsString()); + channelGroup.setChannelType(channelType); + channelGroups.add(channelGroup); + } } } return channelGroups; @@ -614,13 +616,15 @@ public synchronized List getChannels(final int channelGroupID) { List channels = new ArrayList<>(); if (response instanceof JsonObject) { JsonObject result = response.getAsJsonObject(); - for (JsonElement element : result.get("channels").getAsJsonArray()) { - JsonObject object = (JsonObject) element; - KodiPVRChannel channel = new KodiPVRChannel(); - channel.setId(object.get("channelid").getAsInt()); - channel.setLabel(object.get("label").getAsString()); - channel.setChannelGroupId(channelGroupID); - channels.add(channel); + if (result.has("channels")) { + for (JsonElement element : result.get("channels").getAsJsonArray()) { + JsonObject object = (JsonObject) element; + KodiPVRChannel channel = new KodiPVRChannel(); + channel.setId(object.get("channelid").getAsInt()); + channel.setLabel(object.get("label").getAsString()); + channel.setChannelGroupId(channelGroupID); + channels.add(channel); + } } } return channels; From 4a9382826b8493d2a4b697028c929b0fd4d0966b Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Sat, 10 Feb 2018 16:09:54 +0100 Subject: [PATCH 07/10] Renamed 'channel*' to 'pvrChannel*' to distinguish clearly between meaning of PVR and ESH channel Signed-off-by: Christoph Weitkamp --- .../binding/kodi/handler/KodiHandler.java | 34 +++++----- .../internal/protocol/KodiConnection.java | 64 +++++++++---------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java index ccc873522c53c..3dabf72df515a 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java @@ -251,25 +251,25 @@ public void playURI(Command command) { connection.playURI(command.toString()); } - public void playPVRChannel(final Command command, final String channelType, final String channelId) { - int channelGroupID = getPVRChannelGroupID(channelType, channelId); - int channelID = connection.getChannelID(channelGroupID, command.toString()); - if (channelID > 0) { - connection.playPVRChannel(channelID); + public void playPVRChannel(final Command command, final String pvrChannelType, final String channelId) { + int pvrChannelGroupId = getPVRChannelGroupId(pvrChannelType, channelId); + int pvrChannelId = connection.getPVRChannelId(pvrChannelGroupId, command.toString()); + if (pvrChannelId > 0) { + connection.playPVRChannel(pvrChannelId); } else { logger.debug("Received unknown PVR channel '{}'.", command); } } - private int getPVRChannelGroupID(final String channelType, final String channelId) { + private int getPVRChannelGroupId(final String pvrChannelType, final String channelId) { KodiChannelConfig config = getThing().getChannel(channelId).getConfiguration().as(KodiChannelConfig.class); - String channelGroupName = config.getGroup(); - int channelGroupID = connection.getChannelGroupID(channelType, channelGroupName); - if (channelGroupID <= 0) { - logger.warn("Received unknown PVR channel group '{}'. Using default.", channelGroupName); - channelGroupID = PVR_TV.equals(channelType) ? 1 : 2; + String pvrChannelGroupName = config.getGroup(); + int pvrChannelGroupId = connection.getPVRChannelGroupId(pvrChannelType, pvrChannelGroupName); + if (pvrChannelGroupId <= 0) { + logger.warn("Received unknown PVR channel group '{}'. Using default.", pvrChannelGroupName); + pvrChannelGroupId = PVR_TV.equals(pvrChannelType) ? 1 : 2; } - return channelGroupID; + return pvrChannelGroupId; } public void playNotificationSoundURI(Command command) { @@ -315,13 +315,13 @@ public void initialize() { } } - private void updatePVRChannelStateDescription(final String channelType, final String channelId) { + private void updatePVRChannelStateDescription(final String pvrChannelType, final String channelId) { if (isLinked(channelId)) { - int channelGroupID = getPVRChannelGroupID(channelType, channelId); - List channels = connection.getChannels(channelGroupID); + int pvrChannelGroupId = getPVRChannelGroupId(pvrChannelType, channelId); + List pvrChannels = connection.getPVRChannels(pvrChannelGroupId); List options = new ArrayList<>(); - for (KodiPVRChannel channel : channels) { - options.add(new StateOption(channel.getLabel(), channel.getLabel())); + for (KodiPVRChannel pvrChannel : pvrChannels) { + options.add(new StateOption(pvrChannel.getLabel(), pvrChannel.getLabel())); } stateDescriptionProvider.setStateOptions(new ChannelUID(getThing().getUID(), channelId), options); } diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java index 9d3399484668a..9bc655ca2a5da 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java @@ -568,81 +568,81 @@ public synchronized void playURI(String uri) { socket.callMethod("Player.Open", params); } - public synchronized List getChannelGroups(final String channelType) { + public synchronized List getPVRChannelGroups(final String pvrChannelType) { String method = "PVR.GetChannelGroups"; - String hash = method + "#channeltype=" + channelType; + String hash = method + "#channeltype=" + pvrChannelType; JsonElement response = REQUEST_CACHE.putIfAbsentAndGet(hash, () -> { JsonObject params = new JsonObject(); - params.addProperty("channeltype", channelType); + params.addProperty("channeltype", pvrChannelType); return socket.callMethod(method, params); }); - List channelGroups = new ArrayList<>(); + List pvrChannelGroups = new ArrayList<>(); if (response instanceof JsonObject) { JsonObject result = response.getAsJsonObject(); if (result.has("channelgroups")) { for (JsonElement element : result.get("channelgroups").getAsJsonArray()) { JsonObject object = (JsonObject) element; - KodiPVRChannelGroup channelGroup = new KodiPVRChannelGroup(); - channelGroup.setId(object.get("channelgroupid").getAsInt()); - channelGroup.setLabel(object.get("label").getAsString()); - channelGroup.setChannelType(channelType); - channelGroups.add(channelGroup); + KodiPVRChannelGroup pvrChannelGroup = new KodiPVRChannelGroup(); + pvrChannelGroup.setId(object.get("channelgroupid").getAsInt()); + pvrChannelGroup.setLabel(object.get("label").getAsString()); + pvrChannelGroup.setChannelType(pvrChannelType); + pvrChannelGroups.add(pvrChannelGroup); } } } - return channelGroups; + return pvrChannelGroups; } - public int getChannelGroupID(final String channelType, final String channelGroupName) { - List channelGroups = getChannelGroups(channelType); - for (KodiPVRChannelGroup channelGroup : channelGroups) { - if (StringUtils.equalsIgnoreCase(channelGroup.getLabel(), channelGroupName)) { - return channelGroup.getId(); + public int getPVRChannelGroupId(final String channelType, final String pvrChannelGroupName) { + List pvrChannelGroups = getPVRChannelGroups(channelType); + for (KodiPVRChannelGroup pvrChannelGroup : pvrChannelGroups) { + if (StringUtils.equalsIgnoreCase(pvrChannelGroup.getLabel(), pvrChannelGroupName)) { + return pvrChannelGroup.getId(); } } return 0; } - public synchronized List getChannels(final int channelGroupID) { + public synchronized List getPVRChannels(final int pvrChannelGroupId) { String method = "PVR.GetChannels"; - String hash = method + "#channelgroupid=" + channelGroupID; + String hash = method + "#channelgroupid=" + pvrChannelGroupId; JsonElement response = REQUEST_CACHE.putIfAbsentAndGet(hash, () -> { JsonObject params = new JsonObject(); - params.addProperty("channelgroupid", channelGroupID); + params.addProperty("channelgroupid", pvrChannelGroupId); return socket.callMethod(method, params); }); - List channels = new ArrayList<>(); + List pvrChannels = new ArrayList<>(); if (response instanceof JsonObject) { JsonObject result = response.getAsJsonObject(); if (result.has("channels")) { for (JsonElement element : result.get("channels").getAsJsonArray()) { JsonObject object = (JsonObject) element; - KodiPVRChannel channel = new KodiPVRChannel(); - channel.setId(object.get("channelid").getAsInt()); - channel.setLabel(object.get("label").getAsString()); - channel.setChannelGroupId(channelGroupID); - channels.add(channel); + KodiPVRChannel pvrChannel = new KodiPVRChannel(); + pvrChannel.setId(object.get("channelid").getAsInt()); + pvrChannel.setLabel(object.get("label").getAsString()); + pvrChannel.setChannelGroupId(pvrChannelGroupId); + pvrChannels.add(pvrChannel); } } } - return channels; + return pvrChannels; } - public int getChannelID(final int channelGroupID, final String channelName) { - List channels = getChannels(channelGroupID); - for (KodiPVRChannel channel : channels) { - if (StringUtils.equalsIgnoreCase(channel.getLabel(), channelName)) { - return channel.getId(); + public int getPVRChannelId(final int pvrChannelGroupId, final String pvrChannelName) { + List pvrChannels = getPVRChannels(pvrChannelGroupId); + for (KodiPVRChannel pvrChannel : pvrChannels) { + if (StringUtils.equalsIgnoreCase(pvrChannel.getLabel(), pvrChannelName)) { + return pvrChannel.getId(); } } return 0; } - public synchronized void playPVRChannel(final int channelID) { + public synchronized void playPVRChannel(final int pvrChannelId) { JsonObject item = new JsonObject(); - item.addProperty("channelid", channelID); + item.addProperty("channelid", pvrChannelId); JsonObject params = new JsonObject(); params.add("item", item); From fd61b7ae3bcbb9be11ccf0053d288ac86b575b97 Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Fri, 23 Feb 2018 07:48:33 +0100 Subject: [PATCH 08/10] Incorporated changes from review Signed-off-by: Christoph Weitkamp --- .../java/org/openhab/binding/kodi/handler/KodiHandler.java | 2 +- .../org/openhab/binding/kodi/internal/model/KodiBaseItem.java | 2 +- .../binding/kodi/internal/protocol/KodiConnection.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java index 3dabf72df515a..3e4fa243daf29 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java @@ -64,7 +64,7 @@ public class KodiHandler extends BaseThingHandler implements KodiEventListener { private ScheduledFuture statusUpdaterFuture; - private KodiDynamicStateDescriptionProvider stateDescriptionProvider; + private final KodiDynamicStateDescriptionProvider stateDescriptionProvider; public KodiHandler(@NonNull Thing thing, KodiDynamicStateDescriptionProvider stateDescriptionProvider) { super(thing); diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiBaseItem.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiBaseItem.java index cf101f4de9e93..2af27a2ab60a4 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiBaseItem.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/model/KodiBaseItem.java @@ -17,7 +17,7 @@ public abstract class KodiBaseItem { /** * The label of the item */ - protected String label; + private String label; public String getLabel() { return label; diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java index 9bc655ca2a5da..71f9103dfa74a 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java @@ -50,9 +50,9 @@ public class KodiConnection implements KodiClientSocketEventListener { private static final List SPEEDS = Arrays .asList(new Integer[] { -32, -16, -8, -4, -2, 1, 2, 4, 8, 16, 32 }); private static final ExpiringCacheMap IMAGE_CACHE = new ExpiringCacheMap<>( - TimeUnit.MINUTES.toMillis(15)); // 15min + TimeUnit.MINUTES.toMillis(15)); private static final ExpiringCacheMap REQUEST_CACHE = new ExpiringCacheMap<>( - TimeUnit.MINUTES.toMillis(5)); // 5min + TimeUnit.MINUTES.toMillis(5)); private URI wsUri; private URI imageUri; From a435f61c0fe291375a4caa002c4c1679d61c8ea8 Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Fri, 23 Feb 2018 07:54:04 +0100 Subject: [PATCH 09/10] Incorporated changes from review Signed-off-by: Christoph Weitkamp --- .../java/org/openhab/binding/kodi/handler/KodiHandler.java | 3 +-- .../binding/kodi/internal/protocol/KodiConnection.java | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java index 3e4fa243daf29..ed4bec714280e 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java @@ -318,9 +318,8 @@ public void initialize() { private void updatePVRChannelStateDescription(final String pvrChannelType, final String channelId) { if (isLinked(channelId)) { int pvrChannelGroupId = getPVRChannelGroupId(pvrChannelType, channelId); - List pvrChannels = connection.getPVRChannels(pvrChannelGroupId); List options = new ArrayList<>(); - for (KodiPVRChannel pvrChannel : pvrChannels) { + for (KodiPVRChannel pvrChannel : connection.getPVRChannels(pvrChannelGroupId)) { options.add(new StateOption(pvrChannel.getLabel(), pvrChannel.getLabel())); } stateDescriptionProvider.setStateOptions(new ChannelUID(getThing().getUID(), channelId), options); diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java index 71f9103dfa74a..15b62f39c9f99 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/internal/protocol/KodiConnection.java @@ -595,8 +595,7 @@ public synchronized List getPVRChannelGroups(final String p } public int getPVRChannelGroupId(final String channelType, final String pvrChannelGroupName) { - List pvrChannelGroups = getPVRChannelGroups(channelType); - for (KodiPVRChannelGroup pvrChannelGroup : pvrChannelGroups) { + for (KodiPVRChannelGroup pvrChannelGroup : getPVRChannelGroups(channelType)) { if (StringUtils.equalsIgnoreCase(pvrChannelGroup.getLabel(), pvrChannelGroupName)) { return pvrChannelGroup.getId(); } @@ -631,8 +630,7 @@ public synchronized List getPVRChannels(final int pvrChannelGrou } public int getPVRChannelId(final int pvrChannelGroupId, final String pvrChannelName) { - List pvrChannels = getPVRChannels(pvrChannelGroupId); - for (KodiPVRChannel pvrChannel : pvrChannels) { + for (KodiPVRChannel pvrChannel : getPVRChannels(pvrChannelGroupId)) { if (StringUtils.equalsIgnoreCase(pvrChannel.getLabel(), pvrChannelName)) { return pvrChannel.getId(); } From c2f2efc12d205a77d2d5858a12e9580b7b44d6b1 Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Fri, 23 Feb 2018 09:02:45 +0100 Subject: [PATCH 10/10] Reduced log level Signed-off-by: Christoph Weitkamp --- .../main/java/org/openhab/binding/kodi/handler/KodiHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java index ed4bec714280e..e546fd2de1b1c 100644 --- a/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java +++ b/addons/binding/org.openhab.binding.kodi/src/main/java/org/openhab/binding/kodi/handler/KodiHandler.java @@ -266,7 +266,7 @@ private int getPVRChannelGroupId(final String pvrChannelType, final String chann String pvrChannelGroupName = config.getGroup(); int pvrChannelGroupId = connection.getPVRChannelGroupId(pvrChannelType, pvrChannelGroupName); if (pvrChannelGroupId <= 0) { - logger.warn("Received unknown PVR channel group '{}'. Using default.", pvrChannelGroupName); + logger.debug("Received unknown PVR channel group '{}'. Using default.", pvrChannelGroupName); pvrChannelGroupId = PVR_TV.equals(pvrChannelType) ? 1 : 2; } return pvrChannelGroupId;