82 lines
3.3 KiB
Java
82 lines
3.3 KiB
Java
package ctbrec.ui.action;
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.io.IOException;
|
|
import java.security.InvalidKeyException;
|
|
import java.security.NoSuchAlgorithmException;
|
|
import java.util.Optional;
|
|
import java.util.concurrent.CompletableFuture;
|
|
import java.util.concurrent.ExecutionException;
|
|
|
|
import org.eclipse.jetty.io.RuntimeIOException;
|
|
import ctbrec.GlobalThreadPool;
|
|
import ctbrec.Model;
|
|
import ctbrec.recorder.Recorder;
|
|
import ctbrec.recorder.download.StreamSource;
|
|
import ctbrec.sites.ModelOfflineException;
|
|
import ctbrec.ui.StreamSourceSelectionDialog;
|
|
import ctbrec.ui.controls.Dialogs;
|
|
import javafx.application.Platform;
|
|
import javafx.scene.Cursor;
|
|
import javafx.scene.Node;
|
|
|
|
@Slf4j
|
|
public class SwitchStreamResolutionAction {
|
|
private Node source;
|
|
private Model selectedModel;
|
|
private Recorder recorder;
|
|
|
|
public SwitchStreamResolutionAction(Node source, Model selectedModel, Recorder recorder) {
|
|
this.source = source;
|
|
this.selectedModel = selectedModel;
|
|
this.recorder = recorder;
|
|
}
|
|
|
|
public CompletableFuture<Void> execute() {
|
|
source.setCursor(Cursor.WAIT);
|
|
var couldntSwitchHeaderText = "Couldn't switch stream resolution";
|
|
|
|
return CompletableFuture.supplyAsync(() -> {
|
|
checkOnlineState();
|
|
return selectedModel;
|
|
}, GlobalThreadPool.get())
|
|
.thenAccept(m -> Platform.runLater(() -> {
|
|
StreamSourceSelectionDialog dialog = new StreamSourceSelectionDialog(source.getScene(), selectedModel);
|
|
Optional<StreamSource> selectedSource = dialog.showAndWait();
|
|
if (selectedSource.isPresent()) {
|
|
StreamSource src = selectedSource.get();
|
|
if (src != StreamSourceSelectionDialog.LOADING) {
|
|
int index = dialog.indexOf(selectedSource.get());
|
|
selectedModel.setStreamUrlIndex(index);
|
|
try {
|
|
recorder.switchStreamSource(selectedModel);
|
|
} catch (InvalidKeyException | NoSuchAlgorithmException | IllegalStateException | IOException e) {
|
|
log.error(couldntSwitchHeaderText, e);
|
|
Dialogs.showError(source.getScene(), "Couldn't switch stream resolution", "Error while switching stream resolution", e);
|
|
}
|
|
}
|
|
}
|
|
source.setCursor(Cursor.DEFAULT);
|
|
}))
|
|
.exceptionally(ex -> {
|
|
Dialogs.showError(source.getScene(), couldntSwitchHeaderText, "The resolution can only be changed when the model is online", null);
|
|
Platform.runLater(() -> source.setCursor(Cursor.DEFAULT));
|
|
return null;
|
|
});
|
|
}
|
|
|
|
private void checkOnlineState() {
|
|
try {
|
|
if (!selectedModel.isOnline(true)) {
|
|
throw new ModelOfflineException(selectedModel);
|
|
}
|
|
} catch (IOException | ExecutionException e) {
|
|
throw new RuntimeIOException(e);
|
|
} catch (InterruptedException e) {
|
|
Thread.currentThread().interrupt();
|
|
throw new RuntimeException(e); // NOSONAR
|
|
}
|
|
}
|
|
}
|