diff --git a/.classpath b/.classpath
deleted file mode 100644
index d9ff1e3..0000000
--- a/.classpath
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.gitignore b/.gitignore
index f8db64b..43baad2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -49,4 +49,6 @@ config.xml
.directory
target/
apiKeys.json
-
+.classpath
+.project
+.settings/*
diff --git a/.project b/.project
deleted file mode 100644
index 01f0bec..0000000
--- a/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
- Project-HomeFlix
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.m2e.core.maven2Builder
-
-
-
-
-
- org.eclipse.jdt.core.javanature
- org.eclipse.m2e.core.maven2Nature
-
-
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 839d647..0000000
--- a/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-eclipse.preferences.version=1
-encoding//src/main/java=UTF-8
-encoding//src/main/resources=UTF-8
-encoding//src/test/java=UTF-8
-encoding/=UTF-8
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 6f1d295..0000000
--- a/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,13 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=9
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=9
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=9
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f..0000000
--- a/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/README.md b/README.md
index 2491954..fce24c2 100644
--- a/README.md
+++ b/README.md
@@ -1,24 +1,18 @@
-![Total Downloads](https://img.shields.io/github/downloads/Seil0/Project-HomeFlix/total.svg?style=flat-square)
-[![Latest](https://img.shields.io/github/release/Seil0/Project-HomeFlix/all.svg?style=flat-square)](https://github.com/Seil0/Project-HomeFlix/releases)
+[![Latest](https://img.shields.io/badge/Download-latest-brightgreen.svg?style=flat-square)](https://git.mosad.xyz/Seil0/Project-HomeFlix/releases)
[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg?style=flat-square)](https://www.gnu.org/licenses/gpl-3.0)
# Project-HomeFlix
Project-HomeFlix is a Kellerkinder Project, that alowes you to sort all your local saved movies in clean UI. Project-HomeFlix is free and open-source software and uses other open-source projects to provied a nice user experience.
## Installation
-Simply download the Project-HomeFlix.jar from [releases](https://github.com/Seil0/Project-HomeFlix/releases), make sure you have the latest version of java 8 oracle jre/jdk installed, open the .jar file. If you need additional information pleas visit our [wiki](https://github.com/Seil0/Project-HomeFlix/wiki).
+Simply download the Project-HomeFlix.jar from [releases](https://git.mosad.xyz/Seil0/Project-HomeFlix/releases), make sure you have the latest version of java 8 oracle jre/jdk installed, open the .jar file. If you need additional information pleas visit our [wiki](https://git.mosad.xyz/Seil0/Project-HomeFlix/wiki).
## Development information
-The dev branch is **only merged** into master when a **new release** is released, so **master contains the latest released version**. Please commit all changes to [dev](https://github.com/Seil0/Project-HomeFlix/tree/dev).
+The dev branch is **only merged** into master when a **new release** is released, so **master contains the latest released version**. Please commit all changes to [dev](https://git.mosad.xyz/Seil0/Project-HomeFlix/src/branch/dev).
-Librarys used in this Project:
-JFoenix: https://github.com/jfoenixadmin/JFoenix
-minimal-json: https://github.com/ralfstx/minimal-json
-sqlite-jdbc: https://github.com/xerial/sqlite-jdbc
-apache commons io : https://commons.apache.org/proper/commons-io/
+[Libraries used in this Project](https://git.mosad.xyz/Seil0/Project-HomeFlix/wiki/Documentation#used-libraries-and-apis)
-## screenshots
-![Screenshot](https://github.com/Seil0/Seil0.github.io/blob/master/images/Project-HomeFlix_MainWindow.png)
+## Screenshots
+![Screenshot](https://raw.githubusercontent.com/Seil0/Seil0.github.io/master/images/Project-HomeFlix_MainWindow.png)
-Project-HomeFlix © 2016-2018 Kellerkinder ([Seil0](https://github.com/Seil0), [Windoofs](https://github.com/Windoofs))
-www.kellerkinder.xyz
+Project-HomeFlix © 2016-2019 mosad www.mosad.xyz, Project by [@Seil0](https://git.mosad.xyz/Seil0) and [@localhorst](https://git.mosad.xyz/localhorst)
diff --git a/pom.xml b/pom.xml
index 95f22a2..f69889e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,103 +1,141 @@
-
- 4.0.0
+
+ 4.0.0
- org.kellerkinder
- Project-HomeFlix
- 0.7.0
- jar
+ org.kellerkinder
+ Project-HomeFlix
+ 0.7.0
+ jar
- Project-HomeFlix
- http://www.kellerkinder.xyz
+ Project-HomeFlix
+ http://www.mosad.xyz
-
- UTF-8
-
+
+ UTF-8
+
-
-
-
- junit
- junit
- 4.12
- test
-
-
-
- commons-io
- commons-io
- 2.6
-
+
-
- com.jfoenix
- jfoenix
- 9.0.3
-
-
-
- com.eclipsesource.minimal-json
- minimal-json
- 0.9.5
-
-
-
- org.xerial
- sqlite-jdbc
- 3.21.0.1
-
-
-
- org.apache.logging.log4j
- log4j-api
- 2.11.0
-
+
+ junit
+ junit
+ 4.12
+ test
+
-
- org.apache.logging.log4j
- log4j-core
- 2.11.0
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.7.0
-
-
- 9
- true
- true
-
-
+
+ org.openjfx
+ javafx-controls
+ 12.0.1
+
+
+
+ org.openjfx
+ javafx-fxml
+ 12.0.1
+
+
+
+ org.openjfx
+ javafx-media
+ 12.0.1
+
+
+
+ commons-io
+ commons-io
+ 2.6
+
+
+
+ com.jfoenix
+ jfoenix
+ 9.0.9
+
+
+
+ com.eclipsesource.minimal-json
+ minimal-json
+ 0.9.5
+
+
+
+ org.xerial
+ sqlite-jdbc
+ 3.27.2.1
+
+
+
+ org.apache.logging.log4j
+ log4j-api
+ 2.11.2
+
+
+
+ org.apache.logging.log4j
+ log4j-core
+ 2.11.2
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+
+ 11
+
+ true
+ true
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 1.6.0
+
+
+
+ java
+
+
+
+
+ kellerkinder.HomeFlix.application.Main
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.2.1
+
+ Project-HomeFlix
+ true
+
+
+ kellerkinder.HomeFlix.application.JavaFX11Main
+
+
+
+
+
+ package
+
+ shade
+
+
+
+
+
+
+
-
- org.apache.maven.plugins
- maven-shade-plugin
- 3.1.1
-
- true
-
-
- kellerkinder.HomeFlix.application.Main
-
-
-
-
-
- package
-
- shade
-
-
-
-
-
-
-
-
diff --git a/src/main/java/kellerkinder/HomeFlix/application/FilmDetailView.java b/src/main/java/kellerkinder/HomeFlix/application/FilmDetailView.java
new file mode 100644
index 0000000..8c02475
--- /dev/null
+++ b/src/main/java/kellerkinder/HomeFlix/application/FilmDetailView.java
@@ -0,0 +1,226 @@
+/**
+ * Project-HomeFlix
+ *
+ * Copyright 2016-2019 <@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.awt.Desktop;
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.jfoenix.controls.JFXButton;
+
+import javafx.animation.FadeTransition;
+import javafx.fxml.FXML;
+import javafx.scene.control.Label;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.text.Text;
+import javafx.util.Duration;
+import kellerkinder.HomeFlix.controller.DBController;
+import kellerkinder.HomeFlix.controller.XMLController;
+import kellerkinder.HomeFlix.player.Player;
+
+public class FilmDetailView {
+
+ @FXML private AnchorPane filmDVPane;
+
+ @FXML private Label lblTitle;
+ @FXML private Label lblYear;
+ @FXML private Label lblScore;
+
+ @FXML private Label lblCrew;
+ @FXML private Label lblDirectors;
+ @FXML private Label lblDirectorsInfo;
+ @FXML private Label lblWriters;
+ @FXML private Label lblWritersInfo;
+ @FXML private Label lblActors;
+ @FXML private Label lblActorsInfo;
+
+ @FXML private Label lblInfo;
+ @FXML private Label lblRuntimeInfo;
+ @FXML private Label lblRuntime;
+ @FXML private Label lblLanguageInfo;
+ @FXML private Label lblLanguage;
+ @FXML private Label lblRevenueInfo;
+ @FXML private Label lblRevenue;
+ @FXML private Label lblRatingInfo;
+ @FXML private Label lblRating;
+
+ @FXML private JFXButton btnWishlist;
+ @FXML private JFXButton btnFavourite;
+ @FXML private JFXButton btnHide;
+ @FXML private JFXButton btnPlay;
+ @FXML private JFXButton btnDirectory;
+
+ @FXML private ImageView wishlistIcon;
+ @FXML private ImageView favoriteIcon;
+ @FXML private ImageView imgPoster;
+
+ @FXML private Text textPlot;
+
+ private DBController dbController;
+ private static final Logger LOGGER = LogManager.getLogger(FilmDetailView.class.getName());
+ private String currentStreamURL;
+
+ public void initialize() {
+ dbController = DBController.getInstance();
+ filmDVPane.setStyle("-fx-background-color: rgba(89,89,89,0.9);");
+ }
+
+ @FXML
+ private void btnWishlistAction() {
+
+ }
+
+ @FXML
+ private void btnFavouriteAction() {
+ dbController.toggleFavoriteState(currentStreamURL);
+
+ // update the favorite icon
+ if(dbController.getFavoriteState(currentStreamURL) == 1) {
+ favoriteIcon.setImage(new Image("icons/baseline_favorite_black_48dp.png"));
+ } else {
+ favoriteIcon.setImage(new Image("icons/baseline_favorite_border_black_48dp.png"));
+ }
+ }
+
+ @FXML
+ private void btnHideAction() {
+ hidePane();
+ }
+
+ @FXML
+ private void btnPlayAction() {
+ playFilm();
+ }
+
+ @FXML
+ private void btnDirectoryAction() {
+ File dest = new File(currentStreamURL).getParentFile();
+
+ if (!System.getProperty("os.name").contains("Linux")) {
+ try {
+ Desktop.getDesktop().open(dest);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * set the cached data of a stream to the FilmDetailView
+ * @param streamURL URL of the stream
+ */
+ public void setFilm(String streamURL) {
+ currentStreamURL = streamURL;
+ String[] cacheInfo = dbController.readCache(streamURL); // get the cache data from the database
+
+ // add the cache data to the GUI
+ lblTitle.setText(cacheInfo[0]);
+ lblYear.setText("(" + cacheInfo[1] + ")");
+ lblScore.setText(XMLController.getLocalBundle().getString("score") + ": " + cacheInfo[15] + "%");
+
+ textPlot.setText(cacheInfo[11]);
+
+ lblDirectors.setText(cacheInfo[8]);
+ lblWriters.setText(cacheInfo[9]);
+ lblActors.setText(cacheInfo[10]);
+
+ lblRuntime.setText(cacheInfo[6]);
+ lblLanguage.setText(cacheInfo[12]);
+ lblRevenue.setText(cacheInfo[18]);
+ lblRating.setText(cacheInfo[2]);
+
+ try {
+ if (new File(cacheInfo[20]).isFile()) {
+ imgPoster.setImage(new Image(new File(cacheInfo[20]).toURI().toString()));
+ } else {
+ imgPoster.setImage(new Image(cacheInfo[20]));
+ }
+ } catch (Exception e) {
+ imgPoster.setImage(new Image("icons/Homeflix_Poster.png"));
+ LOGGER.error("No Poster found, useing default.");
+ }
+
+ // set the favorite correct icon
+ if(dbController.getFavoriteState(streamURL) == 1) {
+ favoriteIcon.setImage(new Image("icons/baseline_favorite_black_48dp.png"));
+ } else {
+ favoriteIcon.setImage(new Image("icons/baseline_favorite_border_black_48dp.png"));
+ }
+
+ }
+
+ /**
+ * update the text of all static GUI elements of FilmDeatilView
+ */
+ public void updateGUILocal() {
+ lblCrew.setText(XMLController.getLocalBundle().getString("crew"));
+ lblDirectorsInfo.setText(XMLController.getLocalBundle().getString("directors"));
+ lblWritersInfo.setText(XMLController.getLocalBundle().getString("writers"));
+ lblActorsInfo.setText(XMLController.getLocalBundle().getString("actors"));
+
+ lblInfo.setText(XMLController.getLocalBundle().getString("info"));
+ lblRuntimeInfo.setText(XMLController.getLocalBundle().getString("runtime"));
+ lblLanguageInfo.setText(XMLController.getLocalBundle().getString("language"));
+ lblRevenueInfo.setText(XMLController.getLocalBundle().getString("boxOffice"));
+ lblRatingInfo.setText(XMLController.getLocalBundle().getString("rated"));
+ }
+
+ /**
+ * show the FilmDVpane
+ */
+ public void showPane() {
+ filmDVPane.setVisible(true);
+ FadeTransition fadeIn = new FadeTransition(Duration.millis(300), filmDVPane);
+ fadeIn.setFromValue(0.3);
+ fadeIn.setToValue(1.0);
+ fadeIn.play();
+ }
+
+ /**
+ * hide the FilmDVpane
+ */
+ private void hidePane() {
+ FadeTransition fadeOut = new FadeTransition(Duration.millis(200), filmDVPane);
+ fadeOut.setFromValue(1.0);
+ fadeOut.setToValue(0.3);
+ fadeOut.play();
+
+ filmDVPane.setVisible(false);
+
+ MainWindowController.getInstance().disableBlur(); // disable blur
+ }
+
+ private void playFilm() {
+ if(new File(currentStreamURL).isDirectory()) {
+ return;
+ }
+
+ new Player(currentStreamURL);
+ }
+
+}
diff --git a/src/main/java/kellerkinder/HomeFlix/application/JavaFX11Main.java b/src/main/java/kellerkinder/HomeFlix/application/JavaFX11Main.java
new file mode 100644
index 0000000..1b2bc01
--- /dev/null
+++ b/src/main/java/kellerkinder/HomeFlix/application/JavaFX11Main.java
@@ -0,0 +1,8 @@
+package kellerkinder.HomeFlix.application;
+
+public class JavaFX11Main {
+
+ public static void main(String[] args) {
+ Main.main(args);
+ }
+}
diff --git a/src/main/java/kellerkinder/HomeFlix/application/Main.java b/src/main/java/kellerkinder/HomeFlix/application/Main.java
index d9012c4..da229a7 100644
--- a/src/main/java/kellerkinder/HomeFlix/application/Main.java
+++ b/src/main/java/kellerkinder/HomeFlix/application/Main.java
@@ -1,7 +1,7 @@
/**
* Project-HomeFlix
*
- * Copyright 2016-2018 <@Seil0>
+ * Copyright 2016-2019 <@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,222 +19,98 @@
* MA 02110-1301, USA.
*
*/
+
package kellerkinder.HomeFlix.application;
import java.io.File;
import java.io.IOException;
-import java.util.Locale;
-import java.util.ResourceBundle;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.kellerkinder.Alerts.JFX2BtnCancelAlert;
import javafx.application.Application;
-import javafx.event.ActionEvent;
-import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
-import javafx.stage.DirectoryChooser;
-import javafx.stage.FileChooser;
import javafx.stage.Stage;
-import javafx.stage.WindowEvent;
+import kellerkinder.HomeFlix.controller.XMLController;
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 static String local = System.getProperty("user.language") + "_" + System.getProperty("user.country");
- private String dirWin = userHome + "/Documents/HomeFlix"; // Windows: C:/Users/"User"/Documents/HomeFlix
- private String dirLinux = userHome + "/HomeFlix"; // Linux: /home/"User"/HomeFlix
- private File directory;
- private File configFile;
- private File posterCache;
- private ResourceBundle bundle;
+ private static XMLController xmlController;
private static Logger LOGGER;
+ public static final String version = "0.8.0";
+ public static final String buildNumber = "173";
+ public static final String versionName = "toothless dragon";
@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();
- }
-
- /**
- * initialize the mainWindowController, GUI and load the saved settings or call addFirstSource
- * initialize the primaryStage and set the file/directory paths
- */
- private void mainWindow(){
+
+ //initialize the mainWindowController and the primaryStage
try {
FXMLLoader loader = new FXMLLoader();
- loader.setLocation(ClassLoader.getSystemResource("fxml/MainWindow.fxml"));
+ loader.setLocation(getClass().getResource("/fxml/MainWindow.fxml"));
pane = (AnchorPane) loader.load();
- primaryStage.setMinHeight(600.00);
- primaryStage.setMinWidth(1000.00);
- primaryStage.setResizable(false);
+ primaryStage.setMinHeight(600.00 + 34); // 34 -> window decoration
+ primaryStage.setMinWidth(1130.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.setOnCloseRequest(new EventHandler() {
- public void handle(WindowEvent we) {
- System.exit(1);
- }
- });
-
- mainWindowController = loader.getController(); //Link of FXMLController and controller class
- mainWindowController.setMain(this); //call setMain
+ primaryStage.setOnCloseRequest(event -> System.exit(0));
-
- // get OS and the specific paths
- if (osName.contains("Windows")) {
- directory = new File(dirWin);
- configFile = new File(dirWin + "/config.xml");
- posterCache = new File(dirWin + "/posterCache");
- } else {
- directory = new File(dirLinux);
- configFile = new File(dirLinux + "/config.xml");
- posterCache = new File(dirLinux + "/posterCache");
- }
-
// 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
- // startup checks
- if (!configFile.exists()) {
- directory.mkdir();
- addFirstSource();
- mainWindowController.setColor("ee3523");
- mainWindowController.setFontSize(17.0);
- mainWindowController.setAutoUpdate(false);
- mainWindowController.setLocal(local);
- mainWindowController.saveSettings();
- }
-
- if (!posterCache.exists()) {
- posterCache.mkdir();
- }
-
- // init here as it loads the games to the mwc and the gui, therefore the window must exist
+ mainWindowController = loader.getController(); //Link of FXMLController and controller class
mainWindowController.init();
- mainWindowController.getDbController().init();
} catch (IOException e) {
- LOGGER.error(e);
+ LOGGER.error("Error while loading in Main", e);
}
}
/**
- * we need to get the path for the first source from the user and add it to
- * sources.json, if the user ends the file-/directory-chooser the program will exit
- */
- private void addFirstSource() {
- switch (local) {
- 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;
- }
-
- JFX2BtnCancelAlert selectFirstSource = new JFX2BtnCancelAlert(bundle.getString("addSourceHeader"),
- bundle.getString("addSourceBody"),
- "-fx-button-type: RAISED; -fx-background-color: #ee3523; -fx-text-fill: BLACK;",
- bundle.getString("addDirectory"), bundle.getString("addStreamSource"),
- bundle.getString("cancelBtnText"), primaryStage);
-
- // directory action
- EventHandler btn1Action = new EventHandler() {
- @Override
- public void handle(ActionEvent event) {
- DirectoryChooser directoryChooser = new DirectoryChooser();
- directoryChooser.setTitle(bundle.getString("addDirectory"));
- File selectedFolder = directoryChooser.showDialog(primaryStage);
- if (selectedFolder != null && selectedFolder.exists()) {
- mainWindowController.addSource(selectedFolder.getPath(), "local");
- selectFirstSource.getAlert().close();
- } else {
- LOGGER.error("The selected folder dosen't exist!");
- System.exit(1);
- }
- }
- };
-
- // streaming action
- EventHandler btn2Action = new EventHandler() {
- @Override
- public void handle(ActionEvent event) {
- FileChooser fileChooser = new FileChooser();
- fileChooser.setTitle("addStreamSource");
- File selectedFile = fileChooser.showOpenDialog(getPrimaryStage());
- if (selectedFile != null && selectedFile.exists()) {
- mainWindowController.addSource(selectedFile.getPath(), "stream");
- selectFirstSource.getAlert().close();
- } else {
- LOGGER.error("The selected file dosen't exist!");
- System.exit(1);
- }
- }
- };
- selectFirstSource.setBtn1Action(btn1Action);
- selectFirstSource.setBtn2Action(btn2Action);
- selectFirstSource.showAndWait();
- }
-
- /**
- * set the log file location and initialize the logger
- * launch the GUI
+ * set the log file location and initialize the logger launch the GUI
* @param args arguments given at the start
*/
public static void main(String[] args) {
- if (System.getProperty("os.name").equals("Windows")) {
- System.setProperty("logFilename", userHome + "/Documents/HomeFlix/app.log");
- File logFile = new File(userHome + "/Documents/HomeFlix/app.log");
- logFile.delete();
+ // Logger initialization
+ String logPath = "";
+
+ if (System.getProperty("os.name").contains("Windows")) {
+ logPath = System.getProperty("user.home") + "/Documents/HomeFlix/app.log";
} else {
- System.setProperty("logFilename", userHome + "/HomeFlix/app.log");
- File logFile = new File(userHome + "/HomeFlix/app.log");
- logFile.delete();
+ logPath = System.getProperty("user.home") + "/HomeFlix/app.log";
}
+
+ System.setProperty("logFilename", logPath);
+ File logFile = new File(logPath);
+ logFile.delete();
LOGGER = LogManager.getLogger(Main.class.getName());
+
+ LOGGER.info("OS: " + XMLController.getOsName() + " " + XMLController.getOsVers() + " " + XMLController.getOsVers());
+ LOGGER.info("Java: " + XMLController.getJavaVend() + " " + XMLController.getJavaVers());
+ LOGGER.info("User: " + XMLController.getUserName() + " " + XMLController.getUserHome());
+
+ xmlController = new XMLController();
+
+ if (!XMLController.getConfigFile().exists()) {
+ xmlController.saveSettings(); // save the settings file with default values if it doesn't exist
+ }
+
+ xmlController.loadSettings();
+
+ if (!XMLController.getPosterCache().exists()) {
+ XMLController.getPosterCache().mkdir();
+ }
+
launch(args);
}
- public Stage getPrimaryStage() {
- return primaryStage;
- }
-
- public AnchorPane getPane() {
- return pane;
- }
-
- public File getDirectory() {
- return directory;
- }
-
- public File getConfigFile() {
- return configFile;
- }
-
- public File getPosterCache() {
- return posterCache;
- }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java b/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java
index 45cb8b0..65e6090 100644
--- a/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java
+++ b/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java
@@ -1,7 +1,7 @@
/**
* Project-HomeFlix
*
- * Copyright 2016-2018 <@Seil0>
+ * Copyright 2016-2019 <@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,1062 +19,427 @@
* MA 02110-1301, USA.
*
*/
+
package kellerkinder.HomeFlix.application;
-import java.awt.Desktop;
-import java.io.BufferedReader;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
import java.io.Writer;
import java.math.BigInteger;
-import java.net.URLConnection;
+import java.time.LocalDate;
import java.util.Locale;
-import java.util.Properties;
import java.util.ResourceBundle;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import org.kellerkinder.Alerts.JFX2BtnCancelAlert;
import org.kellerkinder.Alerts.JFXInfoAlert;
import com.eclipsesource.json.Json;
import com.eclipsesource.json.JsonArray;
import com.eclipsesource.json.JsonObject;
import com.jfoenix.controls.JFXButton;
-import com.jfoenix.controls.JFXColorPicker;
import com.jfoenix.controls.JFXHamburger;
-import com.jfoenix.controls.JFXSlider;
-import com.jfoenix.controls.JFXTextField;
-import com.jfoenix.controls.JFXToggleButton;
import com.jfoenix.transitions.hamburger.HamburgerBackArrowBasicTransition;
import javafx.animation.TranslateTransition;
-import javafx.beans.value.ChangeListener;
-import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
-import javafx.event.ActionEvent;
-import javafx.event.EventHandler;
import javafx.fxml.FXML;
-import javafx.scene.control.ChoiceBox;
-import javafx.scene.control.ContextMenu;
-import javafx.scene.control.Label;
-import javafx.scene.control.MenuItem;
import javafx.scene.control.ScrollPane;
-import javafx.scene.control.TableColumn;
-import javafx.scene.control.TableView;
-import javafx.scene.control.TreeItem;
-import javafx.scene.control.TreeTableColumn;
-import javafx.scene.control.TreeTableColumn.SortType;
-import javafx.scene.control.TreeTableView;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
+import javafx.scene.control.ScrollPane.ScrollBarPolicy;
+import javafx.scene.effect.BoxBlur;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.FlowPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
-import javafx.scene.paint.Color;
-import javafx.scene.text.Font;
-import javafx.scene.text.TextFlow;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
+import javafx.stage.Stage;
import javafx.util.Duration;
import kellerkinder.HomeFlix.controller.DBController;
import kellerkinder.HomeFlix.controller.OMDbAPIController;
import kellerkinder.HomeFlix.controller.UpdateController;
-import kellerkinder.HomeFlix.datatypes.SourceDataType;
-import kellerkinder.HomeFlix.player.Player;
+import kellerkinder.HomeFlix.controller.XMLController;
import kellerkinder.HomeFlix.datatypes.FilmTabelDataType;
+import kellerkinder.HomeFlix.datatypes.PosterModeElement;
public class MainWindowController {
- @FXML
- private AnchorPane mainAnchorPane;
- @FXML
- private AnchorPane tableModeAnchorPane;
+ // general
+ @FXML private AnchorPane mainAnchorPane;
- @FXML
- private ScrollPane settingsScrollPane;
- @FXML
- private ScrollPane textScrollPane;
+ @FXML private HBox topHBox;
+ @FXML private VBox sideMenuVBox;
- @FXML
- private HBox topHBox;
+ @FXML private JFXHamburger menuHam;
- @FXML
- private VBox sideMenuVBox;
+ @FXML private JFXButton aboutBtn;
+ @FXML private JFXButton settingsBtn;
+
+ // settings
+ @FXML private SettingsView settingsViewController;
+
+ // poster-mode
+ @FXML private ScrollPane posterModeScrollPane;
+ @FXML private FlowPane posterModeFlowPane;
+
+ @FXML private FilmDetailView filmDetailViewController;
+ @FXML private SeriesDetailView seriesDetailViewController;
- @FXML
- private TreeTableView filmsTreeTable;
-
- @FXML
- private TableView sourcesTable;
-
- @FXML
- private TextFlow textFlow;
-
- @FXML
- private JFXButton playbtn;
- @FXML
- private JFXButton openfolderbtn;
- @FXML
- private JFXButton returnBtn;
- @FXML
- private JFXButton forwardBtn;
- @FXML
- private JFXButton aboutBtn;
- @FXML
- private JFXButton settingsBtn;
- @FXML
- private JFXButton updateBtn;
- @FXML
- private JFXButton addDirectoryBtn;
- @FXML
- private JFXButton addStreamSourceBtn;
-
- @FXML
- private JFXHamburger menuHam;
-
- @FXML
- private JFXToggleButton autoUpdateToggleBtn;
- @FXML
- private JFXToggleButton autoplayToggleBtn;
-
- @FXML
- private JFXTextField searchTextField;
-
- @FXML
- private JFXColorPicker colorPicker;
-
- @FXML
- private ChoiceBox languageChoisBox = new ChoiceBox<>();
- @FXML
- private ChoiceBox branchChoisBox = new ChoiceBox<>();
-
- @FXML
- private JFXSlider fontsizeSlider;
-
- @FXML
- private Label homeflixSettingsLbl;
- @FXML
- private Label mainColorLbl;
- @FXML
- private Label fontsizeLbl;
- @FXML
- private Label languageLbl;
- @FXML
- private Label updateLbl;
- @FXML
- private Label branchLbl;
- @FXML
- private Label sourcesLbl;
- @FXML
- private Label versionLbl;
-
- @FXML
- private ImageView posterImageView;
- private ImageView imv1;
-
- @FXML
- private TreeItem filmRoot = new TreeItem<>(new FilmTabelDataType("", "", "", "", false, false, imv1));
- @FXML
- private TreeTableColumn columnStreamUrl = new TreeTableColumn<>("File Name");
- @FXML
- private TreeTableColumn columnTitle = new TreeTableColumn<>("Title");
- @FXML
- private TreeTableColumn columnSeason = new TreeTableColumn<>("Season");
- @FXML
- private TreeTableColumn columnEpisode = new TreeTableColumn<>("Episode");
- @FXML
- private TreeTableColumn columnFavorite = new TreeTableColumn<>("Favorite");
-
- @FXML
- private TreeItem sourceRoot = new TreeItem<>(new SourceDataType("", ""));
- @FXML
- private TableColumn sourceColumn;
- @FXML
- private TableColumn modeColumn;
+ private static MainWindowController instance = null;
+ private DBController dbController;
+ private XMLController xmlController;
+ private Stage primaryStage;
+ private static final Logger LOGGER = LogManager.getLogger(MainWindowController.class.getName());
private boolean menuTrue = false;
- private boolean settingsTrue = false;
- private boolean autoUpdate = false;
- private boolean useBeta = false;
- private boolean autoplay = false;
- private static final Logger LOGGER = LogManager.getLogger(MainWindowController.class.getName());
- private int hashA = -647380320;
- private final String version = "0.7.0";
- private final String buildNumber = "151";
- private final String versionName = "toothless dragon";
- private String dialogBtnStyle;
- private String color;
- private String local;
- private String omdbAPIKey;
-
- // text strings
- private String errorLoad;
- private String errorSave;
- private String infoText;
- private String vlcNotInstalled;
-
- private double fontSize;
- private int last;
- private int indexTable;
- private int indexList;
- private int next;
- private ResourceBundle bundle;
- private FilmTabelDataType currentTableFilm = new FilmTabelDataType("", "", "", "", false, false, null);
-
- private ObservableList languages = FXCollections.observableArrayList("English (en_US)", "Deutsch (de_DE)");
- private ObservableList branches = FXCollections.observableArrayList("stable", "beta");
- private ObservableList filterData = FXCollections.observableArrayList();
- private ObservableList filmsList = FXCollections.observableArrayList();
- private ObservableList sourcesList = FXCollections.observableArrayList();
- private ImageView skip_previous_white = new ImageView(new Image("icons/ic_skip_previous_white_18dp_1x.png"));
- private ImageView skip_previous_black = new ImageView(new Image("icons/ic_skip_previous_black_18dp_1x.png"));
- private ImageView skip_next_white = new ImageView(new Image("icons/ic_skip_next_white_18dp_1x.png"));
- private ImageView skip_next_black = new ImageView(new Image("icons/ic_skip_next_black_18dp_1x.png"));
- private ImageView play_arrow_white = new ImageView(new Image("icons/ic_play_arrow_white_18dp_1x.png"));
- private ImageView play_arrow_black = new ImageView(new Image("icons/ic_play_arrow_black_18dp_1x.png"));
- private MenuItem like = new MenuItem("like");
- private MenuItem dislike = new MenuItem("dislike"); // TODO one option (like or dislike)
- private ContextMenu menu = new ContextMenu(like, dislike);
- private Properties props = new Properties();
-
- private Main main;
- private MainWindowController mainWindowController;
- private UpdateController updateController;
- private OMDbAPIController omdbAPIController;
- private DBController dbController;
-
- /**
- * "Main" Method called in Main.java main() when starting
- * Initialize other objects: Updater, dbController and ApiQuery
- */
- void setMain(Main main) {
- this.main = main;
- mainWindowController = this;
- dbController = new DBController(this.main, this);
- omdbAPIController = new OMDbAPIController(this, dbController, this.main);
+ private String btnStyle;
+
+ private ObservableList posterEmenents = FXCollections.observableArrayList();
+ private LocalDate lastValidCache = LocalDate.now().minusDays(30); // current date - 30 days is the last valid cache date
+
+ public MainWindowController() {
+ // the constructor
}
- // call all initialize methods
- void init() {
- LOGGER.info("Initializing Project-HomeFlix build " + buildNumber);
- loadSettings();
- checkAutoUpdate();
- initTabel();
- initUI();
+ public static MainWindowController getInstance() {
+ if (instance == null) {
+ LOGGER.error("There was a fatal error: instance is null!");
+ instance = new MainWindowController();
+ }
+
+ return instance;
+ }
+
+ public void initialize() {
+ instance = this;
+ xmlController = new XMLController();
+ dbController = DBController.getInstance();
+
+ if (!new File(XMLController.getDirHomeFlix() + "/sources.json").exists()) {
+ XMLController.getDirHomeFlix().mkdir();
+ LOGGER.warn("sources file not found");
+
+ addFirstSource();
+ xmlController.saveSettings();
+ }
+ }
+
+ public void init() {
+ LOGGER.info("Initializing Project-HomeFlix build " + Main.buildNumber);
+
+ // initialize the GUI and the DBController
+ primaryStage = (Stage) mainAnchorPane.getScene().getWindow(); // set primary stage for dialogs
+ posterModeScrollPane.setVbarPolicy(ScrollBarPolicy.ALWAYS);
+ setLocalUI();
+ applyColor(); // TODO only on first start
+
initActions();
- }
-
- // Initialize the tables (treeTableViewfilm and sourcesTable)
- private void initTabel() {
+ dbController.init();
- // film Table
- columnStreamUrl.setMaxWidth(0);
- columnTitle.setMaxWidth(190);
- columnFavorite.setMaxWidth(80);
- columnSeason.setMaxWidth(73);
- columnEpisode.setMaxWidth(77);
- columnFavorite.setStyle("-fx-alignment: CENTER;");
-
- filmsTreeTable.setRoot(filmRoot);
- filmsTreeTable.setColumnResizePolicy(TreeTableView.CONSTRAINED_RESIZE_POLICY);
- filmsTreeTable.setShowRoot(false);
-
- // write content into cell
- columnStreamUrl.setCellValueFactory(cellData -> cellData.getValue().getValue().streamUrlProperty());
- columnTitle.setCellValueFactory(cellData -> cellData.getValue().getValue().titleProperty());
- columnSeason.setCellValueFactory(cellData -> cellData.getValue().getValue().seasonProperty());
- columnEpisode.setCellValueFactory(cellData -> cellData.getValue().getValue().episodeProperty());
- columnFavorite.setCellValueFactory(cellData -> cellData.getValue().getValue().imageProperty());
-
- // add columns to treeTableViewfilm
- filmsTreeTable.getColumns().add(columnStreamUrl);
- filmsTreeTable.getColumns().add(columnTitle);
- filmsTreeTable.getColumns().add(columnFavorite);
- filmsTreeTable.getColumns().add(columnSeason);
- filmsTreeTable.getColumns().add(columnEpisode);
- filmsTreeTable.getColumns().get(0).setVisible(false); // hide columnStreamUrl (important)
-
- // context menu for treeTableViewfilm
- filmsTreeTable.setContextMenu(menu);
-
- // sourcesTreeTable
- sourceColumn.setCellValueFactory(cellData -> cellData.getValue().pathProperty());
- modeColumn.setCellValueFactory(cellData -> cellData.getValue().modeProperty());
- sourcesTable.setItems(sourcesList);
+ // load data list in gui
+ posterModeStartup();
+
+ checkAutoUpdate(); // TODO async
}
// Initializing the actions
private void initActions() {
+ // general actions
HamburgerBackArrowBasicTransition burgerTask = new HamburgerBackArrowBasicTransition(menuHam);
menuHam.addEventHandler(MouseEvent.MOUSE_PRESSED, (e) -> {
- if (menuTrue == false) {
- sideMenuSlideIn();
- burgerTask.setRate(1.0);
- burgerTask.play();
- menuTrue = true;
- } else {
+
+ if (menuTrue) {
sideMenuSlideOut();
burgerTask.setRate(-1.0);
burgerTask.play();
menuTrue = false;
- }
- if (settingsTrue == true) {
- settingsScrollPane.setVisible(false);
- saveSettings();
- settingsTrue = false;
- }
- });
-
- searchTextField.textProperty().addListener(new ChangeListener() {
- @Override
- public void changed(ObservableValue extends String> observable, String oldValue, String newValue) {
- ObservableList helpData;
- filterData.clear();
- filmRoot.getChildren().removeAll(filmRoot.getChildren());
-
- helpData = filmsList;
-
-
- for (int i = 0; i < helpData.size(); i++) {
- if (helpData.get(i).getTitle().toLowerCase().contains(searchTextField.getText().toLowerCase())) {
- filterData.add(helpData.get(i)); // add data from newDaten to filteredData where title contains search input
- }
- }
-
- for (int i = 0; i < filterData.size(); i++) {
- filmRoot.getChildren().add(new TreeItem(filterData.get(i))); // add filtered data to root node after search
- }
- if (searchTextField.getText().hashCode() == hashA) {
- setColor("000000");
- applyColor();
- }
- }
- });
-
- languageChoisBox.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener() {
- @Override
- public void changed(ObservableValue extends Number> ov, Number value, Number new_value) {
- String local = languageChoisBox.getItems().get((int) new_value).toString();
- local = local.substring(local.length() - 6, local.length() - 1); // reading only en_US from English (en_US)
- setLocal(local);
- setLocalUI();
- saveSettings();
- }
- });
-
- branchChoisBox.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener() {
- @Override
- public void changed(ObservableValue extends Number> ov, Number value, Number new_value) {
- if (branchChoisBox.getItems().get((int) new_value).toString() == "beta") {
- setUseBeta(true);
- } else {
- setUseBeta(false);
- }
- saveSettings();
- }
- });
-
- fontsizeSlider.valueProperty().addListener(new ChangeListener() {
- @Override
- public void changed(ObservableValue extends Number> ov, Number old_val, Number new_val) {
- setFontSize(fontsizeSlider.getValue());
- if (!getCurrentTitle().isEmpty()) {
- dbController.readCache(getCurrentStreamUrl());
- }
- // ta1.setFont(Font.font("System", size));
- saveSettings();
- }
- });
-
- like.setOnAction(new EventHandler() {
- @Override
- public void handle(ActionEvent event) {
- dbController.like(getCurrentStreamUrl());
- dbController.refresh(getCurrentStreamUrl(), indexList);
- refreshTable();
- }
- });
-
- dislike.setOnAction(new EventHandler() {
- @Override
- public void handle(ActionEvent event) {
- dbController.dislike(getCurrentStreamUrl());
- dbController.refresh(getCurrentStreamUrl(), indexList);
- refreshTable();
- }
- });
-
- /**
- * FIXME fix bug when sort by ASCENDING, wrong order
- */
- columnFavorite.sortTypeProperty().addListener(new ChangeListener() {
- @Override
- public void changed(ObservableValue extends SortType> paramObservableValue, SortType paramT1, SortType paramT2) {
- filmRoot.getChildren().clear();
- filterData.clear();
-
- if (paramT2.equals(SortType.DESCENDING)) {
- for (FilmTabelDataType film : filmsList) {
- if (film.getFavorite()) {
- filterData.add(0, film);
- } else {
- filterData.add(film);
- }
- }
- } else {
-// System.out.println("ascending");
- for (FilmTabelDataType film : filmsList) {
- if (!film.getFavorite()) {
- filterData.add(0, film);
- } else {
- filterData.add(film);
- }
- }
- }
-
- addDataUI(filterData);
- }
- });
-
- // Change-listener for treeTableViewfilm
- filmsTreeTable.getSelectionModel().selectedItemProperty().addListener(new ChangeListener