ReceiverNeed enum

This commit is contained in:
Patrick Haßel 2024-11-20 14:18:17 +01:00
parent 6f66cc060c
commit 03631e17c2
3 changed files with 36 additions and 8 deletions

View File

@ -1,6 +1,7 @@
package de.ph87.home.tvheadend; package de.ph87.home.tvheadend;
import de.ph87.home.property.*; 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.TvheadendApiService;
import de.ph87.home.tvheadend.api.TvheadendStatus; import de.ph87.home.tvheadend.api.TvheadendStatus;
import jakarta.annotation.Nullable; import jakarta.annotation.Nullable;
@ -16,6 +17,7 @@ import java.time.Duration;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j @Slf4j
@Service @Service
@ -37,7 +39,7 @@ public class TvheadendService {
private boolean receiverLastState = false; private boolean receiverLastState = false;
@Scheduled(initialDelay = 0, fixedDelay = 5, timeUnit = TimeUnit.SECONDS) @Scheduled(initialDelay = 5, fixedDelay = 5, timeUnit = TimeUnit.SECONDS)
public void update() { public void update() {
final TvheadendStatus status; final TvheadendStatus status;
try { try {
@ -66,9 +68,11 @@ public class TvheadendService {
final ZonedDateTime now = ZonedDateTime.now(); final ZonedDateTime now = ZonedDateTime.now();
final String shouldBeMessage; final String shouldBeMessage;
if (status.receiverNeeded) { 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) { } 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 { } else {
shouldBeMessage = "Receiver is NOT needed."; shouldBeMessage = "Receiver is NOT needed.";
} }

View File

@ -0,0 +1,5 @@
package de.ph87.home.tvheadend.api;
public enum ReceiverNeed {
RECORDING, STREAM, EPG, CONNECTION
}

View File

@ -9,6 +9,7 @@ import lombok.NonNull;
import lombok.ToString; import lombok.ToString;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
@ -38,6 +39,8 @@ public class TvheadendStatus {
public final boolean receiverNeeded; public final boolean receiverNeeded;
public final List<ReceiverNeed> receiverNeededFor;
public TvheadendStatus( public TvheadendStatus(
@NonNull final Duration beforeRecording, @NonNull final Duration beforeRecording,
@NonNull final List<StatusInputs.Entry> inputList, @NonNull final List<StatusInputs.Entry> inputList,
@ -49,11 +52,27 @@ public class TvheadendStatus {
this.subscriptionList = subscriptionList; this.subscriptionList = subscriptionList;
this.inputList = inputList; this.inputList = inputList;
this.recordingList = recordingList; this.recordingList = recordingList;
this.recordingNext = recordingList.stream().min(Comparator.comparing(DvrEntryGridUpcoming.Entry::getStart_real)).orElse(null);
this.receiverNeededForConnected = !connectionList.isEmpty(); recordingNext = recordingList.stream().min(Comparator.comparing(DvrEntryGridUpcoming.Entry::getStart_real)).orElse(null);
this.receiverNeededForSubscribed = !subscriptionList.isEmpty(); receiverNeededForConnected = !connectionList.isEmpty();
this.receiverNeededForRecording = recordingNext != null && recordingNext.shouldBeOnForRecording(beforeRecording); receiverNeededForSubscribed = !subscriptionList.isEmpty();
this.receiverNeeded = this.receiverNeededForConnected || this.receiverNeededForSubscribed || this.receiverNeededForRecording; receiverNeededForRecording = recordingNext != null && recordingNext.shouldBeOnForRecording(beforeRecording);
receiverNeeded = receiverNeededForConnected || receiverNeededForSubscribed || receiverNeededForRecording;
final List<ReceiverNeed> 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;
} }
} }