From d167b60661741591d8787b7c8285b967be8daca4 Mon Sep 17 00:00:00 2001 From: Jannik Date: Sun, 6 Feb 2022 18:46:19 +0100 Subject: [PATCH] add subtitle support to player; update log4j to version 2.17.1 --- pom.xml | 4 +- .../org/mosad/homeflix/application/Main.java | 2 +- .../application/MainWindowController.java | 2 +- .../homeflix/application/SettingsView.java | 2 +- .../application/view/FilmDetailView.java | 2 +- .../application/view/SeriesDetailView.java | 2 +- .../homeflix/controller/DBController.java | 2 +- .../controller/SourcesController.java | 2 +- .../homeflix/controller/XMLController.java | 2 +- .../homeflix/datatypes/DatabaseDataType.java | 2 +- .../homeflix/datatypes/FilmTabelDataType.java | 2 +- .../homeflix/datatypes/PosterModeElement.java | 2 +- .../homeflix/datatypes/SourceDataType.java | 2 +- .../player/HFMediaPlayerEventListener.java | 2 +- .../org/mosad/homeflix/player/Player.java | 2 +- .../homeflix/player/PlayerController.java | 98 +++++++++++++++---- 16 files changed, 93 insertions(+), 37 deletions(-) diff --git a/pom.xml b/pom.xml index bb2e83f..6814065 100644 --- a/pom.xml +++ b/pom.xml @@ -76,13 +76,13 @@ org.apache.logging.log4j log4j-api - 2.17.0 + 2.17.1 org.apache.logging.log4j log4j-core - 2.17.0 + 2.17.1 diff --git a/src/main/java/org/mosad/homeflix/application/Main.java b/src/main/java/org/mosad/homeflix/application/Main.java index ab33544..4f76d2d 100644 --- a/src/main/java/org/mosad/homeflix/application/Main.java +++ b/src/main/java/org/mosad/homeflix/application/Main.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2019 <@Seil0> + * Copyright 2016-2022 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/application/MainWindowController.java b/src/main/java/org/mosad/homeflix/application/MainWindowController.java index 3ff34a8..d101d84 100644 --- a/src/main/java/org/mosad/homeflix/application/MainWindowController.java +++ b/src/main/java/org/mosad/homeflix/application/MainWindowController.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2019 <@Seil0> + * Copyright 2016-2022 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/application/SettingsView.java b/src/main/java/org/mosad/homeflix/application/SettingsView.java index 6b15d0a..2b90beb 100644 --- a/src/main/java/org/mosad/homeflix/application/SettingsView.java +++ b/src/main/java/org/mosad/homeflix/application/SettingsView.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2019 <@Seil0> + * Copyright 2016-2022 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/application/view/FilmDetailView.java b/src/main/java/org/mosad/homeflix/application/view/FilmDetailView.java index 06f8bb1..0ff894f 100644 --- a/src/main/java/org/mosad/homeflix/application/view/FilmDetailView.java +++ b/src/main/java/org/mosad/homeflix/application/view/FilmDetailView.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2019 <@Seil0> + * Copyright 2016-2022 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/application/view/SeriesDetailView.java b/src/main/java/org/mosad/homeflix/application/view/SeriesDetailView.java index 9da00e8..331c88a 100644 --- a/src/main/java/org/mosad/homeflix/application/view/SeriesDetailView.java +++ b/src/main/java/org/mosad/homeflix/application/view/SeriesDetailView.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2019 <@Seil0> + * Copyright 2016-2022 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/controller/DBController.java b/src/main/java/org/mosad/homeflix/controller/DBController.java index 9b70cde..8a8d5ac 100644 --- a/src/main/java/org/mosad/homeflix/controller/DBController.java +++ b/src/main/java/org/mosad/homeflix/controller/DBController.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2019 <@Seil0> + * Copyright 2016-2022 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/controller/SourcesController.java b/src/main/java/org/mosad/homeflix/controller/SourcesController.java index a88b957..8b4e783 100644 --- a/src/main/java/org/mosad/homeflix/controller/SourcesController.java +++ b/src/main/java/org/mosad/homeflix/controller/SourcesController.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2019 <@Seil0> + * Copyright 2016-2022 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/controller/XMLController.java b/src/main/java/org/mosad/homeflix/controller/XMLController.java index fbe1f5a..2fee842 100644 --- a/src/main/java/org/mosad/homeflix/controller/XMLController.java +++ b/src/main/java/org/mosad/homeflix/controller/XMLController.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2019 <@Seil0> + * Copyright 2016-2022 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/datatypes/DatabaseDataType.java b/src/main/java/org/mosad/homeflix/datatypes/DatabaseDataType.java index 8dd08e6..5763f4b 100644 --- a/src/main/java/org/mosad/homeflix/datatypes/DatabaseDataType.java +++ b/src/main/java/org/mosad/homeflix/datatypes/DatabaseDataType.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2019 <@Seil0> + * Copyright 2016-2022 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/datatypes/FilmTabelDataType.java b/src/main/java/org/mosad/homeflix/datatypes/FilmTabelDataType.java index 68f50cc..c1dd12d 100644 --- a/src/main/java/org/mosad/homeflix/datatypes/FilmTabelDataType.java +++ b/src/main/java/org/mosad/homeflix/datatypes/FilmTabelDataType.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2019 <@Seil0> + * Copyright 2016-2022 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/datatypes/PosterModeElement.java b/src/main/java/org/mosad/homeflix/datatypes/PosterModeElement.java index bbe6a75..78412fa 100644 --- a/src/main/java/org/mosad/homeflix/datatypes/PosterModeElement.java +++ b/src/main/java/org/mosad/homeflix/datatypes/PosterModeElement.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2019 <@Seil0> + * Copyright 2016-2022 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/datatypes/SourceDataType.java b/src/main/java/org/mosad/homeflix/datatypes/SourceDataType.java index 6ffedec..9be00f2 100644 --- a/src/main/java/org/mosad/homeflix/datatypes/SourceDataType.java +++ b/src/main/java/org/mosad/homeflix/datatypes/SourceDataType.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2019 <@Seil0> + * Copyright 2016-2022 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/player/HFMediaPlayerEventListener.java b/src/main/java/org/mosad/homeflix/player/HFMediaPlayerEventListener.java index 6828556..72e45ac 100644 --- a/src/main/java/org/mosad/homeflix/player/HFMediaPlayerEventListener.java +++ b/src/main/java/org/mosad/homeflix/player/HFMediaPlayerEventListener.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2020 + * Copyright 2016-2022 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/player/Player.java b/src/main/java/org/mosad/homeflix/player/Player.java index 99bb532..3dbb504 100644 --- a/src/main/java/org/mosad/homeflix/player/Player.java +++ b/src/main/java/org/mosad/homeflix/player/Player.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2020 + * Copyright 2016-2022 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/org/mosad/homeflix/player/PlayerController.java b/src/main/java/org/mosad/homeflix/player/PlayerController.java index b69000f..7fcb9f6 100644 --- a/src/main/java/org/mosad/homeflix/player/PlayerController.java +++ b/src/main/java/org/mosad/homeflix/player/PlayerController.java @@ -1,7 +1,7 @@ /** * Project-HomeFlix * - * Copyright 2016-2020 + * Copyright 2016-2022 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,13 +28,13 @@ import java.util.List; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.TimeUnit; - import org.mosad.homeflix.controller.DBController; import org.mosad.homeflix.controller.XMLController; import org.mosad.homeflix.datatypes.FilmTabelDataType; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXDialogLayout; +import com.jfoenix.controls.JFXListCell; import com.jfoenix.controls.JFXListView; import com.jfoenix.controls.JFXPopup; import com.jfoenix.controls.JFXPopup.PopupHPosition; @@ -61,6 +61,8 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; +import javafx.scene.text.Font; +import javafx.scene.text.FontWeight; import javafx.scene.text.Text; import javafx.util.StringConverter; import uk.co.caprica.vlcj.factory.MediaPlayerFactory; @@ -125,8 +127,10 @@ public class PlayerController { private long endTime = 0; private long skipTime = 0; private long duration = 0; - private List tracks = new ArrayList<>(); - private int currentTrack = 0; + private List audioTracks = new ArrayList<>(); + private List subtitleTracks = new ArrayList<>(); + private int currentAudioTrack = 0; + private int currentSubtitleTrack = 0; private int season = 0; private int episode = 0; @@ -244,8 +248,10 @@ public class PlayerController { @Override public void mediaPlayerReady(MediaPlayer mediaPlayer) { - tracks = mediaPlayer.audio().trackDescriptions(); - currentTrack = mediaPlayer.audio().track(); + audioTracks = mediaPlayer.audio().trackDescriptions(); + subtitleTracks = mediaPlayer.subpictures().trackDescriptions(); + currentAudioTrack = mediaPlayer.audio().track(); + currentSubtitleTrack = mediaPlayer.subpictures().track(); } @Override @@ -440,7 +446,8 @@ public class PlayerController { @FXML void btnReplayAction(ActionEvent event) { embeddedMediaPlayer.controls().skipTime(-10000); - + + // update currentTime, endTime and controls if play back is paused if (!embeddedMediaPlayer.status().isPlaying()) { currentTime = currentTime - 10000; endTime = endTime + 10000; @@ -455,6 +462,7 @@ public class PlayerController { void btnForwardAction(ActionEvent event) { embeddedMediaPlayer.controls().skipTime(10000); + // update currentTime, endTime and controls if play back is paused if (!embeddedMediaPlayer.status().isPlaying()) { currentTime = currentTime + 10000; endTime = endTime - 10000; @@ -470,24 +478,53 @@ public class PlayerController { if (audioPopup == null) { audioPopup = new JFXPopup(); - JFXListView list = new JFXListView(); - tracks.forEach(track -> { - list.getItems().add(track.description()); - }); - - list.getSelectionModel().select(currentTrack); - list.setOnMouseClicked(ev -> { - setAudioTrack(list.getSelectionModel().getSelectedIndex()); + // audio track + JFXListView audioList = new JFXListView<>(); + audioList.setCellFactory(param -> new TrackDescriptionCellFactory()); + audioList.setOnMouseClicked(ev -> { + setAudioTrack(audioList.getSelectionModel().getSelectedItem().id()); audioPopup.hide(); }); - Text heading = new Text("Audio"); - heading.setFill(Color.WHITE); + audioTracks.forEach(track -> { + audioList.getItems().add(track); + if (track.id() == currentAudioTrack) { + audioList.getSelectionModel().select(track); + } + }); + + + Text audioHeading = new Text("Audio"); + audioHeading.setFill(Color.WHITE); + audioHeading.setFont(Font.font(null, FontWeight.BOLD, 16)); + + // subtitle track + JFXListView subtitleList = new JFXListView<>(); + subtitleList.setCellFactory(param -> new TrackDescriptionCellFactory()); + subtitleList.setOnMouseClicked(ev -> { + setSubtitleTrack(subtitleList.getSelectionModel().getSelectedItem().id()); + audioPopup.hide(); + }); + + subtitleTracks.forEach(track -> { + subtitleList.getItems().add(track); + if (track.id() == currentSubtitleTrack) { + subtitleList.getSelectionModel().select(track); + } + }); + + Text subtitleHeading = new Text("Subtitles"); + subtitleHeading.setFill(Color.WHITE); + subtitleHeading.setFont(Font.font(null, FontWeight.BOLD, 16)); + + + // build dialog layout + VBox audioBox = new VBox(audioHeading, audioList); + VBox subtileBox = new VBox(subtitleHeading, subtitleList); + HBox hbox = new HBox(audioBox, subtileBox); JFXDialogLayout content = new JFXDialogLayout(); - content.setPrefSize(150, 200); - content.setHeading(heading); - content.setBody(list); + content.setBody(hbox); content.setPadding(new Insets(-20, -20, -20, -20)); // fix JFXDialogLayout padding content.setSpacing(-10); // fix JFXDialogLayout spacing @@ -535,7 +572,12 @@ public class PlayerController { */ private void setAudioTrack(int track) { embeddedMediaPlayer.audio().setTrack(track); - currentTrack = track; + currentAudioTrack = track; + } + + private void setSubtitleTrack(int track) { + embeddedMediaPlayer.subpictures().setTrack(track); + currentSubtitleTrack = track; } public double getCurrentTime() { @@ -576,4 +618,18 @@ public class PlayerController { Platform.runLater(() -> videoPixelBuffer.updateBuffer(pb -> null)); } } + + private class TrackDescriptionCellFactory extends JFXListCell { + + @Override + protected void updateItem(TrackDescription item, boolean empty) { + super.updateItem(item, empty); + + if (empty || item == null || item.description() == null) { + setText(null); + } else { + setText(item.description()); + } + } + } }