fixed missing elements when searching

* minor clean up
This commit is contained in:
Jannik 2019-05-06 00:50:27 +02:00
parent 46cd28a642
commit fdb39ea2f5
Signed by: Seil0
GPG Key ID: E8459F3723C52C24
1 changed files with 238 additions and 261 deletions

View File

@ -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;
@ -203,7 +200,7 @@ public class MainWindowController {
dbController = DBController.getInstance();
}
public void init() {
public void init() {
LOGGER.info("Initializing Project-HomeFlix build " + buildNumber);
xmlController.loadSettings(); // load settings
@ -246,8 +243,8 @@ public class MainWindowController {
}
/**
* 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);
@ -295,166 +291,127 @@ public class MainWindowController {
}
});
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
}
}
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();
}
if (searchTextField.getText().hashCode() == hashA) {
XMLController.setColor("000000");
colorPicker.setValue(new Color(0, 0, 0, 1));
applyColor();
}
});
like.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
dbController.like(getCurrentStreamUrl());
filmsList.set(indexList, dbController.getDatabaseFilm(getCurrentStreamUrl()));
refreshTableElement();
}
like.setOnAction(e -> {
dbController.like(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();
}
dislike.setOnAction(e -> {
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();
// 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.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);
}
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);
}
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;
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
}
}
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;
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();
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()));
});
}
synchronized (omdbAPIThread) {
try {
omdbAPIThread.wait();
} catch (InterruptedException e1) {
LOGGER.error(e1);
}
}).start();
}
// update the GUI for the selected film
Platform.runLater(() -> {
setSelectedFilmInfo(dbController.readCache(getCurrentStreamUrl()));
});
}
}).start();
}
});
@ -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 {
@ -529,20 +485,20 @@ 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();
}
@ -557,7 +513,7 @@ public class MainWindowController {
}
@FXML
private void addDirectoryBtnAction(){
private void addDirectoryBtnAction() {
DirectoryChooser directoryChooser = new DirectoryChooser();
directoryChooser.setTitle(XMLController.getLocalBundle().getString("addDirectory"));
File selectedFolder = directoryChooser.showDialog(primaryStage);
@ -569,7 +525,7 @@ public class MainWindowController {
}
@FXML
private void addStreamSourceBtnAction(){
private void addStreamSourceBtnAction() {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(XMLController.getLocalBundle().getString("addStreamSource"));
File selectedFile = fileChooser.showOpenDialog(primaryStage);
@ -602,7 +558,7 @@ public class MainWindowController {
}
@FXML
private void autoplayToggleBtnAction(){
private void autoplayToggleBtnAction() {
XMLController.setAutoplay(!XMLController.isAutoplay());
xmlController.saveSettings();
}
@ -613,8 +569,8 @@ public class MainWindowController {
}
/**
* 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();
@ -625,7 +581,9 @@ public class MainWindowController {
}
/**
* 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) {
@ -634,22 +592,40 @@ public class MainWindowController {
// 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));
@ -659,18 +635,18 @@ public class MainWindowController {
// 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);
@ -696,15 +672,13 @@ public class MainWindowController {
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,7 +686,8 @@ 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")));
@ -722,7 +697,8 @@ public class MainWindowController {
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")));
@ -836,7 +812,7 @@ 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);
}
@ -845,10 +821,10 @@ public class MainWindowController {
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"));
}
}
@ -886,14 +862,15 @@ 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"));
}
/**