forked from j62/ctbrec
1
0
Fork 0

Check for running downloads on shutdown

Check for running downloads and ask the user to exit anyway to prevent
half downloaded files.
This commit is contained in:
0xboobface 2020-05-23 13:49:50 +02:00
parent 5e46933905
commit 7912b3b727
2 changed files with 61 additions and 30 deletions

View File

@ -49,6 +49,7 @@ import ctbrec.sites.mfc.MyFreeCams;
import ctbrec.sites.showup.Showup; import ctbrec.sites.showup.Showup;
import ctbrec.sites.streamate.Streamate; import ctbrec.sites.streamate.Streamate;
import ctbrec.sites.stripchat.Stripchat; import ctbrec.sites.stripchat.Stripchat;
import ctbrec.ui.controls.Dialogs;
import ctbrec.ui.news.NewsTab; import ctbrec.ui.news.NewsTab;
import ctbrec.ui.settings.SettingsTab; import ctbrec.ui.settings.SettingsTab;
import ctbrec.ui.tabs.DonateTabFx; import ctbrec.ui.tabs.DonateTabFx;
@ -69,6 +70,7 @@ import javafx.scene.control.TabPane;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import javafx.stage.Stage; import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
@ -86,6 +88,8 @@ public class CamrecApplication extends Application {
public static HttpClient httpClient; public static HttpClient httpClient;
public static String title; public static String title;
private Stage primaryStage; private Stage primaryStage;
private RecordedModelsTab modelsTab;
private RecordingsTab recordingsTab;
@Override @Override
public void start(Stage primaryStage) throws Exception { public void start(Stage primaryStage) throws Exception {
@ -108,6 +112,23 @@ public class CamrecApplication extends Application {
createHttpClient(); createHttpClient();
hostServices = getHostServices(); hostServices = getHostServices();
createRecorder(); createRecorder();
startOnlineMonitor();
createGui(primaryStage);
checkForUpdates();
startHelpServer();
}
private void startHelpServer() {
new Thread(() -> {
try {
DocServer.start();
} catch (Exception e) {
LOG.error("Couldn't start documentation server", e);
}
}).start();
}
private void startOnlineMonitor() {
onlineMonitor = new OnlineMonitor(recorder); onlineMonitor = new OnlineMonitor(recorder);
onlineMonitor.start(); onlineMonitor.start();
for (Site site : sites) { for (Site site : sites) {
@ -120,16 +141,6 @@ public class CamrecApplication extends Application {
} }
} }
} }
createGui(primaryStage);
checkForUpdates();
new Thread(() -> {
try {
DocServer.start();
} catch (Exception e) {
LOG.error("Couldn't start documentation server", e);
}
}).start();
} }
private void logEnvironment() { private void logEnvironment() {
@ -158,9 +169,9 @@ public class CamrecApplication extends Application {
} }
} }
RecordedModelsTab modelsTab = new RecordedModelsTab("Recording", recorder, sites); modelsTab = new RecordedModelsTab("Recording", recorder, sites);
rootPane.getTabs().add(modelsTab); rootPane.getTabs().add(modelsTab);
RecordingsTab recordingsTab = new RecordingsTab("Recordings", recorder, config, sites); recordingsTab = new RecordingsTab("Recordings", recorder, config, sites);
rootPane.getTabs().add(recordingsTab); rootPane.getTabs().add(recordingsTab);
settingsTab = new SettingsTab(sites, recorder); settingsTab = new SettingsTab(sites, recorder);
rootPane.getTabs().add(settingsTab); rootPane.getTabs().add(settingsTab);
@ -191,8 +202,32 @@ public class CamrecApplication extends Application {
primaryStage.xProperty().addListener((observable, oldVal, newVal) -> Config.getInstance().getSettings().windowX = newVal.intValue()); primaryStage.xProperty().addListener((observable, oldVal, newVal) -> Config.getInstance().getSettings().windowX = newVal.intValue());
primaryStage.yProperty().addListener((observable, oldVal, newVal) -> Config.getInstance().getSettings().windowY = newVal.intValue()); primaryStage.yProperty().addListener((observable, oldVal, newVal) -> Config.getInstance().getSettings().windowY = newVal.intValue());
primaryStage.show(); primaryStage.show();
primaryStage.setOnCloseRequest(e -> { primaryStage.setOnCloseRequest(createShutdownHandler());
// register changelistener to activate / deactivate tabs, when the user switches between them
rootPane.getSelectionModel().selectedItemProperty().addListener((ChangeListener<Tab>) (ov, from, to) -> {
if (from instanceof TabSelectionListener) {
((TabSelectionListener) from).deselected();
}
if (to instanceof TabSelectionListener) {
((TabSelectionListener) to).selected();
}
});
}
private javafx.event.EventHandler<WindowEvent> createShutdownHandler() {
return e -> {
e.consume(); e.consume();
// check for active downloads
if (recordingsTab.isDownloadRunning()) {
boolean exitAnyway = Dialogs.showConfirmDialog("Shutdown", "Do you want to exit anyway?", "There are downloads running",
primaryStage.getScene());
if (!exitAnyway) {
return;
}
}
Alert shutdownInfo = new AutosizeAlert(Alert.AlertType.INFORMATION, primaryStage.getScene()); Alert shutdownInfo = new AutosizeAlert(Alert.AlertType.INFORMATION, primaryStage.getScene());
shutdownInfo.setTitle("Shutdown"); shutdownInfo.setTitle("Shutdown");
shutdownInfo.setContentText("Shutting down. Please wait while recordings are finished..."); shutdownInfo.setContentText("Shutting down. Please wait while recordings are finished...");
@ -237,17 +272,7 @@ public class CamrecApplication extends Application {
} }
} }
}.start(); }.start();
}); };
// register changelistener to activate / deactivate tabs, when the user switches between them
rootPane.getSelectionModel().selectedItemProperty().addListener((ChangeListener<Tab>) (ov, from, to) -> {
if (from instanceof TabSelectionListener) {
((TabSelectionListener) from).deselected();
}
if (to instanceof TabSelectionListener) {
((TabSelectionListener) to).selected();
}
});
} }
private void registerAlertSystem() { private void registerAlertSystem() {

View File

@ -180,6 +180,12 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
restoreState(); restoreState();
} }
public boolean isDownloadRunning() {
return observableRecordings.stream()
.map(Recording::getStatus)
.anyMatch(s -> s == DOWNLOADING);
}
private TableCell<JavaFxRecording, Number> createSizeCell() { private TableCell<JavaFxRecording, Number> createSizeCell() {
TableCell<JavaFxRecording, Number> cell = new TableCell<JavaFxRecording, Number>() { TableCell<JavaFxRecording, Number> cell = new TableCell<JavaFxRecording, Number>() {
@Override @Override
@ -193,7 +199,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
if(Objects.equals(System.getenv("CTBREC_DEV"), "1")) { if(Objects.equals(System.getenv("CTBREC_DEV"), "1")) {
int row = this.getTableRow().getIndex(); int row = this.getTableRow().getIndex();
JavaFxRecording rec = tableViewProperty().get().getItems().get(row); JavaFxRecording rec = tableViewProperty().get().getItems().get(row);
if(!rec.valueChanged() && rec.getStatus() == State.RECORDING) { if(!rec.valueChanged() && rec.getStatus() == RECORDING) {
setStyle("-fx-alignment: CENTER-RIGHT; -fx-background-color: red"); setStyle("-fx-alignment: CENTER-RIGHT; -fx-background-color: red");
} }
} }
@ -372,7 +378,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
JavaFxRecording first = recordings.get(0); JavaFxRecording first = recordings.get(0);
MenuItem openInPlayer = new MenuItem("Open in Player"); MenuItem openInPlayer = new MenuItem("Open in Player");
openInPlayer.setOnAction(e -> play(recordings.get(0))); openInPlayer.setOnAction(e -> play(recordings.get(0)));
if(first.getStatus() == State.FINISHED || Config.getInstance().getSettings().localRecording) { if(first.getStatus() == FINISHED || Config.getInstance().getSettings().localRecording) {
contextMenu.getItems().add(openInPlayer); contextMenu.getItems().add(openInPlayer);
} }
@ -392,7 +398,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
MenuItem deleteRecording = new MenuItem("Delete"); MenuItem deleteRecording = new MenuItem("Delete");
deleteRecording.setOnAction(e -> delete(recordings)); deleteRecording.setOnAction(e -> delete(recordings));
if(first.getStatus() == State.FINISHED || first.getStatus() == State.WAITING || first.getStatus() == State.FAILED || recordings.size() > 1) { if(first.getStatus() == FINISHED || first.getStatus() == WAITING || first.getStatus() == FAILED || recordings.size() > 1) {
contextMenu.getItems().add(deleteRecording); contextMenu.getItems().add(deleteRecording);
deleteRecording.setDisable(recordings.stream().allMatch(Recording::isPinned)); deleteRecording.setDisable(recordings.stream().allMatch(Recording::isPinned));
} }
@ -405,7 +411,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
MenuItem downloadRecording = new MenuItem("Download"); MenuItem downloadRecording = new MenuItem("Download");
downloadRecording.setOnAction(e -> download(first)); downloadRecording.setOnAction(e -> download(first));
if (!Config.getInstance().getSettings().localRecording && first.getStatus() == State.FINISHED) { if (!Config.getInstance().getSettings().localRecording && first.getStatus() == FINISHED) {
contextMenu.getItems().add(downloadRecording); contextMenu.getItems().add(downloadRecording);
} }
@ -549,7 +555,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
if(target != null) { if(target != null) {
config.getSettings().lastDownloadDir = target.getParent(); config.getSettings().lastDownloadDir = target.getParent();
startDownloadThread(target, recording); startDownloadThread(target, recording);
recording.setStatus(State.DOWNLOADING); recording.setStatus(DOWNLOADING);
recording.setProgress(0); recording.setProgress(0);
} }
} }
@ -670,7 +676,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
List<Exception> exceptions = new ArrayList<>(); List<Exception> exceptions = new ArrayList<>();
for (Iterator<JavaFxRecording> iterator = recordings.iterator(); iterator.hasNext();) { for (Iterator<JavaFxRecording> iterator = recordings.iterator(); iterator.hasNext();) {
JavaFxRecording r = iterator.next(); JavaFxRecording r = iterator.next();
if (r.getStatus() != FINISHED && r.getStatus() != FAILED && r.getStatus() != State.WAITING) { if (r.getStatus() != FINISHED && r.getStatus() != FAILED && r.getStatus() != WAITING) {
continue; continue;
} }
try { try {