diff --git a/src/main/java/de/ph87/home/tvheadend/TvheadendService.java b/src/main/java/de/ph87/home/tvheadend/TvheadendService.java index 90533db..6b53254 100644 --- a/src/main/java/de/ph87/home/tvheadend/TvheadendService.java +++ b/src/main/java/de/ph87/home/tvheadend/TvheadendService.java @@ -1,6 +1,7 @@ package de.ph87.home.tvheadend; import de.ph87.home.property.*; +import de.ph87.home.tvheadend.api.ReceiverNeed; import de.ph87.home.tvheadend.api.TvheadendApiService; import de.ph87.home.tvheadend.api.TvheadendStatus; import jakarta.annotation.Nullable; @@ -16,6 +17,7 @@ import java.time.Duration; import java.time.ZonedDateTime; import java.util.Objects; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; @Slf4j @Service @@ -37,7 +39,7 @@ public class TvheadendService { private boolean receiverLastState = false; - @Scheduled(initialDelay = 0, fixedDelay = 5, timeUnit = TimeUnit.SECONDS) + @Scheduled(initialDelay = 5, fixedDelay = 5, timeUnit = TimeUnit.SECONDS) public void update() { final TvheadendStatus status; try { @@ -66,9 +68,11 @@ public class TvheadendService { final ZonedDateTime now = ZonedDateTime.now(); final String shouldBeMessage; if (status.receiverNeeded) { - shouldBeMessage = "Receiver is needed."; + final String neededFor = status.receiverNeededFor.stream().map(ReceiverNeed::toString).collect(Collectors.joining(", ")); + shouldBeMessage = "Receiver is currently needed for: %s".formatted(neededFor); } else if (status.recordingNext != null) { - shouldBeMessage = "Receiver is needed in %s".formatted(durationToString(Duration.between(now, status.recordingNext.getStart_real().minus(tvheadendConfig.getBEFORE_RECORDING())))); + final String durationString = durationToString(Duration.between(now, status.recordingNext.getStart_real().minus(tvheadendConfig.getBEFORE_RECORDING()))); + shouldBeMessage = "Receiver is needed for %s in %s".formatted(ReceiverNeed.RECORDING, durationString); } else { shouldBeMessage = "Receiver is NOT needed."; } diff --git a/src/main/java/de/ph87/home/tvheadend/api/ReceiverNeed.java b/src/main/java/de/ph87/home/tvheadend/api/ReceiverNeed.java new file mode 100644 index 0000000..3bd09fb --- /dev/null +++ b/src/main/java/de/ph87/home/tvheadend/api/ReceiverNeed.java @@ -0,0 +1,5 @@ +package de.ph87.home.tvheadend.api; + +public enum ReceiverNeed { + RECORDING, STREAM, EPG, CONNECTION +} diff --git a/src/main/java/de/ph87/home/tvheadend/api/TvheadendStatus.java b/src/main/java/de/ph87/home/tvheadend/api/TvheadendStatus.java index 28d0474..19e2cc4 100644 --- a/src/main/java/de/ph87/home/tvheadend/api/TvheadendStatus.java +++ b/src/main/java/de/ph87/home/tvheadend/api/TvheadendStatus.java @@ -9,6 +9,7 @@ import lombok.NonNull; import lombok.ToString; import java.time.Duration; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -38,6 +39,8 @@ public class TvheadendStatus { public final boolean receiverNeeded; + public final List receiverNeededFor; + public TvheadendStatus( @NonNull final Duration beforeRecording, @NonNull final List inputList, @@ -49,11 +52,27 @@ public class TvheadendStatus { this.subscriptionList = subscriptionList; this.inputList = inputList; this.recordingList = recordingList; - this.recordingNext = recordingList.stream().min(Comparator.comparing(DvrEntryGridUpcoming.Entry::getStart_real)).orElse(null); - this.receiverNeededForConnected = !connectionList.isEmpty(); - this.receiverNeededForSubscribed = !subscriptionList.isEmpty(); - this.receiverNeededForRecording = recordingNext != null && recordingNext.shouldBeOnForRecording(beforeRecording); - this.receiverNeeded = this.receiverNeededForConnected || this.receiverNeededForSubscribed || this.receiverNeededForRecording; + + recordingNext = recordingList.stream().min(Comparator.comparing(DvrEntryGridUpcoming.Entry::getStart_real)).orElse(null); + receiverNeededForConnected = !connectionList.isEmpty(); + receiverNeededForSubscribed = !subscriptionList.isEmpty(); + receiverNeededForRecording = recordingNext != null && recordingNext.shouldBeOnForRecording(beforeRecording); + receiverNeeded = receiverNeededForConnected || receiverNeededForSubscribed || receiverNeededForRecording; + + final List needs = new ArrayList<>(); + if (receiverNeededForRecording) { + needs.add(ReceiverNeed.RECORDING); + } + if (subscriptionList.stream().anyMatch(s -> !s.getTitle().equals("epggrab"))) { + needs.add(ReceiverNeed.STREAM); + } + if (subscriptionList.stream().anyMatch(s -> s.getTitle().equals("epggrab"))) { + needs.add(ReceiverNeed.EPG); + } + if (receiverNeededForConnected) { + needs.add(ReceiverNeed.CONNECTION); + } + receiverNeededFor = needs; } }