public class CameraChannelHelper extends ChannelHelper {
private static final String QUALITY_CONF_ENTRY = "quality";
private static final String LIVE_PICTURE = "/live/snapshot_720.jpg";
- private boolean isLocal;
+
private @Nullable String vpnUrl;
private @Nullable String localUrl;
super(providedGroups);
}
- public void setUrls(String vpnUrl, @Nullable String localUrl) {
+ public void setUrls(@Nullable String vpnUrl, @Nullable String localUrl) {
this.localUrl = localUrl;
this.vpnUrl = vpnUrl;
- this.isLocal = localUrl != null;
- }
-
- public @Nullable String getLocalURL() {
- return localUrl;
}
@Override
protected @Nullable State internalGetProperty(String channelId, NAThing naThing, Configuration config) {
if (naThing instanceof HomeStatusModule camera) {
- boolean isMonitoring = OnOffType.ON.equals(camera.getMonitoring());
- switch (channelId) {
- case CHANNEL_MONITORING:
- return camera.getMonitoring();
- case CHANNEL_SD_CARD:
- return toStringType(camera.getSdStatus());
- case CHANNEL_ALIM_STATUS:
- return toStringType(camera.getAlimStatus());
- case CHANNEL_LIVEPICTURE_VPN_URL:
- return toStringType(getLivePictureURL(false, isMonitoring));
- case CHANNEL_LIVEPICTURE_LOCAL_URL:
- return toStringType(getLivePictureURL(true, isMonitoring));
- case CHANNEL_LIVEPICTURE:
- return toRawType(getLivePictureURL(isLocal, isMonitoring));
- case CHANNEL_LIVESTREAM_VPN_URL:
- return getLiveStreamURL(false, (String) config.get(QUALITY_CONF_ENTRY), isMonitoring);
- case CHANNEL_LIVESTREAM_LOCAL_URL:
- return getLiveStreamURL(true, (String) config.get(QUALITY_CONF_ENTRY), isMonitoring);
- }
+ return switch (channelId) {
+ case CHANNEL_MONITORING -> camera.getMonitoring();
+ case CHANNEL_SD_CARD -> toStringType(camera.getSdStatus());
+ case CHANNEL_ALIM_STATUS -> toStringType(camera.getAlimStatus());
+ default -> liveChannels(channelId, (String) config.get(QUALITY_CONF_ENTRY), camera,
+ OnOffType.ON.equals(camera.getMonitoring()), localUrl != null);
+ };
}
return null;
}
- private @Nullable String getLivePictureURL(boolean local, boolean isMonitoring) {
- String url = local ? localUrl : vpnUrl;
- if (!isMonitoring || (local && !isLocal) || url == null) {
+ public @Nullable String getLivePictureURL(boolean local, boolean isMonitoring) {
+ String url = getUrl(local);
+ if (!isMonitoring || url == null) {
return null;
}
return "%s%s".formatted(url, LIVE_PICTURE);
}
+ private @Nullable State liveChannels(String channelId, String qualityConf, HomeStatusModule camera,
+ boolean isMonitoring, boolean isLocal) {
+ if (vpnUrl == null) {
+ setUrls(camera.getVpnUrl(), localUrl);
+ }
+ return switch (channelId) {
+ case CHANNEL_LIVESTREAM_LOCAL_URL ->
+ isLocal ? getLiveStreamURL(true, qualityConf, isMonitoring) : UnDefType.NULL;
+ case CHANNEL_LIVEPICTURE_LOCAL_URL ->
+ isLocal ? toStringType(getLivePictureURL(true, isMonitoring)) : UnDefType.NULL;
+ case CHANNEL_LIVESTREAM_VPN_URL -> getLiveStreamURL(false, qualityConf, isMonitoring);
+ case CHANNEL_LIVEPICTURE_VPN_URL -> toStringType(getLivePictureURL(false, isMonitoring));
+ case CHANNEL_LIVEPICTURE -> {
+ State result = toRawType(getLivePictureURL(isLocal, isMonitoring));
+ if (UnDefType.NULL.equals(result) && isLocal) {// If local read is unsuccessfull, try the VPN version
+ result = toRawType(getLivePictureURL(false, isMonitoring));
+ }
+ yield result;
+ }
+ default -> null;
+ };
+ }
+
+ private @Nullable String getUrl(boolean local) {
+ return local ? localUrl : vpnUrl;
+ }
+
private State getLiveStreamURL(boolean local, @Nullable String configQual, boolean isMonitoring) {
- String url = local ? localUrl : vpnUrl;
- if (!isMonitoring || (local && !isLocal) || url == null) {
+ String url = getUrl(local);
+ if (!isMonitoring || url == null) {
return UnDefType.NULL;
}
String finalQual = configQual != null ? configQual : "poor";
- return toStringType("%s/live/%s", url, local ? "files/%s/index.m3u8".formatted(finalQual) : "index.m3u8");
+ return toStringType("%s/live/%sindex.m3u8", url, local ? "files/%s/".formatted(finalQual) : "");
}
}