diff --git a/client/.classpath b/client/.classpath index 34bb78b4..d8ababe6 100644 --- a/client/.classpath +++ b/client/.classpath @@ -11,11 +11,7 @@ - - - - - + diff --git a/client/.settings/org.eclipse.jdt.core.prefs b/client/.settings/org.eclipse.jdt.core.prefs index 3b784bcd..9729e145 100644 --- a/client/.settings/org.eclipse.jdt.core.prefs +++ b/client/.settings/org.eclipse.jdt.core.prefs @@ -12,5 +12,5 @@ org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning -org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.release=enabled org.eclipse.jdt.core.compiler.source=15 diff --git a/client/src/main/java/ctbrec/docs/AbstractDocServlet.java b/client/src/main/java/ctbrec/docs/AbstractDocServlet.java index 5dd00904..d02ae95f 100644 --- a/client/src/main/java/ctbrec/docs/AbstractDocServlet.java +++ b/client/src/main/java/ctbrec/docs/AbstractDocServlet.java @@ -1,5 +1,7 @@ package ctbrec.docs; +import static java.nio.charset.StandardCharsets.*; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; @@ -7,7 +9,6 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -32,13 +33,13 @@ public abstract class AbstractDocServlet extends HttpServlet { if(resourceAsStream == null) { throw new FileNotFoundException(); } - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int length = 0; - byte[] buffer = new byte[1024]; + var out = new ByteArrayOutputStream(); + var length = 0; + var buffer = new byte[1024]; while( (length = resourceAsStream.read(buffer)) >= 0 ) { out.write(buffer, 0, length); } - return new String(out.toByteArray(), "utf-8"); + return new String(out.toByteArray(), UTF_8); } String getHeader() throws IOException { @@ -66,15 +67,15 @@ public abstract class AbstractDocServlet extends HttpServlet { private void indexJar(URL resource, List pages) throws IOException { String fileUrl = resource.getFile(); - fileUrl = URLDecoder.decode(fileUrl, StandardCharsets.UTF_8); + fileUrl = URLDecoder.decode(fileUrl, UTF_8); int colon = fileUrl.indexOf(':'); int exclamation = fileUrl.indexOf('!'); - String jar = fileUrl.substring(colon + 1, exclamation); - String internalFile = fileUrl.substring(exclamation + 2); - try (JarFile jarFile = new JarFile(jar)) { + var jar = fileUrl.substring(colon + 1, exclamation); + var internalFile = fileUrl.substring(exclamation + 2); + try (var jarFile = new JarFile(jar)) { Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { - JarEntry jarEntry = entries.nextElement(); + var jarEntry = entries.nextElement(); String name = jarEntry.getName(); if (name.startsWith(internalFile) && name.toLowerCase().endsWith(".md")) { pages.add(name.substring(name.lastIndexOf('/') + 1)); @@ -84,7 +85,7 @@ public abstract class AbstractDocServlet extends HttpServlet { } private void indexDirectory(URL resource, List pages) { - File docs = new File(resource.getFile()); + var docs = new File(resource.getFile()); String[] files = docs.list((dir, name) -> name.toLowerCase().endsWith(".md")); pages.addAll(Arrays.asList(files)); } @@ -94,15 +95,19 @@ public abstract class AbstractDocServlet extends HttpServlet { return loadFile(resource); } - protected void error(HttpServletResponse resp, int status, String message) throws IOException { - resp.setStatus(status); - resp.getWriter().println(getHeader()); - String html = loadFile("/html/docs/" + status + ".html"); - if(message == null || message.trim().isEmpty()) { - message = ""; + protected void error(HttpServletResponse resp, int status, String message) { + try { + resp.setStatus(status); + resp.getWriter().println(getHeader()); + String html = loadFile("/html/docs/" + status + ".html"); + if(message == null || message.trim().isEmpty()) { + message = ""; + } + html = html.replace("{message}", message); + resp.getWriter().println(html); + resp.getWriter().println(getFooter()); + } catch (IOException e) { + LOG.error("Error while sending error response. Man, his is bad!", e); } - html = html.replace("{message}", message); - resp.getWriter().println(html); - resp.getWriter().println(getFooter()); } } diff --git a/client/src/main/java/ctbrec/docs/DocServer.java b/client/src/main/java/ctbrec/docs/DocServer.java index 1f3c97ed..6fe48ff1 100644 --- a/client/src/main/java/ctbrec/docs/DocServer.java +++ b/client/src/main/java/ctbrec/docs/DocServer.java @@ -16,40 +16,41 @@ import org.slf4j.LoggerFactory; import ctbrec.servlet.StaticFileServlet; public class DocServer { - private static final transient Logger LOG = LoggerFactory.getLogger(DocServer.class); + private static final Logger LOG = LoggerFactory.getLogger(DocServer.class); - private static Server server = new Server(); private static volatile boolean started = false; - public synchronized static void start() throws Exception { + private DocServer() {} + + public static synchronized void start() throws Exception { if(started) { return; } started = true; - server = new Server(); + var server = new Server(); - HttpConfiguration config = new HttpConfiguration(); + var config = new HttpConfiguration(); config.setSendServerVersion(false); - ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(config)); + var http = new ServerConnector(server, new HttpConnectionFactory(config)); http.setPort(5689); server.addConnector(http); - ServletHandler handler = new ServletHandler(); + var handler = new ServletHandler(); server.setHandler(handler); - HandlerList handlers = new HandlerList(); + var handlers = new HandlerList(); handlers.setHandlers(new Handler[] { handler }); server.setHandler(handlers); - MarkdownServlet markdownServlet = new MarkdownServlet(); - ServletHolder holder = new ServletHolder(markdownServlet); + var markdownServlet = new MarkdownServlet(); + var holder = new ServletHolder(markdownServlet); handler.addServletWithMapping(holder, "/docs/*"); AbstractDocServlet searchServlet = new SearchServlet(); holder = new ServletHolder(searchServlet); handler.addServletWithMapping(holder, "/search/*"); - StaticFileServlet staticFileServlet = new StaticFileServlet("/html", false); + var staticFileServlet = new StaticFileServlet("/html", false); holder = new ServletHolder(staticFileServlet); handler.addServletWithMapping(holder, "/static/*"); diff --git a/client/src/main/java/ctbrec/docs/MarkdownServlet.java b/client/src/main/java/ctbrec/docs/MarkdownServlet.java index 8dd99b25..cadb8772 100644 --- a/client/src/main/java/ctbrec/docs/MarkdownServlet.java +++ b/client/src/main/java/ctbrec/docs/MarkdownServlet.java @@ -38,16 +38,18 @@ public class MarkdownServlet extends AbstractDocServlet { } } catch (FileNotFoundException e) { error(resp, HttpServletResponse.SC_NOT_FOUND, ""); + } catch (Exception e) { + error(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ""); } } private void listPages(HttpServletResponse resp) throws IOException { List pages = getPages(); - String html = ""); resp.setStatus(HttpServletResponse.SC_OK); resp.getWriter().println(getHeader()); resp.getWriter().println(html); @@ -55,8 +57,8 @@ public class MarkdownServlet extends AbstractDocServlet { } private String markdownToHtml(String markdown) { - MutableDataSet options = new MutableDataSet(); - Parser parser = Parser.builder(options).build(); + var options = new MutableDataSet(); + var parser = Parser.builder(options).build(); HtmlRenderer renderer = HtmlRenderer.builder(options).build(); Node document = parser.parse(markdown); String html = renderer.render(document); diff --git a/client/src/main/java/ctbrec/docs/SearchServlet.java b/client/src/main/java/ctbrec/docs/SearchServlet.java index dacf073d..a4883eeb 100644 --- a/client/src/main/java/ctbrec/docs/SearchServlet.java +++ b/client/src/main/java/ctbrec/docs/SearchServlet.java @@ -1,5 +1,7 @@ package ctbrec.docs; +import static javax.servlet.http.HttpServletResponse.*; + import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; @@ -9,41 +11,55 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.json.JSONArray; - +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SearchServlet extends AbstractDocServlet { + private static final Logger LOG = LoggerFactory.getLogger(SearchServlet.class); private static final String Q = "term"; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - if(req.getParameter(Q) == null) { - error(resp, HttpServletResponse.SC_BAD_REQUEST, "Parameter \""+Q+"\" is missing"); - return; + try { + if (req.getParameter(Q) == null) { + error(resp, HttpServletResponse.SC_BAD_REQUEST, "Parameter \"" + Q + "\" is missing"); + return; + } + + resp.setStatus(HttpServletResponse.SC_OK); + resp.setContentType("application/json"); + var result = new JSONArray(); + var pages = getPages(); + + String q = req.getParameter(Q).toLowerCase(); + String[] tokens = q.split("\\s+"); + searchPages(result, pages, tokens); + resp.getWriter().println(result.toString()); + } catch (Exception e) { + try { + resp.sendError(SC_INTERNAL_SERVER_ERROR, "Internal Server Error"); + } catch (IOException ioe) { + LOG.error("Error while sending error response", ioe); + } } + } - resp.setStatus(HttpServletResponse.SC_OK); - resp.setContentType("application/json"); - JSONArray result = new JSONArray(); - List pages = getPages(); - - String q = req.getParameter(Q).toLowerCase(); - String[] tokens = q.split("\\s+"); + private void searchPages(JSONArray result, List pages, String[] tokens) throws IOException { for (String page : pages) { try { String content = loadMarkdown("/docs/" + page).toLowerCase(); - boolean allFound = true; + var allFound = true; for (String token : tokens) { - if(!content.contains(token)) { + if (!content.contains(token)) { allFound = false; } } - if(allFound) { + if (allFound) { result.put(page); } - } catch(FileNotFoundException e) { + } catch (FileNotFoundException e) { // virtual page like index.md -> ignore } } - resp.getWriter().println(result.toString()); } } diff --git a/client/src/main/java/ctbrec/ui/AutosizeAlert.java b/client/src/main/java/ctbrec/ui/AutosizeAlert.java index 2a9fa974..1e59a634 100644 --- a/client/src/main/java/ctbrec/ui/AutosizeAlert.java +++ b/client/src/main/java/ctbrec/ui/AutosizeAlert.java @@ -34,7 +34,7 @@ public class AutosizeAlert extends Alert { setResizable(true); getDialogPane().setMinHeight(Region.USE_PREF_SIZE); if(parent != null) { - Stage stage = (Stage) getDialogPane().getScene().getWindow(); + var stage = (Stage) getDialogPane().getScene().getWindow(); stage.getScene().getStylesheets().addAll(parent.getStylesheets()); InputStream icon = Dialogs.class.getResourceAsStream("/icon.png"); stage.getIcons().add(new Image(icon)); diff --git a/client/src/main/java/ctbrec/ui/CamrecApplication.java b/client/src/main/java/ctbrec/ui/CamrecApplication.java index c5df0f6e..91cc6f10 100644 --- a/client/src/main/java/ctbrec/ui/CamrecApplication.java +++ b/client/src/main/java/ctbrec/ui/CamrecApplication.java @@ -86,7 +86,6 @@ import javafx.scene.paint.Color; import javafx.stage.Stage; import javafx.stage.WindowEvent; import okhttp3.Request; -import okhttp3.Response; public class CamrecApplication extends Application { @@ -104,7 +103,6 @@ public class CamrecApplication extends Application { public static HttpClient httpClient; public static String title; private Stage primaryStage; - private RecordedTab modelsTab; private RecordingsTab recordingsTab; private ScheduledExecutorService scheduler; private int activeRecordings = 0; @@ -114,7 +112,7 @@ public class CamrecApplication extends Application { public void start(Stage primaryStage) throws Exception { this.primaryStage = primaryStage; scheduler = Executors.newScheduledThreadPool(1, r -> { - Thread t = new Thread(r); + var t = new Thread(r); t.setDaemon(true); t.setName("Scheduler"); return t; @@ -172,7 +170,7 @@ public class CamrecApplication extends Application { private void registerClipboardListener() { if (config.getSettings().monitorClipboard) { - ClipboardListener clipboardListener = new ClipboardListener(recorder, sites); + var clipboardListener = new ClipboardListener(recorder, sites); scheduler.scheduleAtFixedRate(clipboardListener, 0, 1, TimeUnit.SECONDS); } } @@ -209,19 +207,19 @@ public class CamrecApplication extends Application { int windowWidth = Config.getInstance().getSettings().windowWidth; int windowHeight = Config.getInstance().getSettings().windowHeight; - Scene scene = new Scene(rootPane, windowWidth, windowHeight); + var scene = new Scene(rootPane, windowWidth, windowHeight); primaryStage.setScene(scene); Dialogs.setScene(scene); rootPane.setCenter(tabPane); rootPane.setBottom(statusBar); for (Site site : sites) { if (site.isEnabled()) { - SiteTab siteTab = new SiteTab(site, scene); + var siteTab = new SiteTab(site, scene); tabPane.getTabs().add(siteTab); } } - modelsTab = new RecordedTab(recorder, sites); + var modelsTab = new RecordedTab(recorder, sites); tabPane.getTabs().add(modelsTab); recordingsTab = new RecordingsTab("Recordings", recorder, config); tabPane.getTabs().add(recordingsTab); @@ -236,7 +234,7 @@ public class CamrecApplication extends Application { switchToStartTab(); writeColorSchemeStyleSheet(); - Color base = Color.web(Config.getInstance().getSettings().colorBase); + var base = Color.web(Config.getInstance().getSettings().colorBase); if (!base.equals(Color.WHITE)) { loadStyleSheet(primaryStage, "color.css"); } @@ -308,7 +306,7 @@ public class CamrecApplication extends Application { } // check for active recordings - boolean shutdownNow = false; + var shutdownNow = false; if (config.getSettings().localRecording) { try { if (!recorder.getCurrentlyRecording().isEmpty()) { @@ -374,7 +372,7 @@ public class CamrecApplication extends Application { private void registerAlertSystem() { for (EventHandlerConfiguration eventHandlerConfig : Config.getInstance().getSettings().eventHandlers) { - EventHandler handler = new EventHandler(eventHandlerConfig); + var handler = new EventHandler(eventHandlerConfig); EventBusHolder.register(handler); LOG.debug("Registered event handler for {} {}", eventHandlerConfig.getEvent(), eventHandlerConfig.getName()); } @@ -428,13 +426,13 @@ public class CamrecApplication extends Application { bytesPerSecond = 0; } String humanReadable = ByteUnitFormatter.format(bytesPerSecond); - String status = String.format("Recording %s / %s models @ %s/s", activeRecordings, recorder.getModelCount(), humanReadable); + var status = String.format("Recording %s / %s models @ %s/s", activeRecordings, recorder.getModelCount(), humanReadable); Platform.runLater(() -> statusLabel.setText(status)); } private void writeColorSchemeStyleSheet() { - File colorCss = new File(Config.getInstance().getConfigDir(), "color.css"); - try (FileOutputStream fos = new FileOutputStream(colorCss)) { + var colorCss = new File(Config.getInstance().getConfigDir(), "color.css"); + try (var fos = new FileOutputStream(colorCss)) { String content = ".root {\n" + " -fx-base: " + Config.getInstance().getSettings().colorBase + ";\n" + " -fx-accent: " + Config.getInstance().getSettings().colorAccent + ";\n" + " -fx-default-button: -fx-accent;\n" + " -fx-focus-color: -fx-accent;\n" + " -fx-control-inner-background-alt: derive(-fx-base, 95%);\n" + "}"; @@ -445,7 +443,7 @@ public class CamrecApplication extends Application { } public static void loadStyleSheet(Stage primaryStage, String filename) { - File css = new File(Config.getInstance().getConfigDir(), filename); + var css = new File(Config.getInstance().getConfigDir(), filename); if (css.exists() && css.isFile()) { primaryStage.getScene().getStylesheets().add(css.toURI().toString()); } @@ -509,20 +507,20 @@ public class CamrecApplication extends Application { } private void checkForUpdates() { - Thread updateCheck = new Thread(() -> { - String url = "https://pastebin.com/raw/mUxtKzyB"; - Request request = new Request.Builder().url(url).build(); - try (Response response = httpClient.execute(request)) { - String body = response.body().string(); + var updateCheck = new Thread(() -> { + var url = "https://pastebin.com/raw/mUxtKzyB"; + var request = new Request.Builder().url(url).build(); + try (var response = httpClient.execute(request)) { + var body = response.body().string(); LOG.trace("Version check respone: {}", body); if (response.isSuccessful()) { - Moshi moshi = new Moshi.Builder().build(); + var moshi = new Moshi.Builder().build(); Type type = Types.newParameterizedType(List.class, Release.class); JsonAdapter> adapter = moshi.adapter(type); List releases = adapter.fromJson(body); - Release latest = releases.get(0); - Version latestVersion = latest.getVersion(); - Version ctbrecVersion = getVersion(); + var latest = releases.get(0); + var latestVersion = latest.getVersion(); + var ctbrecVersion = getVersion(); if (latestVersion.compareTo(ctbrecVersion) > 0) { LOG.debug("Update available {} < {}", ctbrecVersion, latestVersion); Platform.runLater(() -> tabPane.getTabs().add(new UpdateTab(latest))); @@ -546,8 +544,8 @@ public class CamrecApplication extends Application { return Version.of("0.0.0-DEV"); } else { try (InputStream is = CamrecApplication.class.getClassLoader().getResourceAsStream("version")) { - BufferedReader reader = new BufferedReader(new InputStreamReader(is)); - String versionString = reader.readLine(); + var reader = new BufferedReader(new InputStreamReader(is)); + var versionString = reader.readLine(); return Version.of(versionString); } } diff --git a/client/src/main/java/ctbrec/ui/ClipboardListener.java b/client/src/main/java/ctbrec/ui/ClipboardListener.java index d6ac591c..3820215b 100644 --- a/client/src/main/java/ctbrec/ui/ClipboardListener.java +++ b/client/src/main/java/ctbrec/ui/ClipboardListener.java @@ -1,19 +1,19 @@ package ctbrec.ui; -import ctbrec.Model; -import ctbrec.recorder.Recorder; -import ctbrec.sites.Site; -import javafx.application.Platform; -import javafx.scene.input.Clipboard; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.List; import java.util.Objects; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ctbrec.recorder.Recorder; +import ctbrec.sites.Site; +import javafx.application.Platform; +import javafx.scene.input.Clipboard; + public class ClipboardListener implements Runnable { private static final Logger LOG = LoggerFactory.getLogger(ClipboardListener.class); @@ -50,7 +50,7 @@ public class ClipboardListener implements Runnable { private void addModelIfUrlMatches(String url) { for (Site site : sites) { - Model m = site.createModelFromUrl(url); + var m = site.createModelFromUrl(url); if (m != null) { try { recorder.addModel(m); diff --git a/client/src/main/java/ctbrec/ui/DesktopIntegration.java b/client/src/main/java/ctbrec/ui/DesktopIntegration.java index 82dfc86c..1140116a 100644 --- a/client/src/main/java/ctbrec/ui/DesktopIntegration.java +++ b/client/src/main/java/ctbrec/ui/DesktopIntegration.java @@ -2,7 +2,6 @@ package ctbrec.ui; import java.awt.AWTException; import java.awt.Desktop; -import java.awt.Image; import java.awt.MenuItem; import java.awt.PopupMenu; import java.awt.SystemTray; @@ -65,8 +64,8 @@ public class DesktopIntegration { } // try external helpers - String[] externalHelpers = { "kde-open5", "kde-open", "gnome-open", "xdg-open" }; - Runtime rt = Runtime.getRuntime(); + var externalHelpers = new String[] { "kde-open5", "kde-open", "gnome-open", "xdg-open" }; + var rt = Runtime.getRuntime(); for (String helper : externalHelpers) { try { rt.exec(helper + " " + uri); @@ -80,9 +79,9 @@ public class DesktopIntegration { Alert info = new AutosizeAlert(Alert.AlertType.ERROR); info.setTitle("Open URL"); info.setContentText("Couldn't open URL"); - BorderPane pane = new BorderPane(); + var pane = new BorderPane(); pane.setTop(new Label()); - TextField urlField = new TextField(uri); + var urlField = new TextField(uri); urlField.setPadding(new Insets(10)); urlField.setEditable(false); pane.setCenter(urlField); @@ -100,8 +99,8 @@ public class DesktopIntegration { } // try external helpers - String[] externalHelpers = { "kde-open5", "kde-open", "gnome-open", "xdg-open" }; - Runtime rt = Runtime.getRuntime(); + var externalHelpers = new String[] { "kde-open5", "kde-open", "gnome-open", "xdg-open" }; + var rt = Runtime.getRuntime(); for (String helper : externalHelpers) { try { rt.exec(helper + " " + f.getAbsolutePath()); @@ -115,9 +114,9 @@ public class DesktopIntegration { Alert info = new AutosizeAlert(Alert.AlertType.ERROR); info.setTitle("Open file"); info.setContentText("Couldn't open file"); - BorderPane pane = new BorderPane(); + var pane = new BorderPane(); pane.setTop(new Label()); - TextField urlField = new TextField(f.toString()); + var urlField = new TextField(f.toString()); urlField.setPadding(new Insets(10)); urlField.setEditable(false); pane.setCenter(urlField); @@ -189,7 +188,7 @@ public class DesktopIntegration { if (tray == null) { String title = CamrecApplication.title; tray = SystemTray.getSystemTray(); - Image image = Toolkit.getDefaultToolkit().createImage(DesktopIntegration.class.getResource("/icon64.png")); + var image = Toolkit.getDefaultToolkit().createImage(DesktopIntegration.class.getResource("/icon64.png")); PopupMenu menu = createTrayContextMenu(stage); trayIcon = new TrayIcon(image, title, menu); @@ -217,12 +216,12 @@ public class DesktopIntegration { } private static PopupMenu createTrayContextMenu(Stage stage) { - PopupMenu menu = new PopupMenu(); - MenuItem show = new MenuItem("Show"); + var menu = new PopupMenu(); + var show = new MenuItem("Show"); show.addActionListener(evt -> restoreStage(stage)); menu.add(show); menu.addSeparator(); - MenuItem pauseRecording = new MenuItem("Pause recording"); + var pauseRecording = new MenuItem("Pause recording"); pauseRecording.addActionListener(evt -> { try { recorder.pause(); @@ -231,7 +230,7 @@ public class DesktopIntegration { } }); menu.add(pauseRecording); - MenuItem resumeRecording = new MenuItem("Resume recording"); + var resumeRecording = new MenuItem("Resume recording"); resumeRecording.addActionListener(evt -> { try { recorder.resume(); @@ -241,8 +240,8 @@ public class DesktopIntegration { }); menu.add(resumeRecording); menu.addSeparator(); - MenuItem exit = new MenuItem("Exit"); - exit.addActionListener(evt -> exit(stage)); + var exit = new MenuItem("Exit"); + exit.addActionListener(evt -> exit()); menu.add(exit); return menu; } @@ -266,7 +265,7 @@ public class DesktopIntegration { }); } - private static void exit(Stage stage) { + private static void exit() { EventBusHolder.BUS.post(Map.of("event", "shutdown")); } diff --git a/client/src/main/java/ctbrec/ui/ExternalBrowser.java b/client/src/main/java/ctbrec/ui/ExternalBrowser.java index 269944bd..dde7ec13 100644 --- a/client/src/main/java/ctbrec/ui/ExternalBrowser.java +++ b/client/src/main/java/ctbrec/ui/ExternalBrowser.java @@ -20,7 +20,6 @@ import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.OS; -import ctbrec.Settings.ProxyType; import ctbrec.io.StreamRedirector; public class ExternalBrowser implements AutoCloseable { @@ -50,7 +49,7 @@ public class ExternalBrowser implements AutoCloseable { addProxyConfig(jsonConfig.getJSONObject("config")); - File configDir = new File(Config.getInstance().getConfigDir(), "ctbrec-minimal-browser"); + var configDir = new File(Config.getInstance().getConfigDir(), "ctbrec-minimal-browser"); String[] cmdline = OS.getBrowserCommand(configDir.getCanonicalPath()); Process p = new ProcessBuilder(cmdline).start(); if (LOG.isTraceEnabled()) { @@ -91,7 +90,7 @@ public class ExternalBrowser implements AutoCloseable { } private void connectToRemoteControlSocket() throws IOException { - for (int i = 0; i < 20; i++) { + for (var i = 0; i < 20; i++) { try { socket = new Socket("localhost", 3202); in = socket.getInputStream(); @@ -117,7 +116,7 @@ public class ExternalBrowser implements AutoCloseable { } public void executeJavaScript(String javaScript) throws IOException { - JSONObject script = new JSONObject(); + var script = new JSONObject(); script.put("execute", javaScript); out.write(script.toString().getBytes(UTF_8)); out.write('\n'); @@ -138,7 +137,7 @@ public class ExternalBrowser implements AutoCloseable { private void readBrowserOutput() { LOG.debug("Browser output reader started"); - try (BufferedReader br = new BufferedReader(new InputStreamReader(in))) { + try (var br = new BufferedReader(new InputStreamReader(in))) { String line; synchronized (browserReadyLock) { browserReady = true; @@ -164,10 +163,10 @@ public class ExternalBrowser implements AutoCloseable { } private void addProxyConfig(JSONObject jsonConfig) { - ProxyType proxyType = Config.getInstance().getSettings().proxyType; + var proxyType = Config.getInstance().getSettings().proxyType; switch (proxyType) { case HTTP: - JSONObject proxy = new JSONObject(); + var proxy = new JSONObject(); proxy.put("address", "http=" + Config.getInstance().getSettings().proxyHost + ':' + Config.getInstance().getSettings().proxyPort + ";https=" + Config.getInstance().getSettings().proxyHost + ':' + Config.getInstance().getSettings().proxyPort); diff --git a/client/src/main/java/ctbrec/ui/FileDownload.java b/client/src/main/java/ctbrec/ui/FileDownload.java index 67889c5a..748fec7e 100644 --- a/client/src/main/java/ctbrec/ui/FileDownload.java +++ b/client/src/main/java/ctbrec/ui/FileDownload.java @@ -12,7 +12,6 @@ import org.slf4j.LoggerFactory; import ctbrec.io.HttpClient; import ctbrec.recorder.ProgressListener; import okhttp3.Request; -import okhttp3.Response; public class FileDownload { @@ -28,13 +27,13 @@ public class FileDownload { public void start(URL url, File target) throws IOException { LOG.trace("Downloading file {} to {}", url, target); - Request request = new Request.Builder().url(url).addHeader("connection", "keep-alive").build(); - Response response = httpClient.execute(request); - long fileSize = Long.parseLong(response.header("Content-Length", String.valueOf(Long.MAX_VALUE))); + var request = new Request.Builder().url(url).addHeader("connection", "keep-alive").build(); + var response = httpClient.execute(request); + var fileSize = Long.parseLong(response.header("Content-Length", String.valueOf(Long.MAX_VALUE))); InputStream in = null; - try (FileOutputStream fos = new FileOutputStream(target)) { + try (var fos = new FileOutputStream(target)) { in = response.body().byteStream(); - byte[] b = new byte[1024 * 100]; + var b = new byte[1024 * 100]; long totalBytesRead = 0; int length = -1; while ((length = in.read(b)) >= 0) { diff --git a/client/src/main/java/ctbrec/ui/action/CheckModelAccountAction.java b/client/src/main/java/ctbrec/ui/action/CheckModelAccountAction.java index 04fb1f94..47fad1c1 100644 --- a/client/src/main/java/ctbrec/ui/action/CheckModelAccountAction.java +++ b/client/src/main/java/ctbrec/ui/action/CheckModelAccountAction.java @@ -23,54 +23,63 @@ public class CheckModelAccountAction { private Recorder recorder; + private String buttonText; + public CheckModelAccountAction(Button b, Recorder recorder) { this.b = b; this.recorder = recorder; - + buttonText = b.getText(); } public void execute(Predicate filter) { - String buttonText = b.getText(); b.setDisable(true); Runnable checker = (() -> { List deletedAccounts = new ArrayList<>(); try { - List models = recorder.getModels().stream() // - .filter(filter) // - .collect(Collectors.toList()); - int total = models.size(); - for (int i = 0; i < total; i++) { - final int counter = i+1; - Platform.runLater(() -> b.setText(buttonText + ' ' + counter + '/' + total)); - Model modelToCheck = models.get(i); - try { - if (!modelToCheck.exists()) { - deletedAccounts.add(modelToCheck); - } - } catch (IOException e) { - LOG.warn("Couldn't check, if model account still exists", e); - } - } + checkModelAccounts(filter, deletedAccounts); } finally { - Platform.runLater(() -> { - b.setDisable(false); - b.setText(buttonText); - if (!deletedAccounts.isEmpty()) { - StringBuilder sb = new StringBuilder(); - for (Model deletedModel : deletedAccounts) { - String name = deletedModel.getDisplayName() + " ".repeat(30); - name = name.substring(0, 30); - sb.append(name).append(' ').append('(').append(deletedModel.getUrl()).append(')').append('\n'); - } - boolean remove = Dialogs.showConfirmDialog("Deleted Accounts", sb.toString(), - "The following accounts seem to have been deleted. Do you want to remove them?", b.getScene()); - if (remove) { - new StopRecordingAction(b, deletedAccounts, recorder).execute(); - } - } - }); + showResult(deletedAccounts); } }); GlobalThreadPool.submit(checker); } + + private void showResult(List deletedAccounts) { + Platform.runLater(() -> { + b.setDisable(false); + b.setText(buttonText); + if (!deletedAccounts.isEmpty()) { + var sb = new StringBuilder(); + for (Model deletedModel : deletedAccounts) { + String name = deletedModel.getDisplayName() + " ".repeat(30); + name = name.substring(0, 30); + sb.append(name).append(' ').append('(').append(deletedModel.getUrl()).append(')').append('\n'); + } + boolean remove = Dialogs.showConfirmDialog("Deleted Accounts", sb.toString(), + "The following accounts seem to have been deleted. Do you want to remove them?", b.getScene()); + if (remove) { + new StopRecordingAction(b, deletedAccounts, recorder).execute(); + } + } + }); + } + + private void checkModelAccounts(Predicate filter, List deletedAccounts) { + List models = recorder.getModels().stream() // + .filter(filter) // + .collect(Collectors.toList()); + int total = models.size(); + for (var i = 0; i < total; i++) { + final int counter = i+1; + Platform.runLater(() -> b.setText(buttonText + ' ' + counter + '/' + total)); + var modelToCheck = models.get(i); + try { + if (!modelToCheck.exists()) { + deletedAccounts.add(modelToCheck); + } + } catch (IOException e) { + LOG.warn("Couldn't check, if model account still exists", e); + } + } + } } diff --git a/client/src/main/java/ctbrec/ui/action/IgnoreModelsAction.java b/client/src/main/java/ctbrec/ui/action/IgnoreModelsAction.java index 4f5ec227..fe2d125d 100644 --- a/client/src/main/java/ctbrec/ui/action/IgnoreModelsAction.java +++ b/client/src/main/java/ctbrec/ui/action/IgnoreModelsAction.java @@ -5,7 +5,6 @@ import java.util.function.Consumer; import ctbrec.Config; import ctbrec.Model; -import ctbrec.Settings; import ctbrec.recorder.Recorder; import ctbrec.ui.JavaFxModel; import ctbrec.ui.controls.Dialogs; @@ -29,8 +28,8 @@ public class IgnoreModelsAction { } public void execute(Consumer callback) { - Settings settings = Config.getInstance().getSettings(); - boolean confirmed = true; + var settings = Config.getInstance().getSettings(); + var confirmed = true; if (settings.confirmationForDangerousActions) { int n = selectedModels.size(); String plural = n > 1 ? "s" : ""; @@ -39,7 +38,7 @@ public class IgnoreModelsAction { } if (confirmed) { for (Model model : selectedModels) { - Model modelToIgnore = unwrap(model); + var modelToIgnore = unwrap(model); settings.ignoredModels.add(modelToIgnore.getUrl()); } if (withRemoveDialog) { diff --git a/client/src/main/java/ctbrec/ui/action/OpenRecordingsDir.java b/client/src/main/java/ctbrec/ui/action/OpenRecordingsDir.java index 10d779b1..c4186dd9 100644 --- a/client/src/main/java/ctbrec/ui/action/OpenRecordingsDir.java +++ b/client/src/main/java/ctbrec/ui/action/OpenRecordingsDir.java @@ -24,7 +24,7 @@ public class OpenRecordingsDir { public void execute() { source.setCursor(Cursor.WAIT); - File fileForRecording = Config.getInstance().getFileForRecording(selectedModel, ".mp4", Instant.now()); + var fileForRecording = Config.getInstance().getFileForRecording(selectedModel, ".mp4", Instant.now()); final File dir = getModelDirectory(fileForRecording); if (dir.exists()) { GlobalThreadPool.submit(() -> DesktopIntegration.open(dir)); @@ -35,7 +35,7 @@ public class OpenRecordingsDir { } private File getModelDirectory(File fileForRecording) { - File dir = fileForRecording.getParentFile(); + var dir = fileForRecording.getParentFile(); if (Config.getInstance().getSettings().recordingsDirStructure == DirectoryStructure.ONE_PER_RECORDING) { dir = dir.getParentFile(); } diff --git a/client/src/main/java/ctbrec/ui/action/PlayAction.java b/client/src/main/java/ctbrec/ui/action/PlayAction.java index 544ba35a..631fbfe0 100644 --- a/client/src/main/java/ctbrec/ui/action/PlayAction.java +++ b/client/src/main/java/ctbrec/ui/action/PlayAction.java @@ -2,7 +2,6 @@ package ctbrec.ui.action; import ctbrec.Config; import ctbrec.Model; -import ctbrec.ui.SiteUI; import ctbrec.ui.SiteUiFactory; import ctbrec.ui.controls.Toast; import javafx.application.Platform; @@ -21,8 +20,8 @@ public class PlayAction { public void execute() { source.setCursor(Cursor.WAIT); - Thread t = new Thread(() -> { - SiteUI siteUI = SiteUiFactory.getUi(selectedModel.getSite()); + var t = new Thread(() -> { + var siteUI = SiteUiFactory.getUi(selectedModel.getSite()); boolean started = siteUI.play(selectedModel); Platform.runLater(() -> { if (started && Config.getInstance().getSettings().showPlayerStarting) { diff --git a/client/src/main/java/ctbrec/ui/action/RemoveTimeLimitAction.java b/client/src/main/java/ctbrec/ui/action/RemoveTimeLimitAction.java index 4e86a3c7..20dd201d 100644 --- a/client/src/main/java/ctbrec/ui/action/RemoveTimeLimitAction.java +++ b/client/src/main/java/ctbrec/ui/action/RemoveTimeLimitAction.java @@ -27,7 +27,7 @@ public class RemoveTimeLimitAction { public CompletableFuture execute() { source.setCursor(Cursor.WAIT); - Instant unlimited = Instant.ofEpochMilli(Model.RECORD_INDEFINITELY); + var unlimited = Instant.ofEpochMilli(Model.RECORD_INDEFINITELY); return CompletableFuture.supplyAsync(() -> { try { selectedModel.setRecordUntil(unlimited); diff --git a/client/src/main/java/ctbrec/ui/action/StartRecordingAction.java b/client/src/main/java/ctbrec/ui/action/StartRecordingAction.java index 30b46858..693eb3c3 100644 --- a/client/src/main/java/ctbrec/ui/action/StartRecordingAction.java +++ b/client/src/main/java/ctbrec/ui/action/StartRecordingAction.java @@ -1,18 +1,18 @@ package ctbrec.ui.action; +import java.util.List; + import ctbrec.Model; import ctbrec.recorder.Recorder; import ctbrec.ui.controls.Dialogs; import javafx.application.Platform; import javafx.scene.Node; -import java.util.List; - public class StartRecordingAction extends ModelMassEditAction { public StartRecordingAction(Node source, List models, Recorder recorder) { super(source, models); - action = (m) -> { + action = m -> { try { recorder.addModel(m); } catch (Exception e) { diff --git a/client/src/main/java/ctbrec/ui/controls/AbstractFileSelectionBox.java b/client/src/main/java/ctbrec/ui/controls/AbstractFileSelectionBox.java index 0f3820b8..b094a3c4 100644 --- a/client/src/main/java/ctbrec/ui/controls/AbstractFileSelectionBox.java +++ b/client/src/main/java/ctbrec/ui/controls/AbstractFileSelectionBox.java @@ -11,8 +11,6 @@ import ctbrec.ui.AutosizeAlert; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.beans.value.ChangeListener; -import javafx.geometry.Point2D; -import javafx.scene.Node; import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.TextField; @@ -36,7 +34,7 @@ public abstract class AbstractFileSelectionBox extends HBox { protected boolean allowEmptyValue = false; private Tooltip validationError = new Tooltip(); - public AbstractFileSelectionBox() { + protected AbstractFileSelectionBox() { super(5); fileInput = new TextField(); fileInput.textProperty().addListener(textListener()); @@ -45,7 +43,7 @@ public abstract class AbstractFileSelectionBox extends HBox { validationError.hide(); } }); - Node browse = createBrowseButton(); + var browse = createBrowseButton(); browse.disableProperty().bind(disableProperty()); fileInput.disableProperty().bind(disableProperty()); fileInput.textProperty().bindBidirectional(fileProperty); @@ -63,14 +61,14 @@ public abstract class AbstractFileSelectionBox extends HBox { }); } - public AbstractFileSelectionBox(String initialValue) { + protected AbstractFileSelectionBox(String initialValue) { this(); fileInput.setText(initialValue); } private ChangeListener textListener() { return (obs, o, n) -> { - String input = fileInput.getText(); + var input = fileInput.getText(); if (StringUtil.isBlank(input)) { if (allowEmptyValue) { fileProperty.set(""); @@ -78,19 +76,19 @@ public abstract class AbstractFileSelectionBox extends HBox { return; } } else { - File program = new File(input); + var program = new File(input); setFile(program); } }; } protected void setFile(File file) { - String msg = validate(file); + var msg = validate(file); if (msg != null) { fileInput.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.DASHED, new CornerRadii(2), new BorderWidths(2)))); validationError.setText(msg); fileInput.setTooltip(validationError); - Point2D p = fileInput.localToScreen(fileInput.getTranslateY(), fileInput.getTranslateY()); + var p = fileInput.localToScreen(fileInput.getTranslateY(), fileInput.getTranslateY()); if (!validationError.isShowing() && getScene() != null) { validationError.show(getScene().getWindow(), p.getX(), p.getY() + fileInput.getHeight() + 4); } @@ -123,7 +121,7 @@ public abstract class AbstractFileSelectionBox extends HBox { } private Button createBrowseButton() { - Button button = new Button("Select"); + var button = new Button("Select"); button.setOnAction(e -> choose()); button.prefHeightProperty().bind(this.heightProperty()); button.prefWidthProperty().set(70); @@ -131,14 +129,14 @@ public abstract class AbstractFileSelectionBox extends HBox { } protected void choose() { - FileChooser chooser = new FileChooser(); - File program = chooser.showOpenDialog(null); + var chooser = new FileChooser(); + var program = chooser.showOpenDialog(null); if (program != null) { try { fileInput.setText(program.getCanonicalPath()); } catch (IOException e1) { LOG.error("Couldn't determine path", e1); - Alert alert = new AutosizeAlert(Alert.AlertType.ERROR, getScene()); + var alert = new AutosizeAlert(Alert.AlertType.ERROR, getScene()); alert.setTitle("Whoopsie"); alert.setContentText("Couldn't determine path"); alert.showAndWait(); diff --git a/client/src/main/java/ctbrec/ui/controls/DateTimeCellFactory.java b/client/src/main/java/ctbrec/ui/controls/DateTimeCellFactory.java index 97169c48..41c0d4da 100644 --- a/client/src/main/java/ctbrec/ui/controls/DateTimeCellFactory.java +++ b/client/src/main/java/ctbrec/ui/controls/DateTimeCellFactory.java @@ -19,8 +19,8 @@ public class DateTimeCellFactory implements Callback, if (empty || item == null) { setText(""); } else { - LocalDateTime dateTime = LocalDateTime.ofInstant(item, ZoneId.systemDefault()); - DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT); + var dateTime = LocalDateTime.ofInstant(item, ZoneId.systemDefault()); + var formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT); String formattedDateTime = formatter.format(dateTime); setText(item.equals(Instant.EPOCH) ? "" : formattedDateTime); } diff --git a/client/src/main/java/ctbrec/ui/controls/DirectorySelectionBox.java b/client/src/main/java/ctbrec/ui/controls/DirectorySelectionBox.java index f8f89640..ec9c858d 100644 --- a/client/src/main/java/ctbrec/ui/controls/DirectorySelectionBox.java +++ b/client/src/main/java/ctbrec/ui/controls/DirectorySelectionBox.java @@ -12,14 +12,14 @@ public class DirectorySelectionBox extends AbstractFileSelectionBox { @Override protected void choose() { - DirectoryChooser chooser = new DirectoryChooser(); - String preselection = Optional.ofNullable(fileProperty().get()).orElse("."); - File currentDir = new File(preselection); + var chooser = new DirectoryChooser(); + var preselection = Optional.ofNullable(fileProperty().get()).orElse("."); + var currentDir = new File(preselection); if (currentDir.exists() && currentDir.isDirectory()) { chooser.setInitialDirectory(currentDir); } File selectedDir = chooser.showDialog(null); - if(selectedDir != null) { + if (selectedDir != null) { fileInput.setText(selectedDir.getAbsolutePath()); setFile(selectedDir); } @@ -27,12 +27,12 @@ public class DirectorySelectionBox extends AbstractFileSelectionBox { @Override protected String validate(File file) { - if(isDisabled()) { + if (isDisabled()) { return null; } String msg = super.validate(file); - if(msg != null) { + if (msg != null) { return msg; } else if (!file.isDirectory()) { return "This is not a directory"; diff --git a/client/src/main/java/ctbrec/ui/controls/FasterVerticalScrollPaneSkin.java b/client/src/main/java/ctbrec/ui/controls/FasterVerticalScrollPaneSkin.java index fee2f219..8d4e6e4d 100644 --- a/client/src/main/java/ctbrec/ui/controls/FasterVerticalScrollPaneSkin.java +++ b/client/src/main/java/ctbrec/ui/controls/FasterVerticalScrollPaneSkin.java @@ -10,9 +10,9 @@ public class FasterVerticalScrollPaneSkin extends ScrollPaneSkin { super(scrollPane); getSkinnable().addEventFilter(ScrollEvent.SCROLL, event -> { - double ratio = scrollPane.getViewportBounds().getHeight() / scrollPane.getContent().getBoundsInLocal().getHeight(); - double baseUnitIncrement = 0.15; - double unitIncrement = baseUnitIncrement * ratio * 1.25; + var ratio = scrollPane.getViewportBounds().getHeight() / scrollPane.getContent().getBoundsInLocal().getHeight(); + var baseUnitIncrement = 0.15; + var unitIncrement = baseUnitIncrement * ratio * 1.25; getVerticalScrollBar().setUnitIncrement(unitIncrement); if (event.getDeltaX() < 0) { diff --git a/client/src/main/java/ctbrec/ui/controls/FileSelectionBox.java b/client/src/main/java/ctbrec/ui/controls/FileSelectionBox.java index 88022dc6..684f1c3a 100644 --- a/client/src/main/java/ctbrec/ui/controls/FileSelectionBox.java +++ b/client/src/main/java/ctbrec/ui/controls/FileSelectionBox.java @@ -12,12 +12,12 @@ public class FileSelectionBox extends AbstractFileSelectionBox { @Override protected String validate(File file) { - if(isDisabled()) { + if (isDisabled()) { return null; } String msg = super.validate(file); - if(msg != null) { + if (msg != null) { return msg; } else if (!file.isFile()) { return "This is not a regular file"; diff --git a/client/src/main/java/ctbrec/ui/controls/Popover.java b/client/src/main/java/ctbrec/ui/controls/Popover.java index d738877b..47f0eed9 100644 --- a/client/src/main/java/ctbrec/ui/controls/Popover.java +++ b/client/src/main/java/ctbrec/ui/controls/Popover.java @@ -46,10 +46,8 @@ import javafx.beans.property.SimpleDoubleProperty; import javafx.event.ActionEvent; import javafx.event.Event; import javafx.event.EventHandler; -import javafx.geometry.Insets; import javafx.geometry.Point2D; import javafx.scene.Node; -import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.input.MouseEvent; @@ -82,7 +80,7 @@ public class Popover extends Region implements EventHandler{ private final Region frameBorder = new Region(); private final Button leftButton = new Button("Left"); private final Button rightButton = new Button("Right"); - private final LinkedList pages = new LinkedList(); + private final LinkedList pages = new LinkedList<>(); private final Pane pagesPane = new Pane(); private final Rectangle pagesClipRect = new Rectangle(); private final Pane titlesPane = new Pane(); @@ -128,11 +126,6 @@ public class Popover extends Region implements EventHandler{ t.consume(); } }; - // popoverScrollHandler = new EventHandler() { - // @Override public void handle(ScrollEvent t) { - // t.consume(); // consume all scroll events - // } - // }; } /** @@ -149,9 +142,9 @@ public class Popover extends Region implements EventHandler{ @Override protected double computeMinWidth(double height) { Page page = pages.isEmpty() ? null : pages.getFirst(); if (page != null) { - Node n = page.getPageNode(); + var n = page.getPageNode(); if (n != null) { - Insets insets = getInsets(); + var insets = getInsets(); return insets.getLeft() + n.minWidth(-1) + insets.getRight(); } } @@ -159,16 +152,16 @@ public class Popover extends Region implements EventHandler{ } @Override protected double computeMinHeight(double width) { - Insets insets = getInsets(); + var insets = getInsets(); return insets.getLeft() + 100 + insets.getRight(); } @Override protected double computePrefWidth(double height) { Page page = pages.isEmpty() ? null : pages.getFirst(); if (page != null) { - Node n = page.getPageNode(); + var n = page.getPageNode(); if (n != null) { - Insets insets = getInsets(); + var insets = getInsets(); return insets.getLeft() + n.prefWidth(-1) + insets.getRight(); } } @@ -180,9 +173,9 @@ public class Popover extends Region implements EventHandler{ double maxHeight = maxHeight(-1); double prefHeight = popoverHeight.get(); if (prefHeight == -1) { - Page page = pages.getFirst(); + var page = pages.getFirst(); if (page != null) { - Insets inset = getInsets(); + var inset = getInsets(); if (width == -1) { width = prefWidth(-1); } @@ -208,7 +201,7 @@ public class Popover extends Region implements EventHandler{ } @Override protected double computeMaxHeight(double width) { - Scene scene = getScene(); + var scene = getScene(); if (scene != null) { return scene.getHeight() - 100; } else { @@ -220,14 +213,14 @@ public class Popover extends Region implements EventHandler{ if (maxPopupHeight == -1) { maxPopupHeight = (int)getScene().getHeight()-100; } - final Insets insets = getInsets(); + final var insets = getInsets(); final int width = (int)getWidth(); final int height = (int)getHeight(); final int top = (int)insets.getTop() + 40; final int right = (int)insets.getRight(); final int bottom = (int)insets.getBottom(); final int left = (int)insets.getLeft(); - final int offset = 18; + final var offset = 18; int pageWidth = width - left - right; int pageHeight = height - top - bottom; @@ -238,19 +231,18 @@ public class Popover extends Region implements EventHandler{ pagesClipRect.setWidth(pageWidth); pagesClipRect.setHeight(pageHeight); - int pageX = 0; + var pageX = 0; for (Node page : pagesPane.getChildren()) { page.resizeRelocate(pageX, 0, pageWidth, pageHeight); pageX += pageWidth + PAGE_GAP; } - int buttonHeight = (int)(leftButton.prefHeight(-1)); - if (buttonHeight < 30) buttonHeight = 30; - final int buttonTop = (int)((top-buttonHeight)/2d); - final int leftButtonWidth = (int)snapSizeX(leftButton.prefWidth(-1)); - leftButton.resizeRelocate(left, buttonTop + offset,leftButtonWidth,buttonHeight); - final int rightButtonWidth = (int)snapSizeX(rightButton.prefWidth(-1)); - rightButton.resizeRelocate(width-right-rightButtonWidth, buttonTop + offset,rightButtonWidth,buttonHeight); + int buttonHeight = Math.min(30, (int) (leftButton.prefHeight(-1))); + final int buttonTop = (int) ((top - buttonHeight) / 2d); + final int leftButtonWidth = (int) snapSizeX(leftButton.prefWidth(-1)); + leftButton.resizeRelocate(left, (double)buttonTop + offset, leftButtonWidth, buttonHeight); + final int rightButtonWidth = (int) snapSizeX(rightButton.prefWidth(-1)); + rightButton.resizeRelocate(width - (double)right - rightButtonWidth, (double)buttonTop + offset, rightButtonWidth, buttonHeight); if (title != null) { double tw = title.getWidth(); @@ -275,16 +267,16 @@ public class Popover extends Region implements EventHandler{ } public final void popPage() { - Page oldPage = pages.pop(); + var oldPage = pages.pop(); oldPage.handleHidden(); oldPage.setPopover(null); - Page page = pages.getFirst(); + var page = pages.getFirst(); leftButton.setVisible(page.leftButtonText() != null); leftButton.setText(page.leftButtonText()); rightButton.setVisible(page.rightButtonText() != null); rightButton.setText(page.rightButtonText()); - if (pages.size() > 0) { - final Insets insets = getInsets(); + if (!pages.isEmpty()) { + final var insets = getInsets(); final int width = (int)prefWidth(-1); final int right = (int)insets.getRight(); final int left = (int)insets.getLeft(); @@ -308,10 +300,10 @@ public class Popover extends Region implements EventHandler{ } public final void pushPage(final Page page) { - final Node pageNode = page.getPageNode(); + final var pageNode = page.getPageNode(); pageNode.setManaged(false); pagesPane.getChildren().add(pageNode); - final Insets insets = getInsets(); + final var insets = getInsets(); final int pageWidth = (int)(prefWidth(-1) - insets.getLeft() - insets.getRight()); final int newPageX = (pageWidth + PAGE_GAP) * pages.size(); leftButton.setVisible(page.leftButtonText() != null); @@ -322,11 +314,11 @@ public class Popover extends Region implements EventHandler{ title = new Label(page.getPageTitle()); title.getStyleClass().add("popover-title"); title.setTextAlignment(TextAlignment.CENTER); - title.setTranslateX(newPageX + (int) ((pageWidth - title.getLayoutBounds().getWidth()) / 2d)); + title.setTranslateX(newPageX + (pageWidth - title.getLayoutBounds().getWidth()) / 2d); titlesPane.getChildren().add(title); if (!pages.isEmpty() && isVisible()) { - final Timeline timeline = new Timeline( + final var timeline = new Timeline( new KeyFrame(Duration.millis(350), (ActionEvent t) -> { pagesPane.setCache(false); resizePopoverToNewPage(pageNode); @@ -344,7 +336,7 @@ public class Popover extends Region implements EventHandler{ } private void resizePopoverToNewPage(final Node newPageNode) { - final Insets insets = getInsets(); + final var insets = getInsets(); final double width = prefWidth(-1); final double contentWidth = width - insets.getLeft() - insets.getRight(); double h = newPageNode.prefHeight(contentWidth); @@ -366,7 +358,6 @@ public class Popover extends Region implements EventHandler{ if (!isVisible() || fadeAnimation != null) { this.onHideCallback = onHideCallback; getScene().addEventFilter(MouseEvent.MOUSE_CLICKED, popoverHideHandler); - // getScene().addEventFilter(ScrollEvent.ANY,popoverScrollHandler); if (fadeAnimation != null) { fadeAnimation.stop(); @@ -376,17 +367,15 @@ public class Popover extends Region implements EventHandler{ setVisible(true); } - FadeTransition fade = new FadeTransition(Duration.seconds(.1), this); + var fade = new FadeTransition(Duration.seconds(.1), this); fade.setToValue(1.0); - fade.setOnFinished((ActionEvent event) -> { - fadeAnimation = null; - }); + fade.setOnFinished((ActionEvent event) -> fadeAnimation = null); - ScaleTransition scale = new ScaleTransition(Duration.seconds(.1), this); + var scale = new ScaleTransition(Duration.seconds(.1), this); scale.setToX(1); scale.setToY(1); - ParallelTransition tx = new ParallelTransition(fade, scale); + var tx = new ParallelTransition(fade, scale); fadeAnimation = tx; tx.play(); } @@ -395,26 +384,24 @@ public class Popover extends Region implements EventHandler{ public void hide(){ if (isVisible() || fadeAnimation != null) { getScene().removeEventFilter(MouseEvent.MOUSE_CLICKED, popoverHideHandler); - // getScene().removeEventFilter(ScrollEvent.ANY,popoverScrollHandler); if (fadeAnimation != null) { fadeAnimation.stop(); } - FadeTransition fade = new FadeTransition(Duration.seconds(.1), this); + var fade = new FadeTransition(Duration.seconds(.1), this); fade.setToValue(0); fade.setOnFinished((ActionEvent event) -> { fadeAnimation = null; setVisible(false); - //clearPages(); if (onHideCallback != null) onHideCallback.run(); }); - ScaleTransition scale = new ScaleTransition(Duration.seconds(.1), this); + var scale = new ScaleTransition(Duration.seconds(.1), this); scale.setToX(.8); scale.setToY(.8); - ParallelTransition tx = new ParallelTransition(fade, scale); + var tx = new ParallelTransition(fade, scale); fadeAnimation = tx; tx.play(); } diff --git a/client/src/main/java/ctbrec/ui/controls/PopoverTreeList.java b/client/src/main/java/ctbrec/ui/controls/PopoverTreeList.java index c914ba51..99fae047 100644 --- a/client/src/main/java/ctbrec/ui/controls/PopoverTreeList.java +++ b/client/src/main/java/ctbrec/ui/controls/PopoverTreeList.java @@ -55,7 +55,7 @@ public class PopoverTreeList extends ListView implements Callback implements EventHandler { private TreeItemListCell() { diff --git a/client/src/main/java/ctbrec/ui/controls/ProgramSelectionBox.java b/client/src/main/java/ctbrec/ui/controls/ProgramSelectionBox.java index 2a950f65..d2628a8a 100644 --- a/client/src/main/java/ctbrec/ui/controls/ProgramSelectionBox.java +++ b/client/src/main/java/ctbrec/ui/controls/ProgramSelectionBox.java @@ -12,12 +12,12 @@ public class ProgramSelectionBox extends FileSelectionBox { @Override protected String validate(File file) { - if(isDisabled()) { + if (isDisabled()) { return null; } String msg = super.validate(file); - if(msg != null) { + if (msg != null) { return msg; } else if (!file.canExecute()) { return "This is not an executable application"; diff --git a/client/src/main/java/ctbrec/ui/controls/RecordingIndicator.java b/client/src/main/java/ctbrec/ui/controls/RecordingIndicator.java index ed07aa1b..720f40b7 100644 --- a/client/src/main/java/ctbrec/ui/controls/RecordingIndicator.java +++ b/client/src/main/java/ctbrec/ui/controls/RecordingIndicator.java @@ -34,4 +34,3 @@ public class RecordingIndicator extends StackPane { icon.setImage(img); } } - diff --git a/client/src/main/java/ctbrec/ui/controls/SearchBox.java b/client/src/main/java/ctbrec/ui/controls/SearchBox.java index fbbd0da9..2a9fd739 100644 --- a/client/src/main/java/ctbrec/ui/controls/SearchBox.java +++ b/client/src/main/java/ctbrec/ui/controls/SearchBox.java @@ -44,10 +44,10 @@ import javafx.scene.layout.Region; * Search field with styling and a clear button */ public class SearchBox extends TextField implements ChangeListener{ + private static final int PREF_HEIGHT = 26; private final Button clearButton = new Button(); private final Region innerBackground = new Region(); private final Region icon = new Region(); - private final int prefHeight = 26; public SearchBox() { getStyleClass().addAll("search-box"); @@ -55,7 +55,7 @@ public class SearchBox extends TextField implements ChangeListener{ innerBackground.getStyleClass().setAll("search-box-inner"); setPromptText("Search"); textProperty().addListener(this); - setPrefHeight(prefHeight); + setPrefHeight(PREF_HEIGHT); clearButton.getStyleClass().setAll("search-clear-button"); clearButton.setCursor(Cursor.DEFAULT); clearButton.setOnMouseClicked((MouseEvent t) -> { @@ -91,10 +91,10 @@ public class SearchBox extends TextField implements ChangeListener{ innerBackground.resize(getWidth(), getHeight()); icon.setLayoutX(0); icon.setLayoutY(0); - icon.resize(35,prefHeight); - clearButton.setLayoutX(getWidth() - prefHeight); + icon.resize(35,PREF_HEIGHT); + clearButton.setLayoutX(getWidth() - PREF_HEIGHT); clearButton.setLayoutY(0); - clearButton.resize(prefHeight, prefHeight); + clearButton.resize(PREF_HEIGHT, PREF_HEIGHT); } @Override public void changed(ObservableValue ov, String oldValue, String newValue) { diff --git a/client/src/main/java/ctbrec/ui/controls/autocomplete/AutoFillTextField.java b/client/src/main/java/ctbrec/ui/controls/autocomplete/AutoFillTextField.java index 6b12b354..8b50191c 100644 --- a/client/src/main/java/ctbrec/ui/controls/autocomplete/AutoFillTextField.java +++ b/client/src/main/java/ctbrec/ui/controls/autocomplete/AutoFillTextField.java @@ -1,6 +1,5 @@ package ctbrec.ui.controls.autocomplete; - import java.util.Optional; import javafx.event.ActionEvent; @@ -36,18 +35,18 @@ public class AutoFillTextField extends TextField { private void autocomplete(boolean fulltextSearch) { String oldtext = getOldText(); - if(oldtext.isEmpty()) { + if (oldtext.isEmpty()) { return; } - Optional match = null; - if(fulltextSearch) { + Optional match; + if (fulltextSearch) { match = suggester.fulltext(oldtext); } else { match = suggester.startsWith(oldtext); } - if(match.isPresent()) { + if (match.isPresent()) { setText(match.get()); int pos = oldtext.length(); positionCaret(pos); @@ -56,7 +55,7 @@ public class AutoFillTextField extends TextField { } private String getOldText() { - if(getSelection().getLength() > 0) { + if (getSelection().getLength() > 0) { return getText().substring(0, getSelection().getStart()); } else { return getText(); diff --git a/client/src/main/java/ctbrec/ui/controls/autocomplete/Suggestion.java b/client/src/main/java/ctbrec/ui/controls/autocomplete/Suggestion.java deleted file mode 100644 index 82378795..00000000 --- a/client/src/main/java/ctbrec/ui/controls/autocomplete/Suggestion.java +++ /dev/null @@ -1,5 +0,0 @@ -package ctbrec.ui.controls.autocomplete; - -public class Suggestion { - -} diff --git a/client/src/main/java/ctbrec/ui/controls/range/RangeSliderBehavior.java b/client/src/main/java/ctbrec/ui/controls/range/RangeSliderBehavior.java index b2496f65..43972045 100644 --- a/client/src/main/java/ctbrec/ui/controls/range/RangeSliderBehavior.java +++ b/client/src/main/java/ctbrec/ui/controls/range/RangeSliderBehavior.java @@ -35,8 +35,8 @@ public class RangeSliderBehavior extends BehaviorBase= high.doubleValue()) { newPosition = getLow(); } @@ -48,8 +48,8 @@ public class RangeSliderBehavior extends BehaviorBase extends BehaviorBase> { thumbRange.high.resize(thumbWidth, thumbHeight); } - // we are assuming the is common radius's for all corners on the track - double trackRadius = track.getBackground() == null ? 0 - : !track.getBackground().getFills().isEmpty() ? track.getBackground().getFills().get(0).getRadii().getTopLeftHorizontalRadius() : 0; - double tickLineHeight = (showTickMarks) ? tickLine.prefHeight(-1) : 0; - double trackHeight = 5;// track.prefHeight(-1); - double trackAreaHeight = Math.max(trackHeight, thumbHeight); - double totalHeightNeeded = trackAreaHeight + ((showTickMarks) ? TRACK_TO_TICK_GAP + tickLineHeight : 0); - double startY = y + ((h - totalHeightNeeded) / 2); // center slider in available height vertically + double radius = track.getBackground().getFills().isEmpty() ? 0 : track.getBackground().getFills().get(0).getRadii().getTopLeftHorizontalRadius(); + double trackRadius = track.getBackground() == null ? 0 : radius; - trackLength = w - thumbWidth; - trackStart = x + (thumbWidth / 2); + double tickLineHeight = (showTickMarks) ? tickLine.prefHeight(-1) : 0; + double trackHeight = 5; + double trackAreaHeight = Math.max(trackHeight, thumbHeight); + double totalHeightNeeded = trackAreaHeight + ((showTickMarks) ? TRACK_TO_TICK_GAP + tickLineHeight : 0); + double startY = y + ((h - totalHeightNeeded) / 2); // center slider in available height vertically - double trackTop = (int) (startY + ((trackAreaHeight - trackHeight) / 2)); - lowThumbPos = (int) (startY + ((trackAreaHeight - thumbHeight) / 2)); + trackLength = w - thumbWidth; + trackStart = x + (thumbWidth / 2); - // layout track - track.resizeRelocate(trackStart - trackRadius, trackTop, trackLength + trackRadius + trackRadius, trackHeight); + double trackTop = (int) (startY + ((trackAreaHeight - trackHeight) / 2)); + lowThumbPos = (int) (startY + ((trackAreaHeight - thumbHeight) / 2)); - positionThumbs(); + // layout track + track.resizeRelocate(trackStart - trackRadius, trackTop, trackLength + trackRadius + trackRadius, trackHeight); - if (showTickMarks) { - tickLine.setLayoutX(trackStart); - tickLine.setLayoutY(trackTop + trackHeight + TRACK_TO_TICK_GAP); - tickLine.resize(trackLength, tickLineHeight); - tickLine.requestAxisLayout(); - } else { - if (tickLine != null) { - tickLine.resize(0, 0); - tickLine.requestAxisLayout(); - } - tickLine = null; - } + positionThumbs(); + + if (showTickMarks) { + tickLine.setLayoutX(trackStart); + tickLine.setLayoutY(trackTop + trackHeight + TRACK_TO_TICK_GAP); + tickLine.resize(trackLength, tickLineHeight); + tickLine.requestAxisLayout(); + } else { + if (tickLine != null) { + tickLine.resize(0, 0); + tickLine.requestAxisLayout(); + } + tickLine = null; + } } private void positionThumbs() { diff --git a/client/src/main/java/ctbrec/ui/event/PlaySound.java b/client/src/main/java/ctbrec/ui/event/PlaySound.java index aded0087..a598652d 100644 --- a/client/src/main/java/ctbrec/ui/event/PlaySound.java +++ b/client/src/main/java/ctbrec/ui/event/PlaySound.java @@ -23,13 +23,13 @@ public class PlaySound extends Action { @Override public void accept(Event evt) { - AudioClip clip = new AudioClip(url.toString()); + var clip = new AudioClip(url.toString()); clip.play(); } @Override public void configure(ActionConfiguration config) throws Exception { - File file = new File((String) config.getConfiguration().get("file")); + var file = new File((String) config.getConfiguration().get("file")); url = file.toURI().toURL(); } } diff --git a/client/src/main/java/ctbrec/ui/event/ShowNotification.java b/client/src/main/java/ctbrec/ui/event/ShowNotification.java index 6a10559a..52107b6b 100644 --- a/client/src/main/java/ctbrec/ui/event/ShowNotification.java +++ b/client/src/main/java/ctbrec/ui/event/ShowNotification.java @@ -17,7 +17,7 @@ public class ShowNotification extends Action { @Override public void accept(Event evt) { - String header = evt.getType().toString(); + var header = evt.getType().toString(); String msg; switch(evt.getType()) { case MODEL_STATUS_CHANGED: @@ -25,7 +25,7 @@ public class ShowNotification extends Action { if (modelEvent.getOldState() == Model.State.UNKNOWN) { return; } - Model m = modelEvent.getModel(); + var m = modelEvent.getModel(); msg = m.getDisplayName() + " is now " + modelEvent.getNewState().toString(); break; case RECORDING_STATUS_CHANGED: @@ -41,5 +41,6 @@ public class ShowNotification extends Action { @Override public void configure(ActionConfiguration config) throws Exception { + // nothing to do here } } diff --git a/client/src/main/java/ctbrec/ui/news/NewsTab.java b/client/src/main/java/ctbrec/ui/news/NewsTab.java index 07861344..3baacdf8 100644 --- a/client/src/main/java/ctbrec/ui/news/NewsTab.java +++ b/client/src/main/java/ctbrec/ui/news/NewsTab.java @@ -22,7 +22,6 @@ import javafx.scene.control.ScrollPane; import javafx.scene.control.Tab; import javafx.scene.layout.VBox; import okhttp3.Request; -import okhttp3.Response; public class NewsTab extends Tab implements TabSelectionListener { private static final String ACCESS_TOKEN = "a2804d73a89951a22e0f8483a6fcec8943afd88b7ba17c459c095aa9e6f94fd0"; @@ -44,14 +43,14 @@ public class NewsTab extends Tab implements TabSelectionListener { private void loadToots() { try { - Request request = new Request.Builder() + var request = new Request.Builder() .url(URL) .header("Authorization", "Bearer " + ACCESS_TOKEN) .header(USER_AGENT, "ctbrec " + CamrecApplication.getVersion().toString()) .build(); - try (Response response = CamrecApplication.httpClient.execute(request)) { + try (var response = CamrecApplication.httpClient.execute(request)) { if (response.isSuccessful()) { - String body = response.body().string(); + var body = response.body().string(); if (body.startsWith("[")) { onSuccess(body); } else if (body.startsWith("{")) { @@ -69,7 +68,7 @@ public class NewsTab extends Tab implements TabSelectionListener { } private void onError(String body) throws IOException { - JSONObject json = new JSONObject(body); + var json = new JSONObject(body); if (json.has("error")) { throw new IOException("Request not successful: " + json.getString("error")); } else { @@ -78,14 +77,14 @@ public class NewsTab extends Tab implements TabSelectionListener { } private void onSuccess(String body) throws IOException { - Moshi moshi = new Moshi.Builder().build(); + var moshi = new Moshi.Builder().build(); JsonAdapter statusListAdapter = moshi.adapter(Status[].class); Status[] statusArray = statusListAdapter.fromJson(body); Platform.runLater(() -> { layout.getChildren().clear(); for (Status status : statusArray) { if (status.getInReplyToId() == null && !Objects.equals("direct", status.getVisibility())) { - StatusPane stp = new StatusPane(status); + var stp = new StatusPane(status); layout.getChildren().add(stp); VBox.setMargin(stp, new Insets(10)); } diff --git a/client/src/main/java/ctbrec/ui/news/Status.java b/client/src/main/java/ctbrec/ui/news/Status.java index e800ceac..5404c6b3 100644 --- a/client/src/main/java/ctbrec/ui/news/Status.java +++ b/client/src/main/java/ctbrec/ui/news/Status.java @@ -272,8 +272,8 @@ public class Status { public ZonedDateTime getCreationTime() { String timestamp = getCreatedAt(); - Instant instant = Instant.parse(timestamp); - ZonedDateTime time = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()); + var instant = Instant.parse(timestamp); + var time = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()); return time; } } diff --git a/client/src/main/java/ctbrec/ui/news/StatusPane.java b/client/src/main/java/ctbrec/ui/news/StatusPane.java index d4f4d02b..ce15f721 100644 --- a/client/src/main/java/ctbrec/ui/news/StatusPane.java +++ b/client/src/main/java/ctbrec/ui/news/StatusPane.java @@ -36,7 +36,7 @@ public class StatusPane extends StackPane { ZonedDateTime createdAt = status.getCreationTime(); String creationTime = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.SHORT).format(createdAt); - Label time = new Label(creationTime); + var time = new Label(creationTime); time.setStyle("-fx-background-color: -fx-base"); time.setOpacity(.7); time.setPadding(new Insets(3)); @@ -45,7 +45,7 @@ public class StatusPane extends StackPane { getChildren().add(time); StackPane.setMargin(time, new Insets(5, 5, 5, 10)); StackPane.setAlignment(time, Pos.BOTTOM_LEFT); - Rectangle clip = new Rectangle(time.getWidth(), time.getHeight()); + var clip = new Rectangle(time.getWidth(), time.getHeight()); clip.heightProperty().bind(time.heightProperty()); clip.widthProperty().bind(time.widthProperty()); clip.setArcHeight(5); @@ -53,7 +53,7 @@ public class StatusPane extends StackPane { time.setClip(clip); reply = new Button("Reply"); - reply.setOnAction((evt) -> DesktopIntegration.open(status.getUrl())); + reply.setOnAction(evt -> DesktopIntegration.open(status.getUrl())); getChildren().add(reply); StackPane.setMargin(reply, new Insets(5, 5, 5, 5)); StackPane.setAlignment(reply, Pos.BOTTOM_RIGHT); @@ -64,7 +64,7 @@ public class StatusPane extends StackPane { ObservableList childrenUnmodifiable = content.getChildrenUnmodifiable(); for (Node node : childrenUnmodifiable) { if (node instanceof ScrollPane) { - ScrollPane scrollPane = (ScrollPane) node; + var scrollPane = (ScrollPane) node; Set nodes = scrollPane.lookupAll(".scroll-bar"); for (final Node child : nodes) { if (child instanceof ScrollBar) { diff --git a/client/src/main/java/ctbrec/ui/settings/AbstractPostProcessingPaneFactory.java b/client/src/main/java/ctbrec/ui/settings/AbstractPostProcessingPaneFactory.java index 76c2fdc6..9ba50724 100644 --- a/client/src/main/java/ctbrec/ui/settings/AbstractPostProcessingPaneFactory.java +++ b/client/src/main/java/ctbrec/ui/settings/AbstractPostProcessingPaneFactory.java @@ -47,13 +47,12 @@ public abstract class AbstractPostProcessingPaneFactory { } class MapPreferencesStorage implements PreferencesStorage { - @Override public void save(Preferences preferences) throws IOException { for (Property property : properties) { String key = property.getName(); Object value = preferences.getSetting(key).get().getProperty().getValue(); - LOG.debug("{}={}", key, value.toString()); + LOG.debug("{}={}", key, value); pp.getConfig().put(key, value.toString()); } } @@ -64,7 +63,7 @@ public abstract class AbstractPostProcessingPaneFactory { } @Override - public Node createGui(Setting setting) throws Exception { + public Node createGui(Setting setting) throws NoSuchFieldException, IllegalAccessException { Property prop = setting.getProperty(); if (prop instanceof ExclusiveSelectionProperty) { return createRadioGroup(setting); @@ -86,109 +85,74 @@ public abstract class AbstractPostProcessingPaneFactory { return new Label("Unsupported Type for key " + setting.getKey() + ": " + setting.getProperty()); } } - } - private Node createRadioGroup(Setting setting) { - ExclusiveSelectionProperty prop = (ExclusiveSelectionProperty) setting.getProperty(); - ToggleGroup toggleGroup = new ToggleGroup(); - RadioButton optionA = new RadioButton(prop.getOptionA()); - optionA.setSelected(prop.getValue()); - optionA.setToggleGroup(toggleGroup); - RadioButton optionB = new RadioButton(prop.getOptionB()); - optionB.setSelected(!optionA.isSelected()); - optionB.setToggleGroup(toggleGroup); - optionA.selectedProperty().bindBidirectional(prop); - HBox row = new HBox(); - row.getChildren().addAll(optionA, optionB); - HBox.setMargin(optionA, new Insets(5)); - HBox.setMargin(optionB, new Insets(5)); - return row; - } + private Node createRadioGroup(Setting setting) { + ExclusiveSelectionProperty prop = (ExclusiveSelectionProperty) setting.getProperty(); + var toggleGroup = new ToggleGroup(); + var optionA = new RadioButton(prop.getOptionA()); + optionA.setSelected(prop.getValue()); + optionA.setToggleGroup(toggleGroup); + var optionB = new RadioButton(prop.getOptionB()); + optionB.setSelected(!optionA.isSelected()); + optionB.setToggleGroup(toggleGroup); + optionA.selectedProperty().bindBidirectional(prop); + var row = new HBox(); + row.getChildren().addAll(optionA, optionB); + HBox.setMargin(optionA, new Insets(5)); + HBox.setMargin(optionB, new Insets(5)); + return row; + } - private Node createFileSelector(Setting setting) { - ProgramSelectionBox programSelector = new ProgramSelectionBox(""); - // programSelector.fileProperty().addListener((obs, o, n) -> saveValue(() -> { - // String path = n; - // Field field = Settings.class.getField(setting.getKey()); - // String oldValue = (String) field.get(settings); - // if (!Objects.equals(path, oldValue)) { - // field.set(settings, path); - // config.save(); - // } - // })); - StringProperty property = (StringProperty) setting.getProperty(); - programSelector.fileProperty().bindBidirectional(property); - return programSelector; - } + private Node createFileSelector(Setting setting) { + var programSelector = new ProgramSelectionBox(""); + StringProperty property = (StringProperty) setting.getProperty(); + programSelector.fileProperty().bindBidirectional(property); + return programSelector; + } - private Node createDirectorySelector(Setting setting) { - DirectorySelectionBox directorySelector = new DirectorySelectionBox(""); - directorySelector.prefWidth(400); - // directorySelector.fileProperty().addListener((obs, o, n) -> saveValue(() -> { - // String path = n; - // Field field = Settings.class.getField(setting.getKey()); - // String oldValue = (String) field.get(settings); - // if (!Objects.equals(path, oldValue)) { - // field.set(settings, path); - // config.save(); - // } - // })); - StringProperty property = (StringProperty) setting.getProperty(); - directorySelector.fileProperty().bindBidirectional(property); - return directorySelector; - } + private Node createDirectorySelector(Setting setting) { + var directorySelector = new DirectorySelectionBox(""); + directorySelector.prefWidth(400); + StringProperty property = (StringProperty) setting.getProperty(); + directorySelector.fileProperty().bindBidirectional(property); + return directorySelector; + } - @SuppressWarnings("unchecked") - private Node createStringProperty(Setting setting) { - TextField ctrl = new TextField(); - ctrl.textProperty().bindBidirectional(setting.getProperty()); - return ctrl; - } + @SuppressWarnings("unchecked") + private Node createStringProperty(Setting setting) { + var ctrl = new TextField(); + ctrl.textProperty().bindBidirectional(setting.getProperty()); + return ctrl; + } - @SuppressWarnings("unchecked") - private Node createIntegerProperty(Setting setting) { - TextField ctrl = new TextField(); - Property prop = setting.getProperty(); - ctrl.textProperty().bindBidirectional(prop, new NumberStringConverter()); - return ctrl; - } + @SuppressWarnings("unchecked") + private Node createIntegerProperty(Setting setting) { + var ctrl = new TextField(); + Property prop = setting.getProperty(); + ctrl.textProperty().bindBidirectional(prop, new NumberStringConverter()); + return ctrl; + } - @SuppressWarnings("unchecked") - private Node createLongProperty(Setting setting) { - TextField ctrl = new TextField(); - Property prop = setting.getProperty(); - ctrl.textProperty().bindBidirectional(prop, new NumberStringConverter()); - return ctrl; - } + @SuppressWarnings("unchecked") + private Node createLongProperty(Setting setting) { + var ctrl = new TextField(); + Property prop = setting.getProperty(); + ctrl.textProperty().bindBidirectional(prop, new NumberStringConverter()); + return ctrl; + } - private Node createBooleanProperty(Setting setting) { - CheckBox ctrl = new CheckBox(); - BooleanProperty prop = (BooleanProperty) setting.getProperty(); - ctrl.selectedProperty().bindBidirectional(prop); - return ctrl; - } + private Node createBooleanProperty(Setting setting) { + var ctrl = new CheckBox(); + BooleanProperty prop = (BooleanProperty) setting.getProperty(); + ctrl.selectedProperty().bindBidirectional(prop); + return ctrl; + } - @SuppressWarnings({ "rawtypes", "unchecked" }) - private Node createComboBox(Setting setting) throws NoSuchFieldException, IllegalAccessException { - ListProperty listProp = (ListProperty) setting.getProperty(); - ComboBox comboBox = new ComboBox(listProp); - // Field field = Settings.class.getField(setting.getKey()); - // Object value = field.get(Config.getInstance().getSettings()); - // if (StringUtil.isNotBlank(value.toString())) { - // if (setting.getConverter() != null) { - // comboBox.getSelectionModel().select(setting.getConverter().convertTo(value)); - // } else { - // comboBox.getSelectionModel().select(value); - // } - // } - // comboBox.valueProperty().addListener((obs, oldV, newV) -> saveValue(() -> { - // if (setting.getConverter() != null) { - // field.set(settings, setting.getConverter().convertFrom(newV)); - // } else { - // field.set(settings, newV); - // } - // config.save(); - // })); - return comboBox; + @SuppressWarnings({ "rawtypes", "unchecked" }) + private Node createComboBox(Setting setting) { + ListProperty listProp = (ListProperty) setting.getProperty(); + ComboBox comboBox = new ComboBox(listProp); + return comboBox; + } } } diff --git a/client/src/main/java/ctbrec/ui/settings/ActionSettingsPanel.java b/client/src/main/java/ctbrec/ui/settings/ActionSettingsPanel.java index 8ef600e4..2d8e4a79 100644 --- a/client/src/main/java/ctbrec/ui/settings/ActionSettingsPanel.java +++ b/client/src/main/java/ctbrec/ui/settings/ActionSettingsPanel.java @@ -94,24 +94,24 @@ public class ActionSettingsPanel extends GridPane { setVgap(10); setPadding(new Insets(20, 10, 10, 10)); - Label headline = new Label("Events & Actions"); + var headline = new Label("Events & Actions"); headline.getStyleClass().add("settings-group-label"); add(headline, 0, 0); actionTable = createActionTable(); - ScrollPane scrollPane = new ScrollPane(actionTable); + var scrollPane = new ScrollPane(actionTable); scrollPane.setFitToHeight(true); scrollPane.setFitToWidth(true); scrollPane.setStyle("-fx-background-color: -fx-background"); add(scrollPane, 0, 1); GridPane.setHgrow(scrollPane, Priority.ALWAYS); - Button add = new Button("Add"); + var add = new Button("Add"); add.setOnAction(this::add); - Button delete = new Button("Delete"); + var delete = new Button("Delete"); delete.setOnAction(this::delete); delete.setDisable(true); - HBox buttons = new HBox(5, add, delete); + var buttons = new HBox(5, add, delete); buttons.setStyle("-fx-background-color: -fx-background"); // workaround so that the buttons don't shrink add(buttons, 0, 2); @@ -119,15 +119,15 @@ public class ActionSettingsPanel extends GridPane { } private void add(ActionEvent evt) { - Pane actionPane = createActionPane(); - Stage dialog = new Stage(); + var actionPane = createActionPane(); + var dialog = new Stage(); dialog.initModality(Modality.APPLICATION_MODAL); dialog.initOwner(getScene().getWindow()); dialog.setTitle("New Action"); InputStream icon = getClass().getResourceAsStream("/icon.png"); dialog.getIcons().add(new Image(icon)); - Wizard root = new Wizard(dialog, this::validateSettings, actionPane); - Scene scene = new Scene(root, 800, 540); + var root = new Wizard(dialog, this::validateSettings, actionPane); + var scene = new Scene(root, 800, 540); scene.getStylesheets().addAll(getScene().getStylesheets()); dialog.setScene(scene); centerOnParent(dialog); @@ -138,58 +138,58 @@ public class ActionSettingsPanel extends GridPane { } private void createEventHandler() { - EventHandlerConfiguration config = new EventHandlerConfiguration(); + var config = new EventHandlerConfiguration(); config.setName(name.getText()); config.setEvent(event.getValue()); if(event.getValue() == Event.Type.MODEL_STATUS_CHANGED) { - PredicateConfiguration pc = new PredicateConfiguration(); + var pc = new PredicateConfiguration(); pc.setType(ModelStatePredicate.class.getName()); pc.getConfiguration().put("state", modelState.getValue().name()); pc.setName("state = " + modelState.getValue().toString()); config.getPredicates().add(pc); } else if(event.getValue() == Event.Type.RECORDING_STATUS_CHANGED) { - PredicateConfiguration pc = new PredicateConfiguration(); + var pc = new PredicateConfiguration(); pc.setType(RecordingStatePredicate.class.getName()); pc.getConfiguration().put("state", recordingState.getValue().name()); pc.setName("state = " + recordingState.getValue().toString()); config.getPredicates().add(pc); } else if(event.getValue() == Event.Type.NO_SPACE_LEFT) { - PredicateConfiguration pc = new PredicateConfiguration(); + var pc = new PredicateConfiguration(); pc.setType(MatchAllPredicate.class.getName()); pc.setName("no space left"); config.getPredicates().add(pc); } if(!modelSelectionPane.isAllSelected()) { - PredicateConfiguration pc = new PredicateConfiguration(); + var pc = new PredicateConfiguration(); pc.setType(ModelPredicate.class.getName()); pc.setModels(modelSelectionPane.getSelectedItems()); pc.setName("model is one of:" + modelSelectionPane.getSelectedItems()); config.getPredicates().add(pc); } if(showNotification.isSelected()) { - ActionConfiguration ac = new ActionConfiguration(); + var ac = new ActionConfiguration(); ac.setType(ShowNotification.class.getName()); ac.setName("show notification"); config.getActions().add(ac); } if(playSound.isSelected()) { - ActionConfiguration ac = new ActionConfiguration(); + var ac = new ActionConfiguration(); ac.setType(PlaySound.class.getName()); - File file = new File(sound.fileProperty().get()); + var file = new File(sound.fileProperty().get()); ac.getConfiguration().put("file", file.getAbsolutePath()); ac.setName("play " + file.getName()); config.getActions().add(ac); } if(executeProgram.isSelected()) { - ActionConfiguration ac = new ActionConfiguration(); + var ac = new ActionConfiguration(); ac.setType(ExecuteProgram.class.getName()); - File file = new File(program.fileProperty().get()); + var file = new File(program.fileProperty().get()); ac.getConfiguration().put("file", file.getAbsolutePath()); ac.setName("execute " + file.getName()); config.getActions().add(ac); } - EventHandler handler = new EventHandler(config); + var handler = new EventHandler(config); EventBusHolder.register(handler); Config.getInstance().getSettings().eventHandlers.add(config); actionTable.getItems().add(config); @@ -229,7 +229,7 @@ public class ActionSettingsPanel extends GridPane { modelState.prefWidthProperty().bind(event.widthProperty()); name.prefWidthProperty().bind(event.widthProperty()); - int row = 0; + var row = 0; layout.add(new Label("Name"), 0, row); layout.add(name, 1, row++); @@ -243,7 +243,7 @@ public class ActionSettingsPanel extends GridPane { layout.add(event, 1, row++); event.getSelectionModel().selectedItemProperty().addListener((obs, oldV, newV) -> { - boolean modelRelatedStuffDisabled = false; + var modelRelatedStuffDisabled = false; if(newV == Event.Type.NO_SPACE_LEFT) { modelRelatedStuffDisabled = true; modelSelectionPane.selectAll(); @@ -265,7 +265,7 @@ public class ActionSettingsPanel extends GridPane { layout.add(createSeparator(), 0, row++); - Label l = new Label("Models"); + var l = new Label("Models"); layout.add(l, 0, row); modelSelectionPane = new ListSelectionPane<>(recorder.getModels(), Collections.emptyList()); layout.add(modelSelectionPane, 1, row++); @@ -278,8 +278,8 @@ public class ActionSettingsPanel extends GridPane { layout.add(showNotification, 0, row); layout.add(testNotification, 1, row++); testNotification.setOnAction(evt -> { - DateTimeFormatter format = DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM); - ZonedDateTime time = ZonedDateTime.now(); + var format = DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM); + var time = ZonedDateTime.now(); DesktopIntegration.notification(CamrecApplication.title, "Test Notification", "Oi, what's up! " + format.format(time)); }); testNotification.disableProperty().bind(showNotification.selectedProperty().not()); @@ -306,12 +306,12 @@ public class ActionSettingsPanel extends GridPane { } private Node createSeparator() { - Separator divider = new Separator(Orientation.HORIZONTAL); + var divider = new Separator(Orientation.HORIZONTAL); GridPane.setHgrow(divider, Priority.ALWAYS); GridPane.setFillWidth(divider, true); GridPane.setColumnSpan(divider, 2); - int tb = 20; - int lr = 0; + var tb = 20; + var lr = 0; GridPane.setMargin(divider, new Insets(tb, lr, tb, lr)); return divider; } diff --git a/client/src/main/java/ctbrec/ui/settings/ColorSettingsPane.java b/client/src/main/java/ctbrec/ui/settings/ColorSettingsPane.java index 0725b779..9f8b2cf5 100644 --- a/client/src/main/java/ctbrec/ui/settings/ColorSettingsPane.java +++ b/client/src/main/java/ctbrec/ui/settings/ColorSettingsPane.java @@ -61,7 +61,7 @@ public class ColorSettingsPane extends HBox { } private String toWeb(Color value) { - StringBuilder sb = new StringBuilder("#"); + var sb = new StringBuilder("#"); sb.append(toHex((int) (value.getRed() * 255))); sb.append(toHex((int) (value.getGreen() * 255))); sb.append(toHex((int) (value.getBlue() * 255))); @@ -72,7 +72,7 @@ public class ColorSettingsPane extends HBox { } private CharSequence toHex(int v) { - StringBuilder sb = new StringBuilder(); + var sb = new StringBuilder(); if(v < 16) { sb.append('0'); } diff --git a/client/src/main/java/ctbrec/ui/settings/CreateContactSheetPaneFactory.java b/client/src/main/java/ctbrec/ui/settings/CreateContactSheetPaneFactory.java index 2d95b4a9..e5eaee8e 100644 --- a/client/src/main/java/ctbrec/ui/settings/CreateContactSheetPaneFactory.java +++ b/client/src/main/java/ctbrec/ui/settings/CreateContactSheetPaneFactory.java @@ -18,13 +18,13 @@ public class CreateContactSheetPaneFactory extends AbstractPostProcessingPaneFac @Override public Preferences doCreatePostProcessorPane(PostProcessor pp) { - SimpleStringProperty totalSize = new SimpleStringProperty(null, TOTAL_SIZE, pp.getConfig().getOrDefault(TOTAL_SIZE, "1920")); - SimpleStringProperty padding = new SimpleStringProperty(null, PADDING, pp.getConfig().getOrDefault(PADDING, "4")); - SimpleStringProperty cols = new SimpleStringProperty(null, COLS, pp.getConfig().getOrDefault(COLS, "8")); - SimpleStringProperty rows = new SimpleStringProperty(null, ROWS, pp.getConfig().getOrDefault(ROWS, "7")); - SimpleStringProperty filename = new SimpleStringProperty(null, FILENAME, pp.getConfig().getOrDefault(FILENAME, "contactsheet.jpg")); + var totalSize = new SimpleStringProperty(null, TOTAL_SIZE, pp.getConfig().getOrDefault(TOTAL_SIZE, "1920")); + var padding = new SimpleStringProperty(null, PADDING, pp.getConfig().getOrDefault(PADDING, "4")); + var cols = new SimpleStringProperty(null, COLS, pp.getConfig().getOrDefault(COLS, "8")); + var rows = new SimpleStringProperty(null, ROWS, pp.getConfig().getOrDefault(ROWS, "7")); + var filename = new SimpleStringProperty(null, FILENAME, pp.getConfig().getOrDefault(FILENAME, "contactsheet.jpg")); background = new SimpleStringProperty(null, BACKGROUND, pp.getConfig().getOrDefault(BACKGROUND, "0x333333")); - SimpleBooleanProperty burnTimestamp = new SimpleBooleanProperty(null, BURN_IN_TIMESTAMP, + var burnTimestamp = new SimpleBooleanProperty(null, BURN_IN_TIMESTAMP, Boolean.valueOf(pp.getConfig().getOrDefault(BURN_IN_TIMESTAMP, TRUE.toString()))); properties.add(totalSize); properties.add(padding); @@ -34,8 +34,8 @@ public class CreateContactSheetPaneFactory extends AbstractPostProcessingPaneFac properties.add(background); properties.add(burnTimestamp); - Setting backgroundSetting = Setting.of("", background, "Hexadecimal value of the background color for the space between the thumbnails"); - Preferences prefs = Preferences.of(new MapPreferencesStorage(), + var backgroundSetting = Setting.of("", background, "Hexadecimal value of the background color for the space between the thumbnails"); + var prefs = Preferences.of(new MapPreferencesStorage(), Category.of(pp.getName(), Setting.of("Total Width", totalSize, "Total width of the generated contact sheet"), Setting.of("Padding", padding, "Padding between the thumbnails"), @@ -59,8 +59,8 @@ public class CreateContactSheetPaneFactory extends AbstractPostProcessingPaneFac } private ColorPicker createColorPicker(String hexColor) { - Color preselection = Color.web(hexColor); - ColorPicker colorPicker = new ColorPicker(preselection); + var preselection = Color.web(hexColor); + var colorPicker = new ColorPicker(preselection); colorPicker.setOnAction(e -> background.set(colorPicker.getValue().toString())); return colorPicker; } diff --git a/client/src/main/java/ctbrec/ui/settings/CtbrecPreferencesStorage.java b/client/src/main/java/ctbrec/ui/settings/CtbrecPreferencesStorage.java index 9cdbab35..30e2d795 100644 --- a/client/src/main/java/ctbrec/ui/settings/CtbrecPreferencesStorage.java +++ b/client/src/main/java/ctbrec/ui/settings/CtbrecPreferencesStorage.java @@ -1,7 +1,6 @@ package ctbrec.ui.settings; import java.io.IOException; -import java.lang.reflect.Field; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -71,55 +70,55 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { } @Override - public Node createGui(Setting setting) throws Exception { - config.disableSaving(); - try { - Property prop = setting.getProperty(); - if (prop instanceof ExclusiveSelectionProperty) { - return createRadioGroup(setting); - } else if (prop instanceof SimpleRangeProperty) { - return createRangeSlider(setting); - } else if (prop instanceof SimpleDirectoryProperty) { - return createDirectorySelector(setting); - } else if (prop instanceof SimpleFileProperty) { - return createFileSelector(setting); - } else if (prop instanceof IntegerProperty) { - return createIntegerProperty(setting); - } else if (prop instanceof LongProperty) { - return createLongProperty(setting); - } else if (prop instanceof BooleanProperty) { - return createBooleanProperty(setting); - } else if (prop instanceof ListProperty) { - return createComboBox(setting); - } else if (prop instanceof StringProperty) { - return createStringProperty(setting); - } else { - return new Label("Unsupported Type for key " + setting.getKey() + ": " + setting.getProperty()); - } - } finally { - config.enableSaving(); - } + public Node createGui(Setting setting) throws NoSuchFieldException, IllegalAccessException { + config.disableSaving(); + try { + Property prop = setting.getProperty(); + if (prop instanceof ExclusiveSelectionProperty) { + return createRadioGroup(setting); + } else if (prop instanceof SimpleRangeProperty) { + return createRangeSlider(setting); + } else if (prop instanceof SimpleDirectoryProperty) { + return createDirectorySelector(setting); + } else if (prop instanceof SimpleFileProperty) { + return createFileSelector(setting); + } else if (prop instanceof IntegerProperty) { + return createIntegerProperty(setting); + } else if (prop instanceof LongProperty) { + return createLongProperty(setting); + } else if (prop instanceof BooleanProperty) { + return createBooleanProperty(setting); + } else if (prop instanceof ListProperty) { + return createComboBox(setting); + } else if (prop instanceof StringProperty) { + return createStringProperty(setting); + } else { + return new Label("Unsupported Type for key " + setting.getKey() + ": " + setting.getProperty()); + } + } finally { + config.enableSaving(); + } } private Node createRadioGroup(Setting setting) { ExclusiveSelectionProperty prop = (ExclusiveSelectionProperty) setting.getProperty(); - ToggleGroup toggleGroup = new ToggleGroup(); - RadioButton optionA = new RadioButton(prop.getOptionA()); + var toggleGroup = new ToggleGroup(); + var optionA = new RadioButton(prop.getOptionA()); optionA.setSelected(prop.getValue()); optionA.setToggleGroup(toggleGroup); - RadioButton optionB = new RadioButton(prop.getOptionB()); + var optionB = new RadioButton(prop.getOptionB()); optionB.setSelected(!optionA.isSelected()); optionB.setToggleGroup(toggleGroup); optionA.selectedProperty().bindBidirectional(prop); prop.addListener((obs, oldV, newV) -> saveValue(() -> { - Field field = Settings.class.getField(setting.getKey()); - field.set(settings, newV); + var field = Settings.class.getField(setting.getKey()); + field.set(settings, newV); // NOSONAR if (setting.doesNeedRestart() && !Objects.equals(oldV, newV)) { runRestartRequiredCallback(); } config.save(); })); - HBox row = new HBox(); + var row = new HBox(); row.getChildren().addAll(optionA, optionB); HBox.setMargin(optionA, new Insets(5)); HBox.setMargin(optionB, new Insets(5)); @@ -151,22 +150,22 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { resolutionRange.setHigh(highValue >= 0 ? highValue : values.get(values.size() - 1)); resolutionRange.getLow().addListener((obs, o, n) -> saveValue(() -> { int newV = labels.get(n.intValue()); - Field field = Settings.class.getField(rangeProperty.getLowKey()); - field.set(settings, newV); + var field = Settings.class.getField(rangeProperty.getLowKey()); + field.set(settings, newV); // NOSONAR config.save(); })); resolutionRange.getHigh().addListener((obs, o, n) -> saveValue(() -> { int newV = labels.get(n.intValue()); - Field field = Settings.class.getField(rangeProperty.getHighKey()); - field.set(settings, newV); + var field = Settings.class.getField(rangeProperty.getHighKey()); + field.set(settings, newV); // NOSONAR config.save(); })); return resolutionRange; } private int getRangeSliderValue(List values, List labels, int value) { - for (int i = 0; i < labels.size(); i++) { - int label = labels.get(i).intValue(); + for (var i = 0; i < labels.size(); i++) { + var label = labels.get(i).intValue(); if (label == value) { return values.get(i); } @@ -175,13 +174,13 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { } private Node createFileSelector(Setting setting) { - ProgramSelectionBox programSelector = new ProgramSelectionBox(""); + var programSelector = new ProgramSelectionBox(""); programSelector.fileProperty().addListener((obs, o, n) -> saveValue(() -> { String path = n; - Field field = Settings.class.getField(setting.getKey()); + var field = Settings.class.getField(setting.getKey()); String oldValue = (String) field.get(settings); if (!Objects.equals(path, oldValue)) { - field.set(settings, path); + field.set(settings, path); // NOSONAR if (setting.doesNeedRestart()) { runRestartRequiredCallback(); } @@ -194,14 +193,14 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { } private Node createDirectorySelector(Setting setting) { - DirectorySelectionBox directorySelector = new DirectorySelectionBox(""); + var directorySelector = new DirectorySelectionBox(""); directorySelector.prefWidth(400); directorySelector.fileProperty().addListener((obs, o, n) -> saveValue(() -> { String path = n; - Field field = Settings.class.getField(setting.getKey()); + var field = Settings.class.getField(setting.getKey()); String oldValue = (String) field.get(settings); if (!Objects.equals(path, oldValue)) { - field.set(settings, path); + field.set(settings, path); // NOSONAR if (setting.doesNeedRestart()) { runRestartRequiredCallback(); } @@ -214,10 +213,10 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { } private Node createStringProperty(Setting setting) { - TextField ctrl = new TextField(); + var ctrl = new TextField(); ctrl.textProperty().addListener((obs, oldV, newV) -> saveValue(() -> { - Field field = Settings.class.getField(setting.getKey()); - field.set(settings, newV); + var field = Settings.class.getField(setting.getKey()); + field.set(settings, newV); // NOSONAR if (setting.doesNeedRestart() && !Objects.equals(oldV, newV)) { runRestartRequiredCallback(); } @@ -230,14 +229,14 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { @SuppressWarnings("unchecked") private Node createIntegerProperty(Setting setting) { - TextField ctrl = new TextField(); + var ctrl = new TextField(); ctrl.textProperty().addListener((obs, oldV, newV) -> saveValue(() -> { if (!newV.matches("\\d*")) { ctrl.setText(newV.replaceAll(PATTERN_NOT_A_DIGIT, "")); } if (!ctrl.getText().isEmpty()) { - Field field = Settings.class.getField(setting.getKey()); - field.set(settings, Integer.parseInt(ctrl.getText())); + var field = Settings.class.getField(setting.getKey()); + field.set(settings, Integer.parseInt(ctrl.getText())); // NOSONAR if (setting.doesNeedRestart() && !Objects.equals(oldV, newV) && prefs != null) { runRestartRequiredCallback(); } @@ -251,18 +250,18 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { @SuppressWarnings("unchecked") private Node createLongProperty(Setting setting) { - TextField ctrl = new TextField(); + var ctrl = new TextField(); ctrl.textProperty().addListener((obs, oldV, newV) -> saveValue(() -> { if (!newV.matches("\\d*")) { ctrl.setText(newV.replaceAll(PATTERN_NOT_A_DIGIT, "")); } if (!ctrl.getText().isEmpty()) { - long value = Long.parseLong(ctrl.getText()); + var value = Long.parseLong(ctrl.getText()); if (setting.getConverter() != null) { value = (long) setting.getConverter().convertFrom(value); } - Field field = Settings.class.getField(setting.getKey()); - field.set(settings, value); + var field = Settings.class.getField(setting.getKey()); + field.set(settings, value); // NOSONAR if (setting.doesNeedRestart() && !Objects.equals(oldV, newV)) { runRestartRequiredCallback(); } @@ -275,10 +274,10 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { } private Node createBooleanProperty(Setting setting) { - CheckBox ctrl = new CheckBox(); + var ctrl = new CheckBox(); ctrl.selectedProperty().addListener((obs, oldV, newV) -> saveValue(() -> { - Field field = Settings.class.getField(setting.getKey()); - field.set(settings, newV); + var field = Settings.class.getField(setting.getKey()); + field.set(settings, newV); // NOSONAR if (setting.doesNeedRestart() && !Objects.equals(oldV, newV)) { runRestartRequiredCallback(); } @@ -293,7 +292,7 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { private Node createComboBox(Setting setting) throws NoSuchFieldException, IllegalAccessException { ListProperty listProp = (ListProperty) setting.getProperty(); ComboBox comboBox = new ComboBox(listProp); - Field field = Settings.class.getField(setting.getKey()); + var field = Settings.class.getField(setting.getKey()); Object value = field.get(settings); if (StringUtil.isNotBlank(value.toString())) { if (setting.getConverter() != null) { @@ -305,9 +304,9 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { comboBox.valueProperty().addListener((obs, oldV, newV) -> saveValue(() -> { LOG.debug("Saving setting {}", setting.getKey()); if (setting.getConverter() != null) { - field.set(settings, setting.getConverter().convertFrom(newV)); + field.set(settings, setting.getConverter().convertFrom(newV)); // NOSONAR } else { - field.set(settings, newV); + field.set(settings, newV); // NOSONAR } if (setting.doesNeedRestart() && !Objects.equals(oldV, newV)) { runRestartRequiredCallback(); @@ -330,6 +329,6 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { @FunctionalInterface private interface Exec { - public void run() throws Exception; + public void run() throws IllegalAccessException, IOException, NoSuchFieldException; } } diff --git a/client/src/main/java/ctbrec/ui/settings/DeleteTooShortPaneFactory.java b/client/src/main/java/ctbrec/ui/settings/DeleteTooShortPaneFactory.java index 3974ce58..29ad0928 100644 --- a/client/src/main/java/ctbrec/ui/settings/DeleteTooShortPaneFactory.java +++ b/client/src/main/java/ctbrec/ui/settings/DeleteTooShortPaneFactory.java @@ -11,7 +11,7 @@ public class DeleteTooShortPaneFactory extends AbstractPostProcessingPaneFactory @Override public Preferences doCreatePostProcessorPane(PostProcessor pp) { - SimpleStringProperty minimumLengthInSeconds = new SimpleStringProperty(null, DeleteTooShort.MIN_LEN_IN_SECS, pp.getConfig().getOrDefault(DeleteTooShort.MIN_LEN_IN_SECS, "10")); + var minimumLengthInSeconds = new SimpleStringProperty(null, DeleteTooShort.MIN_LEN_IN_SECS, pp.getConfig().getOrDefault(DeleteTooShort.MIN_LEN_IN_SECS, "10")); properties.add(minimumLengthInSeconds); return Preferences.of(new MapPreferencesStorage(), diff --git a/client/src/main/java/ctbrec/ui/settings/IgnoreList.java b/client/src/main/java/ctbrec/ui/settings/IgnoreList.java index 8e3f366b..2ff0d5a1 100644 --- a/client/src/main/java/ctbrec/ui/settings/IgnoreList.java +++ b/client/src/main/java/ctbrec/ui/settings/IgnoreList.java @@ -2,7 +2,6 @@ package ctbrec.ui.settings; import static javafx.scene.control.ButtonType.*; -import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Type; @@ -57,7 +56,7 @@ public class IgnoreList extends GridPane { setVgap(10); setPadding(new Insets(20, 10, 10, 10)); - Label headline = new Label("Ignore List"); + var headline = new Label("Ignore List"); headline.getStyleClass().add("settings-group-label"); add(headline, 0, 0); @@ -71,13 +70,13 @@ public class IgnoreList extends GridPane { add(ignoreListView, 0, 1); GridPane.setHgrow(ignoreListView, Priority.ALWAYS); - Button remove = new Button("Remove"); + var remove = new Button("Remove"); remove.setOnAction(evt -> removeSelectedModels()); - Button exportIgnoreList = new Button("Export"); + var exportIgnoreList = new Button("Export"); exportIgnoreList.setOnAction(e -> exportIgnoreList()); - Button importIgnoreList = new Button("Import"); + var importIgnoreList = new Button("Import"); importIgnoreList.setOnAction(e -> importIgnoreList()); - HBox buttons = new HBox(10, remove, exportIgnoreList, importIgnoreList); + var buttons = new HBox(10, remove, exportIgnoreList, importIgnoreList); add(buttons, 0, 2); buttons.setStyle("-fx-background-color: -fx-background"); // workaround so that the buttons don't shrink } @@ -85,7 +84,7 @@ public class IgnoreList extends GridPane { private void removeSelectedModels() { List selectedModels = ignoreListView.getSelectionModel().getSelectedItems(); if (selectedModels.isEmpty()) { - return; + return; // NOSONAR } else { Config.getInstance().getSettings().ignoredModels.removeAll(selectedModels); ignoreListView.getItems().removeAll(selectedModels); @@ -110,16 +109,16 @@ public class IgnoreList extends GridPane { } private void exportIgnoreList() { - FileChooser chooser = new FileChooser(); + var chooser = new FileChooser(); chooser.setTitle("Export ignore list"); chooser.setInitialFileName("ctbrec-ignorelist.json"); - File file = chooser.showSaveDialog(null); + var file = chooser.showSaveDialog(null); if (file != null) { - Moshi moshi = new Moshi.Builder().add(Model.class, new ModelJsonAdapter(sites)).build(); + var moshi = new Moshi.Builder().add(Model.class, new ModelJsonAdapter(sites)).build(); Type modelListType = Types.newParameterizedType(List.class, String.class); JsonAdapter> adapter = moshi.adapter(modelListType); adapter = adapter.indent(" "); - try (FileOutputStream out = new FileOutputStream(file)) { + try (var out = new FileOutputStream(file)) { String json = adapter.toJson(Config.getInstance().getSettings().ignoredModels); out.write(json.getBytes(StandardCharsets.UTF_8)); } catch (IOException e) { @@ -129,20 +128,20 @@ public class IgnoreList extends GridPane { } private void importIgnoreList() { - FileChooser chooser = new FileChooser(); + var chooser = new FileChooser(); chooser.setTitle("Import ignore list"); - File file = chooser.showOpenDialog(null); + var file = chooser.showOpenDialog(null); if (file != null) { - Moshi moshi = new Moshi.Builder().add(Model.class, new ModelJsonAdapter(sites)).build(); + var moshi = new Moshi.Builder().add(Model.class, new ModelJsonAdapter(sites)).build(); Type modelListType = Types.newParameterizedType(List.class, String.class); JsonAdapter> adapter = moshi.adapter(modelListType); try { byte[] fileContent = Files.readAllBytes(file.toPath()); List ignoredModels = adapter.fromJson(new String(fileContent, StandardCharsets.UTF_8)); - boolean confirmed = true; + var confirmed = true; if (!Config.getInstance().getSettings().ignoredModels.isEmpty()) { - String msg = "This will replace the existing ignore list! Continue?"; - AutosizeAlert confirm = new AutosizeAlert(AlertType.CONFIRMATION, msg, getScene(), YES, NO); + var msg = "This will replace the existing ignore list! Continue?"; + var confirm = new AutosizeAlert(AlertType.CONFIRMATION, msg, getScene(), YES, NO); confirm.setTitle("Import ignore list"); confirm.setHeaderText("Overwrite ignore list"); confirm.showAndWait(); diff --git a/client/src/main/java/ctbrec/ui/settings/ListSelectionPane.java b/client/src/main/java/ctbrec/ui/settings/ListSelectionPane.java index 58c61824..80535328 100644 --- a/client/src/main/java/ctbrec/ui/settings/ListSelectionPane.java +++ b/client/src/main/java/ctbrec/ui/settings/ListSelectionPane.java @@ -38,7 +38,7 @@ public class ListSelectionPane> extends GridPane { ObservableList obsAvail = FXCollections.observableArrayList(available); ObservableList obsSel = FXCollections.observableArrayList(selected); for (Iterator iterator = obsAvail.iterator(); iterator.hasNext();) { - T t = iterator.next(); + var t = iterator.next(); if(obsSel.contains(t)) { iterator.remove(); } @@ -52,13 +52,13 @@ public class ListSelectionPane> extends GridPane { } private void createGui() { - Label labelAvailable = new Label("Available"); - Label labelSelected = new Label("Selected"); + var labelAvailable = new Label("Available"); + var labelSelected = new Label("Selected"); add(labelAvailable, 0, 0); add(availableListView, 0, 1); - VBox buttonBox = new VBox(5); + var buttonBox = new VBox(5); buttonBox.getChildren().add(addModel); buttonBox.getChildren().add(removeModel); buttonBox.setAlignment(Pos.CENTER); diff --git a/client/src/main/java/ctbrec/ui/settings/MoverPaneFactory.java b/client/src/main/java/ctbrec/ui/settings/MoverPaneFactory.java index c45bc1c9..ccd7801f 100644 --- a/client/src/main/java/ctbrec/ui/settings/MoverPaneFactory.java +++ b/client/src/main/java/ctbrec/ui/settings/MoverPaneFactory.java @@ -11,7 +11,7 @@ public class MoverPaneFactory extends AbstractPostProcessingPaneFactory { @Override public Preferences doCreatePostProcessorPane(PostProcessor pp) { - SimpleStringProperty pathTemplate = new SimpleStringProperty(null, Move.PATH_TEMPLATE, pp.getConfig().getOrDefault(Move.PATH_TEMPLATE, Move.DEFAULT)); + var pathTemplate = new SimpleStringProperty(null, Move.PATH_TEMPLATE, pp.getConfig().getOrDefault(Move.PATH_TEMPLATE, Move.DEFAULT)); properties.add(pathTemplate); return Preferences.of(new MapPreferencesStorage(), diff --git a/client/src/main/java/ctbrec/ui/settings/PostProcessingStepPanel.java b/client/src/main/java/ctbrec/ui/settings/PostProcessingStepPanel.java index e5cae35f..d976a1d6 100644 --- a/client/src/main/java/ctbrec/ui/settings/PostProcessingStepPanel.java +++ b/client/src/main/java/ctbrec/ui/settings/PostProcessingStepPanel.java @@ -1,7 +1,21 @@ package ctbrec.ui.settings; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.util.Optional; + import ctbrec.Config; -import ctbrec.recorder.postprocessing.*; +import ctbrec.recorder.postprocessing.Copy; +import ctbrec.recorder.postprocessing.CreateContactSheet; +import ctbrec.recorder.postprocessing.DeleteOriginal; +import ctbrec.recorder.postprocessing.DeleteTooShort; +import ctbrec.recorder.postprocessing.Move; +import ctbrec.recorder.postprocessing.PostProcessor; +import ctbrec.recorder.postprocessing.RemoveKeepFile; +import ctbrec.recorder.postprocessing.Remux; +import ctbrec.recorder.postprocessing.Rename; +import ctbrec.recorder.postprocessing.Script; import ctbrec.ui.controls.Dialogs; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; @@ -16,25 +30,20 @@ import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import javafx.stage.Stage; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.util.Optional; - public class PostProcessingStepPanel extends GridPane { private final Config config; private static final Class[] POST_PROCESSOR_CLASSES = new Class[]{ // @formatter: off - Copy.class, - Rename.class, - Move.class, - Remux.class, - Script.class, - DeleteOriginal.class, - DeleteTooShort.class, - RemoveKeepFile.class, - CreateContactSheet.class + Copy.class, + Rename.class, + Move.class, + Remux.class, + Script.class, + DeleteOriginal.class, + DeleteTooShort.class, + RemoveKeepFile.class, + CreateContactSheet.class }; // @formatter: on ListView stepListView; @@ -61,7 +70,7 @@ public class PostProcessingStepPanel extends GridPane { add = createAddButton(); remove = createRemoveButton(); edit = createEditButton(); - VBox buttons = new VBox(5, add, edit, up, down, remove); + var buttons = new VBox(5, add, edit, up, down, remove); stepList = FXCollections.observableList(config.getSettings().postProcessors); stepList.addListener((ListChangeListener) change -> { @@ -78,7 +87,7 @@ public class PostProcessingStepPanel extends GridPane { add(buttons, 1, 0); stepListView.getSelectionModel().selectedIndexProperty().addListener((obs, oldV, newV) -> { - int idx = newV.intValue(); + var idx = newV.intValue(); boolean noSelection = idx == -1; up.setDisable(noSelection || idx == 0); down.setDisable(noSelection || idx == stepList.size() - 1); @@ -88,7 +97,7 @@ public class PostProcessingStepPanel extends GridPane { } private Button createUpButton() { - Button button = createButton("\u25B4", "Move step up"); + var button = createButton("\u25B4", "Move step up"); button.setOnAction(evt -> { int idx = stepListView.getSelectionModel().getSelectedIndex(); PostProcessor selectedItem = stepListView.getSelectionModel().getSelectedItem(); @@ -100,7 +109,7 @@ public class PostProcessingStepPanel extends GridPane { } private Button createDownButton() { - Button button = createButton("\u25BE", "Move step down"); + var button = createButton("\u25BE", "Move step down"); button.setOnAction(evt -> { int idx = stepListView.getSelectionModel().getSelectedIndex(); PostProcessor selectedItem = stepListView.getSelectionModel().getSelectedItem(); @@ -112,7 +121,7 @@ public class PostProcessingStepPanel extends GridPane { } private Button createAddButton() { - Button button = createButton("+", "Add a new step"); + var button = createButton("+", "Add a new step"); button.setDisable(false); button.setOnAction(evt -> { PostProcessor[] options = createOptions(); @@ -122,7 +131,7 @@ public class PostProcessingStepPanel extends GridPane { choice.setResizable(true); choice.setWidth(600); choice.getDialogPane().setMinWidth(400); - Stage stage = (Stage) choice.getDialogPane().getScene().getWindow(); + var stage = (Stage) choice.getDialogPane().getScene().getWindow(); stage.getScene().getStylesheets().addAll(getScene().getStylesheets()); InputStream icon = Dialogs.class.getResourceAsStream("/icon.png"); stage.getIcons().add(new Image(icon)); @@ -144,8 +153,8 @@ public class PostProcessingStepPanel extends GridPane { private PostProcessor[] createOptions() { try { - PostProcessor[] options = new PostProcessor[POST_PROCESSOR_CLASSES.length]; - for (int i = 0; i < POST_PROCESSOR_CLASSES.length; i++) { + var options = new PostProcessor[POST_PROCESSOR_CLASSES.length]; + for (var i = 0; i < POST_PROCESSOR_CLASSES.length; i++) { Class cls = POST_PROCESSOR_CLASSES[i]; PostProcessor pp; pp = (PostProcessor) cls.getDeclaredConstructor().newInstance(); @@ -160,7 +169,7 @@ public class PostProcessingStepPanel extends GridPane { } private Button createRemoveButton() { - Button button = createButton("-", "Remove selected step"); + var button = createButton("-", "Remove selected step"); button.setOnAction(evt -> { PostProcessor selectedItem = stepListView.getSelectionModel().getSelectedItem(); if (selectedItem != null) { @@ -171,7 +180,7 @@ public class PostProcessingStepPanel extends GridPane { } private Button createEditButton() { - Button button = createButton("\u270E", "Edit selected step"); + var button = createButton("\u270E", "Edit selected step"); button.setOnAction(evt -> { PostProcessor selectedItem = stepListView.getSelectionModel().getSelectedItem(); PostProcessingDialogFactory.openEditDialog(selectedItem, getScene(), stepList); @@ -182,7 +191,7 @@ public class PostProcessingStepPanel extends GridPane { } private Button createButton(String text, String tooltip) { - Button b = new Button(text); + var b = new Button(text); b.setTooltip(new Tooltip(tooltip)); b.setDisable(true); b.setPrefSize(32, 32); diff --git a/client/src/main/java/ctbrec/ui/settings/RemuxerPaneFactory.java b/client/src/main/java/ctbrec/ui/settings/RemuxerPaneFactory.java index 64a9c0fb..6c016986 100644 --- a/client/src/main/java/ctbrec/ui/settings/RemuxerPaneFactory.java +++ b/client/src/main/java/ctbrec/ui/settings/RemuxerPaneFactory.java @@ -11,8 +11,8 @@ public class RemuxerPaneFactory extends AbstractPostProcessingPaneFactory { @Override public Preferences doCreatePostProcessorPane(PostProcessor pp) { - SimpleStringProperty ffmpegParams = new SimpleStringProperty(null, Remux.FFMPEG_ARGS, pp.getConfig().getOrDefault(Remux.FFMPEG_ARGS, "-c:v copy -c:a copy -movflags faststart -y -f mp4")); - SimpleStringProperty fileExt = new SimpleStringProperty(null, Remux.FILE_EXT, pp.getConfig().getOrDefault(Remux.FILE_EXT, "mp4")); + var ffmpegParams = new SimpleStringProperty(null, Remux.FFMPEG_ARGS, pp.getConfig().getOrDefault(Remux.FFMPEG_ARGS, "-c:v copy -c:a copy -movflags faststart -y -f mp4")); + var fileExt = new SimpleStringProperty(null, Remux.FILE_EXT, pp.getConfig().getOrDefault(Remux.FILE_EXT, "mp4")); properties.add(ffmpegParams); properties.add(fileExt); diff --git a/client/src/main/java/ctbrec/ui/settings/RenamerPaneFactory.java b/client/src/main/java/ctbrec/ui/settings/RenamerPaneFactory.java index 4c887403..922420e4 100644 --- a/client/src/main/java/ctbrec/ui/settings/RenamerPaneFactory.java +++ b/client/src/main/java/ctbrec/ui/settings/RenamerPaneFactory.java @@ -11,7 +11,7 @@ public class RenamerPaneFactory extends AbstractPostProcessingPaneFactory { @Override public Preferences doCreatePostProcessorPane(PostProcessor pp) { - SimpleStringProperty fileTemplate = new SimpleStringProperty(null, Rename.FILE_NAME_TEMPLATE, pp.getConfig().getOrDefault(Rename.FILE_NAME_TEMPLATE, Rename.DEFAULT)); + var fileTemplate = new SimpleStringProperty(null, Rename.FILE_NAME_TEMPLATE, pp.getConfig().getOrDefault(Rename.FILE_NAME_TEMPLATE, Rename.DEFAULT)); properties.add(fileTemplate); return Preferences.of(new MapPreferencesStorage(), diff --git a/client/src/main/java/ctbrec/ui/settings/ScriptPaneFactory.java b/client/src/main/java/ctbrec/ui/settings/ScriptPaneFactory.java index 1c56cc5b..53448f14 100644 --- a/client/src/main/java/ctbrec/ui/settings/ScriptPaneFactory.java +++ b/client/src/main/java/ctbrec/ui/settings/ScriptPaneFactory.java @@ -11,8 +11,8 @@ public class ScriptPaneFactory extends AbstractPostProcessingPaneFactory { @Override public Preferences doCreatePostProcessorPane(PostProcessor pp) { - SimpleStringProperty script = new SimpleStringProperty(null, Script.SCRIPT_EXECUTABLE, pp.getConfig().getOrDefault(Script.SCRIPT_EXECUTABLE, "c:\\users\\johndoe\\somescript")); - SimpleStringProperty params = new SimpleStringProperty(null, Script.SCRIPT_PARAMS, pp.getConfig().getOrDefault(Script.SCRIPT_PARAMS, "${absolutePath}")); + var script = new SimpleStringProperty(null, Script.SCRIPT_EXECUTABLE, pp.getConfig().getOrDefault(Script.SCRIPT_EXECUTABLE, "c:\\users\\johndoe\\somescript")); + var params = new SimpleStringProperty(null, Script.SCRIPT_PARAMS, pp.getConfig().getOrDefault(Script.SCRIPT_PARAMS, "${absolutePath}")); properties.add(script); properties.add(params); diff --git a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java index 2b45e599..37eaeeed 100644 --- a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java +++ b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java @@ -203,8 +203,8 @@ public class SettingsTab extends Tab implements TabSelectionListener { } private void createGui() { - PostProcessingStepPanel postProcessingStepPanel = new PostProcessingStepPanel(config); - Button variablesHelpButton = createHelpButton("Variables", "http://localhost:5689/docs/PostProcessing.md#variables"); + var postProcessingStepPanel = new PostProcessingStepPanel(config); + var variablesHelpButton = createHelpButton("Variables", "http://localhost:5689/docs/PostProcessing.md#variables"); ignoreList = new IgnoreList(sites); List siteCategories = new ArrayList<>(); for (Site site : sites) { @@ -212,8 +212,8 @@ public class SettingsTab extends Tab implements TabSelectionListener { .ifPresent(configPanel -> siteCategories.add(Category.of(site.getName(), configPanel))); } - CtbrecPreferencesStorage storage = new CtbrecPreferencesStorage(config); - Preferences prefs = Preferences.of(storage, + var storage = new CtbrecPreferencesStorage(config); + var prefs = Preferences.of(storage, Category.of("General", Group.of("General", Setting.of("User-Agent", httpUserAgent), @@ -304,15 +304,15 @@ public class SettingsTab extends Tab implements TabSelectionListener { storage.setPreferences(prefs); preferencesView.setMinSize(800, 400); preferencesView.setPrefSize(1280, 960); - ScrollPane scrollPane = new ScrollPane(preferencesView); - GridPane container = new GridPane(); + var scrollPane = new ScrollPane(preferencesView); + var container = new GridPane(); container.add(scrollPane, 0, 0); GridPane.setFillWidth(scrollPane, true); GridPane.setFillHeight(scrollPane, true); GridPane.setHgrow(scrollPane, Priority.ALWAYS); GridPane.setVgrow(scrollPane, Priority.ALWAYS); - StackPane stackPane = new StackPane(); + var stackPane = new StackPane(); stackPane.getChildren().add(container); restartNotification = new Label("Restart Required"); restartNotification.setVisible(false); @@ -369,7 +369,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { } private Button createHelpButton(String text, String url) { - Button postProcessingHelpButton = new Button(text); + var postProcessingHelpButton = new Button(text); postProcessingHelpButton.setOnAction(e -> { new Thread(() -> { try { @@ -446,7 +446,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { Config.getInstance().getSettings().key = key; saveConfig(); } - TextInputDialog keyDialog = new TextInputDialog(); + var keyDialog = new TextInputDialog(); keyDialog.setResizable(true); keyDialog.setTitle("Server Authentication"); keyDialog.setHeaderText("A key has been generated"); @@ -485,7 +485,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { } public static GridPane createGridLayout() { - GridPane layout = new GridPane(); + var layout = new GridPane(); layout.setPadding(new Insets(10)); layout.setHgap(5); layout.setVgap(5); @@ -500,7 +500,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { fadeIn.setOnFinished(e -> { Transition fadeOut = changeOpacity(restartNotification, 0); fadeOut.setOnFinished(e2 -> restartNotification.setVisible(false)); - PauseTransition pauseTransition = new PauseTransition(Duration.seconds(5)); + var pauseTransition = new PauseTransition(Duration.seconds(5)); pauseTransition.setOnFinished(evt -> fadeOut.play()); pauseTransition.play(); }); @@ -509,7 +509,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { private static final Duration ANIMATION_DURATION = new Duration(500); private Transition changeOpacity(Node node, double opacity) { - FadeTransition transition = new FadeTransition(ANIMATION_DURATION, node); + var transition = new FadeTransition(ANIMATION_DURATION, node); transition.setFromValue(node.getOpacity()); transition.setToValue(opacity); return transition; @@ -536,8 +536,8 @@ public class SettingsTab extends Tab implements TabSelectionListener { @Override public int hashCode() { - final int prime = 31; - int result = 1; + final var prime = 31; + var result = 1; result = prime * result + value; return result; } @@ -590,8 +590,8 @@ public class SettingsTab extends Tab implements TabSelectionListener { @Override public int hashCode() { - final int prime = 31; - int result = 1; + final var prime = 31; + var result = 1; result = prime * result + (int) (value ^ (value >>> 32)); return result; } diff --git a/client/src/main/java/ctbrec/ui/settings/api/Category.java b/client/src/main/java/ctbrec/ui/settings/api/Category.java index df43a3b7..ba658cce 100644 --- a/client/src/main/java/ctbrec/ui/settings/api/Category.java +++ b/client/src/main/java/ctbrec/ui/settings/api/Category.java @@ -90,17 +90,17 @@ public class Category { String q = filter.toLowerCase().trim(); if(hasGroups() || hasSubCategories()) { return name.toLowerCase().contains(q) - | groupsContains(q) - | subCategoriesContains(q); + || groupsContains(q) + || subCategoriesContains(q); } else { return name.toLowerCase().contains(q) - | guiContains(q); + || guiContains(q); } } private boolean subCategoriesContains(String filter) { - boolean contains = false; + var contains = false; if (subCategories != null) { for (Category category : subCategories) { if (category.contains(filter)) { @@ -112,7 +112,7 @@ public class Category { } private boolean groupsContains(String filter) { - boolean contains = false; + var contains = false; if (groups != null) { for (Group group : groups) { if (group.contains(filter)) { @@ -131,9 +131,9 @@ public class Category { } private boolean nodeContains(Node node, String filter) { - boolean contains = false; + var contains = false; if (node instanceof Pane) { - Pane pane = (Pane) node; + var pane = (Pane) node; for (Node child : pane.getChildren()) { contains |= nodeContains(child, filter); } diff --git a/client/src/main/java/ctbrec/ui/settings/api/Group.java b/client/src/main/java/ctbrec/ui/settings/api/Group.java index d3af7040..465ff243 100644 --- a/client/src/main/java/ctbrec/ui/settings/api/Group.java +++ b/client/src/main/java/ctbrec/ui/settings/api/Group.java @@ -34,11 +34,11 @@ public class Group { } public boolean contains(String filter) { - return name.toLowerCase().contains(filter) | settingsContain(filter); + return name.toLowerCase().contains(filter) || settingsContain(filter); } private boolean settingsContain(String filter) { - boolean contains = false; + var contains = false; if (settings != null) { for (Setting setting : settings) { if (setting.contains(filter)) { diff --git a/client/src/main/java/ctbrec/ui/settings/api/HighlightingSupport.java b/client/src/main/java/ctbrec/ui/settings/api/HighlightingSupport.java index ab14d273..e3ed5281 100644 --- a/client/src/main/java/ctbrec/ui/settings/api/HighlightingSupport.java +++ b/client/src/main/java/ctbrec/ui/settings/api/HighlightingSupport.java @@ -16,7 +16,7 @@ class HighlightingSupport { private HighlightingSupport() {} static void highlightMatches(Category cat, String filter) { - Node node = cat.getGuiOrElse(Label::new); + var node = cat.getGuiOrElse(Label::new); highlightMatchess(node, filter); if(cat.hasSubCategories()) { for (Category sub : cat.getSubCategories()) { @@ -26,9 +26,9 @@ class HighlightingSupport { } static void highlightMatchess(Node node, String filter) { - boolean contains = false; + var contains = false; if (node instanceof Pane) { - Pane pane = (Pane) node; + var pane = (Pane) node; for (Node child : pane.getChildren()) { highlightMatchess(child, filter); } @@ -51,9 +51,9 @@ class HighlightingSupport { } private static boolean labelControlContains(Label lbl, String filter) { - boolean contains = false; + var contains = false; if (lbl.labelForProperty().get() != null) { - Node labeledNode = lbl.labelForProperty().get(); + var labeledNode = lbl.labelForProperty().get(); contains |= labeledNode.toString().toLowerCase().contains(filter); if (labeledNode instanceof Control) { contains |= ofNullable(((Control) labeledNode).getTooltip()).map(Tooltip::getText).orElse("").toLowerCase().contains(filter); @@ -66,7 +66,7 @@ class HighlightingSupport { } static void removeHighlights(Category cat) { - Node node = cat.getGuiOrElse(Label::new); + var node = cat.getGuiOrElse(Label::new); removeHighlights(node); if(cat.hasSubCategories()) { for (Category sub : cat.getSubCategories()) { diff --git a/client/src/main/java/ctbrec/ui/settings/api/Preferences.java b/client/src/main/java/ctbrec/ui/settings/api/Preferences.java index f5a72a66..66b3ef3a 100644 --- a/client/src/main/java/ctbrec/ui/settings/api/Preferences.java +++ b/client/src/main/java/ctbrec/ui/settings/api/Preferences.java @@ -72,17 +72,17 @@ public class Preferences { } public Region getView(boolean withNavigation) { - SearchBox search = new SearchBox(true); + var search = new SearchBox(true); search.textProperty().addListener(this::filterTree); TreeItem categoryTreeItems = createCategoryTree(categories, new TreeItem<>(), null); categoryTree = new TreeView<>(categoryTreeItems); categoryTree.showRootProperty().set(false); - VBox leftSide = new VBox(search, categoryTree); + var leftSide = new VBox(search, categoryTree); VBox.setVgrow(categoryTree, Priority.ALWAYS); VBox.setMargin(search, new Insets(2)); VBox.setMargin(categoryTree, new Insets(2)); - BorderPane main = new BorderPane(); + var main = new BorderPane(); if (withNavigation) { main.setLeft(leftSide); } @@ -149,9 +149,9 @@ public class Preferences { } private Node createPaneWithGroups(Category cat) throws Exception { - VBox pane = new VBox(); + var pane = new VBox(); for (Group grp : cat.getGroups()) { - Label groupLabel = new Label(grp.getName()); + var groupLabel = new Label(grp.getName()); groupLabel.getStyleClass().add("settings-group-label"); VBox.setMargin(groupLabel, new Insets(20, 0, 10, 20)); pane.getChildren().add(groupLabel); @@ -163,13 +163,13 @@ public class Preferences { } private Node createGrid(Setting[] settings) throws Exception { - GridPane pane = new GridPane(); + var pane = new GridPane(); pane.setHgap(2); pane.vgapProperty().bind(pane.hgapProperty()); - int row = 0; + var row = 0; for (Setting setting : settings) { - Node node = setting.getGui(); - Label label = new Label(setting.getName()); + var node = setting.getGui(); + var label = new Label(setting.getName()); label.setMinHeight(34); label.labelForProperty().set(node); label.setTooltip(new Tooltip(setting.getName())); @@ -226,7 +226,7 @@ public class Preferences { } public Optional getSetting(String key) { - SettingSearchVisitor search = new SettingSearchVisitor(key); + var search = new SettingSearchVisitor(key); traverse(search); return search.getResult(); } diff --git a/client/src/main/java/ctbrec/ui/settings/api/PreferencesStorage.java b/client/src/main/java/ctbrec/ui/settings/api/PreferencesStorage.java index c380eaa1..c3dd3ecb 100644 --- a/client/src/main/java/ctbrec/ui/settings/api/PreferencesStorage.java +++ b/client/src/main/java/ctbrec/ui/settings/api/PreferencesStorage.java @@ -9,5 +9,5 @@ public interface PreferencesStorage { void save(Preferences preferences) throws IOException; void load(Preferences preferences); - Node createGui(Setting setting) throws Exception; + Node createGui(Setting setting) throws NoSuchFieldException, IllegalAccessException; } diff --git a/client/src/main/java/ctbrec/ui/settings/api/Setting.java b/client/src/main/java/ctbrec/ui/settings/api/Setting.java index d89e9de3..dffc2c85 100644 --- a/client/src/main/java/ctbrec/ui/settings/api/Setting.java +++ b/client/src/main/java/ctbrec/ui/settings/api/Setting.java @@ -3,6 +3,7 @@ package ctbrec.ui.settings.api; import static java.util.Optional.*; import ctbrec.StringUtil; +import ctbrec.ui.controls.Dialogs; import javafx.beans.property.Property; import javafx.beans.value.ChangeListener; import javafx.scene.Node; @@ -35,13 +36,13 @@ public class Setting { } public static Setting of(String name, Property property, String tooltip) { - Setting setting = new Setting(name, property); + var setting = new Setting(name, property); setting.tooltip = tooltip; return setting; } public static Setting of(String name, Node gui) { - Setting setting = new Setting(name, gui); + var setting = new Setting(name, gui); return setting; } @@ -79,12 +80,16 @@ public class Setting { return property; } - public Node getGui() throws Exception { + public Node getGui() { if (gui == null) { - gui = preferencesStorage.createGui(this); - if (gui instanceof Control && StringUtil.isNotBlank(tooltip)) { - Control control = (Control) gui; - control.setTooltip(new Tooltip(tooltip)); + try { + gui = preferencesStorage.createGui(this); + if (gui instanceof Control && StringUtil.isNotBlank(tooltip)) { + var control = (Control) gui; + control.setTooltip(new Tooltip(tooltip)); + } + } catch (NoSuchFieldException | IllegalAccessException e) { + Dialogs.showError("Error", "Error creating settings GUI", e); } } return gui; diff --git a/client/src/main/java/ctbrec/ui/sites/AbstractConfigUI.java b/client/src/main/java/ctbrec/ui/sites/AbstractConfigUI.java index afbd4815..889f4acb 100644 --- a/client/src/main/java/ctbrec/ui/sites/AbstractConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/AbstractConfigUI.java @@ -9,7 +9,7 @@ import ctbrec.Config; public abstract class AbstractConfigUI implements ConfigUI { - private static final transient Logger LOG = LoggerFactory.getLogger(AbstractConfigUI.class); + private static final Logger LOG = LoggerFactory.getLogger(AbstractConfigUI.class); protected void save() { try { diff --git a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsConfigUI.java b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsConfigUI.java index bd83ceb0..8d240433 100644 --- a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsConfigUI.java @@ -1,7 +1,6 @@ package ctbrec.ui.sites.bonga; import ctbrec.Config; -import ctbrec.Settings; import ctbrec.sites.bonga.BongaCams; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; @@ -26,14 +25,14 @@ public class BongaCamsConfigUI extends AbstractConfigUI { @Override public Parent createConfigPanel() { GridPane layout = SettingsTab.createGridLayout(); - Settings settings = Config.getInstance().getSettings(); + var settings = Config.getInstance().getSettings(); - int row = 0; - Label l = new Label("Active"); + var row = 0; + var l = new Label("Active"); layout.add(l, 0, row); - CheckBox enabled = new CheckBox(); + var enabled = new CheckBox(); enabled.setSelected(!settings.disabledSites.contains(bongaCams.getName())); - enabled.setOnAction((e) -> { + enabled.setOnAction(e -> { if(enabled.isSelected()) { settings.disabledSites.remove(bongaCams.getName()); } else { @@ -45,7 +44,7 @@ public class BongaCamsConfigUI extends AbstractConfigUI { layout.add(enabled, 1, row++); layout.add(new Label("BongaCams User"), 0, row); - TextField username = new TextField(settings.bongaUsername); + var username = new TextField(settings.bongaUsername); username.setPrefWidth(300); username.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().bongaUsername)) { @@ -60,7 +59,7 @@ public class BongaCamsConfigUI extends AbstractConfigUI { layout.add(username, 1, row++); layout.add(new Label("BongaCams Password"), 0, row); - PasswordField password = new PasswordField(); + var password = new PasswordField(); password.setText(settings.bongaPassword); password.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().bongaPassword)) { @@ -75,7 +74,7 @@ public class BongaCamsConfigUI extends AbstractConfigUI { layout.add(password, 1, row++); layout.add(new Label("Bongacams Base URL"), 0, row); - TextField baseUrl = new TextField(); + var baseUrl = new TextField(); baseUrl.setText(Config.getInstance().getSettings().bongacamsBaseUrl); baseUrl.textProperty().addListener((ob, o, n) -> { Config.getInstance().getSettings().bongacamsBaseUrl = baseUrl.getText(); @@ -86,9 +85,9 @@ public class BongaCamsConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(baseUrl, 2); layout.add(baseUrl, 1, row++); - Button createAccount = new Button("Create new Account"); - createAccount.setOnAction((e) -> DesktopIntegration.open(bongaCams.getAffiliateLink())); - layout.add(createAccount, 1, row++); + var createAccount = new Button("Create new Account"); + createAccount.setOnAction(e -> DesktopIntegration.open(bongaCams.getAffiliateLink())); + layout.add(createAccount, 1, row); GridPane.setColumnSpan(createAccount, 2); GridPane.setMargin(username, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(password, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); diff --git a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsElectronLoginDialog.java b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsElectronLoginDialog.java index 9aa7e908..3eef73c3 100644 --- a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsElectronLoginDialog.java +++ b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsElectronLoginDialog.java @@ -7,7 +7,6 @@ import java.util.Collections; import java.util.Objects; import java.util.function.Consumer; -import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,11 +31,11 @@ public class BongaCamsElectronLoginDialog { this.cookieJar = cookieJar; browser = ExternalBrowser.getInstance(); try { - JSONObject config = new JSONObject(); + var config = new JSONObject(); config.put("url", URL); config.put("w", 640); config.put("h", 480); - JSONObject msg = new JSONObject(); + var msg = new JSONObject(); msg.put("config", config); browser.run(msg, msgHandler); } catch (InterruptedException e) { @@ -51,9 +50,9 @@ public class BongaCamsElectronLoginDialog { if(!line.startsWith("{")) { LOG.error("Didn't received a JSON object {}", line); } else { - JSONObject json = new JSONObject(line); + var json = new JSONObject(line); if(json.has("url")) { - String url = json.getString("url"); + var url = json.getString("url"); if(url.endsWith("/login")) { try { Thread.sleep(500); @@ -66,7 +65,7 @@ public class BongaCamsElectronLoginDialog { password = password.replace("'", "\\'"); browser.executeJavaScript("document.getElementById('log_in_password').value = '" + password + "';"); } - String[] simplify = new String[] { + var simplify = new String[] { "$('div[class~=\"page_header\"]').css('display','none');", "$('div[class~=\"header_bar\"]').css('display','none')", "$('footer').css('display','none');", @@ -76,15 +75,18 @@ public class BongaCamsElectronLoginDialog { for (String js : simplify) { browser.executeJavaScript(js); } + } catch(InterruptedException e) { + Thread.currentThread().interrupt(); + LOG.warn("Couldn't auto fill username and password for BongaCams", e); } catch(Exception e) { LOG.warn("Couldn't auto fill username and password for BongaCams", e); } } if(json.has("cookies")) { - JSONArray cookiesFromBrowser = json.getJSONArray("cookies"); - for (int i = 0; i < cookiesFromBrowser.length(); i++) { - JSONObject cookie = cookiesFromBrowser.getJSONObject(i); + var cookiesFromBrowser = json.getJSONArray("cookies"); + for (var i = 0; i < cookiesFromBrowser.length(); i++) { + var cookie = cookiesFromBrowser.getJSONObject(i); if(cookie.getString("domain").contains(DOMAIN)) { Builder b = new Cookie.Builder() .path(cookie.getString("path")) diff --git a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsTabProvider.java b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsTabProvider.java index 8feacf7c..b03b1068 100644 --- a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsTabProvider.java @@ -11,7 +11,7 @@ import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; -public class BongaCamsTabProvider extends TabProvider { +public class BongaCamsTabProvider implements TabProvider { private BongaCams bongaCams; private Recorder recorder; @@ -28,7 +28,7 @@ public class BongaCamsTabProvider extends TabProvider { // female String url = BongaCams.baseUrl + "/tools/listing_v3.php?livetab=female&online_only=true&is_mobile=true&offset="; - BongaCamsUpdateService updateService = new BongaCamsUpdateService(bongaCams, url); + var updateService = new BongaCamsUpdateService(bongaCams, url); tabs.add(createTab("Female", updateService)); // male @@ -67,7 +67,7 @@ public class BongaCamsTabProvider extends TabProvider { } private Tab createTab(String title, PaginatedScheduledService updateService) { - ThumbOverviewTab tab = new ThumbOverviewTab(title, updateService, bongaCams); + var tab = new ThumbOverviewTab(title, updateService, bongaCams); tab.setRecorder(recorder); return tab; } diff --git a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsUpdateService.java b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsUpdateService.java index 62f7f401..591d5e01 100644 --- a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsUpdateService.java @@ -19,7 +19,6 @@ import ctbrec.sites.bonga.BongaCamsModel; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; -import okhttp3.Response; public class BongaCamsUpdateService extends PaginatedScheduledService { @@ -38,48 +37,56 @@ public class BongaCamsUpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - String pageUrl = url + ((page-1) * 36); - LOG.debug("Fetching page {}", pageUrl); - Request request = new Request.Builder() - .url(pageUrl) - .addHeader(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .addHeader(ACCEPT, MIMETYPE_APPLICATION_JSON) - .addHeader(ACCEPT, Locale.ENGLISH.getLanguage()) - .addHeader(REFERER, bongaCams.getBaseUrl()) - .addHeader(X_REQUESTED_WITH, XML_HTTP_REQUEST) - .build(); - Response response = bongaCams.getHttpClient().execute(request); - if (response.isSuccessful()) { - String content = response.body().string(); - List models = new ArrayList<>(); - JSONObject json = new JSONObject(content); - //LOG.debug(json.toString(2)); - if (json.optString("status").equals("success")) { - JSONArray jsonModels = json.getJSONArray("models"); - for (int i = 0; i < jsonModels.length(); i++) { - JSONObject m = jsonModels.getJSONObject(i); - String name = m.optString("username"); - if (name.isEmpty()) { - continue; - } - BongaCamsModel model = (BongaCamsModel) bongaCams.createModel(name); - model.mapOnlineState(m.optString("room")); - model.setOnline(m.optInt("viewers") > 0); - model.setPreview("https:" + m.getString("thumb_image").replace("{ext}", "jpg")); - if (m.has("display_name")) { - model.setDisplayName(m.getString("display_name")); - } - model.setDescription(m.optString("topic")); - models.add(model); - } - } - return models; - } else { - int code = response.code(); - response.close(); - throw new IOException("HTTP status " + code); - } + return loadModelList(); } + }; } + + private List loadModelList() throws IOException { + String pageUrl = url + ((page-1) * 36); + LOG.debug("Fetching page {}", pageUrl); + var request = new Request.Builder() + .url(pageUrl) + .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) + .header(ACCEPT, MIMETYPE_APPLICATION_JSON) + .header(ACCEPT, Locale.ENGLISH.getLanguage()) + .header(REFERER, bongaCams.getBaseUrl()) + .header(X_REQUESTED_WITH, XML_HTTP_REQUEST) + .build(); + try (var response = bongaCams.getHttpClient().execute(request)) { + if (response.isSuccessful()) { + var content = response.body().string(); + List models = new ArrayList<>(); + var json = new JSONObject(content); + if (json.optString("status").equals("success")) { + var jsonModels = json.getJSONArray("models"); + parseModels(jsonModels, models); + } + return models; + } else { + int code = response.code(); + throw new IOException("HTTP status " + code); + } + } + } + + private void parseModels(JSONArray jsonModels, List models) { + for (var i = 0; i < jsonModels.length(); i++) { + var m = jsonModels.getJSONObject(i); + var name = m.optString("username"); + if (name.isEmpty()) { + continue; + } + BongaCamsModel model = (BongaCamsModel) bongaCams.createModel(name); + model.mapOnlineState(m.optString("room")); + model.setOnline(m.optInt("viewers") > 0); + model.setPreview("https:" + m.getString("thumb_image").replace("{ext}", "jpg")); + if (m.has("display_name")) { + model.setDisplayName(m.getString("display_name")); + } + model.setDescription(m.optString("topic")); + models.add(model); + } + } } diff --git a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ConfigUI.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ConfigUI.java index e9062360..eb3c648f 100644 --- a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ConfigUI.java @@ -1,7 +1,6 @@ package ctbrec.ui.sites.cam4; import ctbrec.Config; -import ctbrec.Settings; import ctbrec.sites.cam4.Cam4; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; @@ -25,15 +24,15 @@ public class Cam4ConfigUI extends AbstractConfigUI { @Override public Parent createConfigPanel() { - GridPane layout = SettingsTab.createGridLayout(); - Settings settings = Config.getInstance().getSettings(); + var layout = SettingsTab.createGridLayout(); + var settings = Config.getInstance().getSettings(); - int row = 0; - Label l = new Label("Active"); + var row = 0; + var l = new Label("Active"); layout.add(l, 0, row); - CheckBox enabled = new CheckBox(); + var enabled = new CheckBox(); enabled.setSelected(!settings.disabledSites.contains(cam4.getName())); - enabled.setOnAction((e) -> { + enabled.setOnAction(e -> { if(enabled.isSelected()) { settings.disabledSites.remove(cam4.getName()); } else { @@ -45,7 +44,7 @@ public class Cam4ConfigUI extends AbstractConfigUI { layout.add(enabled, 1, row++); layout.add(new Label("Cam4 User"), 0, row); - TextField username = new TextField(Config.getInstance().getSettings().cam4Username); + var username = new TextField(Config.getInstance().getSettings().cam4Username); username.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().cam4Username)) { Config.getInstance().getSettings().cam4Username = username.getText(); @@ -59,7 +58,7 @@ public class Cam4ConfigUI extends AbstractConfigUI { layout.add(username, 1, row++); layout.add(new Label("Cam4 Password"), 0, row); - PasswordField password = new PasswordField(); + var password = new PasswordField(); password.setText(Config.getInstance().getSettings().cam4Password); password.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().cam4Password)) { @@ -73,9 +72,9 @@ public class Cam4ConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); - Button createAccount = new Button("Create new Account"); - createAccount.setOnAction((e) -> DesktopIntegration.open(Cam4.AFFILIATE_LINK)); - layout.add(createAccount, 1, row++); + var createAccount = new Button("Create new Account"); + createAccount.setOnAction(e -> DesktopIntegration.open(Cam4.AFFILIATE_LINK)); + layout.add(createAccount, 1, row); GridPane.setColumnSpan(createAccount, 2); GridPane.setMargin(username, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(password, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); diff --git a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ElectronLoginDialog.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ElectronLoginDialog.java index 9509138c..03b11dd0 100644 --- a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ElectronLoginDialog.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ElectronLoginDialog.java @@ -7,7 +7,6 @@ import java.util.Collections; import java.util.Objects; import java.util.function.Consumer; -import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,11 +31,11 @@ public class Cam4ElectronLoginDialog { this.cookieJar = cookieJar; browser = ExternalBrowser.getInstance(); try { - JSONObject config = new JSONObject(); + var config = new JSONObject(); config.put("url", URL); config.put("w", 480); config.put("h", 640); - JSONObject msg = new JSONObject(); + var msg = new JSONObject(); msg.put("config", config); browser.run(msg, msgHandler); } catch (InterruptedException e) { @@ -51,9 +50,9 @@ public class Cam4ElectronLoginDialog { if(!line.startsWith("{")) { LOG.error("Didn't received a JSON object {}", line); } else { - JSONObject json = new JSONObject(line); - if(json.has("url")) { - String url = json.getString("url"); + var json = new JSONObject(line); + if (json.has("url")) { + var url = json.getString("url"); if(url.endsWith("/login")) { try { @@ -76,16 +75,16 @@ public class Cam4ElectronLoginDialog { } if(json.has("cookies")) { - JSONArray cookiesFromBrowser = json.getJSONArray("cookies"); + var cookiesFromBrowser = json.getJSONArray("cookies"); try { - for (int i = 0; i < cookiesFromBrowser.length(); i++) { - JSONObject cookie = cookiesFromBrowser.getJSONObject(i); + for (var i = 0; i < cookiesFromBrowser.length(); i++) { + var cookie = cookiesFromBrowser.getJSONObject(i); if(cookie.getString("domain").contains("cam4")) { - String domain = cookie.getString("domain"); + var domain = cookie.getString("domain"); if(domain.startsWith(".")) { domain = domain.substring(1); } - Cookie c = createCookie(domain, cookie); + var c = createCookie(domain, cookie); cookieJar.saveFromResponse(HttpUrl.parse(url), Collections.singletonList(c)); c = createCookie("cam4.com", cookie); cookieJar.saveFromResponse(HttpUrl.parse(Cam4.BASE_URI), Collections.singletonList(c)); diff --git a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedTab.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedTab.java index 2db35a38..de6d895c 100644 --- a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedTab.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedTab.java @@ -29,17 +29,17 @@ public class Cam4FollowedTab extends ThumbOverviewTab implements FollowedTab { } private void addOnlineOfflineSelector() { - ToggleGroup group = new ToggleGroup(); - RadioButton online = new RadioButton("online"); + var group = new ToggleGroup(); + var online = new RadioButton("online"); online.setToggleGroup(group); - RadioButton offline = new RadioButton("offline"); + var offline = new RadioButton("offline"); offline.setToggleGroup(group); pagination.getChildren().add(online); pagination.getChildren().add(offline); HBox.setMargin(online, new Insets(5,5,5,40)); HBox.setMargin(offline, new Insets(5,5,5,5)); online.setSelected(true); - group.selectedToggleProperty().addListener((e) -> { + group.selectedToggleProperty().addListener(e -> { ((Cam4FollowedUpdateService)updateService).setShowOnline(online.isSelected()); queue.clear(); updateService.restart(); @@ -66,10 +66,8 @@ public class Cam4FollowedTab extends ThumbOverviewTab implements FollowedTab { public void setScene(Scene scene) { scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> { - if(this.isSelected()) { - if(event.getCode() == KeyCode.DELETE) { - follow(selectedThumbCells, false); - } + if (this.isSelected() && event.getCode() == KeyCode.DELETE) { + follow(selectedThumbCells, false); } }); } diff --git a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedUpdateService.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedUpdateService.java index 6d3316fb..7b769999 100644 --- a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedUpdateService.java @@ -6,7 +6,6 @@ import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import org.json.JSONArray; import org.json.JSONObject; import ctbrec.Model; @@ -17,7 +16,6 @@ import ctbrec.ui.SiteUiFactory; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; -import okhttp3.Response; public class Cam4FollowedUpdateService extends PaginatedScheduledService { @@ -27,7 +25,7 @@ public class Cam4FollowedUpdateService extends PaginatedScheduledService { public Cam4FollowedUpdateService(Cam4 site) { this.site = site; ExecutorService executor = Executors.newSingleThreadExecutor(r -> { - Thread t = new Thread(r); + var t = new Thread(r); t.setDaemon(true); t.setName("ThumbOverviewTab UpdateService"); return t; @@ -40,37 +38,45 @@ public class Cam4FollowedUpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - // login first - SiteUiFactory.getUi(site).login(); - List models = new ArrayList<>(); - String url = site.getBaseUrl() + "/directoryCams?directoryJson=true&online=" + showOnline + "&url=true&friends=true&favorites=true&resultsPerPage=90"; - Request req = new Request.Builder().url(url).build(); - try (Response response = site.getHttpClient().execute(req)) { - if (response.isSuccessful()) { - String content = response.body().string(); - JSONObject json = new JSONObject(content); - JSONArray users = json.getJSONArray("users"); - for (int i = 0; i < users.length(); i++) { - JSONObject modelJson = users.getJSONObject(i); - String username = modelJson.optString("username"); - Cam4Model model = site.createModel(username); - model.setPreview(modelJson.optString("snapshotImageLink")); - model.setOnlineStateByShowType(modelJson.optString("showType")); - model.setDescription(modelJson.optString("statusMessage")); - if (modelJson.has("hlsPreviewUrl")) { - model.setPlaylistUrl(modelJson.getString("hlsPreviewUrl")); - } - models.add(model); - } - return models; - } else { - throw new HttpException(response.code(), response.message()); - } - } + return loadModelList(); } }; } + private List loadModelList() throws IOException { + // login first + SiteUiFactory.getUi(site).login(); + String url = site.getBaseUrl() + "/directoryCams?directoryJson=true&online=" + showOnline + "&url=true&friends=true&favorites=true&resultsPerPage=90"; + Request req = new Request.Builder().url(url).build(); + try (var response = site.getHttpClient().execute(req)) { + if (response.isSuccessful()) { + var content = response.body().string(); + return parseModels(content); + } else { + throw new HttpException(response.code(), response.message()); + } + } + } + + private List parseModels(String content) { + List models = new ArrayList<>(); + var json = new JSONObject(content); + var users = json.getJSONArray("users"); + for (var i = 0; i < users.length(); i++) { + var modelJson = users.getJSONObject(i); + var username = modelJson.optString("username"); + Cam4Model model = site.createModel(username); + model.setPreview(modelJson.optString("snapshotImageLink")); + model.setOnlineStateByShowType(modelJson.optString("showType")); + model.setDescription(modelJson.optString("statusMessage")); + if (modelJson.has("hlsPreviewUrl")) { + model.setPlaylistUrl(modelJson.getString("hlsPreviewUrl")); + } + models.add(model); + } + return models; + } + public void setShowOnline(boolean online) { this.showOnline = online; } diff --git a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java index e9eb0149..059e8e95 100644 --- a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java @@ -10,7 +10,7 @@ import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; -public class Cam4TabProvider extends TabProvider { +public class Cam4TabProvider implements TabProvider { private Cam4 cam4; private Recorder recorder; @@ -44,8 +44,8 @@ public class Cam4TabProvider extends TabProvider { } private Tab createTab(String name, String url) { - Cam4UpdateService updateService = new Cam4UpdateService(url, false, cam4); - ThumbOverviewTab tab = new ThumbOverviewTab(name, updateService, cam4); + var updateService = new Cam4UpdateService(url, false, cam4); + var tab = new ThumbOverviewTab(name, updateService, cam4); tab.setRecorder(recorder); return tab; } diff --git a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4UpdateService.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4UpdateService.java index dc00deec..8d5c13f7 100644 --- a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4UpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4UpdateService.java @@ -13,7 +13,6 @@ import java.util.concurrent.Executors; import org.json.JSONObject; import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,7 +27,6 @@ import ctbrec.ui.SiteUiFactory; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; -import okhttp3.Response; public class Cam4UpdateService extends PaginatedScheduledService { @@ -43,7 +41,7 @@ public class Cam4UpdateService extends PaginatedScheduledService { this.loginRequired = loginRequired; ExecutorService executor = Executors.newSingleThreadExecutor(r -> { - Thread t = new Thread(r); + var t = new Thread(r); t.setDaemon(true); t.setName("ThumbOverviewTab UpdateService"); return t; @@ -64,35 +62,14 @@ public class Cam4UpdateService extends PaginatedScheduledService { if (loginRequired) { SiteUiFactory.getUi(site).login(); } - Request request = new Request.Builder() + var request = new Request.Builder() .url(pageUrl) .header(ACCEPT_LANGUAGE, Locale.ENGLISH.getLanguage()) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .build(); - try (Response response = site.getHttpClient().execute(request)) { + try (var response = site.getHttpClient().execute(request)) { if (response.isSuccessful()) { - JSONObject json = new JSONObject(response.body().string()); - String html = json.getString("html"); - Elements profilesBoxes = HtmlParser.getTags(html, "div[class~=profileDataBox]"); - List models = new ArrayList<>(profilesBoxes.size()); - for (Element profileBox : profilesBoxes) { - String boxHtml = profileBox.html(); - Element profileLink = HtmlParser.getTag(boxHtml, "a.profile-preview"); - String path = profileLink.attr("href"); - String slug = path.substring(1); - Cam4Model model = site.createModel(slug); - String playlistUrl = profileLink.attr("data-hls-preview-url"); - model.setDisplayName(HtmlParser.getText(boxHtml, "div.profileBoxTitle a").trim()); - model.setPlaylistUrl(playlistUrl); - model.setPreview("https://snapshots.xcdnpro.com/thumbnails/" + model.getName() + "?s=" + System.currentTimeMillis()); - model.setDescription(parseDesription(boxHtml)); - model.setOnlineState(ONLINE); - if (boxHtml.contains("In private show")) { - model.setOnlineState(PRIVATE); - } - models.add(model); - } - return models; + return parseModels(response.body().string()); } else { throw new HttpException(response.code(), response.message()); } @@ -100,17 +77,43 @@ public class Cam4UpdateService extends PaginatedScheduledService { } } - private String parseDesription(String boxHtml) { - try { - return HtmlParser.getText(boxHtml, "div[class~=statusMsg2]"); - } catch(Exception e) { - LOG.trace("Couldn't parse description for room"); - } - return ""; - } }; } + private List parseModels(String body) { + var json = new JSONObject(body); + var html = json.getString("html"); + var profilesBoxes = HtmlParser.getTags(html, "div[class~=profileDataBox]"); + List models = new ArrayList<>(profilesBoxes.size()); + for (Element profileBox : profilesBoxes) { + String boxHtml = profileBox.html(); + Element profileLink = HtmlParser.getTag(boxHtml, "a.profile-preview"); + String path = profileLink.attr("href"); + var slug = path.substring(1); + Cam4Model model = site.createModel(slug); + String playlistUrl = profileLink.attr("data-hls-preview-url"); + model.setDisplayName(HtmlParser.getText(boxHtml, "div.profileBoxTitle a").trim()); + model.setPlaylistUrl(playlistUrl); + model.setPreview("https://snapshots.xcdnpro.com/thumbnails/" + model.getName() + "?s=" + System.currentTimeMillis()); + model.setDescription(parseDesription(boxHtml)); + model.setOnlineState(ONLINE); + if (boxHtml.contains("In private show")) { + model.setOnlineState(PRIVATE); + } + models.add(model); + } + return models; + } + + private String parseDesription(String boxHtml) { + try { + return HtmlParser.getText(boxHtml, "div[class~=statusMsg2]"); + } catch(Exception e) { + LOG.trace("Couldn't parse description for room"); + } + return ""; + } + public void setUrl(String url) { this.url = url; } diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaConfigUI.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaConfigUI.java index 8cdc5932..564b3492 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaConfigUI.java @@ -1,7 +1,6 @@ package ctbrec.ui.sites.camsoda; import ctbrec.Config; -import ctbrec.Settings; import ctbrec.sites.camsoda.Camsoda; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; @@ -25,15 +24,15 @@ public class CamsodaConfigUI extends AbstractConfigUI { @Override public Parent createConfigPanel() { - GridPane layout = SettingsTab.createGridLayout(); - Settings settings = Config.getInstance().getSettings(); + var layout = SettingsTab.createGridLayout(); + var settings = Config.getInstance().getSettings(); - int row = 0; - Label l = new Label("Active"); + var row = 0; + var l = new Label("Active"); layout.add(l, 0, row); - CheckBox enabled = new CheckBox(); + var enabled = new CheckBox(); enabled.setSelected(!settings.disabledSites.contains(camsoda.getName())); - enabled.setOnAction((e) -> { + enabled.setOnAction(e -> { if(enabled.isSelected()) { settings.disabledSites.remove(camsoda.getName()); } else { @@ -45,7 +44,7 @@ public class CamsodaConfigUI extends AbstractConfigUI { layout.add(enabled, 1, row++); layout.add(new Label("CamSoda User"), 0, row); - TextField username = new TextField(Config.getInstance().getSettings().camsodaUsername); + var username = new TextField(Config.getInstance().getSettings().camsodaUsername); username.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().camsodaUsername)) { Config.getInstance().getSettings().camsodaUsername = username.getText(); @@ -59,7 +58,7 @@ public class CamsodaConfigUI extends AbstractConfigUI { layout.add(username, 1, row++); layout.add(new Label("CamSoda Password"), 0, row); - PasswordField password = new PasswordField(); + var password = new PasswordField(); password.setText(Config.getInstance().getSettings().camsodaPassword); password.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().camsodaPassword)) { @@ -73,9 +72,9 @@ public class CamsodaConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); - Button createAccount = new Button("Create new Account"); - createAccount.setOnAction((e) -> DesktopIntegration.open(camsoda.getAffiliateLink())); - layout.add(createAccount, 1, row++); + var createAccount = new Button("Create new Account"); + createAccount.setOnAction(e -> DesktopIntegration.open(camsoda.getAffiliateLink())); + layout.add(createAccount, 1, row); GridPane.setColumnSpan(createAccount, 2); GridPane.setMargin(username, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(password, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaFollowedTab.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaFollowedTab.java index f3872970..d72e5798 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaFollowedTab.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaFollowedTab.java @@ -34,10 +34,10 @@ public class CamsodaFollowedTab extends ThumbOverviewTab implements FollowedTab } private void addOnlineOfflineSelector() { - ToggleGroup group = new ToggleGroup(); - RadioButton online = new RadioButton("online"); + var group = new ToggleGroup(); + var online = new RadioButton("online"); online.setToggleGroup(group); - RadioButton offline = new RadioButton("offline"); + var offline = new RadioButton("offline"); offline.setToggleGroup(group); pagination.getChildren().add(online); pagination.getChildren().add(offline); @@ -59,7 +59,7 @@ public class CamsodaFollowedTab extends ThumbOverviewTab implements FollowedTab @Override protected void onFail(WorkerStateEvent event) { - String msg = ""; + var msg = ""; if (event.getSource().getException() != null) { msg = ": " + event.getSource().getException().getMessage(); } @@ -75,10 +75,8 @@ public class CamsodaFollowedTab extends ThumbOverviewTab implements FollowedTab public void setScene(Scene scene) { scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> { - if (this.isSelected()) { - if (event.getCode() == KeyCode.DELETE) { - follow(selectedThumbCells, false); - } + if (this.isSelected() && event.getCode() == KeyCode.DELETE) { + follow(selectedThumbCells, false); } }); } diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java index 206eb205..7ee78219 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java @@ -8,13 +8,12 @@ import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; -import java.time.temporal.TemporalAccessor; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Optional; -import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,7 +68,7 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { showList.setPadding(new Insets(5)); showList.setHgap(5); showList.setVgap(5); - ProgressIndicator progressIndicator = new ProgressIndicator(); + var progressIndicator = new ProgressIndicator(); progressIndicator.setPrefSize(100, 100); setContent(progressIndicator); setClosable(false); @@ -81,41 +80,7 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { Task> task = new Task>() { @Override protected List call() throws Exception { - String url = camsoda.getBaseUrl() + "/api/v1/user/model_shows"; - Request req = new Request.Builder().url(url).build(); - try(Response response = camsoda.getHttpClient().execute(req)) { - if (response.isSuccessful()) { - JSONObject json = new JSONObject(response.body().string()); - if (json.optInt("success") == 1) { - List boxes = new ArrayList<>(); - JSONArray results = json.getJSONArray("results"); - for (int i = 0; i < results.length(); i++) { - JSONObject result = results.getJSONObject(i); - String modelUrl = camsoda.getBaseUrl() + result.getString("url"); - String name = modelUrl.substring(modelUrl.lastIndexOf('/') + 1); - Model model = camsoda.createModel(name); - ZonedDateTime startTime = parseUtcTime(result.getString("start")); - ZonedDateTime endTime = parseUtcTime(result.getString("end")); - boxes.add(new ShowBox(model, startTime, endTime)); - } - return boxes; - } else { - LOG.error("Couldn't load upcoming camsoda shows. Unexpected response: {}", json); - showErrorDialog("Oh no!", "Couldn't load upcoming CamSoda shows", "Got an unexpected response from server"); - } - } else { - showErrorDialog("Oh no!", "Couldn't load upcoming CamSoda shows", "Got an unexpected response from server"); - LOG.error("Couldn't load upcoming camsoda shows: {} {}", response.code(), response.message()); - } - } - return Collections.emptyList(); - } - - private ZonedDateTime parseUtcTime(String string) { - DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; - TemporalAccessor ta = formatter.parse(string.replace(" UTC", "")); - Instant instant = Instant.from(ta); - return ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()); + return loadShows(); } @Override @@ -125,11 +90,14 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { try { List boxes = get(); showList.getChildren().clear(); - int index = 0; + var index = 0; for (ShowBox showBox : boxes) { showList.add(showBox, index % 2, index++ / 2); GridPane.setMargin(showBox, new Insets(20, 20, 0, 20)); } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + LOG.error("Couldn't load upcoming camsoda shows", e); } catch (Exception e) { LOG.error("Couldn't load upcoming camsoda shows", e); } @@ -140,6 +108,44 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { GlobalThreadPool.submit(task); } + private List loadShows() throws IOException { + String url = camsoda.getBaseUrl() + "/api/v1/user/model_shows"; + Request req = new Request.Builder().url(url).build(); + try(var response = camsoda.getHttpClient().execute(req)) { + if (response.isSuccessful()) { + var json = new JSONObject(response.body().string()); + if (json.optInt("success") == 1) { + List boxes = new ArrayList<>(); + var results = json.getJSONArray("results"); + for (var i = 0; i < results.length(); i++) { + var result = results.getJSONObject(i); + var modelUrl = camsoda.getBaseUrl() + result.getString("url"); + var name = modelUrl.substring(modelUrl.lastIndexOf('/') + 1); + var model = camsoda.createModel(name); + ZonedDateTime startTime = parseUtcTime(result.getString("start")); + ZonedDateTime endTime = parseUtcTime(result.getString("end")); + boxes.add(new ShowBox(model, startTime, endTime)); + } + return boxes; + } else { + LOG.error("Couldn't load upcoming camsoda shows. Unexpected response: {}", json); + showErrorDialog("Oh no!", "Couldn't load upcoming CamSoda shows", "Got an unexpected response from server"); + } + } else { + showErrorDialog("Oh no!", "Couldn't load upcoming CamSoda shows", "Got an unexpected response from server"); + LOG.error("Couldn't load upcoming camsoda shows: {} {}", response.code(), response.message()); + } + } + return Collections.emptyList(); + } + + private ZonedDateTime parseUtcTime(String string) { + var formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + var ta = formatter.parse(string.replace(" UTC", "")); + var instant = Instant.from(ta); + return ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()); + } + @Override public void deselected() { // nothing to do @@ -165,31 +171,31 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { setPrefHeight(268); setContent(root); - ImageView thumb = new ImageView(); + var thumb = new ImageView(); thumb.setPreserveRatio(true); thumb.setFitHeight(thumbSize); loadImage(model, thumb); root.setLeft(new ProgressIndicator()); BorderPane.setMargin(thumb, new Insets(10, 30, 10, 10)); - DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM, FormatStyle.MEDIUM); - GridPane grid = new GridPane(); + var formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM, FormatStyle.MEDIUM); + var grid = new GridPane(); grid.add(createLabel("Start", true), 0, 0); grid.add(createLabel(formatter.format(startTime), false), 1, 0); grid.add(createLabel("End", true), 0, 1); grid.add(createLabel(formatter.format(endTime), false), 1, 1); - Button record = new Button("Record Model"); - record.setTooltip(new Tooltip(record.getText())); - record.setOnAction(evt -> record(model)); - grid.add(record, 1, 2); - GridPane.setMargin(record, new Insets(10)); - Button follow = new Button("Follow"); + var recordButton = new Button("Record Model"); + recordButton.setTooltip(new Tooltip(recordButton.getText())); + recordButton.setOnAction(evt -> recordModel(model)); + grid.add(recordButton, 1, 2); + GridPane.setMargin(recordButton, new Insets(10)); + var follow = new Button("Follow"); follow.setTooltip(new Tooltip(follow.getText())); follow.setOnAction(evt -> follow(model)); grid.add(follow, 1, 3); GridPane.setMargin(follow, new Insets(10)); - Button openInBrowser = new Button("Open in Browser"); + var openInBrowser = new Button("Open in Browser"); openInBrowser.setTooltip(new Tooltip(openInBrowser.getText())); openInBrowser.setOnAction(evt -> DesktopIntegration.open(model.getUrl())); grid.add(openInBrowser, 1, 4); @@ -197,7 +203,7 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { root.setCenter(grid); loadImage(model, thumb); - record.minWidthProperty().bind(openInBrowser.widthProperty()); + recordButton.minWidthProperty().bind(openInBrowser.widthProperty()); follow.minWidthProperty().bind(openInBrowser.widthProperty()); } @@ -216,7 +222,7 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { }); } - private void record(Model model) { + private void recordModel(Model model) { setCursor(Cursor.WAIT); GlobalThreadPool.submit(() -> { try { @@ -233,47 +239,56 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { GlobalThreadPool.submit(() -> { try { String url = camsoda.getBaseUrl() + "/api/v1/user/" + model.getName(); - Request detailRequest = new Request.Builder().url(url).build(); - Response resp = camsoda.getHttpClient().execute(detailRequest); - if (resp.isSuccessful()) { - JSONObject json = new JSONObject(resp.body().string()); - if (json.optBoolean("status") && json.has("user")) { - JSONObject user = json.getJSONObject("user"); - if (user.has("settings")) { - JSONObject settings = user.getJSONObject("settings"); - String imageUrl; - if(Objects.equals(System.getenv("CTBREC_DEV"), "1")) { - imageUrl = getClass().getResource("/image_not_found.png").toString(); - } else { - if (settings.has("offline_picture")) { - imageUrl = settings.getString("offline_picture"); - } else { - imageUrl = "https:" + user.getString("thumb"); - } - } - Platform.runLater(() -> { - Image img = new Image(imageUrl, 1000, thumbSize, true, true, true); - img.progressProperty().addListener((ChangeListener) (observable, oldValue, newValue) -> { - if (newValue.doubleValue() == 1.0) { - thumb.setImage(img); - root.setLeft(thumb); - } - }); - }); - } + var detailRequest = new Request.Builder().url(url).build(); + try (Response resp = camsoda.getHttpClient().execute(detailRequest)) { + if (resp.isSuccessful()) { + parseImageUrl(resp.body().string()).ifPresent(imageUrl -> updateImageView(thumb, imageUrl)); } } - resp.close(); } catch (Exception e) { LOG.error("Couldn't load model details", e); } }); } + private void updateImageView(ImageView view, String imageUrl) { + Platform.runLater(() -> { + var img = new Image(imageUrl, 1000, thumbSize, true, true, true); + img.progressProperty().addListener((ChangeListener) (observable, oldValue, newValue) -> { + if (newValue.doubleValue() == 1.0) { + view.setImage(img); + root.setLeft(view); + } + }); + }); + } + + private Optional parseImageUrl(String body) { + var json = new JSONObject(body); + if (json.optBoolean("status") && json.has("user")) { + var user = json.getJSONObject("user"); + if (user.has("settings")) { + var settings = user.getJSONObject("settings"); + String imageUrl; + if (Objects.equals(System.getenv("CTBREC_DEV"), "1")) { + imageUrl = getClass().getResource("/image_not_found.png").toString(); + } else { + if (settings.has("offline_picture")) { + imageUrl = settings.getString("offline_picture"); + } else { + imageUrl = "https:" + user.getString("thumb"); + } + } + return Optional.of(imageUrl); + } + } + return Optional.empty(); + } + private Node createLabel(String string, boolean bold) { - Label label = new Label(string); + var label = new Label(string); label.setPadding(new Insets(10)); - Font def = Font.getDefault(); + var def = Font.getDefault(); label.setFont(Font.font(def.getFamily(), bold ? FontWeight.BOLD : FontWeight.NORMAL, 16)); return label; } diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaSiteUi.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaSiteUi.java index 9c923af4..943b934d 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaSiteUi.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaSiteUi.java @@ -34,58 +34,4 @@ public class CamsodaSiteUi extends AbstractSiteUi { boolean automaticLogin = camsoda.login(); return automaticLogin; } - - // @SuppressWarnings("unused") - // private boolean loginWithDialog() throws IOException { - // BlockingQueue queue = new LinkedBlockingQueue<>(); - // - // Runnable showDialog = () -> { - // // login with external browser - // CamsodaLoginDialog loginDialog = new CamsodaLoginDialog(); - // - // // transfer cookies from WebView to OkHttp cookie jar - // transferCookies(loginDialog); - // - // try { - // queue.put(true); - // } catch (InterruptedException e) { - // LOG.error("Error while signaling termination", e); - // } - // }; - // - // if(Platform.isFxApplicationThread()) { - // showDialog.run(); - // } else { - // Platform.runLater(showDialog); - // try { - // queue.take(); - // } catch (InterruptedException e) { - // LOG.error("Error while waiting for login dialog to close", e); - // throw new IOException(e); - // } - // } - // - // CamsodaHttpClient httpClient = (CamsodaHttpClient)camsoda.getHttpClient(); - // boolean loggedIn = httpClient.checkLoginSuccess(); - // return loggedIn; - // } - // - // private void transferCookies(CamsodaLoginDialog loginDialog) { - // HttpUrl redirectedUrl = HttpUrl.parse(loginDialog.getUrl()); - // List cookies = new ArrayList<>(); - // for (HttpCookie webViewCookie : loginDialog.getCookies()) { - // Cookie cookie = Cookie.parse(redirectedUrl, webViewCookie.toString()); - // cookies.add(cookie); - // } - // camsoda.getHttpClient().getCookieJar().saveFromResponse(redirectedUrl, cookies); - // - // HttpUrl origUrl = HttpUrl.parse(Camsoda.BASE_URI); - // cookies = new ArrayList<>(); - // for (HttpCookie webViewCookie : loginDialog.getCookies()) { - // Cookie cookie = Cookie.parse(origUrl, webViewCookie.toString()); - // cookies.add(cookie); - // } - // camsoda.getHttpClient().getCookieJar().saveFromResponse(origUrl, cookies); - // } - } diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java index 8a460a08..396fead3 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java @@ -15,7 +15,7 @@ import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; -public class CamsodaTabProvider extends TabProvider { +public class CamsodaTabProvider implements TabProvider { private static final String API_URL = BASE_URI + "/api/v1/browse/online"; private Camsoda camsoda; @@ -37,7 +37,6 @@ public class CamsodaTabProvider extends TabProvider { tabs.add(createTab("Male", API_URL, m -> Objects.equals("m", m.getGender()))); tabs.add(createTab("Couples", API_URL, m -> Objects.equals("c", m.getGender()))); tabs.add(createTab("Trans", API_URL, m -> Objects.equals("t", m.getGender()))); - //tabs.add(createTab("#petite", BASE_URI + "/api/v1/browse/tag-petite", m -> true)); followedTab.setRecorder(recorder); followedTab.setScene(scene); tabs.add(followedTab); @@ -51,8 +50,8 @@ public class CamsodaTabProvider extends TabProvider { } private Tab createTab(String title, String url, Predicate filter) { - CamsodaUpdateService updateService = new CamsodaUpdateService(url, false, camsoda, filter); - ThumbOverviewTab tab = new ThumbOverviewTab(title, updateService, camsoda); + var updateService = new CamsodaUpdateService(url, false, camsoda, filter); + var tab = new ThumbOverviewTab(title, updateService, camsoda); tab.setRecorder(recorder); return tab; } diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java index 27e90dd6..5d0269b1 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java @@ -25,7 +25,6 @@ import ctbrec.ui.SiteUiFactory; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; -import okhttp3.Response; public class CamsodaUpdateService extends PaginatedScheduledService { @@ -53,7 +52,7 @@ public class CamsodaUpdateService extends PaginatedScheduledService { return loadOnlineModels().stream() .sorted((m1,m2) -> (int)(m2.getSortOrder() - m1.getSortOrder())) .filter(filter) - .skip( (page-1) * modelsPerPage) + .skip( (page-1) * (long)modelsPerPage) .limit(modelsPerPage) .collect(Collectors.toList()); } @@ -61,71 +60,17 @@ public class CamsodaUpdateService extends PaginatedScheduledService { } protected List loadOnlineModels() throws IOException { - List models = new ArrayList<>(); - if(loginRequired && StringUtil.isBlank(ctbrec.Config.getInstance().getSettings().camsodaUsername)) { + if (loginRequired && StringUtil.isBlank(ctbrec.Config.getInstance().getSettings().camsodaUsername)) { return Collections.emptyList(); } else { LOG.debug("Fetching page {}", url); - if(loginRequired) { + if (loginRequired) { SiteUiFactory.getUi(camsoda).login(); } - Request request = new Request.Builder().url(url).build(); - try (Response response = camsoda.getHttpClient().execute(request)) { + var request = new Request.Builder().url(url).build(); + try (var response = camsoda.getHttpClient().execute(request)) { if (response.isSuccessful()) { - String body = response.body().string(); - JSONObject json = new JSONObject(body); - JSONArray template = json.getJSONArray("template"); - JSONArray results = json.getJSONArray("results"); - for (int i = 0; i < results.length(); i++) { - JSONObject result = results.getJSONObject(i); - Object templateObject = result.get("tpl"); - CamsodaModel model; - try { - if (templateObject instanceof JSONObject) { - JSONObject tpl = (JSONObject) templateObject; - String name = tpl.getString(Integer.toString(getTemplateIndex(template, "username"))); - model = (CamsodaModel) camsoda.createModel(name); - model.setDescription(tpl.getString(Integer.toString(getTemplateIndex(template, "subject_html")))); - model.setSortOrder(tpl.getFloat(Integer.toString(getTemplateIndex(template, "sort_value")))); - model.setNew(result.optBoolean("new")); - model.setGender(tpl.getString(Integer.toString(getTemplateIndex(template, "gender")))); - String preview = "https:" + tpl.getString(Integer.toString(getTemplateIndex(template, "thumb"))); - model.setPreview(preview); - String displayName = tpl.getString(Integer.toString(getTemplateIndex(template, "display_name"))); - model.setDisplayName(displayName.replaceAll("[^a-zA-Z0-9]", "")); - if (model.getDisplayName().isBlank()) { - model.setDisplayName(name); - } - model.setOnlineState(tpl.getString(Integer.toString(getTemplateIndex(template, "stream_name"))).isEmpty() ? OFFLINE : ONLINE); - try { - String statusIndex = Integer.toString(getTemplateIndex(template, "status")); - if (tpl.has(statusIndex)) { - model.setOnlineStateByStatus(tpl.getString(statusIndex)); - } - } catch (NoSuchElementException e) { - } - models.add(model); - } else if (templateObject instanceof JSONArray) { - JSONArray tpl = (JSONArray) templateObject; - String name = tpl.getString(getTemplateIndex(template, "username")); - model = (CamsodaModel) camsoda.createModel(name); - model.setSortOrder(tpl.getFloat(getTemplateIndex(template, "sort_value"))); - model.setDescription(tpl.getString(getTemplateIndex(template, "subject_html"))); - String preview = "https:" + tpl.getString(getTemplateIndex(template, "thumb")); - model.setPreview(preview); - model.setOnlineStateByStatus(tpl.getString(getTemplateIndex(template, "status"))); - String displayName = tpl.getString(getTemplateIndex(template, "display_name")); - model.setDisplayName(displayName.replaceAll("[^a-zA-Z0-9]", "")); - if (model.getDisplayName().isBlank()) { - model.setDisplayName(name); - } - models.add(model); - } - } catch (Exception e) { - LOG.warn("Couldn't parse one of the models: {}", result, e); - } - } - return models; + return parseModels(response.body().string()); } else { throw new HttpException(response.code(), response.message()); } @@ -133,10 +78,79 @@ public class CamsodaUpdateService extends PaginatedScheduledService { } } + private List parseModels(String body) { + List models = new ArrayList<>(); + var json = new JSONObject(body); + var template = json.getJSONArray("template"); + var results = json.getJSONArray("results"); + for (var i = 0; i < results.length(); i++) { + var result = results.getJSONObject(i); + var templateObject = result.get("tpl"); + try { + if (templateObject instanceof JSONObject) { + parseModelFromObject(result, templateObject, template, models); + } else if (templateObject instanceof JSONArray) { + parseModelFromArray(templateObject, template, models); + } + } catch (Exception e) { + LOG.warn("Couldn't parse one of the models: {}", result, e); + } + } + return models; + } + + private void parseModelFromArray(Object templateObject, JSONArray template, List models) { + var tpl = (JSONArray) templateObject; + var name = tpl.getString(getTemplateIndex(template, "username")); + CamsodaModel model = (CamsodaModel) camsoda.createModel(name); + model.setSortOrder(tpl.getFloat(getTemplateIndex(template, "sort_value"))); + model.setDescription(tpl.getString(getTemplateIndex(template, "subject_html"))); + var preview = "https:" + tpl.getString(getTemplateIndex(template, "thumb")); + model.setPreview(preview); + model.setOnlineStateByStatus(tpl.getString(getTemplateIndex(template, "status"))); + var displayName = tpl.getString(getTemplateIndex(template, "display_name")); + model.setDisplayName(displayName.replaceAll("[^a-zA-Z0-9]", "")); + if (model.getDisplayName().isBlank()) { + model.setDisplayName(name); + } + models.add(model); + } + + private void parseModelFromObject(JSONObject result, Object templateObject, JSONArray template, List models) { + var tpl = (JSONObject) templateObject; + var name = tpl.getString(Integer.toString(getTemplateIndex(template, "username"))); + CamsodaModel model = (CamsodaModel) camsoda.createModel(name); + model.setDescription(tpl.getString(Integer.toString(getTemplateIndex(template, "subject_html")))); + model.setSortOrder(tpl.getFloat(Integer.toString(getTemplateIndex(template, "sort_value")))); + model.setNew(result.optBoolean("new")); + model.setGender(tpl.getString(Integer.toString(getTemplateIndex(template, "gender")))); + var preview = "https:" + tpl.getString(Integer.toString(getTemplateIndex(template, "thumb"))); + model.setPreview(preview); + var displayName = tpl.getString(Integer.toString(getTemplateIndex(template, "display_name"))); + model.setDisplayName(displayName.replaceAll("[^a-zA-Z0-9]", "")); + if (model.getDisplayName().isBlank()) { + model.setDisplayName(name); + } + model.setOnlineState(tpl.getString(Integer.toString(getTemplateIndex(template, "stream_name"))).isEmpty() ? OFFLINE : ONLINE); + parseStatus(template, tpl, model); + models.add(model); + } + + private void parseStatus(JSONArray template, JSONObject tpl, CamsodaModel model) { + try { + var statusIndex = Integer.toString(getTemplateIndex(template, "status")); + if (tpl.has(statusIndex)) { + model.setOnlineStateByStatus(tpl.getString(statusIndex)); + } + } catch (NoSuchElementException e) { + // that's ok + } + } + private int getTemplateIndex(JSONArray template, String string) { - for (int i = 0; i < template.length(); i++) { - String s = template.getString(i); - if(Objects.equals(s, string)) { + for (var i = 0; i < template.length(); i++) { + var s = template.getString(i); + if (Objects.equals(s, string)) { return i; } } diff --git a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateConfigUi.java b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateConfigUi.java index 445d3a77..3a6eeead 100644 --- a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateConfigUi.java +++ b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateConfigUi.java @@ -1,7 +1,6 @@ package ctbrec.ui.sites.chaturbate; import ctbrec.Config; -import ctbrec.Settings; import ctbrec.sites.chaturbate.Chaturbate; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; @@ -25,15 +24,15 @@ public class ChaturbateConfigUi extends AbstractConfigUI { @Override public Parent createConfigPanel() { - Settings settings = Config.getInstance().getSettings(); + var settings = Config.getInstance().getSettings(); GridPane layout = SettingsTab.createGridLayout(); - int row = 0; - Label l = new Label("Active"); + var row = 0; + var l = new Label("Active"); layout.add(l, 0, row); - CheckBox enabled = new CheckBox(); + var enabled = new CheckBox(); enabled.setSelected(!settings.disabledSites.contains(chaturbate.getName())); - enabled.setOnAction((e) -> { + enabled.setOnAction(e -> { if(enabled.isSelected()) { settings.disabledSites.remove(chaturbate.getName()); } else { @@ -45,7 +44,7 @@ public class ChaturbateConfigUi extends AbstractConfigUI { layout.add(enabled, 1, row++); layout.add(new Label("Chaturbate User"), 0, row); - TextField username = new TextField(Config.getInstance().getSettings().chaturbateUsername); + var username = new TextField(Config.getInstance().getSettings().chaturbateUsername); username.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().chaturbateUsername)) { Config.getInstance().getSettings().chaturbateUsername = n; @@ -59,7 +58,7 @@ public class ChaturbateConfigUi extends AbstractConfigUI { layout.add(username, 1, row++); layout.add(new Label("Chaturbate Password"), 0, row); - PasswordField password = new PasswordField(); + var password = new PasswordField(); password.setText(Config.getInstance().getSettings().chaturbatePassword); password.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().chaturbatePassword)) { @@ -74,7 +73,7 @@ public class ChaturbateConfigUi extends AbstractConfigUI { layout.add(password, 1, row++); layout.add(new Label("Chaturbate Base URL"), 0, row); - TextField baseUrl = new TextField(); + var baseUrl = new TextField(); baseUrl.setText(Config.getInstance().getSettings().chaturbateBaseUrl); baseUrl.textProperty().addListener((ob, o, n) -> { Config.getInstance().getSettings().chaturbateBaseUrl = baseUrl.getText(); @@ -85,9 +84,9 @@ public class ChaturbateConfigUi extends AbstractConfigUI { GridPane.setColumnSpan(baseUrl, 2); layout.add(baseUrl, 1, row++); - Button createAccount = new Button("Create new Account"); - createAccount.setOnAction((e) -> DesktopIntegration.open(Chaturbate.REGISTRATION_LINK)); - layout.add(createAccount, 1, row++); + var createAccount = new Button("Create new Account"); + createAccount.setOnAction(e -> DesktopIntegration.open(Chaturbate.REGISTRATION_LINK)); + layout.add(createAccount, 1, row); GridPane.setColumnSpan(createAccount, 2); GridPane.setMargin(username, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(password, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); diff --git a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateFollowedTab.java b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateFollowedTab.java index 952eeacf..04c47c99 100644 --- a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateFollowedTab.java +++ b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateFollowedTab.java @@ -34,17 +34,17 @@ public class ChaturbateFollowedTab extends ThumbOverviewTab implements FollowedT } private void addOnlineOfflineSelector() { - ToggleGroup group = new ToggleGroup(); - RadioButton online = new RadioButton("online"); + var group = new ToggleGroup(); + var online = new RadioButton("online"); online.setToggleGroup(group); - RadioButton offline = new RadioButton("offline"); + var offline = new RadioButton("offline"); offline.setToggleGroup(group); pagination.getChildren().add(online); pagination.getChildren().add(offline); HBox.setMargin(online, new Insets(5,5,5,40)); HBox.setMargin(offline, new Insets(5,5,5,5)); online.setSelected(true); - group.selectedToggleProperty().addListener((e) -> { + group.selectedToggleProperty().addListener(e -> { if(online.isSelected()) { ((ChaturbateUpdateService)updateService).setUrl(onlineUrl); } else { @@ -75,10 +75,8 @@ public class ChaturbateFollowedTab extends ThumbOverviewTab implements FollowedT public void setScene(Scene scene) { scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> { - if(this.isSelected()) { - if(event.getCode() == KeyCode.DELETE) { - follow(selectedThumbCells, false); - } + if (this.isSelected() && event.getCode() == KeyCode.DELETE) { + follow(selectedThumbCells, false); } }); } diff --git a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java index 55aab26e..d2ee6251 100644 --- a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java @@ -10,7 +10,7 @@ import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; -public class ChaturbateTabProvider extends TabProvider { +public class ChaturbateTabProvider implements TabProvider { private Chaturbate chaturbate; private Recorder recorder; @@ -44,8 +44,8 @@ public class ChaturbateTabProvider extends TabProvider { } private Tab createTab(String title, String url) { - ChaturbateUpdateService updateService = new ChaturbateUpdateService(url, false, chaturbate); - ThumbOverviewTab tab = new ThumbOverviewTab(title, updateService, chaturbate); + var updateService = new ChaturbateUpdateService(url, false, chaturbate); + var tab = new ThumbOverviewTab(title, updateService, chaturbate); tab.setRecorder(recorder); tab.setImageAspectRatio(9.0 / 16.0); return tab; diff --git a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateUpdateService.java b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateUpdateService.java index 4e274d7b..bc02a013 100644 --- a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateUpdateService.java @@ -16,7 +16,6 @@ import ctbrec.ui.SiteUiFactory; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; -import okhttp3.Response; public class ChaturbateUpdateService extends PaginatedScheduledService { @@ -31,7 +30,7 @@ public class ChaturbateUpdateService extends PaginatedScheduledService { this.chaturbate = chaturbate; ExecutorService executor = Executors.newSingleThreadExecutor(r -> { - Thread t = new Thread(r); + var t = new Thread(r); t.setDaemon(true); t.setName("ThumbOverviewTab UpdateService"); return t; @@ -44,7 +43,7 @@ public class ChaturbateUpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - if(loginRequired && !chaturbate.credentialsAvailable()) { + if (loginRequired && !chaturbate.credentialsAvailable()) { return Collections.emptyList(); } else { String pageUrl = ChaturbateUpdateService.this.url + "?page="+page+"&keywords=&_=" + System.currentTimeMillis(); @@ -52,16 +51,15 @@ public class ChaturbateUpdateService extends PaginatedScheduledService { if(loginRequired) { SiteUiFactory.getUi(chaturbate).login(); } - Request request = new Request.Builder().url(pageUrl).build(); - Response response = chaturbate.getHttpClient().execute(request); - if (response.isSuccessful()) { - List models = ChaturbateModelParser.parseModels(chaturbate, response.body().string()); - response.close(); - return models; - } else { - int code = response.code(); - response.close(); - throw new IOException("HTTP status " + code); + var request = new Request.Builder().url(pageUrl).build(); + try (var response = chaturbate.getHttpClient().execute(request)) { + if (response.isSuccessful()) { + List models = ChaturbateModelParser.parseModels(chaturbate, response.body().string()); + return models; + } else { + int code = response.code(); + throw new IOException("HTTP status " + code); + } } } } diff --git a/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2FollowedTab.java b/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2FollowedTab.java index d7756872..3532fc1a 100644 --- a/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2FollowedTab.java +++ b/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2FollowedTab.java @@ -14,25 +14,19 @@ public class Fc2FollowedTab extends ThumbOverviewTab implements FollowedTab { super("Followed", new Fc2FollowedUpdateService(fc2live), fc2live); } - @Override - protected void createGui() { - super.createGui(); - //addOnlineOfflineSelector(); - } - @SuppressWarnings("unused") private void addOnlineOfflineSelector() { - ToggleGroup group = new ToggleGroup(); - RadioButton online = new RadioButton("online"); + var group = new ToggleGroup(); + var online = new RadioButton("online"); online.setToggleGroup(group); - RadioButton offline = new RadioButton("offline"); + var offline = new RadioButton("offline"); offline.setToggleGroup(group); pagination.getChildren().add(online); pagination.getChildren().add(offline); HBox.setMargin(online, new Insets(5,5,5,40)); HBox.setMargin(offline, new Insets(5,5,5,5)); online.setSelected(true); - group.selectedToggleProperty().addListener((e) -> { + group.selectedToggleProperty().addListener(e -> { ((Fc2FollowedUpdateService)updateService).setShowOnline(online.isSelected()); queue.clear(); updateService.restart(); diff --git a/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2FollowedUpdateService.java b/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2FollowedUpdateService.java index e0b752a8..6dbb7af3 100644 --- a/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2FollowedUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2FollowedUpdateService.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.json.JSONArray; import org.json.JSONObject; import ctbrec.Config; @@ -34,54 +33,58 @@ public class Fc2FollowedUpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - if(!fc2live.login()) { - throw new IOException("Login didn't work"); - } - - RequestBody body = new FormBody.Builder() - .add("mode", "list") - .add("page", Integer.toString(page - 1)) - .build(); - Request req = new Request.Builder() - .url(fc2live.getBaseUrl() + "/api/favoriteManager.php") - .header(REFERER, fc2live.getBaseUrl()) - .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .header("Content-Type", "application/x-www-form-urlencoded") - .post(body) - .build(); - try(Response resp = fc2live.getHttpClient().execute(req)) { - if(resp.isSuccessful()) { - List models = new ArrayList<>(); - String content = resp.body().string(); - JSONObject json = new JSONObject(content); - if(json.optInt("status") == 1) { - JSONArray data = json.getJSONArray("data"); - for (int i = 0; i < data.length(); i++) { - JSONObject m = data.getJSONObject(i); - Fc2Model model = (Fc2Model) fc2live.createModel(m.getString("name")); - model.setId(m.getString("id")); - model.setUrl(Fc2Live.BASE_URL + '/' + model.getId()); - String previewUrl = m.optString("icon"); - if(previewUrl == null || previewUrl.trim().isEmpty()) { - previewUrl = "https://live-storage.fc2.com/thumb/" + model.getId() + "/thumb.jpg"; - } - model.setPreview(previewUrl); - model.setDescription(""); - models.add(model); - } - return models; - } else { - throw new IOException("Request was not successful: " + json.toString()); - } - } else { - throw new HttpException(resp.code(), resp.message()); - } - } + return loadModels(); } }; } - public void setShowOnline(boolean online) { - //this.online = online; + private List loadModels() throws IOException { + if(!fc2live.login()) { + throw new IOException("Login didn't work"); + } + + RequestBody body = new FormBody.Builder() + .add("mode", "list") + .add("page", Integer.toString(page - 1)) + .build(); + Request req = new Request.Builder() + .url(fc2live.getBaseUrl() + "/api/favoriteManager.php") + .header(REFERER, fc2live.getBaseUrl()) + .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) + .header("Content-Type", "application/x-www-form-urlencoded") + .post(body) + .build(); + try (Response resp = fc2live.getHttpClient().execute(req)) { + if (resp.isSuccessful()) { + List models = new ArrayList<>(); + var content = resp.body().string(); + var json = new JSONObject(content); + if (json.optInt("status") == 1) { + var data = json.getJSONArray("data"); + for (var i = 0; i < data.length(); i++) { + var m = data.getJSONObject(i); + Fc2Model model = (Fc2Model) fc2live.createModel(m.getString("name")); + model.setId(m.getString("id")); + model.setUrl(Fc2Live.BASE_URL + '/' + model.getId()); + var previewUrl = m.optString("icon"); + if (previewUrl == null || previewUrl.trim().isEmpty()) { + previewUrl = "https://live-storage.fc2.com/thumb/" + model.getId() + "/thumb.jpg"; + } + model.setPreview(previewUrl); + model.setDescription(""); + models.add(model); + } + return models; + } else { + throw new IOException("Request was not successful: " + json.toString()); + } + } else { + throw new HttpException(resp.code(), resp.message()); + } + } + } + + public void setShowOnline(boolean yes) { + // not implemented yet } } diff --git a/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2LiveConfigUI.java b/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2LiveConfigUI.java index 15728e9b..37e127e1 100644 --- a/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2LiveConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2LiveConfigUI.java @@ -1,7 +1,6 @@ package ctbrec.ui.sites.fc2live; import ctbrec.Config; -import ctbrec.Settings; import ctbrec.sites.fc2live.Fc2Live; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; @@ -25,15 +24,15 @@ public class Fc2LiveConfigUI extends AbstractConfigUI { @Override public Parent createConfigPanel() { - GridPane layout = SettingsTab.createGridLayout(); - Settings settings = Config.getInstance().getSettings(); + var layout = SettingsTab.createGridLayout(); + var settings = Config.getInstance().getSettings(); - int row = 0; - Label l = new Label("Active"); + var row = 0; + var l = new Label("Active"); layout.add(l, 0, row); - CheckBox enabled = new CheckBox(); + var enabled = new CheckBox(); enabled.setSelected(!settings.disabledSites.contains(fc2live.getName())); - enabled.setOnAction((e) -> { + enabled.setOnAction(e -> { if(enabled.isSelected()) { settings.disabledSites.remove(fc2live.getName()); } else { @@ -45,7 +44,7 @@ public class Fc2LiveConfigUI extends AbstractConfigUI { layout.add(enabled, 1, row++); layout.add(new Label("FC2Live User"), 0, row); - TextField username = new TextField(settings.fc2liveUsername); + var username = new TextField(settings.fc2liveUsername); username.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().fc2liveUsername)) { Config.getInstance().getSettings().fc2liveUsername = username.getText(); @@ -59,7 +58,7 @@ public class Fc2LiveConfigUI extends AbstractConfigUI { layout.add(username, 1, row++); layout.add(new Label("FC2Live Password"), 0, row); - PasswordField password = new PasswordField(); + var password = new PasswordField(); password.setText(settings.fc2livePassword); password.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().fc2livePassword)) { @@ -73,9 +72,9 @@ public class Fc2LiveConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); - Button createAccount = new Button("Create new Account"); - createAccount.setOnAction((e) -> DesktopIntegration.open(fc2live.getAffiliateLink())); - layout.add(createAccount, 1, row++); + var createAccount = new Button("Create new Account"); + createAccount.setOnAction(e -> DesktopIntegration.open(fc2live.getAffiliateLink())); + layout.add(createAccount, 1, row); GridPane.setColumnSpan(createAccount, 2); GridPane.setMargin(username, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(password, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); diff --git a/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2TabProvider.java b/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2TabProvider.java index 51e4c5fe..e4e4bf16 100644 --- a/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2TabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2TabProvider.java @@ -9,7 +9,7 @@ import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; -public class Fc2TabProvider extends TabProvider { +public class Fc2TabProvider implements TabProvider { private Fc2Live fc2live; private Fc2FollowedTab followed; @@ -31,8 +31,8 @@ public class Fc2TabProvider extends TabProvider { } private Tab createTab(String title, String url) { - Fc2UpdateService updateService = new Fc2UpdateService(url, fc2live); - ThumbOverviewTab tab = new ThumbOverviewTab(title, updateService, fc2live); + var updateService = new Fc2UpdateService(url, fc2live); + var tab = new ThumbOverviewTab(title, updateService, fc2live); tab.setRecorder(fc2live.getRecorder()); return tab; } diff --git a/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2UpdateService.java b/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2UpdateService.java index 6fc40fa4..6a1893e7 100644 --- a/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2UpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/fc2live/Fc2UpdateService.java @@ -8,7 +8,6 @@ import java.util.List; import java.util.Locale; import java.util.stream.Collectors; -import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,7 +21,6 @@ import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; import okhttp3.RequestBody; -import okhttp3.Response; public class Fc2UpdateService extends PaginatedScheduledService { private static final Logger LOG = LoggerFactory.getLogger(Fc2UpdateService.class); @@ -41,7 +39,7 @@ public class Fc2UpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - RequestBody body = RequestBody.create(new byte[0]); + var body = RequestBody.create(new byte[0]); Request req = new Request.Builder() .url(url) .method("POST", body) @@ -52,31 +50,31 @@ public class Fc2UpdateService extends PaginatedScheduledService { .header(X_REQUESTED_WITH, XML_HTTP_REQUEST) .build(); LOG.debug("Fetching page {}", url); - try(Response resp = fc2live.getHttpClient().execute(req)) { - if(resp.isSuccessful()) { + try (var resp = fc2live.getHttpClient().execute(req)) { + if (resp.isSuccessful()) { List models = new ArrayList<>(); - String msg = resp.body().string(); - JSONObject json = new JSONObject(msg); - JSONArray channels = json.getJSONArray("channel"); - for (int i = 0; i < channels.length(); i++) { - JSONObject channel = channels.getJSONObject(i); + var msg = resp.body().string(); + var json = new JSONObject(msg); + var channels = json.getJSONArray("channel"); + for (var i = 0; i < channels.length(); i++) { + var channel = channels.getJSONObject(i); Fc2Model model = (Fc2Model) fc2live.createModel(channel.getString("name")); model.setId(channel.getString("id")); model.setUrl(Fc2Live.BASE_URL + '/' + model.getId()); - String previewUrl = channel.getString("image"); - if(previewUrl == null || previewUrl.trim().isEmpty()) { + var previewUrl = channel.getString("image"); + if (previewUrl == null || previewUrl.trim().isEmpty()) { previewUrl = getClass().getResource("/image_not_found.png").toString(); } model.setPreview(previewUrl); model.setDescription(channel.optString("title")); model.setViewerCount(channel.optInt("count")); - if(channel.getInt("login") == 0) { + if (channel.getInt("login") == 0) { models.add(model); } } return models.stream() .sorted((m1, m2) -> m2.getViewerCount() - m1.getViewerCount()) - .skip( (long)(page - 1) * modelsPerPage) + .skip((long) (page - 1) * modelsPerPage) .limit(modelsPerPage) .collect(Collectors.toList()); } else { diff --git a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeConfigUI.java b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeConfigUI.java index 1503978d..57893118 100644 --- a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeConfigUI.java @@ -1,7 +1,6 @@ package ctbrec.ui.sites.flirt4free; import ctbrec.Config; -import ctbrec.Settings; import ctbrec.sites.flirt4free.Flirt4Free; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; @@ -25,15 +24,15 @@ public class Flirt4FreeConfigUI extends AbstractConfigUI { @Override public Parent createConfigPanel() { - GridPane layout = SettingsTab.createGridLayout(); - Settings settings = Config.getInstance().getSettings(); + var layout = SettingsTab.createGridLayout(); + var settings = Config.getInstance().getSettings(); - int row = 0; - Label l = new Label("Active"); + var row = 0; + var l = new Label("Active"); layout.add(l, 0, row); - CheckBox enabled = new CheckBox(); + var enabled = new CheckBox(); enabled.setSelected(!settings.disabledSites.contains(flirt4free.getName())); - enabled.setOnAction((e) -> { + enabled.setOnAction(e -> { if(enabled.isSelected()) { settings.disabledSites.remove(flirt4free.getName()); } else { @@ -45,7 +44,7 @@ public class Flirt4FreeConfigUI extends AbstractConfigUI { layout.add(enabled, 1, row++); layout.add(new Label("Flirt4Free User"), 0, row); - TextField username = new TextField(settings.flirt4freeUsername); + var username = new TextField(settings.flirt4freeUsername); username.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().flirt4freeUsername)) { Config.getInstance().getSettings().flirt4freeUsername = username.getText(); @@ -59,7 +58,7 @@ public class Flirt4FreeConfigUI extends AbstractConfigUI { layout.add(username, 1, row++); layout.add(new Label("Flirt4Free Password"), 0, row); - PasswordField password = new PasswordField(); + var password = new PasswordField(); password.setText(settings.flirt4freePassword); password.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().flirt4freePassword)) { @@ -73,9 +72,9 @@ public class Flirt4FreeConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); - Button createAccount = new Button("Create new Account"); - createAccount.setOnAction((e) -> DesktopIntegration.open(flirt4free.getAffiliateLink())); - layout.add(createAccount, 1, row++); + var createAccount = new Button("Create new Account"); + createAccount.setOnAction(e -> DesktopIntegration.open(flirt4free.getAffiliateLink())); + layout.add(createAccount, 1, row); GridPane.setColumnSpan(createAccount, 2); GridPane.setMargin(username, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(password, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); diff --git a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeFavoritesTab.java b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeFavoritesTab.java index 58f0c68a..2ead54e3 100644 --- a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeFavoritesTab.java +++ b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeFavoritesTab.java @@ -15,10 +15,8 @@ public class Flirt4FreeFavoritesTab extends ThumbOverviewTab implements Followed public void setScene(Scene scene) { scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> { - if(this.isSelected()) { - if(event.getCode() == KeyCode.DELETE) { - follow(selectedThumbCells, false); - } + if (this.isSelected() && event.getCode() == KeyCode.DELETE) { + follow(selectedThumbCells, false); } }); } diff --git a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeFavoritesUpdateService.java b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeFavoritesUpdateService.java index 1b33180d..3b32fd50 100644 --- a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeFavoritesUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeFavoritesUpdateService.java @@ -21,7 +21,6 @@ import ctbrec.ui.SiteUiFactory; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; -import okhttp3.Response; public class Flirt4FreeFavoritesUpdateService extends PaginatedScheduledService { private Flirt4Free flirt4free; @@ -35,45 +34,49 @@ public class Flirt4FreeFavoritesUpdateService extends PaginatedScheduledService return new Task>() { @Override public List call() throws IOException { - List models = new ArrayList<>(); - String url = flirt4free.getBaseUrl() + "/my-account/secure/favorites.php?a=models&sort=online&status=all&pg=" + page; - SiteUiFactory.getUi(flirt4free).login(); - Request request = new Request.Builder() - .url(url) - .header(ACCEPT, "*/*") - .header(ACCEPT_LANGUAGE, Locale.ENGLISH.getLanguage()) - .header(REFERER, flirt4free.getBaseUrl()) - .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .build(); - try (Response response = flirt4free.getHttpClient().execute(request)) { - if (response.isSuccessful()) { - String body = response.body().string(); - Elements modelContainers = HtmlParser.getTags(body, "div.model-container"); - for (Element modelContainer : modelContainers) { - String modelHtml = modelContainer.html(); - Element bioLink = HtmlParser.getTag(modelHtml, "a.common-link"); - bioLink.setBaseUri(flirt4free.getBaseUrl()); - Flirt4FreeModel model = (Flirt4FreeModel) flirt4free.createModelFromUrl(bioLink.absUrl("href")); - Element img = HtmlParser.getTag(modelHtml, "a > img[alt]"); - model.setDisplayName(img.attr("alt")); - model.setPreview(img.attr("src")); - model.setDescription(""); - model.setOnline(modelHtml.contains("I'm Online")); - try { - model.setOnlineState(model.isOnline() ? Model.State.ONLINE : Model.State.OFFLINE); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } catch (ExecutionException e) { - // ignore - } - models.add(model); - } - return models; - } else { - throw new HttpException(response.code(), response.message()); - } - } + return loadModelList(); } }; } + + private List loadModelList() throws IOException { + List models = new ArrayList<>(); + String url = flirt4free.getBaseUrl() + "/my-account/secure/favorites.php?a=models&sort=online&status=all&pg=" + page; + SiteUiFactory.getUi(flirt4free).login(); + var request = new Request.Builder() + .url(url) + .header(ACCEPT, "*/*") + .header(ACCEPT_LANGUAGE, Locale.ENGLISH.getLanguage()) + .header(REFERER, flirt4free.getBaseUrl()) + .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) + .build(); + try (var response = flirt4free.getHttpClient().execute(request)) { + if (response.isSuccessful()) { + var body = response.body().string(); + Elements modelContainers = HtmlParser.getTags(body, "div.model-container"); + for (Element modelContainer : modelContainers) { + String modelHtml = modelContainer.html(); + Element bioLink = HtmlParser.getTag(modelHtml, "a.common-link"); + bioLink.setBaseUri(flirt4free.getBaseUrl()); + Flirt4FreeModel model = (Flirt4FreeModel) flirt4free.createModelFromUrl(bioLink.absUrl("href")); + Element img = HtmlParser.getTag(modelHtml, "a > img[alt]"); + model.setDisplayName(img.attr("alt")); + model.setPreview(img.attr("src")); + model.setDescription(""); + model.setOnline(modelHtml.contains("I'm Online")); + try { + model.setOnlineState(model.isOnline() ? Model.State.ONLINE : Model.State.OFFLINE); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (ExecutionException e) { + // ignore + } + models.add(model); + } + return models; + } else { + throw new HttpException(response.code(), response.message()); + } + } + } } diff --git a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java index 5439cd0f..6efe4302 100644 --- a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java @@ -12,7 +12,7 @@ import javafx.scene.Scene; import javafx.scene.control.Tab; import javafx.util.Duration; -public class Flirt4FreeTabProvider extends TabProvider { +public class Flirt4FreeTabProvider implements TabProvider { private Flirt4Free flirt4Free; private ThumbOverviewTab followedTab; @@ -40,8 +40,8 @@ public class Flirt4FreeTabProvider extends TabProvider { } private ThumbOverviewTab createTab(String title, String url, Predicate filter) { - Flirt4FreeUpdateService s = new Flirt4FreeUpdateService(flirt4Free, url, filter); - ThumbOverviewTab tab = new ThumbOverviewTab(title, s, flirt4Free); + var s = new Flirt4FreeUpdateService(flirt4Free, url, filter); + var tab = new ThumbOverviewTab(title, s, flirt4Free); tab.setRecorder(flirt4Free.getRecorder()); s.setPeriod(Duration.seconds(60)); return tab; diff --git a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeUpdateService.java b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeUpdateService.java index 4aec13d7..88d77258 100644 --- a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeUpdateService.java @@ -6,11 +6,9 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; -import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,11 +43,11 @@ public class Flirt4FreeUpdateService extends PaginatedScheduledService { @Override public List call() throws IOException { LOG.debug("Fetching page {}", url); - Request request = new Request.Builder() + var request = new Request.Builder() .url(url) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .build(); - try (Response response = flirt4Free.getHttpClient().execute(request)) { + try (var response = flirt4Free.getHttpClient().execute(request)) { if (response.isSuccessful()) { return parseResponse(response); } else { @@ -62,26 +60,24 @@ public class Flirt4FreeUpdateService extends PaginatedScheduledService { private List parseResponse(Response response) throws IOException { List models = new ArrayList<>(); - String body = response.body().string(); - Matcher m = Pattern.compile("window\\.__homePageData__ = (\\{.*\\})", Pattern.DOTALL).matcher(body); + var body = response.body().string(); + var m = Pattern.compile("window\\.__homePageData__ = (\\{.*\\})", Pattern.DOTALL).matcher(body); if (m.find()) { - JSONObject data = new JSONObject(m.group(1)); - JSONArray modelData = data.getJSONArray("models"); + var data = new JSONObject(m.group(1)); + var modelData = data.getJSONArray("models"); LOG.debug("Found {} models", modelData.length()); - for (int i = 0; i < modelData.length(); i++) { - JSONObject modelJson = modelData.getJSONObject(i); + for (var i = 0; i < modelData.length(); i++) { + var modelJson = modelData.getJSONObject(i); try { Flirt4FreeModel model = parseModel(modelJson); - if (model != null) { - models.add(model); - } + models.add(model); } catch(Exception e) { LOG.warn("Couldn't parse model {}", modelJson); } } return models.stream() .filter(filter) - .skip((page - 1) * MODELS_PER_PAGE) + .skip((page - 1) * (long)MODELS_PER_PAGE) .limit(MODELS_PER_PAGE) .collect(Collectors.toList()); } else { @@ -90,14 +86,14 @@ public class Flirt4FreeUpdateService extends PaginatedScheduledService { } private Flirt4FreeModel parseModel(JSONObject modelData) { - String name = modelData.getString("model_seo_name"); + var name = modelData.getString("model_seo_name"); Flirt4FreeModel model = (Flirt4FreeModel) flirt4Free.createModel(name); model.setDisplayName(modelData.getString("display")); model.setDescription(modelData.getString("topic")); model.setUrl(Flirt4Free.BASE_URI + "/rooms/" + model.getName() + '/'); model.setNew(modelData.optString("is_new", "0").equals("1")); - String videoHost = modelData.getString("video_host"); - String modelId = modelData.getString("model_id"); + var videoHost = modelData.getString("video_host"); + var modelId = modelData.getString("model_id"); model.setId(modelId); String streamUrl = "https://manifest.vscdns.com/manifest.m3u8.m3u8?key=nil&provider=level3&secure=true&host=" + videoHost + "&model_id=" + modelId; diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminConfigUi.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminConfigUi.java index 8a679a54..b391516c 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminConfigUi.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminConfigUi.java @@ -1,7 +1,6 @@ package ctbrec.ui.sites.jasmin; import ctbrec.Config; -import ctbrec.Settings; import ctbrec.sites.jasmin.LiveJasmin; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; @@ -25,15 +24,15 @@ public class LiveJasminConfigUi extends AbstractConfigUI { @Override public Parent createConfigPanel() { - Settings settings = Config.getInstance().getSettings(); - GridPane layout = SettingsTab.createGridLayout(); + var settings = Config.getInstance().getSettings(); + var layout = SettingsTab.createGridLayout(); - int row = 0; - Label l = new Label("Active"); + var row = 0; + var l = new Label("Active"); layout.add(l, 0, row); - CheckBox enabled = new CheckBox(); + var enabled = new CheckBox(); enabled.setSelected(!settings.disabledSites.contains(liveJasmin.getName())); - enabled.setOnAction((e) -> { + enabled.setOnAction(e -> { if(enabled.isSelected()) { settings.disabledSites.remove(liveJasmin.getName()); } else { @@ -45,7 +44,7 @@ public class LiveJasminConfigUi extends AbstractConfigUI { layout.add(enabled, 1, row++); layout.add(new Label("LiveJasmin User"), 0, row); - TextField username = new TextField(Config.getInstance().getSettings().livejasminUsername); + var username = new TextField(Config.getInstance().getSettings().livejasminUsername); username.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().livejasminUsername)) { Config.getInstance().getSettings().livejasminUsername = n; @@ -59,7 +58,7 @@ public class LiveJasminConfigUi extends AbstractConfigUI { layout.add(username, 1, row++); layout.add(new Label("LiveJasmin Password"), 0, row); - PasswordField password = new PasswordField(); + var password = new PasswordField(); password.setText(Config.getInstance().getSettings().livejasminPassword); password.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().livejasminPassword)) { @@ -74,7 +73,7 @@ public class LiveJasminConfigUi extends AbstractConfigUI { layout.add(password, 1, row++); layout.add(new Label("LiveJasmin Base URL"), 0, row); - TextField baseUrl = new TextField(); + var baseUrl = new TextField(); baseUrl.setText(Config.getInstance().getSettings().livejasminBaseUrl); baseUrl.textProperty().addListener((ob, o, n) -> { Config.getInstance().getSettings().livejasminBaseUrl = baseUrl.getText(); @@ -85,9 +84,9 @@ public class LiveJasminConfigUi extends AbstractConfigUI { GridPane.setColumnSpan(baseUrl, 2); layout.add(baseUrl, 1, row++); - Button createAccount = new Button("Create new Account"); - createAccount.setOnAction((e) -> DesktopIntegration.open(liveJasmin.getAffiliateLink())); - layout.add(createAccount, 1, row++); + var createAccount = new Button("Create new Account"); + createAccount.setOnAction(e -> DesktopIntegration.open(liveJasmin.getAffiliateLink())); + layout.add(createAccount, 1, row); GridPane.setColumnSpan(createAccount, 2); GridPane.setMargin(username, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(password, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminElectronLoginDialog.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminElectronLoginDialog.java index ab665a8e..d7e0cf89 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminElectronLoginDialog.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminElectronLoginDialog.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.util.Collections; import java.util.function.Consumer; -import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,23 +18,24 @@ import okhttp3.HttpUrl; public class LiveJasminElectronLoginDialog { - private static final transient Logger LOG = LoggerFactory.getLogger(LiveJasminElectronLoginDialog.class); + private static final Logger LOG = LoggerFactory.getLogger(LiveJasminElectronLoginDialog.class); public static final String URL = LiveJasmin.baseUrl + "/en/auth/login"; private CookieJar cookieJar; private ExternalBrowser browser; - public LiveJasminElectronLoginDialog(CookieJar cookieJar) throws Exception { + public LiveJasminElectronLoginDialog(CookieJar cookieJar) throws IOException { this.cookieJar = cookieJar; browser = ExternalBrowser.getInstance(); try { - JSONObject config = new JSONObject(); + var config = new JSONObject(); config.put("url", URL); config.put("w", 640); config.put("h", 720); - JSONObject msg = new JSONObject(); + var msg = new JSONObject(); msg.put("config", config); browser.run(msg, msgHandler); } catch (InterruptedException e) { + Thread.currentThread().interrupt(); throw new IOException("Couldn't wait for login dialog", e); } catch (IOException e) { LOG.debug("Error while starting the browser or communication to it", e); @@ -44,14 +44,13 @@ public class LiveJasminElectronLoginDialog { } } - private Consumer msgHandler = (line) -> { - //LOG.debug("Browser: {}", line); + private Consumer msgHandler = line -> { if(!line.startsWith("{")) { - System.err.println(line); + System.err.println(line); // NOSONAR } else { - JSONObject json = new JSONObject(line); + var json = new JSONObject(line); if(json.has("url")) { - String url = json.getString("url"); + var url = json.getString("url"); if(url.endsWith("/auth/login")) { try { String username = Config.getInstance().getSettings().livejasminUsername; @@ -73,9 +72,9 @@ public class LiveJasminElectronLoginDialog { } } if(json.has("cookies")) { - JSONArray _cookies = json.getJSONArray("cookies"); - for (int i = 0; i < _cookies.length(); i++) { - JSONObject cookie = _cookies.getJSONObject(i); + var cookiesFromBrowser = json.getJSONArray("cookies"); + for (var i = 0; i < cookiesFromBrowser.length(); i++) { + var cookie = cookiesFromBrowser.getJSONObject(i); Builder b = new Cookie.Builder() .path("/") .domain(LiveJasmin.baseDomain) diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedTab.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedTab.java index bd6217c4..50c65017 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedTab.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedTab.java @@ -15,10 +15,8 @@ public class LiveJasminFollowedTab extends LiveJasminTab implements FollowedTab @Override public void setScene(Scene scene) { scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> { - if(this.isSelected()) { - if(event.getCode() == KeyCode.DELETE) { - follow(selectedThumbCells, false); - } + if (this.isSelected() && event.getCode() == KeyCode.DELETE) { + follow(selectedThumbCells, false); } }); } diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedUpdateService.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedUpdateService.java index 452ea270..1fba5e93 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedUpdateService.java @@ -23,7 +23,6 @@ import ctbrec.ui.SiteUiFactory; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; -import okhttp3.Response; public class LiveJasminFollowedUpdateService extends PaginatedScheduledService { @@ -50,16 +49,16 @@ public class LiveJasminFollowedUpdateService extends PaginatedScheduledService { throw new NotLoggedInExcetion("Couldn't login to livejasmin"); } LOG.debug("Fetching page {}", url); - Request request = new Request.Builder() + var request = new Request.Builder() .url(url) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(ACCEPT, "*/*") .header(ACCEPT_LANGUAGE, Locale.ENGLISH.getLanguage()) .header(REFERER, liveJasmin.getBaseUrl()) .build(); - try (Response response = liveJasmin.getHttpClient().execute(request)) { + try (var response = liveJasmin.getHttpClient().execute(request)) { if (response.isSuccessful()) { - String body = response.body().string(); + var body = response.body().string(); List models = new ArrayList<>(); Elements modelCells = getTags(body, "article[class~=perf_container]"); for (Element modelCell : modelCells) { diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminSiteUi.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminSiteUi.java index f4ddbba7..11cbaabf 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminSiteUi.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminSiteUi.java @@ -41,7 +41,7 @@ public class LiveJasminSiteUi extends AbstractSiteUi { public synchronized boolean login() throws IOException { // renew login every 30 min long now = System.currentTimeMillis(); - boolean renew = false; + var renew = false; if ((now - lastLoginTime) > TimeUnit.MINUTES.toMillis(30)) { renew = true; } diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTab.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTab.java index 7d32d375..d289a47d 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTab.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTab.java @@ -2,6 +2,9 @@ package ctbrec.ui.sites.jasmin; import java.io.IOException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import ctbrec.Config; import ctbrec.sites.Site; import ctbrec.ui.tabs.PaginatedScheduledService; @@ -14,6 +17,7 @@ import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; public class LiveJasminTab extends ThumbOverviewTab { + private static final Logger LOG = LoggerFactory.getLogger(LiveJasminTab.class); protected Label status; protected Button acknowledge = new Button("That's alright"); private boolean betaAcknowledged = Config.getInstance().getSettings().livejasminBetaAcknowledged; @@ -36,6 +40,7 @@ public class LiveJasminTab extends ThumbOverviewTab { try { Config.getInstance().save(); } catch (IOException e1) { + LOG.error("Couldn't save config", e1); } status.setText("Loading..."); grid.getChildren().remove(acknowledge); @@ -47,11 +52,6 @@ public class LiveJasminTab extends ThumbOverviewTab { }); } - @Override - protected void createGui() { - super.createGui(); - } - @Override protected void onSuccess() { if(Config.getInstance().getSettings().livejasminBetaAcknowledged) { @@ -70,17 +70,10 @@ public class LiveJasminTab extends ThumbOverviewTab { } } - @Override - public void selected() { - super.selected(); - } - public void setScene(Scene scene) { scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> { - if(this.isSelected()) { - if(event.getCode() == KeyCode.DELETE) { - follow(selectedThumbCells, false); - } + if (this.isSelected() && event.getCode() == KeyCode.DELETE) { + follow(selectedThumbCells, false); } }); } diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTabProvider.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTabProvider.java index 03c53223..8150c124 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTabProvider.java @@ -10,7 +10,7 @@ import javafx.scene.Scene; import javafx.scene.control.Tab; import javafx.util.Duration; -public class LiveJasminTabProvider extends TabProvider { +public class LiveJasminTabProvider implements TabProvider { private LiveJasmin liveJasmin; private LiveJasminFollowedTab followedTab; @@ -43,7 +43,7 @@ public class LiveJasminTabProvider extends TabProvider { } private ThumbOverviewTab createTab(String title, String url) { - LiveJasminUpdateService s = new LiveJasminUpdateService(liveJasmin, url); + var s = new LiveJasminUpdateService(liveJasmin, url); s.setPeriod(Duration.seconds(60)); ThumbOverviewTab tab = new LiveJasminTab(title, s, liveJasmin); tab.setRecorder(liveJasmin.getRecorder()); diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminUpdateService.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminUpdateService.java index 77a8b9a6..eb16f5c0 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminUpdateService.java @@ -8,25 +8,21 @@ import java.util.Collections; import java.util.List; import java.util.Locale; -import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.Model; -import ctbrec.io.CookieJarImpl; import ctbrec.io.HttpException; import ctbrec.sites.jasmin.LiveJasmin; import ctbrec.sites.jasmin.LiveJasminModel; -import ctbrec.ui.SiteUI; import ctbrec.ui.SiteUiFactory; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Cookie; import okhttp3.HttpUrl; import okhttp3.Request; -import okhttp3.Response; public class LiveJasminUpdateService extends PaginatedScheduledService { @@ -45,8 +41,8 @@ public class LiveJasminUpdateService extends PaginatedScheduledService { @Override public List call() throws IOException { // sort by popularity - CookieJarImpl cookieJar = liveJasmin.getHttpClient().getCookieJar(); - Cookie sortCookie = new Cookie.Builder() + var cookieJar = liveJasmin.getHttpClient().getCookieJar(); + var sortCookie = new Cookie.Builder() .domain(LiveJasmin.baseDomain) .name("listPageOrderType") .value("most_popular") @@ -55,7 +51,7 @@ public class LiveJasminUpdateService extends PaginatedScheduledService { // TODO find out how to switch pages LOG.debug("Fetching page {}", url); - Request request = new Request.Builder() + var request = new Request.Builder() .url(url) .addHeader(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .addHeader(ACCEPT, MIMETYPE_APPLICATION_JSON) @@ -63,31 +59,16 @@ public class LiveJasminUpdateService extends PaginatedScheduledService { .addHeader(REFERER, liveJasmin.getBaseUrl()) .addHeader(X_REQUESTED_WITH, XML_HTTP_REQUEST) .build(); - try (Response response = liveJasmin.getHttpClient().execute(request)) { + try (var response = liveJasmin.getHttpClient().execute(request)) { LOG.debug("Response {} {}", response.code(), response.message()); if (response.isSuccessful()) { - String body = response.body().string(); + var body = response.body().string(); List models = new ArrayList<>(); - JSONObject json = new JSONObject(body); - //LOG.debug(json.toString(2)); + var json = new JSONObject(body); if(json.optBoolean("success")) { - JSONObject data = json.getJSONObject("data"); - JSONObject content = data.getJSONObject("content"); - JSONArray performers = content.getJSONArray("performers"); - for (int i = 0; i < performers.length(); i++) { - JSONObject m = performers.getJSONObject(i); - String name = m.optString("pid"); - if(name.isEmpty()) { - continue; - } - LiveJasminModel model = (LiveJasminModel) liveJasmin.createModel(name); - model.setId(m.getString("id")); - model.setPreview(m.getString("profilePictureUrl")); - model.setOnlineState(LiveJasminModel.mapStatus(m.optInt("status"))); - models.add(model); - } + parseModels(models, json); } else if(json.optString("error").equals("Please login.")) { - SiteUI siteUI = SiteUiFactory.getUi(liveJasmin); + var siteUI = SiteUiFactory.getUi(liveJasmin); if(siteUI.login()) { return call(); } else { @@ -106,4 +87,22 @@ public class LiveJasminUpdateService extends PaginatedScheduledService { } }; } + + private void parseModels(List models, JSONObject json) { + var data = json.getJSONObject("data"); + var content = data.getJSONObject("content"); + var performers = content.getJSONArray("performers"); + for (var i = 0; i < performers.length(); i++) { + var m = performers.getJSONObject(i); + var name = m.optString("pid"); + if(name.isEmpty()) { + continue; + } + LiveJasminModel model = (LiveJasminModel) liveJasmin.createModel(name); + model.setId(m.getString("id")); + model.setPreview(m.getString("profilePictureUrl")); + model.setOnlineState(LiveJasminModel.mapStatus(m.optInt("status"))); + models.add(model); + } + } } diff --git a/client/src/main/java/ctbrec/ui/sites/manyvids/MVLiveConfigUi.java b/client/src/main/java/ctbrec/ui/sites/manyvids/MVLiveConfigUi.java index 4fbbaec3..047f7fcb 100644 --- a/client/src/main/java/ctbrec/ui/sites/manyvids/MVLiveConfigUi.java +++ b/client/src/main/java/ctbrec/ui/sites/manyvids/MVLiveConfigUi.java @@ -1,7 +1,6 @@ package ctbrec.ui.sites.manyvids; import ctbrec.Config; -import ctbrec.Settings; import ctbrec.sites.manyvids.MVLive; import ctbrec.ui.settings.SettingsTab; import ctbrec.ui.sites.AbstractConfigUI; @@ -20,15 +19,15 @@ public class MVLiveConfigUi extends AbstractConfigUI { @Override public Parent createConfigPanel() { - Settings settings = Config.getInstance().getSettings(); + var settings = Config.getInstance().getSettings(); GridPane layout = SettingsTab.createGridLayout(); - int row = 0; - Label l = new Label("Active"); + var row = 0; + var l = new Label("Active"); layout.add(l, 0, row); - CheckBox enabled = new CheckBox(); + var enabled = new CheckBox(); enabled.setSelected(!settings.disabledSites.contains(site.getName())); - enabled.setOnAction((e) -> { + enabled.setOnAction(e -> { if(enabled.isSelected()) { settings.disabledSites.remove(site.getName()); } else { @@ -37,7 +36,7 @@ public class MVLiveConfigUi extends AbstractConfigUI { save(); }); GridPane.setMargin(enabled, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); - layout.add(enabled, 1, row++); + layout.add(enabled, 1, row); return layout; } } diff --git a/client/src/main/java/ctbrec/ui/sites/manyvids/MVLiveTabProvider.java b/client/src/main/java/ctbrec/ui/sites/manyvids/MVLiveTabProvider.java index 6b3ed398..dc35397f 100644 --- a/client/src/main/java/ctbrec/ui/sites/manyvids/MVLiveTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/manyvids/MVLiveTabProvider.java @@ -9,7 +9,7 @@ import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; -public class MVLiveTabProvider extends TabProvider { +public class MVLiveTabProvider implements TabProvider { private MVLive mvlive; @@ -26,8 +26,8 @@ public class MVLiveTabProvider extends TabProvider { } private Tab createTab(String title) { - MVLiveUpdateService updateService = new MVLiveUpdateService(mvlive); - ThumbOverviewTab tab = new ThumbOverviewTab(title, updateService, mvlive); + var updateService = new MVLiveUpdateService(mvlive); + var tab = new ThumbOverviewTab(title, updateService, mvlive); tab.setRecorder(mvlive.getRecorder()); tab.setImageAspectRatio(1); return tab; diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/FriendsUpdateService.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/FriendsUpdateService.java index 6ef55d2d..8bd48047 100644 --- a/client/src/main/java/ctbrec/ui/sites/myfreecams/FriendsUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/FriendsUpdateService.java @@ -57,50 +57,59 @@ public class FriendsUpdateService extends PaginatedScheduledService { .build(); try (Response resp = myFreeCams.getHttpClient().execute(req)) { if (resp.isSuccessful()) { - String body = resp.body().string().substring(4); - try { - JSONObject json = new JSONObject(body); - for (String key : json.keySet()) { - int uid = Integer.parseInt(key); - MyFreeCamsModel model = MyFreeCamsClient.getInstance().getModel(uid); - if (model == null) { - JSONObject modelObject = json.getJSONObject(key); - String name = modelObject.getString("u"); - model = myFreeCams.createModel(name); - SessionState st = new SessionState(); - st.setM(new ctbrec.sites.mfc.Model()); - st.getM().setCamscore(0.0); - st.setU(new User()); - st.setUid(uid); - st.setLv(modelObject.getInt("lv")); - st.setVs(127); - } - models.add(model); - } - } catch (Exception e) { - LOG.info("Exception getting friends list. Response was: {}", body, e); - } + var body = resp.body().string().substring(4); + parseModels(body, models); } else { LOG.error("Couldn't load friends list {} {}", resp.code(), resp.message()); } } boolean filterOnline = mode == Mode.ONLINE; - return models.stream().filter(m -> { - try { - return m.isOnline() == filterOnline; - } catch (Exception e) { - return false; - } - }) + return models.stream() + .filter(m -> { + try { + return m.isOnline() == filterOnline; + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return false; + } catch (Exception e) { + return false; + } + }) .sorted((m1, m2) -> (int) (m2.getCamScore() - m1.getCamScore())) .skip((page - 1) * 50l) .limit(50) .collect(Collectors.toList()); } } + }; } + private void parseModels(String body, List models) { + try { + var json = new JSONObject(body); + for (String key : json.keySet()) { + var uid = Integer.parseInt(key); + MyFreeCamsModel model = MyFreeCamsClient.getInstance().getModel(uid); + if (model == null) { + var modelObject = json.getJSONObject(key); + var name = modelObject.getString("u"); + model = myFreeCams.createModel(name); + var st = new SessionState(); + st.setM(new ctbrec.sites.mfc.Model()); + st.getM().setCamscore(0.0); + st.setU(new User()); + st.setUid(uid); + st.setLv(modelObject.getInt("lv")); + st.setVs(127); + } + models.add(model); + } + } catch (Exception e) { + LOG.info("Exception getting friends list. Response was: {}", body, e); + } + } + public void setMode(Mode mode) { this.mode = mode; } diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/HDCamsUpdateService.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/HDCamsUpdateService.java index c087c268..a5bc5a20 100644 --- a/client/src/main/java/ctbrec/ui/sites/myfreecams/HDCamsUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/HDCamsUpdateService.java @@ -20,8 +20,8 @@ public class HDCamsUpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - MyFreeCamsClient client = MyFreeCamsClient.getInstance(); - int modelsPerPage = 50; + var client = MyFreeCamsClient.getInstance(); + var modelsPerPage = 50; return client.getModels().stream() .filter(m -> m.getPreview() != null) @@ -33,7 +33,10 @@ public class HDCamsUpdateService extends PaginatedScheduledService { .filter(m -> { try { return m.isOnline(); - } catch(Exception e) { + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return false; + } catch (Exception e) { return false; } }) diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsConfigUI.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsConfigUI.java index 389ee915..13c06a64 100644 --- a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsConfigUI.java @@ -1,7 +1,6 @@ package ctbrec.ui.sites.myfreecams; import ctbrec.Config; -import ctbrec.Settings; import ctbrec.sites.mfc.MyFreeCams; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; @@ -25,11 +24,11 @@ public class MyFreeCamsConfigUI extends AbstractConfigUI { @Override public Parent createConfigPanel() { - int row = 0; - GridPane layout = SettingsTab.createGridLayout(); - Settings settings = Config.getInstance().getSettings(); + var row = 0; + var layout = SettingsTab.createGridLayout(); + var settings = Config.getInstance().getSettings(); - CheckBox enabled = new CheckBox(); + var enabled = new CheckBox(); enabled.setSelected(!settings.disabledSites.contains(myFreeCams.getName())); enabled.setOnAction(e -> { if(enabled.isSelected()) { @@ -40,12 +39,12 @@ public class MyFreeCamsConfigUI extends AbstractConfigUI { save(); }); GridPane.setMargin(enabled, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); - Label l = new Label("Active"); + var l = new Label("Active"); l.labelForProperty().set(enabled); layout.add(l, 0, row); layout.add(enabled, 1, row++); - TextField username = new TextField(Config.getInstance().getSettings().mfcUsername); + var username = new TextField(Config.getInstance().getSettings().mfcUsername); username.setId("mfcUsername"); username.setPrefWidth(300); username.textProperty().addListener((ob, o, n) -> { @@ -63,7 +62,7 @@ public class MyFreeCamsConfigUI extends AbstractConfigUI { layout.add(l, 0, row); layout.add(username, 1, row++); - PasswordField password = new PasswordField(); + var password = new PasswordField(); password.setText(Config.getInstance().getSettings().mfcPassword); password.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().mfcPassword)) { @@ -80,11 +79,11 @@ public class MyFreeCamsConfigUI extends AbstractConfigUI { layout.add(l, 0, row); layout.add(password, 1, row++); - Button createAccount = new Button("Create new Account"); + var createAccount = new Button("Create new Account"); createAccount.setOnAction(e -> DesktopIntegration.open(myFreeCams.getAffiliateLink())); layout.add(createAccount, 1, row++); - TextField baseUrl = new TextField(); + var baseUrl = new TextField(); baseUrl.setText(Config.getInstance().getSettings().mfcBaseUrl); baseUrl.textProperty().addListener((ob, o, n) -> { Config.getInstance().getSettings().mfcBaseUrl = baseUrl.getText(); diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsFriendsTab.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsFriendsTab.java index 78031a72..a7e5a555 100644 --- a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsFriendsTab.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsFriendsTab.java @@ -24,17 +24,17 @@ public class MyFreeCamsFriendsTab extends ThumbOverviewTab implements FollowedTa } private void addOnlineOfflineSelector() { - ToggleGroup group = new ToggleGroup(); - RadioButton online = new RadioButton("online"); + var group = new ToggleGroup(); + var online = new RadioButton("online"); online.setToggleGroup(group); - RadioButton offline = new RadioButton("offline"); + var offline = new RadioButton("offline"); offline.setToggleGroup(group); pagination.getChildren().add(online); pagination.getChildren().add(offline); HBox.setMargin(online, new Insets(5,5,5,40)); HBox.setMargin(offline, new Insets(5,5,5,5)); online.setSelected(true); - group.selectedToggleProperty().addListener((e) -> { + group.selectedToggleProperty().addListener(e -> { if(online.isSelected()) { ((FriendsUpdateService)updateService).setMode(ONLINE); } else { @@ -47,10 +47,8 @@ public class MyFreeCamsFriendsTab extends ThumbOverviewTab implements FollowedTa public void setScene(Scene scene) { scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> { - if(this.isSelected()) { - if(event.getCode() == KeyCode.DELETE) { - follow(selectedThumbCells, false); - } + if (this.isSelected() && event.getCode() == KeyCode.DELETE) { + follow(selectedThumbCells, false); } }); } diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTabProvider.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTabProvider.java index e9c7a05d..eba2495b 100644 --- a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTabProvider.java @@ -11,7 +11,7 @@ import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; -public class MyFreeCamsTabProvider extends TabProvider { +public class MyFreeCamsTabProvider implements TabProvider { private Recorder recorder; private MyFreeCams myFreeCams; private MyFreeCamsFriendsTab friends; @@ -43,14 +43,13 @@ public class MyFreeCamsTabProvider extends TabProvider { updateService = new NewModelService(); tabs.add(createTab("New", updateService)); - MyFreeCamsTableTab table = new MyFreeCamsTableTab(myFreeCams); - tabs.add(table); + tabs.add(new MyFreeCamsTableTab(myFreeCams)); return tabs; } private ThumbOverviewTab createTab(String title, PaginatedScheduledService updateService) { - ThumbOverviewTab tab = new ThumbOverviewTab(title, updateService, myFreeCams); + var tab = new ThumbOverviewTab(title, updateService, myFreeCams); tab.setImageAspectRatio(9.0 / 16.0); tab.preserveAspectRatioProperty().set(false); tab.setRecorder(recorder); diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTableTab.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTableTab.java index 10f56003..7a8d6bda 100644 --- a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTableTab.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTableTab.java @@ -35,7 +35,6 @@ import com.iheartradio.m3u8.PlaylistException; import ctbrec.Config; import ctbrec.GlobalThreadPool; import ctbrec.Model; -import ctbrec.Settings; import ctbrec.StringUtil; import ctbrec.recorder.download.StreamSource; import ctbrec.sites.mfc.MyFreeCams; @@ -131,7 +130,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { lock.lock(); try { for (SessionState updatedModel : sessionStates) { - ModelTableRow row = new ModelTableRow(updatedModel); + var row = new ModelTableRow(updatedModel); int index = observableModels.indexOf(row); if (index == -1) { observableModels.add(row); @@ -142,7 +141,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { for (Iterator iterator = observableModels.iterator(); iterator.hasNext();) { ModelTableRow model = iterator.next(); - boolean found = false; + var found = false; for (SessionState sessionState : sessionStates) { if(Objects.equals(sessionState.getUid(), model.uid)) { found = true; @@ -169,7 +168,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { } private void createGui() { - BorderPane layout = new BorderPane(); + var layout = new BorderPane(); layout.setPadding(new Insets(5, 10, 10, 10)); filterInput = new SearchBox(false); @@ -186,14 +185,14 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { }); filterInput.getStyleClass().remove("search-box-icon"); HBox.setHgrow(filterInput, Priority.ALWAYS); - Button export = new Button("⬇"); + var export = new Button("⬇"); export.setOnAction(this::export); export.setTooltip(new Tooltip("Export data")); - Button columnSelection = new Button("⚙"); + var columnSelection = new Button("⚙"); columnSelection.setOnAction(this::showColumnSelection); columnSelection.setTooltip(new Tooltip("Select columns")); - HBox topBar = new HBox(5); + var topBar = new HBox(5); topBar.getChildren().addAll(filterInput, count, export, columnSelection); count.prefHeightProperty().bind(filterInput.heightProperty()); count.setAlignment(Pos.CENTER); @@ -217,7 +216,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { }); table.getColumns().addListener((ListChangeListener>)(e -> saveState())); - int idx = 0; + var idx = 0; TableColumn uid = createTableColumn("UID", 65, idx++); uid.setId("uid"); uid.setCellValueFactory(cdf -> cdf.getValue().uidProperty()); @@ -253,15 +252,6 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { camscore.setCellValueFactory(cdf -> cdf.getValue().camScoreProperty()); addTableColumnIfEnabled(camscore); - // this is always 0, use https://api.myfreecams.com/missmfc and https://api.myfreecams.com/missmfc/online - // TableColumn missMfc = createTableColumn("Miss MFC", 75, idx++); - // missMfc.setId("missMfc"); - // missMfc.setCellValueFactory(cdf -> { - // Integer mmfc = Optional.ofNullable(cdf.getValue().getM()).map(m -> m.getMissmfc()).orElse(-1); - // return new SimpleIntegerProperty(mmfc); - // }); - // addTableColumnIfEnabled(missMfc); - TableColumn newModel = createTableColumn("New", 60, idx++); newModel.setId("newModel"); newModel.setCellValueFactory(cdf -> cdf.getValue().newModelProperty()); @@ -311,36 +301,21 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { } private ContextMenu createContextMenu() { - ObservableList selectedStates = table.getSelectionModel().getSelectedItems(); - if (selectedStates.isEmpty()) { + List selectedModels = getSelectedModels(); + if (selectedModels.isEmpty()) { return null; } - List selectedModels = new ArrayList<>(); - for (ModelTableRow sessionState : selectedStates) { - if(sessionState.name.get() != null) { - MyFreeCamsModel model = mfc.createModel(sessionState.name.get()); - mfc.getClient().update(model); - selectedModels.add(model); - } - } + var copyUrl = new MenuItem("Copy URL"); + copyUrl.setOnAction(e -> copyUrl(selectedModels.get(0))); - MenuItem copyUrl = new MenuItem("Copy URL"); - copyUrl.setOnAction(e -> { - Model selected = selectedModels.get(0); - final Clipboard clipboard = Clipboard.getSystemClipboard(); - final ClipboardContent content = new ClipboardContent(); - content.putString(selected.getUrl()); - clipboard.setContent(content); - }); - - MenuItem startRecording = new MenuItem("Start Recording"); + var startRecording = new MenuItem("Start Recording"); startRecording.setOnAction(e -> startRecording(selectedModels)); - MenuItem openInBrowser = new MenuItem("Open in Browser"); + var openInBrowser = new MenuItem("Open in Browser"); openInBrowser.setOnAction(e -> DesktopIntegration.open(selectedModels.get(0).getUrl())); - MenuItem openInPlayer = new MenuItem("Open in Player"); + var openInPlayer = new MenuItem("Open in Player"); openInPlayer.setOnAction(e -> openInPlayer(selectedModels.get(0))); - MenuItem follow = new MenuItem("Follow"); + var follow = new MenuItem("Follow"); follow.setOnAction(e -> new FollowAction(getTabPane(), selectedModels).execute()); ContextMenu menu = new CustomMouseBehaviorContextMenu(); @@ -352,8 +327,14 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { openInBrowser.setDisable(true); } + addDebuggingInDevMode(menu, selectedModels); + + return menu; + } + + private void addDebuggingInDevMode(ContextMenu menu, List selectedModels) { if (Objects.equals(System.getenv("CTBREC_DEV"), "1")) { - MenuItem debug = new MenuItem("debug"); + var debug = new MenuItem("debug"); debug.setOnAction(e -> GlobalThreadPool.submit(() -> { for (Model m : selectedModels) { try { @@ -369,10 +350,28 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { })); menu.getItems().add(debug); } - - return menu; } + private List getSelectedModels() { + ObservableList selectedStates = table.getSelectionModel().getSelectedItems(); + ArrayList selectedModels = new ArrayList<>(); + for (ModelTableRow sessionState : selectedStates) { + if (sessionState.name.get() != null) { + MyFreeCamsModel model = mfc.createModel(sessionState.name.get()); + mfc.getClient().update(model); + selectedModels.add(model); + } + } + return selectedModels; + } + + private void copyUrl(Model selected) { + final var content = new ClipboardContent(); + content.putString(selected.getUrl()); + Clipboard.getSystemClipboard().setContent(content); + } + + private void startRecording(List selectedModels) { new StartRecordingAction(getTabPane(), selectedModels, mfc.getRecorder()).execute(); } @@ -399,25 +398,25 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { String[] tokens = filter.split(" "); observableModels.addAll(filteredModels); filteredModels.clear(); - for (int i = 0; i < table.getItems().size(); i++) { - StringBuilder sb = new StringBuilder(); + for (var i = 0; i < table.getItems().size(); i++) { + var sb = new StringBuilder(); for (TableColumn tc : table.getColumns()) { Object cellData = tc.getCellData(i); - if(cellData != null) { - String content = cellData.toString(); + if (cellData != null) { + var content = cellData.toString(); sb.append(content).append(' '); } } - String searchText = sb.toString(); + var searchText = sb.toString(); - boolean tokensMissing = false; + var tokensMissing = false; for (String token : tokens) { - if(!searchText.toLowerCase().contains(token.toLowerCase())) { + if (!searchText.toLowerCase().contains(token.toLowerCase())) { tokensMissing = true; break; } } - if(tokensMissing) { + if (tokensMissing) { ModelTableRow sessionState = table.getItems().get(i); filteredModels.add(sessionState); } @@ -433,27 +432,38 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { } private void export(ActionEvent evt) { - FileChooser chooser = new FileChooser(); - File file = chooser.showSaveDialog(getTabPane().getScene().getWindow()); - if(file != null) { - try(FileOutputStream fout = new FileOutputStream(file)) { - PrintStream ps = new PrintStream(fout); + var chooser = new FileChooser(); + var file = chooser.showSaveDialog(getTabPane().getScene().getWindow()); + if (file != null) { + try (var fout = new FileOutputStream(file)) { + var ps = new PrintStream(fout); List union = new ArrayList<>(); union.addAll(filteredModels); union.addAll(observableModels); ps.println("\"uid\",\"blurp\",\"camScore\",\"continent\",\"country\",\"ethnic\",\"name\",\"new\",\"occupation\",\"state\",\"tags\",\"topic\""); for (ModelTableRow row : union) { - ps.print("\"" + row.uid + "\""); ps.print(','); - ps.print(escape(row.blurp)); ps.print(','); - ps.print(escape(row.camScore)); ps.print(','); - ps.print(escape(row.continent)); ps.print(','); - ps.print(escape(row.country)); ps.print(','); - ps.print(escape(row.ethnic)); ps.print(','); - ps.print(escape(row.name)); ps.print(','); - ps.print(escape(row.newModel)); ps.print(','); - ps.print(escape(row.occupation)); ps.print(','); - ps.print(escape(row.state)); ps.print(','); - ps.print(escape(row.tags)); ps.print(','); + ps.print("\"" + row.uid + "\""); + ps.print(','); + ps.print(escape(row.blurp)); + ps.print(','); + ps.print(escape(row.camScore)); + ps.print(','); + ps.print(escape(row.continent)); + ps.print(','); + ps.print(escape(row.country)); + ps.print(','); + ps.print(escape(row.ethnic)); + ps.print(','); + ps.print(escape(row.name)); + ps.print(','); + ps.print(escape(row.newModel)); + ps.print(','); + ps.print(escape(row.occupation)); + ps.print(','); + ps.print(escape(row.state)); + ps.print(','); + ps.print(escape(row.tags)); + ps.print(','); ps.print(escape(row.topic)); ps.println(); } @@ -471,18 +481,18 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { private void showColumnSelection(ActionEvent evt) { ContextMenu menu = new CustomMouseBehaviorContextMenu(); for (TableColumn tc : columns) { - CheckMenuItem item = new CheckMenuItem(tc.getText()); + var item = new CheckMenuItem(tc.getText()); item.setSelected(isColumnEnabled(tc)); menu.getItems().add(item); item.setOnAction(e -> { - if(item.isSelected()) { + if (item.isSelected()) { Config.getInstance().getSettings().mfcDisabledModelsTableColumns.remove(tc.getText()); - for (int i = table.getColumns().size()-1; i>=0; i--) { + for (int i = table.getColumns().size() - 1; i >= 0; i--) { TableColumn other = table.getColumns().get(i); int idx = (int) tc.getUserData(); int otherIdx = (int) other.getUserData(); - if(otherIdx < idx) { - table.getColumns().add(i+1, tc); + if (otherIdx < idx) { + table.getColumns().add(i + 1, tc); break; } } @@ -513,8 +523,8 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { @Override public void selected() { - if(updateService != null) { - State s = updateService.getState(); + if (updateService != null) { + var s = updateService.getState(); if (s != State.SCHEDULED && s != State.RUNNING) { updateService.reset(); updateService.restart(); @@ -536,9 +546,9 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { List union = new ArrayList<>(); union.addAll(filteredModels); union.addAll(observableModels); - JSONArray data = new JSONArray(); + var data = new JSONArray(); for (ModelTableRow row : union) { - JSONObject model = new JSONObject(); + var model = new JSONObject(); model.put("uid", row.uid); model.put("blurp", row.blurp.get()); model.put("camScore", row.camScore.get()); @@ -553,7 +563,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { model.put("topic", row.topic.get()); data.put(model); } - File file = new File(Config.getInstance().getConfigDir(), "mfc-models.json"); + var file = new File(Config.getInstance().getConfigDir(), "mfc-models.json"); Files.write(file.toPath(), data.toString(2).getBytes(UTF_8), CREATE, WRITE); saveState(); } catch (Exception e) { @@ -563,49 +573,54 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { private void loadData() { try { - File file = new File(Config.getInstance().getConfigDir(), "mfc-models.json"); + var file = new File(Config.getInstance().getConfigDir(), "mfc-models.json"); if(!file.exists()) { return; } - String json = new String(Files.readAllBytes(file.toPath()), UTF_8); - JSONArray data = new JSONArray(json); - for (int i = 0; i < data.length(); i++) { - try { - ModelTableRow row = new ModelTableRow(); - JSONObject model = data.getJSONObject(i); - row.uid = model.getInt("uid"); - row.blurp.set(model.optString("blurp")); - row.camScore.set(model.optDouble("camScore")); - row.continent.set(model.optString("continent")); - row.country.set(model.optString("country")); - row.ethnic.set(model.optString("ethnic")); - row.name.set(model.optString("name")); - row.newModel.set(model.optString("newModel")); - row.occupation.set(model.optString("occupation")); - row.state.set(model.optString("state")); - row.tags.set(model.optString("tags")); - row.topic.set(model.optString("topic")); - observableModels.add(row); - } catch (Exception e) { - // ignore this error - } + var json = new String(Files.readAllBytes(file.toPath()), UTF_8); + var data = new JSONArray(json); + for (var i = 0; i < data.length(); i++) { + createRow(data, i).ifPresent(observableModels::add); } } catch (Exception e) { LOG.debug("Couldn't read mfc models table data: {}", e.getMessage()); } } + private Optional createRow(JSONArray data, int i) { + try { + var row = new ModelTableRow(); + var model = data.getJSONObject(i); + row.uid = model.getInt("uid"); + row.blurp.set(model.optString("blurp")); + row.camScore.set(model.optDouble("camScore")); + row.continent.set(model.optString("continent")); + row.country.set(model.optString("country")); + row.ethnic.set(model.optString("ethnic")); + row.name.set(model.optString("name")); + row.newModel.set(model.optString("newModel")); + row.occupation.set(model.optString("occupation")); + row.state.set(model.optString("state")); + row.tags.set(model.optString("tags")); + row.topic.set(model.optString("topic")); + return Optional.of(row); + } catch (Exception e) { + // ignore this error + } + return Optional.empty(); + } + private void saveState() { - Settings settings = Config.getInstance().getSettings(); + var settings = Config.getInstance().getSettings(); if (!table.getSortOrder().isEmpty()) { TableColumn col = table.getSortOrder().get(0); settings.mfcModelsTableSortColumn = col.getText(); settings.mfcModelsTableSortType = col.getSortType().toString(); } int size = table.getColumns().size(); - double[] columnWidths = new double[size]; - String[] columnIds = new String[size]; - for (int i = 0; i < columnWidths.length; i++) { + var columnWidths = new double[size]; + var columnIds = new String[size]; + for (var i = 0; i < columnWidths.length; i++) { columnWidths[i] = table.getColumns().get(i).getWidth(); columnIds[i] = table.getColumns().get(i).getId(); } @@ -638,8 +653,8 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { private void restoreColumnOrder() { String[] columnIds = Config.getInstance().getSettings().mfcModelsTableColumnIds; ObservableList> tableColumns = table.getColumns(); - for (int i = 0; i < columnIds.length; i++) { - for (int j = 0; j < table.getColumns().size(); j++) { + for (var i = 0; i < columnIds.length; i++) { + for (var j = 0; j < table.getColumns().size(); j++) { if(Objects.equals(columnIds[i], tableColumns.get(j).getId())) { TableColumn col = tableColumns.get(j); tableColumns.remove(j); // NOSONAR @@ -652,7 +667,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { private void restoreColumnWidths() { double[] columnWidths = Config.getInstance().getSettings().mfcModelsTableColumnWidths; if (columnWidths != null && columnWidths.length == table.getColumns().size()) { - for (int i = 0; i < columnWidths.length; i++) { + for (var i = 0; i < columnWidths.length; i++) { table.getColumns().get(i).setPrefWidth(columnWidths[i]); } } @@ -694,7 +709,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { setProperty(state, Optional.ofNullable(st.getVs()).map(vs -> ctbrec.sites.mfc.State.of(vs).toString())); setProperty(camScore, Optional.ofNullable(st.getM()).map(ctbrec.sites.mfc.Model::getCamscore)); Optional isNew = Optional.ofNullable(st.getM()).map(ctbrec.sites.mfc.Model::getNewModel); - if(isNew.isPresent()) { + if (isNew.isPresent()) { newModel.set(isNew.get() == 1 ? "new" : ""); } setProperty(ethnic, Optional.ofNullable(st.getU()).map(User::getEthnic)); @@ -706,12 +721,12 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { isHd.set(Optional.ofNullable(st.getU()).map(User::getPhase).orElse("z").equalsIgnoreCase("a")); flagsProperty.setValue(flags); Set tagSet = Optional.ofNullable(st.getM()).map(ctbrec.sites.mfc.Model::getTags).orElse(Collections.emptySet()); - if(!tagSet.isEmpty()) { - StringBuilder sb = new StringBuilder(); + if (!tagSet.isEmpty()) { + var sb = new StringBuilder(); for (String t : tagSet) { sb.append(t).append(',').append(' '); } - tags.set(sb.substring(0, sb.length()-2)); + tags.set(sb.substring(0, sb.length() - 2)); } setProperty(blurp, Optional.ofNullable(st.getU()).map(User::getBlurb)); String tpc = Optional.ofNullable(st.getM()).map(ctbrec.sites.mfc.Model::getTopic).orElse("n/a"); @@ -791,8 +806,8 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { @Override public int hashCode() { - final int prime = 31; - int result = 1; + final var prime = 31; + var result = 1; result = prime * result + ((uid == null) ? 0 : uid.hashCode()); return result; } diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/NewModelService.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/NewModelService.java index 3ac03d2b..556d7734 100644 --- a/client/src/main/java/ctbrec/ui/sites/myfreecams/NewModelService.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/NewModelService.java @@ -16,8 +16,8 @@ public class NewModelService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - MyFreeCamsClient client = MyFreeCamsClient.getInstance(); - int modelsPerPage = 50; + var client = MyFreeCamsClient.getInstance(); + var modelsPerPage = 50; return client.getModels().stream() .filter(m -> m.getPreview() != null) .filter(m -> m.getStreamUrl() != null) @@ -29,7 +29,7 @@ public class NewModelService extends PaginatedScheduledService { } }) .sorted((m1, m2) -> m2.getViewerCount() - m1.getViewerCount()) - .skip( (page-1) * modelsPerPage) + .skip( (page-1) * (long)modelsPerPage) .limit(modelsPerPage) .collect(Collectors.toList()); } diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/OnlineCamsUpdateService.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/OnlineCamsUpdateService.java index f3bdf31d..9099b77e 100644 --- a/client/src/main/java/ctbrec/ui/sites/myfreecams/OnlineCamsUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/OnlineCamsUpdateService.java @@ -17,20 +17,23 @@ public class OnlineCamsUpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - MyFreeCamsClient client = MyFreeCamsClient.getInstance(); - int modelsPerPage = 50; + var client = MyFreeCamsClient.getInstance(); + var modelsPerPage = 50; return client.getModels().stream() - .filter((m) -> m.getPreview() != null) - .filter((m) -> m.getStreamUrl() != null) - .filter((m) -> { + .filter(m -> m.getPreview() != null) + .filter(m -> m.getStreamUrl() != null) + .filter(m -> { try { return m.isOnline(); - } catch(Exception e) { + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return false; + } catch (Exception e) { return false; } }) .sorted((m1,m2) -> (int)(m2.getCamScore() - m1.getCamScore())) - .skip( (page-1) * modelsPerPage) + .skip( (page-1) * (long)modelsPerPage) .limit(modelsPerPage) .collect(Collectors.toList()); } diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/PopularModelService.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/PopularModelService.java index 5273588f..e14c2b30 100644 --- a/client/src/main/java/ctbrec/ui/sites/myfreecams/PopularModelService.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/PopularModelService.java @@ -16,20 +16,23 @@ public class PopularModelService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - MyFreeCamsClient client = MyFreeCamsClient.getInstance(); - int modelsPerPage = 50; + var client = MyFreeCamsClient.getInstance(); + var modelsPerPage = 50; return client.getModels().stream() .filter(m -> m.getPreview() != null) .filter(m -> m.getStreamUrl() != null) .filter(m -> { try { return m.isOnline(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return false; } catch (Exception e) { return false; } }) .sorted((m1, m2) -> m2.getViewerCount() - m1.getViewerCount()) - .skip( (page-1) * modelsPerPage) + .skip( (page-1) * (long)modelsPerPage) .limit(modelsPerPage) .collect(Collectors.toList()); } diff --git a/client/src/main/java/ctbrec/ui/sites/showup/ShowupConfigUI.java b/client/src/main/java/ctbrec/ui/sites/showup/ShowupConfigUI.java index 7be1aed8..1198bd7a 100644 --- a/client/src/main/java/ctbrec/ui/sites/showup/ShowupConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/showup/ShowupConfigUI.java @@ -1,7 +1,6 @@ package ctbrec.ui.sites.showup; import ctbrec.Config; -import ctbrec.Settings; import ctbrec.sites.showup.Showup; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; @@ -26,12 +25,12 @@ public class ShowupConfigUI extends AbstractConfigUI { @Override public Parent createConfigPanel() { GridPane layout = SettingsTab.createGridLayout(); - Settings settings = Config.getInstance().getSettings(); + var settings = Config.getInstance().getSettings(); - int row = 0; - Label l = new Label("Active"); + var row = 0; + var l = new Label("Active"); layout.add(l, 0, row); - CheckBox enabled = new CheckBox(); + var enabled = new CheckBox(); enabled.setSelected(!settings.disabledSites.contains(site.getName())); enabled.setOnAction(e -> { if(enabled.isSelected()) { @@ -45,7 +44,7 @@ public class ShowupConfigUI extends AbstractConfigUI { layout.add(enabled, 1, row++); layout.add(new Label("Showup User"), 0, row); - TextField username = new TextField(Config.getInstance().getSettings().showupUsername); + var username = new TextField(Config.getInstance().getSettings().showupUsername); username.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().showupUsername)) { Config.getInstance().getSettings().showupUsername = username.getText(); @@ -59,7 +58,7 @@ public class ShowupConfigUI extends AbstractConfigUI { layout.add(username, 1, row++); layout.add(new Label("Showup Password"), 0, row); - PasswordField password = new PasswordField(); + var password = new PasswordField(); password.setText(Config.getInstance().getSettings().showupPassword); password.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().showupPassword)) { @@ -73,7 +72,7 @@ public class ShowupConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); - Button createAccount = new Button("Create new Account"); + var createAccount = new Button("Create new Account"); createAccount.setOnAction(e -> DesktopIntegration.open(site.getAffiliateLink())); layout.add(createAccount, 1, row); GridPane.setColumnSpan(createAccount, 2); diff --git a/client/src/main/java/ctbrec/ui/sites/showup/ShowupElectronLoginDialog.java b/client/src/main/java/ctbrec/ui/sites/showup/ShowupElectronLoginDialog.java index 19017da9..45f3a93d 100644 --- a/client/src/main/java/ctbrec/ui/sites/showup/ShowupElectronLoginDialog.java +++ b/client/src/main/java/ctbrec/ui/sites/showup/ShowupElectronLoginDialog.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.util.Collections; import java.util.function.Consumer; -import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,12 +29,12 @@ public class ShowupElectronLoginDialog { this.cookieJar = cookieJar; browser = ExternalBrowser.getInstance(); try { - JSONObject config = new JSONObject(); + var config = new JSONObject(); config.put("url", URL); config.put("w", 640); config.put("h", 480); config.put("userAgent", Config.getInstance().getSettings().httpUserAgent); - JSONObject msg = new JSONObject(); + var msg = new JSONObject(); msg.put("config", config); browser.run(msg, msgHandler); } catch (InterruptedException e) { @@ -50,23 +49,24 @@ public class ShowupElectronLoginDialog { if(!line.startsWith("{")) { System.err.println(line); // NOSONAR } else { - JSONObject json = new JSONObject(line); + var json = new JSONObject(line); if(json.has("url")) { - String url = json.getString("url"); + var url = json.getString("url"); LOG.debug(url); if(url.contains("/site/accept_rules")) { try { Thread.sleep(500); - String[] simplify = new String[] { - "document.getElementById(\"acceptrules\").submit();" - }; + var simplify = new String[] { "document.getElementById(\"acceptrules\").submit();" }; for (String js : simplify) { browser.executeJavaScript(js); } - } catch(Exception e) { + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + LOG.warn("Couldn't auto fill username and password for Showup", e); + } catch (Exception e) { LOG.warn("Couldn't auto fill username and password for Showup", e); } - } else if(url.equals(URL + '/') && firstCall) { + } else if (url.equals(URL + '/') && firstCall) { firstCall = false; try { Thread.sleep(500); @@ -82,15 +82,18 @@ public class ShowupElectronLoginDialog { } browser.executeJavaScript("$('input[name=\"remember\"]').attr('value','true')"); return; - } catch(Exception e) { + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + LOG.warn("Couldn't auto fill username and password for Showup", e); + } catch (Exception e) { LOG.warn("Couldn't auto fill username and password for Showup", e); } } - if(json.has("cookies")) { - JSONArray cookies = json.getJSONArray("cookies"); - for (int i = 0; i < cookies.length(); i++) { - JSONObject cookie = cookies.getJSONObject(i); + if (json.has("cookies")) { + var cookies = json.getJSONArray("cookies"); + for (var i = 0; i < cookies.length(); i++) { + var cookie = cookies.getJSONObject(i); if(cookie.getString("domain").contains(DOMAIN)) { Builder b = new Cookie.Builder() .path(cookie.getString("path")) @@ -98,13 +101,13 @@ public class ShowupElectronLoginDialog { .name(cookie.getString("name")) .value(cookie.getString("value")) .expiresAt(Double.valueOf(cookie.optDouble("expirationDate")).longValue()); // NOSONAR - if(cookie.optBoolean("hostOnly")) { + if (cookie.optBoolean("hostOnly")) { b.hostOnlyDomain(DOMAIN); } - if(cookie.optBoolean("httpOnly")) { + if (cookie.optBoolean("httpOnly")) { b.httpOnly(); } - if(cookie.optBoolean("secure")) { + if (cookie.optBoolean("secure")) { b.secure(); } Cookie c = b.build(); @@ -113,22 +116,6 @@ public class ShowupElectronLoginDialog { } } } - - // if(url.equals(URL + '/')) { - // try { - // List cookies = cookieJar.loadForRequest(HttpUrl.parse(Showup.BASE_URL)); - // for (Cookie cookie : cookies) { - // if (Objects.equals(cookie.name(), "showup")) { - // LOG.debug("showup={}", cookie.value()); - // browser.close(); - // } - // } - // } catch (MalformedURLException e) { - // LOG.error("Couldn't parse new url {}", url, e); - // } catch (IOException e) { - // LOG.error("Couldn't send shutdown request to external browser", e); - // } - // } } } }; diff --git a/client/src/main/java/ctbrec/ui/sites/showup/ShowupFollowedTab.java b/client/src/main/java/ctbrec/ui/sites/showup/ShowupFollowedTab.java index f4b42b4e..cb2559ed 100644 --- a/client/src/main/java/ctbrec/ui/sites/showup/ShowupFollowedTab.java +++ b/client/src/main/java/ctbrec/ui/sites/showup/ShowupFollowedTab.java @@ -30,10 +30,10 @@ public class ShowupFollowedTab extends ThumbOverviewTab implements FollowedTab { } private void addOnlineOfflineSelector() { - ToggleGroup group = new ToggleGroup(); - RadioButton online = new RadioButton("online"); + var group = new ToggleGroup(); + var online = new RadioButton("online"); online.setToggleGroup(group); - RadioButton offline = new RadioButton("offline"); + var offline = new RadioButton("offline"); offline.setToggleGroup(group); pagination.getChildren().add(online); pagination.getChildren().add(offline); @@ -55,7 +55,7 @@ public class ShowupFollowedTab extends ThumbOverviewTab implements FollowedTab { @Override protected void onFail(WorkerStateEvent event) { - String msg = ""; + var msg = ""; if (event.getSource().getException() != null) { msg = ": " + event.getSource().getException().getMessage(); } diff --git a/client/src/main/java/ctbrec/ui/sites/showup/ShowupFollowedUpdateService.java b/client/src/main/java/ctbrec/ui/sites/showup/ShowupFollowedUpdateService.java index 7aac6a75..5975b720 100644 --- a/client/src/main/java/ctbrec/ui/sites/showup/ShowupFollowedUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/showup/ShowupFollowedUpdateService.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import org.json.JSONArray; import org.json.JSONObject; import ctbrec.Config; @@ -22,7 +21,6 @@ import ctbrec.ui.SiteUiFactory; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; -import okhttp3.Response; public class ShowupFollowedUpdateService extends PaginatedScheduledService { @@ -40,16 +38,16 @@ public class ShowupFollowedUpdateService extends PaginatedScheduledService { public List call() throws IOException { SiteUiFactory.getUi(site).login(); - Request request = new Request.Builder() + var request = new Request.Builder() .url(site.getBaseUrl() + "/site/favorites") .header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(X_REQUESTED_WITH, XML_HTTP_REQUEST) .build(); - try (Response response = site.getHttpClient().execute(request)) { + try (var response = site.getHttpClient().execute(request)) { if (response.isSuccessful()) { - String body = response.body().string(); - JSONObject json = new JSONObject(body); + var body = response.body().string(); + var json = new JSONObject(body); if (json.optString("status").equalsIgnoreCase("success")) { Map onlineModels = parseOnlineModels(json); return parseFavorites(json).stream() @@ -66,10 +64,10 @@ public class ShowupFollowedUpdateService extends PaginatedScheduledService { private List parseFavorites(JSONObject json) { var favorites = new ArrayList(); - JSONArray list = json.getJSONArray("list"); - for (int i = 0; i < list.length(); i++) { - JSONObject m = list.getJSONObject(i); - ShowupModel model = new ShowupModel(); + var list = json.getJSONArray("list"); + for (var i = 0; i < list.length(); i++) { + var m = list.getJSONObject(i); + var model = new ShowupModel(); model.setSite(site); model.setUid(m.optString("fav_uid")); model.setName(m.optString("username")); @@ -81,9 +79,9 @@ public class ShowupFollowedUpdateService extends PaginatedScheduledService { private Map parseOnlineModels(JSONObject json) { var onlineModels = new HashMap(); - JSONArray online = json.getJSONArray("online"); - for (int i = 0; i < online.length(); i++) { - JSONObject m = online.getJSONObject(i); + var online = json.getJSONArray("online"); + for (var i = 0; i < online.length(); i++) { + var m = online.getJSONObject(i); String preview = site.getBaseUrl() + "/files/" + m.optString("big_img") + ".jpg"; onlineModels.put(String.valueOf(m.optLong("uid")), preview); } diff --git a/client/src/main/java/ctbrec/ui/sites/showup/ShowupTabProvider.java b/client/src/main/java/ctbrec/ui/sites/showup/ShowupTabProvider.java index a412636e..48544743 100644 --- a/client/src/main/java/ctbrec/ui/sites/showup/ShowupTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/showup/ShowupTabProvider.java @@ -9,7 +9,7 @@ import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; -public class ShowupTabProvider extends TabProvider { +public class ShowupTabProvider implements TabProvider { private Showup site; @@ -23,7 +23,7 @@ public class ShowupTabProvider extends TabProvider { tabs.add(createTab("Women", "female")); tabs.add(createTab("Men", "male")); tabs.add(createTab("All", "all")); - ShowupFollowedTab showupFollowedTab = new ShowupFollowedTab("Favorites", site); + var showupFollowedTab = new ShowupFollowedTab("Favorites", site); showupFollowedTab.setRecorder(site.getRecorder()); tabs.add(showupFollowedTab); return tabs; @@ -35,8 +35,8 @@ public class ShowupTabProvider extends TabProvider { } private Tab createTab(String title, String category) { - ShowupUpdateService updateService = new ShowupUpdateService(site, category); - ThumbOverviewTab tab = new ThumbOverviewTab(title, updateService, site); + var updateService = new ShowupUpdateService(site, category); + var tab = new ThumbOverviewTab(title, updateService, site); tab.setRecorder(site.getRecorder()); return tab; } diff --git a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateConfigUI.java b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateConfigUI.java index d338cab1..7b0a33d7 100644 --- a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateConfigUI.java @@ -1,7 +1,6 @@ package ctbrec.ui.sites.streamate; import ctbrec.Config; -import ctbrec.Settings; import ctbrec.sites.streamate.Streamate; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; @@ -26,14 +25,14 @@ public class StreamateConfigUI extends AbstractConfigUI { @Override public Parent createConfigPanel() { GridPane layout = SettingsTab.createGridLayout(); - Settings settings = Config.getInstance().getSettings(); + var settings = Config.getInstance().getSettings(); - int row = 0; - Label l = new Label("Active"); + var row = 0; + var l = new Label("Active"); layout.add(l, 0, row); - CheckBox enabled = new CheckBox(); + var enabled = new CheckBox(); enabled.setSelected(!settings.disabledSites.contains(streamate.getName())); - enabled.setOnAction((e) -> { + enabled.setOnAction(e -> { if(enabled.isSelected()) { settings.disabledSites.remove(streamate.getName()); } else { @@ -45,7 +44,7 @@ public class StreamateConfigUI extends AbstractConfigUI { layout.add(enabled, 1, row++); layout.add(new Label("Streamate User"), 0, row); - TextField username = new TextField(settings.streamateUsername); + var username = new TextField(settings.streamateUsername); username.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().streamateUsername)) { Config.getInstance().getSettings().streamateUsername = username.getText(); @@ -59,7 +58,7 @@ public class StreamateConfigUI extends AbstractConfigUI { layout.add(username, 1, row++); layout.add(new Label("Streamate Password"), 0, row); - PasswordField password = new PasswordField(); + var password = new PasswordField(); password.setText(settings.streamatePassword); password.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().streamatePassword)) { @@ -73,9 +72,9 @@ public class StreamateConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); - Button createAccount = new Button("Create new Account"); - createAccount.setOnAction((e) -> DesktopIntegration.open(streamate.getAffiliateLink())); - layout.add(createAccount, 1, row++); + var createAccount = new Button("Create new Account"); + createAccount.setOnAction(e -> DesktopIntegration.open(streamate.getAffiliateLink())); + layout.add(createAccount, 1, row); GridPane.setColumnSpan(createAccount, 2); GridPane.setMargin(username, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(password, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); diff --git a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateFollowedService.java b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateFollowedService.java index 373cd3da..3a74a193 100644 --- a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateFollowedService.java +++ b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateFollowedService.java @@ -13,7 +13,6 @@ import java.util.UUID; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPathExpressionException; -import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,7 +27,6 @@ import ctbrec.sites.streamate.StreamateModel; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; -import okhttp3.Response; public class StreamateFollowedService extends PaginatedScheduledService { @@ -55,7 +53,7 @@ public class StreamateFollowedService extends PaginatedScheduledService { String saKey = httpClient.getSaKey(); String pageUrl = url + "&from=" + ((page - 1) * MODELS_PER_PAGE) + "&size=" + MODELS_PER_PAGE; LOG.debug("Fetching page {}", pageUrl); - Request request = new Request.Builder() + var request = new Request.Builder() .url(pageUrl) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(ACCEPT, MIMETYPE_APPLICATION_JSON) @@ -69,52 +67,54 @@ public class StreamateFollowedService extends PaginatedScheduledService { .header("smvid", UUID.randomUUID().toString() + "G0211569057409") .header("X-XSRF-TOKEN", httpClient.getXsrfToken()) .build(); - try(Response response = streamate.getHttpClient().execute(request)) { + try(var response = streamate.getHttpClient().execute(request)) { if (response.isSuccessful()) { - List models = new ArrayList<>(); - String content = response.body().string(); - JSONObject json = new JSONObject(content); - if (json.has("totalResultCount")) { - JSONArray performers = json.getJSONArray("performers"); - for (int i = 0; i < performers.length(); i++) { - JSONObject p = performers.getJSONObject(i); - String nickname = p.getString("nickname"); - StreamateModel model = (StreamateModel) streamate.createModel(nickname); - model.setId(p.getLong("id")); - //model.setPreview(p.getString("thumbnail")); - model.setPreview("https://cdn.nsimg.net/snap/320x240/" + model.getId() + ".jpg"); - boolean online = p.optBoolean("online") && notPrivateEtc(p); - model.setOnline(online); - model.setOnlineState(online ? ONLINE : OFFLINE); - if (online == showOnline) { - models.add(model); - } - } - } else { - throw new IOException("Response: " + json.optString("message")); - } - return models; + return parseModels(response.body().string()); } else { throw new HttpException(response.code(), response.message()); } } } - - private boolean notPrivateEtc(JSONObject p) { - if (p.has("liveState")) { - JSONObject liveState = p.getJSONObject("liveState"); - boolean offline = liveState.optBoolean("onBreak") - || liveState.optBoolean("privateChat") - || liveState.optBoolean("exclusiveShow") - || liveState.optBoolean("specialShow") - || liveState.optBoolean("goldShow"); - return !offline; - } - return false; - } }; } + private List parseModels(String content) throws IOException { + List models = new ArrayList<>(); + var json = new JSONObject(content); + if (json.has("totalResultCount")) { + var performers = json.getJSONArray("performers"); + for (var i = 0; i < performers.length(); i++) { + var p = performers.getJSONObject(i); + var nickname = p.getString("nickname"); + StreamateModel model = (StreamateModel) streamate.createModel(nickname); + model.setId(p.getLong("id")); + model.setPreview("https://cdn.nsimg.net/snap/320x240/" + model.getId() + ".jpg"); + boolean online = p.optBoolean("online") && notPrivateEtc(p); + model.setOnline(online); + model.setOnlineState(online ? ONLINE : OFFLINE); + if (online == showOnline) { + models.add(model); + } + } + } else { + throw new IOException("Response: " + json.optString("message")); + } + return models; + } + + private boolean notPrivateEtc(JSONObject p) { + if (p.has("liveState")) { + var liveState = p.getJSONObject("liveState"); + boolean offline = liveState.optBoolean("onBreak") + || liveState.optBoolean("privateChat") + || liveState.optBoolean("exclusiveShow") + || liveState.optBoolean("specialShow") + || liveState.optBoolean("goldShow"); + return !offline; + } + return false; + } + public void setOnline(boolean online) { this.showOnline = online; } diff --git a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateFollowedTab.java b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateFollowedTab.java index bf63a378..3222b479 100644 --- a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateFollowedTab.java +++ b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateFollowedTab.java @@ -30,17 +30,17 @@ public class StreamateFollowedTab extends ThumbOverviewTab implements FollowedTa } private void addOnlineOfflineSelector() { - ToggleGroup group = new ToggleGroup(); - RadioButton online = new RadioButton("online"); + var group = new ToggleGroup(); + var online = new RadioButton("online"); online.setToggleGroup(group); - RadioButton offline = new RadioButton("offline"); + var offline = new RadioButton("offline"); offline.setToggleGroup(group); pagination.getChildren().add(online); pagination.getChildren().add(offline); HBox.setMargin(online, new Insets(5,5,5,40)); HBox.setMargin(offline, new Insets(5,5,5,5)); online.setSelected(true); - group.selectedToggleProperty().addListener((e) -> { + group.selectedToggleProperty().addListener(e -> { ((StreamateFollowedService)updateService).setOnline(online.isSelected()); queue.clear(); updateService.restart(); @@ -67,10 +67,8 @@ public class StreamateFollowedTab extends ThumbOverviewTab implements FollowedTa public void setScene(Scene scene) { scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> { - if(this.isSelected()) { - if(event.getCode() == KeyCode.DELETE) { - follow(selectedThumbCells, false); - } + if (this.isSelected() && event.getCode() == KeyCode.DELETE) { + follow(selectedThumbCells, false); } }); } diff --git a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateTabProvider.java b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateTabProvider.java index 5642d987..2e1f2fcf 100644 --- a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateTabProvider.java @@ -1,12 +1,8 @@ package ctbrec.ui.sites.streamate; -import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import ctbrec.recorder.Recorder; import ctbrec.sites.streamate.Streamate; import ctbrec.ui.tabs.TabProvider; @@ -14,8 +10,7 @@ import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; -public class StreamateTabProvider extends TabProvider { - private static final Logger LOG = LoggerFactory.getLogger(StreamateTabProvider.class); +public class StreamateTabProvider implements TabProvider { private Streamate streamate; private Recorder recorder; private ThumbOverviewTab followedTab; @@ -28,25 +23,20 @@ public class StreamateTabProvider extends TabProvider { @Override public List getTabs(Scene scene) { List tabs = new ArrayList<>(); - try { - // performers?domain=streamate.com&from=0&size=48&useProductScore=false&filters=gender:f,ff,mf,tm2f,g;online:true&boostedFilters=&excludedFilters=&country=DE&language=de&genderSetting=f - //https://member.naiadsystems.com/search/v3/performers?domain=streamate.com&filters=gender:f;online:true&from=0&size=48 - tabs.add(createTab("Girls", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:f;online:true")); - tabs.add(createTab("Guys", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:m;online:true")); - tabs.add(createTab("Couples", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:mf;online:true")); - tabs.add(createTab("Lesbian", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:ff;online:true")); - tabs.add(createTab("Gay", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:mm;online:true")); - tabs.add(createTab("Groups", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:g;online:true")); - tabs.add(createTab("Trans female", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:tm2f;online:true")); - tabs.add(createTab("Trans male", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:tf2m;online:true")); - tabs.add(createTab("New", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=new:true;online:true")); + tabs.add(createTab("Girls", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:f;online:true")); + tabs.add(createTab("Guys", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:m;online:true")); + tabs.add(createTab("Couples", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:mf;online:true")); + tabs.add(createTab("Lesbian", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:ff;online:true")); + tabs.add(createTab("Gay", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:mm;online:true")); + tabs.add(createTab("Groups", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:g;online:true")); + tabs.add(createTab("Trans female", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:tm2f;online:true")); + tabs.add(createTab("Trans male", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=gender:tf2m;online:true")); + tabs.add(createTab("New", Streamate.NAIAD_URL + "/performers?domain=streamate.com&boostedFilters=&excludedFilters=&useProductScore=false&filters=new:true;online:true")); + + followedTab = new StreamateFollowedTab(streamate); + followedTab.setRecorder(recorder); + tabs.add(followedTab); - followedTab = new StreamateFollowedTab(streamate); - followedTab.setRecorder(recorder); - tabs.add(followedTab); - } catch (IOException e) { - LOG.error("Couldn't create streamate tab", e); - } return tabs; } @@ -55,9 +45,9 @@ public class StreamateTabProvider extends TabProvider { return followedTab; } - private Tab createTab(String title, String url) throws IOException { - StreamateUpdateService updateService = new StreamateUpdateService(streamate, url); - ThumbOverviewTab tab = new ThumbOverviewTab(title, updateService, streamate); + private Tab createTab(String title, String url) { + var updateService = new StreamateUpdateService(streamate, url); + var tab = new ThumbOverviewTab(title, updateService, streamate); tab.setRecorder(recorder); return tab; } diff --git a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateUpdateService.java b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateUpdateService.java index 2700cf1a..8c56813e 100644 --- a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateUpdateService.java @@ -11,7 +11,6 @@ import java.util.UUID; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPathExpressionException; -import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,8 +23,6 @@ import ctbrec.sites.streamate.StreamateHttpClient; import ctbrec.sites.streamate.StreamateModel; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; -import okhttp3.Request; -import okhttp3.Response; public class StreamateUpdateService extends PaginatedScheduledService { @@ -51,7 +48,7 @@ public class StreamateUpdateService extends PaginatedScheduledService { String saKey = httpClient.getSaKey(); String pageUrl = url + "&from=" + from + "&size=" + MODELS_PER_PAGE; LOG.debug("Fetching page {}", pageUrl); - Request request = httpClient.newRequestBuilder() + var request = httpClient.newRequestBuilder() .url(pageUrl) .header(ORIGIN, streamate.getBaseUrl()) .header("sakey", saKey) @@ -60,39 +57,9 @@ public class StreamateUpdateService extends PaginatedScheduledService { .header("smeid", UUID.randomUUID().toString() + "G0211569057409") .header("smvid", UUID.randomUUID().toString() + "G0211569057409") .build(); - try (Response response = httpClient.execute(request)) { + try (var response = httpClient.execute(request)) { if (response.isSuccessful()) { - List models = new ArrayList<>(); - String content = response.body().string(); - JSONObject json = new JSONObject(content); - JSONArray performers = json.getJSONArray("performers"); - for (int i = 0; i < performers.length(); i++) { - JSONObject p = performers.getJSONObject(i); - String nickname = p.getString("nickname"); - StreamateModel model = (StreamateModel) streamate.createModel(nickname); - model.setId(p.getLong("id")); - model.setPreview("https://cdn.nsimg.net/snap/320x240/" + model.getId() + ".jpg"); - model.setDescription(p.optString("headlineMessage")); - boolean online = p.optBoolean("online"); - model.setOnline(online); - model.setOnlineState(online ? ONLINE : OFFLINE); - // TODO figure out, what all the states mean - // liveState {…} - // exclusiveShow false - // goldShow true - // onBreak false - // partyChat true - // preGoldShow true - // privateChat false - // specialShow false - if (p.optBoolean("onBreak")) { - model.setOnlineState(AWAY); - } else if (p.optBoolean("goldShow") || p.optBoolean("privateChat") || p.optBoolean("exclusiveShow")) { - model.setOnlineState(PRIVATE); - } - models.add(model); - } - return models; + return parseModels(response.body().string()); } else { throw new HttpException(response.code(), response.message()); } @@ -100,4 +67,37 @@ public class StreamateUpdateService extends PaginatedScheduledService { } }; } + + private List parseModels(String content) { + List models = new ArrayList<>(); + var json = new JSONObject(content); + var performers = json.getJSONArray("performers"); + for (var i = 0; i < performers.length(); i++) { + var p = performers.getJSONObject(i); + var nickname = p.getString("nickname"); + StreamateModel model = (StreamateModel) streamate.createModel(nickname); + model.setId(p.getLong("id")); + model.setPreview("https://cdn.nsimg.net/snap/320x240/" + model.getId() + ".jpg"); + model.setDescription(p.optString("headlineMessage")); + var online = p.optBoolean("online"); + model.setOnline(online); + model.setOnlineState(online ? ONLINE : OFFLINE); + // TODO figure out, what all the states mean + // liveState {…} + // exclusiveShow false + // goldShow true + // onBreak false + // partyChat true + // preGoldShow true + // privateChat false + // specialShow false + if (p.optBoolean("onBreak")) { + model.setOnlineState(AWAY); + } else if (p.optBoolean("goldShow") || p.optBoolean("privateChat") || p.optBoolean("exclusiveShow")) { + model.setOnlineState(PRIVATE); + } + models.add(model); + } + return models; + } } diff --git a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatConfigUI.java b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatConfigUI.java index e860f2f8..c6189adf 100644 --- a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatConfigUI.java @@ -1,7 +1,6 @@ package ctbrec.ui.sites.stripchat; import ctbrec.Config; -import ctbrec.Settings; import ctbrec.sites.stripchat.Stripchat; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; @@ -29,12 +28,12 @@ public class StripchatConfigUI extends AbstractConfigUI { @Override public Parent createConfigPanel() { GridPane layout = SettingsTab.createGridLayout(); - Settings settings = Config.getInstance().getSettings(); + var settings = Config.getInstance().getSettings(); - int row = 0; - Label l = new Label("Active"); + var row = 0; + var l = new Label("Active"); layout.add(l, 0, row); - CheckBox enabled = new CheckBox(); + var enabled = new CheckBox(); enabled.setSelected(!settings.disabledSites.contains(stripchat.getName())); enabled.setOnAction(e -> { if(enabled.isSelected()) { @@ -49,18 +48,18 @@ public class StripchatConfigUI extends AbstractConfigUI { l = new Label("Site"); layout.add(l, 0, row); - ToggleGroup toggleGroup = new ToggleGroup(); - RadioButton optionA = new RadioButton("Stripchat"); + var toggleGroup = new ToggleGroup(); + var optionA = new RadioButton("Stripchat"); optionA.setSelected(!Config.getInstance().getSettings().stripchatUseXhamster); optionA.setToggleGroup(toggleGroup); - RadioButton optionB = new RadioButton("xHamsterLive"); + var optionB = new RadioButton("xHamsterLive"); optionB.setSelected(!optionA.isSelected()); optionB.setToggleGroup(toggleGroup); optionA.selectedProperty().addListener((obs, oldV, newV) -> { Config.getInstance().getSettings().stripchatUseXhamster = !newV; save(); }); - HBox hbox = new HBox(); + var hbox = new HBox(); hbox.getChildren().addAll(optionA, optionB); HBox.setMargin(optionA, new Insets(5)); HBox.setMargin(optionB, new Insets(5)); @@ -68,7 +67,7 @@ public class StripchatConfigUI extends AbstractConfigUI { layout.add(hbox, 1, row++); layout.add(new Label("Stripchat User"), 0, row); - TextField username = new TextField(Config.getInstance().getSettings().stripchatUsername); + var username = new TextField(Config.getInstance().getSettings().stripchatUsername); username.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().stripchatUsername)) { Config.getInstance().getSettings().stripchatUsername = username.getText(); @@ -82,7 +81,7 @@ public class StripchatConfigUI extends AbstractConfigUI { layout.add(username, 1, row++); layout.add(new Label("Stripchat Password"), 0, row); - PasswordField password = new PasswordField(); + var password = new PasswordField(); password.setText(Config.getInstance().getSettings().stripchatPassword); password.textProperty().addListener((ob, o, n) -> { if(!n.equals(Config.getInstance().getSettings().stripchatPassword)) { @@ -96,7 +95,7 @@ public class StripchatConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); - Button createAccount = new Button("Create new Account"); + var createAccount = new Button("Create new Account"); createAccount.setOnAction(e -> DesktopIntegration.open(stripchat.getAffiliateLink())); layout.add(createAccount, 1, row); GridPane.setColumnSpan(createAccount, 2); diff --git a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatElectronLoginDialog.java b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatElectronLoginDialog.java index c326c85c..96238e59 100644 --- a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatElectronLoginDialog.java +++ b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatElectronLoginDialog.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.util.Collections; import java.util.function.Consumer; -import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,9 +18,9 @@ import okhttp3.HttpUrl; public class StripchatElectronLoginDialog { - private static final transient Logger LOG = LoggerFactory.getLogger(StripchatElectronLoginDialog.class); - public String DOMAIN = Stripchat.domain; - public String URL = Stripchat.baseUri; + private static final Logger LOG = LoggerFactory.getLogger(StripchatElectronLoginDialog.class); + public static final String DOMAIN = Stripchat.domain; + public static final String URL = Stripchat.baseUri; private CookieJar cookieJar; private ExternalBrowser browser; @@ -29,27 +28,28 @@ public class StripchatElectronLoginDialog { this.cookieJar = cookieJar; browser = ExternalBrowser.getInstance(); try { - JSONObject config = new JSONObject(); + var config = new JSONObject(); config.put("url", URL); config.put("w", 640); config.put("h", 640); - JSONObject msg = new JSONObject(); + var msg = new JSONObject(); msg.put("config", config); browser.run(msg, msgHandler); } catch (InterruptedException e) { + Thread.currentThread().interrupt(); throw new IOException("Couldn't wait for login dialog", e); } finally { browser.close(); } } - private Consumer msgHandler = (line) -> { + private Consumer msgHandler = line -> { if(!line.startsWith("{")) { - System.err.println(line); + System.err.println(line); // NOSONAR } else { - JSONObject json = new JSONObject(line); + var json = new JSONObject(line); if(json.has("url")) { - String url = json.getString("url"); + var url = json.getString("url"); if(url.endsWith(DOMAIN) || url.endsWith(DOMAIN + '/')) { try { @@ -73,16 +73,16 @@ public class StripchatElectronLoginDialog { } if (json.has("cookies")) { - JSONArray _cookies = json.getJSONArray("cookies"); - boolean sessionCookieFound = false; - for (int i = 0; i < _cookies.length(); i++) { - JSONObject cookie = _cookies.getJSONObject(i); + var cookiesFromBrowser = json.getJSONArray("cookies"); + var sessionCookieFound = false; + for (var i = 0; i < cookiesFromBrowser.length(); i++) { + var cookie = cookiesFromBrowser.getJSONObject(i); if (cookie.getString("domain").contains(DOMAIN)) { - String domain = cookie.getString("domain"); + var domain = cookie.getString("domain"); if (domain.startsWith(".")) { domain = domain.substring(1); } - Cookie c = createCookie(domain, cookie); + var c = createCookie(domain, cookie); cookieJar.saveFromResponse(HttpUrl.parse(url), Collections.singletonList(c)); c = createCookie(DOMAIN, cookie); cookieJar.saveFromResponse(HttpUrl.parse(Stripchat.baseUri), Collections.singletonList(c)); @@ -110,7 +110,7 @@ public class StripchatElectronLoginDialog { .domain(domain) .name(cookie.getString("name")) .value(cookie.getString("value")) - .expiresAt(Double.valueOf(cookie.optDouble("expirationDate")).longValue()); + .expiresAt(Double.valueOf(cookie.optDouble("expirationDate")).longValue()); // NOSONAR if(cookie.optBoolean("hostOnly")) { b.hostOnlyDomain(domain); } diff --git a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatFollowedTab.java b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatFollowedTab.java index 5b0cc16b..2009422d 100644 --- a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatFollowedTab.java +++ b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatFollowedTab.java @@ -19,11 +19,6 @@ public class StripchatFollowedTab extends ThumbOverviewTab implements FollowedTa grid.getChildren().add(status); } - @Override - protected void createGui() { - super.createGui(); - } - @Override protected void onSuccess() { grid.getChildren().remove(status); @@ -32,7 +27,7 @@ public class StripchatFollowedTab extends ThumbOverviewTab implements FollowedTa @Override protected void onFail(WorkerStateEvent event) { - String msg = ""; + var msg = ""; if (event.getSource().getException() != null) { msg = ": " + event.getSource().getException().getMessage(); } diff --git a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatFollowedUpdateService.java b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatFollowedUpdateService.java index b32174de..ff1bfec5 100644 --- a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatFollowedUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatFollowedUpdateService.java @@ -22,7 +22,6 @@ import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.HttpUrl; import okhttp3.Request; -import okhttp3.Response; public class StripchatFollowedUpdateService extends PaginatedScheduledService { private static final int PAGE_SIZE = 30; @@ -37,86 +36,90 @@ public class StripchatFollowedUpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - int startIndex = (getPage() - 1) * PAGE_SIZE; - JSONArray favoriteModelIds = loadFavoriteModelIds(); - List modelIdsToLoad = new ArrayList<>(PAGE_SIZE); - List models; - if (startIndex < favoriteModelIds.length()) { - int modelsOnPage = Math.min(PAGE_SIZE, favoriteModelIds.length() - startIndex - 1); - for (int i = 0; i < modelsOnPage; i++) { - modelIdsToLoad.add(favoriteModelIds.getInt(startIndex + i)); - } - models = loadModels(modelIdsToLoad); - } else { - models = Collections.emptyList(); - } - return models; - } - - private List loadModels(List modelIdsToLoad) throws IOException { - List models = new ArrayList<>(); - HttpUrl.Builder urlBuilder = HttpUrl.parse(stripchat.getBaseUrl() + "/api/front/models/list").newBuilder(); - for (int i = 0; i < modelIdsToLoad.size(); i++) { - urlBuilder.addQueryParameter("modelIds["+i+"]", modelIdsToLoad.get(i).toString()); - } - Request request = new Request.Builder() - .url(urlBuilder.build()) - .header(ACCEPT, "*/*") - .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .header(REFERER, Stripchat.baseUri + "/favorites") - .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) - .build(); - try (Response response = stripchat.getHttpClient().execute(request)) { - if (response.isSuccessful()) { - JSONObject json = new JSONObject(response.body().string()); - if (json.has("models")) { - JSONArray users = json.getJSONArray("models"); - for (int i = 0; i < users.length(); i++) { - JSONObject user = users.getJSONObject(i); - StripchatModel model = stripchat.createModel(user.optString("username")); - model.setDescription(user.optString("description")); - model.setPreview(user.optString("previewUrlThumbBig")); - model.setOnlineState(mapStatus(user.optString("status"))); - models.add(model); - } - } - } else { - throw new HttpException(response.code(), response.message()); - } - } - return models; - } - - private JSONArray loadFavoriteModelIds() throws IOException { - SiteUiFactory.getUi(stripchat).login(); - stripchat.getHttpClient().login(); - long userId = ((StripchatHttpClient) stripchat.getHttpClient()).getUserId(); - String url = stripchat.getBaseUrl() + "/api/front/users/" + userId + "/favorites"; - Request request = new Request.Builder() - .url(url) - .header(ACCEPT, MIMETYPE_APPLICATION_JSON) - .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .header(ORIGIN, Stripchat.baseUri) - .header(REFERER, Stripchat.baseUri + "/favorites") - .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) - .build(); - try (Response response = stripchat.getHttpClient().execute(request)) { - if (response.isSuccessful()) { - JSONObject json = new JSONObject(response.body().string()); - if (json.has("modelIds")) { - JSONArray userIds = json.getJSONArray("modelIds"); - return userIds; - } else { - return new JSONArray(); - } - } else { - throw new HttpException(response.code(), response.message()); - } - } + return loadModels(); } }; } + private List loadModels() throws IOException { + int startIndex = (getPage() - 1) * PAGE_SIZE; + JSONArray favoriteModelIds = loadFavoriteModelIds(); + List modelIdsToLoad = new ArrayList<>(PAGE_SIZE); + List models; + if (startIndex < favoriteModelIds.length()) { + int modelsOnPage = Math.min(PAGE_SIZE, favoriteModelIds.length() - startIndex - 1); + for (var i = 0; i < modelsOnPage; i++) { + modelIdsToLoad.add(favoriteModelIds.getInt(startIndex + i)); + } + models = loadModels(modelIdsToLoad); + } else { + models = Collections.emptyList(); + } + return models; + } + + private List loadModels(List modelIdsToLoad) throws IOException { + List models = new ArrayList<>(); + var urlBuilder = HttpUrl.parse(stripchat.getBaseUrl() + "/api/front/models/list").newBuilder(); + for (var i = 0; i < modelIdsToLoad.size(); i++) { + urlBuilder.addQueryParameter("modelIds["+i+"]", modelIdsToLoad.get(i).toString()); + } + var request = new Request.Builder() + .url(urlBuilder.build()) + .header(ACCEPT, "*/*") + .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) + .header(REFERER, Stripchat.baseUri + "/favorites") + .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) + .build(); + try (var response = stripchat.getHttpClient().execute(request)) { + if (response.isSuccessful()) { + var json = new JSONObject(response.body().string()); + if (json.has("models")) { + var users = json.getJSONArray("models"); + for (var i = 0; i < users.length(); i++) { + var user = users.getJSONObject(i); + StripchatModel model = stripchat.createModel(user.optString("username")); + model.setDescription(user.optString("description")); + model.setPreview(user.optString("previewUrlThumbBig")); + model.setOnlineState(mapStatus(user.optString("status"))); + models.add(model); + } + } + } else { + throw new HttpException(response.code(), response.message()); + } + } + return models; + } + + private JSONArray loadFavoriteModelIds() throws IOException { + SiteUiFactory.getUi(stripchat).login(); + stripchat.getHttpClient().login(); + long userId = ((StripchatHttpClient) stripchat.getHttpClient()).getUserId(); + String url = stripchat.getBaseUrl() + "/api/front/users/" + userId + "/favorites"; + var request = new Request.Builder() + .url(url) + .header(ACCEPT, MIMETYPE_APPLICATION_JSON) + .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) + .header(ORIGIN, Stripchat.baseUri) + .header(REFERER, Stripchat.baseUri + "/favorites") + .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) + .build(); + try (var response = stripchat.getHttpClient().execute(request)) { + if (response.isSuccessful()) { + var json = new JSONObject(response.body().string()); + if (json.has("modelIds")) { + var userIds = json.getJSONArray("modelIds"); + return userIds; + } else { + return new JSONArray(); + } + } else { + throw new HttpException(response.code(), response.message()); + } + } + } + protected ctbrec.Model.State mapStatus(String status) { switch (status) { case "public": diff --git a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatTabProvider.java b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatTabProvider.java index 1d221fca..6050f340 100644 --- a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatTabProvider.java @@ -11,7 +11,7 @@ import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; -public class StripchatTabProvider extends TabProvider { +public class StripchatTabProvider implements TabProvider { private String urlTemplate; private Stripchat stripchat; @@ -49,8 +49,8 @@ public class StripchatTabProvider extends TabProvider { } private Tab createTab(String title, String url) { - StripchatUpdateService updateService = new StripchatUpdateService(url, false, stripchat); - ThumbOverviewTab tab = new ThumbOverviewTab(title, updateService, stripchat); + var updateService = new StripchatUpdateService(url, false, stripchat); + var tab = new ThumbOverviewTab(title, updateService, stripchat); tab.setRecorder(recorder); tab.setImageAspectRatio(9.0 / 16.0); return tab; diff --git a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatUpdateService.java b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatUpdateService.java index 8d8054e0..f216f32c 100644 --- a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatUpdateService.java @@ -8,7 +8,6 @@ import java.util.Collections; import java.util.List; import java.util.Locale; -import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,7 +21,6 @@ import ctbrec.ui.SiteUiFactory; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; -import okhttp3.Response; public class StripchatUpdateService extends PaginatedScheduledService { @@ -44,54 +42,58 @@ public class StripchatUpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - List models = new ArrayList<>(); - if(loginRequired && !stripchat.credentialsAvailable()) { + if (loginRequired && !stripchat.credentialsAvailable()) { return Collections.emptyList(); } else { int offset = (getPage() - 1) * modelsPerPage; int limit = modelsPerPage; String paginatedUrl = url + "&offset=" + offset + "&limit=" + limit; LOG.debug("Fetching page {}", paginatedUrl); - if(loginRequired) { + if (loginRequired) { SiteUiFactory.getUi(stripchat).login(); } - Request request = new Request.Builder() + var request = new Request.Builder() .url(paginatedUrl) .header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(ACCEPT_LANGUAGE, Locale.ENGLISH.getLanguage()) .header(X_REQUESTED_WITH, XML_HTTP_REQUEST) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .build(); - try (Response response = stripchat.getHttpClient().execute(request)) { + try (var response = stripchat.getHttpClient().execute(request)) { if (response.isSuccessful()) { - JSONObject json = new JSONObject(response.body().string()); - if(json.has("models")) { - JSONArray jsonModels = json.getJSONArray("models"); - for (int i = 0; i < jsonModels.length(); i++) { - JSONObject jsonModel = jsonModels.getJSONObject(i); - try { - StripchatModel model = stripchat.createModel(jsonModel.getString("username")); - model.setDescription(""); - model.setPreview(jsonModel.optString("snapshotUrl")); - model.setDisplayName(model.getName()); - model.setOnlineState(Model.State.ONLINE); - models.add(model); - } catch (Exception e) { - LOG.warn("Couldn't parse one of the models: {}", jsonModel, e); - } - } - return models; - } else { - LOG.debug("Response was not successful: {}", json); - return Collections.emptyList(); - } + return parseModels(response.body().string()); } else { throw new HttpException(response.code(), response.message()); } } } + } }; } + private List parseModels(String body) { + List models = new ArrayList<>(); + var json = new JSONObject(body); + if(json.has("models")) { + var jsonModels = json.getJSONArray("models"); + for (var i = 0; i < jsonModels.length(); i++) { + var jsonModel = jsonModels.getJSONObject(i); + try { + StripchatModel model = stripchat.createModel(jsonModel.getString("username")); + model.setDescription(""); + model.setPreview(jsonModel.optString("snapshotUrl")); + model.setDisplayName(model.getName()); + model.setOnlineState(Model.State.ONLINE); + models.add(model); + } catch (Exception e) { + LOG.warn("Couldn't parse one of the models: {}", jsonModel, e); + } + } + return models; + } else { + LOG.debug("Response was not successful: {}", json); + return Collections.emptyList(); + } + } } diff --git a/client/src/main/java/ctbrec/ui/tabs/DonateTabFx.java b/client/src/main/java/ctbrec/ui/tabs/DonateTabFx.java index 551ea4ac..35dc9aac 100644 --- a/client/src/main/java/ctbrec/ui/tabs/DonateTabFx.java +++ b/client/src/main/java/ctbrec/ui/tabs/DonateTabFx.java @@ -18,61 +18,61 @@ public class DonateTabFx extends Tab { public DonateTabFx() { setClosable(false); setText("Donate"); - BorderPane container = new BorderPane(); + var container = new BorderPane(); container.setPadding(new Insets(10)); setContent(container); - VBox headerVbox = new VBox(10); + var headerVbox = new VBox(10); headerVbox.setAlignment(Pos.CENTER); - Label beer = new Label("Buy me some beer?!"); + var beer = new Label("Buy me some beer?!"); beer.setFont(new Font(36)); - Label desc = new Label("If you like this software and want to buy me some beer or pizza, here are some possibilities!"); + var desc = new Label("If you like this software and want to buy me some beer or pizza, here are some possibilities!"); desc.setFont(new Font(24)); headerVbox.getChildren().addAll(beer, desc); - HBox header = new HBox(); + var header = new HBox(); header.setAlignment(Pos.CENTER); header.getChildren().add(headerVbox); header.setPadding(new Insets(20, 0, 0, 0)); container.setTop(header); - int prefWidth = 360; - TextField bitcoinAddress = new TextField("15sLWZon8diPqAX4UdPQU1DcaPuvZs2GgA"); + var prefWidth = 360; + var bitcoinAddress = new TextField("15sLWZon8diPqAX4UdPQU1DcaPuvZs2GgA"); bitcoinAddress.setEditable(false); bitcoinAddress.setPrefWidth(prefWidth); - ImageView bitcoinQrCode = new ImageView(getClass().getResource("/html/bitcoin-address.png").toString()); - Label bitcoinLabel = new Label("Bitcoin"); + var bitcoinQrCode = new ImageView(getClass().getResource("/html/bitcoin-address.png").toString()); + var bitcoinLabel = new Label("Bitcoin"); bitcoinLabel.setGraphic(new ImageView(getClass().getResource("/html/bitcoin.png").toString())); - VBox bitcoinBox = new VBox(5); + var bitcoinBox = new VBox(5); bitcoinBox.setAlignment(Pos.TOP_CENTER); bitcoinBox.getChildren().addAll(bitcoinLabel, bitcoinAddress, bitcoinQrCode); - TextField ethereumAddress = new TextField("0x996041638eEAE7E31f39Ef6e82068d69bA7C090e"); + var ethereumAddress = new TextField("0x996041638eEAE7E31f39Ef6e82068d69bA7C090e"); ethereumAddress.setEditable(false); ethereumAddress.setPrefWidth(prefWidth); - ImageView ethereumQrCode = new ImageView(getClass().getResource("/html/ethereum-address.png").toString()); - Label ethereumLabel = new Label("Ethereum"); + var ethereumQrCode = new ImageView(getClass().getResource("/html/ethereum-address.png").toString()); + var ethereumLabel = new Label("Ethereum"); ethereumLabel.setGraphic(new ImageView(getClass().getResource("/html/ethereum.png").toString())); - VBox ethereumBox = new VBox(5); + var ethereumBox = new VBox(5); ethereumBox.setAlignment(Pos.TOP_CENTER); ethereumBox.getChildren().addAll(ethereumLabel, ethereumAddress, ethereumQrCode); - TextField moneroAddress = new TextField("871K7xaLR2X8E84CUBi7D88diXgKjbhjZHTEFfJv9ec9eo4NVPCQ2UsGxkroseCcKQbZsHMgW3kg6HR4tfct3fX2HoFDzK6"); + var moneroAddress = new TextField("871K7xaLR2X8E84CUBi7D88diXgKjbhjZHTEFfJv9ec9eo4NVPCQ2UsGxkroseCcKQbZsHMgW3kg6HR4tfct3fX2HoFDzK6"); moneroAddress.setEditable(false); moneroAddress.setPrefWidth(prefWidth); - ImageView moneroQrCode = new ImageView(getClass().getResource("/html/monero-address.png").toString()); - Label moneroLabel = new Label("Monero"); + var moneroQrCode = new ImageView(getClass().getResource("/html/monero-address.png").toString()); + var moneroLabel = new Label("Monero"); moneroLabel.setGraphic(new ImageView(getClass().getResource("/html/monero.png").toString())); - VBox moneroBox = new VBox(5); + var moneroBox = new VBox(5); moneroBox.setAlignment(Pos.TOP_CENTER); moneroBox.getChildren().addAll(moneroLabel, moneroAddress, moneroQrCode); - HBox bottomBox = new HBox(5); + var bottomBox = new HBox(5); bottomBox.setAlignment(Pos.CENTER); bottomBox.setSpacing(50); bottomBox.getChildren().addAll(bitcoinBox, ethereumBox, moneroBox); VBox.setMargin(bottomBox, new Insets(20, 0, 0, 0)); - VBox centerBox = new VBox(50); + var centerBox = new VBox(50); centerBox.getChildren().addAll(bottomBox); container.setCenter(centerBox); } diff --git a/client/src/main/java/ctbrec/ui/tabs/HelpTab.java b/client/src/main/java/ctbrec/ui/tabs/HelpTab.java index de8b75a4..8eb7a10e 100644 --- a/client/src/main/java/ctbrec/ui/tabs/HelpTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/HelpTab.java @@ -18,9 +18,9 @@ public class HelpTab extends Tab { setClosable(true); setText("Help"); - Button openHelp = new Button("Open Help"); + var openHelp = new Button("Open Help"); openHelp.setPadding(new Insets(20)); - BorderPane layout = new BorderPane(openHelp); + var layout = new BorderPane(openHelp); BorderPane.setMargin(openHelp, new Insets(20)); setContent(layout); openHelp.setOnAction(e -> { diff --git a/client/src/main/java/ctbrec/ui/tabs/RecentlyWatchedTab.java b/client/src/main/java/ctbrec/ui/tabs/RecentlyWatchedTab.java index b8f8f285..23f6924b 100644 --- a/client/src/main/java/ctbrec/ui/tabs/RecentlyWatchedTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/RecentlyWatchedTab.java @@ -87,10 +87,10 @@ public class RecentlyWatchedTab extends Tab implements ShutdownListener { } private void createGui() { - BorderPane layout = new BorderPane(); + var layout = new BorderPane(); layout.setPadding(new Insets(5, 10, 10, 10)); - SearchBox filterInput = new SearchBox(false); + var filterInput = new SearchBox(false); filterInput.setPromptText("Filter"); filterInput.textProperty().addListener( (observableValue, oldValue, newValue) -> { String filter = filterInput.getText(); @@ -103,7 +103,7 @@ public class RecentlyWatchedTab extends Tab implements ShutdownListener { }); filterInput.getStyleClass().remove("search-box-icon"); HBox.setHgrow(filterInput, Priority.ALWAYS); - HBox topBar = new HBox(5); + var topBar = new HBox(5); topBar.getChildren().addAll(filterInput); layout.setTop(topBar); BorderPane.setMargin(topBar, new Insets(0, 0, 5, 0)); @@ -129,7 +129,7 @@ public class RecentlyWatchedTab extends Tab implements ShutdownListener { } }); - int idx = 0; + var idx = 0; TableColumn name = createTableColumn("Model", 200, idx++); name.setId("name"); name.setCellValueFactory(cdf -> new SimpleStringProperty(cdf.getValue().getModel().getDisplayName())); @@ -152,7 +152,7 @@ public class RecentlyWatchedTab extends Tab implements ShutdownListener { table.getColumns().add(timestamp); table.getSortOrder().add(timestamp); - ScrollPane scrollPane = new ScrollPane(); + var scrollPane = new ScrollPane(); scrollPane.setFitToHeight(true); scrollPane.setFitToWidth(true); scrollPane.setContent(table); @@ -180,18 +180,18 @@ public class RecentlyWatchedTab extends Tab implements ShutdownListener { String[] tokens = filter.split(" "); observableModels.addAll(filteredModels); filteredModels.clear(); - for (int i = 0; i < table.getItems().size(); i++) { - StringBuilder sb = new StringBuilder(); + for (var i = 0; i < table.getItems().size(); i++) { + var sb = new StringBuilder(); for (TableColumn tc : table.getColumns()) { Object cellData = tc.getCellData(i); if(cellData != null) { - String content = cellData.toString(); + var content = cellData.toString(); sb.append(content).append(' '); } } - String searchText = sb.toString(); + var searchText = sb.toString(); - boolean tokensMissing = false; + var tokensMissing = false; for (String token : tokens) { if(!searchText.toLowerCase().contains(token.toLowerCase())) { tokensMissing = true; @@ -216,27 +216,26 @@ public class RecentlyWatchedTab extends Tab implements ShutdownListener { } List selectedModels = selectedRows.stream().map(PlayerStartedEvent::getModel).collect(Collectors.toList()); - MenuItem copyUrl = new MenuItem("Copy URL"); + var copyUrl = new MenuItem("Copy URL"); copyUrl.setOnAction(e -> { - Model selected = selectedModels.get(0); - final Clipboard clipboard = Clipboard.getSystemClipboard(); - final ClipboardContent content = new ClipboardContent(); + var selected = selectedModels.get(0); + final var content = new ClipboardContent(); content.putString(selected.getUrl()); - clipboard.setContent(content); + Clipboard.getSystemClipboard().setContent(content); }); - MenuItem startRecording = new MenuItem("Start Recording"); + var startRecording = new MenuItem("Start Recording"); startRecording.setOnAction(e -> startRecording(selectedModels)); - MenuItem openInBrowser = new MenuItem("Open in Browser"); + var openInBrowser = new MenuItem("Open in Browser"); openInBrowser.setOnAction(e -> DesktopIntegration.open(selectedModels.get(0).getUrl())); - MenuItem openInPlayer = new MenuItem("Open in Player"); + var openInPlayer = new MenuItem("Open in Player"); openInPlayer.setOnAction(e -> openInPlayer(selectedModels.get(0))); - MenuItem follow = new MenuItem("Follow"); + var follow = new MenuItem("Follow"); follow.setOnAction(e -> new FollowAction(getTabPane(), selectedModels).execute()); - MenuItem delete = new MenuItem("Delete"); + var delete = new MenuItem("Delete"); delete.setOnAction(e -> delete(selectedRows)); - MenuItem clearHistory = new MenuItem("Clear history"); + var clearHistory = new MenuItem("Clear history"); clearHistory.setOnAction(e -> clearHistory()); ContextMenu menu = new CustomMouseBehaviorContextMenu(); @@ -290,7 +289,7 @@ public class RecentlyWatchedTab extends Tab implements ShutdownListener { cell.addEventFilter(MouseEvent.MOUSE_CLICKED, event -> { if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) { - Model selectedModel = table.getSelectionModel().getSelectedItem().getModel(); + var selectedModel = table.getSelectionModel().getSelectedItem().getModel(); if(selectedModel != null) { new PlayAction(table, selectedModel).execute(); } @@ -301,27 +300,27 @@ public class RecentlyWatchedTab extends Tab implements ShutdownListener { } private void saveHistory() throws IOException { - Moshi moshi = new Moshi.Builder() + var moshi = new Moshi.Builder() .add(Model.class, new ModelJsonAdapter(sites)) .add(Instant.class, new InstantJsonAdapter()) .build(); Type type = Types.newParameterizedType(List.class, PlayerStartedEvent.class); JsonAdapter> adapter = moshi.adapter(type); String json = adapter.indent(" ").toJson(observableModels); - File recentlyWatched = new File(Config.getInstance().getConfigDir(), "recently_watched.json"); + var recentlyWatched = new File(Config.getInstance().getConfigDir(), "recently_watched.json"); LOG.debug("Saving recently watched models to {}", recentlyWatched.getAbsolutePath()); Files.createDirectories(recentlyWatched.getParentFile().toPath()); Files.write(recentlyWatched.toPath(), json.getBytes(UTF_8), CREATE, WRITE, TRUNCATE_EXISTING); } private void loadHistory() { - File recentlyWatched = new File(Config.getInstance().getConfigDir(), "recently_watched.json"); + var recentlyWatched = new File(Config.getInstance().getConfigDir(), "recently_watched.json"); if(!recentlyWatched.exists()) { return; } LOG.debug("Loading recently watched models from {}", recentlyWatched.getAbsolutePath()); - Moshi moshi = new Moshi.Builder() + var moshi = new Moshi.Builder() .add(Model.class, new ModelJsonAdapter(sites)) .add(Instant.class, new InstantJsonAdapter()) .build(); diff --git a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java index 01f45da6..3478e9c8 100644 --- a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java @@ -708,9 +708,8 @@ public class RecordingsTab extends Tab implements TabSelectionListener, Shutdown try { String hlsBase = config.getServerUrl() + "/hls"; if (recording.isSingleFile()) { - var url = new URL(hlsBase + '/' + recording.getId()); var download = new FileDownload(CamrecApplication.httpClient, createDownloadListener(recording)); - download.start(url, target); + download.start(new URL(hlsBase + '/' + recording.getId()), target); } else { var url = new URL(hlsBase + '/' + recording.getId() + "/playlist.m3u8"); var download = new RecordingDownload(CamrecApplication.httpClient); diff --git a/client/src/main/java/ctbrec/ui/tabs/SiteTabPane.java b/client/src/main/java/ctbrec/ui/tabs/SiteTabPane.java index e8a491d1..8699bfc2 100644 --- a/client/src/main/java/ctbrec/ui/tabs/SiteTabPane.java +++ b/client/src/main/java/ctbrec/ui/tabs/SiteTabPane.java @@ -14,7 +14,7 @@ public class SiteTabPane extends TabPane { setSide(Side.LEFT); // add all tabs - TabProvider tabProvider = SiteUiFactory.getUi(site).getTabProvider(); + var tabProvider = SiteUiFactory.getUi(site).getTabProvider(); for (Tab tab : tabProvider.getTabs(scene)) { getTabs().add(tab); } @@ -31,15 +31,15 @@ public class SiteTabPane extends TabPane { } public void selected() { - Tab selectedTab = getSelectionModel().getSelectedItem(); - if(selectedTab instanceof TabSelectionListener) { + var selectedTab = getSelectionModel().getSelectedItem(); + if (selectedTab instanceof TabSelectionListener) { ((TabSelectionListener) selectedTab).selected(); } } public void deselected() { - Tab selectedTab = getSelectionModel().getSelectedItem(); - if(selectedTab instanceof TabSelectionListener) { + var selectedTab = getSelectionModel().getSelectedItem(); + if (selectedTab instanceof TabSelectionListener) { ((TabSelectionListener) selectedTab).deselected(); } } diff --git a/client/src/main/java/ctbrec/ui/tabs/TabProvider.java b/client/src/main/java/ctbrec/ui/tabs/TabProvider.java index f073f107..5e7f1fbd 100644 --- a/client/src/main/java/ctbrec/ui/tabs/TabProvider.java +++ b/client/src/main/java/ctbrec/ui/tabs/TabProvider.java @@ -5,8 +5,8 @@ import java.util.List; import javafx.scene.Scene; import javafx.scene.control.Tab; -public abstract class TabProvider { +public interface TabProvider { - public abstract List getTabs(Scene scene); - public abstract Tab getFollowedTab(); + public List getTabs(Scene scene); + public Tab getFollowedTab(); } diff --git a/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTab.java b/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTab.java index 032ca925..60be3d6c 100644 --- a/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTab.java @@ -144,7 +144,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { progressIndicator = new ProgressIndicator(); progressIndicator.setPrefSize(100, 100); - SearchBox filterInput = new SearchBox(false); + var filterInput = new SearchBox(false); filterInput.setPromptText("Filter models on this page"); filterInput.textProperty().addListener((observableValue, oldValue, newValue) -> { filter = filterInput.getText(); @@ -156,13 +156,11 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { gridLock.unlock(); } }); - Tooltip filterTooltip = new Tooltip("Filter the models by their name, stream description or #hashtags.\n\n" - + "If the display of stream resolution is enabled, you can even filter for public rooms or by resolution.\n\n" - + "Try \"1080\" or \">720\" or \"public\""); + var filterTooltip = new Tooltip("Filter the models by their name, stream description or #hashtags.\n\nIf the display of stream resolution is enabled, you can even filter for public rooms or by resolution.\n\nTry \"1080\" or \">720\" or \"public\""); filterInput.setTooltip(filterTooltip); filterInput.getStyleClass().remove("search-box-icon"); - SearchBox searchInput = new SearchBox(); + var searchInput = new SearchBox(); searchInput.setPromptText("Search Model"); searchInput.prefWidth(200); searchInput.textProperty().addListener(search()); @@ -183,13 +181,13 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { StackPane.setAlignment(popover, Pos.TOP_RIGHT); StackPane.setMargin(popover, new Insets(35, 50, 0, 0)); - HBox topBar = new HBox(5); + var topBar = new HBox(5); HBox.setHgrow(filterInput, Priority.ALWAYS); topBar.getChildren().add(filterInput); if (site.supportsTips() && site.credentialsAvailable()) { - Button buyTokens = new Button("Buy Tokens"); + var buyTokens = new Button("Buy Tokens"); buyTokens.setOnAction(e -> DesktopIntegration.open(site.getBuyTokensLink())); - TokenLabel tokenBalance = new TokenLabel(site); + var tokenBalance = new TokenLabel(site); tokenBalance.setAlignment(Pos.CENTER_RIGHT); tokenBalance.prefHeightProperty().bind(buyTokens.heightProperty()); topBar.getChildren().addAll(tokenBalance, buyTokens); @@ -204,7 +202,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { scrollPane.setFitToHeight(true); scrollPane.setFitToWidth(true); if (Config.getInstance().getSettings().fastScrollSpeed) { - FasterVerticalScrollPaneSkin scrollPaneSkin = new FasterVerticalScrollPaneSkin(scrollPane); + var scrollPaneSkin = new FasterVerticalScrollPaneSkin(scrollPane); scrollPane.setSkin(scrollPaneSkin); } BorderPane.setMargin(scrollPane, new Insets(5)); @@ -224,8 +222,8 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { pageNext.setTooltip(new Tooltip("Next Page")); pageNext.setOnAction(e -> nextPage()); - HBox thumbSizeSelector = new HBox(5); - Label l = new Label("Thumb Size"); + var thumbSizeSelector = new HBox(5); + var l = new Label("Thumb Size"); l.setPadding(new Insets(5, 0, 0, 0)); thumbSizeSelector.getChildren().add(l); List thumbWidths = new ArrayList<>(); @@ -243,11 +241,11 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { thumbSizeSelector.getChildren().add(thumbWidth); BorderPane.setMargin(thumbSizeSelector, new Insets(5)); - BorderPane bottomPane = new BorderPane(); + var bottomPane = new BorderPane(); bottomPane.setLeft(pagination); bottomPane.setRight(thumbSizeSelector); - BorderPane borderPane = new BorderPane(); + var borderPane = new BorderPane(); borderPane.setPadding(new Insets(5)); borderPane.setTop(topBar); borderPane.setCenter(scrollPane); @@ -315,7 +313,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { private void handlePageNumberInput(ActionEvent event) { try { - int page = Integer.parseInt(pageInput.getText()); + var page = Integer.parseInt(pageInput.getText()); page = Math.max(1, page); changePageTo(page); } catch (NumberFormatException e) { @@ -383,9 +381,9 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { private void createOrUpdateModelCells(ObservableList nodes, List models) { List positionChangedOrNew = new ArrayList<>(); - int index = 0; + var index = 0; for (Model model : models) { - boolean found = false; + var found = false; for (Node node : nodes) { // NOSONAR if (!(node instanceof ThumbCell)) continue; @@ -401,7 +399,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { } } if (!found) { - ThumbCell newCell = createThumbCell(model, recorder); + var newCell = createThumbCell(model, recorder); newCell.setIndex(index); positionChangedOrNew.add(newCell); } @@ -423,7 +421,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { private void removeModelsMissingInUpdate(ObservableList nodes, List models) { for (Iterator iterator = nodes.iterator(); iterator.hasNext();) { - Node node = iterator.next(); + var node = iterator.next(); if (!(node instanceof ThumbCell)) continue; ThumbCell cell = (ThumbCell) node; @@ -434,7 +432,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { } ThumbCell createThumbCell(Model model, Recorder recorder) { - ThumbCell newCell = new ThumbCell(this, model, recorder, imageAspectRatio); + var newCell = new ThumbCell(this, model, recorder, imageAspectRatio); newCell.setImageAspectRatio(imageAspectRatio); newCell.preserveAspectRatioProperty().bind(preserveAspectRatio); newCell.addEventHandler(ContextMenuEvent.CONTEXT_MENU_REQUESTED, event -> { @@ -771,10 +769,10 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { } else { // remove the ones from grid, which don't match for (Iterator iterator = grid.getChildren().iterator(); iterator.hasNext();) { - Node node = iterator.next(); + var node = iterator.next(); if (node instanceof ThumbCell) { ThumbCell cell = (ThumbCell) node; - Model m = cell.getModel(); + var m = cell.getModel(); if (!matches(m, filter)) { iterator.remove(); filteredThumbCells.add(cell); @@ -785,8 +783,8 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { // add the ones, which might have been filtered before, but now match for (Iterator iterator = filteredThumbCells.iterator(); iterator.hasNext();) { - ThumbCell thumbCell = iterator.next(); - Model m = thumbCell.getModel(); + var thumbCell = iterator.next(); + var m = thumbCell.getModel(); if (matches(m, filter)) { iterator.remove(); insert(thumbCell); @@ -805,7 +803,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { List thumbsToMove = new ArrayList<>(); ObservableList thumbs = grid.getChildren(); for (int i = thumbs.size() - 1; i >= 0; i--) { - Node node = thumbs.get(i); + var node = thumbs.get(i); if (node instanceof ThumbCell) { ThumbCell thumb = (ThumbCell) thumbs.get(i); if (recorder.isTracked(thumb.getModel())) { @@ -832,7 +830,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { private boolean matches(Model m, String filter) { try { String[] tokens = filter.split(" "); - boolean tokensMissing = false; + var tokensMissing = false; for (String token : tokens) { if (!modelPropertiesMatchToken(token, m)) { tokensMissing = true; @@ -905,7 +903,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { } queue.clear(); if (updateService != null) { - State s = updateService.getState(); + var s = updateService.getState(); if (s != State.SCHEDULED && s != State.RUNNING) { updateService.reset(); updateService.restart(); @@ -922,9 +920,9 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { queue.clear(); for (Iterator iterator = grid.getChildren().iterator(); iterator.hasNext();) { - Node node = iterator.next(); + var node = iterator.next(); if (node instanceof ThumbCell) { - ThumbCell thumbCell = (ThumbCell) node; + var thumbCell = (ThumbCell) node; thumbCell.releaseResources(); iterator.remove(); } @@ -945,7 +943,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { private static ThreadFactory createThreadFactory() { return r -> { - Thread t = new Thread(r); + var t = new Thread(r); t.setDaemon(true); t.setPriority(Thread.MIN_PRIORITY); t.setName("ResolutionDetector-" + threadCounter++); diff --git a/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTabSearchTask.java b/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTabSearchTask.java index c5f817ac..92dbfa93 100644 --- a/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTabSearchTask.java +++ b/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTabSearchTask.java @@ -35,7 +35,7 @@ public class ThumbOverviewTabSearchTask extends Task> { @Override protected List call() throws Exception { if(site.searchRequiresLogin()) { - boolean loggedin = false; + var loggedin = false; try { loggedin = SiteUiFactory.getUi(site).login(); } catch (IOException e) { diff --git a/client/src/main/java/ctbrec/ui/tabs/UpdateTab.java b/client/src/main/java/ctbrec/ui/tabs/UpdateTab.java index 1292f832..96e42c5f 100644 --- a/client/src/main/java/ctbrec/ui/tabs/UpdateTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/UpdateTab.java @@ -28,12 +28,12 @@ public class UpdateTab extends Tab implements TabSelectionListener { public UpdateTab(Release latest) { setText("Update Available"); - VBox vbox = new VBox(10); - Label l = new Label("New Version available " + latest.getVersion()); + var vbox = new VBox(10); + var l = new Label("New Version available " + latest.getVersion()); vbox.getChildren().add(l); VBox.setMargin(l, new Insets(20, 0, 0, 0)); - Button button = new Button("Download"); - button.setOnAction((e) -> DesktopIntegration.open(latest.getHtmlUrl())); + var button = new Button("Download"); + button.setOnAction(e -> DesktopIntegration.open(latest.getHtmlUrl())); vbox.getChildren().add(button); VBox.setMargin(button, new Insets(0, 0, 10, 0)); vbox.setAlignment(Pos.CENTER); diff --git a/client/src/main/java/ctbrec/ui/tabs/logging/LoggingTab.java b/client/src/main/java/ctbrec/ui/tabs/logging/LoggingTab.java index 1fd2a770..60639fbf 100644 --- a/client/src/main/java/ctbrec/ui/tabs/logging/LoggingTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/logging/LoggingTab.java @@ -13,7 +13,6 @@ import org.slf4j.LoggerFactory; import com.google.common.eventbus.Subscribe; -import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.encoder.PatternLayoutEncoder; import ch.qos.logback.classic.spi.IThrowableProxy; import ch.qos.logback.classic.spi.LoggingEvent; @@ -88,14 +87,14 @@ public class LoggingTab extends Tab implements TabSelectionListener { table = new TableView<>(filteredEvents); - int idx = 0; + var idx = 0; TableColumn level = createTableColumn("Level", 65, idx++); level.setCellValueFactory(cdf -> new SimpleStringProperty(cdf.getValue().getLevel().toString())); table.getColumns().add(level); TableColumn time = createTableColumn("Timestamp", 200, idx++); time.setCellValueFactory(cdf -> { - Instant instant = Instant.ofEpochMilli(cdf.getValue().getTimeStamp()); + var instant = Instant.ofEpochMilli(cdf.getValue().getTimeStamp()); return new SimpleStringProperty(instant.atZone(ZoneId.systemDefault()).format(timeFormatter)); }); table.getColumns().add(time); @@ -116,7 +115,7 @@ public class LoggingTab extends Tab implements TabSelectionListener { msg.setCellValueFactory(cdf -> new SimpleStringProperty(createLogMessage(cdf.getValue()))); table.getColumns().add(msg); - BorderPane layout = new BorderPane(); + var layout = new BorderPane(); BorderPane.setMargin(table, new Insets(10)); BorderPane.setMargin(filter, new Insets(10, 10, 0, 10)); layout.setCenter(table); @@ -151,29 +150,26 @@ public class LoggingTab extends Tab implements TabSelectionListener { if (selectedEvents.isEmpty()) { return null; } - MenuItem copy = new MenuItem("Copy"); - copy.setOnAction(e -> { - Platform.runLater(() -> { - String formattedMessages = getFormattedMessages(selectedEvents); - final Clipboard clipboard = Clipboard.getSystemClipboard(); - final ClipboardContent content = new ClipboardContent(); - content.putString(formattedMessages); - clipboard.setContent(content); - }); - }); + var copy = new MenuItem("Copy"); + copy.setOnAction(e -> Platform.runLater(() -> { + String formattedMessages = getFormattedMessages(selectedEvents); + final var content = new ClipboardContent(); + content.putString(formattedMessages); + Clipboard.getSystemClipboard().setContent(content); + })); ContextMenu menu = new CustomMouseBehaviorContextMenu(copy); return menu; } private String getFormattedMessages(ObservableList selectedEvents) { - StringBuilder sb = new StringBuilder(); + var sb = new StringBuilder(); - ch.qos.logback.classic.Logger rootLogger = (ch.qos.logback.classic.Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); - LoggerContext loggerContext = rootLogger.getLoggerContext(); + var rootLogger = (ch.qos.logback.classic.Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + var loggerContext = rootLogger.getLoggerContext(); loggerContext.reset(); - PatternLayoutEncoder encoder = new PatternLayoutEncoder(); + var encoder = new PatternLayoutEncoder(); encoder.setContext(loggerContext); encoder.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n"); encoder.start(); @@ -186,7 +182,7 @@ public class LoggingTab extends Tab implements TabSelectionListener { } private String createLogMessage(LoggingEvent evt) { - StringBuilder sb = new StringBuilder(evt.getFormattedMessage()); + var sb = new StringBuilder(evt.getFormattedMessage()); IThrowableProxy throwableProxy = evt.getThrowableProxy(); while (throwableProxy != null) { sb.append('\n').append(throwableProxy.getClassName()).append(':').append(' ').append(throwableProxy.getMessage()); diff --git a/client/src/main/java/ctbrec/ui/tabs/recorded/RecordLaterTab.java b/client/src/main/java/ctbrec/ui/tabs/recorded/RecordLaterTab.java index 9b73a4fd..a5f85da7 100644 --- a/client/src/main/java/ctbrec/ui/tabs/recorded/RecordLaterTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/recorded/RecordLaterTab.java @@ -124,7 +124,7 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { table.setEditable(true); table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); - PreviewPopupHandler previewPopupHandler = new PreviewPopupHandler(table); + var previewPopupHandler = new PreviewPopupHandler(table); table.setRowFactory(tableview -> { TableRow row = new TableRow<>(); row.addEventHandler(MouseEvent.ANY, previewPopupHandler); @@ -202,7 +202,7 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { scrollPane.setContent(table); - HBox addModelBox = new HBox(5); + var addModelBox = new HBox(5); modelLabel.setPadding(new Insets(5, 0, 0, 0)); ObservableList suggestions = FXCollections.observableArrayList(); sites.forEach(site -> suggestions.add(site.getClass().getSimpleName())); @@ -223,7 +223,7 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { checkModelAccountExistance.setOnAction(evt -> new CheckModelAccountAction(checkModelAccountExistance, recorder) .execute(Model::isMarkedForLaterRecording)); - HBox filterContainer = new HBox(); + var filterContainer = new HBox(); filterContainer.setSpacing(0); filterContainer.setPadding(new Insets(0)); filterContainer.setAlignment(Pos.CENTER_RIGHT); @@ -247,7 +247,7 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { filterContainer.getChildren().add(filter); addModelBox.getChildren().add(filterContainer); - BorderPane root = new BorderPane(); + var root = new BorderPane(); root.setPadding(new Insets(5)); root.setTop(addModelBox); root.setCenter(scrollPane); @@ -259,7 +259,7 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { private void jumpToNextModel(KeyCode code) { if (!table.getItems().isEmpty() && (code.isLetterKey() || code.isDigitKey())) { // determine where to start looking for the next model - int startAt = 0; + var startAt = 0; if (table.getSelectionModel().getSelectedIndex() >= 0) { startAt = table.getSelectionModel().getSelectedIndex() + 1; if (startAt >= table.getItems().size()) { @@ -300,7 +300,7 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { private void addModelByUrl(String url) { for (Site site : sites) { - Model newModel = site.createModelFromUrl(url); + var newModel = site.createModelFromUrl(url); if (newModel != null) { try { newModel.setMarkedForLaterRecording(true); @@ -328,7 +328,7 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { for (Site site : sites) { if (Objects.equals(siteName.toLowerCase(), site.getClass().getSimpleName().toLowerCase())) { try { - Model m = site.createModel(modelName); + var m = site.createModel(modelName); m.setMarkedForLaterRecording(true); recorder.addModel(m); } catch (IOException | InvalidKeyException | NoSuchAlgorithmException | IllegalStateException e1) { @@ -407,18 +407,18 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { String[] tokens = filter.split(" "); observableModels.addAll(filteredModels); filteredModels.clear(); - for (int i = 0; i < table.getItems().size(); i++) { - StringBuilder sb = new StringBuilder(); + for (var i = 0; i < table.getItems().size(); i++) { + var sb = new StringBuilder(); for (TableColumn tc : table.getColumns()) { Object cellData = tc.getCellData(i); if (cellData != null) { - String content = cellData.toString(); + var content = cellData.toString(); sb.append(content).append(' '); } } - String searchText = sb.toString(); + var searchText = sb.toString(); - boolean tokensMissing = false; + var tokensMissing = false; for (String token : tokens) { if (!searchText.toLowerCase().contains(token.toLowerCase())) { tokensMissing = true; @@ -450,7 +450,7 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { } }; ExecutorService executor = Executors.newSingleThreadExecutor(r -> { - Thread t = new Thread(r); + var t = new Thread(r); t.setDaemon(true); t.setName("RecordLaterTab UpdateService"); return t; @@ -479,30 +479,29 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { if (selectedModels.isEmpty()) { return null; } - MenuItem start = new MenuItem("Start Recording"); + var start = new MenuItem("Start Recording"); start.setOnAction(e -> startAction(selectedModels)); - MenuItem stop = new MenuItem("Remove Model"); + var stop = new MenuItem("Remove Model"); stop.setOnAction(e -> stopAction(selectedModels)); - MenuItem copyUrl = new MenuItem("Copy URL"); + var copyUrl = new MenuItem("Copy URL"); copyUrl.setOnAction(e -> { Model selected = selectedModels.get(0); - final Clipboard clipboard = Clipboard.getSystemClipboard(); - final ClipboardContent content = new ClipboardContent(); + final var content = new ClipboardContent(); content.putString(selected.getUrl()); - clipboard.setContent(content); + Clipboard.getSystemClipboard().setContent(content); }); - MenuItem openInBrowser = new MenuItem("Open in Browser"); + var openInBrowser = new MenuItem("Open in Browser"); openInBrowser.setOnAction(e -> DesktopIntegration.open(selectedModels.get(0).getUrl())); - MenuItem openInPlayer = new MenuItem("Open in Player"); + var openInPlayer = new MenuItem("Open in Player"); openInPlayer.setOnAction(e -> openInPlayer(selectedModels.get(0))); - MenuItem follow = new MenuItem("Follow"); + var follow = new MenuItem("Follow"); follow.setOnAction(e -> follow(selectedModels)); follow.setDisable(!selectedModels.stream().allMatch(m -> m.getSite().supportsFollow() && m.getSite().credentialsAvailable())); - MenuItem ignore = new MenuItem("Ignore"); + var ignore = new MenuItem("Ignore"); ignore.setOnAction(e -> ignore(selectedModels)); - MenuItem notes = new MenuItem("Notes"); + var notes = new MenuItem("Notes"); notes.setOnAction(e -> notes(selectedModels)); ContextMenu menu = new CustomMouseBehaviorContextMenu(start, stop, copyUrl, openInPlayer, openInBrowser, follow, notes, ignore); @@ -539,7 +538,7 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { } private void stopAction(List selectedModels) { - boolean confirmed = true; + var confirmed = true; if (Config.getInstance().getSettings().confirmationForDangerousActions) { int n = selectedModels.size(); String plural = n > 1 ? "s" : ""; @@ -562,9 +561,9 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { Config.getInstance().getSettings().recordLaterSortType = col.getSortType().toString(); } int columns = table.getColumns().size(); - double[] columnWidths = new double[columns]; - String[] columnIds = new String[columns]; - for (int i = 0; i < columnWidths.length; i++) { + var columnWidths = new double[columns]; + var columnIds = new String[columns]; + for (var i = 0; i < columnWidths.length; i++) { columnWidths[i] = table.getColumns().get(i).getWidth(); columnIds[i] = table.getColumns().get(i).getId(); } @@ -595,8 +594,8 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { private void restoreColumnOrder() { String[] columnIds = Config.getInstance().getSettings().recordLaterColumnIds; ObservableList> columns = table.getColumns(); - for (int i = 0; i < columnIds.length; i++) { - for (int j = 0; j < table.getColumns().size(); j++) { + for (var i = 0; i < columnIds.length; i++) { + for (var j = 0; j < table.getColumns().size(); j++) { if(Objects.equals(columnIds[i], columns.get(j).getId())) { TableColumn col = columns.get(j); columns.remove(j); // NOSONAR @@ -609,7 +608,7 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { private void restoreColumnWidths() { double[] columnWidths = Config.getInstance().getSettings().recordLaterColumnWidths; if (columnWidths != null && columnWidths.length == table.getColumns().size()) { - for (int i = 0; i < columnWidths.length; i++) { + for (var i = 0; i < columnWidths.length; i++) { table.getColumns().get(i).setPrefWidth(columnWidths[i]); } } diff --git a/client/src/main/java/ctbrec/ui/tabs/recorded/RecordedTab.java b/client/src/main/java/ctbrec/ui/tabs/recorded/RecordedTab.java index 547fdd33..45882fca 100644 --- a/client/src/main/java/ctbrec/ui/tabs/recorded/RecordedTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/recorded/RecordedTab.java @@ -42,7 +42,7 @@ public class RecordedTab extends Tab implements TabSelectionListener, ShutdownLi @Override public void selected() { - Tab selectedTab = tabPane.getSelectionModel().getSelectedItem(); + var selectedTab = tabPane.getSelectionModel().getSelectedItem(); if(selectedTab instanceof TabSelectionListener) { ((TabSelectionListener) selectedTab).selected(); } @@ -50,7 +50,7 @@ public class RecordedTab extends Tab implements TabSelectionListener, ShutdownLi @Override public void deselected() { - Tab selectedTab = tabPane.getSelectionModel().getSelectedItem(); + var selectedTab = tabPane.getSelectionModel().getSelectedItem(); if(selectedTab instanceof TabSelectionListener) { ((TabSelectionListener) selectedTab).deselected(); }