release 0.8.0 #12
| @ -37,6 +37,7 @@ import java.util.Locale; | ||||
| import java.util.ResourceBundle; | ||||
| import java.util.concurrent.ExecutorService; | ||||
| import java.util.concurrent.Executors; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import org.apache.logging.log4j.LogManager; | ||||
| import org.apache.logging.log4j.Logger; | ||||
| @ -55,12 +56,8 @@ import com.jfoenix.transitions.hamburger.HamburgerBackArrowBasicTransition; | ||||
|  | ||||
| import javafx.animation.TranslateTransition; | ||||
| import javafx.application.Platform; | ||||
| 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.Node; | ||||
| import javafx.scene.control.ChoiceBox; | ||||
| @ -168,21 +165,21 @@ public class MainWindowController { | ||||
| 	private XMLController xmlController; | ||||
| 	private Stage primaryStage; | ||||
| 	private static final Logger LOGGER = LogManager.getLogger(MainWindowController.class.getName()); | ||||
| 	 | ||||
|  | ||||
| 	private boolean menuTrue = false; | ||||
|  | ||||
| 	private final String version = "0.7.0"; | ||||
| 	private final String buildNumber = "169"; | ||||
| 	private final String versionName = "toothless dragon"; | ||||
| 	private String btnStyle; | ||||
| 	 | ||||
|  | ||||
| 	private final int hashA = -647380320; | ||||
| 	private int last; | ||||
| 	private int indexTable; | ||||
| 	private int indexList; | ||||
| 	private int next; | ||||
| 	private FilmTabelDataType currentTableFilm = new FilmTabelDataType("", "", "", "", false, null, null); | ||||
| 	 | ||||
|  | ||||
| 	private ObservableList<String> languages = FXCollections.observableArrayList("English (en_US)", "Deutsch (de_DE)"); | ||||
| 	private ObservableList<String> branches = FXCollections.observableArrayList("stable", "beta"); | ||||
| 	private ObservableList<FilmTabelDataType> filterData = FXCollections.observableArrayList(); | ||||
| @ -196,19 +193,19 @@ public class MainWindowController { | ||||
| 	public MainWindowController() { | ||||
| 		// the constructor | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	@FXML | ||||
| 	public void initialize() { | ||||
| 		xmlController = new XMLController(); | ||||
| 		dbController = DBController.getInstance(); | ||||
| 	} | ||||
| 	 | ||||
|     public void init() { | ||||
|  | ||||
| 	public void init() { | ||||
| 		LOGGER.info("Initializing Project-HomeFlix build " + buildNumber); | ||||
| 		 | ||||
|  | ||||
| 		xmlController.loadSettings(); // load settings | ||||
| 		checkAutoUpdate(); | ||||
| 		 | ||||
|  | ||||
| 		// initialize the GUI and the DBController | ||||
| 		primaryStage = (Stage) mainAnchorPane.getScene().getWindow(); // set primary stage for dialogs | ||||
| 		initTabel(); | ||||
| @ -216,13 +213,13 @@ public class MainWindowController { | ||||
| 		initActions(); | ||||
| 		dbController.init(); | ||||
| 		refreshAllFilms(); | ||||
| 		 | ||||
|  | ||||
| 		// load sources list in gui | ||||
| 		addSourceToTable(); | ||||
| 		 | ||||
|  | ||||
| //		posterModeStartup(); // TODO testing DO NOT USE THIS!!	 | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	// Initialize general UI elements | ||||
| 	private void initUI() { | ||||
| 		versionLbl.setText("Version: " + version + " (Build: " + buildNumber + ")"); | ||||
| @ -234,20 +231,20 @@ public class MainWindowController { | ||||
| 		autoplayToggleBtn.setSelected(XMLController.isAutoplay()); | ||||
| 		languageChoisBox.setItems(languages); | ||||
| 		branchChoisBox.setItems(branches); | ||||
| 		 | ||||
|  | ||||
| 		if (XMLController.isUseBeta()) { | ||||
| 			branchChoisBox.getSelectionModel().select(1); | ||||
| 		} else { | ||||
| 			branchChoisBox.getSelectionModel().select(0); | ||||
| 		} | ||||
| 		 | ||||
|  | ||||
| 		setLocalUI(); | ||||
| 		applyColor(); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	 * Initialize the tables (treeTableViewfilm and sourcesTable) | ||||
| 	 * only needed for Tabel-Mode | ||||
| 	 * Initialize the tables (treeTableViewfilm and sourcesTable) only needed for | ||||
| 	 * Tabel-Mode | ||||
| 	 */ | ||||
| 	private void initTabel() { | ||||
|  | ||||
| @ -283,7 +280,6 @@ public class MainWindowController { | ||||
| 				burgerTask.setRate(-1.0); | ||||
| 				burgerTask.play(); | ||||
| 				menuTrue = false; | ||||
|  | ||||
| 			} else { | ||||
| 				sideMenuSlideIn(); | ||||
| 				burgerTask.setRate(1.0); | ||||
| @ -294,173 +290,134 @@ public class MainWindowController { | ||||
| 				settingsScrollPane.setVisible(false); | ||||
| 			} | ||||
| 		}); | ||||
|          | ||||
| 		languageChoisBox.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() { | ||||
| 			@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) | ||||
| 				XMLController.setUsrLocal(local); | ||||
| 				setLocalUI(); | ||||
| 				xmlController.saveSettings(); | ||||
| 			} | ||||
|  | ||||
| 		languageChoisBox.getSelectionModel().selectedIndexProperty().addListener((e, oldValue, newValue) -> { | ||||
| 			String local = languageChoisBox.getItems().get((int) newValue).toString(); | ||||
| 			local = local.substring(local.length() - 6, local.length() - 1); // reading only en_US from English (en_US) | ||||
| 			XMLController.setUsrLocal(local); | ||||
| 			setLocalUI(); | ||||
| 			xmlController.saveSettings(); | ||||
| 		}); | ||||
|  | ||||
| 		branchChoisBox.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() { | ||||
| 			@Override | ||||
| 			public void changed(ObservableValue<? extends Number> ov, Number value, Number new_value) { | ||||
| 				if (branchChoisBox.getItems().get((int) new_value).toString() == "beta") { | ||||
| 					XMLController.setUseBeta(true); | ||||
| 				} else { | ||||
| 					XMLController.setUseBeta(false); | ||||
| 				} | ||||
| 				xmlController.saveSettings(); | ||||
| 		branchChoisBox.getSelectionModel().selectedIndexProperty().addListener((e, oldValue, newValue) -> { | ||||
| 			if (branchChoisBox.getItems().get((int) newValue).toString() == "beta") { | ||||
| 				XMLController.setUseBeta(true); | ||||
| 			} else { | ||||
| 				XMLController.setUseBeta(false); | ||||
| 			} | ||||
| 			xmlController.saveSettings(); | ||||
| 		}); | ||||
|          | ||||
| 		fontsizeSlider.valueProperty().addListener(new ChangeListener<Number>() { | ||||
| 			@Override | ||||
| 			public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) { | ||||
| 				XMLController.setFontSize(fontsizeSlider.getValue()); | ||||
| 				if (!getCurrentTitle().isEmpty()) { | ||||
| 					setSelectedFilmInfo(dbController.readCache(getCurrentStreamUrl())); | ||||
| 				} | ||||
| 				xmlController.saveSettings(); | ||||
|  | ||||
| 		fontsizeSlider.valueProperty().addListener(e -> { | ||||
| 			XMLController.setFontSize(fontsizeSlider.getValue()); | ||||
| 			if (!getCurrentTitle().isEmpty()) { | ||||
| 				setSelectedFilmInfo(dbController.readCache(getCurrentStreamUrl())); | ||||
| 			} | ||||
| 			xmlController.saveSettings(); | ||||
| 		}); | ||||
|          | ||||
|  | ||||
| 		// Table-Mode actions | ||||
| 		searchTextField.textProperty().addListener(new ChangeListener<String>() { | ||||
| 			@Override | ||||
| 			public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { | ||||
| 				ObservableList<FilmTabelDataType> helpData; | ||||
| 				filterData.clear(); | ||||
| 				filmRoot.getChildren().clear(); | ||||
| 		searchTextField.textProperty().addListener((e, oldValue, newValue) -> { | ||||
| 			filmRoot.getChildren().clear(); | ||||
| 			filterData.clear(); | ||||
| 			filterData = filmsList.stream() | ||||
| 					.filter(x -> x.getTitle().toLowerCase().contains(searchTextField.getText().toLowerCase())) | ||||
| 					.collect(Collectors.toCollection(FXCollections::observableArrayList)); | ||||
|  | ||||
| 				helpData = filmsList; | ||||
| 			addFilmsToTable(filterData); | ||||
|  | ||||
| 				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 | ||||
| 					} | ||||
| 				} | ||||
| 			if (searchTextField.getText().hashCode() == hashA) { | ||||
| 				XMLController.setColor("000000"); | ||||
| 				colorPicker.setValue(new Color(0, 0, 0, 1)); | ||||
| 				applyColor(); | ||||
| 			} | ||||
| 		}); | ||||
|  | ||||
| 				for (int i = 0; i < filterData.size(); i++) { | ||||
| 					filmRoot.getChildren().add(new TreeItem<FilmTabelDataType>(filterData.get(i))); // add filtered data to root node after search | ||||
| 				} | ||||
| 				if (searchTextField.getText().hashCode() == hashA) { | ||||
| 					XMLController.setColor("000000"); | ||||
| 					colorPicker.setValue(new Color(0, 0, 0, 1)); | ||||
| 					applyColor(); | ||||
| 				} | ||||
| 			} | ||||
| 		like.setOnAction(e -> { | ||||
| 			dbController.like(getCurrentStreamUrl()); | ||||
| 			filmsList.set(indexList, dbController.getDatabaseFilm(getCurrentStreamUrl())); | ||||
| 			refreshTableElement(); | ||||
| 		}); | ||||
| 		 | ||||
| 		like.setOnAction(new EventHandler<ActionEvent>() { | ||||
| 			@Override | ||||
| 			public void handle(ActionEvent event) { | ||||
| 				dbController.like(getCurrentStreamUrl()); | ||||
| 				filmsList.set(indexList, dbController.getDatabaseFilm(getCurrentStreamUrl())); | ||||
| 				refreshTableElement(); | ||||
| 			} | ||||
|  | ||||
| 		dislike.setOnAction(e -> { | ||||
| 			dbController.dislike(getCurrentStreamUrl()); | ||||
| 			filmsList.set(indexList, dbController.getDatabaseFilm(getCurrentStreamUrl())); | ||||
| 			refreshTableElement(); | ||||
| 		}); | ||||
|          | ||||
| 		dislike.setOnAction(new EventHandler<ActionEvent>() { | ||||
| 			@Override | ||||
| 			public void handle(ActionEvent event) { | ||||
| 				dbController.dislike(getCurrentStreamUrl()); | ||||
| 				filmsList.set(indexList, dbController.getDatabaseFilm(getCurrentStreamUrl())); | ||||
| 				refreshTableElement(); | ||||
| 			} | ||||
| 		}); | ||||
|          | ||||
| 		/** | ||||
| 		 * FIXME fix bug when sort by ASCENDING, wrong order | ||||
| 		 */ | ||||
| 		columnFavorite.sortTypeProperty().addListener(new ChangeListener<SortType>() { | ||||
| 			@Override | ||||
| 			public void changed(ObservableValue<? extends SortType> paramObservableValue, SortType paramT1, SortType paramT2) { | ||||
| 				filmRoot.getChildren().clear(); | ||||
| 				filterData.clear(); | ||||
| 				 | ||||
| 				if (paramT2.equals(SortType.DESCENDING)) { | ||||
| 					// add favorites at the top | ||||
| 					for (FilmTabelDataType film : filmsList) { | ||||
| 						if (film.getFavorite()) { | ||||
| 							filterData.add(0, film); | ||||
| 						} else { | ||||
| 							filterData.add(film); | ||||
| 						} | ||||
| 					} | ||||
| 				} else { | ||||
| 					// add favorites at the bottom | ||||
| 					for (FilmTabelDataType film : filmsList) { | ||||
| 						if (!film.getFavorite()) { | ||||
| 							filterData.add(0, film); | ||||
| 						} else { | ||||
| 							filterData.add(film); | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 				 | ||||
| 				addFilmsToTable(filterData); | ||||
| 			} | ||||
| 		}); | ||||
|          | ||||
| 		// Change-listener for treeTableViewfilm | ||||
| 		filmsTreeTable.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Object>() { | ||||
| 			@Override | ||||
| 			public void changed(ObservableValue<?> observable, Object oldVal, Object newVal) { | ||||
| 				if (filmsTreeTable.getSelectionModel().getSelectedItem() == null) { | ||||
| 					return; | ||||
| 				} | ||||
| 				 | ||||
| 				currentTableFilm = filmsTreeTable.getSelectionModel().getSelectedItem().getValue(); // set the current film object | ||||
| 				indexTable = filmsTreeTable.getSelectionModel().getSelectedIndex(); // get selected items table index | ||||
|  | ||||
| 		// FIXME fix bug when sort by ASCENDING, wrong order | ||||
| 		columnFavorite.sortTypeProperty().addListener((e, paramT1, paramT2) -> { | ||||
| 			filmRoot.getChildren().clear(); | ||||
| 			filterData.clear(); | ||||
|  | ||||
| 			if (paramT2.equals(SortType.DESCENDING)) { | ||||
| 				// add favorites at the top | ||||
| 				for (FilmTabelDataType film : filmsList) { | ||||
| 					if (film.equals(currentTableFilm)) { | ||||
| 						indexList = filmsList.indexOf(film); // get selected items list index | ||||
| 					if (film.getFavorite()) { | ||||
| 						filterData.add(0, film); | ||||
| 					} else { | ||||
| 						filterData.add(film); | ||||
| 					} | ||||
| 				} | ||||
| 				 | ||||
| 				last = indexTable - 1; | ||||
| 				next = indexTable + 1; | ||||
|  | ||||
| 				 | ||||
| 				if ((currentTableFilm.getCached().isAfter(lastValidCache) )|| dbController.searchCacheByURL(getCurrentStreamUrl())) { | ||||
| 					LOGGER.info("loading from cache: " + getCurrentTitle()); | ||||
| 					setSelectedFilmInfo(dbController.readCache(getCurrentStreamUrl())); | ||||
| //					System.out.println("cache date is: " + currentTableFilm.getCached().toString()); | ||||
| 				} else { | ||||
| //					System.out.println("either not cached or to old!"); | ||||
| //					System.out.println("cache date is: " + currentTableFilm.getCached().toString()); | ||||
| 					// this is not perfect! | ||||
| 					new Thread(new Runnable() { | ||||
| 						public void run() { | ||||
| 							Thread omdbAPIThread = new Thread(new OMDbAPIController(dbController, currentTableFilm, XMLController.getOmdbAPIKey())); | ||||
| 							omdbAPIThread.setName("OMDbAPI"); | ||||
| 							omdbAPIThread.start(); | ||||
| 							 | ||||
| 							synchronized (omdbAPIThread) { | ||||
| 								try { | ||||
| 									omdbAPIThread.wait(); | ||||
| 								} catch (InterruptedException e) { | ||||
| 									LOGGER.error(e); | ||||
| 								} | ||||
| 								// update the GUI for the selected film | ||||
| 								Platform.runLater(() -> { | ||||
| 									setSelectedFilmInfo(dbController.readCache(getCurrentStreamUrl())); | ||||
| 								}); | ||||
| 							} | ||||
| 						} | ||||
| 					}).start(); | ||||
| 			} else { | ||||
| 				// add favorites at the bottom | ||||
| 				for (FilmTabelDataType film : filmsList) { | ||||
| 					if (!film.getFavorite()) { | ||||
| 						filterData.add(0, film); | ||||
| 					} else { | ||||
| 						filterData.add(film); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			addFilmsToTable(filterData); | ||||
| 		}); | ||||
| 		 | ||||
|  | ||||
| 		// Change-listener for treeTableViewfilm | ||||
| 		filmsTreeTable.getSelectionModel().selectedItemProperty().addListener((e, paramT1, paramT2) -> { | ||||
| 			if (filmsTreeTable.getSelectionModel().getSelectedItem() == null) { | ||||
| 				return; | ||||
| 			} | ||||
| 			 | ||||
| 			currentTableFilm = filmsTreeTable.getSelectionModel().getSelectedItem().getValue(); // set the current film object | ||||
| 			indexTable = filmsTreeTable.getSelectionModel().getSelectedIndex(); // get selected items table index | ||||
| 			for (FilmTabelDataType film : filmsList) { | ||||
| 				if (film.equals(currentTableFilm)) { | ||||
| 					indexList = filmsList.indexOf(film); // get selected items list index | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			last = indexTable - 1; | ||||
| 			next = indexTable + 1; | ||||
|  | ||||
| 			if ((currentTableFilm.getCached().isAfter(lastValidCache)) && dbController.searchCacheByURL(getCurrentStreamUrl())) { | ||||
| 				LOGGER.info("loading from cache: " + getCurrentTitle()); | ||||
| 				setSelectedFilmInfo(dbController.readCache(getCurrentStreamUrl())); | ||||
| 			} else { | ||||
| 				// this is not perfect! | ||||
| 				new Thread(() -> { | ||||
| 					Thread omdbAPIThread = new Thread(new OMDbAPIController(dbController, currentTableFilm, XMLController.getOmdbAPIKey())); | ||||
| 					omdbAPIThread.setName("OMDbAPI"); | ||||
| 					omdbAPIThread.start(); | ||||
|  | ||||
| 					synchronized (omdbAPIThread) { | ||||
| 						try { | ||||
| 							omdbAPIThread.wait(); | ||||
| 						} catch (InterruptedException e1) { | ||||
| 							LOGGER.error(e1); | ||||
| 						} | ||||
| 						// update the GUI for the selected film | ||||
| 						Platform.runLater(() -> { | ||||
| 							setSelectedFilmInfo(dbController.readCache(getCurrentStreamUrl())); | ||||
| 						}); | ||||
| 					} | ||||
| 				}).start(); | ||||
| 			} | ||||
| 		}); | ||||
|  | ||||
| 		// Poster-Mode actions | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	// Table-Mode fxml actions | ||||
| 	@FXML | ||||
| 	private void playbtnclicked() { | ||||
| @ -469,7 +426,7 @@ public class MainWindowController { | ||||
| 				LOGGER.info("rootNode found, getting last watched episode"); | ||||
| 				currentTableFilm = dbController.getLastWatchedEpisode(currentTableFilm.getTitle()); | ||||
| 			} | ||||
| 			 | ||||
|  | ||||
| 			if (isSupportedFormat(currentTableFilm)) { | ||||
| 				new Player(getCurrentTableFilm()); | ||||
| 			} else { | ||||
| @ -491,8 +448,7 @@ public class MainWindowController { | ||||
| 					} | ||||
| 					if (output.contains("which: no vlc") || output == "") { | ||||
| 						JFXInfoAlert vlcInfoAlert = new JFXInfoAlert("Info", | ||||
| 								XMLController.getLocalBundle().getString("vlcNotInstalled"), | ||||
| 								btnStyle, primaryStage); | ||||
| 								XMLController.getLocalBundle().getString("vlcNotInstalled"), btnStyle, primaryStage); | ||||
| 						vlcInfoAlert.showAndWait(); | ||||
| 					} else { | ||||
| 						try { | ||||
| @ -514,11 +470,11 @@ public class MainWindowController { | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	@FXML | ||||
| 	private void openfolderbtnclicked() { | ||||
| 		File dest = new File(getCurrentStreamUrl()).getParentFile(); | ||||
| 		 | ||||
|  | ||||
| 		if (!System.getProperty("os.name").contains("Linux")) { | ||||
| 			try { | ||||
| 				Desktop.getDesktop().open(dest); | ||||
| @ -527,26 +483,26 @@ public class MainWindowController { | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	@FXML | ||||
| 	private void returnBtnclicked(){ | ||||
| 	private void returnBtnclicked() { | ||||
| 		filmsTreeTable.getSelectionModel().select(last); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	@FXML | ||||
| 	private void forwardBtnclicked(){ | ||||
| 	private void forwardBtnclicked() { | ||||
| 		filmsTreeTable.getSelectionModel().select(next); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	// general fxml actions | ||||
| 	@FXML | ||||
| 	private void aboutBtnAction() { | ||||
| 		String bodyText = "Project HomeFlix \nVersion: " + version + " (Build: " + buildNumber + ")  \"" | ||||
| 				+ versionName + "\" \n" + XMLController.getLocalBundle().getString("infoText"); | ||||
| 		String bodyText = "Project HomeFlix \nVersion: " + version + " (Build: " + buildNumber + ")  \"" + versionName | ||||
| 				+ "\" \n" + XMLController.getLocalBundle().getString("infoText"); | ||||
| 		JFXInfoAlert infoAlert = new JFXInfoAlert("Project HomeFlix", bodyText, btnStyle, primaryStage); | ||||
| 		infoAlert.showAndWait(); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	@FXML | ||||
| 	private void settingsBtnclicked() { | ||||
| 		if (settingsScrollPane.isVisible()) { | ||||
| @ -555,9 +511,9 @@ public class MainWindowController { | ||||
| 			settingsScrollPane.setVisible(true); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	@FXML | ||||
| 	private void addDirectoryBtnAction(){ | ||||
| 	private void addDirectoryBtnAction() { | ||||
| 		DirectoryChooser directoryChooser = new DirectoryChooser(); | ||||
| 		directoryChooser.setTitle(XMLController.getLocalBundle().getString("addDirectory")); | ||||
| 		File selectedFolder = directoryChooser.showDialog(primaryStage); | ||||
| @ -567,9 +523,9 @@ public class MainWindowController { | ||||
| 			LOGGER.error("The selected folder dosen't exist!"); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	@FXML | ||||
| 	private void addStreamSourceBtnAction(){ | ||||
| 	private void addStreamSourceBtnAction() { | ||||
| 		FileChooser fileChooser = new FileChooser(); | ||||
| 		fileChooser.setTitle(XMLController.getLocalBundle().getString("addStreamSource")); | ||||
| 		File selectedFile = fileChooser.showOpenDialog(primaryStage); | ||||
| @ -579,42 +535,42 @@ public class MainWindowController { | ||||
| 			LOGGER.error("The selected file dosen't exist!"); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	@FXML | ||||
| 	private void colorPickerAction() { | ||||
| 		XMLController.setColor(colorPicker.getValue().toString().substring(2, 10)); | ||||
| 		xmlController.saveSettings(); | ||||
| 		applyColor(); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	@FXML | ||||
| 	private void updateBtnAction() { | ||||
| 		updateController = new UpdateController(this, buildNumber, XMLController.isUseBeta()); | ||||
| 		Thread updateThread = new Thread(updateController); | ||||
| 		updateThread.setName("Updater"); | ||||
| 		updateThread.start();	 | ||||
| 		updateThread.start(); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	@FXML | ||||
| 	private void autoUpdateToggleBtnAction() { | ||||
| 		XMLController.setAutoUpdate(!XMLController.isAutoUpdate()); | ||||
| 		xmlController.saveSettings(); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	@FXML | ||||
| 	private void autoplayToggleBtnAction(){ | ||||
| 	private void autoplayToggleBtnAction() { | ||||
| 		XMLController.setAutoplay(!XMLController.isAutoplay()); | ||||
| 		xmlController.saveSettings(); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	// refresh the selected child of the root node | ||||
| 	private void refreshTableElement() { | ||||
| 		filmRoot.getChildren().get(indexTable).setValue(filmsList.get(indexList)); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	 * refresh all films in filmsList and in filmsTable | ||||
| 	 * clear the FilmsList and FilmRoot children, then update the database | ||||
| 	 * refresh all films in filmsList and in filmsTable clear the FilmsList and | ||||
| 	 * FilmRoot children, then update the database | ||||
| 	 */ | ||||
| 	private void refreshAllFilms() { | ||||
| 		filmsList.clear(); | ||||
| @ -623,54 +579,74 @@ public class MainWindowController { | ||||
| 		filmsList = dbController.getDatabaseFilmsList(); // returns a list of all films stored in the database | ||||
| 		addFilmsToTable(filmsList); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	 * add data from films-list to films-table | ||||
| 	 * TODO rework! add data from a ObservableList to the films-table | ||||
| 	 *  | ||||
| 	 * @param elementsList a list of elements you want to add | ||||
| 	 */ | ||||
| 	public void addFilmsToTable(ObservableList<FilmTabelDataType> elementsList) { | ||||
|  | ||||
| 		for (FilmTabelDataType element : elementsList) { | ||||
| 			 | ||||
|  | ||||
| 			// only if the entry contains a season and a episode it's a valid series | ||||
| 			if (!element.getSeason().isEmpty() && !element.getEpisode().isEmpty()) { | ||||
|  | ||||
| 				// check if there is a series node to add the item		 | ||||
| 				for (int i = 0; i < filmRoot.getChildren().size(); i++) { | ||||
| 					if (filmRoot.getChildren().get(i).getValue().getTitle().equals(element.getTitle())) { | ||||
| 						// if a root node exists, add element as child | ||||
| 						TreeItem<FilmTabelDataType> episodeNode = new TreeItem<>(new FilmTabelDataType( | ||||
| 								element.getStreamUrl(), element.getTitle(), element.getSeason(), element.getEpisode(), | ||||
| 								element.getFavorite(), element.getCached(), element.getImage())); | ||||
| 						filmRoot.getChildren().get(i).getChildren().add(episodeNode); | ||||
| 					} else if (filmRoot.getChildren().get(i).nextSibling() == null) { | ||||
| 						// if no root node exists, create one and add element as child | ||||
| 						TreeItem<FilmTabelDataType> seriesRootNode = new TreeItem<>(new FilmTabelDataType( | ||||
| 								element.getTitle() + "_rootNode", element.getTitle(), "", "", element.getFavorite(), | ||||
| 								element.getCached() , element.getImage())); | ||||
| 						filmRoot.getChildren().add(seriesRootNode); | ||||
| 				// if there is any node check if it's the root node to the episode | ||||
| 				// else there is no node at all so we must create a new | ||||
| 				if (filmRoot.getChildren().size() > 0) { | ||||
| 					for (int i = 0; i < filmRoot.getChildren().size(); i++) { | ||||
| 						// if a root node exists, add element | ||||
| 						// else create a new root node and add the element (if rootNode is the last | ||||
| 						// node) (works since we edit the element!) | ||||
| 						if (filmRoot.getChildren().get(i).getValue().getTitle().equals(element.getTitle())) { | ||||
| 							TreeItem<FilmTabelDataType> episodeNode = new TreeItem<>( | ||||
| 									new FilmTabelDataType(element.getStreamUrl(), element.getTitle(), | ||||
| 											element.getSeason(), element.getEpisode(), element.getFavorite(), | ||||
| 											element.getCached(), element.getImage())); | ||||
| 							filmRoot.getChildren().get(i).getChildren().add(episodeNode); | ||||
| 						} else if (filmRoot.getChildren().get(i).nextSibling() == null) { | ||||
| 							TreeItem<FilmTabelDataType> seriesRootNode = new TreeItem<>( | ||||
| 									new FilmTabelDataType(element.getTitle() + "_rootNode", element.getTitle(), "", "", | ||||
| 											element.getFavorite(), element.getCached(), element.getImage())); | ||||
| 							filmRoot.getChildren().add(seriesRootNode); | ||||
| 						} | ||||
| 					} | ||||
| 				} else { | ||||
| 					// add new root node | ||||
| 					TreeItem<FilmTabelDataType> seriesRootNode = new TreeItem<>( | ||||
| 							new FilmTabelDataType(element.getTitle() + "_rootNode", element.getTitle(), "", "", | ||||
| 									element.getFavorite(), element.getCached(), element.getImage())); | ||||
| 					filmRoot.getChildren().add(seriesRootNode); | ||||
|  | ||||
| 					// add new element | ||||
| 					TreeItem<FilmTabelDataType> episodeNode = new TreeItem<>(new FilmTabelDataType( | ||||
| 							element.getStreamUrl(), element.getTitle(), element.getSeason(), element.getEpisode(), | ||||
| 							element.getFavorite(), element.getCached(), element.getImage())); | ||||
| 					filmRoot.getChildren().get(0).getChildren().add(episodeNode); | ||||
| 				} | ||||
|  | ||||
| 			} else { | ||||
| 				// if season and episode are empty, we can assume the object is a film | ||||
| 				filmRoot.getChildren().add(new TreeItem<FilmTabelDataType>(element)); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	// add a all elements of sourcesList to the sources table on the settings pane | ||||
| 	public void addSourceToTable() { | ||||
| 		for (SourceDataType source: sourcesList) { | ||||
| 			sourceRoot.getChildren().add(new TreeItem<SourceDataType>(source));	// add data to root-node | ||||
| 		for (SourceDataType source : sourcesList) { | ||||
| 			sourceRoot.getChildren().add(new TreeItem<SourceDataType>(source)); // add data to root-node | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	 * add a source to the newsources list | ||||
| 	 *  | ||||
| 	 * @param path to the source | ||||
| 	 * @param mode of the source (local or streaming) | ||||
| 	 */ | ||||
| 	public void addSource(String path, String mode) { | ||||
| 		JsonObject source = null; | ||||
| 		JsonArray newsources = null; | ||||
|  | ||||
| 		try { | ||||
| @ -683,7 +659,7 @@ public class MainWindowController { | ||||
| 			} | ||||
|  | ||||
| 			// add new source | ||||
| 			source = Json.object().add("path", path).add("mode", mode); | ||||
| 			JsonObject source = Json.object().add("path", path).add("mode", mode); | ||||
| 			newsources.add(source); | ||||
| 			Writer writer = new FileWriter(XMLController.getDirHomeFlix() + "/sources.json"); | ||||
| 			newsources.writeTo(writer); | ||||
| @ -691,20 +667,18 @@ public class MainWindowController { | ||||
| 		} catch (IOException e) { | ||||
| 			LOGGER.error(e); | ||||
| 		} | ||||
| 		 | ||||
|  | ||||
| 		// clear old sources list/table | ||||
| 		getSourcesList().clear(); | ||||
| 		sourceRoot.getChildren().clear(); | ||||
| 		 | ||||
| 		// clear the FilmsList and FilmRoot children, then update the database | ||||
| 		refreshAllFilms(); | ||||
| 		 | ||||
|  | ||||
| 		refreshAllFilms(); // refresh the FilmsList | ||||
| 		checkAllPosters(); // check if there is anything to cache | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	 * set the color of the GUI-Elements | ||||
| 	 * if usedColor is less than checkColor set text fill white, else black | ||||
| 	 * set the color of the GUI-Elements if usedColor is less than checkColor set | ||||
| 	 * text fill white, else black | ||||
| 	 */ | ||||
| 	private void applyColor() { | ||||
| 		String menuBtnStyle; | ||||
| @ -712,32 +686,34 @@ public class MainWindowController { | ||||
| 		BigInteger checkColor = new BigInteger("78909cff", 16); | ||||
|  | ||||
| 		if (usedColor.compareTo(checkColor) == -1) { | ||||
| 			btnStyle = "-fx-button-type: RAISED; -fx-background-color: #" + XMLController.getColor() + "; -fx-text-fill: WHITE;"; | ||||
| 			btnStyle = "-fx-button-type: RAISED; -fx-background-color: #" + XMLController.getColor() | ||||
| 					+ "; -fx-text-fill: WHITE;"; | ||||
| 			menuBtnStyle = "-fx-text-fill: WHITE;"; | ||||
| 			 | ||||
|  | ||||
| 			playbtn.setGraphic(new ImageView(new Image("icons/ic_play_arrow_white_18dp_1x.png"))); | ||||
| 			returnBtn.setGraphic(new ImageView(new Image("icons/ic_skip_previous_white_18dp_1x.png"))); | ||||
| 			forwardBtn.setGraphic(new ImageView(new Image("icons/ic_skip_next_white_18dp_1x.png"))); | ||||
| 			 | ||||
|  | ||||
| 			menuHam.getStyleClass().clear(); | ||||
| 			menuHam.getStyleClass().add("jfx-hamburgerW"); | ||||
| 		} else { | ||||
| 			btnStyle = "-fx-button-type: RAISED; -fx-background-color: #" + XMLController.getColor() + "; -fx-text-fill: BLACK;"; | ||||
| 			btnStyle = "-fx-button-type: RAISED; -fx-background-color: #" + XMLController.getColor() | ||||
| 					+ "; -fx-text-fill: BLACK;"; | ||||
| 			menuBtnStyle = "-fx-text-fill: BLACK;"; | ||||
| 			 | ||||
|  | ||||
| 			playbtn.setGraphic(new ImageView(new Image("icons/ic_play_arrow_black_18dp_1x.png"))); | ||||
| 			returnBtn.setGraphic(new ImageView(new Image("icons/ic_skip_previous_black_18dp_1x.png"))); | ||||
| 			forwardBtn.setGraphic(new ImageView(new Image("icons/ic_skip_next_black_18dp_1x.png"))); | ||||
| 			 | ||||
|  | ||||
| 			menuHam.getStyleClass().clear(); | ||||
| 			menuHam.getStyleClass().add("jfx-hamburgerB"); | ||||
| 		} | ||||
| 		 | ||||
|  | ||||
| 		// boxes and TextFields | ||||
| 		sideMenuVBox.setStyle("-fx-background-color: #" + XMLController.getColor() + ";"); | ||||
| 		topHBox.setStyle("-fx-background-color: #" + XMLController.getColor() + ";"); | ||||
| 		searchTextField.setFocusColor(Color.valueOf(XMLController.getColor())); | ||||
| 		 | ||||
|  | ||||
| 		// normal buttons | ||||
| 		addDirectoryBtn.setStyle(btnStyle); | ||||
| 		addStreamSourceBtn.setStyle(btnStyle); | ||||
| @ -746,12 +722,12 @@ public class MainWindowController { | ||||
| 		openfolderbtn.setStyle(btnStyle); | ||||
| 		returnBtn.setStyle(btnStyle); | ||||
| 		forwardBtn.setStyle(btnStyle); | ||||
| 		 | ||||
|  | ||||
| 		// menu buttons | ||||
| 		settingsBtn.setStyle(menuBtnStyle); | ||||
| 		aboutBtn.setStyle(menuBtnStyle); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	// slide in in 400ms | ||||
| 	private void sideMenuSlideIn() { | ||||
| 		sideMenuVBox.setVisible(true); | ||||
| @ -760,7 +736,7 @@ public class MainWindowController { | ||||
| 		translateTransition.setToX(0); | ||||
| 		translateTransition.play(); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	// slide out in 400ms | ||||
| 	private void sideMenuSlideOut() { | ||||
| 		TranslateTransition translateTransition = new TranslateTransition(Duration.millis(400), sideMenuVBox); | ||||
| @ -768,7 +744,7 @@ public class MainWindowController { | ||||
| 		translateTransition.setToX(-150); | ||||
| 		translateTransition.play(); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	 * set the local based on the languageChoisBox selection | ||||
| 	 */ | ||||
| @ -807,11 +783,11 @@ public class MainWindowController { | ||||
| 		columnSeason.setText(XMLController.getLocalBundle().getString("columnSeason")); | ||||
| 		columnEpisode.setText(XMLController.getLocalBundle().getString("columnEpisode")); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	private void setSelectedFilmInfo(String[] cacheData) { | ||||
| 		Font font = Font.font("System", FontWeight.BOLD, (int) Math.round(XMLController.getFontSize())); | ||||
| 		ObservableList<Node> textFlow = getTextFlow().getChildren(); | ||||
| 		 | ||||
|  | ||||
| 		// TODO this should move! *** | ||||
| 		Text[] nameText = new Text[20]; | ||||
| 		nameText[0] = new Text(XMLController.getLocalBundle().getString("title") + ": "); | ||||
| @ -836,23 +812,23 @@ public class MainWindowController { | ||||
| 		nameText[19] = new Text(XMLController.getLocalBundle().getString("website") + ": "); | ||||
| 		// *** | ||||
|  | ||||
| 		// set the correct font for the  nameText | ||||
| 		// set the correct font for the nameText | ||||
| 		for (Text text : nameText) { | ||||
| 			text.setFont(font); | ||||
| 		} | ||||
| 		 | ||||
|  | ||||
| 		// clear the textFlow and add the new text | ||||
| 		textFlow.clear(); | ||||
| 		 | ||||
|  | ||||
| 		// TODO rework | ||||
| 		for(int i = 0; i < 20; i++) { | ||||
| 		for (int i = 0; i < 20; i++) { | ||||
| 			if (cacheData[i] != null && (i == 5 || i == 6) && cacheData[5].length() == 0) { | ||||
| 				// do nothing | ||||
| 			} else if(cacheData[i] != null){ | ||||
| 			} else if (cacheData[i] != null) { | ||||
| 				textFlow.addAll(nameText[i], new Text(cacheData[i] + "\n")); | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
|  | ||||
| 		getTextFlow().setStyle("-fx-font-size : " + ((int) Math.round(XMLController.getFontSize()) + 1) + "px;"); | ||||
|  | ||||
| 		// add the image | ||||
| @ -867,7 +843,7 @@ public class MainWindowController { | ||||
| 			posterImageView.setImage(new Image(cacheData[20])); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	// if AutoUpdate, then check for updates | ||||
| 	private void checkAutoUpdate() { | ||||
|  | ||||
| @ -884,49 +860,50 @@ public class MainWindowController { | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	 * check if a film is supported by the HomeFlixPlayer or not | ||||
| 	 * this is the case if the mime type is mp4 | ||||
| 	 * check if a film is supported by the HomeFlixPlayer or not this is the case if | ||||
| 	 * the mime type is mp4 | ||||
| 	 *  | ||||
| 	 * @param entry the film you want to check | ||||
| 	 * @return true if so, false if not | ||||
| 	 */ | ||||
| 	private boolean isSupportedFormat(FilmTabelDataType film) { | ||||
| 		 String mimeType = URLConnection.guessContentTypeFromName(film.getStreamUrl()); | ||||
| 		 return mimeType != null && (mimeType.contains("mp4") || mimeType.contains("vp6")); | ||||
| 		String mimeType = URLConnection.guessContentTypeFromName(film.getStreamUrl()); | ||||
| 		return mimeType != null && (mimeType.contains("mp4") || mimeType.contains("vp6")); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	 * Poser Mode WIP | ||||
| 	 */ | ||||
| 	 | ||||
|  | ||||
| 	private void posterModeStartup() { | ||||
| 		checkAllPosters(); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	 * check if all posters are cached, if not cache the missing ones | ||||
| 	 */ | ||||
| 	private void checkAllPosters() { | ||||
| 		// get all not cached entries, none of them should have a cached poster | ||||
| 		ExecutorService executor = Executors.newFixedThreadPool(5); | ||||
| 		 | ||||
|  | ||||
| 		for (FilmTabelDataType entry : dbController.getAllNotCachedEntries()) { | ||||
| 			System.out.println(entry.getStreamUrl() + " is NOT cached!"); | ||||
| 			 | ||||
|  | ||||
| 			Runnable OMDbAPIWorker = new OMDbAPIController(dbController, entry, XMLController.getOmdbAPIKey()); | ||||
| 			executor.execute(OMDbAPIWorker); | ||||
| 		} | ||||
| 		executor.shutdown(); | ||||
| 		 | ||||
|  | ||||
| 		// TODO show loading screen | ||||
| 		 | ||||
|  | ||||
| 		// update all elements from the database | ||||
| 		refreshAllFilms(); | ||||
| 	} | ||||
|  | ||||
| 	// getter and setter | ||||
| 	 | ||||
|  | ||||
| 	public FilmTabelDataType getCurrentTableFilm() { | ||||
| 		return currentTableFilm; | ||||
| 	} | ||||
| @ -942,7 +919,7 @@ public class MainWindowController { | ||||
| 	public int getIndexTable() { | ||||
| 		return indexTable; | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	public int getIndexList() { | ||||
| 		return indexList; | ||||
| 	} | ||||
|  | ||||
		Reference in New Issue
	
	Block a user