Add check for JavaFX on start
On startup check if the application is running on the OpenJDK JVM. If that is the case, check that JavaFX is available (because OpenJDK comes without JavaFX, it has to be installed separately). If it is not available, log an error what to do and exit.
This commit is contained in:
parent
9ba0fd624f
commit
a147c1b26c
|
@ -9,8 +9,8 @@ import org.slf4j.LoggerFactory;
|
|||
|
||||
import ctbrec.Settings.ProxyType;
|
||||
import ctbrec.ui.CookieJarImpl;
|
||||
import ctbrec.ui.CtbrecApplication;
|
||||
import ctbrec.ui.HtmlParser;
|
||||
import ctbrec.ui.Launcher;
|
||||
import okhttp3.ConnectionPool;
|
||||
import okhttp3.Cookie;
|
||||
import okhttp3.FormBody;
|
||||
|
@ -121,7 +121,7 @@ public class HttpClient {
|
|||
public boolean login() throws IOException {
|
||||
try {
|
||||
Request login = new Request.Builder()
|
||||
.url(Launcher.BASE_URI + "/auth/login/")
|
||||
.url(CtbrecApplication.BASE_URI + "/auth/login/")
|
||||
.build();
|
||||
Response response = client.newCall(login).execute();
|
||||
String content = response.body().string();
|
||||
|
@ -135,8 +135,8 @@ public class HttpClient {
|
|||
.add("csrfmiddlewaretoken", token)
|
||||
.build();
|
||||
login = new Request.Builder()
|
||||
.url(Launcher.BASE_URI + "/auth/login/")
|
||||
.header("Referer", Launcher.BASE_URI + "/auth/login/")
|
||||
.url(CtbrecApplication.BASE_URI + "/auth/login/")
|
||||
.header("Referer", CtbrecApplication.BASE_URI + "/auth/login/")
|
||||
.post(body)
|
||||
.build();
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package ctbrec;
|
||||
|
||||
import static ctbrec.ui.Launcher.BASE_URI;
|
||||
import static ctbrec.ui.CtbrecApplication.BASE_URI;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
|
|
@ -0,0 +1,268 @@
|
|||
package ctbrec.ui;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.squareup.moshi.JsonAdapter;
|
||||
import com.squareup.moshi.Moshi;
|
||||
import com.squareup.moshi.Types;
|
||||
|
||||
import ctbrec.Config;
|
||||
import ctbrec.HttpClient;
|
||||
import ctbrec.Version;
|
||||
import ctbrec.recorder.LocalRecorder;
|
||||
import ctbrec.recorder.Recorder;
|
||||
import ctbrec.recorder.RemoteRecorder;
|
||||
import javafx.application.Application;
|
||||
import javafx.application.HostServices;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.value.ChangeListener;
|
||||
import javafx.beans.value.ObservableValue;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.Tab;
|
||||
import javafx.scene.control.TabPane;
|
||||
import javafx.scene.control.TabPane.TabClosingPolicy;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.stage.Stage;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
|
||||
public class CtbrecApplication extends Application {
|
||||
|
||||
static final transient Logger LOG = LoggerFactory.getLogger(CtbrecApplication.class);
|
||||
public static final String BASE_URI = "https://chaturbate.com";
|
||||
|
||||
private Config config;
|
||||
private Recorder recorder;
|
||||
private HttpClient client;
|
||||
static HostServices hostServices;
|
||||
private SettingsTab settingsTab;
|
||||
private TabPane tabPane = new TabPane();
|
||||
|
||||
@Override
|
||||
public void start(Stage primaryStage) throws Exception {
|
||||
loadConfig();
|
||||
hostServices = getHostServices();
|
||||
client = HttpClient.getInstance();
|
||||
createRecorder();
|
||||
doInitialLogin();
|
||||
createGui(primaryStage);
|
||||
checkForUpdates();
|
||||
}
|
||||
|
||||
private void createGui(Stage primaryStage) throws IOException {
|
||||
LOG.debug("Creating GUI");
|
||||
primaryStage.setTitle("CTB Recorder " + getVersion());
|
||||
InputStream icon = getClass().getResourceAsStream("/icon.png");
|
||||
primaryStage.getIcons().add(new Image(icon));
|
||||
|
||||
tabPane = new TabPane();
|
||||
tabPane.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() {
|
||||
@Override
|
||||
public void changed(ObservableValue<? extends Tab> ov, Tab from, Tab to) {
|
||||
if(from != null && from instanceof TabSelectionListener) {
|
||||
((TabSelectionListener) from).deselected();
|
||||
}
|
||||
if(to != null && to instanceof TabSelectionListener) {
|
||||
((TabSelectionListener) to).selected();
|
||||
}
|
||||
}
|
||||
});
|
||||
tabPane.setTabClosingPolicy(TabClosingPolicy.SELECTED_TAB);
|
||||
tabPane.getTabs().add(createTab("Featured", BASE_URI + "/"));
|
||||
tabPane.getTabs().add(createTab("Female", BASE_URI + "/female-cams/"));
|
||||
tabPane.getTabs().add(createTab("Male", BASE_URI + "/male-cams/"));
|
||||
tabPane.getTabs().add(createTab("Couples", BASE_URI + "/couple-cams/"));
|
||||
tabPane.getTabs().add(createTab("Trans", BASE_URI + "/trans-cams/"));
|
||||
FollowedTab tab = new FollowedTab("Followed", BASE_URI + "/followed-cams/");
|
||||
tab.setRecorder(recorder);
|
||||
tabPane.getTabs().add(tab);
|
||||
RecordedModelsTab modelsTab = new RecordedModelsTab("Recording", recorder);
|
||||
tabPane.getTabs().add(modelsTab);
|
||||
RecordingsTab recordingsTab = new RecordingsTab("Recordings", recorder, config);
|
||||
tabPane.getTabs().add(recordingsTab);
|
||||
settingsTab = new SettingsTab();
|
||||
tabPane.getTabs().add(settingsTab);
|
||||
tabPane.getTabs().add(new DonateTabFx());
|
||||
|
||||
int windowWidth = Config.getInstance().getSettings().windowWidth;
|
||||
int windowHeight = Config.getInstance().getSettings().windowHeight;
|
||||
primaryStage.setScene(new Scene(tabPane, windowWidth, windowHeight));
|
||||
primaryStage.getScene().widthProperty().addListener((observable, oldVal, newVal) -> Config.getInstance().getSettings().windowWidth = newVal.intValue());
|
||||
primaryStage.getScene().heightProperty().addListener((observable, oldVal, newVal) -> Config.getInstance().getSettings().windowHeight = newVal.intValue());
|
||||
primaryStage.setMaximized(Config.getInstance().getSettings().windowMaximized);
|
||||
primaryStage.maximizedProperty().addListener((observable, oldVal, newVal) -> Config.getInstance().getSettings().windowMaximized = newVal.booleanValue());
|
||||
primaryStage.setX(Config.getInstance().getSettings().windowX);
|
||||
primaryStage.setY(Config.getInstance().getSettings().windowY);
|
||||
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.show();
|
||||
primaryStage.setOnCloseRequest((e) -> {
|
||||
e.consume();
|
||||
Alert shutdownInfo = new AutosizeAlert(Alert.AlertType.INFORMATION);
|
||||
shutdownInfo.setTitle("Shutdown");
|
||||
shutdownInfo.setContentText("Shutting down. Please wait a few seconds...");
|
||||
shutdownInfo.show();
|
||||
|
||||
new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
settingsTab.saveConfig();
|
||||
recorder.shutdown();
|
||||
client.shutdown();
|
||||
try {
|
||||
Config.getInstance().save();
|
||||
LOG.info("Shutdown complete. Goodbye!");
|
||||
Platform.exit();
|
||||
// This is needed, because OkHttp?! seems to block the shutdown with its writer threads. They are not daemon threads :(
|
||||
System.exit(0);
|
||||
} catch (IOException e1) {
|
||||
Platform.runLater(() -> {
|
||||
Alert alert = new AutosizeAlert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Error saving settings");
|
||||
alert.setContentText("Couldn't save settings: " + e1.getLocalizedMessage());
|
||||
alert.showAndWait();
|
||||
System.exit(1);
|
||||
});
|
||||
}
|
||||
}
|
||||
}.start();
|
||||
});
|
||||
}
|
||||
|
||||
private void doInitialLogin() {
|
||||
if(config.getSettings().username != null && !config.getSettings().username.isEmpty()) {
|
||||
new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
if(!Objects.equals(System.getenv("CTBREC_DEV"), "1")) {
|
||||
try {
|
||||
client.login();
|
||||
} catch (IOException e1) {
|
||||
LOG.warn("Initial login failed" , e1);
|
||||
}
|
||||
}
|
||||
};
|
||||
}.start();
|
||||
}
|
||||
}
|
||||
|
||||
private void createRecorder() {
|
||||
if(config.getSettings().localRecording) {
|
||||
recorder = new LocalRecorder(config);
|
||||
} else {
|
||||
recorder = new RemoteRecorder(config, client);
|
||||
}
|
||||
}
|
||||
|
||||
private void loadConfig() {
|
||||
try {
|
||||
Config.init();
|
||||
} catch (Exception e) {
|
||||
Alert alert = new AutosizeAlert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Whoopsie");
|
||||
alert.setContentText("Couldn't load settings.");
|
||||
alert.showAndWait();
|
||||
System.exit(1);
|
||||
}
|
||||
config = Config.getInstance();
|
||||
}
|
||||
|
||||
Tab createTab(String title, String url) {
|
||||
ThumbOverviewTab tab = new ThumbOverviewTab(title, url, false);
|
||||
tab.setRecorder(recorder);
|
||||
return tab;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
launch(args);
|
||||
}
|
||||
|
||||
private void checkForUpdates() {
|
||||
Thread updateCheck = new Thread(() -> {
|
||||
try {
|
||||
String url = "https://api.github.com/repos/0xboobface/ctbrec/releases";
|
||||
Request request = new Request.Builder().url(url).build();
|
||||
Response response = client.execute(request);
|
||||
if(response.isSuccessful()) {
|
||||
Moshi moshi = new Moshi.Builder().build();
|
||||
Type type = Types.newParameterizedType(List.class, Release.class);
|
||||
JsonAdapter<List<Release>> adapter = moshi.adapter(type);
|
||||
List<Release> releases = adapter.fromJson(response.body().source());
|
||||
Release latest = releases.get(0);
|
||||
Version latestVersion = latest.getVersion();
|
||||
Version ctbrecVersion = getVersion();
|
||||
if(latestVersion.compareTo(ctbrecVersion) > 0) {
|
||||
LOG.debug("Update available {} < {}", ctbrecVersion, latestVersion);
|
||||
Platform.runLater(() -> tabPane.getTabs().add(new UpdateTab(latest)));
|
||||
} else {
|
||||
LOG.debug("ctbrec is up-to-date {}", ctbrecVersion);
|
||||
}
|
||||
}
|
||||
response.close();
|
||||
} catch (IOException e) {
|
||||
LOG.warn("Update check failed {}", e.getMessage());
|
||||
}
|
||||
|
||||
});
|
||||
updateCheck.setName("Update Check");
|
||||
updateCheck.setDaemon(true);
|
||||
updateCheck.start();
|
||||
}
|
||||
|
||||
private Version getVersion() throws IOException {
|
||||
if(Objects.equals(System.getenv("CTBREC_DEV"), "1")) {
|
||||
return Version.of("0.0.0-DEV");
|
||||
} else {
|
||||
try(InputStream is = getClass().getClassLoader().getResourceAsStream("version")) {
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
|
||||
String versionString = reader.readLine();
|
||||
Version version = Version.of(versionString);
|
||||
return version;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static class Release {
|
||||
private String name;
|
||||
private String tag_name;
|
||||
private String html_url;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getTagName() {
|
||||
return tag_name;
|
||||
}
|
||||
|
||||
public void setTagName(String tagName) {
|
||||
this.tag_name = tagName;
|
||||
}
|
||||
|
||||
public String getHtmlUrl() {
|
||||
return html_url;
|
||||
}
|
||||
|
||||
public void setHtmlUrl(String htmlUrl) {
|
||||
this.html_url = htmlUrl;
|
||||
}
|
||||
|
||||
public Version getVersion() {
|
||||
return Version.of(tag_name);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
package ctbrec.ui;
|
||||
|
||||
import java.awt.Desktop;
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javafx.geometry.Insets;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.layout.BorderPane;
|
||||
|
||||
public class DesktopIntergation {
|
||||
|
||||
private static final transient Logger LOG = LoggerFactory.getLogger(DesktopIntergation.class);
|
||||
|
||||
public static void open(String uri) {
|
||||
try {
|
||||
CtbrecApplication.hostServices.showDocument(uri);
|
||||
return;
|
||||
} catch (Exception e) {
|
||||
LOG.debug("Couldn't open URL with host services {}", uri);
|
||||
}
|
||||
|
||||
// opening with HostServices failed, now try Desktop
|
||||
try {
|
||||
Desktop.getDesktop().browse(new URI(uri));
|
||||
return;
|
||||
} catch (Exception e) {
|
||||
LOG.debug("Couldn't open URL with Desktop {}", uri);
|
||||
}
|
||||
|
||||
// try external helpers
|
||||
String[] externalHelpers = {"kde-open5", "kde-open", "gnome-open", "xdg-open"};
|
||||
Runtime rt = Runtime.getRuntime();
|
||||
for (String helper : externalHelpers) {
|
||||
try {
|
||||
rt.exec(helper + " " + uri);
|
||||
return;
|
||||
} catch (IOException e) {
|
||||
LOG.debug("Couldn't open URL with {} {}", helper, uri);
|
||||
}
|
||||
}
|
||||
|
||||
// all attempts failed, show a dialog with URL at least
|
||||
Alert shutdownInfo = new AutosizeAlert(Alert.AlertType.ERROR);
|
||||
shutdownInfo.setTitle("Open URL");
|
||||
shutdownInfo.setContentText("Couldn't open URL");
|
||||
BorderPane pane = new BorderPane();
|
||||
pane.setTop(new Label());
|
||||
TextField urlField = new TextField(uri);
|
||||
urlField.setPadding(new Insets(10));
|
||||
urlField.setEditable(false);
|
||||
pane.setCenter(urlField);
|
||||
shutdownInfo.getDialogPane().setExpandableContent(pane);
|
||||
shutdownInfo.getDialogPane().setExpanded(true);
|
||||
shutdownInfo.show();
|
||||
}
|
||||
}
|
|
@ -43,7 +43,7 @@ public class DonateTabFx extends Tab {
|
|||
|
||||
ImageView coffeeImage = new ImageView(getClass().getResource("/html/buymeacoffee-fancy.png").toString());
|
||||
Button coffeeButton = new Button("Buy me a coffee");
|
||||
coffeeButton.setOnMouseClicked((e) -> { Launcher.open("https://www.buymeacoffee.com/0xboobface"); });
|
||||
coffeeButton.setOnMouseClicked((e) -> { DesktopIntergation.open("https://www.buymeacoffee.com/0xboobface"); });
|
||||
VBox buyCoffeeBox = new VBox(5);
|
||||
buyCoffeeBox.setAlignment(Pos.TOP_CENTER);
|
||||
buyCoffeeBox.getChildren().addAll(coffeeImage, coffeeButton);
|
||||
|
|
|
@ -1,272 +1,27 @@
|
|||
package ctbrec.ui;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.squareup.moshi.JsonAdapter;
|
||||
import com.squareup.moshi.Moshi;
|
||||
import com.squareup.moshi.Types;
|
||||
|
||||
import ctbrec.Config;
|
||||
import ctbrec.HttpClient;
|
||||
import ctbrec.Version;
|
||||
import ctbrec.recorder.LocalRecorder;
|
||||
import ctbrec.recorder.Recorder;
|
||||
import ctbrec.recorder.RemoteRecorder;
|
||||
import javafx.application.Application;
|
||||
import javafx.application.HostServices;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.value.ChangeListener;
|
||||
import javafx.beans.value.ObservableValue;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.Tab;
|
||||
import javafx.scene.control.TabPane;
|
||||
import javafx.scene.control.TabPane.TabClosingPolicy;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.stage.Stage;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
|
||||
public class Launcher extends Application {
|
||||
public class Launcher {
|
||||
|
||||
private static final transient Logger LOG = LoggerFactory.getLogger(Launcher.class);
|
||||
public static final String BASE_URI = "https://chaturbate.com";
|
||||
|
||||
private Config config;
|
||||
private Recorder recorder;
|
||||
private HttpClient client;
|
||||
private static HostServices hostServices;
|
||||
private SettingsTab settingsTab;
|
||||
private TabPane tabPane = new TabPane();
|
||||
|
||||
@Override
|
||||
public void start(Stage primaryStage) throws Exception {
|
||||
loadConfig();
|
||||
hostServices = getHostServices();
|
||||
client = HttpClient.getInstance();
|
||||
createRecorder();
|
||||
doInitialLogin();
|
||||
createGui(primaryStage);
|
||||
checkForUpdates();
|
||||
}
|
||||
|
||||
private void createGui(Stage primaryStage) throws IOException {
|
||||
LOG.debug("Creating GUI");
|
||||
primaryStage.setTitle("CTB Recorder " + getVersion());
|
||||
InputStream icon = getClass().getResourceAsStream("/icon.png");
|
||||
primaryStage.getIcons().add(new Image(icon));
|
||||
|
||||
tabPane = new TabPane();
|
||||
tabPane.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() {
|
||||
@Override
|
||||
public void changed(ObservableValue<? extends Tab> ov, Tab from, Tab to) {
|
||||
if(from != null && from instanceof TabSelectionListener) {
|
||||
((TabSelectionListener) from).deselected();
|
||||
}
|
||||
if(to != null && to instanceof TabSelectionListener) {
|
||||
((TabSelectionListener) to).selected();
|
||||
}
|
||||
}
|
||||
});
|
||||
tabPane.setTabClosingPolicy(TabClosingPolicy.SELECTED_TAB);
|
||||
tabPane.getTabs().add(createTab("Featured", BASE_URI + "/"));
|
||||
tabPane.getTabs().add(createTab("Female", BASE_URI + "/female-cams/"));
|
||||
tabPane.getTabs().add(createTab("Male", BASE_URI + "/male-cams/"));
|
||||
tabPane.getTabs().add(createTab("Couples", BASE_URI + "/couple-cams/"));
|
||||
tabPane.getTabs().add(createTab("Trans", BASE_URI + "/trans-cams/"));
|
||||
FollowedTab tab = new FollowedTab("Followed", BASE_URI + "/followed-cams/");
|
||||
tab.setRecorder(recorder);
|
||||
tabPane.getTabs().add(tab);
|
||||
RecordedModelsTab modelsTab = new RecordedModelsTab("Recording", recorder);
|
||||
tabPane.getTabs().add(modelsTab);
|
||||
RecordingsTab recordingsTab = new RecordingsTab("Recordings", recorder, config);
|
||||
tabPane.getTabs().add(recordingsTab);
|
||||
settingsTab = new SettingsTab();
|
||||
tabPane.getTabs().add(settingsTab);
|
||||
tabPane.getTabs().add(new DonateTabFx());
|
||||
|
||||
int windowWidth = Config.getInstance().getSettings().windowWidth;
|
||||
int windowHeight = Config.getInstance().getSettings().windowHeight;
|
||||
primaryStage.setScene(new Scene(tabPane, windowWidth, windowHeight));
|
||||
primaryStage.getScene().widthProperty().addListener((observable, oldVal, newVal) -> Config.getInstance().getSettings().windowWidth = newVal.intValue());
|
||||
primaryStage.getScene().heightProperty().addListener((observable, oldVal, newVal) -> Config.getInstance().getSettings().windowHeight = newVal.intValue());
|
||||
primaryStage.setMaximized(Config.getInstance().getSettings().windowMaximized);
|
||||
primaryStage.maximizedProperty().addListener((observable, oldVal, newVal) -> Config.getInstance().getSettings().windowMaximized = newVal.booleanValue());
|
||||
primaryStage.setX(Config.getInstance().getSettings().windowX);
|
||||
primaryStage.setY(Config.getInstance().getSettings().windowY);
|
||||
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.show();
|
||||
primaryStage.setOnCloseRequest((e) -> {
|
||||
e.consume();
|
||||
Alert shutdownInfo = new AutosizeAlert(Alert.AlertType.INFORMATION);
|
||||
shutdownInfo.setTitle("Shutdown");
|
||||
shutdownInfo.setContentText("Shutting down. Please wait a few seconds...");
|
||||
shutdownInfo.show();
|
||||
|
||||
new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
settingsTab.saveConfig();
|
||||
recorder.shutdown();
|
||||
client.shutdown();
|
||||
try {
|
||||
Config.getInstance().save();
|
||||
LOG.info("Shutdown complete. Goodbye!");
|
||||
Platform.exit();
|
||||
// This is needed, because OkHttp?! seems to block the shutdown with its writer threads. They are not daemon threads :(
|
||||
System.exit(0);
|
||||
} catch (IOException e1) {
|
||||
Platform.runLater(() -> {
|
||||
Alert alert = new AutosizeAlert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Error saving settings");
|
||||
alert.setContentText("Couldn't save settings: " + e1.getLocalizedMessage());
|
||||
alert.showAndWait();
|
||||
System.exit(1);
|
||||
});
|
||||
}
|
||||
}
|
||||
}.start();
|
||||
});
|
||||
}
|
||||
|
||||
private void doInitialLogin() {
|
||||
if(config.getSettings().username != null && !config.getSettings().username.isEmpty()) {
|
||||
new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
if(!Objects.equals(System.getenv("CTBREC_DEV"), "1")) {
|
||||
try {
|
||||
client.login();
|
||||
} catch (IOException e1) {
|
||||
LOG.warn("Initial login failed" , e1);
|
||||
}
|
||||
}
|
||||
};
|
||||
}.start();
|
||||
}
|
||||
}
|
||||
|
||||
private void createRecorder() {
|
||||
if(config.getSettings().localRecording) {
|
||||
recorder = new LocalRecorder(config);
|
||||
} else {
|
||||
recorder = new RemoteRecorder(config, client);
|
||||
}
|
||||
}
|
||||
|
||||
private void loadConfig() {
|
||||
try {
|
||||
Config.init();
|
||||
} catch (Exception e) {
|
||||
Alert alert = new AutosizeAlert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Whoopsie");
|
||||
alert.setContentText("Couldn't load settings.");
|
||||
alert.showAndWait();
|
||||
System.exit(1);
|
||||
}
|
||||
config = Config.getInstance();
|
||||
}
|
||||
|
||||
Tab createTab(String title, String url) {
|
||||
ThumbOverviewTab tab = new ThumbOverviewTab(title, url, false);
|
||||
tab.setRecorder(recorder);
|
||||
return tab;
|
||||
}
|
||||
|
||||
public static void open(String uri) {
|
||||
hostServices.showDocument(uri);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
launch(args);
|
||||
}
|
||||
|
||||
private void checkForUpdates() {
|
||||
Thread updateCheck = new Thread(() -> {
|
||||
String jvmName = System.getProperty("java.vm.name");
|
||||
if (jvmName.startsWith("OpenJDK")) {
|
||||
// check for OpenJFX
|
||||
try {
|
||||
String url = "https://api.github.com/repos/0xboobface/ctbrec/releases";
|
||||
Request request = new Request.Builder().url(url).build();
|
||||
Response response = client.execute(request);
|
||||
if(response.isSuccessful()) {
|
||||
Moshi moshi = new Moshi.Builder().build();
|
||||
Type type = Types.newParameterizedType(List.class, Release.class);
|
||||
JsonAdapter<List<Release>> adapter = moshi.adapter(type);
|
||||
List<Release> releases = adapter.fromJson(response.body().source());
|
||||
Release latest = releases.get(0);
|
||||
Version latestVersion = latest.getVersion();
|
||||
Version ctbrecVersion = getVersion();
|
||||
if(latestVersion.compareTo(ctbrecVersion) > 0) {
|
||||
LOG.debug("Update available {} < {}", ctbrecVersion, latestVersion);
|
||||
Platform.runLater(() -> tabPane.getTabs().add(new UpdateTab(latest)));
|
||||
} else {
|
||||
LOG.debug("ctbrec is up-to-date {}", ctbrecVersion);
|
||||
}
|
||||
}
|
||||
response.close();
|
||||
} catch (IOException e) {
|
||||
LOG.warn("Update check failed {}", e.getMessage());
|
||||
Class.forName("javafx.application.Application");
|
||||
CtbrecApplication.main(args);
|
||||
} catch (ClassNotFoundException e) {
|
||||
LOG.error("You are running ctbrec with OpenJDK, but OpenJFX can not be found.\n"
|
||||
+ "Please either install OpenJFX or use the Oracle JRE, which you can download at\n"
|
||||
+ "http://www.oracle.com/technetwork/java/javase/downloads/index.html");
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
});
|
||||
updateCheck.setName("Update Check");
|
||||
updateCheck.setDaemon(true);
|
||||
updateCheck.start();
|
||||
}
|
||||
|
||||
private Version getVersion() throws IOException {
|
||||
if(Objects.equals(System.getenv("CTBREC_DEV"), "1")) {
|
||||
return Version.of("0.0.0-DEV");
|
||||
} else {
|
||||
try(InputStream is = getClass().getClassLoader().getResourceAsStream("version")) {
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
|
||||
String versionString = reader.readLine();
|
||||
Version version = Version.of(versionString);
|
||||
return version;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static class Release {
|
||||
private String name;
|
||||
private String tag_name;
|
||||
private String html_url;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getTagName() {
|
||||
return tag_name;
|
||||
}
|
||||
|
||||
public void setTagName(String tagName) {
|
||||
this.tag_name = tagName;
|
||||
}
|
||||
|
||||
public String getHtmlUrl() {
|
||||
return html_url;
|
||||
}
|
||||
|
||||
public void setHtmlUrl(String htmlUrl) {
|
||||
this.html_url = htmlUrl;
|
||||
}
|
||||
|
||||
public Version getVersion() {
|
||||
return Version.of(tag_name);
|
||||
CtbrecApplication.main(args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -216,7 +216,7 @@ public class RecordedModelsTab extends Tab implements TabSelectionListener {
|
|||
});
|
||||
|
||||
MenuItem openInBrowser = new MenuItem("Open in Browser");
|
||||
openInBrowser.setOnAction((e) -> Launcher.open(table.getSelectionModel().getSelectedItem().getUrl()));
|
||||
openInBrowser.setOnAction((e) -> DesktopIntergation.open(table.getSelectionModel().getSelectedItem().getUrl()));
|
||||
MenuItem openInPlayer = new MenuItem("Open in Player");
|
||||
openInPlayer.setOnAction((e) -> Player.play(table.getSelectionModel().getSelectedItem().getUrl()));
|
||||
MenuItem switchStreamSource = new MenuItem("Switch resolution");
|
||||
|
|
|
@ -420,9 +420,9 @@ public class ThumbCell extends StackPane {
|
|||
|
||||
String url = null;
|
||||
if(follow) {
|
||||
url = Launcher.BASE_URI + "/follow/follow/" + model.getName() + "/";
|
||||
url = CtbrecApplication.BASE_URI + "/follow/follow/" + model.getName() + "/";
|
||||
} else {
|
||||
url = Launcher.BASE_URI + "/follow/unfollow/" + model.getName() + "/";
|
||||
url = CtbrecApplication.BASE_URI + "/follow/unfollow/" + model.getName() + "/";
|
||||
}
|
||||
|
||||
RequestBody body = RequestBody.create(null, new byte[0]);
|
||||
|
|
|
@ -3,7 +3,7 @@ package ctbrec.ui;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import ctbrec.ui.Launcher.Release;
|
||||
import ctbrec.ui.CtbrecApplication.Release;
|
||||
import javafx.geometry.Pos;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.Label;
|
||||
|
@ -23,7 +23,7 @@ public class UpdateTab extends Tab {
|
|||
VBox vbox = new VBox(10);
|
||||
vbox.getChildren().add(new Label("New Version available " + latest.getVersion()));
|
||||
Button button = new Button("Download");
|
||||
button.setOnAction((e) -> Launcher.open(latest.getHtmlUrl()));
|
||||
button.setOnAction((e) -> DesktopIntergation.open(latest.getHtmlUrl()));
|
||||
vbox.getChildren().add(button);
|
||||
vbox.setAlignment(Pos.CENTER);
|
||||
|
||||
|
|
Loading…
Reference in New Issue