From bef90522cacd932c31606bfa423f8c0c8781fa09 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Mon, 6 Mar 2017 17:59:44 +0100 Subject: [PATCH] added cache added a caching function for the omdb api --- bin/application/DBController.class | Bin 14607 -> 18591 bytes bin/application/MainWindowController$1.class | Bin 2524 -> 3527 bytes bin/application/MainWindowController$2.class | Bin 3055 -> 3056 bytes bin/application/MainWindowController$3.class | Bin 2002 -> 2002 bytes bin/application/MainWindowController$4.class | Bin 1991 -> 1991 bytes bin/application/MainWindowController$5.class | Bin 2508 -> 2511 bytes bin/application/MainWindowController$6.class | Bin 2468 -> 2471 bytes bin/application/MainWindowController$7.class | Bin 4117 -> 4118 bytes bin/application/MainWindowController.class | Bin 35284 -> 35394 bytes bin/application/apiQuery.class | Bin 5810 -> 6669 bytes bin/application/streamUiData.class | Bin 4238 -> 0 bytes bin/application/tableData.class | Bin 0 -> 4770 bytes src/application/DBController.java | 161 ++++++++++++++---- src/application/MainWindowController.java | 113 ++++++------ src/application/apiQuery.java | 32 ++-- .../{streamUiData.java => tableData.java} | 23 ++- 16 files changed, 229 insertions(+), 100 deletions(-) delete mode 100644 bin/application/streamUiData.class create mode 100644 bin/application/tableData.class rename src/application/{streamUiData.java => tableData.java} (81%) diff --git a/bin/application/DBController.class b/bin/application/DBController.class index 4a9c4893005f0dd8b9403cc96e898b2c42471d0e..a1a5c4298316988181f66d1778378f3bdffd633e 100644 GIT binary patch literal 18591 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 K2S_Tl{(k^L)z(b_ delta 6017 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 diff --git a/bin/application/MainWindowController$1.class b/bin/application/MainWindowController$1.class index 68b1b574c5c60ec35d84e17fb7c3849b0ac1025b..181a88f59c7dd7c7773eca0da63ae901d5ea24c0 100644 GIT binary patch delta 1306 zcmbtU+iw(A82_Eq?auCaK-iWP%1a9k6cVyrDwb{pZ3{2d6f7~Z7~phvy6iH$v&_tv zi^3v`+(j7`>K#!EaxIiC9`Tf4{_kG!i zb-&M^_Q&71e+AHndm1>y9KV^(8C^P2%a;3(B6EEitt-c{g`w864Qc7Lxl7&pNcOYjPUTQ&q9E}(h$Y3jj9we{HT6qee8$=K8Od7UjQEb*O zxRmCa&X63i%$}_4rCve~mWFK%&ABpRKQ~$+k4}b~jOl5xsUBG@T3JIX} z6tG>u0hJJ^&@O3gHK~o7R#j^WJ2VV2Oncf%-!9iP^8)3a*hOJ>$s_2n)2y9b=VS|B zpXZn|pVIIiLqk=jN6t)VDQl%oCx$%?^_DHuWNR99?0l1_%B2j((lA`aobm zHZjDcVVJJl(yrVe2^`pfk4bFm$t+O0i>k#YegaJ`sM0?)O>(Cc#vy^jI6}al9XhF; zRvPS#@-cj(;W$HGQ2KwH5;%c=2Cb<2v0nR_>05#C@I6^46sctY%QZ(399dF|o zfs450UyY7Wozmw?W80guxIt}{pVkhu+x}nLMV%)Qp&!`0{@K``a$<7@au~UVV-RC7 z)o}~S31m5bL!pA=FqU11cL%%QNxVOfyI%`2~1phbYhTge1K+601 delta 292 zcmXYq%`U`X7=@p&Ez^G5_^FWTtdv;HQW)YIBw}M>Lsc=1zi9_UEM;Qry9}!)lku~# zl~`L!+=0Xmh)>zP=XuXb&UvZ4`$MnaPtU+Cmn95As3t_1&ph^tMfG7#s!zK-7O>$G zu_>^lI8M@ZYC%vd;=z93mTa+IB2k`G4t7`*$TW+Z*-9&Ewk507UG~^l*Ur6Kk{xlb z-sGJW9wwGvR_bQpDy(*KA6V}Z|5BG_v&U|(W0PThr*YJmTdB{{F>2fz^NeV>`d5I@ xsQz>n4Gs_m9dd+G(6J_y6V2{_)}X1$BGsNj#(1GEPPJMDoY7Xf=bIOn^8-V*I{5$q diff --git a/bin/application/MainWindowController$2.class b/bin/application/MainWindowController$2.class index 24ed899cba3fcb46103d52cc5aabe8f82138b015..70f04c3a71e34510a2297776ea5a1b2d1a267714 100644 GIT binary patch delta 216 zcmaDa{y}_$Ez@LUR-?^%O#X~K9Er)vsl~-A=8OzxlO0%9C%_?EoLG{XpQm4vn3R(``94c5qtRwtRuM)P zV@3v5pm8djE7_zN8Eq!#GAT{o#?HqIR=D{LdnY4f_~tOqU`EGi1`(zh24ki;1}CO? z25+VW20x}mhH$17hFGRlh9;&ohS@;&DyA%k4NTb#H-PjTrd&p5raVR-rhGAwvU31~ZMx3XF=A-!SKJv*)Fj zyCjw*GBPMn&SO%Z+{wbj%~f1dl$w|e5}v$-MORcJv7jI)GdZy&Ge1usA{UxD`7ulE zWH%AWV8nwr8IdLJ0Ay3_2#qeos5hgo5MMS86ABXM3{UT zjG6oyoR|U_yqN+S{Fs6m!kI!DVwu7inwY{FW&_!)n4%drFvT$30Mc)m;ux8k;u(3E P5*USFf diff --git a/bin/application/MainWindowController$4.class b/bin/application/MainWindowController$4.class index dbce121c5ad151078805e41ac7fe4dc9fc7c99e7..d91fcede33a4b03df60fd86b8b5090a20a3841db 100644 GIT binary patch delta 46 zcmX@kf1H0q5i_d^BZI2OWCcdW%`=#pnHlRQ&tWU%ZDbH(YGTl0YGyEGYMCs>z7_x* Cjti6k delta 46 zcmX@kf1H0q5i_eXBZI2OWCcdW%`=#pnHlpZ&tWU%En*O1DrV4PDq%2WDxECFz7_x% CdkaVa diff --git a/bin/application/MainWindowController$5.class b/bin/application/MainWindowController$5.class index 1e47f18395507588cb3294f1a5c1b425d98f7aa4..efb4d6a45d3699640fe80c29a3f980d37d64716f 100644 GIT binary patch delta 152 zcmX>jd|r6NbVg2&#N_1E;$ju^$qN}D@beXy6s0ESX6B{4W#;4-PwrvbE+m>*P>_?E zoLG{XpQm4vn3R(`If8j6H&;%6a$*ix+2)_jhD?m6o3+`FF*3GK{>1*oX(B^E(7u!Zej(71K0^4NTJ+wlK|P*v&L+vJ&Si E0372pUH||9 delta 149 zcmX>vd`5V~bVe@D#N_1E;$js;gUJgRA8>OOmlUNY=DH-7Bu?&U+Ab=QSWu9YnVeXX znV+W*kqgb79Kk%3gFP>`9HeaXA7(=)Mw88YY{wWGD<*$s|7}{$z|T~}V98X=V8c|$ xkjB)&P|noE(9hJ&Fqx@^VIET}!xE-8hE+`M3>%m_7`8BVG3;jQo~+8b3IHLKFz)~W diff --git a/bin/application/MainWindowController$6.class b/bin/application/MainWindowController$6.class index ea12f4a8d5468bfef078af3d24ce8a14bcc8ace9..ea8dddff4252ba566cd3c571d2a2092b06847d7d 100644 GIT binary patch delta 152 zcmV;J0B8TC6Q>ifmjMX~VPj)ub8{p&lc53N4-Rv5a%Ev{X>MmmX>4tClZ*nl5*1-^ zaBOK~VRUJ4ZZC9UVr*rTSOc633T$sLwlLDy#o&u@>qynn|ssgM4umY_Bv;waHy8^J2 G`UtB0VKlk` delta 149 zcmZ23yhM1zbVe@D#N_1E;$js;gUJgRA8>OOmlUNY=DH-7Bu?&U+Ab=QSWu9YnVeXX znV+W*kqgb79Kk$?gFP>`9HeaXe`Yo&Mw88KY{wWG`zD`d|7|*vfuCs-gC)~s1{>5m(*lOwObaLf6<@CS@BX=?U`nTt|;6WUyUap&Ns zCR568tHlAU>~0vc#iso?l*!BKspsk0R}WNgO;TjtFigi8(KM#nlu&s{sFA3DEX{Fu z?5|BQjsGWGiQ8F2w`VLn?Jy<9p_CNGNLP>Ixa+2#wlb?fNi-s(eF;66vn@k+t!!q@ z)t7D4?~m?+C&O!4RAi;&R|ayE`OH7n8-2zPXXDtWl4Qs}C9pa3;`N1fVea13=$;E@OL#8V;X5%2zub48JBO~%pJ&7zluSgX*Gie(;5atrgaRiOzRm^m^LyLGi_q1 zVcN`4&$NZ1gJ}mtAJa~TMNGRG)-vs8*ub=hVK-3h6w`i&YfJ|i?lB!?c*1muk%Q?V zqbSo6Mro#_jP^j>x(;3DMKzc9J1;+DC7a6Z|F5?UcOF70F&HbiU0rr diff --git a/bin/application/MainWindowController.class b/bin/application/MainWindowController.class index 76ac61714058823d61180ab0b7e8d5a069837aff..5541174d801cfbb900a81f07203cd7d55b7ac49f 100644 GIT binary patch delta 11282 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 l)AgCe=my{G6%ZiKzzM6|K;f^x(wIvO>a+t|q_ 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 literal 5810 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 EKbL;zhyVZp diff --git a/bin/application/streamUiData.class b/bin/application/streamUiData.class deleted file mode 100644 index 034c7a23777cb748bfda8dbf68a8684acab5881f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4238 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 literal 0 HcmV?d00001 diff --git a/src/application/DBController.java b/src/application/DBController.java index 3dc251a..9e2f3fd 100644 --- a/src/application/DBController.java +++ b/src/application/DBController.java @@ -1,7 +1,6 @@ /** * DBController for Project HomeFlix * connection is in manual commit! - * TODO arraylists not string -> streamUIData */ package application; @@ -57,15 +56,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 +82,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 +141,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 +157,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 +179,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 +187,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 +201,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 @@ -223,9 +232,9 @@ public class DBController { ResultSet rs = stmt.executeQuery("SELECT * FROM film_local"); 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(); @@ -235,9 +244,9 @@ public class DBController { rs = stmt.executeQuery("SELECT * FROM film_streaming;"); 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(5))); }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(5))); } } stmt.close(); @@ -259,9 +268,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 +279,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(5))); }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(5))); } stmt.close(); rs.close(); @@ -313,13 +322,13 @@ public class DBController { 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 treeTableViewfilm; + private TreeTableView treeTableViewfilm; @FXML - private TableView tableViewStreamingdata; + private TableView tableViewStreamingdata; @FXML JFXTextArea ta1; @FXML @@ -159,28 +159,28 @@ 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) @@ -189,7 +189,7 @@ public class MainWindowController { static boolean firststart = false; private int hashA = -2055934614; private String version = "0.5.0"; - private String buildNumber = "117"; + private String buildNumber = "119"; 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"; @@ -213,7 +213,7 @@ public class MainWindowController { private String path; private String streamingPath; private String color; - private String Name; + private String name; private String datPath; private String autoUpdate; private String mode; @@ -244,11 +244,11 @@ public class MainWindowController { private File selectedStreamingFolder; ResourceBundle bundle; - private ObservableList filterData = FXCollections.observableArrayList(); + 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(); + 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")); @@ -338,7 +338,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); } @@ -519,8 +519,8 @@ public class MainWindowController { //"Main" Method called in Main.java main() when starting void setMain(Main main) { Updater = new updater(this,buildURL, downloadLink, aktBuildNumber, buildNumber); - ApiQuery = new apiQuery(this); dbController = new DBController(this); + ApiQuery = new apiQuery(this, dbController); } //Initialize the tables (treeTableViewfilm and tableViewStreamingdata) @@ -554,15 +554,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 + + 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{ + if(streamingFilms.get(selected).getCached()==true){ + System.out.println("loading from cache: "+name); + dbController.readCache(datPath); + }else{ + ApiQuery.startQuery(name,datPath); // start api query + } + } ta1.positionCaret(0); //set cursor position in ta1 } }); @@ -584,14 +599,14 @@ 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++){ @@ -601,7 +616,7 @@ public class MainWindowController { } 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"); @@ -633,13 +648,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 +670,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"); @@ -682,14 +697,14 @@ 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); root.getChildren().remove(0,root.getChildren().size()); if(mode.equals("local")){ - helpData = newData; + helpData = localFilms; }else{ - helpData = streamData; + helpData = streamingFilms; } @@ -720,7 +735,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 } } }); @@ -754,16 +769,16 @@ public class MainWindowController { 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); columnTitel.setMaxWidth(290); @@ -772,8 +787,8 @@ public class MainWindowController { 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 +805,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 } } } diff --git a/src/application/apiQuery.java b/src/application/apiQuery.java index dc66933..1fc9c6b 100644 --- a/src/application/apiQuery.java +++ b/src/application/apiQuery.java @@ -1,13 +1,12 @@ /** * 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.io.BufferedReader; import java.io.InputStream; +import java.io.InputStreamReader; import java.net.URL; import java.util.Scanner; @@ -22,19 +21,21 @@ import javafx.scene.text.Font; import javafx.scene.text.FontWeight; import javafx.scene.text.Text; +@SuppressWarnings("unused") //TODO public class apiQuery{ - public apiQuery(MainWindowController m){ + public apiQuery(MainWindowController m, DBController db){ mainWindowController=m; + dbController=db; } private MainWindowController mainWindowController; + private DBController dbController; private Image im; private int fontSize = 20; private String fontFamily = "System"; - @SuppressWarnings("deprecation") //TODO - void startQuery(String input){ + void startQuery(String titel, String streamUrl){ URL url = null; Scanner sc = null; String apiurl = "https://www.omdbapi.com/?"; //API URL @@ -42,13 +43,13 @@ public class apiQuery{ String dataurl = null; String retdata = null; InputStream is = null; - DataInputStream dis = null; + BufferedReader br = null; 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("")) { @@ -66,10 +67,10 @@ public class apiQuery{ url = new URL(dataurl); is = url.openStream(); - dis = new DataInputStream(is); + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); // lesen der Daten aus dem Antwort Stream - while ((retdata = dis.readLine()) != null) { + while ((retdata = br.readLine()) != null) { //retdata in json object parsen und anschließend das json Objekt "zerschneiden" System.out.println(retdata); JsonObject object = Json.parse(retdata).asObject(); @@ -89,15 +90,18 @@ public class apiQuery{ 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", ""); + dbController.addCache( streamUrl, titelV, yearV, ratedV, releasedV, runtimeV, genreV, directorV, writerV, actorsV, plotV, languageV, countryV, + awardsV, metascoreV, imdbRatingV, imdbVotesV, imdbIDV, typeV, posterURL, response); + dbController.setCached(streamUrl); + + // Text titelR = new Text (object.getString("Title", "")+"\n"); // titelR.setFont(Font.font (fontFamily, fontSize)); // Text yearR = new Text (object.getString("Year", "")+"\n"); @@ -221,8 +225,8 @@ public class apiQuery{ } finally { //closes datainputStream, InputStream,Scanner if not already done try { - if (dis != null) { - dis.close(); + if (br != null) { + br.close(); } if (is != null) { diff --git a/src/application/streamUiData.java b/src/application/tableData.java similarity index 81% rename from src/application/streamUiData.java rename to src/application/tableData.java index 8f801c5..1ea97ef 100644 --- a/src/application/streamUiData.java +++ b/src/application/tableData.java @@ -1,7 +1,9 @@ package application; +import javafx.beans.property.BooleanProperty; import javafx.beans.property.DoubleProperty; import javafx.beans.property.IntegerProperty; +import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleObjectProperty; @@ -9,8 +11,7 @@ import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.scene.image.ImageView; -public class streamUiData { - +public class tableData { private final IntegerProperty year = new SimpleIntegerProperty(); private final IntegerProperty season = new SimpleIntegerProperty(); private final IntegerProperty episode = new SimpleIntegerProperty(); @@ -19,9 +20,10 @@ public class streamUiData { private final StringProperty titel = new SimpleStringProperty(); private final StringProperty streamUrl = new SimpleStringProperty(); private final SimpleObjectProperty 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 + public tableData (final int year, final int season, final int episode, final double rating, final String resolution, final String titel, final String streamUrl, final ImageView image, final boolean cached) { this.year.set(year); this.season.set(season); this.episode.set(episode); @@ -30,6 +32,7 @@ public class streamUiData { this.titel.set(titel); this.streamUrl.set(streamUrl); this.image.set(image); + this.cached.set(cached); } public IntegerProperty yearProperty(){ @@ -64,6 +67,10 @@ public class streamUiData { return image; } + public BooleanProperty cachedProperty(){ + return cached; + } + public final int getYear() { return yearProperty().get(); @@ -96,6 +103,10 @@ public class streamUiData { public final ImageView getImage() { return imageProperty().get(); } + + public final boolean getCached(){ + return cachedProperty().get(); + } public final void setYear(int year) { @@ -129,4 +140,8 @@ public class streamUiData { public final void setImage(ImageView image) { imageProperty().set(image); } + + public final void setCached(boolean cached){ + cachedProperty().set(cached); + } }