@ -18,11 +18,11 @@
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston ,
* MA 02110 - 1301 , USA .
* /
package kellerkinder.HomeFlix.controller ;
import java.io.File ;
import java.io.FileNotFoundException ;
import java.io.FileReader ;
import java.io.IOException ;
import java.net.URLConnection ;
import java.sql.Connection ;
@ -37,11 +37,6 @@ import java.util.List;
import org.apache.logging.log4j.LogManager ;
import org.apache.logging.log4j.Logger ;
import com.eclipsesource.json.Json ;
import com.eclipsesource.json.JsonArray ;
import com.eclipsesource.json.JsonObject ;
import com.eclipsesource.json.JsonValue ;
import javafx.collections.ObservableList ;
import javafx.scene.Node ;
import javafx.scene.image.Image ;
@ -51,9 +46,9 @@ import javafx.scene.text.FontWeight;
import javafx.scene.text.Text ;
import kellerkinder.HomeFlix.application.Main ;
import kellerkinder.HomeFlix.application.MainWindowController ;
import kellerkinder.HomeFlix.datatypes.DatabaseDataType ;
import kellerkinder.HomeFlix.datatypes.FilmTabelDataType ;
import kellerkinder.HomeFlix.datatypes.OMDbAPIResponseDataType ;
import kellerkinder.HomeFlix.datatypes.SourceDataType ;
public class DBController {
@ -62,8 +57,8 @@ public class DBController {
private String DB_PATH ;
private Image favorite_black = new Image ( "icons/ic_favorite_black_18dp_1x.png" ) ;
private Image favorite_border_black = new Image ( "icons/ic_favorite_border_black_18dp_1x.png" ) ;
private List < String > films dbStreamURL = new ArrayList < String > ( ) ; // contains all films stored in the database
private List < String > filmsStreamURL = new ArrayList < String > ( ) ; // contains all films from the sources
private List < DatabaseDataType > data base Stream = new ArrayList < DatabaseDataType > ( ) ; // contains all films stored in the database
private List < DatabaseDataType > sourceStreams = new ArrayList < DatabaseDataType > ( ) ; // contains all films from the sources
private Connection connection = null ;
private static final Logger LOGGER = LogManager . getLogger ( DBController . class . getName ( ) ) ;
@ -136,7 +131,9 @@ public class DBController {
Statement stmt = connection . createStatement ( ) ;
ResultSet rs = stmt . executeQuery ( "SELECT * FROM films" ) ;
while ( rs . next ( ) ) {
filmsdbStreamURL . add ( rs . getString ( "streamUrl" ) ) ;
databaseStream . add ( new DatabaseDataType ( rs . getString ( "streamUrl" ) ,
rs . getString ( "title" ) , rs . getString ( "season" ) , rs . getString ( "episode" ) ,
rs . getInt ( "favorite" ) , rs . getBoolean ( "cached" ) , rs . getDouble ( "currentTime" ) ) ) ;
}
stmt . close ( ) ;
rs . close ( ) ;
@ -146,57 +143,11 @@ public class DBController {
}
/ * *
* load sources from sources . json
* if mode = = local , get all files and series - folder from the directory
* else mode must be streaming , read all entries from the streaming file
* load all sources
* /
private void loadSources ( ) {
// remove sources from table
mainWindowController . getSourcesList ( ) . removeAll ( mainWindowController . getSourcesList ( ) ) ;
mainWindowController . getSourceRoot ( ) . getChildren ( ) . removeAll ( mainWindowController . getSourceRoot ( ) . getChildren ( ) ) ;
try {
JsonArray sources = Json . parse ( new FileReader ( main . getDirectory ( ) + "/sources.json" ) ) . asArray ( ) ;
for ( JsonValue source : sources ) {
String path = source . asObject ( ) . getString ( "path" , "" ) ;
String mode = source . asObject ( ) . getString ( "mode" , "" ) ;
mainWindowController . addSourceToTable ( path , mode ) ; // add source to source-table
if ( mode . equals ( "local" ) ) {
for ( File file : new File ( path ) . listFiles ( ) ) {
if ( file . isFile ( ) & & isVideoFile ( file . getPath ( ) ) ) {
filmsStreamURL . add ( file . getPath ( ) ) ;
} else if ( file . isDirectory ( ) ) {
// get all folders (series)
for ( File season : file . listFiles ( ) ) {
if ( season . isDirectory ( ) ) {
for ( File episode : season . listFiles ( ) ) {
if ( ! filmsdbStreamURL . contains ( episode . getPath ( ) ) ) {
filmsStreamURL . add ( episode . getPath ( ) ) ;
}
}
}
}
}
}
LOGGER . info ( "added files from: " + path ) ;
} else {
// getting all entries from the streaming lists
try {
JsonObject object = Json . parse ( new FileReader ( path ) ) . asObject ( ) ;
JsonArray items = object . get ( "entries" ) . asArray ( ) ;
for ( JsonValue item : items ) {
filmsStreamURL . add ( item . asObject ( ) . getString ( "streamUrl" , "" ) ) ;
}
LOGGER . info ( "added films from: " + path ) ;
} catch ( IOException e ) {
LOGGER . error ( e ) ;
}
}
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
SourcesController sourcesController = new SourcesController ( main , mainWindowController ) ;
sourceStreams = sourcesController . loadSources ( ) ;
}
/ * *
@ -204,22 +155,18 @@ public class DBController {
* order entries by title
* /
private void loadDataToFilmsList ( ) {
ImageView imageView ;
LOGGER . info ( "loading data to mwc ..." ) ;
try {
//load local Data
Statement stmt = connection . createStatement ( ) ;
ResultSet rs = stmt . executeQuery ( "SELECT * FROM films ORDER BY title" ) ;
ResultSet rs = stmt . executeQuery ( "SELECT * FROM films ORDER BY title" ) ;
while ( rs . next ( ) ) {
// System.out.println(rs.getString("title") + "Season:" + rs.getString("season") + ":");
if ( rs . getBoolean ( "favorite" ) = = true ) {
mainWindowController . getFilmsList ( ) . add ( new FilmTabelDataType ( rs . getString ( "streamUrl" ) ,
rs . getString ( "title" ) , rs . getString ( "season" ) , rs . getString ( "episode" ) , rs . getBoolean ( "favorite" ) ,
rs . getBoolean ( "cached" ) , new ImageView ( favorite_black ) ) ) ;
} else {
mainWindowController . getFilmsList ( ) . add ( new FilmTabelDataType ( rs . getString ( "streamUrl" ) ,
rs . getString ( "title" ) , rs . getString ( "season" ) , rs . getString ( "episode" ) , rs . getBoolean ( "favorite" ) ,
rs . getBoolean ( "cached" ) , new ImageView ( favorite_border_black ) ) ) ;
}
imageView = rs . getBoolean ( "favorite" ) ? new ImageView ( favorite_black ) : new ImageView ( favorite_border_black ) ;
mainWindowController . getFilmsList ( ) . add ( new FilmTabelDataType ( rs . getString ( "streamUrl" ) ,
rs . getString ( "title" ) , rs . getString ( "season" ) , rs . getString ( "episode" ) , rs . getBoolean ( "favorite" ) ,
rs . getBoolean ( "cached" ) , imageView ) ) ;
}
stmt . close ( ) ;
rs . close ( ) ;
@ -237,24 +184,20 @@ public class DBController {
* @param index of the film in LocalFilms list
* /
public void refresh ( String streamUrl , int indexList ) {
LOGGER . info ( "refresh ..." ) ;
LOGGER . info ( "refresh data for " + streamUrl ) ;
try {
Statement stmt = connection . createStatement ( ) ;
ResultSet rs = stmt . executeQuery ( "SELECT * FROM films WHERE streamUrl = \"" + streamUrl + "\";" ) ;
PreparedStatement ps = connection . prepareStatement ( "SELECT * FROM films WHERE streamUrl = ?" ) ;
ps . setString ( 1 , streamUrl ) ;
ResultSet rs = ps . executeQuery ( ) ;
while ( rs . next ( ) ) {
if ( rs . getBoolean ( "favorite" ) = = true ) {
mainWindowController . getFilmsList ( ) . set ( indexList , new FilmTabelDataType ( rs . getString ( "streamUrl" ) ,
rs . getString ( "title" ) , rs . getString ( "season" ) , rs . getString ( "episode" ) , rs . getBoolean ( "favorite" ) ,
rs . getBoolean ( "cached" ) , new ImageView ( favorite_black ) ) ) ;
} else {
mainWindowController . getFilmsList ( ) . set ( indexList , new FilmTabelDataType ( rs . getString ( "streamUrl" ) ,
rs . getString ( "title" ) , rs . getString ( "season" ) , rs . getString ( "episode" ) , rs . getBoolean ( "favorite" ) ,
rs . getBoolean ( "cached" ) , new ImageView ( favorite_border_black ) ) ) ;
}
ImageView imageView = rs . getBoolean ( "favorite" ) ? new ImageView ( favorite_black ) : new ImageView ( favorite_border_black ) ;
mainWindowController . getFilmsList ( ) . set ( indexList , new FilmTabelDataType ( rs . getString ( "streamUrl" ) ,
rs . getString ( "title" ) , rs . getString ( "season" ) , rs . getString ( "episode" ) , rs . getBoolean ( "favorite" ) ,
rs . getBoolean ( "cached" ) , imageView ) ) ;
}
rs . close ( ) ;
stmt . close ( ) ;
ps . close ( ) ;
} catch ( Exception e ) {
LOGGER . error ( "Ups! error while refreshing mwc!" , e ) ;
}
@ -269,14 +212,13 @@ public class DBController {
LOGGER . info ( "refreshing the Database ..." ) ;
// clean all ArraLists
films dbStreamURL . clear ( ) ;
filmsStreamURL . clear ( ) ;
data base Stream . clear ( ) ;
sourceStreams . clear ( ) ;
loadSources ( ) ; // reload all sources
loadDatabase ( ) ; // reload all films saved in the DB
LOGGER . info ( "films in directory: " + filmsStreamURL . size ( ) ) ;
LOGGER . info ( "filme in db: " + filmsdbStreamURL . size ( ) ) ;
LOGGER . info ( "filme in db: " + databaseStream . size ( ) ) ;
try {
checkAddEntry ( ) ;
@ -285,7 +227,7 @@ public class DBController {
LOGGER . error ( "Error while refreshing the database" , e ) ;
}
// clear the FilmsList and FilmRoot chl idren
// clear the FilmsList and FilmRoot chil dren
mainWindowController . getFilmsList ( ) . clear ( ) ;
mainWindowController . getFilmRoot ( ) . getChildren ( ) . clear ( ) ;
@ -294,25 +236,32 @@ public class DBController {
/ * *
* check if there are any entries that have been removed from the film - directory
* @throws SQLException
* /
private void checkRemoveEntry ( ) {
private void checkRemoveEntry ( ) throws SQLException {
PreparedStatement ps = connection . prepareStatement ( "DELETE FROM films WHERE streamUrl = ?" ) ;
LOGGER . info ( "checking for entrys to remove to DB ..." ) ;
try {
Statement stmt = connection . createStatement ( ) ;
for ( DatabaseDataType dbStreamEntry : databaseStream ) {
// if the directory doen't contain the entry form the database, remove it
for ( String entry : filmsdbStreamURL ) {
// if the directory doen't contain the entry form the db, remove it
if ( ! filmsStreamURL . contains ( entry ) ) {
stmt . executeUpdate ( "delete from films where streamUrl = \"" + entry + "\"" ) ;
connection . commit ( ) ;
LOGGER . info ( "removed \"" + entry + "\" from database" ) ;
}
// if sourceStreams has a item where StreamUrl equals dbStreamEntry.getStreamUrl() return it, else null
DatabaseDataType result = sourceStreams . stream ( )
. filter ( x - > dbStreamEntry . getStreamUrl ( ) . equals ( x . getStreamUrl ( ) ) )
. findAny ( )
. orElse ( null ) ;
// if the result is null, the file is missing, remove it from the database
if ( result = = null ) {
ps . setString ( 1 , dbStreamEntry . getStreamUrl ( ) ) ;
ps . addBatch ( ) ;
LOGGER . info ( "removed \"" + dbStreamEntry . getTitle ( ) + "\" from database" ) ;
}
stmt . close ( ) ;
} catch ( Exception e ) {
LOGGER . error ( e ) ;
}
ps . executeBatch ( ) ;
connection . commit ( ) ;
ps . close ( ) ;
}
/ * *
@ -325,114 +274,33 @@ public class DBController {
PreparedStatement ps = connection . prepareStatement ( "insert into films values (?, ?, ?, ?, ?, ?, ?)" ) ;
LOGGER . info ( "checking for entrys to add to DB ..." ) ;
// source is a single source of the sources list
for ( SourceDataType source : mainWindowController . getSourcesList ( ) ) {
// if it's a local source check the folder for new film
if ( source . getMode ( ) . equals ( "local" ) ) {
for ( File file : new File ( source . getPath ( ) ) . listFiles ( ) ) {
String mimeType = URLConnection . guessContentTypeFromName ( file . getPath ( ) ) ;
// if file is file and has mime type "video"
if ( file . isFile ( ) & & mimeType ! = null & & mimeType . contains ( "video" ) ) {
// get all files (films)
if ( ! filmsdbStreamURL . contains ( file . getPath ( ) ) ) {
ps . setString ( 1 , file . getPath ( ) ) ;
ps . setString ( 2 , cutOffEnd ( file . getName ( ) ) ) ;
ps . setString ( 3 , "" ) ;
ps . setString ( 4 , "" ) ;
ps . setInt ( 5 , 0 ) ;
ps . setBoolean ( 6 , false ) ;
ps . setDouble ( 7 , 0 ) ;
ps . addBatch ( ) ; // adds the entry
LOGGER . info ( "Added \"" + file . getName ( ) + "\" to database" ) ;
filmsdbStreamURL . add ( file . getPath ( ) ) ;
}
} else if ( file . isDirectory ( ) ) {
// get all folders (series)
int sn = 1 ;
for ( File season : file . listFiles ( ) ) {
if ( season . isDirectory ( ) ) {
int ep = getLastEpisode ( cutOffEnd ( file . getName ( ) ) , Integer . toString ( sn ) ) + 1 ;
for ( File episode : season . listFiles ( ) ) {
if ( ! filmsdbStreamURL . contains ( episode . getPath ( ) ) ) {
ps . setString ( 1 , episode . getPath ( ) . replace ( "'" , "''" ) ) ;
ps . setString ( 2 , cutOffEnd ( file . getName ( ) ) ) ; // the title is the series root folder's name
ps . setString ( 3 , Integer . toString ( sn ) ) ;
ps . setString ( 4 , Integer . toString ( ep ) ) ;
ps . setInt ( 5 , 0 ) ;
ps . setBoolean ( 6 , false ) ;
ps . setDouble ( 7 , 0 ) ;
ps . addBatch ( ) ; // adds the entry
LOGGER . info ( "Added \"" + file . getName ( ) + "\", Episode: " + episode . getName ( ) + " to database" ) ;
filmsStreamURL . add ( episode . getPath ( ) ) ;
filmsdbStreamURL . add ( episode . getPath ( ) ) ;
ep + + ;
}
}
sn + + ;
}
}
}
}
} else {
// if it's a streaming source check the file for new films
for ( String entry : filmsStreamURL ) {
if ( ! filmsdbStreamURL . contains ( entry ) ) {
JsonArray items = Json . parse ( new FileReader ( source . getPath ( ) ) ) . asObject ( ) . get ( "entries" ) . asArray ( ) ;
// for each item, check if it's the needed
for ( JsonValue item : items ) {
String streamUrl = item . asObject ( ) . getString ( "streamUrl" , "" ) ;
String title = item . asObject ( ) . getString ( "title" , "" ) ;
// if it's the needed add it to the database
if ( streamUrl . equals ( entry ) ) {
ps . setString ( 1 , streamUrl ) ;
ps . setString ( 2 , title ) ;
ps . setString ( 3 , item . asObject ( ) . getString ( "season" , "" ) ) ;
ps . setString ( 4 , item . asObject ( ) . getString ( "episode" , "" ) ) ;
ps . setInt ( 5 , 0 ) ;
ps . setBoolean ( 6 , false ) ;
ps . setDouble ( 7 , 0 ) ;
ps . addBatch ( ) ; // adds the entry
LOGGER . info ( "Added \"" + title + "\" to database" ) ;
filmsdbStreamURL . add ( streamUrl ) ;
}
}
}
}
ps . executeBatch ( ) ;
connection . commit ( ) ;
ps . close ( ) ;
// new
for ( DatabaseDataType sourceStreamEntry : sourceStreams ) {
// if databaseStream has a item where StreamUrl equals sourceStreamEntry.getStreamUrl() return it, else null
DatabaseDataType result = databaseStream . stream ( )
. filter ( x - > sourceStreamEntry . getStreamUrl ( ) . equals ( x . getStreamUrl ( ) ) )
. findAny ( )
. orElse ( null ) ;
// if the result is null, the entry is missing, add it to the database
if ( result = = null ) {
ps . setString ( 1 , sourceStreamEntry . getStreamUrl ( ) ) ;
ps . setString ( 2 , sourceStreamEntry . getTitle ( ) ) ;
ps . setString ( 3 , sourceStreamEntry . getSeason ( ) ) ;
ps . setString ( 4 , sourceStreamEntry . getEpisode ( ) ) ;
ps . setInt ( 5 , sourceStreamEntry . getFavorite ( ) ) ;
ps . setBoolean ( 6 , sourceStreamEntry . getCached ( ) ) ;
ps . setDouble ( 7 , sourceStreamEntry . getCurrentTime ( ) ) ;
ps . addBatch ( ) ; // adds the entry
LOGGER . info ( "Added \"" + sourceStreamEntry . getTitle ( ) + "\" to database" ) ;
databaseStream . add ( sourceStreamEntry ) ;
}
}
}
/ * *
* gets the last episode of a season of a given series
* @param seriesTitle the actual series
* @param season the actual season
* @return the last episode number
* /
private int getLastEpisode ( String seriesTitle , String season ) {
int lastEpisode = 0 ;
try {
Statement stmt = connection . createStatement ( ) ;
PreparedStatement ps = connection . prepareStatement ( "SELECT * FROM films WHERE title = ? AND season = ?" ) ;
ps . setString ( 1 , seriesTitle ) ;
ps . setString ( 2 , season ) ;
ResultSet rs = ps . executeQuery ( ) ;
while ( rs . next ( ) ) {
if ( Integer . parseInt ( rs . getString ( "episode" ) ) > lastEpisode )
lastEpisode = Integer . parseInt ( rs . getString ( "episode" ) ) ;
}
stmt . close ( ) ;
rs . close ( ) ;
} catch ( SQLException e ) {
LOGGER . error ( "An error occured, while printing all entries" , e ) ;
}
return lastEpisode ;
ps . executeBatch ( ) ;
connection . commit ( ) ;
ps . close ( ) ;
}
/ * *
@ -453,8 +321,8 @@ public class DBController {
System . out . println ( rs . getString ( "cached" ) ) ;
System . out . println ( rs . getString ( "currentTime" ) + "\n" ) ;
}
stmt . close ( ) ;
rs . close ( ) ;
stmt . close ( ) ;
} catch ( SQLException e ) {
LOGGER . error ( "An error occured, while printing all entries" , e ) ;
}
@ -467,10 +335,11 @@ public class DBController {
public void dislike ( String streamUrl ) {
LOGGER . info ( "dislike " + streamUrl ) ;
try {
Statement stmt = connection . createStatement ( ) ;
stmt . executeUpdate ( "UPDATE films SET favorite=0 WHERE streamUrl=\"" + streamUrl + "\";" ) ;
PreparedStatement ps = connection . prepareStatement ( "UPDATE films SET favorite = 0 WHERE streamUrl = ?" ) ;
ps . setString ( 1 , streamUrl ) ;
ps . executeUpdate ( ) ;
connection . commit ( ) ;
stmt . close ( ) ;
p s. close ( ) ;
} catch ( SQLException e ) {
LOGGER . error ( "Ups! an error occured!" , e ) ;
}
@ -483,10 +352,11 @@ public class DBController {
public void like ( String streamUrl ) {
LOGGER . info ( "like " + streamUrl ) ;
try {
Statement stmt = connection . createStatement ( ) ;
stmt . executeUpdate ( "UPDATE films SET favorite = 1 WHERE streamUrl = \"" + streamUrl + "\";" ) ;
PreparedStatement ps = connection . prepareStatement ( "UPDATE films SET favorite = 1 WHERE streamUrl = ?" ) ;
ps . setString ( 1 , streamUrl ) ;
ps . executeUpdate ( ) ;
connection . commit ( ) ;
stmt . close ( ) ;
p s. close ( ) ;
} catch ( SQLException e ) {
LOGGER . error ( "Ups! an error occured!" , e ) ;
}
@ -498,10 +368,11 @@ public class DBController {
* /
public void setCached ( String streamUrl ) {
try {
Statement stmt = connection . createStatement ( ) ;
stmt . executeUpdate ( "UPDATE films SET cached = 1 WHERE streamUrl = \"" + streamUrl + "\";" ) ;
PreparedStatement ps = connection . prepareStatement ( "UPDATE films SET cached = 1 WHERE streamUrl = ?" ) ;
ps . setString ( 1 , streamUrl ) ;
ps . executeUpdate ( ) ;
connection . commit ( ) ;
stmt . close ( ) ;
p s. close ( ) ;
} catch ( SQLException e ) {
LOGGER . error ( "Ups! an error occured!" , e ) ;
}
@ -563,11 +434,12 @@ public class DBController {
public boolean searchCacheByURL ( String streamUrl ) {
boolean retValue = false ;
try {
Statement stmt = connection . createStatement ( ) ;
ResultSet rs = stmt . executeQuery ( "SELECT * FROM cache WHERE streamUrl = \"" + streamUrl + "\";" ) ;
PreparedStatement ps = connection . prepareStatement ( "SELECT * FROM cache WHERE streamUrl = ?" ) ;
ps . setString ( 1 , streamUrl ) ;
ResultSet rs = ps . executeQuery ( ) ;
retValue = rs . next ( ) ;
rs . close ( ) ;
stmt . close ( ) ;
p s. close ( ) ;
} catch ( Exception e ) {
LOGGER . error ( "Ups! error while getting the current time!" , e ) ;
}
@ -581,8 +453,9 @@ public class DBController {
* /
public void readCache ( String streamUrl ) {
try {
Statement stmt = connection . createStatement ( ) ;
ResultSet rs = stmt . executeQuery ( "SELECT * FROM cache WHERE streamUrl=\"" + streamUrl + "\";" ) ;
PreparedStatement ps = connection . prepareStatement ( "SELECT * FROM cache WHERE streamUrl = ?" ) ;
ps . setString ( 1 , streamUrl ) ;
ResultSet rs = ps . executeQuery ( ) ;
Font font = Font . font ( "System" , FontWeight . BOLD , ( int ) Math . round ( mainWindowController . getFontSize ( ) ) ) ;
ObservableList < Node > textFlow = mainWindowController . getTextFlow ( ) . getChildren ( ) ;
ArrayList < Text > nameText = new ArrayList < Text > ( ) ;
@ -650,8 +523,8 @@ public class DBController {
LOGGER . error ( "No Poster found, useing default." ) ;
}
stmt . close ( ) ;
rs . close ( ) ;
ps . close ( ) ;
} catch ( SQLException e ) {
LOGGER . error ( "Ups! an error occured!" , e ) ;
}
@ -686,14 +559,15 @@ public class DBController {
* @return { @link Double } currentTime in ms
* /
public double getCurrentTime ( String streamUrl ) {
LOGGER . info ( "currentTime: " + streamUrl ) ;
LOGGER . info ( "get currentTime: " + streamUrl ) ;
double currentTime = 0 ;
try {
Statement stmt = connection . createStatement ( ) ;
ResultSet rs = stmt . executeQuery ( "SELECT * FROM films WHERE streamUrl = \"" + streamUrl + "\";" ) ;
PreparedStatement ps = connection . prepareStatement ( "SELECT * FROM films WHERE streamUrl = ?" ) ;
ps . setString ( 1 , streamUrl ) ;
ResultSet rs = ps . executeQuery ( ) ;
currentTime = rs . getDouble ( "currentTime" ) ;
rs . close ( ) ;
stmt . close ( ) ;
p s. close ( ) ;
} catch ( Exception e ) {
LOGGER . error ( "Ups! error while getting the current time!" , e ) ;
}
@ -707,69 +581,55 @@ public class DBController {
* @param currentTime currentTime in ms of the film
* /
public void setCurrentTime ( String streamUrl , double currentTime ) {
LOGGER . info ( "currentTime: " + streamUrl ) ;
LOGGER . info ( "set currentTime: " + streamUrl ) ;
try {
Statement stmt = connection . createStatement ( ) ;
stmt . executeUpdate ( "UPDATE films SET currentTime=" + currentTime + " WHERE streamUrl=\"" + streamUrl + "\";" ) ;
PreparedStatement ps = connection . prepareStatement ( "UPDATE films SET currentTime = ? WHERE streamUrl = ?" ) ;
ps . setDouble ( 1 , currentTime ) ;
ps . setString ( 2 , streamUrl ) ;
ps . executeUpdate ( ) ;
connection . commit ( ) ;
stmt . close ( ) ;
p s. close ( ) ;
} catch ( SQLException e ) {
LOGGER . error ( "Ups! an error occured !" , e ) ;
LOGGER . error ( "Ups! error while updateing the current time !" , e ) ;
}
}
/ * *
* get the next episode of a
* @param title URL of the film
* @param nextEp number of the next episode
* get the next episode of a series
* @param title title of the film
* @param episode episode currently played
* @return { @link FilmTabelDataType } the next episode as object
* /
public FilmTabelDataType getNextEpisode ( String title , int episode , int season ) {
FilmTabelDataType nextFilm = null ;
ResultSet rs ;
int nextEpisode = 3000 ;
try {
Statement stmt = connection . createStatement ( ) ;
// try to get a new episode of the current season
PreparedStatement ps = connection . prepareStatement ( "SELECT * FROM films WHERE title = ? AND season = ? AND episode = ?" ) ;
ps . setString ( 1 , title ) ;
ps . setString ( 2 , Integer . toString ( season ) ) ;
ps . setString ( 3 , Integer . toString ( episode + 1 ) ) ;
ResultSet rs = ps . executeQuery ( ) ;
rs = stmt . executeQuery ( "SELECT * FROM films WHERE title = \"" + title + "\" AND season = \"" + season + "\";" ) ;
while ( rs . next ( ) ) {
int rsEpisode = Integer . parseInt ( rs . getString ( "episode" ) ) ;
if ( rsEpisode > episode & & rsEpisode < nextEpisode ) {
// fitting episode found in current season, if rsEpisode < nextEpisode -> nextEpisode = rsEpisode
nextEpisode = rsEpisode ;
nextFilm = new FilmTabelDataType ( rs . getString ( "streamUrl" ) , rs . getString ( "title" ) ,
rs . getString ( "season" ) , rs . getString ( "episode" ) , rs . getBoolean ( "favorite" ) ,
rs . getBoolean ( "cached" ) , new ImageView ( ) ) ;
}
/ * if that fails get the next season and try to get a episode there ,
* we need to test only for the next season , first episode ,
* any other entry would not exist in the database
* /
if ( ! rs . next ( ) ) {
ps . setString ( 1 , title ) ;
ps . setString ( 2 , Integer . toString ( season + 1 ) ) ;
ps . setString ( 3 , Integer . toString ( 1 ) ) ;
rs = ps . executeQuery ( ) ;
if ( ! rs . next ( ) ) return nextFilm ; // if we haven't found anything return an empty object
}
if ( nextFilm = = null ) {
int nextSeason = 3000 ;
rs = stmt . executeQuery ( "SELECT * FROM films WHERE title = \"" + title + "\";" ) ;
while ( rs . next ( ) ) {
int rsSeason = Integer . parseInt ( rs . getString ( "season" ) ) ;
if ( rsSeason > season & & rsSeason < nextSeason ) {
nextSeason = rsSeason ;
}
}
if ( nextSeason ! = 3000 ) {
rs = stmt . executeQuery ( "SELECT * FROM films WHERE title = \"" + title + "\" AND season = \"" + season + "\";" ) ;
while ( rs . next ( ) ) {
int rsEpisode = Integer . parseInt ( rs . getString ( "episode" ) ) ;
if ( rsEpisode > episode & & rsEpisode < nextEpisode ) {
// fitting episode found in current season, if rsEpisode < nextEpisode -> nextEpisode = rsEpisode
nextEpisode = rsEpisode ;
nextFilm = new FilmTabelDataType ( rs . getString ( "streamUrl" ) , rs . getString ( "title" ) ,
rs . getString ( "season" ) , rs . getString ( "episode" ) , rs . getBoolean ( "favorite" ) ,
rs . getBoolean ( "cached" ) , new ImageView ( ) ) ;
}
}
}
}
// at this point we have found the correct episode
nextFilm = new FilmTabelDataType ( rs . getString ( "streamUrl" ) , rs . getString ( "title" ) ,
rs . getString ( "season" ) , rs . getString ( "episode" ) , rs . getBoolean ( "favorite" ) ,
rs . getBoolean ( "cached" ) , new ImageView ( ) ) ;
rs . close ( ) ;
stmt . close ( ) ;
ps . close ( ) ;
} catch ( Exception e ) {
LOGGER . error ( "Ups! error while getting next episode!" , e ) ;
}
@ -810,14 +670,6 @@ public class DBController {
return nextFilm ;
}
// removes the ending
private String cutOffEnd ( String str ) {
if ( str = = null ) return null ;
int pos = str . lastIndexOf ( "." ) ;
if ( pos = = - 1 ) return str ;
return str . substring ( 0 , pos ) ;
}
/ * *
* check if a file is a video
* @param path the path to the file