]> git.basschouten.com Git - openhab-addons.git/blob
6c74bef40ea3996b920c5c23f97afc702228ac5d
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2024 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.jellyfin.internal.discovery;
14
15 import static org.openhab.binding.jellyfin.internal.JellyfinBindingConstants.DISCOVERY_RESULT_TTL_SEC;
16 import static org.openhab.binding.jellyfin.internal.JellyfinBindingConstants.THING_TYPE_CLIENT;
17 import static org.openhab.binding.jellyfin.internal.JellyfinBindingConstants.THING_TYPE_SERVER;
18
19 import java.util.HashMap;
20 import java.util.Map;
21 import java.util.Set;
22
23 import org.eclipse.jdt.annotation.NonNullByDefault;
24 import org.eclipse.jdt.annotation.Nullable;
25 import org.jellyfin.sdk.api.client.exception.ApiClientException;
26 import org.jellyfin.sdk.api.client.exception.InvalidStatusException;
27 import org.jellyfin.sdk.model.api.SessionInfo;
28 import org.openhab.binding.jellyfin.internal.handler.JellyfinServerHandler;
29 import org.openhab.binding.jellyfin.internal.util.SyncCallback;
30 import org.openhab.core.config.discovery.AbstractDiscoveryService;
31 import org.openhab.core.config.discovery.DiscoveryResultBuilder;
32 import org.openhab.core.thing.Thing;
33 import org.openhab.core.thing.ThingStatus;
34 import org.openhab.core.thing.ThingUID;
35 import org.openhab.core.thing.binding.ThingHandler;
36 import org.openhab.core.thing.binding.ThingHandlerService;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40 /**
41  * The {@link JellyfinClientDiscoveryService} discover Jellyfin clients connected to the server.
42  *
43  * @author Miguel Alvarez - Initial contribution
44  */
45 @NonNullByDefault
46 public class JellyfinClientDiscoveryService extends AbstractDiscoveryService implements ThingHandlerService {
47     private final Logger logger = LoggerFactory.getLogger(JellyfinClientDiscoveryService.class);
48     private @Nullable JellyfinServerHandler bridgeHandler;
49
50     public JellyfinClientDiscoveryService() throws IllegalArgumentException {
51         super(Set.of(THING_TYPE_SERVER), 60);
52     }
53
54     @Override
55     protected void startScan() {
56         var bridgeHandler = this.bridgeHandler;
57         if (bridgeHandler == null) {
58             logger.warn("missing bridge aborting");
59             return;
60         }
61         if (!bridgeHandler.getThing().getStatus().equals(ThingStatus.ONLINE)) {
62             logger.warn("Server handler {} is not online.", bridgeHandler.getThing().getLabel());
63             return;
64         }
65         logger.debug("Searching devices for server {}", bridgeHandler.getThing().getLabel());
66         try {
67             bridgeHandler.getControllableSessions().forEach(this::discoverDevice);
68         } catch (SyncCallback.SyncCallbackError syncCallbackError) {
69             logger.error("Unexpected error: {}", syncCallbackError.getMessage());
70         } catch (InvalidStatusException e) {
71             logger.warn("Api client error with status{}: {}", e.getStatus(), e.getMessage());
72         } catch (ApiClientException e) {
73             logger.warn("Api client error: {}", e.getMessage());
74         }
75     }
76
77     public void discoverDevice(SessionInfo info) {
78         var id = info.getDeviceId();
79         if (id == null) {
80             logger.warn("missing device id aborting");
81             return;
82         }
83         var bridgeHandler = this.bridgeHandler;
84         if (bridgeHandler == null) {
85             logger.warn("missing bridge aborting");
86             return;
87         }
88         logger.debug("Client discovered: [{}] {}", id, info.getDeviceName());
89         var bridgeUID = bridgeHandler.getThing().getUID();
90         Map<String, Object> properties = new HashMap<>();
91         properties.put(Thing.PROPERTY_SERIAL_NUMBER, id);
92         var appVersion = info.getApplicationVersion();
93         if (appVersion != null) {
94             properties.put(Thing.PROPERTY_FIRMWARE_VERSION, appVersion);
95         }
96         var client = info.getApplicationVersion();
97         if (client != null) {
98             properties.put(Thing.PROPERTY_VENDOR, client);
99         }
100         thingDiscovered(
101                 DiscoveryResultBuilder.create(new ThingUID(THING_TYPE_CLIENT, bridgeUID, id)).withBridge(bridgeUID)
102                         .withTTL(DISCOVERY_RESULT_TTL_SEC).withRepresentationProperty(Thing.PROPERTY_SERIAL_NUMBER)
103                         .withProperties(properties).withLabel(info.getDeviceName()).build());
104     }
105
106     @Override
107     public void setThingHandler(ThingHandler thingHandler) {
108         if (thingHandler instanceof JellyfinServerHandler bridgeHandler) {
109             this.bridgeHandler = bridgeHandler;
110         }
111     }
112
113     @Override
114     public @Nullable ThingHandler getThingHandler() {
115         return null;
116     }
117
118     @Override
119     public void activate() {
120         activate(new HashMap<>());
121     }
122
123     @Override
124     public void deactivate() {
125         super.deactivate();
126     }
127 }