diff --git a/cli/src/main/java/dev/quoije/umd/cli/Main.java b/cli/src/main/java/dev/quoije/umd/cli/Main.java index 2dc6052..969aa32 100644 --- a/cli/src/main/java/dev/quoije/umd/cli/Main.java +++ b/cli/src/main/java/dev/quoije/umd/cli/Main.java @@ -436,6 +436,8 @@ public final class Main { VsmxInterpreter interpreter = new VsmxInterpreter(); interpreter.setVsmx(vsmx); + final Playlist playlist = Playlist.parse(iso); + final List playCalls = new java.util.ArrayList<>(); MenuHost menuHost = new MenuHost() { @Override @@ -443,7 +445,8 @@ public final class Main { int audioFlag, int subtitleNumber, int subtitleFlag) { String call = String.format("play(playList=%d, chapter=%d, video=%d, audio=%d, audioFlag=%d, subtitle=%d, subtitleFlag=%d)", playListNumber, chapterNumber, videoNumber, audioNumber, audioFlag, subtitleNumber, subtitleFlag); - String streamName = String.format("%05d", playListNumber); + Playlist.Stream stream = playlist.streamForPlayListNumber(playListNumber); + String streamName = stream == null ? String.format("%05d", playListNumber) : stream.name(); try (PlaybackEngine engine = PlaybackEngine.open(iso, streamName, 0)) { int frames = 0; PlaybackEngine.VideoFrame frame; diff --git a/core/src/main/java/dev/quoije/umd/playlist/Playlist.java b/core/src/main/java/dev/quoije/umd/playlist/Playlist.java index b130347..38b92cf 100644 --- a/core/src/main/java/dev/quoije/umd/playlist/Playlist.java +++ b/core/src/main/java/dev/quoije/umd/playlist/Playlist.java @@ -27,6 +27,16 @@ public final class Playlist { return streams; } + /** Returns the stream with the given 1-based playListNumber, or null. */ + public Stream streamForPlayListNumber(int playListNumber) { + for (Stream stream : streams) { + if (stream.playListNumber() == playListNumber) { + return stream; + } + } + return null; + } + /** A single MPS stream (playlist item). */ public record Stream( String name, diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts index 01ff93c..c45f22a 100644 --- a/ui/build.gradle.kts +++ b/ui/build.gradle.kts @@ -1,5 +1,6 @@ plugins { - `java-library` + application + id("org.openjfx.javafxplugin") version "0.1.0" } java { @@ -7,3 +8,16 @@ java { languageVersion = JavaLanguageVersion.of(21) } } + +javafx { + version = "21.0.5" + modules("javafx.controls") +} + +application { + mainClass = "dev.quoije.umd.ui.PlayerApp" +} + +dependencies { + implementation(project(":core")) +} diff --git a/ui/src/main/java/dev/quoije/umd/ui/PlayerApp.java b/ui/src/main/java/dev/quoije/umd/ui/PlayerApp.java new file mode 100644 index 0000000..ab1d3bd --- /dev/null +++ b/ui/src/main/java/dev/quoije/umd/ui/PlayerApp.java @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.ui; + +import javafx.application.Application; +import javafx.application.Platform; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; + +import java.util.List; + +/** JavaFX application entry point for the UMD player. */ +public final class PlayerApp extends Application { + + @Override + public void start(Stage stage) { + List params = getParameters().getRaw(); + String imagePath = params.isEmpty() ? null : params.get(0); + + StackPane root = new StackPane(new Label("useless-umd-player\n" + (imagePath == null ? "(no iso)" : imagePath))); + stage.setTitle("useless-umd-player"); + stage.setScene(new Scene(root, 854, 480)); + stage.show(); + + // Temporary smoke test: auto-close after 2 seconds. + new Thread(() -> { + try { + Thread.sleep(2000); + } catch (InterruptedException ignored) { + } + Platform.exit(); + }, "smoke-close").start(); + } + + public static void main(String[] args) { + launch(args); + } +}