From 06c4d1681c94dfffa63d7585f67924da8cce54f7 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Tue, 9 Dec 2025 15:23:34 -0600 Subject: [PATCH] starting to add obs --- Cargo.lock | 97 +++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/ui/presenter.rs | 32 +++++++++++++++ 3 files changed, 130 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index c671c99..9d60cdb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1688,6 +1688,12 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + [[package]] name = "data-url" version = "0.3.2" @@ -3164,6 +3170,22 @@ dependencies = [ "utf8-width", ] +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + [[package]] name = "i18n-config" version = "0.4.8" @@ -4174,6 +4196,7 @@ dependencies = [ "libcosmic", "miette", "mupdf", + "obws", "pretty_assertions", "rapidfuzz", "rapidhash", @@ -5077,6 +5100,30 @@ dependencies = [ "memchr", ] +[[package]] +name = "obws" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245cd220b1d4edd6ba01b30ef79d22dafb8b7acb4b00335297357053ba2c6c6e" +dependencies = [ + "base64 0.22.1", + "bitflags 2.9.4", + "futures-util", + "rgb", + "semver", + "serde", + "serde_json", + "serde_repr", + "serde_with", + "sha2", + "thiserror 2.0.17", + "time", + "tokio", + "tokio-tungstenite", + "tracing", + "uuid", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -6277,6 +6324,10 @@ name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] [[package]] name = "serde" @@ -7505,6 +7556,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + [[package]] name = "toml" version = "0.5.11" @@ -7668,6 +7731,23 @@ dependencies = [ "core_maths", ] +[[package]] +name = "tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.2", + "sha1", + "thiserror 2.0.17", + "utf-8", +] + [[package]] name = "type-map" version = "0.5.1" @@ -7884,6 +7964,12 @@ dependencies = [ "xmlwriter", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8-width" version = "0.1.7" @@ -7902,6 +7988,17 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "js-sys", + "serde_core", + "wasm-bindgen", +] + [[package]] name = "v_frame" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 88b7cef..7e03cef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,7 @@ mupdf = { version = "0.5.0", git = "https://github.com/messense/mupdf-rs", rev=" tar = "0.4.44" zstd = "0.13.3" fastrand = "2.3.0" +obws = "0.14.0" # rfd = { version = "0.15.4", default-features = false, features = ["xdg-portal"] } diff --git a/src/ui/presenter.rs b/src/ui/presenter.rs index f54531d..ffb68de 100644 --- a/src/ui/presenter.rs +++ b/src/ui/presenter.rs @@ -1,10 +1,15 @@ use miette::{IntoDiagnostic, Result}; +use obws::{ + Client, requests::scenes::SceneId, responses::scenes::Scene, +}; use std::{ + collections::HashMap, fs::File, io::BufReader, path::PathBuf, sync::{Arc, LazyLock}, }; +use tokio::task::spawn_blocking; use cosmic::{ Task, @@ -53,6 +58,8 @@ pub(crate) struct Presenter { hovered_slide: Option<(usize, usize)>, scroll_id: Id, current_font: Font, + scene_slide_map: Option>, + obs_client: Option>, } pub(crate) enum Action { @@ -188,6 +195,8 @@ impl Presenter { }, scroll_id: Id::unique(), current_font: cosmic::font::default(), + scene_slide_map: None, + obs_client: None, } } @@ -344,6 +353,29 @@ impl Presenter { self.update(Message::EndAudio); } let task_count = tasks.len(); + let item_index = self.current_item; + let slide_index = self.current_slide_index; + + if let Some(map) = &self.scene_slide_map { + if let Some(scene) = + map.get(&(item_index, slide_index)) + { + if let Some(obs) = &self.obs_client { + let obs = Arc::clone(&obs); + let task = Task::perform( + obs.scenes() + .set_current_program_scene( + scene.id.clone(), + ), + |res| { + debug!(?res); + Message::None + }, + ); + tasks.push(task); + } + } + } debug!(?task_count); return Action::Task(Task::batch(tasks)); }