From 385193f57bc526c23278fcbcc4272ef953ddb8ef Mon Sep 17 00:00:00 2001 From: Jannik Date: Thu, 1 Mar 2018 15:42:47 +0100 Subject: [PATCH] cemu_UIs updater and code cleanup * clean up the folder structure for better maintenance * lots of code cleanup --- .../HomeFlix/application}/Main.java | 117 ++-- .../application}/MainWindowController.java | 271 ++++---- .../HomeFlix/controller/DBController.java | 655 ++++++++++++++++++ .../HomeFlix/controller/UpdateController.java | 163 +++++ .../HomeFlix/controller}/apiQuery.java | 114 +-- .../HomeFlix/datatypes}/tableData.java | 23 +- .../Project_HomeFlix/DBController.java | 634 ----------------- .../Project_HomeFlix/updater.java | 105 --- src/main/resources/fxml/MainWindow.fxml | 4 +- .../locals/HomeFlix-Local_de_DE.properties | 6 +- .../locals/HomeFlix-Local_en_US.properties | 6 +- 11 files changed, 1120 insertions(+), 978 deletions(-) rename src/main/java/{org/kellerkinder/Project_HomeFlix => kellerkinder/HomeFlix/application}/Main.java (72%) rename src/main/java/{org/kellerkinder/Project_HomeFlix => kellerkinder/HomeFlix/application}/MainWindowController.java (88%) create mode 100644 src/main/java/kellerkinder/HomeFlix/controller/DBController.java create mode 100644 src/main/java/kellerkinder/HomeFlix/controller/UpdateController.java rename src/main/java/{org/kellerkinder/Project_HomeFlix => kellerkinder/HomeFlix/controller}/apiQuery.java (60%) rename src/main/java/{org/kellerkinder/Project_HomeFlix => kellerkinder/HomeFlix/datatypes}/tableData.java (83%) delete mode 100644 src/main/java/org/kellerkinder/Project_HomeFlix/DBController.java delete mode 100644 src/main/java/org/kellerkinder/Project_HomeFlix/updater.java diff --git a/src/main/java/org/kellerkinder/Project_HomeFlix/Main.java b/src/main/java/kellerkinder/HomeFlix/application/Main.java similarity index 72% rename from src/main/java/org/kellerkinder/Project_HomeFlix/Main.java rename to src/main/java/kellerkinder/HomeFlix/application/Main.java index a1dcb48..b76e774 100644 --- a/src/main/java/org/kellerkinder/Project_HomeFlix/Main.java +++ b/src/main/java/kellerkinder/HomeFlix/application/Main.java @@ -1,7 +1,7 @@ /** - * Project HomeFlix - * - * Copyright 2016-2017 + * Project-HomeFlix + * + * Copyright 2016-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ * */ -package org.kellerkinder.Project_HomeFlix; +package kellerkinder.HomeFlix.application; import java.io.File; import java.io.IOException; @@ -44,109 +44,104 @@ import javafx.stage.Stage; public class Main extends Application { - Stage primaryStage; + private Stage primaryStage; + private Scene scene; + private AnchorPane pane; + private MainWindowController mainWindowController; + private static String userHome = System.getProperty("user.home"); + private static String userName = System.getProperty("user.name"); + private static String osName = System.getProperty("os.name"); + private static String osArch = System.getProperty("os.arch"); + private static String osVers = System.getProperty("os.version"); + private static String javaVers = System.getProperty("java.version"); + private static String javaVend= System.getProperty("java.vendor"); + private String dirWin = System.getProperty("user.home") + "/Documents/HomeFlix"; //Windows: C:/Users/"User"/Documents/HomeFlix + private String dirLinux = System.getProperty("user.home") + "/HomeFlix"; //Linux: /home/"User"/HomeFlix + private File directory; + private File configFile; + private File posterCache; + private String path; - String currentWorkingDirectory; - private String COLOR = "ee3523"; private String FONT_FAMILY = "System"; private String mode = "local"; //local or streaming TODO private String local = System.getProperty("user.language")+"_"+System.getProperty("user.country"); - private boolean AUTO_UPDATE = false; private double FONT_SIZE = 17; private ResourceBundle bundle; - private MainWindowController mainWindowController; - private File directory; - private File settingsFile; - private File posterCache; - private String dirWin = System.getProperty("user.home") + "/Documents/HomeFlix"; //Windows: C:/Users/"User"/Documents/HomeFlix - private String dirLinux = System.getProperty("user.home") + "/HomeFlix"; //Linux: /home/"User"/HomeFlix private static Logger LOGGER; @Override public void start(Stage primaryStage) throws IOException { - currentWorkingDirectory = new java.io.File( "." ).getCanonicalPath(); + LOGGER.info("OS: " + osName + " " + osVers + " " + osArch); + LOGGER.info("Java: " + javaVend + " " + javaVers); + LOGGER.info("User: " + userName + " " + userHome); + this.primaryStage = primaryStage; mainWindow(); } private void mainWindow(){ - try { FXMLLoader loader = new FXMLLoader(); loader.setLocation(ClassLoader.getSystemResource("fxml/MainWindow.fxml")); - AnchorPane pane = (AnchorPane) loader.load(); + pane = (AnchorPane) loader.load(); primaryStage.setMinHeight(600.00); primaryStage.setMinWidth(950.00); primaryStage.setResizable(false); primaryStage.setTitle("Project HomeFlix"); - primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream("/icons/Homeflix_Icon_64x64.png"))); //adds application icon - + primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream("/icons/Homeflix_Icon_64x64.png"))); //adds application icon mainWindowController = loader.getController(); //Link of FXMLController and controller class - mainWindowController.setAutoUpdate(AUTO_UPDATE); //set auto-update - mainWindowController.setCurrentWorkingDirectory(currentWorkingDirectory); mainWindowController.setMain(this); //call setMain + - /**Linux else Windows, check if directory & config exist - * Windows: config file: C:/Users/"User"/Documents/HomeFlix/config.xml - * directory: C:/Users/"User"/Documents/HomeFlix - * Linux: config file: /home/"User"/HomeFlix/config.xml - * directory: /home/"User"/HomeFlix - */ - if(System.getProperty("os.name").equals("Linux")) { + // get OS and the specific paths + if (osName.equals("Linux")) { directory = new File(dirLinux); - settingsFile = new File(dirLinux + "/config.xml"); + configFile = new File(dirLinux + "/config.xml"); + posterCache = new File(dirLinux + "/posterCache"); } else { directory = new File(dirWin); - settingsFile = new File(dirWin + "/config.xml"); + configFile = new File(dirWin + "/config.xml"); + posterCache = new File(dirWin + "/posterCache"); } - posterCache = new File(directory+"/posterCache"); - - if(!settingsFile.exists()){ + // startup checks + if (!configFile.exists()) { directory.mkdir(); mainWindowController.setPath(firstStart()); mainWindowController.setStreamingPath(directory.getAbsolutePath()); - mainWindowController.setColor(COLOR); + mainWindowController.setColor("ee3523"); mainWindowController.setSize(FONT_SIZE); - mainWindowController.setAutoUpdate(AUTO_UPDATE); + mainWindowController.setAutoUpdate(false); mainWindowController.setLocal(local); mainWindowController.setMode(mode); mainWindowController.saveSettings(); try { - Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //start again (preventing Bugs) - System.exit(0); //finishes it self + Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); // start again (preventing Bugs) TODO is this really needed + System.exit(0); // finishes it self } catch (Exception e) { LOGGER.error("error while restarting HomeFlix", e); } } - - if(!posterCache.exists()) { + + if (!posterCache.exists()) { posterCache.mkdir(); } - mainWindowController.loadSettings(); - mainWindowController.loadStreamingSettings(); - mainWindowController.initUI(); - mainWindowController.initActions(); - mainWindowController.initTabel(); - mainWindowController.setLocalUI(); - mainWindowController.applyColor(); //set theme color - - mainWindowController.dbController.main(); //initialize database controller - mainWindowController.dbController.createDatabase(); //creating the database - mainWindowController.dbController.loadData(); //loading data from database to mainWindowController - mainWindowController.addDataUI(); - - Scene scene = new Scene(pane); //create new scene, append pane to scene + // generate window + scene = new Scene(pane); // create new scene, append pane to scene scene.getStylesheets().add(getClass().getResource("/css/MainWindow.css").toExternalForm()); - primaryStage.setScene(scene); //append scene to stage - primaryStage.show(); //show stage + primaryStage.setScene(scene); // append scene to stage + primaryStage.show(); // show stage + + // init here as it loads the games to the mwc and the gui, therefore the window must exist + mainWindowController.init(); + mainWindowController.dbController.init(); } catch (IOException e) { - LOGGER.error("", e); + LOGGER.error(e); } } - //Method for first Start + // Method for first Start private String firstStart(){ MainWindowController.firststart = true; switch(System.getProperty("user.language")+"_"+System.getProperty("user.country")){ @@ -190,6 +185,14 @@ public class Main extends Application { launch(args); } + public Stage getPrimaryStage() { + return primaryStage; + } + + public void setPrimaryStage(Stage primaryStage) { + this.primaryStage = primaryStage; + } + public String getFONT_FAMILY() { return FONT_FAMILY; } diff --git a/src/main/java/org/kellerkinder/Project_HomeFlix/MainWindowController.java b/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java similarity index 88% rename from src/main/java/org/kellerkinder/Project_HomeFlix/MainWindowController.java rename to src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java index 10ef533..fe321a8 100644 --- a/src/main/java/org/kellerkinder/Project_HomeFlix/MainWindowController.java +++ b/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java @@ -1,7 +1,7 @@ /** - * Project HomeFlix + * Project-HomeFlix * - * Copyright 2016-2017 + * Copyright 2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,8 @@ * MA 02110-1301, USA. * */ -package org.kellerkinder.Project_HomeFlix; + +package kellerkinder.HomeFlix.application; import java.awt.Desktop; import java.io.BufferedReader; @@ -89,6 +90,10 @@ import javafx.scene.text.Font; import javafx.scene.text.TextFlow; import javafx.stage.DirectoryChooser; import javafx.util.Duration; +import kellerkinder.HomeFlix.controller.DBController; +import kellerkinder.HomeFlix.controller.UpdateController; +import kellerkinder.HomeFlix.controller.apiQuery; +import kellerkinder.HomeFlix.datatypes.tableData; public class MainWindowController { @FXML @@ -106,7 +111,7 @@ public class MainWindowController { @FXML private TableView tableViewStreamingdata; @FXML - TextFlow textFlow; + private TextFlow textFlow; @FXML ScrollPane scrollPane; @FXML @@ -136,7 +141,7 @@ public class MainWindowController { @FXML private JFXHamburger menuHam; @FXML - private JFXToggleButton autoupdateBtn; + private JFXToggleButton autoUpdateToggleBtn; @FXML public JFXTextField tfPath; @FXML @@ -161,8 +166,8 @@ public class MainWindowController { private Label mainColorLabel; @FXML private Label localLabel; - @FXML - ImageView image1; + @FXML + private ImageView image1; private ImageView imv1; @@ -194,20 +199,22 @@ public class MainWindowController { private boolean settingsTrue = false; private boolean streamingSettingsTrue = false; private boolean autoUpdate = false; + private boolean useBeta = false; static boolean firststart = false; private static final Logger LOGGER = LogManager.getLogger(MainWindowController.class.getName()); private int hashA = -647380320; private String version = "0.5.2"; - private String buildNumber = "129"; + private String buildNumber = "131"; private String versionName = "solidify cow"; private File dirWin = new File(System.getProperty("user.home") + "/Documents/HomeFlix"); private File dirLinux = new File(System.getProperty("user.home") + "/HomeFlix"); private File fileWin = new File(dirWin + "/config.xml"); private File fileLinux = new File(dirLinux + "/config.xml"); - String errorUpdateD; - String errorUpdateV; - String noFilmFound; + public String errorUpdateD; + public String errorUpdateV; + public String noFilmFound; + private String errorPlay; private String errorOpenStream; private String errorMode; @@ -215,7 +222,6 @@ public class MainWindowController { private String errorSave; private String infoText; private String vlcNotInstalled; - private String currentWorkingDirectory; private String path; private String streamingPath; private String color; @@ -224,29 +230,14 @@ public class MainWindowController { private String mode; private String ratingSortType; private String local; - String title; - String year; - String rating; - String publishedOn; - String duration; - String genre; - String director; - String writer; - String actors; - String plot; - String language; - String country; - String awards; - String metascore; - String imdbRating; - String type; - double size; + + public double size; private int last; private int selected; private int next; private File selectedFolder; private File selectedStreamingFolder; - ResourceBundle bundle; + private ResourceBundle bundle; private ObservableList filterData = FXCollections.observableArrayList(); private ObservableList locals = FXCollections.observableArrayList("English (en_US)", "Deutsch (de_DE)"); @@ -266,7 +257,8 @@ public class MainWindowController { Properties props = new Properties(); private Main main; - private updater Updater; + private UpdateController updateController; +// private updater Updater; private apiQuery ApiQuery; DBController dbController; @@ -354,7 +346,7 @@ public class MainWindowController { alert.setTitle("Info"); alert.setHeaderText("Project HomeFlix"); alert.setContentText(infoText); - alert.initOwner(main.primaryStage); + alert.initOwner(main.getPrimaryStage()); alert.showAndWait(); } @@ -451,18 +443,19 @@ public class MainWindowController { @FXML private void updateBtnAction(){ - Thread updateThread = new Thread(Updater); + updateController = new UpdateController(this, buildNumber, useBeta); + Thread updateThread = new Thread(updateController); updateThread.setName("Updater"); updateThread.start(); } @FXML - private void autoupdateBtnAction(){ - if(autoUpdate){ - setAutoUpdate(false); - }else{ - setAutoUpdate(true); - } + private void autoUpdateToggleBtnAction(){ + if (autoUpdate) { + setAutoUpdate(false); + } else { + setAutoUpdate(true); + } saveSettings(); } @@ -495,13 +488,21 @@ public class MainWindowController { */ void setMain(Main main) { this.main = main; - Updater = new updater(this, buildNumber); - dbController = new DBController(this, this.main); + dbController = new DBController(this.main, this); ApiQuery = new apiQuery(this, dbController, this.main); } + void init() { + loadSettings(); + loadStreamingSettings(); + checkAutoUpdate(); + initTabel(); + initActions(); + initUI(); + } + //Initialize the tables (treeTableViewfilm and tableViewStreamingdata) - void initTabel(){ + void initTabel() { //film Table columnRating.setMaxWidth(80); @@ -753,32 +754,22 @@ public class MainWindowController { }); } - //initialize UI elements - void initUI(){ - LOGGER.info("Mode: "+mode); //TODO debugging - debugBtn.setDisable(true); //debugging button for tests + // initialize UI elements + void initUI() { + LOGGER.info("Mode: " + mode); // TODO debugging + debugBtn.setDisable(true); // debugging button for tests debugBtn.setVisible(false); - - tfPath.setText(getPath()); - sliderFontSize.setValue(getSize()); + + tfPath.setText(getPath()); + sliderFontSize.setValue(getSize()); mainColor.setValue(Color.valueOf(getColor())); + + updateBtn.setFont(Font.font("System", 12)); + autoUpdateToggleBtn.setSelected(isAutoUpdate()); + cbLocal.setItems(locals); - updateBtn.setFont(Font.font("System", 12)); - cbLocal.setItems(locals); - - if(autoUpdate){ - autoupdateBtn.setSelected(true); - try { - Thread updateThread = new Thread(Updater); - updateThread.setName("Updater"); - updateThread.start(); - updateThread.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }else{ - autoupdateBtn.setSelected(false); - } + setLocalUI(); + applyColor(); } private void refreshTable(){ @@ -789,7 +780,7 @@ public class MainWindowController { } } - void addDataUI(){ + public void addDataUI(){ if(mode.equals("local")){ for(int i = 0; i < localFilms.size(); i++){ root.getChildren().add(new TreeItem(localFilms.get(i))); //add data to root-node @@ -936,75 +927,58 @@ public class MainWindowController { void setLocalUI() { switch (getLocal()) { case "en_US": - bundle = ResourceBundle.getBundle("locals.HomeFlix-Local", Locale.US); // us_English + setBundle(ResourceBundle.getBundle("locals.HomeFlix-Local", Locale.US)); // us_English cbLocal.getSelectionModel().select(0); break; case "de_DE": - bundle = ResourceBundle.getBundle("locals.HomeFlix-Local", Locale.GERMAN); // German + setBundle(ResourceBundle.getBundle("locals.HomeFlix-Local", Locale.GERMAN)); // German cbLocal.getSelectionModel().select(1); break; default: - bundle = ResourceBundle.getBundle("locals.HomeFlix-Local", Locale.US); // default local + setBundle(ResourceBundle.getBundle("locals.HomeFlix-Local", Locale.US)); // default local cbLocal.getSelectionModel().select(0); break; } - infoBtn.setText(bundle.getString("info")); - settingsBtn.setText(bundle.getString("settings")); - streamingSettingsBtn.setText(bundle.getString("streamingSettings")); - tfPath.setPromptText(bundle.getString("tfPath")); - tfStreamingPath.setPromptText(bundle.getString("tfPath")); - tfsearch.setPromptText(bundle.getString("tfSearch")); - openfolderbtn.setText(bundle.getString("openFolder")); - updateBtn.setText(bundle.getString("checkUpdates")); - directoryBtn.setText(bundle.getString("chooseFolder")); - streamingDirectoryBtn.setText(bundle.getString("chooseFolder")); - settingsHead1Label.setText(bundle.getString("settingsHead1Label")); - mainColorLabel.setText(bundle.getString("mainColorLabel")); - fontsizeLabel.setText(bundle.getString("fontsizeLabel")); - localLabel.setText(bundle.getString("localLabel")); - autoUpdateLabel.setText(bundle.getString("autoUpdateLabel")); - versionLabel.setText(bundle.getString("version") + " " + version + " (Build: " + buildNumber + ")"); - columnTitel.setText(bundle.getString("columnName")); - columnRating.setText(bundle.getString("columnRating")); - columnStreamUrl.setText(bundle.getString("columnStreamUrl")); - columnResolution.setText(bundle.getString("columnResolution")); - columnSeason.setText(bundle.getString("columnSeason")); - columnYear.setText(bundle.getString("columnYear")); - errorUpdateD = bundle.getString("errorUpdateD"); - errorUpdateV = bundle.getString("errorUpdateV"); - errorPlay = bundle.getString("errorPlay"); - errorOpenStream = bundle.getString("errorOpenStream"); - errorMode = bundle.getString("errorMode"); - errorLoad = bundle.getString("errorLoad"); - errorSave = bundle.getString("errorSave"); - noFilmFound = bundle.getString("noFilmFound"); - infoText = bundle.getString("version") + " " + version + " (Build: " + buildNumber + ") " + versionName + bundle.getString("infoText"); - vlcNotInstalled = bundle.getString("vlcNotInstalled"); - - title = bundle.getString("title"); - year = bundle.getString("year"); - rating = bundle.getString("rating"); - publishedOn = bundle.getString("publishedOn"); - duration = bundle.getString("duration"); - genre = bundle.getString("genre"); - director = bundle.getString("director"); - writer = bundle.getString("writer"); - actors = bundle.getString("actors"); - plot = bundle.getString("plot"); - language = bundle.getString("language"); - country = bundle.getString("country"); - awards = bundle.getString("awards"); - metascore = bundle.getString("metascore"); - imdbRating = bundle.getString("imdbRating"); - type = bundle.getString("type"); + infoBtn.setText(getBundle().getString("info")); + settingsBtn.setText(getBundle().getString("settings")); + streamingSettingsBtn.setText(getBundle().getString("streamingSettings")); + tfPath.setPromptText(getBundle().getString("tfPath")); + tfStreamingPath.setPromptText(getBundle().getString("tfPath")); + tfsearch.setPromptText(getBundle().getString("tfSearch")); + openfolderbtn.setText(getBundle().getString("openFolder")); + updateBtn.setText(getBundle().getString("checkUpdates")); + directoryBtn.setText(getBundle().getString("chooseFolder")); + streamingDirectoryBtn.setText(getBundle().getString("chooseFolder")); + settingsHead1Label.setText(getBundle().getString("settingsHead1Label")); + mainColorLabel.setText(getBundle().getString("mainColorLabel")); + fontsizeLabel.setText(getBundle().getString("fontsizeLabel")); + localLabel.setText(getBundle().getString("localLabel")); + autoUpdateLabel.setText(getBundle().getString("autoUpdateLabel")); + versionLabel.setText(getBundle().getString("version") + " " + version + " (Build: " + buildNumber + ")"); + columnTitel.setText(getBundle().getString("columnName")); + columnRating.setText(getBundle().getString("columnRating")); + columnStreamUrl.setText(getBundle().getString("columnStreamUrl")); + columnResolution.setText(getBundle().getString("columnResolution")); + columnSeason.setText(getBundle().getString("columnSeason")); + columnYear.setText(getBundle().getString("columnYear")); + errorUpdateD = getBundle().getString("errorUpdateD"); + errorUpdateV = getBundle().getString("errorUpdateV"); + errorPlay = getBundle().getString("errorPlay"); + errorOpenStream = getBundle().getString("errorOpenStream"); + errorMode = getBundle().getString("errorMode"); + errorLoad = getBundle().getString("errorLoad"); + errorSave = getBundle().getString("errorSave"); + noFilmFound = getBundle().getString("noFilmFound"); + infoText = getBundle().getString("version") + " " + version + " (Build: " + buildNumber + ") " + versionName + getBundle().getString("infoText"); + vlcNotInstalled = getBundle().getString("vlcNotInstalled"); } - void showErrorMsg(String msg, IOException exception) { + public void showErrorMsg(String msg, IOException exception) { Alert alert = new Alert(AlertType.ERROR); alert.setTitle("Error"); alert.setHeaderText(""); alert.setContentText(msg); - alert.initOwner(main.primaryStage); + alert.initOwner(main.getPrimaryStage()); // Create expandable Exception. StringWriter sw = new StringWriter(); @@ -1147,6 +1121,23 @@ public class MainWindowController { } } + // if AutoUpdate, then check for updates + private void checkAutoUpdate() { + + if (isAutoUpdate()) { + try { + LOGGER.info("AutoUpdate: looking for updates on startup ..."); + updateController = new UpdateController(this, buildNumber, useBeta); + Thread updateThread = new Thread(updateController); + updateThread.setName("Updater"); + updateThread.start(); + updateThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + // cuts 0x of the Color-pickers return value private void editColor(String input) { StringBuilder sb = new StringBuilder(input); @@ -1212,14 +1203,6 @@ public class MainWindowController { return mode; } - public String getCurrentWorkingDirectory() { - return currentWorkingDirectory; - } - - public void setCurrentWorkingDirectory(String currentWorkingDirectory) { - this.currentWorkingDirectory = currentWorkingDirectory; - } - public ObservableList getLocalFilms() { return localFilms; } @@ -1251,4 +1234,36 @@ public class MainWindowController { public void setRatingSortType(String ratingSortType) { this.ratingSortType = ratingSortType; } + + public ResourceBundle getBundle() { + return bundle; + } + + public void setBundle(ResourceBundle bundle) { + this.bundle = bundle; + } + + public TextFlow getTextFlow() { + return textFlow; + } + + public void setTextFlow(TextFlow textFlow) { + this.textFlow = textFlow; + } + + public ImageView getImage1() { + return image1; + } + + public void setImage1(ImageView image1) { + this.image1 = image1; + } + + public JFXButton getUpdateBtn() { + return updateBtn; + } + + public void setUpdateBtn(JFXButton updateBtn) { + this.updateBtn = updateBtn; + } } diff --git a/src/main/java/kellerkinder/HomeFlix/controller/DBController.java b/src/main/java/kellerkinder/HomeFlix/controller/DBController.java new file mode 100644 index 0000000..5c0b63e --- /dev/null +++ b/src/main/java/kellerkinder/HomeFlix/controller/DBController.java @@ -0,0 +1,655 @@ +/** + * Project-HomeFlix + * + * Copyright 2016-2018 <@Seil0> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +package kellerkinder.HomeFlix.controller; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.eclipsesource.json.Json; +import com.eclipsesource.json.JsonArray; +import com.eclipsesource.json.JsonObject; +import com.eclipsesource.json.JsonValue; + +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.text.Font; +import javafx.scene.text.FontWeight; +import javafx.scene.text.Text; +import kellerkinder.HomeFlix.application.Main; +import kellerkinder.HomeFlix.application.MainWindowController; +import kellerkinder.HomeFlix.datatypes.tableData; + +public class DBController { + + public DBController(Main main, MainWindowController mainWindowController) { + this.main = main; + this.mainWindowController = mainWindowController; + } + + private MainWindowController mainWindowController; + private Main main; + private String DB_PATH = System.getProperty("user.home") + "\\Documents\\HomeFlix" + "\\" + "Homeflix.db"; //path to database file + private Image favorite_black = new Image("icons/ic_favorite_black_18dp_1x.png"); + private Image favorite_border_black = new Image("icons/ic_favorite_border_black_18dp_1x.png"); + private List filmsdbAll = new ArrayList(); + private List filmsdbLocal = new ArrayList(); + private List filmsdbStream = new ArrayList(); + private List filmsdbStreamURL = new ArrayList(); + private List filmsAll = new ArrayList(); + private List filmsDir = new ArrayList(); + private List filmsStream = new ArrayList(); + private List filmsStreamURL = new ArrayList(); + private List filmsStreamData = new ArrayList(); + private Connection connection = null; + private static final Logger LOGGER = LogManager.getLogger(DBController.class.getName()); + + public void init() { + LOGGER.info("<========== starting loading sql ==========>"); + loadDatabase(); + createDatabase(); + loadData(); + LOGGER.info("<========== finished loading sql ==========>"); + } + + public void loadDatabase() { + if (System.getProperty("os.name").equals("Linux")) { + DB_PATH = System.getProperty("user.home") + "/HomeFlix/Homeflix.db"; + }else{ + DB_PATH = System.getProperty("user.home") + "\\Documents\\HomeFlix" + "\\" + "Homeflix.db"; + } + try { + // create a database connection + connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH); + connection.setAutoCommit(false); //AutoCommit to false -> manual commit is active + } catch (SQLException e) { + // if the error message is "out of memory", it probably means no database file is found + LOGGER.error("error while loading the ROM database", e); + } + LOGGER.info("ROM database loaded successfull"); + } + + public void createDatabase() { + PreparedStatement ps; + PreparedStatement psS; + + try { + Statement stmt = connection.createStatement(); + stmt.executeUpdate("create table if not exists film_local (rating, titel, streamUrl, favIcon, cached)"); + stmt.executeUpdate("create table if not exists film_streaming (year, season, episode, rating, resolution, titel, streamUrl, favIcon, cached)"); + stmt.close(); + } catch (SQLException e) { + LOGGER.error(e); + } + + try { + Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM film_local"); + while (rs.next()) { + filmsdbLocal.add(rs.getString(2)); + } + stmt.close(); + rs.close(); + + rs = stmt.executeQuery("SELECT * FROM film_streaming;"); + while (rs.next()) { + filmsdbStream.add(rs.getString(6)); + filmsdbStreamURL.add(rs.getString(7)); + } + stmt.close(); + rs.close(); + } catch (SQLException e) { + LOGGER.error("Ups! an error occured!", e); + } + + // getting all files from the selected directory TODO rework + String[] entries = new File(mainWindowController.getPath()).list(); + if (mainWindowController.getPath().equals("") || mainWindowController.getPath() == null) { + LOGGER.warn("no path selected!"); + } else if (new File(mainWindowController.getPath()).exists()) { + LOGGER.info(entries.length); + for (int i = 0; i != entries.length; i++) { + filmsDir.add(cutOffEnd(entries[i])); + } + } else { + LOGGER.error(mainWindowController.getPath() + "dosen't exist!"); + } + + // getting all entries from the streaming lists + for (int v = 0; v < mainWindowController.getStreamingData().size(); v++) { + String fileName = mainWindowController.getStreamingPath() + "/" + + mainWindowController.getStreamingData().get(v).getStreamUrl(); + try { + JsonObject object = Json.parse(new FileReader(fileName)).asObject(); + JsonArray items = object.get("entries").asArray(); + for (JsonValue item : items) { + filmsStream.add(item.asObject().getString("titel", "")); + filmsStreamURL.add(item.asObject().getString("streamUrl", "")); + filmsStreamData.add(fileName); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + // add all entries to filmsAll and filmsdbAl, for later comparing + filmsAll.addAll(filmsDir); + filmsAll.addAll(filmsStream); + filmsdbAll.addAll(filmsdbLocal); + filmsdbAll.addAll(filmsdbStream); + LOGGER.info("films in directory: " + filmsAll.size()); + LOGGER.info("filme in db: " + filmsdbAll.size()); + + /** + * if filmsdbAll.size() == 0 database is empty, we need to fill it else check if + * there is something to remove or to add TODO separate local and streaming for + * better error handling + */ + if (filmsdbAll.size() == 0) { + LOGGER.info("Database is empty, creating tables ..."); + + try { + ps = connection.prepareStatement("insert into film_local values (?, ?, ?, ?, ?)"); + psS = connection.prepareStatement("insert into film_streaming values (?, ?, ?, ?, ?, ?, ?, ?, ?)"); + + if (mainWindowController.getPath().equals("") || mainWindowController.getPath() == null) { + LOGGER.warn("no path selected!"); + } else if (new File(mainWindowController.getPath()).exists()) { + for (int j = 0; j != entries.length; j++) // goes through all the files in the directory + { + ps.setInt(1, 0); // rating as integer 1. column + ps.setString(2, cutOffEnd(entries[j])); // name as String without ending 2. column + ps.setString(3, entries[j]); // path as String 3. column + ps.setString(4, "favorite_border_black"); + ps.setBoolean(5, false); + ps.addBatch(); // add command to prepared statement + } + } + + if (mainWindowController.getStreamingPath().equals("") || mainWindowController.getStreamingPath().equals(null)) { + LOGGER.warn("no path selected!"); + } else { + for (int i = 0; i < mainWindowController.getStreamingData().size(); i++) { + String fileNamea = mainWindowController.getStreamingPath() + "/" + + mainWindowController.getStreamingData().get(i).getStreamUrl(); + try { + JsonObject object = Json.parse(new FileReader(fileNamea)).asObject(); + JsonArray items = object.get("entries").asArray(); + for (JsonValue item : items) { + psS.setInt(1, item.asObject().getInt("year", 0)); + psS.setInt(2, item.asObject().getInt("season", 0)); + psS.setInt(3, item.asObject().getInt("episode", 0)); + psS.setInt(4, 0); + psS.setString(5, item.asObject().getString("resolution", "")); + psS.setString(6, item.asObject().getString("titel", "")); + psS.setString(7, item.asObject().getString("streamUrl", "")); + psS.setString(8, "favorite_border_black"); + psS.setBoolean(9, false); + psS.addBatch(); // add command to prepared statement + } + } catch (IOException e) { + LOGGER.error(e); + } + } + } + ps.executeBatch(); // execute statement to write entries into table + psS.executeBatch(); + connection.commit(); + ps.close(); + psS.close(); + } catch (SQLException e) { + LOGGER.error(e); + } + } else { + // check if film added or removed + try { + checkAddEntry(); + checkRemoveEntry(); + } catch (IOException | SQLException e) { + e.printStackTrace(); + } + } + + // if cache table dosen't exist create it + try { + Statement stmt = connection.createStatement(); + // streamUrl is primary key + stmt.executeUpdate("create table if not exists cache (" + + "streamUrl, Title, Year, Rated, Released, Runtime, Genre, Director, Writer," + + " Actors, Plot, Language, Country, Awards, Metascore, imdbRating, imdbVotes," + +" imdbID, Type, Poster, Response)" + ); + stmt.close(); + } catch (SQLException e) { + LOGGER.error(e); + } + + } + + // loading data from database to mainWindowController + public void loadData(){ + LOGGER.info("loading data to mwc ..."); + try { + //load local Data + Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM film_local ORDER BY titel"); + while (rs.next()) { + if(rs.getString(4).equals("favorite_black")){ + mainWindowController.getLocalFilms().add( new tableData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_black),rs.getBoolean(5))); + }else{ + mainWindowController.getLocalFilms().add( new tableData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_border_black),rs.getBoolean(5))); + } + } + stmt.close(); + rs.close(); + + //load streaming Data FIXME check if there are streaming data before loading -> maybe there is an issue now + rs = stmt.executeQuery("SELECT * FROM film_streaming ORDER BY titel;"); + while (rs.next()) { + if(rs.getString(8).equals("favorite_black")){ + mainWindowController.getStreamingFilms().add(new tableData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_black),rs.getBoolean(9))); + }else{ + mainWindowController.getStreamingFilms().add(new tableData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_border_black),rs.getBoolean(9))); + } + } + stmt.close(); + rs.close(); + } catch (SQLException e) { + LOGGER.error("Ups! an error occured!", e); + } + + LOGGER.info("loading data to the GUI ..."); + mainWindowController.addDataUI(); + } + + //Refreshes the data in mainWindowController.newDaten and mainWindowController.streamData + //FIXME it seems that there is an issue at the moment with streaming refreshing wrong entry if there is more than one with the same name + public void refresh(String name, int i) throws SQLException { + LOGGER.info("refresh ..."); + Statement stmt; + + try { + stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM film_local WHERE titel = \""+name+"\";" ); + if(rs.getString(4).equals("favorite_black")){ + mainWindowController.getLocalFilms().set(i, new tableData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_black),rs.getBoolean(5))); + }else{ + mainWindowController.getLocalFilms().set(i, new tableData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_border_black),rs.getBoolean(5))); + } + stmt.close(); + rs.close(); + } catch (SQLException e) { + LOGGER.error(e); + try { + stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM film_streaming WHERE titel = \""+name+"\";" ); + if(rs.getString(8).equals("favorite_black")){ + mainWindowController.getStreamingFilms().set(i,new tableData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_black),rs.getBoolean(9))); + }else{ + mainWindowController.getStreamingFilms().set(i,new tableData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_border_black),rs.getBoolean(9))); + } + stmt.close(); + rs.close(); + } catch (SQLException e1) { + LOGGER.error("Ups! an error occured!", e1); + } + } + } + + /** + * check if there are any entries that have been removed from the film-directory + * + * @throws SQLException + */ + private void checkRemoveEntry() throws SQLException { + LOGGER.info("checking for entrys to remove to DB ..."); + Statement stmt = connection.createStatement(); + + for (int a = 0; a < filmsdbLocal.size(); a++) { + if (!filmsDir.contains(filmsdbLocal.get(a))) { + try { + stmt.executeUpdate("delete from film_local where titel = \"" + filmsdbLocal.get(a) + "\""); + connection.commit(); + stmt.close(); + LOGGER.info("removed \"" + filmsdbLocal.get(a) + "\" from database"); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + for (int b = 0; b < filmsdbStreamURL.size(); b++) { + if (!filmsStreamURL.contains(filmsdbStreamURL.get(b))) { + try { + stmt.executeUpdate("delete from film_streaming where titel = \"" + filmsdbStream.get(b) + "\""); + connection.commit(); + stmt.close(); + LOGGER.info("removed \"" + filmsdbStream.get(b) + "\" from database"); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + /** + * check if there are new films in the film-directory + * + * @throws SQLException + * @throws FileNotFoundException + * @throws IOException + * if lastName != filmsStreamData.get(b) then set i = 0, file + * changed + */ + private void checkAddEntry() throws SQLException, FileNotFoundException, IOException { + String lastName = ""; + LOGGER.info("checking for entrys to add to DB ..."); + String[] entries = new File(mainWindowController.getPath()).list(); + Statement stmt = connection.createStatement(); + PreparedStatement ps = connection + .prepareStatement("insert into film_streaming values (?, ?, ?, ?, ?, ?, ?, ?, ?)"); + int i = 0; + + for (int a = 0; a < filmsDir.size(); a++) { + if (!filmsdbLocal.contains(filmsDir.get(a))) { + stmt.executeUpdate("insert into film_local values (0, \"" + cutOffEnd(entries[a]) + "\", \"" + + entries[a] + "\",\"favorite_border_black\",0)"); + connection.commit(); + stmt.close(); + LOGGER.info("added \"" + filmsDir.get(a) + "\" to database"); + } + } + + for (int b = 0; b < filmsStreamURL.size(); b++) { + if (filmsdbStreamURL.contains(filmsStreamURL.get(b))) { + } else { + if (lastName != "" && lastName != filmsStreamData.get(b)) { + i = 0; + } + lastName = filmsStreamData.get(b); + JsonObject object = Json.parse(new FileReader(filmsStreamData.get(b))).asObject(); + JsonArray items = object.get("entries").asArray(); + System.out.println(items.size() + ", " + i + "; " + b); + String streamURL = items.get(i).asObject().getString("streamUrl", ""); + String titel = items.get(i).asObject().getString("titel", ""); + + if (streamURL.equals(filmsStreamURL.get(b))) { + System.out.println("added \"" + titel + "\""); + + ps.setInt(1, items.get(i).asObject().getInt("year", 0)); + ps.setInt(2, items.get(i).asObject().getInt("season", 0)); + ps.setInt(3, items.get(i).asObject().getInt("episode", 0)); + ps.setInt(4, 0); + ps.setString(5, items.get(i).asObject().getString("resolution", "")); + ps.setString(6, items.get(i).asObject().getString("titel", "")); + ps.setString(7, items.get(i).asObject().getString("streamUrl", "")); + ps.setString(8, "favorite_border_black"); + ps.setBoolean(9, false); + ps.addBatch(); // adds the entry + } + i++; + } + } + ps.executeBatch(); + connection.commit(); + ps.close(); + } + + // TODO only for debugging + void ausgeben() { + LOGGER.info("Outputting all entries ... \n"); + try { + Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM film_local"); + while (rs.next()) { + System.out.println(rs.getString(1)); + System.out.println(rs.getString(2)); + System.out.println(rs.getString(3)); + System.out.println(rs.getString(4)); + System.out.println(rs.getString(5) + "\n"); + } + stmt.close(); + rs.close(); + + LOGGER.info("Streaming Entries: \n"); + + rs = stmt.executeQuery("SELECT * FROM film_streaming;"); + while (rs.next()) { + System.out.println(rs.getString(1)); + System.out.println(rs.getString(2)); + System.out.println(rs.getString(3)); + System.out.println(rs.getString(4)); + System.out.println(rs.getString(5)); + System.out.println(rs.getString(6)); + System.out.println(rs.getString(7)); + System.out.println(rs.getString(8)); + System.out.println(rs.getString(9) + "\n"); + } + stmt.close(); + rs.close(); + + } catch (SQLException e) { + LOGGER.error("Ups! an error occured!", e); + } + } + + // get favorite status TODO this should get the correct mode! + public void getFavStatus(String name) { + try { + Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT titel, rating, favIcon FROM film_local WHERE titel = \"" + name + "\";"); // SQL Befehl + LOGGER.info("local:" + rs.getString("rating") + ", " + rs.getString("titel") + ", " + rs.getString("favIcon")); + stmt.close(); + rs.close(); + } catch (SQLException e) { + try { + Statement stmtS = connection.createStatement(); + ResultSet rsS = stmtS.executeQuery("SELECT titel, rating, favIcon FROM film_streaming WHERE titel = \"" + name + "\";"); + LOGGER.info("streaming:" + rsS.getString("rating") + ", " + rsS.getString("titel") + ", " + rsS.getString("favIcon")); + stmtS.close(); + rsS.close(); + } catch (SQLException e1) { + LOGGER.error("Ups! an error occured!", e1); + } + } + + } + + // set rating=0 and favorite_border_black TODO this should get the correct mode! + public void dislike(String name, String streamUrl) { + LOGGER.info("defavorisieren ..."); + try { + Statement stmt = connection.createStatement(); + stmt.executeUpdate("UPDATE film_local SET rating=0,favIcon='favorite_border_black' WHERE titel=\"" + name + "\";"); + connection.commit(); + stmt.close(); + } catch (SQLException e) { + LOGGER.error("Ups! an error occured!", e); + } + try { + Statement stmt = connection.createStatement(); + stmt.executeUpdate("UPDATE film_streaming SET rating=0,favIcon='favorite_border_black' WHERE streamUrl=\"" + streamUrl + "\";"); + connection.commit(); + stmt.close(); + } catch (SQLException e) { + LOGGER.error("Ups! an error occured!", e); + } + } + + // set rating=1 and favorite_black TODO this should get the correct mode! + public void like(String name, String streamUrl) { + System.out.println("favorisieren ..."); + try { + Statement stmt = connection.createStatement(); + stmt.executeUpdate("UPDATE film_local SET rating=1,favIcon='favorite_black' WHERE titel=\"" + name + "\";"); + connection.commit(); + stmt.close(); + } catch (SQLException e) { + LOGGER.error("Ups! an error occured!", e); + } + try { + Statement stmt = connection.createStatement(); + stmt.executeUpdate("UPDATE film_streaming SET rating=1,favIcon='favorite_black' WHERE streamUrl=\"" + streamUrl + "\";"); + connection.commit(); + stmt.close(); + } catch (SQLException e) { + LOGGER.error("Ups! an error occured!", e); + } + } + + void setCached(String streamUrl) throws SQLException { + try { + Statement stmt = connection.createStatement(); + stmt.executeUpdate("UPDATE film_local SET cached=1 WHERE streamUrl=\"" + streamUrl + "\";"); + connection.commit(); + stmt.close(); + } catch (SQLException e) { + LOGGER.error("Ups! an error occured!", e); + } + try { + Statement stmt = connection.createStatement(); + stmt.executeUpdate("UPDATE film_streaming SET cached=1 WHERE streamUrl=\"" + streamUrl + "\";"); + connection.commit(); + stmt.close(); + } catch (SQLException e) { + LOGGER.error("Ups! an error occured!", e); + } + } + + void addCache( String streamUrl, String Title, String Year, String Rated, String Released, String Runtime, String Genre, String Director, + String Writer, String Actors, String Plot, String Language, String Country, String Awards, String Metascore, String imdbRating, + String Type, String imdbVotes, String imdbID, String Poster, String Response) throws SQLException{ + PreparedStatement ps = connection.prepareStatement("insert into cache values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + + LOGGER.info("adding to cache: " + Title); + ps.setString(1,streamUrl); + ps.setString(2,Title); + ps.setString(3,Year); + ps.setString(4,Rated); + ps.setString(5,Released); + ps.setString(6,Runtime); + ps.setString(7,Genre); + ps.setString(8,Director); + ps.setString(9,Writer); + ps.setString(10,Actors); + ps.setString(11,Plot); + ps.setString(12,Language); + ps.setString(13,Country); + ps.setString(14,Awards); + ps.setString(15,Metascore); + ps.setString(16,imdbRating); + ps.setString(17,imdbVotes); + ps.setString(18,imdbID); + ps.setString(19,Type); + ps.setString(20,Poster); + ps.setString(21,Response); + ps.addBatch(); + ps.executeBatch(); + connection.commit(); + ps.close(); + LOGGER.info("done!"); + } + + public void readCache(String streamUrl) { + try { + Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM cache WHERE streamUrl=\"" + streamUrl + "\";"); + ArrayList nameText = new ArrayList(); + ArrayList responseText = new ArrayList(); + String fontFamily = main.getFONT_FAMILY(); + Image im; + int fontSize = (int) Math.round(mainWindowController.size); + int j = 2; + + nameText.add(0, new Text(mainWindowController.getBundle().getString("title") + ": ")); + nameText.add(1, new Text(mainWindowController.getBundle().getString("year") + ": ")); + nameText.add(2, new Text(mainWindowController.getBundle().getString("rating") + ": ")); + nameText.add(3, new Text(mainWindowController.getBundle().getString("publishedOn") + ": ")); + nameText.add(4, new Text(mainWindowController.getBundle().getString("duration") + ": ")); + nameText.add(5, new Text(mainWindowController.getBundle().getString("genre") + ": ")); + nameText.add(6, new Text(mainWindowController.getBundle().getString("director") + ": ")); + nameText.add(7, new Text(mainWindowController.getBundle().getString("writer") + ": ")); + nameText.add(8, new Text(mainWindowController.getBundle().getString("actors") + ": ")); + nameText.add(9, new Text(mainWindowController.getBundle().getString("plot") + ": ")); + nameText.add(10, new Text(mainWindowController.getBundle().getString("language") + ": ")); + nameText.add(11, new Text(mainWindowController.getBundle().getString("country") + ": ")); + nameText.add(12, new Text(mainWindowController.getBundle().getString("awards") + ": ")); + nameText.add(13, new Text(mainWindowController.getBundle().getString("metascore") + ": ")); + nameText.add(14, new Text(mainWindowController.getBundle().getString("imdbRating") + ": ")); + nameText.add(15, new Text(mainWindowController.getBundle().getString("type") + ": ")); + + for (int i = 0; i < 15; i++) { + responseText.add(new Text(rs.getString(j) + "\n")); + j++; + } + responseText.add(new Text(rs.getString(19) + "\n")); + im = new Image(new File(rs.getString(20)).toURI().toString()); + + stmt.close(); + rs.close(); + + for (int i = 0; i < nameText.size(); i++) { + nameText.get(i).setFont(Font.font(fontFamily, FontWeight.BOLD, fontSize)); + responseText.get(i).setFont(Font.font(fontFamily, fontSize)); + } + + mainWindowController.getTextFlow().getChildren().remove(0, + mainWindowController.getTextFlow().getChildren().size()); + + for (int i = 0; i < nameText.size(); i++) { + mainWindowController.getTextFlow().getChildren().addAll(nameText.get(i), responseText.get(i)); + } + + try { + mainWindowController.getImage1().setImage(im); + } catch (Exception e) { + mainWindowController.getImage1().setImage(new Image("resources/icons/close_black_2048x2048.png")); + LOGGER.error(e); + } + mainWindowController.getImage1().setImage(im); + + } catch (SQLException e) { + LOGGER.error("Ups! an error occured!", e); + } + } + + // removes the ending + private String cutOffEnd(String str) { + if (str == null) return null; + int pos = str.lastIndexOf("."); + if (pos == -1) return str; + return str.substring(0, pos); + } + +} diff --git a/src/main/java/kellerkinder/HomeFlix/controller/UpdateController.java b/src/main/java/kellerkinder/HomeFlix/controller/UpdateController.java new file mode 100644 index 0000000..a21b376 --- /dev/null +++ b/src/main/java/kellerkinder/HomeFlix/controller/UpdateController.java @@ -0,0 +1,163 @@ +/** + * Project-HomeFlix + * + * Copyright 2018 <@Seil0> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +package kellerkinder.HomeFlix.controller; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +import javax.swing.ProgressMonitor; +import javax.swing.ProgressMonitorInputStream; + +import org.apache.commons.io.FileUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.eclipsesource.json.Json; +import com.eclipsesource.json.JsonArray; +import com.eclipsesource.json.JsonObject; +import com.eclipsesource.json.JsonValue; + +import javafx.application.Platform; +import kellerkinder.HomeFlix.application.MainWindowController; + +public class UpdateController implements Runnable { + + private MainWindowController mainWindowController; + private String buildNumber; + private String apiOutput; + private String updateBuildNumber; // tag_name from Github +// private String updateName; +// private String updateChanges; + private String browserDownloadUrl; // update download link + private String githubApiRelease = "https://api.github.com/repos/Seil0/Project-HomeFlix/releases/latest"; + private String githubApiBeta = "https://api.github.com/repos/Seil0/Project-HomeFlix/releases"; + + private URL githubApiUrl; + private boolean useBeta; + private static final Logger LOGGER = LogManager.getLogger(UpdateController.class.getName()); + + /** + * updater for Project HomeFlix based on cemu_UIs, checks for Updates and download it + */ + public UpdateController(MainWindowController mwc, String buildNumber, boolean useBeta) { + mainWindowController = mwc; + this.buildNumber = buildNumber; + this.useBeta = useBeta; + } + + @Override + public void run() { + LOGGER.info("beta:" + useBeta + "; checking for updates ..."); + Platform.runLater(() -> { + mainWindowController.getUpdateBtn().setText(mainWindowController.getBundle().getString("updateBtnChecking")); + }); + + try { + + if (useBeta) { + githubApiUrl = new URL(githubApiBeta); + } else { + githubApiUrl = new URL(githubApiRelease); + } + + // URL githubApiUrl = new URL(githubApiRelease); + BufferedReader ina = new BufferedReader(new InputStreamReader(githubApiUrl.openStream())); + apiOutput = ina.readLine(); + ina.close(); + } catch (IOException e) { + Platform.runLater(() -> { + LOGGER.error("could not check update version", e); + }); + } + + if (useBeta) { + JsonArray objectArray = Json.parse("{\"items\": " + apiOutput + "}").asObject().get("items").asArray(); + JsonValue object = objectArray.get(0); + JsonArray objectAssets = object.asObject().get("assets").asArray(); + + updateBuildNumber = object.asObject().getString("tag_name", ""); +// updateName = object.asObject().getString("name", ""); +// updateChanges = object.asObject().getString("body", ""); + + for (JsonValue asset : objectAssets) { + browserDownloadUrl = asset.asObject().getString("browser_download_url", ""); + } + + } else { + JsonObject object = Json.parse(apiOutput).asObject(); + JsonArray objectAssets = Json.parse(apiOutput).asObject().get("assets").asArray(); + + updateBuildNumber = object.getString("tag_name", ""); +// updateName = object.getString("name", ""); +// updateChanges = object.getString("body", ""); + for (JsonValue asset : objectAssets) { + browserDownloadUrl = asset.asObject().getString("browser_download_url", ""); + + } + } + + LOGGER.info("Build: " + buildNumber + ", Update: " + updateBuildNumber); + + // Compares the program BuildNumber with the current BuildNumber if program + // BuildNumber < current BuildNumber then perform a update + int iversion = Integer.parseInt(buildNumber); + int iaktVersion = Integer.parseInt(updateBuildNumber.replace(".", "")); + + if (iversion >= iaktVersion) { + Platform.runLater(() -> { + mainWindowController.getUpdateBtn().setText(mainWindowController.getBundle().getString("updateBtnNoUpdateAvailable")); + }); + LOGGER.info("no update available"); + } else { + Platform.runLater(() -> { + mainWindowController.getUpdateBtn().setText(mainWindowController.getBundle().getString("updateBtnUpdateAvailable")); + }); + LOGGER.info("update available"); + LOGGER.info("download link: " + browserDownloadUrl); + try { + // open new Http connection, ProgressMonitorInputStream for downloading the data + HttpURLConnection connection = (HttpURLConnection) new URL(browserDownloadUrl).openConnection(); + ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(null, "Downloading...", connection.getInputStream()); + ProgressMonitor pm = pmis.getProgressMonitor(); + pm.setMillisToDecideToPopup(0); + pm.setMillisToPopup(0); + pm.setMinimum(0);// set beginning of the progress bar to 0 + pm.setMaximum(connection.getContentLength());// set the end to the file length + FileUtils.copyInputStreamToFile(pmis, new File("ProjectHomeFlix_update.jar")); // download update + org.apache.commons.io.FileUtils.copyFile(new File("ProjectHomeFlix_update.jar"), new File("ProjectHomeFlix.jar")); + org.apache.commons.io.FileUtils.deleteQuietly(new File("ProjectHomeFlix_update.jar")); // delete update + Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); // start again TODO consider ProcessBuilder to execute + System.exit(0); // finishes itself + } catch (IOException e) { + Platform.runLater(() -> { + LOGGER.info("could not download update files", e); + }); + } + } + + } + +} diff --git a/src/main/java/org/kellerkinder/Project_HomeFlix/apiQuery.java b/src/main/java/kellerkinder/HomeFlix/controller/apiQuery.java similarity index 60% rename from src/main/java/org/kellerkinder/Project_HomeFlix/apiQuery.java rename to src/main/java/kellerkinder/HomeFlix/controller/apiQuery.java index b5f975e..45cae5f 100644 --- a/src/main/java/org/kellerkinder/Project_HomeFlix/apiQuery.java +++ b/src/main/java/kellerkinder/HomeFlix/controller/apiQuery.java @@ -1,8 +1,26 @@ /** - * apiQuery for Project HomeFlix - * sends a query to the omdb api + * Project-HomeFlix + * + * Copyright 2016-2018 <@Seil0> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * */ -package org.kellerkinder.Project_HomeFlix; + +package kellerkinder.HomeFlix.controller; import java.awt.Graphics2D; import java.awt.image.BufferedImage; @@ -23,6 +41,8 @@ import javafx.scene.image.Image; import javafx.scene.text.Font; import javafx.scene.text.FontWeight; import javafx.scene.text.Text; +import kellerkinder.HomeFlix.application.Main; +import kellerkinder.HomeFlix.application.MainWindowController; public class apiQuery{ @@ -43,7 +63,10 @@ public class apiQuery{ ArrayList responseText = new ArrayList(); ArrayList nameText = new ArrayList(); - void startQuery(String titel, String streamUrl){ + /** + * apiQuery for Project HomeFlix, sends a query to the omdb api + */ + public void startQuery(String titel, String streamUrl){ URL queryURL = null; Scanner sc = null; String moviename = null; @@ -106,12 +129,12 @@ public class apiQuery{ responseString[17] = object.getString("imdbID", ""); responseString[18] = object.getString("Poster", ""); responseString[19] = object.getString("Response", ""); - + //adding poster to cache BufferedImage originalImage = ImageIO.read(new URL(responseString[18]));//change path to where file is located int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType(); BufferedImage resizeImagePNG = resizeImage(originalImage, type, 198, 297); - if(System.getProperty("os.name").equals("Linux")) { + if (System.getProperty("os.name").equals("Linux")) { posterPath = posterCache+"/"+titel+".png"; ImageIO.write(resizeImagePNG, "png", new File(posterCache+"/"+titel+".png")); //change path where you want it saved } else { @@ -127,58 +150,59 @@ public class apiQuery{ responseString[19]); dbController.setCached(streamUrl); - for(int i=0; i<20; i++){ - Text text = new Text(responseString[i]+"\n"); + for (int i = 0; i < 20; i++) { + Text text = new Text(responseString[i] + "\n"); responseText.add(text); responseText.get(i).setFont(Font.font(fontFamily, fontSize)); } - - //if response == false then show mainWindowController.noFilmFound else create new Texts and add them to flowText - if(retdata.contains("\"Response\":\"False\"")){ //TODO + FIXME - mainWindowController.textFlow.getChildren().add(new Text(mainWindowController.noFilmFound)); - im = new Image("resources/icons/close_black_2048x2048.png"); - mainWindowController.image1.setImage(im); - }else{ - nameText.add(0, new Text(mainWindowController.title+": ")); - nameText.add(1, new Text(mainWindowController.year+": ")); - nameText.add(2, new Text(mainWindowController.rating+": ")); - nameText.add(3, new Text(mainWindowController.publishedOn+": ")); - nameText.add(4, new Text(mainWindowController.duration+": ")); - nameText.add(5, new Text(mainWindowController.genre+": ")); - nameText.add(6, new Text(mainWindowController.director+": ")); - nameText.add(7, new Text(mainWindowController.writer+": ")); - nameText.add(8, new Text(mainWindowController.actors+": ")); - nameText.add(9, new Text(mainWindowController.plot+": ")); - nameText.add(10, new Text(mainWindowController.language+": ")); - nameText.add(11, new Text(mainWindowController.country+": ")); - nameText.add(12, new Text(mainWindowController.awards+": ")); - nameText.add(13, new Text(mainWindowController.metascore+": ")); - nameText.add(14, new Text(mainWindowController.imdbRating+": ")); - nameText.add(15, new Text(mainWindowController.type+": ")); - for(int i=0; i + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +package kellerkinder.HomeFlix.datatypes; import javafx.beans.property.BooleanProperty; import javafx.beans.property.DoubleProperty; diff --git a/src/main/java/org/kellerkinder/Project_HomeFlix/DBController.java b/src/main/java/org/kellerkinder/Project_HomeFlix/DBController.java deleted file mode 100644 index 439f1ad..0000000 --- a/src/main/java/org/kellerkinder/Project_HomeFlix/DBController.java +++ /dev/null @@ -1,634 +0,0 @@ -/** - * @author Jannik - * DBController for Project HomeFlix - * connection is in manual commit! - */ - -package org.kellerkinder.Project_HomeFlix; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; - -import com.eclipsesource.json.Json; -import com.eclipsesource.json.JsonArray; -import com.eclipsesource.json.JsonObject; -import com.eclipsesource.json.JsonValue; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; -import javafx.scene.text.Font; -import javafx.scene.text.FontWeight; -import javafx.scene.text.Text; - -public class DBController { - - public DBController(MainWindowController m, Main main) { - mainWindowController = m; - this.main = main; - } - - private MainWindowController mainWindowController; - private Main main; - private String DB_PATH = System.getProperty("user.home") + "\\Documents\\HomeFlix" + "\\" + "Homeflix.db"; //path to database file - private Image favorite_black = new Image("icons/ic_favorite_black_18dp_1x.png"); - private Image favorite_border_black = new Image("icons/ic_favorite_border_black_18dp_1x.png"); - private List filmsdbAll = new ArrayList(); - private List filmsdbLocal = new ArrayList(); - private List filmsdbStream = new ArrayList(); - private List filmsdbStreamURL = new ArrayList(); - private List filmsAll = new ArrayList(); - private List filmsDir = new ArrayList(); - private List filmsStream = new ArrayList(); - private List filmsStreamURL = new ArrayList(); - private List filmsStreamData = new ArrayList(); - Connection connection = null; - - public void main() { - if (System.getProperty("os.name").equals("Linux")) { - DB_PATH = System.getProperty("user.home") + "/HomeFlix/Homeflix.db"; - }else{ - DB_PATH = System.getProperty("user.home") + "\\Documents\\HomeFlix" + "\\" + "Homeflix.db"; - } - try { - // create a database connection - connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH); - connection.setAutoCommit(false); //AutoCommit to false -> manual commit is active - } catch (SQLException e) { - // if the error message is "out of memory", it probably means no database file is found - System.err.println(e.getMessage()); - } - - //close connection -> at the moment this kills the program -// finally { -// try { -// if (connection != null) -// connection.close(); -// } catch (SQLException e) { -// // connection close failed. -// System.err.println(e); -// } -// } - } - - void createDatabase() { - System.out.println("<==========starting loading sql==========>"); - - PreparedStatement ps; - PreparedStatement psS; - - try { - Statement stmt = connection.createStatement(); - stmt.executeUpdate("create table if not exists film_local (rating, titel, streamUrl, favIcon, cached)"); - stmt.executeUpdate("create table if not exists film_streaming (year, season, episode, rating, resolution, titel, streamUrl, favIcon, cached)"); - stmt.close(); - } catch (SQLException e1) { - e1.printStackTrace(); - } - - try { - Statement stmt = connection.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT * FROM film_local"); - while (rs.next()) { - filmsdbLocal.add(rs.getString(2)); - } - stmt.close(); - rs.close(); - - rs = stmt.executeQuery("SELECT * FROM film_streaming;"); - while (rs.next()) { - filmsdbStream.add(rs.getString(6)); - filmsdbStreamURL.add(rs.getString(7)); - } - stmt.close(); - rs.close(); - }catch (SQLException ea){ - System.err.println("Ups! an error occured!"); - ea.printStackTrace(); - } - - //getting all files from the selected directory TODO rework - String[] entries = new File(mainWindowController.getPath()).list(); - if(mainWindowController.getPath().equals("") || mainWindowController.getPath() == null){ - System.out.println("Kein Pfad angegeben"); //if path == null or "" - }else if(new File(mainWindowController.getPath()).exists()) { - System.out.println(entries.length); - for(int i=0;i!=entries.length;i++){ - filmsDir.add(cutOffEnd(entries[i])); - } - } else { - System.out.println(mainWindowController.getPath() + "dosen't exist!"); - } - - //getting all entries from the streaming lists - for(int v=0; v< mainWindowController.getStreamingData().size(); v++){ - String fileName = mainWindowController.getStreamingPath()+"/"+mainWindowController.getStreamingData().get(v).getStreamUrl(); - try { - JsonObject object = Json.parse(new FileReader(fileName)).asObject(); - JsonArray items = object.get("entries").asArray(); - for (JsonValue item : items) { - filmsStream.add(item.asObject().getString("titel","")); - filmsStreamURL.add(item.asObject().getString("streamUrl","")); - filmsStreamData.add(fileName); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - //add all entries to filmsAll and filmsdbAl, for later comparing - filmsAll.addAll(filmsDir); - filmsAll.addAll(filmsStream); - filmsdbAll.addAll(filmsdbLocal); - filmsdbAll.addAll(filmsdbStream); - System.out.println("films in directory: "+filmsAll.size()); - System.out.println("filme in db: "+filmsdbAll.size()); - - /** - * if filmsdbAll.size() == 0 database is empty, we need to fill it - * else check if there is something to remove or to add - * TODO separate local and streaming for better error handling - */ - if(filmsdbAll.size() == 0){ - System.out.println("creating entries ..."); - - try{ - ps = connection.prepareStatement("insert into film_local values (?, ?, ?, ?, ?)"); - psS = connection.prepareStatement("insert into film_streaming values (?, ?, ?, ?, ?, ?, ?, ?, ?)"); - - if(mainWindowController.getPath().equals("") || mainWindowController.getPath() == null){ - System.out.println("Kein Pfad angegeben"); //if path == null or "" - }else if(new File(mainWindowController.getPath()).exists()){ - for(int j=0;j!=entries.length;j++) //goes through all the files in the directory - { - ps.setInt(1, 0); //rating as integer 1. column - ps.setString(2, cutOffEnd(entries[j])); //name as String without ending 2. column - ps.setString(3,entries[j]); //path as String 3. column - ps.setString(4, "favorite_border_black"); - ps.setBoolean(5, false); - ps.addBatch(); // add command to prepared statement - } - } - - if(mainWindowController.getStreamingPath().equals("")||mainWindowController.getStreamingPath().equals(null)){ - System.out.println("Kein Pfad angegeben"); //if path == null or "" - }else{ - for(int i=0; i< mainWindowController.getStreamingData().size(); i++){ - String fileNamea = mainWindowController.getStreamingPath()+"/"+mainWindowController.getStreamingData().get(i).getStreamUrl(); - try { - JsonObject object = Json.parse(new FileReader(fileNamea)).asObject(); - JsonArray items = object.get("entries").asArray(); - for (JsonValue item : items) { - psS.setInt(1, item.asObject().getInt("year", 0)); - psS.setInt(2, item.asObject().getInt("season", 0)); - psS.setInt(3, item.asObject().getInt("episode", 0)); - psS.setInt(4, 0); - psS.setString(5, item.asObject().getString("resolution", "")); - psS.setString(6, item.asObject().getString("titel","")); - psS.setString(7, item.asObject().getString("streamUrl", "")); - psS.setString(8, "favorite_border_black"); - psS.setBoolean(9, false); - psS.addBatch(); // add command to prepared statement - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - ps.executeBatch(); //execute statement to write entries into table - psS.executeBatch(); - connection.commit(); - ps.close(); - psS.close(); - }catch (SQLException ea) { - System.err.println("Ups! an error occured!"); - ea.printStackTrace(); - } - }else { - try { - try { - checkAddEntry(); //check if added a new file - } catch (IOException e) { - e.printStackTrace(); - } - checkRemoveEntry(); //check if removed a file - } catch (SQLException e) { - e.printStackTrace(); - } - } - - //start of cache-table - try { - Statement stmt = connection.createStatement(); - stmt.executeUpdate( "create table if not exists cache (streamUrl, Title, Year, Rated, Released, Runtime, Genre, Director, Writer," //streamUrl is primary key - +" Actors, Plot, Language, Country, Awards, Metascore, imdbRating, imdbVotes, imdbID, Type, Poster, Response)"); - stmt.close(); - } catch (SQLException e1) { - e1.printStackTrace(); - } - - } - - //loading data from database to mainWindowController - void loadData(){ - System.out.println("loading data to mwc ..."); - try { - //load local Data - Statement stmt = connection.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT * FROM film_local ORDER BY titel"); - while (rs.next()) { - if(rs.getString(4).equals("favorite_black")){ - mainWindowController.getLocalFilms().add( new tableData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_black),rs.getBoolean(5))); - }else{ - mainWindowController.getLocalFilms().add( new tableData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_border_black),rs.getBoolean(5))); - } - } - stmt.close(); - rs.close(); - - //load streaming Data FIXME check if there are streaming data before loading -> maybe there is an issue now - rs = stmt.executeQuery("SELECT * FROM film_streaming ORDER BY titel;"); - while (rs.next()) { - if(rs.getString(8).equals("favorite_black")){ - mainWindowController.getStreamingFilms().add(new tableData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_black),rs.getBoolean(9))); - }else{ - mainWindowController.getStreamingFilms().add(new tableData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_border_black),rs.getBoolean(9))); - } - } - stmt.close(); - rs.close(); - } catch (SQLException e) { - System.err.println("Ups! an error occured!"); - e.printStackTrace(); - } - System.out.println("<==========finished loading sql==========>"); - } - - //Refreshes the data in mainWindowController.newDaten and mainWindowController.streamData - //FIXME it seems that there is an issue at the moment with streaming refreshing wrong entry if there is more than one with the same name - void refresh(String name,int i) throws SQLException{ - System.out.println("refresh ..."); - Statement stmt; - - try { - stmt = connection.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT * FROM film_local WHERE titel = \""+name+"\";" ); - if(rs.getString(4).equals("favorite_black")){ - mainWindowController.getLocalFilms().set(i, new tableData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_black),rs.getBoolean(5))); - }else{ - mainWindowController.getLocalFilms().set(i, new tableData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_border_black),rs.getBoolean(5))); - } - stmt.close(); - rs.close(); - } catch (SQLException e) { - try { - stmt = connection.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT * FROM film_streaming WHERE titel = \""+name+"\";" ); - if(rs.getString(8).equals("favorite_black")){ - mainWindowController.getStreamingFilms().set(i,new tableData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_black),rs.getBoolean(9))); - }else{ - mainWindowController.getStreamingFilms().set(i,new tableData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_border_black),rs.getBoolean(9))); - } - stmt.close(); - rs.close(); - } catch (SQLException e1) { - System.err.println("Ups! an error occured!"); - e1.printStackTrace(); - } - } - } - /** - * check if there are any entries that have been removed from the film-directory - * @throws SQLException - */ - private void checkRemoveEntry() throws SQLException{ - System.out.println("checking for entrys to remove to DB ..."); - Statement stmt = connection.createStatement(); - - for(int a=0; a nameText = new ArrayList(); - ArrayList responseText = new ArrayList(); - String fontFamily = main.getFONT_FAMILY(); - Image im; - int fontSize = (int) Math.round(mainWindowController.size); - int j=2; - - nameText.add(0, new Text(mainWindowController.title+": ")); - nameText.add(1, new Text(mainWindowController.year+": ")); - nameText.add(2, new Text(mainWindowController.rating+": ")); - nameText.add(3, new Text(mainWindowController.publishedOn+": ")); - nameText.add(4, new Text(mainWindowController.duration+": ")); - nameText.add(5, new Text(mainWindowController.genre+": ")); - nameText.add(6, new Text(mainWindowController.director+": ")); - nameText.add(7, new Text(mainWindowController.writer+": ")); - nameText.add(8, new Text(mainWindowController.actors+": ")); - nameText.add(9, new Text(mainWindowController.plot+": ")); - nameText.add(10, new Text(mainWindowController.language+": ")); - nameText.add(11, new Text(mainWindowController.country+": ")); - nameText.add(12, new Text(mainWindowController.awards+": ")); - nameText.add(13, new Text(mainWindowController.metascore+": ")); - nameText.add(14, new Text(mainWindowController.imdbRating+": ")); - nameText.add(15, new Text(mainWindowController.type+": ")); - - for(int i=0; i<15; i++){ - responseText.add(new Text(rs.getString(j)+"\n")); - j++; - } - responseText.add(new Text(rs.getString(19)+"\n")); - im = new Image(new File(rs.getString(20)).toURI().toString()); - - stmt.close(); - rs.close(); - - for(int i=0; i { - mainWindowController.updateBtn.setText(mainWindowController.bundle.getString("checkingUpdates")); - }); - - try { - URL githubApiUrl = new URL(githubApi); - BufferedReader ina = new BufferedReader(new InputStreamReader(githubApiUrl.openStream())); - apiOutput = ina.readLine(); - ina.close(); - } catch (IOException e1) { - Platform.runLater(() -> { - mainWindowController.showErrorMsg(mainWindowController.errorUpdateV, e1); - }); - } - - JsonObject object = Json.parse(apiOutput).asObject(); - JsonArray objectAssets = Json.parse(apiOutput).asObject().get("assets").asArray(); - - updateBuildNumber = object.getString("tag_name", ""); -// updateName = object.getString("name", ""); -// updateChanges = object.getString("body", ""); - for (JsonValue asset : objectAssets) { - browserDownloadUrl = asset.asObject().getString("browser_download_url", ""); - - } - System.out.println("Build: "+buildNumber+", Update: "+updateBuildNumber); - - //Compares the program BuildNumber with the current BuildNumber if program BuildNumber < current BuildNumber then perform a update - int iversion = Integer.parseInt(buildNumber); - int iaktVersion = Integer.parseInt(updateBuildNumber.replace(".", "")); - - if(iversion >= iaktVersion){ - Platform.runLater(() -> { - mainWindowController.updateBtn.setText(mainWindowController.bundle.getString("updateBtnNotavail")); - }); - System.out.println("no update available"); - }else{ - Platform.runLater(() -> { - mainWindowController.updateBtn.setText(mainWindowController.bundle.getString("updateBtnavail")); - }); - System.out.println("update available"); - System.out.println("download link: " + browserDownloadUrl); - try { - //open new Http connection, ProgressMonitorInputStream for downloading the data - HttpURLConnection conn = (HttpURLConnection) new URL(browserDownloadUrl).openConnection(); - ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(null, "Downloading...", conn.getInputStream()); - ProgressMonitor pm = pmis.getProgressMonitor(); - pm.setMillisToDecideToPopup(0); - pm.setMillisToPopup(0); - pm.setMinimum(0);// tell the progress bar that we start at the beginning of the stream - pm.setMaximum(conn.getContentLength());// tell the progress bar the total number of bytes we are going to read. - FileUtils.copyInputStreamToFile(pmis, new File("ProjectHomeFlix_update.jar")); //download update - org.apache.commons.io.FileUtils.copyFile(new File("ProjectHomeFlix_update.jar"), new File("ProjectHomeFlix.jar")); //TODO rename update to old name - org.apache.commons.io.FileUtils.deleteQuietly(new File("ProjectHomeFlix_update.jar")); //delete update - Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //start again - System.exit(0); //finishes itself - - } catch (IOException e) { - Platform.runLater(() -> { - mainWindowController.showErrorMsg(mainWindowController.errorUpdateD, e); - }); - } - } - } -} diff --git a/src/main/resources/fxml/MainWindow.fxml b/src/main/resources/fxml/MainWindow.fxml index 6a989be..a42a098 100644 --- a/src/main/resources/fxml/MainWindow.fxml +++ b/src/main/resources/fxml/MainWindow.fxml @@ -20,7 +20,7 @@ - + @@ -100,7 +100,7 @@