cemu_UIs updater and code cleanup
* clean up the folder structure for better maintenance * lots of code cleanup
This commit is contained in:
211
src/main/java/kellerkinder/HomeFlix/application/Main.java
Normal file
211
src/main/java/kellerkinder/HomeFlix/application/Main.java
Normal file
@ -0,0 +1,211 @@
|
||||
/**
|
||||
* 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.application;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Locale;
|
||||
import java.util.Optional;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import javafx.application.Application;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.Alert.AlertType;
|
||||
import javafx.scene.control.ButtonType;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.stage.DirectoryChooser;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
public class Main extends Application {
|
||||
|
||||
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;
|
||||
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 double FONT_SIZE = 17;
|
||||
private ResourceBundle bundle;
|
||||
private static Logger LOGGER;
|
||||
|
||||
@Override
|
||||
public void start(Stage primaryStage) throws IOException {
|
||||
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"));
|
||||
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
|
||||
mainWindowController = loader.getController(); //Link of FXMLController and controller class
|
||||
mainWindowController.setMain(this); //call setMain
|
||||
|
||||
|
||||
// get OS and the specific paths
|
||||
if (osName.equals("Linux")) {
|
||||
directory = new File(dirLinux);
|
||||
configFile = new File(dirLinux + "/config.xml");
|
||||
posterCache = new File(dirLinux + "/posterCache");
|
||||
} else {
|
||||
directory = new File(dirWin);
|
||||
configFile = new File(dirWin + "/config.xml");
|
||||
posterCache = new File(dirWin + "/posterCache");
|
||||
}
|
||||
|
||||
// startup checks
|
||||
if (!configFile.exists()) {
|
||||
directory.mkdir();
|
||||
mainWindowController.setPath(firstStart());
|
||||
mainWindowController.setStreamingPath(directory.getAbsolutePath());
|
||||
mainWindowController.setColor("ee3523");
|
||||
mainWindowController.setSize(FONT_SIZE);
|
||||
mainWindowController.setAutoUpdate(false);
|
||||
mainWindowController.setLocal(local);
|
||||
mainWindowController.setMode(mode);
|
||||
mainWindowController.saveSettings();
|
||||
try {
|
||||
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()) {
|
||||
posterCache.mkdir();
|
||||
}
|
||||
|
||||
// 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
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
// Method for first Start
|
||||
private String firstStart(){
|
||||
MainWindowController.firststart = true;
|
||||
switch(System.getProperty("user.language")+"_"+System.getProperty("user.country")){
|
||||
case "en_US": bundle = ResourceBundle.getBundle("locals.HomeFlix-Local", Locale.US); //us_english
|
||||
break;
|
||||
case "de_DE": bundle = ResourceBundle.getBundle("locals.HomeFlix-Local", Locale.GERMAN); //German
|
||||
break;
|
||||
default: bundle = ResourceBundle.getBundle("locals.HomeFlix-Local", Locale.US); //default local
|
||||
break;
|
||||
}
|
||||
|
||||
Alert alert = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
|
||||
alert.setTitle("Project HomeFlix");
|
||||
alert.setHeaderText(bundle.getString("firstStartHeader"));
|
||||
alert.setContentText(bundle.getString("firstStartContent"));
|
||||
|
||||
Optional<ButtonType> result = alert.showAndWait();
|
||||
if (result.get() == ButtonType.OK){
|
||||
DirectoryChooser directoryChooser = new DirectoryChooser();
|
||||
File selectedDirectory =
|
||||
directoryChooser.showDialog(primaryStage);
|
||||
path = selectedDirectory.getAbsolutePath();
|
||||
|
||||
} else {
|
||||
path = "";
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
if(System.getProperty("os.name").equals("Linux")){
|
||||
System.setProperty("logFilename", System.getProperty("user.home") + "/HomeFlix/app.log");
|
||||
File logFile = new File(System.getProperty("user.home") + "/HomeFlix/app.log");
|
||||
logFile.delete();
|
||||
}else{
|
||||
System.setProperty("logFilename", System.getProperty("user.home") + "/Documents/HomeFlix/app.log");
|
||||
File logFile = new File(System.getProperty("user.home") + "/Documents/HomeFlix/app.log");
|
||||
logFile.delete();
|
||||
}
|
||||
LOGGER = LogManager.getLogger(Main.class.getName());
|
||||
launch(args);
|
||||
}
|
||||
|
||||
public Stage getPrimaryStage() {
|
||||
return primaryStage;
|
||||
}
|
||||
|
||||
public void setPrimaryStage(Stage primaryStage) {
|
||||
this.primaryStage = primaryStage;
|
||||
}
|
||||
|
||||
public String getFONT_FAMILY() {
|
||||
return FONT_FAMILY;
|
||||
}
|
||||
|
||||
public void setFONT_FAMILY(String FONT_FAMILY) {
|
||||
this.FONT_FAMILY = FONT_FAMILY;
|
||||
}
|
||||
|
||||
public File getPosterCache() {
|
||||
return posterCache;
|
||||
}
|
||||
|
||||
public void setPosterCache(File posterCache) {
|
||||
this.posterCache = posterCache;
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
655
src/main/java/kellerkinder/HomeFlix/controller/DBController.java
Normal file
655
src/main/java/kellerkinder/HomeFlix/controller/DBController.java
Normal file
@ -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));
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
235
src/main/java/kellerkinder/HomeFlix/controller/apiQuery.java
Normal file
235
src/main/java/kellerkinder/HomeFlix/controller/apiQuery.java
Normal file
@ -0,0 +1,235 @@
|
||||
/**
|
||||
* 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.awt.Graphics2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Scanner;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import com.eclipsesource.json.Json;
|
||||
import com.eclipsesource.json.JsonObject;
|
||||
|
||||
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{
|
||||
|
||||
public apiQuery(MainWindowController m, DBController db, Main main){
|
||||
mainWindowController=m;
|
||||
dbController=db;
|
||||
this.main = main;
|
||||
}
|
||||
|
||||
private MainWindowController mainWindowController;
|
||||
private DBController dbController;
|
||||
private Main main;
|
||||
private Image im;
|
||||
private String[] responseString = new String[20];
|
||||
private String posterCache;
|
||||
private String apiURL = "https://www.omdbapi.com/?apikey=";
|
||||
private String apiKey = "";
|
||||
ArrayList<Text> responseText = new ArrayList<Text>();
|
||||
ArrayList<Text> nameText = new ArrayList<Text>();
|
||||
|
||||
/**
|
||||
* 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;
|
||||
String retdata = null;
|
||||
String posterPath = null;
|
||||
InputStream is = null;
|
||||
BufferedReader br = null;
|
||||
String fontFamily = main.getFONT_FAMILY();
|
||||
posterCache = main.getPosterCache().toString();
|
||||
int fontSize = (int) Math.round(mainWindowController.size);
|
||||
|
||||
responseText.removeAll(responseText);
|
||||
nameText.removeAll(nameText);
|
||||
|
||||
try {
|
||||
|
||||
//get film title
|
||||
sc = new Scanner(System.in);
|
||||
moviename = titel;
|
||||
|
||||
// in case of no or "" Film title
|
||||
if (moviename == null || moviename.equals("")) {
|
||||
System.out.println("No movie found");
|
||||
}
|
||||
|
||||
//remove unwanted blank
|
||||
moviename = moviename.trim();
|
||||
|
||||
//replace blank with +
|
||||
moviename = moviename.replace(" ", "+");
|
||||
|
||||
//queryURL is apiURL and additional parameters, response-types: http,json,xml (must be json, since the response is processed with minimal-json )
|
||||
queryURL = new URL(apiURL + apiKey + "&t=" + moviename + "&plot=full&r=json");
|
||||
is = queryURL.openStream();
|
||||
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
|
||||
|
||||
//read data from response Stream
|
||||
while ((retdata = br.readLine()) != null) {
|
||||
//cut the json response into separate strings
|
||||
System.out.println(retdata);
|
||||
JsonObject object = Json.parse(retdata).asObject();
|
||||
|
||||
responseString[0] = object.getString("Title", "");
|
||||
responseString[1] = object.getString("Year", "");
|
||||
responseString[2] = object.getString("Rated", "");
|
||||
responseString[3] = object.getString("Released", "");
|
||||
responseString[4] = object.getString("Runtime", "");
|
||||
responseString[5] = object.getString("Genre", "");
|
||||
responseString[6] = object.getString("Director", "");
|
||||
responseString[7] = object.getString("Writer", "");
|
||||
responseString[8] = object.getString("Actors", "");
|
||||
responseString[9] = object.getString("Plot", "");
|
||||
responseString[10] = object.getString("Language", "");
|
||||
responseString[11] = object.getString("Country", "");
|
||||
responseString[12] = object.getString("Awards", "");
|
||||
responseString[13] = object.getString("Metascore", "");
|
||||
responseString[14] = object.getString("imdbRating", "");
|
||||
responseString[15] = object.getString("Type", "");
|
||||
responseString[16] = object.getString("imdbVotes", "");
|
||||
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")) {
|
||||
posterPath = posterCache+"/"+titel+".png";
|
||||
ImageIO.write(resizeImagePNG, "png", new File(posterCache+"/"+titel+".png")); //change path where you want it saved
|
||||
} else {
|
||||
ImageIO.write(resizeImagePNG, "png", new File(posterCache+"\\"+titel+".png")); //change path where you want it saved
|
||||
posterPath = posterCache+"\\"+titel+".png";
|
||||
}
|
||||
System.out.println("adding poster to cache: "+posterPath);
|
||||
|
||||
//adding strings to the cache
|
||||
dbController.addCache( streamUrl, responseString[0], responseString[1],responseString[2], responseString[3], responseString[4], responseString[5],
|
||||
responseString[6], responseString[7], responseString[8], responseString[9], responseString[10],responseString[11], responseString[12],
|
||||
responseString[13], responseString[14], responseString[15], responseString[16], responseString[17], posterPath,
|
||||
responseString[19]);
|
||||
dbController.setCached(streamUrl);
|
||||
|
||||
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.getTextFlow().getChildren().add(new Text(mainWindowController.noFilmFound));
|
||||
im = new Image("resources/icons/close_black_2048x2048.png");
|
||||
mainWindowController.getImage1().setImage(im);
|
||||
} else {
|
||||
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 < nameText.size(); i++) {
|
||||
nameText.get(i).setFont(Font.font(fontFamily, FontWeight.BOLD, 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));
|
||||
}
|
||||
|
||||
// if there is no poster
|
||||
if (responseString[18].equals("N/A")) {
|
||||
im = new Image("resources/icons/close_black_2048x2048.png");
|
||||
} else {
|
||||
im = new Image(responseString[18]);
|
||||
}
|
||||
mainWindowController.getImage1().setImage(im);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
mainWindowController.getTextFlow().getChildren().remove(0, mainWindowController.getTextFlow().getChildren().size());
|
||||
mainWindowController.getTextFlow().getChildren().add(new Text(e.toString()));
|
||||
System.out.println(e);
|
||||
} finally {
|
||||
//closes datainputStream, InputStream,Scanner if not already done
|
||||
try {
|
||||
if (br != null) {
|
||||
br.close();
|
||||
}
|
||||
|
||||
if (is != null) {
|
||||
is.close();
|
||||
}
|
||||
|
||||
if (sc != null) {
|
||||
sc.close();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static BufferedImage resizeImage(BufferedImage originalImage, int type, int IMG_WIDTH, int IMG_HEIGHT) {
|
||||
BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);
|
||||
Graphics2D g = resizedImage.createGraphics();
|
||||
g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
|
||||
g.dispose();
|
||||
|
||||
return resizedImage;
|
||||
}
|
||||
}
|
179
src/main/java/kellerkinder/HomeFlix/datatypes/tableData.java
Normal file
179
src/main/java/kellerkinder/HomeFlix/datatypes/tableData.java
Normal file
@ -0,0 +1,179 @@
|
||||
/**
|
||||
* 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.datatypes;
|
||||
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.DoubleProperty;
|
||||
import javafx.beans.property.IntegerProperty;
|
||||
import javafx.beans.property.SimpleBooleanProperty;
|
||||
import javafx.beans.property.SimpleDoubleProperty;
|
||||
import javafx.beans.property.SimpleIntegerProperty;
|
||||
import javafx.beans.property.SimpleObjectProperty;
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
import javafx.scene.image.ImageView;
|
||||
|
||||
public class tableData {
|
||||
private final IntegerProperty year = new SimpleIntegerProperty();
|
||||
private final IntegerProperty season = new SimpleIntegerProperty();
|
||||
private final IntegerProperty episode = new SimpleIntegerProperty();
|
||||
private final DoubleProperty rating = new SimpleDoubleProperty();
|
||||
private final StringProperty resolution = new SimpleStringProperty();
|
||||
private final StringProperty title = new SimpleStringProperty();
|
||||
private final StringProperty streamUrl = new SimpleStringProperty();
|
||||
private final SimpleObjectProperty<ImageView> image = new SimpleObjectProperty<>();
|
||||
private final BooleanProperty cached = new SimpleBooleanProperty();
|
||||
|
||||
/**
|
||||
* tableData is the data-type of tree-table-view
|
||||
* @param year the release year of the film
|
||||
* @param season season if it's a series
|
||||
* @param episode episode if it's a series
|
||||
* @param rating indicator for favourites, used for sorting the items
|
||||
* @param resolution resolution of the film
|
||||
* @param titel title of the film
|
||||
* @param streamUrl the concrete path to the file or the URL
|
||||
* @param image the favourite icon
|
||||
* @param cached indicator for caching status
|
||||
*/
|
||||
public tableData (final int year, final int season, final int episode, final double rating, final String resolution, final String title, final String streamUrl, final ImageView image, final boolean cached) {
|
||||
this.year.set(year);
|
||||
this.season.set(season);
|
||||
this.episode.set(episode);
|
||||
this.rating.set(rating);
|
||||
this.resolution.set(resolution);
|
||||
this.title.set(title);
|
||||
this.streamUrl.set(streamUrl);
|
||||
this.image.set(image);
|
||||
this.cached.set(cached);
|
||||
}
|
||||
|
||||
public IntegerProperty yearProperty(){
|
||||
return year;
|
||||
}
|
||||
|
||||
public IntegerProperty seasonProperty(){
|
||||
return season;
|
||||
}
|
||||
|
||||
public IntegerProperty episodeProperty(){
|
||||
return episode;
|
||||
}
|
||||
|
||||
public DoubleProperty ratingProperty(){
|
||||
return rating;
|
||||
}
|
||||
|
||||
public StringProperty resolutionProperty(){
|
||||
return resolution;
|
||||
}
|
||||
|
||||
public StringProperty titleProperty(){
|
||||
return title;
|
||||
}
|
||||
|
||||
public StringProperty streamUrlProperty(){
|
||||
return streamUrl;
|
||||
}
|
||||
|
||||
public SimpleObjectProperty<ImageView> imageProperty(){
|
||||
return image;
|
||||
}
|
||||
|
||||
public BooleanProperty cachedProperty(){
|
||||
return cached;
|
||||
}
|
||||
|
||||
|
||||
public final int getYear() {
|
||||
return yearProperty().get();
|
||||
}
|
||||
|
||||
public final int getSeason() {
|
||||
return seasonProperty().get();
|
||||
}
|
||||
|
||||
public final int getEpisode() {
|
||||
return episodeProperty().get();
|
||||
}
|
||||
|
||||
public final double getRating() {
|
||||
return ratingProperty().get();
|
||||
}
|
||||
|
||||
public final String getResolution() {
|
||||
return resolutionProperty().get();
|
||||
}
|
||||
|
||||
public final String getTitle() {
|
||||
return titleProperty().get();
|
||||
}
|
||||
|
||||
public final String getStreamUrl() {
|
||||
return streamUrlProperty().get();
|
||||
}
|
||||
|
||||
public final ImageView getImage() {
|
||||
return imageProperty().get();
|
||||
}
|
||||
|
||||
public final boolean getCached(){
|
||||
return cachedProperty().get();
|
||||
}
|
||||
|
||||
|
||||
public final void setYear(int year) {
|
||||
yearProperty().set(year);
|
||||
}
|
||||
|
||||
public final void setSeason(int season) {
|
||||
seasonProperty().set(season);
|
||||
}
|
||||
|
||||
public final void setEpisode(int season) {
|
||||
episodeProperty().set(season);
|
||||
}
|
||||
|
||||
public final void setRating(int rating) {
|
||||
ratingProperty().set(rating);
|
||||
}
|
||||
|
||||
public final void setResolution(String resolution) {
|
||||
resolutionProperty().set(resolution);
|
||||
}
|
||||
|
||||
public final void setTitle(String title) {
|
||||
titleProperty().set(title);
|
||||
}
|
||||
|
||||
public final void setStreamUrl(String streamUrl) {
|
||||
streamUrlProperty().set(streamUrl);
|
||||
}
|
||||
|
||||
public final void setImage(ImageView image) {
|
||||
imageProperty().set(image);
|
||||
}
|
||||
|
||||
public final void setCached(boolean cached){
|
||||
cachedProperty().set(cached);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user