diff --git a/.classpath b/.classpath index 0f49fcb..4174765 100644 --- a/.classpath +++ b/.classpath @@ -4,8 +4,8 @@ - - + + diff --git a/.gitignore b/.gitignore index cb76115..0cf5b30 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,5 @@ Network Trash Folder Temporary Items .apdisk config.xml +.directory diff --git a/DB_PATH b/DB_PATH deleted file mode 100644 index 9e5295d..0000000 Binary files a/DB_PATH and /dev/null differ diff --git a/README.md b/README.md index 0507d9f..dbfa37a 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,12 @@ The dev branch is **only merged** into master when a **new release** is released Librarys used in this Project: JFoenix: https://github.com/jfoenixadmin/JFoenix -minimal-json: https://github.com/ralfstx/minimal-json -Commons Lang: https://commons.apache.org/proper/commons-lang/ +minimal-json: https://github.com/ralfstx/minimal-json sqlite-jdbc: https://github.com/xerial/sqlite-jdbc ## Installation [wiki](https://github.com/Seil0/Project-HomeFlix/wiki) -Project HomeFlix © 2016-2017 Software Development Kellerkinder (SDK) +Project HomeFlix © 2016-2017 Kellerkinder ([Seil0](https://github.com/Seil0), [Windoofs](https://github.com/Windoofs)) www.kellerkinder.xyz diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 0000000..b42b859 --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1 @@ +/application/ diff --git a/bin/application/DBController.class b/bin/application/DBController.class index 4a9c489..9f604cf 100644 Binary files a/bin/application/DBController.class and b/bin/application/DBController.class differ diff --git a/bin/application/Main.class b/bin/application/Main.class index 04ee8bc..9a4b3ac 100644 Binary files a/bin/application/Main.class and b/bin/application/Main.class differ diff --git a/bin/application/MainWindow.fxml b/bin/application/MainWindow.fxml index a455653..803f728 100644 --- a/bin/application/MainWindow.fxml +++ b/bin/application/MainWindow.fxml @@ -3,11 +3,11 @@ - + @@ -20,9 +20,12 @@ - - - + + + + + + @@ -31,7 +34,7 @@ - + @@ -78,8 +81,8 @@ - - + + diff --git a/bin/application/MainWindowController$1.class b/bin/application/MainWindowController$1.class index 68b1b57..c392df7 100644 Binary files a/bin/application/MainWindowController$1.class and b/bin/application/MainWindowController$1.class differ diff --git a/bin/application/MainWindowController$2.class b/bin/application/MainWindowController$2.class index 24ed899..d6a1ab4 100644 Binary files a/bin/application/MainWindowController$2.class and b/bin/application/MainWindowController$2.class differ diff --git a/bin/application/MainWindowController$3.class b/bin/application/MainWindowController$3.class index 05dc50b..fc86b80 100644 Binary files a/bin/application/MainWindowController$3.class and b/bin/application/MainWindowController$3.class differ diff --git a/bin/application/MainWindowController$4.class b/bin/application/MainWindowController$4.class index dbce121..66c3735 100644 Binary files a/bin/application/MainWindowController$4.class and b/bin/application/MainWindowController$4.class differ diff --git a/bin/application/MainWindowController$5.class b/bin/application/MainWindowController$5.class index 1e47f18..64a6d23 100644 Binary files a/bin/application/MainWindowController$5.class and b/bin/application/MainWindowController$5.class differ diff --git a/bin/application/MainWindowController$6.class b/bin/application/MainWindowController$6.class index ea12f4a..5f0c70e 100644 Binary files a/bin/application/MainWindowController$6.class and b/bin/application/MainWindowController$6.class differ diff --git a/bin/application/MainWindowController$7.class b/bin/application/MainWindowController$7.class index 176f270..9f1378c 100644 Binary files a/bin/application/MainWindowController$7.class and b/bin/application/MainWindowController$7.class differ diff --git a/bin/application/MainWindowController.class b/bin/application/MainWindowController.class index 76ac617..bd3b673 100644 Binary files a/bin/application/MainWindowController.class and b/bin/application/MainWindowController.class differ diff --git a/bin/application/apiQuery.class b/bin/application/apiQuery.class index 9de2779..3979347 100644 Binary files a/bin/application/apiQuery.class and b/bin/application/apiQuery.class differ diff --git a/bin/application/streamUiData.class b/bin/application/streamUiData.class deleted file mode 100644 index 034c7a2..0000000 Binary files a/bin/application/streamUiData.class and /dev/null differ diff --git a/bin/application/tableData.class b/bin/application/tableData.class new file mode 100644 index 0000000..76223fc Binary files /dev/null and b/bin/application/tableData.class differ diff --git a/bin/application/updater.class b/bin/application/updater.class index dd8ed1e..2185f2c 100644 Binary files a/bin/application/updater.class and b/bin/application/updater.class differ diff --git a/bin/libraries/commons-io-2.5.jar b/bin/libraries/commons-io-2.5.jar new file mode 100644 index 0000000..107b061 Binary files /dev/null and b/bin/libraries/commons-io-2.5.jar differ diff --git a/bin/libraries/commons-lang3-3.5.jar b/bin/libraries/commons-lang3-3.5.jar deleted file mode 100644 index 6328c8d..0000000 Binary files a/bin/libraries/commons-lang3-3.5.jar and /dev/null differ diff --git a/bin/libraries/jfoenix-1.2.0.jar b/bin/libraries/jfoenix-1.2.0.jar deleted file mode 100644 index 550230d..0000000 Binary files a/bin/libraries/jfoenix-1.2.0.jar and /dev/null differ diff --git a/bin/libraries/jfoenix-1.3.0.jar b/bin/libraries/jfoenix-1.3.0.jar new file mode 100644 index 0000000..37e7860 Binary files /dev/null and b/bin/libraries/jfoenix-1.3.0.jar differ diff --git a/bin/recources/HomeFlix-Local_de_DE.properties b/bin/recources/HomeFlix-Local_de_DE.properties index 4fb3706..bfa591e 100644 --- a/bin/recources/HomeFlix-Local_de_DE.properties +++ b/bin/recources/HomeFlix-Local_de_DE.properties @@ -8,6 +8,7 @@ openFolder = Ordner \u00F6ffnen chooseFolder = Ordner ausw\u00E4hlen fontSize = Schriftgr\u00F6\u00DFe: checkUpdates = Auf Update pr\u00FCfen +checkingUpdates = Es wird nach Updates gesucht... updateBtnavail = Update verf\u00FCgbar updateBtnNotavail = Kein Update verf\u00FCgbar autoUpdate = beim Start nach Updates suchen: diff --git a/bin/recources/HomeFlix-Local_en_US.properties b/bin/recources/HomeFlix-Local_en_US.properties index 41de6ea..e221122 100644 --- a/bin/recources/HomeFlix-Local_en_US.properties +++ b/bin/recources/HomeFlix-Local_en_US.properties @@ -8,6 +8,7 @@ openFolder = open Folder chooseFolder = choose Directory fontSize = font size: checkUpdates = check for updates +checkingUpdates = checking for updates... updateBtnavail = update available updateBtnNotavail = no update available autoUpdate = check at startup for updates: diff --git a/src/application/DBController.java b/src/application/DBController.java index 3dc251a..9e0be27 100644 --- a/src/application/DBController.java +++ b/src/application/DBController.java @@ -1,7 +1,7 @@ /** + * @author Jannik * DBController for Project HomeFlix * connection is in manual commit! - * TODO arraylists not string -> streamUIData */ package application; @@ -23,17 +23,21 @@ import com.eclipsesource.json.Json; import com.eclipsesource.json.JsonArray; import com.eclipsesource.json.JsonObject; import com.eclipsesource.json.JsonValue; - import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import javafx.scene.text.Font; +import javafx.scene.text.FontWeight; +import javafx.scene.text.Text; public class DBController { - public DBController(MainWindowController m) { + public DBController(MainWindowController m, Main main) { mainWindowController = m; + this.main = main; } private MainWindowController mainWindowController; + private Main main; private String DB_PATH = System.getProperty("user.home") + "\\Documents\\HomeFlix" + "\\" + "Homeflix.db"; //path to database file private Image favorite_black = new Image("recources/icons/ic_favorite_black_18dp_1x.png"); private Image favorite_border_black = new Image("recources/icons/ic_favorite_border_black_18dp_1x.png"); @@ -57,15 +61,13 @@ public class DBController { try { // create a database connection connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH); - // Statement statement = connection.createStatement(); - // statement.setQueryTimeout(30); // set timeout to 30 sec. TODO don't know what to do with this - connection.setAutoCommit(false); //AutoCommit to false -> manual commit is active -// fuelleDatenbank(); } catch (SQLException e) { // if the error message is "out of memory", it probably means no database file is found System.err.println(e.getMessage()); } + + //close connection -> at the moment this kills the program // finally { // try { // if (connection != null) @@ -85,8 +87,8 @@ public class DBController { try { Statement stmt = connection.createStatement(); - stmt.executeUpdate("create table if not exists film_local (rating, titel, streamUrl, favIcon)"); - stmt.executeUpdate("create table if not exists film_streaming (year, season, episode, rating, resolution, titel, streamUrl, favIcon)"); + stmt.executeUpdate("create table if not exists film_local (rating, titel, streamUrl, favIcon, cached)"); + stmt.executeUpdate("create table if not exists film_streaming (year, season, episode, rating, resolution, titel, streamUrl, favIcon, cached)"); stmt.close(); } catch (SQLException e1) { e1.printStackTrace(); @@ -144,13 +146,12 @@ public class DBController { System.out.println("films in directory: "+filmsAll.size()); System.out.println("filme in db: "+filmsdbAll.size()); - if(filmsdbAll.size() == 0){ System.out.println("creating entries ..."); try{ - ps = connection.prepareStatement("insert into film_local values (?, ?, ?, ?)"); - psS = connection.prepareStatement("insert into film_streaming values (?, ?, ?, ?, ?, ?, ?, ?)"); + ps = connection.prepareStatement("insert into film_local values (?, ?, ?, ?, ?)"); + psS = connection.prepareStatement("insert into film_streaming values (?, ?, ?, ?, ?, ?, ?, ?, ?)"); if(mainWindowController.getPath().equals("") || mainWindowController.getPath() == null){ System.out.println("Kein Pfad angegeben"); //if path == null or "" @@ -161,7 +162,8 @@ public class DBController { ps.setString(2, cutOffEnd(entries[j])); //name as String without ending 2. column ps.setString(3,entries[j]); //path as String 3. column ps.setString(4, "favorite_border_black"); - ps.addBatch(); // add command to prepared statement + ps.setBoolean(5, false); + ps.addBatch(); // add command to prepared statement } } @@ -182,6 +184,7 @@ public class DBController { psS.setString(6, item.asObject().getString("titel","")); psS.setString(7, item.asObject().getString("streamUrl", "")); psS.setString(8, "favorite_border_black"); + psS.setBoolean(9, false); psS.addBatch(); // add command to prepared statement } } catch (IOException e) { @@ -189,7 +192,7 @@ public class DBController { } } } - ps.executeBatch(); //execute statement to write entries into table + ps.executeBatch(); //execute statement to write entries into table psS.executeBatch(); connection.commit(); ps.close(); @@ -203,15 +206,26 @@ public class DBController { try { try { - checkAddEntry(); + checkAddEntry(); //check if added a new file } catch (IOException e) { e.printStackTrace(); - } //check if added a new file - checkRemoveEntry(); //check if removed a file + } + checkRemoveEntry(); //check if removed a file } catch (SQLException e) { e.printStackTrace(); } } + + //start of cache-table + try { + Statement stmt = connection.createStatement(); + stmt.executeUpdate( "create table if not exists cache (streamUrl, Title, Year, Rated, Released, Runtime, Genre, Director, Writer," //streamUrl is primary key + +" Actors, Plot, Language, Country, Awards, Metascore, imdbRating, imdbVotes, imdbID, Type, Poster, Response)"); + stmt.close(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + } //loading data from database to mainWindowController @@ -220,24 +234,24 @@ public class DBController { try { //load local Data Statement stmt = connection.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT * FROM film_local"); + ResultSet rs = stmt.executeQuery("SELECT * FROM film_local ORDER BY titel"); while (rs.next()) { if(rs.getString(4).equals("favorite_black")){ - mainWindowController.newData.add( new streamUiData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_black))); + mainWindowController.localFilms.add( new tableData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_black),rs.getBoolean(5))); }else{ - mainWindowController.newData.add( new streamUiData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_border_black))); + mainWindowController.localFilms.add( new tableData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_border_black),rs.getBoolean(5))); } } stmt.close(); rs.close(); - //load streaming Data TODO check if there are streaming data before loading -> maybe there is an issue now - rs = stmt.executeQuery("SELECT * FROM film_streaming;"); + //load streaming Data FIXME check if there are streaming data before loading -> maybe there is an issue now + rs = stmt.executeQuery("SELECT * FROM film_streaming ORDER BY titel;"); while (rs.next()) { if(rs.getString(8).equals("favorite_black")){ - mainWindowController.streamData.add(new streamUiData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_black))); + mainWindowController.streamingFilms.add(new tableData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_black),rs.getBoolean(9))); }else{ - mainWindowController.streamData.add(new streamUiData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_border_black))); + mainWindowController.streamingFilms.add(new tableData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_border_black),rs.getBoolean(9))); } } stmt.close(); @@ -250,7 +264,7 @@ public class DBController { } //Refreshes the data in mainWindowController.newDaten and mainWindowController.streamData - //TODO it seems that there is an issue at the moment with streaming refreshing wrong entry if there is more than one with the same name + //FIXME it seems that there is an issue at the moment with streaming refreshing wrong entry if there is more than one with the same name void refresh(String name,int i) throws SQLException{ System.out.println("refresh ..."); Statement stmt; @@ -259,9 +273,9 @@ public class DBController { stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM film_local WHERE titel = '"+name+"';" ); if(rs.getString(4).equals("favorite_black")){ - mainWindowController.newData.set(i, new streamUiData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_black))); + mainWindowController.localFilms.set(i, new tableData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_black),rs.getBoolean(5))); }else{ - mainWindowController.newData.set(i, new streamUiData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_border_black))); + mainWindowController.localFilms.set(i, new tableData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3), new ImageView(favorite_border_black),rs.getBoolean(5))); } stmt.close(); rs.close(); @@ -270,9 +284,9 @@ public class DBController { stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM film_streaming WHERE titel = '"+name+"';" ); if(rs.getString(8).equals("favorite_black")){ - mainWindowController.streamData.set(i,new streamUiData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_black))); + mainWindowController.streamingFilms.set(i,new tableData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_black),rs.getBoolean(9))); }else{ - mainWindowController.streamData.set(i,new streamUiData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_border_black))); + mainWindowController.streamingFilms.set(i,new tableData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7), new ImageView(favorite_border_black),rs.getBoolean(9))); } stmt.close(); rs.close(); @@ -282,7 +296,10 @@ public class DBController { } } } - + /** + * check if there are any entries that have been removed from the film-directory + * @throws SQLException + */ private void checkRemoveEntry() throws SQLException{ System.out.println("checking for entrys to remove to DB ..."); Statement stmt = connection.createStatement(); @@ -309,17 +326,25 @@ public class DBController { } - private void checkAddEntry() throws SQLException, FileNotFoundException, IOException{ //TODO sort alphabetical + /** + * check if there are new films in the film-directory + * @throws SQLException + * @throws FileNotFoundException + * @throws IOException + * if lastName != filmsStreamData.get(b) then set i = 0, file changed + */ + private void checkAddEntry() throws SQLException, FileNotFoundException, IOException{ + String lastName = ""; System.out.println("checking for entrys to add to DB ..."); String[] entries = new File(mainWindowController.getPath()).list(); Statement stmt = connection.createStatement(); - PreparedStatement ps = connection.prepareStatement("insert into film_streaming values (?, ?, ?, ?, ?, ?, ?, ?)");; + PreparedStatement ps = connection.prepareStatement("insert into film_streaming values (?, ?, ?, ?, ?, ?, ?, ?, ?)"); int i=0; for(int a=0; a nameText = new ArrayList(); + ArrayList responseText = new ArrayList(); + String fontFamily = main.getFONT_FAMILY(); + Image im; + int fontSize = (int) Math.round(mainWindowController.size); + int j=2; + + nameText.add(0, new Text(mainWindowController.title+": ")); + nameText.add(1, new Text(mainWindowController.year+": ")); + nameText.add(2, new Text(mainWindowController.rating+": ")); + nameText.add(3, new Text(mainWindowController.publishedOn+": ")); + nameText.add(4, new Text(mainWindowController.duration+": ")); + nameText.add(5, new Text(mainWindowController.genre+": ")); + nameText.add(6, new Text(mainWindowController.director+": ")); + nameText.add(7, new Text(mainWindowController.writer+": ")); + nameText.add(8, new Text(mainWindowController.actors+": ")); + nameText.add(9, new Text(mainWindowController.plot+": ")); + nameText.add(10, new Text(mainWindowController.language+": ")); + nameText.add(11, new Text(mainWindowController.country+": ")); + nameText.add(12, new Text(mainWindowController.awards+": ")); + nameText.add(13, new Text(mainWindowController.metascore+": ")); + nameText.add(14, new Text(mainWindowController.imdbRating+": ")); + nameText.add(15, new Text(mainWindowController.type+": ")); + + for(int i=0; i<15; i++){ + responseText.add(new Text(rs.getString(j)+"\n")); + j++; + } + responseText.add(new Text(rs.getString(19)+"\n")); + im = new Image(new File(rs.getString(20)).toURI().toString()); + + stmt.close(); + rs.close(); + + for(int i=0; i check config.xml - if(System.getProperty("os.name").equals("Linux")){ - if(dirLinux.exists() != true){ - dirLinux.mkdir(); - }else if(fileLinux.exists() != true){ - mainWindowController.setPath(firstStart()); - mainWindowController.setStreamingPath(streamingPathLinux); - mainWindowController.setColor(color); - mainWindowController.setSize(size); - mainWindowController.setAutoUpdate(autoUpdate); - mainWindowController.setLocal(local); - mainWindowController.setMode(mode); - mainWindowController.saveSettings(); - Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //start again (preventing Bugs) - System.exit(0); //finishes itself - } - //windows - }else{ - if(dirWin.exists() != true){ - dirWin.mkdir(); - }else if(fileWin.exists() != true){ - mainWindowController.setPath(firstStart()); - mainWindowController.setStreamingPath(streamingPathWin); - mainWindowController.setColor(color); - mainWindowController.setSize(size); - mainWindowController.setAutoUpdate(autoUpdate); - mainWindowController.setLocal(local); - mainWindowController.setMode(mode); - mainWindowController.saveSettings(); - Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //start again (preventing Bugs) - System.exit(0); //finishes itself - } + /**Linux else Windows, check if directory & config exist + * Windows: config file: C:/Users/"User"/Documents/HomeFlix/config.xml + * directory: C:/Users/"User"/Documents/HomeFlix + * Linux: config file: /home/"User"/HomeFlix/config.xml + * directory: /home/"User"/HomeFlix + */ + if(System.getProperty("os.name").equals("Linux")) { + directory = new File(dirLinux); + settingsFile = new File(dirLinux + "/config.xml"); + } else { + directory = new File(dirWin); + settingsFile = new File(dirWin + "/config.xml"); + } + + posterCache = new File(directory+"/posterCache"); + + if(!settingsFile.exists()){ + directory.mkdir(); + mainWindowController.setPath(firstStart()); + mainWindowController.setStreamingPath(directory.getAbsolutePath()); + mainWindowController.setColor(COLOR); + mainWindowController.setSize(FONT_SIZE); + mainWindowController.setAutoUpdate(AUTO_UPDATE); + mainWindowController.setLocal(local); + mainWindowController.setMode(mode); + mainWindowController.saveSettings(); + Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //start again (preventing Bugs) + System.exit(0); //finishes it self + } + + if(!posterCache.exists()) { + posterCache.mkdir(); } mainWindowController.loadSettings(); @@ -166,4 +170,20 @@ public class Main extends Application { public static void main(String[] args) { launch(args); } + + public String getFONT_FAMILY() { + return FONT_FAMILY; + } + + public void setFONT_FAMILY(String FONT_FAMILY) { + this.FONT_FAMILY = FONT_FAMILY; + } + + public File getPosterCache() { + return posterCache; + } + + public void setPosterCache(File posterCache) { + this.posterCache = posterCache; + } } \ No newline at end of file diff --git a/src/application/MainWindow.fxml b/src/application/MainWindow.fxml index a455653..803f728 100644 --- a/src/application/MainWindow.fxml +++ b/src/application/MainWindow.fxml @@ -3,11 +3,11 @@ - + @@ -20,9 +20,12 @@ - - - + + + + + + @@ -31,7 +34,7 @@ - + @@ -78,8 +81,8 @@ - - + + diff --git a/src/application/MainWindowController.java b/src/application/MainWindowController.java index 7cc553b..14131af 100644 --- a/src/application/MainWindowController.java +++ b/src/application/MainWindowController.java @@ -41,12 +41,9 @@ import java.util.ArrayList; import java.util.Locale; import java.util.Properties; import java.util.ResourceBundle; -import org.apache.commons.lang3.SystemUtils; - import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXColorPicker; import com.jfoenix.controls.JFXSlider; -import com.jfoenix.controls.JFXTextArea; import com.jfoenix.controls.JFXTextField; import com.jfoenix.controls.JFXToggleButton; @@ -99,17 +96,15 @@ public class MainWindowController { @FXML private VBox sideMenuVBox; @FXML - private TreeTableView treeTableViewfilm; + private TreeTableView treeTableViewfilm; @FXML - private TableView tableViewStreamingdata; - @FXML - JFXTextArea ta1; + private TableView tableViewStreamingdata; @FXML TextFlow textFlow; @FXML ScrollPane scrollPane; @FXML - private JFXButton menubtn; + private JFXButton menubtn; //TODO switch to hamburger menu @FXML private JFXButton playbtn; @FXML @@ -159,37 +154,37 @@ public class MainWindowController { private ImageView imv1; @FXML - TreeItem root = new TreeItem<>(new streamUiData(1, 1, 1, 5.0,"1", "filme","1", imv1)); + TreeItem root = new TreeItem<>(new tableData(1, 1, 1, 5.0,"1", "filme","1", imv1, false)); @FXML - TreeTableColumn columnRating = new TreeTableColumn<>("Rating"); + TreeTableColumn columnRating = new TreeTableColumn<>("Rating"); @FXML - TreeTableColumn columnTitel = new TreeTableColumn<>("Titel"); + TreeTableColumn columnTitel = new TreeTableColumn<>("Titel"); @FXML - TreeTableColumn columnStreamUrl = new TreeTableColumn<>("File Name"); + TreeTableColumn columnStreamUrl = new TreeTableColumn<>("File Name"); @FXML - TreeTableColumn columnResolution = new TreeTableColumn<>("Resolution"); + TreeTableColumn columnResolution = new TreeTableColumn<>("Resolution"); @FXML - TreeTableColumn columnYear = new TreeTableColumn<>("Year"); + TreeTableColumn columnYear = new TreeTableColumn<>("Year"); @FXML - TreeTableColumn columnSeason = new TreeTableColumn<>("Season"); + TreeTableColumn columnSeason = new TreeTableColumn<>("Season"); @FXML - TreeTableColumn columnEpisode = new TreeTableColumn<>("Episode"); + TreeTableColumn columnEpisode = new TreeTableColumn<>("Episode"); @FXML - private TreeItem streamingRoot =new TreeItem<>(new streamUiData(1 ,1 ,1 ,1.0 ,"1" ,"filme" ,"1", imv1)); + private TreeItem streamingRoot =new TreeItem<>(new tableData(1 ,1 ,1 ,1.0 ,"1" ,"filme" ,"1", imv1, false)); @FXML - private TableColumn dataNameColumn = new TableColumn<>("Datei Name"); + private TableColumn dataNameColumn = new TableColumn<>("Datei Name"); @FXML - private TableColumn dataNameEndColumn = new TableColumn<>("Datei Name mit Endung"); - + private TableColumn dataNameEndColumn = new TableColumn<>("Datei Name mit Endung"); - private boolean menutrue = false; //saves the position of menubtn (opened or closed) + private boolean menutrue = false; //saves the position of menuBtn (opened or closed) private boolean settingstrue = false; private boolean streamingSettingsTrue = false; + private boolean autoUpdate = false; static boolean firststart = false; private int hashA = -2055934614; - private String version = "0.5.0"; - private String buildNumber = "117"; + private String version = "0.5.1"; + private String buildNumber = "125"; private String versionName = "plasma cow"; private String buildURL = "https://raw.githubusercontent.com/Seil0/Project-HomeFlix/master/updates/buildNumber.txt"; private String downloadLink = "https://raw.githubusercontent.com/Seil0/Project-HomeFlix/master/updates/downloadLink.txt"; @@ -200,22 +195,21 @@ public class MainWindowController { String errorUpdateD; String errorUpdateV; + String noFilmFound; private String errorPlay; private String errorOpenStream; private String errorMode; private String errorLoad; private String errorSave; - String noFilmFound; private String infoText; private String linuxBugText; private String vlcNotInstalled; - private String aktBuildNumber; + private String currentWorkingDirectory; private String path; private String streamingPath; private String color; - private String Name; + private String name; private String datPath; - private String autoUpdate; private String mode; @SuppressWarnings("unused") private String ratingSortType; @@ -236,7 +230,7 @@ public class MainWindowController { String metascore; String imdbRating; String type; - private double size; + double size; private int last; private int selected; private int next; @@ -244,11 +238,11 @@ public class MainWindowController { private File selectedStreamingFolder; ResourceBundle bundle; - private ObservableList filterData = FXCollections.observableArrayList(); - private ObservableList locals = FXCollections.observableArrayList("english (en_US)", "deutsch (de_DE)"); - ObservableList newData = FXCollections.observableArrayList(); //TODO rename to localFilms - ObservableList streamData = FXCollections.observableArrayList(); //TODO rename to streamingFilms - ObservableList streamingData = FXCollections.observableArrayList(); + private ObservableList filterData = FXCollections.observableArrayList(); + private ObservableList locals = FXCollections.observableArrayList("English (en_US)", "Deutsch (de_DE)"); + ObservableList localFilms = FXCollections.observableArrayList(); + ObservableList streamingFilms = FXCollections.observableArrayList(); + ObservableList streamingData = FXCollections.observableArrayList(); private ImageView menu_icon_black = new ImageView(new Image("recources/icons/menu_icon_black.png")); private ImageView menu_icon_white = new ImageView(new Image("recources/icons/menu_icon_white.png")); private ImageView skip_previous_white = new ImageView(new Image("recources/icons/ic_skip_previous_white_18dp_1x.png")); @@ -263,6 +257,7 @@ public class MainWindowController { private ContextMenu menu = new ContextMenu(like, dislike); Properties props = new Properties(); + private Main main; private updater Updater; private apiQuery ApiQuery; DBController dbController; @@ -293,8 +288,9 @@ public class MainWindowController { @FXML private void playbtnclicked(){ - if(SystemUtils.IS_OS_LINUX){ - System.out.println("This is Linux"); + System.out.println(System.getProperty("os.name")); + if(System.getProperty("os.name").contains("Linux")){ + System.out.println("This is "+System.getProperty("os.name")); String line; String output = ""; Process p; @@ -320,6 +316,7 @@ public class MainWindowController { alert.setHeaderText(""); alert.setTitle("Info"); alert.setContentText(linuxBugText); + alert.initOwner(main.primaryStage); alert.showAndWait(); }else{ try { @@ -328,8 +325,8 @@ public class MainWindowController { showErrorMsg(errorPlay,e); } } - }else if(SystemUtils.IS_OS_WINDOWS || SystemUtils.IS_OS_MAC_OSX){ - System.out.println("This is Windows or Mac OSX"); + }else if(System.getProperty("os.name").contains("Windows") || System.getProperty("os.name").contains("Mac OS X")){ + System.out.println("This is "+System.getProperty("os.name")); if(mode.equals("local")){ try { Desktop.getDesktop().open(new File(getPath()+"\\"+ datPath)); @@ -338,7 +335,7 @@ public class MainWindowController { } }else if(mode.equals("streaming")){ try { - Desktop.getDesktop().browse(new URI(datPath)); //open the streaming Url in browser (TODO other option?) + Desktop.getDesktop().browse(new URI(datPath)); //open the streaming URL in browser (TODO other option?) } catch (URISyntaxException | IOException e) { showErrorMsg(errorOpenStream, (IOException) e); } @@ -375,6 +372,7 @@ public class MainWindowController { alert.setTitle("Info"); alert.setHeaderText("Project HomeFlix"); alert.setContentText(infoText); + alert.initOwner(main.primaryStage); alert.showAndWait(); } @@ -472,21 +470,21 @@ public class MainWindowController { @FXML private void updateBtnAction(){ -// Updater.update(buildURL, downloadLink, aktBuildNumber, buildNumber); System.out.println(Updater.getState()); if(Updater.getState() == State.NEW){ Updater.start(); }else{ Updater.run(); } + } @FXML private void autoupdateBtnAction(){ - if(autoUpdate.equals("0")){ - setAutoUpdate("1"); + if(autoUpdate){ + setAutoUpdate(false); }else{ - setAutoUpdate("0"); + setAutoUpdate(true); } saveSettings(); } @@ -516,11 +514,14 @@ public class MainWindowController { } - //"Main" Method called in Main.java main() when starting + /**"Main" Method called in Main.java main() when starting + * Initialize other objects: Updater, dbController and ApiQuery + */ void setMain(Main main) { - Updater = new updater(this,buildURL, downloadLink, aktBuildNumber, buildNumber); - ApiQuery = new apiQuery(this); - dbController = new DBController(this); + this.main = main; + Updater = new updater(this,buildURL, downloadLink, buildNumber); + dbController = new DBController(this, this.main); + ApiQuery = new apiQuery(this, dbController, this.main); } //Initialize the tables (treeTableViewfilm and tableViewStreamingdata) @@ -532,7 +533,7 @@ public class MainWindowController { columnTitel.setMaxWidth(260); columnStreamUrl.setMaxWidth(0); dataNameColumn.setPrefWidth(150); - dataNameEndColumn.setPrefWidth(170); + dataNameEndColumn.setPrefWidth(220); columnRating.setStyle("-fx-alignment: CENTER;"); treeTableViewfilm.setRoot(root); @@ -540,7 +541,7 @@ public class MainWindowController { treeTableViewfilm.setShowRoot(false); //write content into cell - columnTitel.setCellValueFactory(cellData -> cellData.getValue().getValue().titelProperty()); + columnTitel.setCellValueFactory(cellData -> cellData.getValue().getValue().titleProperty()); columnRating.setCellValueFactory(cellData -> cellData.getValue().getValue().imageProperty()); columnStreamUrl.setCellValueFactory(cellData -> cellData.getValue().getValue().streamUrlProperty()); columnResolution.setCellValueFactory(cellData -> cellData.getValue().getValue().resolutionProperty()); @@ -554,16 +555,30 @@ public class MainWindowController { //Change-listener for TreeTable treeTableViewfilm.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { @Override - public void changed(ObservableValue observable, Object oldVal, Object newVal) { + public void changed(ObservableValue observable, Object oldVal, Object newVal){ // last = selected; //for auto-play selected = treeTableViewfilm.getSelectionModel().getSelectedIndex(); //get selected item last = selected - 1; next = selected + 1; - Name = columnTitel.getCellData(selected); //get name of selected item + name = columnTitel.getCellData(selected); //get name of selected item datPath = columnStreamUrl.getCellData(selected); //get file path of selected item - ta1.setText(""); //delete text in ta1 - ApiQuery.startQuery(Name); // start api query - ta1.positionCaret(0); //set cursor position in ta1 + + if(mode.equals("local")){ + if(localFilms.get(selected).getCached()==true){ + System.out.println("loading from cache: "+name); + dbController.readCache(datPath); + }else{ + ApiQuery.startQuery(name,datPath); // start api query + } + }else{ + System.out.println(streamingFilms.size()); + if(streamingFilms.get(selected).getCached()==true){ + System.out.println("loading from cache: "+name); + dbController.readCache(datPath); + }else{ + ApiQuery.startQuery(name,datPath); // start api query + } + } } }); @@ -571,7 +586,7 @@ public class MainWindowController { treeTableViewfilm.setContextMenu(menu); //Streaming-Settings Table - dataNameColumn.setCellValueFactory(cellData -> cellData.getValue().titelProperty()); + dataNameColumn.setCellValueFactory(cellData -> cellData.getValue().titleProperty()); dataNameEndColumn.setCellValueFactory(cellData -> cellData.getValue().streamUrlProperty()); tableViewStreamingdata.getColumns().addAll(dataNameColumn, dataNameEndColumn); @@ -584,24 +599,24 @@ public class MainWindowController { tfsearch.textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable,String oldValue, String newValue) { - ObservableList helpData; + ObservableList helpData; filterData.removeAll(filterData); root.getChildren().remove(0,root.getChildren().size()); if(mode.equals("local")){ - helpData = newData; + helpData = localFilms; }else{ - helpData = streamData; + helpData = streamingFilms; } for(int i = 0; i < helpData.size(); i++){ - if(helpData.get(i).getTitel().toLowerCase().contains(tfsearch.getText().toLowerCase())){ + if(helpData.get(i).getTitle().toLowerCase().contains(tfsearch.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++){ - root.getChildren().add(new TreeItem(filterData.get(i))); //add filtered data to root node after search + root.getChildren().add(new TreeItem(filterData.get(i))); //add filtered data to root node after search } if(tfsearch.getText().hashCode() == hashA){ setColor("000000"); @@ -613,7 +628,7 @@ public class MainWindowController { cbLocal.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener() { public void changed(ObservableValue ov, Number value, Number new_value) { String local = cbLocal.getItems().get((int) new_value).toString(); - local = local.substring(local.length()-6,local.length()-1); + local = local.substring(local.length()-6,local.length()-1); //reading only en_US from English (en_US) setLocal(local); setLocalUI(); saveSettings(); @@ -624,7 +639,12 @@ public class MainWindowController { @Override public void changed(ObservableValue ov,Number old_val, Number new_val) { setSize(sliderFontSize.getValue()); - ta1.setFont(Font.font("System", size)); + + if(name != null){ + dbController.readCache(datPath); + } + +// ta1.setFont(Font.font("System", size)); saveSettings(); } }); @@ -633,13 +653,13 @@ public class MainWindowController { @Override public void handle(ActionEvent event) { if(mode.equals("streaming")){ - dbController.like(Name,streamData.get(selected).getStreamUrl()); + dbController.like(name,streamingFilms.get(selected).getStreamUrl()); }else{ - dbController.like(Name,newData.get(selected).getStreamUrl()); + dbController.like(name,localFilms.get(selected).getStreamUrl()); } - dbController.getFavStatus(Name); + dbController.getFavStatus(name); try { - dbController.refresh(Name, selected); + dbController.refresh(name, selected); } catch (SQLException e) { Alert alert = new Alert(AlertType.ERROR); alert.setTitle("Error"); @@ -655,13 +675,13 @@ public class MainWindowController { @Override public void handle(ActionEvent event) { if(mode.equals("streaming")){ - dbController.dislike(Name,streamData.get(selected).getStreamUrl()); + dbController.dislike(name,streamingFilms.get(selected).getStreamUrl()); }else{ - dbController.dislike(Name,newData.get(selected).getStreamUrl()); + dbController.dislike(name,localFilms.get(selected).getStreamUrl()); } - dbController.getFavStatus(Name); + dbController.getFavStatus(name); try { - dbController.refresh(Name, selected); + dbController.refresh(name, selected); } catch (SQLException e) { Alert alert = new Alert(AlertType.ERROR); alert.setTitle("Error"); @@ -674,7 +694,7 @@ public class MainWindowController { }); /** - * TODO fix bug when sort by ASCENDING, wrong order + * FIXME fix bug when sort by ASCENDING, wrong order */ columnRating.sortTypeProperty().addListener(new ChangeListener() { @Override @@ -682,14 +702,15 @@ public class MainWindowController { System.out.println("NAME Clicked -- sortType = " + paramT1 + ", SortType=" + paramT2); ArrayList fav_true = new ArrayList(); ArrayList fav_false = new ArrayList(); - ObservableList helpData; + ObservableList helpData; filterData.removeAll(filterData); +// treeTableViewfilm.getSelectionModel().clearSelection(selected); root.getChildren().remove(0,root.getChildren().size()); if(mode.equals("local")){ - helpData = newData; + helpData = localFilms; }else{ - helpData = streamData; + helpData = streamingFilms; } @@ -720,7 +741,7 @@ public class MainWindowController { System.out.println(filterData.size()); for(int i = 0; i < filterData.size(); i++){ // System.out.println(filterData.get(i).getTitel()+"; "+filterData.get(i).getRating()); - root.getChildren().add(new TreeItem(filterData.get(i))); //add filtered data to root node after search + root.getChildren().add(new TreeItem(filterData.get(i))); //add filtered data to root node after search } } }); @@ -739,41 +760,41 @@ public class MainWindowController { updateBtn.setFont(Font.font("System", 12)); cbLocal.setItems(locals); - //TODO rework! - if(autoUpdate.equals("1")){ + if(autoUpdate){ autoupdateBtn.setSelected(true); - Updater.start(); + try { + Updater.start(); + Updater.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } }else{ autoupdateBtn.setSelected(false); } - - ta1.setWrapText(true); - ta1.setEditable(false); - ta1.setFont(Font.font("System", getSize())); } private void refreshTable(){ if(mode.equals("local")){ - root.getChildren().set(selected, new TreeItem(newData.get(selected))); + root.getChildren().set(selected, new TreeItem(localFilms.get(selected))); }else if(mode.equals("streaming")){ - root.getChildren().set(selected, new TreeItem(streamData.get(selected))); + root.getChildren().set(selected, new TreeItem(streamingFilms.get(selected))); } } void addDataUI(){ if(mode.equals("local")){ - for(int i = 0; i < newData.size(); i++){ - root.getChildren().add(new TreeItem(newData.get(i))); //add data to root-node + for(int i = 0; i < localFilms.size(); i++){ + root.getChildren().add(new TreeItem(localFilms.get(i))); //add data to root-node } - columnRating.setMaxWidth(90); + columnRating.setMaxWidth(85); columnTitel.setMaxWidth(290); treeTableViewfilm.getColumns().get(3).setVisible(false); treeTableViewfilm.getColumns().get(4).setVisible(false); treeTableViewfilm.getColumns().get(5).setVisible(false); treeTableViewfilm.getColumns().get(6).setVisible(false); }else if(mode.equals("streaming")){ - for(int i = 0; i < streamData.size(); i++){ - root.getChildren().add(new TreeItem(streamData.get(i))); //add data to root-node + for(int i = 0; i < streamingFilms.size(); i++){ + root.getChildren().add(new TreeItem(streamingFilms.get(i))); //add data to root-node } columnTitel.setMaxWidth(150); columnResolution.setMaxWidth(65); @@ -790,18 +811,18 @@ public class MainWindowController { void loadStreamingSettings(){ if(getStreamingPath().equals("")||getStreamingPath().equals(null)){ - System.out.println("Kein Pfad angegeben"); //falls der Pfad null oder "" ist + System.out.println("Kein Pfad angegeben"); //if path equals "" or null }else{ String[] entries = new File(getStreamingPath()).list(); for(int i = 0; i < entries.length; i++){ if(entries[i].endsWith(".json")){ String titel = ohneEndung(entries[i]); String data = entries[i]; - streamingData.add(new streamUiData(1,1,1,5.0,"1",titel ,data, imv1)); + streamingData.add(new tableData(1,1,1,5.0,"1",titel ,data, imv1, false)); } } for(int i = 0; i < streamingData.size(); i++){ - streamingRoot.getChildren().add( new TreeItem(streamingData.get(i))); //fügt daten zur Rootnode hinzu + streamingRoot.getChildren().add( new TreeItem(streamingData.get(i))); //adds data to root-node } } } @@ -904,7 +925,7 @@ public class MainWindowController { void setLocalUI(){ switch(getLocal()){ case "en_US": - bundle = ResourceBundle.getBundle("recources.HomeFlix-Local", Locale.US); //us_english + bundle = ResourceBundle.getBundle("recources.HomeFlix-Local", Locale.US); //us_English cbLocal.getSelectionModel().select(0); break; case "de_DE": @@ -970,6 +991,7 @@ public class MainWindowController { alert.setTitle("Error"); alert.setHeaderText(""); alert.setContentText(msg); + alert.initOwner(main.primaryStage); // Create expandable Exception. StringWriter sw = new StringWriter(); @@ -1000,11 +1022,12 @@ public class MainWindowController { //saves the Settings public void saveSettings(){ + System.out.println("saving settings ..."); OutputStream outputStream; //new output-stream try { props.setProperty("path", getPath()); //writes path into property props.setProperty("color", getColor()); - props.setProperty("autoUpdate", getAutoUpdate()); + props.setProperty("autoUpdate", String.valueOf(isAutoUpdate())); props.setProperty("size", getSize().toString()); props.setProperty("local", getLocal()); props.setProperty("streamingPath", getStreamingPath()); @@ -1036,21 +1059,33 @@ public class MainWindowController { inputStream = new FileInputStream(fileWin); } props.loadFromXML(inputStream); //new input-stream from .xml - path = props.getProperty("path"); //reads path from property + path = props.getProperty("path"); //read path from property streamingPath = props.getProperty("streamingPath"); color = props.getProperty("color"); size = Double.parseDouble(props.getProperty("size")); - autoUpdate = props.getProperty("autoUpdate"); + autoUpdate = Boolean.parseBoolean(props.getProperty("autoUpdate")); local = props.getProperty("local"); - mode = props.getProperty("mode"); ratingSortType = props.getProperty("ratingSortType"); + + switch (props.getProperty("mode")) { + case "local": + mode = "local"; + break; + case "streaming": + mode = "streaming"; + break; + default: + mode = "local"; + break; + } + inputStream.close(); } catch (IOException e) { if(firststart == false){ showErrorMsg(errorSave, e); e.printStackTrace(); } -// showErrorMsg(errorLoad, e); //TODO das soll beim ersten start nicht erscheinen +// showErrorMsg(errorLoad, e); //TODO This should not be visible at first startup } } @@ -1095,11 +1130,11 @@ public class MainWindowController { return size; } - public void setAutoUpdate(String input){ + public void setAutoUpdate(boolean input){ this.autoUpdate = input; } - public String getAutoUpdate(){ + public boolean isAutoUpdate(){ return autoUpdate; } @@ -1118,4 +1153,12 @@ public class MainWindowController { public String getMode(){ return mode; } + + public String getCurrentWorkingDirectory() { + return currentWorkingDirectory; + } + + public void setCurrentWorkingDirectory(String currentWorkingDirectory) { + this.currentWorkingDirectory = currentWorkingDirectory; + } } diff --git a/src/application/apiQuery.java b/src/application/apiQuery.java index dc66933..0196a0c 100644 --- a/src/application/apiQuery.java +++ b/src/application/apiQuery.java @@ -1,54 +1,67 @@ /** * apiQuery for Project HomeFlix * sends a query to the omdb api - * - * TODO build in a caching function */ package application; -import java.io.DataInputStream; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.BufferedReader; +import java.io.File; import java.io.InputStream; +import java.io.InputStreamReader; import java.net.URL; +import java.util.ArrayList; import java.util.Scanner; +import javax.imageio.ImageIO; + import com.eclipsesource.json.Json; import com.eclipsesource.json.JsonObject; -import javafx.collections.ObservableList; -import javafx.scene.Node; import javafx.scene.image.Image; -import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.FontWeight; import javafx.scene.text.Text; public class apiQuery{ - public apiQuery(MainWindowController m){ + public apiQuery(MainWindowController m, DBController db, Main main){ mainWindowController=m; + dbController=db; + this.main = main; } private MainWindowController mainWindowController; + private DBController dbController; + private Main main; private Image im; - private int fontSize = 20; - private String fontFamily = "System"; + private String[] responseString = new String[20]; + private String posterCache; + private String apiURL = "https://www.omdbapi.com/?"; + ArrayList responseText = new ArrayList(); + ArrayList nameText = new ArrayList(); - @SuppressWarnings("deprecation") //TODO - void startQuery(String input){ - URL url = null; + void startQuery(String titel, String streamUrl){ + URL queryURL = null; Scanner sc = null; - String apiurl = "https://www.omdbapi.com/?"; //API URL String moviename = null; - String dataurl = null; String retdata = null; + String posterPath = null; InputStream is = null; - DataInputStream dis = null; + BufferedReader br = null; + String fontFamily = main.getFONT_FAMILY(); + posterCache = main.getPosterCache().toString(); + int fontSize = (int) Math.round(mainWindowController.size); + + responseText.removeAll(responseText); + nameText.removeAll(nameText); try { //get film title sc = new Scanner(System.in); - moviename = input; + moviename = titel; // in case of no or "" Film title if (moviename == null || moviename.equals("")) { @@ -58,171 +71,120 @@ public class apiQuery{ //remove unwanted blank moviename = moviename.trim(); - //replace blank with + for api-query + //replace blank with + moviename = moviename.replace(" ", "+"); - //URL wird zusammengestellt abfragetypen: http,json,xml (muss json sein um späteres trennen zu ermöglichen) - dataurl = apiurl + "t=" + moviename + "&plot=full&r=json"; + //queryURL is apiURL and additional parameters, response-types: http,json,xml (must be json, since the response is processed with minimal-json ) + queryURL = new URL(apiURL + "t=" + moviename + "&plot=full&r=json"); + is = queryURL.openStream(); + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); - url = new URL(dataurl); - is = url.openStream(); - dis = new DataInputStream(is); - - // lesen der Daten aus dem Antwort Stream - while ((retdata = dis.readLine()) != null) { - //retdata in json object parsen und anschließend das json Objekt "zerschneiden" + //read data from response Stream + while ((retdata = br.readLine()) != null) { + //cut the json response into separate strings System.out.println(retdata); JsonObject object = Json.parse(retdata).asObject(); - String titelV = object.getString("Title", ""); - String yearV = object.getString("Year", ""); - String ratedV = object.getString("Rated", ""); - String releasedV = object.getString("Released", ""); - String runtimeV = object.getString("Runtime", ""); - String genreV = object.getString("Genre", ""); - String directorV = object.getString("Director", ""); - String writerV = object.getString("Writer", ""); - String actorsV = object.getString("Actors", ""); - String plotV = object.getString("Plot", ""); - String languageV = object.getString("Language", ""); - String countryV = object.getString("Country", ""); - String awardsV = object.getString("Awards", ""); - - String metascoreV = object.getString("Metascore", ""); - String imdbRatingV = object.getString("imdbRating", ""); - @SuppressWarnings("unused") - String imdbVotesV = object.getString("imdbVotes", ""); - @SuppressWarnings("unused") - String imdbIDV = object.getString("imdbID", ""); - String typeV = object.getString("Type", ""); - String posterURL = object.getString("Poster", ""); - String response = object.getString("Response", ""); + responseString[0] = object.getString("Title", ""); + responseString[1] = object.getString("Year", ""); + responseString[2] = object.getString("Rated", ""); + responseString[3] = object.getString("Released", ""); + responseString[4] = object.getString("Runtime", ""); + responseString[5] = object.getString("Genre", ""); + responseString[6] = object.getString("Director", ""); + responseString[7] = object.getString("Writer", ""); + responseString[8] = object.getString("Actors", ""); + responseString[9] = object.getString("Plot", ""); + responseString[10] = object.getString("Language", ""); + responseString[11] = object.getString("Country", ""); + responseString[12] = object.getString("Awards", ""); + responseString[13] = object.getString("Metascore", ""); + responseString[14] = object.getString("imdbRating", ""); + responseString[15] = object.getString("Type", ""); + responseString[16] = object.getString("imdbVotes", ""); + responseString[17] = object.getString("imdbID", ""); + responseString[18] = object.getString("Poster", ""); + responseString[19] = object.getString("Response", ""); -// Text titelR = new Text (object.getString("Title", "")+"\n"); -// titelR.setFont(Font.font (fontFamily, fontSize)); -// Text yearR = new Text (object.getString("Year", "")+"\n"); -// yearR.setFont(Font.font (fontFamily, fontSize)); -// Text ratedR = new Text (object.getString("Rated", "")+"\n"); -// ratedR.setFont(Font.font (fontFamily, fontSize)); -// Text releasedR = new Text (object.getString("Released", "")+"\n"); -// releasedR.setFont(Font.font (fontFamily, fontSize)); -// Text runtimeR = new Text (object.getString("Runtime", "")+"\n"); -// runtimeR.setFont(Font.font (fontFamily, fontSize)); -// Text genreR = new Text (object.getString("Genre", "")); -// genreR.setFont(Font.font (fontFamily, fontSize)); -// Text directorR = new Text (object.getString("Director", "")+"\n"); -// directorR.setFont(Font.font (fontFamily, fontSize)); -// Text writerR = new Text (object.getString("Writer", "")+"\n"); -// writerR.setFont(Font.font (fontFamily, fontSize)); -// Text actorsR = new Text (object.getString("Actors", "")+"\n"); -// actorsR.setFont(Font.font (fontFamily, fontSize)); -// Text plotR = new Text (object.getString("Plot", "")+"\n"); -// plotR.setFont(Font.font (fontFamily, fontSize)); -// Text languageR = new Text (object.getString("Language", "")+"\n"); -// languageR.setFont(Font.font (fontFamily, fontSize)); -// Text countryR = new Text (object.getString("Country", "")+"\n"); -// countryR.setFont(Font.font (fontFamily, fontSize)); -// Text awardsR = new Text (object.getString("Awards", "")+"\n"); -// awardsR.setFont(Font.font (fontFamily, fontSize)); -// Text metascoreR = new Text (object.getString("Metascore", "")+"\n"); -// metascoreR.setFont(Font.font (fontFamily, fontSize)); -// Text imdbRatingR = new Text (object.getString("imdbRating", "")+"\n"); -// imdbRatingR.setFont(Font.font (fontFamily, fontSize)); -// @SuppressWarnings("unused") -// Text imdbVotesR = new Text (object.getString("imdbVotes", "")+"\n"); -// imdbVotesR.setFont(Font.font (fontFamily, fontSize)); -// @SuppressWarnings("unused") -// Text imdbIDR = new Text (object.getString("imdbID", "")+"\n"); -// imdbIDR.setFont(Font.font (fontFamily, fontSize)); -// Text typeR = new Text (object.getString("Type", "")+"\n"); -// typeR.setFont(Font.font (fontFamily, fontSize)); + //adding poster to cache + BufferedImage originalImage = ImageIO.read(new URL(responseString[18]));//change path to where file is located + int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType(); + BufferedImage resizeImagePNG = resizeImage(originalImage, type, 198, 297); + if(System.getProperty("os.name").equals("Linux")) { + posterPath = posterCache+"/"+titel+".png"; + ImageIO.write(resizeImagePNG, "png", new File(posterCache+"/"+titel+".png")); //change path where you want it saved + } else { + ImageIO.write(resizeImagePNG, "png", new File(posterCache+"\\"+titel+".png")); //change path where you want it saved + posterPath = posterCache+"\\"+titel+".png"; + } + System.out.println("adding poster to cache: "+posterPath); + //adding strings to the cache + dbController.addCache( streamUrl, responseString[0], responseString[1],responseString[2], responseString[3], responseString[4], responseString[5], + responseString[6], responseString[7], responseString[8], responseString[9], responseString[10],responseString[11], responseString[12], + responseString[13], responseString[14], responseString[15], responseString[16], responseString[17], posterPath, + responseString[19]); + dbController.setCached(streamUrl); - if(response.equals("False")){ - mainWindowController.ta1.appendText(mainWindowController.noFilmFound); + for(int i=0; i<20; i++){ + Text text = new Text(responseString[i]+"\n"); + responseText.add(text); + responseText.get(i).setFont(Font.font(fontFamily, fontSize)); + } + + //if response == false then show mainWindowController.noFilmFound else create new Texts and add them to flowText + if(responseString[19].equals("False")){ + mainWindowController.textFlow.getChildren().add(new Text(mainWindowController.noFilmFound)); im = new Image("recources/icons/close_black_2048x2048.png"); mainWindowController.image1.setImage(im); }else{ - //ausgabe des Textes in ta1 in jeweils neuer Zeile - mainWindowController.ta1.appendText(mainWindowController.title+": "+titelV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.year+": "+ yearV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.rating+": "+ratedV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.publishedOn+": "+releasedV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.duration+": "+runtimeV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.genre+": "+genreV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.director+": "+directorV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.writer+": "+writerV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.actors+": "+actorsV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.plot+": "+plotV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.language+": "+languageV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.country+": "+countryV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.awards+": "+awardsV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.metascore+": "+metascoreV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.imdbRating+": "+imdbRatingV+"\n"); - mainWindowController.ta1.appendText(mainWindowController.type+": "+typeV+"\n"); + // + nameText.add(0, new Text(mainWindowController.title+": ")); + nameText.add(1, new Text(mainWindowController.year+": ")); + nameText.add(2, new Text(mainWindowController.rating+": ")); + nameText.add(3, new Text(mainWindowController.publishedOn+": ")); + nameText.add(4, new Text(mainWindowController.duration+": ")); + nameText.add(5, new Text(mainWindowController.genre+": ")); + nameText.add(6, new Text(mainWindowController.director+": ")); + nameText.add(7, new Text(mainWindowController.writer+": ")); + nameText.add(8, new Text(mainWindowController.actors+": ")); + nameText.add(9, new Text(mainWindowController.plot+": ")); + nameText.add(10, new Text(mainWindowController.language+": ")); + nameText.add(11, new Text(mainWindowController.country+": ")); + nameText.add(12, new Text(mainWindowController.awards+": ")); + nameText.add(13, new Text(mainWindowController.metascore+": ")); + nameText.add(14, new Text(mainWindowController.imdbRating+": ")); + nameText.add(15, new Text(mainWindowController.type+": ")); + + + for(int i=0; i list = mainWindowController.textFlow.getChildren(); -// -// list.addAll(title,titelR,year,yearR,rating,ratedR, -// publishedOn,releasedR,duration,runtimeR,genre,genreR,director,directorR,writer,writerR, -// actors,actorsR,plot,plotR,language,languageR,country,countryR,awards,awardsR,metascore, -// metascoreR,imdbRating,imdbRatingR,type,typeR); -// - - if(posterURL.equals("N/A")){ + for(int i=0;i image = new SimpleObjectProperty<>(); + private final BooleanProperty cached = new SimpleBooleanProperty(); - //uiData ist der Typ der Daten in der TreeTabelView - public streamUiData (final int year, final int season, final int episode, final double rating, final String resolution, final String titel, final String streamUrl, final ImageView image) { + /** + * tableData is the data-type of tree-table-view + * @param year: the release year of the film + * @param season: season if it's a series + * @param episode: episode if it's a series + * @param rating: indicator for favourites, used for sorting the items + * @param resolution: resolution of the film + * @param titel: title of the film + * @param streamUrl: the concrete path to the file or the URL + * @param image: the favourite icon + * @param cached: indicator for caching status + */ + public tableData (final int year, final int season, final int episode, final double rating, final String resolution, final String title, final String streamUrl, final ImageView image, final boolean cached) { this.year.set(year); this.season.set(season); this.episode.set(episode); this.rating.set(rating); this.resolution.set(resolution); - this.titel.set(titel); + this.title.set(title); this.streamUrl.set(streamUrl); this.image.set(image); + this.cached.set(cached); } public IntegerProperty yearProperty(){ @@ -52,8 +66,8 @@ public class streamUiData { return resolution; } - public StringProperty titelProperty(){ - return titel; + public StringProperty titleProperty(){ + return title; } public StringProperty streamUrlProperty(){ @@ -64,6 +78,10 @@ public class streamUiData { return image; } + public BooleanProperty cachedProperty(){ + return cached; + } + public final int getYear() { return yearProperty().get(); @@ -85,8 +103,8 @@ public class streamUiData { return resolutionProperty().get(); } - public final String getTitel() { - return titelProperty().get(); + public final String getTitle() { + return titleProperty().get(); } public final String getStreamUrl() { @@ -96,6 +114,10 @@ public class streamUiData { public final ImageView getImage() { return imageProperty().get(); } + + public final boolean getCached(){ + return cachedProperty().get(); + } public final void setYear(int year) { @@ -118,8 +140,8 @@ public class streamUiData { resolutionProperty().set(resolution); } - public final void setTitel(String titel) { - titelProperty().set(titel); + public final void setTitle(String title) { + titleProperty().set(title); } public final void setStreamUrl(String streamUrl) { @@ -129,4 +151,8 @@ public class streamUiData { public final void setImage(ImageView image) { imageProperty().set(image); } + + public final void setCached(boolean cached){ + cachedProperty().set(cached); + } } diff --git a/src/application/updater.java b/src/application/updater.java index 5425c8f..bab88d9 100644 --- a/src/application/updater.java +++ b/src/application/updater.java @@ -5,61 +5,78 @@ package application; import java.io.BufferedReader; -import java.io.FileOutputStream; +import java.io.File; import java.io.IOException; import java.io.InputStreamReader; +import java.net.HttpURLConnection; import java.net.URL; -import java.nio.channels.Channels; -import java.nio.channels.ReadableByteChannel; +import javax.swing.ProgressMonitor; +import javax.swing.ProgressMonitorInputStream; + +import org.apache.commons.io.FileUtils; + +import javafx.application.Platform; public class updater extends Thread{ private MainWindowController mainWindowController; private String buildURL; private String downloadLink; - private String aktBuildNumber; + private String updateBuildNumber; private String buildNumber; - public updater(MainWindowController m, String buildURL,String downloadLink,String aktBuildNumber,String buildNumber){ + public updater(MainWindowController m, String buildURL,String downloadLink,String buildNumber){ mainWindowController=m; this.buildURL=buildURL; this.downloadLink=downloadLink; - this.aktBuildNumber=aktBuildNumber; this.buildNumber=buildNumber; } public void run(){ System.out.println("check for updates ..."); + Platform.runLater(() -> { + mainWindowController.updateBtn.setText(mainWindowController.bundle.getString("checkingUpdates")); + }); try { - URL url = new URL(buildURL); //URL der Datei mit aktueller Versionsnummer + URL url = new URL(buildURL); //URL of the text file with the current build number BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); - aktBuildNumber = in.readLine(); //schreibt inputstream in String + updateBuildNumber = in.readLine(); //write InputStream in String in.close(); } catch (IOException e1) { mainWindowController.showErrorMsg(mainWindowController.errorUpdateV, e1); } - System.out.println("Build: "+buildNumber+", Update: "+aktBuildNumber); + System.out.println("Build: "+buildNumber+", Update: "+updateBuildNumber); - //vergleicht die Versionsnummern, bei aktversion > version wird ein Update durchgrf�hrt + //Compares the program BuildNumber with the current BuildNumber if program BuildNumber < current BuildNumber then perform a update int iversion = Integer.parseInt(buildNumber); - int iaktVersion = Integer.parseInt(aktBuildNumber.replace(".", "")); + int iaktVersion = Integer.parseInt(updateBuildNumber.replace(".", "")); if(iversion >= iaktVersion){ -// mainWindowController.updateBtn.setText(mainWindowController.bundle.getString("updateBtnNotavail")); + Platform.runLater(() -> { + mainWindowController.updateBtn.setText(mainWindowController.bundle.getString("updateBtnNotavail")); + }); System.out.println("no update available"); }else{ -// mainWindowController.updateBtn.setText(mainWindowController.bundle.getString("updateBtnavail")); + Platform.runLater(() -> { + mainWindowController.updateBtn.setText(mainWindowController.bundle.getString("updateBtnavail")); + }); System.out.println("update available"); try { - URL website; + //get the download-Data URL URL downloadURL = new URL(downloadLink); BufferedReader in = new BufferedReader(new InputStreamReader(downloadURL.openStream())); String updateDataURL = in.readLine(); - website = new URL(updateDataURL); //Update URL - ReadableByteChannel rbc = Channels.newChannel(website.openStream()); //open new Stream/Channel - FileOutputStream fos = new FileOutputStream("ProjectHomeFlix.jar"); //nea fileoutputstram for ProjectHomeFLix.jar - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); //gets file from 0 to max size - fos.close(); //close fos (extrem wichtig!) + + //open new Http connection, ProgressMonitorInputStream for downloading the data + HttpURLConnection conn = (HttpURLConnection) new URL(updateDataURL).openConnection(); + ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(null, "Downloading...", conn.getInputStream()); + ProgressMonitor pm = pmis.getProgressMonitor(); + pm.setMillisToDecideToPopup(0); + pm.setMillisToPopup(0); + pm.setMinimum(0);// tell the progress bar that we start at the beginning of the stream + pm.setMaximum(conn.getContentLength());// tell the progress bar the total number of bytes we are going to read. + FileUtils.copyInputStreamToFile(pmis, new File("ProjectHomeFlix.jar")); + Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //start again System.exit(0); //finishes itself } catch (IOException e) { diff --git a/src/libraries/commons-io-2.5.jar b/src/libraries/commons-io-2.5.jar new file mode 100644 index 0000000..107b061 Binary files /dev/null and b/src/libraries/commons-io-2.5.jar differ diff --git a/src/libraries/commons-lang3-3.5.jar b/src/libraries/commons-lang3-3.5.jar deleted file mode 100644 index 6328c8d..0000000 Binary files a/src/libraries/commons-lang3-3.5.jar and /dev/null differ diff --git a/src/libraries/jfoenix-1.2.0.jar b/src/libraries/jfoenix-1.2.0.jar deleted file mode 100644 index 550230d..0000000 Binary files a/src/libraries/jfoenix-1.2.0.jar and /dev/null differ diff --git a/src/libraries/jfoenix-1.3.0.jar b/src/libraries/jfoenix-1.3.0.jar new file mode 100644 index 0000000..37e7860 Binary files /dev/null and b/src/libraries/jfoenix-1.3.0.jar differ diff --git a/src/recources/HomeFlix-Local_de_DE.properties b/src/recources/HomeFlix-Local_de_DE.properties index 4fb3706..bfa591e 100644 --- a/src/recources/HomeFlix-Local_de_DE.properties +++ b/src/recources/HomeFlix-Local_de_DE.properties @@ -8,6 +8,7 @@ openFolder = Ordner \u00F6ffnen chooseFolder = Ordner ausw\u00E4hlen fontSize = Schriftgr\u00F6\u00DFe: checkUpdates = Auf Update pr\u00FCfen +checkingUpdates = Es wird nach Updates gesucht... updateBtnavail = Update verf\u00FCgbar updateBtnNotavail = Kein Update verf\u00FCgbar autoUpdate = beim Start nach Updates suchen: diff --git a/src/recources/HomeFlix-Local_en_US.properties b/src/recources/HomeFlix-Local_en_US.properties index 41de6ea..e221122 100644 --- a/src/recources/HomeFlix-Local_en_US.properties +++ b/src/recources/HomeFlix-Local_en_US.properties @@ -8,6 +8,7 @@ openFolder = open Folder chooseFolder = choose Directory fontSize = font size: checkUpdates = check for updates +checkingUpdates = checking for updates... updateBtnavail = update available updateBtnNotavail = no update available autoUpdate = check at startup for updates: diff --git a/updates/ProjectHomeFlix.jar b/updates/ProjectHomeFlix.jar index b2974ab..0455025 100644 Binary files a/updates/ProjectHomeFlix.jar and b/updates/ProjectHomeFlix.jar differ diff --git a/updates/buildNumber.txt b/updates/buildNumber.txt index 5bc6609..d136d6a 100644 --- a/updates/buildNumber.txt +++ b/updates/buildNumber.txt @@ -1 +1 @@ -117 +125