@ -52,24 +52,18 @@ import kellerkinder.HomeFlix.datatypes.FilmTabelDataType;
public class PlayerController {
@FXML
private MediaView mediaView ;
@FXML private MediaView mediaView ;
@FXML
private VBox bottomVBox ;
@FXML private VBox bottomVBox ;
@FXML
private HBox controlsHBox ;
@FXML private HBox controlsHBox ;
@FXML
private JFXSlider timeSlider ;
@FXML private JFXSlider timeSlider ;
@FXML
private JFXButton stopBtn ;
@FXML
private JFXButton playBtn ;
@FXML
private JFXButton fullscreenBtn ;
@FXML private JFXButton stopBtn ;
@FXML private JFXButton playBtn ;
@FXML private JFXButton fullscreenBtn ;
@FXML private JFXButton nextEpBtn ;
private Player player ;
private MainWindowController mainWCon ;
@ -81,6 +75,9 @@ public class PlayerController {
private double seekTime = 0 ;
private double startTime = 0 ;
private double duration = 0 ;
private int season = 0 ;
private int episode = 0 ;
private int countdown = 0 ;
private boolean mousePressed = false ;
private boolean showControls = true ;
private boolean autoplay ;
@ -123,6 +120,10 @@ public class PlayerController {
width . bind ( Bindings . selectDouble ( mediaView . sceneProperty ( ) , "width" ) ) ;
height . bind ( Bindings . selectDouble ( mediaView . sceneProperty ( ) , "height" ) ) ;
season = ! film . getSeason ( ) . isEmpty ( ) ? Integer . parseInt ( film . getSeason ( ) ) : 0 ;
episode = ! film . getEpisode ( ) . isEmpty ( ) ? Integer . parseInt ( film . getEpisode ( ) ) : 0 ;
// nextEpBtn.setStyle("-fx-button-type: RAISED; -fx-background-color: #" + mainWCon.getColor() + "; -fx-text-fill: WHITE;");
// start the media if the player is ready
mediaPlayer . setOnReady ( new Runnable ( ) {
@Override
@ -141,27 +142,40 @@ public class PlayerController {
@Override
public void changed ( ObservableValue < ? extends Duration > observable , Duration oldValue , Duration newValue ) {
currentTime = newValue . toMillis ( ) ; // set the current time
int episode = ! film . getEpisode ( ) . isEmpty ( ) ? Integer . parseInt ( film . getEpisode ( ) ) : 0 ;
int season = ! film . getSeason ( ) . isEmpty ( ) ? Integer . parseInt ( film . getSeason ( ) ) : 0 ;
// if we are end time -10 seconds, do autoplay, if activated
if ( ( duration - currentTime ) < 10000 & & episode ! = 0 & & autoplay ) {
autoplay = false ;
mainWCon . getDbController ( ) . setCurrentTime ( film . getStreamUrl ( ) , 0 ) ; // reset old video start time
FilmTabelDataType nextFilm = mainWCon . getDbController ( ) . getNextEpisode ( film . getTitle ( ) , episode , season ) ;
if ( nextFilm ! = null ) {
mediaPlayer . stop ( ) ;
init ( mainWCon , player , nextFilm ) ;
autoplay = true ;
double timeToEnd = ( duration - currentTime ) ;
if ( timeToEnd < 20000 & & episode ! = 0 & & autoplay ) {
// show 20 seconds before the end a button (next episode in 10 seconds)
if ( ! nextEpBtn . isVisible ( ) )
nextEpBtn . setVisible ( true ) ;
if ( countdown ! = ( int ) ( ( timeToEnd - 10000 ) / 1000 ) ) {
countdown = ( int ) ( ( timeToEnd - 10000 ) / 1000 ) ;
nextEpBtn . setText ( "next episode in " + countdown + " seconds" ) ; // TODO translate
bottomVBox . setVisible ( true ) ;
}
// if we are end time -10 seconds, do autoplay, if activated
if ( timeToEnd < 10000 ) {
nextEpBtn . setVisible ( false ) ;
autoPlayNewFilm ( ) ;
}
} else if ( ( duration - currentTime ) < 120 ) {
// if we are -20ms stop the media
} else if ( timeToEnd < 120 ) {
// if we are 120ms to the end stop the media
mediaPlayer . stop ( ) ;
mainWCon . getDbController ( ) . setCurrentTime ( film . getStreamUrl ( ) , 0 ) ; // reset old video start time
playBtn . setGraphic ( play_arrow_black ) ;
} else {
if ( nextEpBtn . isVisible ( ) )
nextEpBtn . setVisible ( false ) ;
}
if ( ! mousePressed ) {
timeSlider . setValue ( ( currentTime / 1000 ) / 60 ) ;
// int sec = (int)(currentTime / 1000);
// int min = (int) TimeUnit.SECONDS.toMinutes(sec);
// int remSec = sec - (int)TimeUnit.MINUTES.toSeconds(min);
// System.out.println("\nTime: " + min + ":" + remSec);
}
}
} ) ;
@ -182,7 +196,7 @@ public class PlayerController {
// hide controls timer initialization
final Timer timer = new Timer ( ) ;
TimerTask controlAnimationTask = null ; // task to execute save operation
final long delayTime = 2 000; // hide the controls after 2 seconds
final long delayTime = 3 000; // hide the controls after 2 seconds
@Override
public void handle ( MouseEvent mouseEvent ) {
@ -254,7 +268,6 @@ public class PlayerController {
@FXML
void playBtnAction ( ActionEvent event ) {
if ( mediaPlayer . getStatus ( ) . equals ( Status . PLAYING ) ) {
mediaPlayer . pause ( ) ;
playBtn . setGraphic ( play_arrow_black ) ;
@ -263,6 +276,22 @@ public class PlayerController {
playBtn . setGraphic ( pause_black ) ;
}
}
@FXML
void nextEpBtnAction ( ActionEvent event ) {
autoPlayNewFilm ( ) ;
}
private void autoPlayNewFilm ( ) {
autoplay = false ;
mainWCon . getDbController ( ) . setCurrentTime ( film . getStreamUrl ( ) , 0 ) ; // reset old video start time
FilmTabelDataType nextFilm = mainWCon . getDbController ( ) . getNextEpisode ( film . getTitle ( ) , episode , season ) ;
if ( nextFilm ! = null ) {
mediaPlayer . stop ( ) ;
init ( mainWCon , player , nextFilm ) ;
autoplay = true ;
}
}
public MediaPlayer getMediaPlayer ( ) {
return mediaPlayer ;