diff options
Diffstat (limited to 'server/replaytool/src/render.rs')
-rw-r--r-- | server/replaytool/src/render.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/server/replaytool/src/render.rs b/server/replaytool/src/render.rs new file mode 100644 index 00000000..79eb483b --- /dev/null +++ b/server/replaytool/src/render.rs @@ -0,0 +1,56 @@ +/* + Hurry Curry! - a game about cooking + Copyright (C) 2025 Hurry Curry! Contributors + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, version 3 of the License only. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. + +*/ + +use crate::replay::replay; +use anyhow::Result; +use log::info; +use std::path::Path; +use tokio::{net::TcpListener, process::Command}; + +pub async fn render(input: &Path, output: &Path, framerate: usize, headless: bool) -> Result<()> { + let port = 27090; + let ws_listener = TcpListener::bind(("127.0.0.1", port)).await?; + + let mut args = Vec::new(); + if headless { + args.push("wlheadless-run"); + args.extend(["-c", "mutter"]); + args.push("--"); + } + args.push("hurrycurry-client"); + if headless { + args.extend(["--video-driver", "wayland"]); + args.extend(["--rendering-driver", "vulkan"]); + } + args.extend(["--write-movie", output.to_str().unwrap()]); + let fps = framerate.to_string(); + args.extend(["--fixed-fps", &fps]); + args.push("--print-fps"); + args.push("--"); + let uri = format!("ws://127.0.0.1:{port}"); + args.push(&uri); + + let mut client = Command::new(args[0]).args(&args[1..]).spawn()?; + + info!("listening for websockets on {}", ws_listener.local_addr()?); + replay(&ws_listener, &input).await?; + + client.wait().await?.exit_ok()?; + + Ok(()) +} |