Browse Source

cemu_UIs updater and code cleanup

* clean up the folder structure for better maintenance
* lots of code cleanup
pull/22/head
Jannik 4 years ago
parent
commit
385193f57b
  1. 117
      src/main/java/kellerkinder/HomeFlix/application/Main.java
  2. 271
      src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java
  3. 655
      src/main/java/kellerkinder/HomeFlix/controller/DBController.java
  4. 163
      src/main/java/kellerkinder/HomeFlix/controller/UpdateController.java
  5. 114
      src/main/java/kellerkinder/HomeFlix/controller/apiQuery.java
  6. 23
      src/main/java/kellerkinder/HomeFlix/datatypes/tableData.java
  7. 634
      src/main/java/org/kellerkinder/Project_HomeFlix/DBController.java
  8. 105
      src/main/java/org/kellerkinder/Project_HomeFlix/updater.java
  9. 4
      src/main/resources/fxml/MainWindow.fxml
  10. 6
      src/main/resources/locals/HomeFlix-Local_de_DE.properties
  11. 6
      src/main/resources/locals/HomeFlix-Local_en_US.properties

117
src/main/java/org/kellerkinder/Project_HomeFlix/Main.java → src/main/java/kellerkinder/HomeFlix/application/Main.java

@ -1,7 +1,7 @@
/**
* Project HomeFlix
*
* Copyright 2016-2017 <admin@kellerkinder>
* 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;
}

271
src/main/java/org/kellerkinder/Project_HomeFlix/MainWindowController.java → src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java

@ -1,7 +1,7 @@
/**
* Project HomeFlix
* Project-HomeFlix
*
* Copyright 2016-2017 <admin@kellerkinder>
* 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<tableData> 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<tableData> filterData = FXCollections.observableArrayList();
private ObservableList<String> 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<tableData>(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<tableData> 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;
}
}

655
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<String> filmsdbAll = new ArrayList<String>();
private List<String> filmsdbLocal = new ArrayList<String>();
private List<String> filmsdbStream = new ArrayList<String>();
private List<String> filmsdbStreamURL = new ArrayList<String>();
private List<String> filmsAll = new ArrayList<String>();
private List<String> filmsDir = new ArrayList<String>();
private List<String> filmsStream = new ArrayList<String>();
private List<String> filmsStreamURL = new ArrayList<String>();
private List<String> filmsStreamData = new ArrayList<String>();
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<Text> nameText = new ArrayList<Text>();
ArrayList<Text> responseText = new ArrayList<Text>();
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));