From fc9141148d504384c40927c8f87fd3455d7e32a7 Mon Sep 17 00:00:00 2001 From: Zaphkiel Date: Sun, 2 Aug 2026 19:09:10 +0200 Subject: [PATCH] feat(discord): publish the playing title, episode and position to Discord Show the current series and episode, or film and year, on the user's Discord profile along with the playback position. The new jfn-discord crate splits the way jfn-mpris does: a pure projection module holding the display rules, unit tested without a socket or a clock, and a dedicated thread owning the connection. It registers with jfn_playback::register_event_sink rather than the per-platform MediaSink trait, which returns one sink per platform and is already taken by MPRIS, NowPlaying and SMTC. The RPC protocol is a length-prefixed JSON frame over a Unix socket or a named pipe, small enough to implement here instead of taking a dependency. Reads run on their own thread: Discord echoes every command and sends PING expecting PONG, so an undrained socket eventually blocks writes, and keeping reads off the sink thread means stop() never waits on I/O. Reconnect backoff is loop state rather than a sleep for the same reason. Timestamps are absolute, so Discord advances the progress bar itself and nothing needs pushing on a timer; an update goes out only when the relation between position and wall clock changes. The bar is omitted unless playback is steadily rolling, which is the only way to stop the client extrapolating through pauses, seeks and buffer underruns. MediaMetadata gains the season number, production year, item kind and primary image URL, all four of which the CEF layer already received and dropped, plus the provider ids behind the IMDb, AniList and TMDb links. Those ids come from the server and end up inside a URL, so they are validated first. Input::Metadata is boxed to keep the enum balanced now the struct is larger. The Flatpak manifest gains access to the host Discord socket, invisible from inside the sandbox, without which the feature would be inert on that target alone. Off by default behind discordRichPresence, and inert until an application id is set, either in the client settings page or as discordApplicationId in settings.json, falling back to a compiled-in constant. A non-numeric id is refused with a log line rather than left to fail silently at connect time, since the field is now free text in the UI. --- .../flatpak/net.nullsum.JelliumDesktop.yml | 2 + resources/discord/logo.png | Bin 0 -> 90073 bytes resources/discord/pause.png | Bin 0 -> 12418 bytes src/Cargo.lock | 12 + src/Cargo.toml | 1 + src/config/src/lib.rs | 69 ++- src/discord/Cargo.toml | 21 + src/discord/src/activity.rs | 238 ++++++++ src/discord/src/ipc.rs | 277 ++++++++++ src/discord/src/lib.rs | 6 + src/discord/src/projection.rs | 521 ++++++++++++++++++ src/discord/src/sink.rs | 435 +++++++++++++++ src/jfn_cef/src/business_common.rs | 2 + src/jfn_cef/src/business_web.rs | 58 +- src/jfn_rust/Cargo.toml | 1 + src/jfn_rust/src/app.rs | 2 + src/playback/src/coordinator.rs | 4 +- src/playback/src/types.rs | 29 + src/web/input-plugin.js | 19 +- src/web/native-shim.js | 11 +- 20 files changed, 1691 insertions(+), 17 deletions(-) create mode 100644 resources/discord/logo.png create mode 100644 resources/discord/pause.png create mode 100644 src/discord/Cargo.toml create mode 100644 src/discord/src/activity.rs create mode 100644 src/discord/src/ipc.rs create mode 100644 src/discord/src/lib.rs create mode 100644 src/discord/src/projection.rs create mode 100644 src/discord/src/sink.rs diff --git a/dev/linux/flatpak/net.nullsum.JelliumDesktop.yml b/dev/linux/flatpak/net.nullsum.JelliumDesktop.yml index e1e4c2082..76edd63b8 100644 --- a/dev/linux/flatpak/net.nullsum.JelliumDesktop.yml +++ b/dev/linux/flatpak/net.nullsum.JelliumDesktop.yml @@ -17,6 +17,8 @@ finish-args: - --device=dri - --talk-name=org.freedesktop.ScreenSaver - --own-name=org.mpris.MediaPlayer2.JelliumDesktop + - --filesystem=xdg-run/discord-ipc-0 + - --filesystem=xdg-run/app/com.discordapp.Discord:ro # The base org.freedesktop.Platform//25.08 libavcodec ships WITHOUT the # patent-encumbered h264/hevc decoders (freedesktop moved them out of the base # runtime in 25.08 — 24.08 still had h264). Those decoders live only in the diff --git a/resources/discord/logo.png b/resources/discord/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..88227de71789eac3e9c64c771e6a8137419560fe GIT binary patch literal 90073 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 GWb+5hF=d&JNvbB=lvUdvr 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 literal 0 HcmV?d00001 diff --git a/src/Cargo.lock b/src/Cargo.lock index 5f887c02b..4bc0f2c0f 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -2271,6 +2271,17 @@ dependencies = [ "serde_json", ] +[[package]] +name = "jfn-discord" +version = "0.1.0-dev" +dependencies = [ + "jfn-config", + "jfn-playback", + "parking_lot", + "serde_json", + "tracing", +] + [[package]] name = "jfn-gpu-paint" version = "0.1.0-dev" @@ -2433,6 +2444,7 @@ dependencies = [ "jfn-cef", "jfn-color", "jfn-config", + "jfn-discord", "jfn-jellyfin", "jfn-linux-util", "jfn-logging", diff --git a/src/Cargo.toml b/src/Cargo.toml index 958135bc1..2fac53a34 100644 --- a/src/Cargo.toml +++ b/src/Cargo.toml @@ -4,6 +4,7 @@ members = [ "color", "compositor_core", "config", + "discord", "gpu_paint", "input", "jellyfin", diff --git a/src/config/src/lib.rs b/src/config/src/lib.rs index 180807ebb..7416214c9 100644 --- a/src/config/src/lib.rs +++ b/src/config/src/lib.rs @@ -59,6 +59,8 @@ struct SettingsData { force_transcoding: bool, window_decorations: Option, hide_scrollbar: bool, + discord_rich_presence: bool, + discord_application_id: String, } impl Default for SettingsData { @@ -77,6 +79,8 @@ impl Default for SettingsData { force_transcoding: false, window_decorations: None, hide_scrollbar: true, + discord_rich_presence: false, + discord_application_id: String::new(), } } } @@ -154,6 +158,12 @@ impl SettingsData { if let Some(b) = v.get("hideScrollbar").and_then(Value::as_bool) { self.hide_scrollbar = b; } + if let Some(b) = v.get("discordRichPresence").and_then(Value::as_bool) { + self.discord_rich_presence = b; + } + if let Some(s) = v.get("discordApplicationId").and_then(Value::as_str) { + self.discord_application_id = s.into(); + } } fn to_json(&self) -> Value { @@ -223,6 +233,15 @@ impl SettingsData { if !self.device_name.is_empty() { o.insert("deviceName".into(), Value::String(self.device_name.clone())); } + if self.discord_rich_presence { + o.insert("discordRichPresence".into(), Value::Bool(true)); + } + if !self.discord_application_id.is_empty() { + o.insert( + "discordApplicationId".into(), + Value::String(self.discord_application_id.clone()), + ); + } Value::Object(o) } @@ -265,6 +284,14 @@ impl SettingsData { if !self.device_name.is_empty() { o.insert("deviceName".into(), Value::String(self.device_name.clone())); } + o.insert( + "discordRichPresence".into(), + Value::Bool(self.discord_rich_presence), + ); + o.insert( + "discordApplicationId".into(), + Value::String(self.discord_application_id.clone()), + ); o.insert( "deviceNameDefault".into(), Value::String(default_device_name()), @@ -517,6 +544,18 @@ bool_accessors!( transparent_titlebar ); bool_accessors!(force_transcoding, set_force_transcoding, force_transcoding); +bool_accessors!( + discord_rich_presence, + set_discord_rich_presence, + discord_rich_presence +); +pub fn discord_application_id() -> String { + state().lock().data.discord_application_id.clone() +} + +pub fn set_discord_application_id(v: &str) { + state().lock().data.discord_application_id = v.trim().to_string(); +} /// The user's explicit decoration choice, unresolved; `None` when unset. pub fn configured_window_decorations() -> Option { state().lock().data.window_decorations @@ -590,10 +629,38 @@ fn normalize_device_name(raw: &str, platform_default: &str) -> String { #[cfg(test)] mod tests { - use super::normalize_device_name; + use super::{SettingsData, Value, normalize_device_name}; const PLATFORM: &str = "platform-host"; + #[test] + fn discord_settings_survive_a_load_save_cycle() { + let mut d = SettingsData::default(); + d.overlay_json(&serde_json::json!({ + "discordRichPresence": true, + "discordApplicationId": "1533503787145363616", + })); + assert!(d.discord_rich_presence); + assert_eq!(d.discord_application_id, "1533503787145363616"); + + let out = d.to_json(); + assert_eq!( + out.get("discordRichPresence").and_then(Value::as_bool), + Some(true) + ); + assert_eq!( + out.get("discordApplicationId").and_then(Value::as_str), + Some("1533503787145363616") + ); + } + + #[test] + fn saving_drops_keys_the_running_binary_does_not_know() { + let mut d = SettingsData::default(); + d.overlay_json(&serde_json::json!({ "someFutureKey": "value" })); + assert!(d.to_json().get("someFutureKey").is_none()); + } + #[test] fn trims_leading_and_trailing_whitespace() { assert_eq!(normalize_device_name(" foo ", PLATFORM), "foo"); diff --git a/src/discord/Cargo.toml b/src/discord/Cargo.toml new file mode 100644 index 000000000..8fc502714 --- /dev/null +++ b/src/discord/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "jfn-discord" +version.workspace = true +edition.workspace = true +publish.workspace = true + +[lib] +name = "jfn_discord" +crate-type = ["rlib"] + +# Deliberately not target-gated: Discord's local RPC transport exists on all +# three platforms, so unlike jfn-mpris this crate is real code everywhere. +[dependencies] +jfn-config = { path = "../config" } +jfn-playback = { path = "../playback" } +parking_lot.workspace = true +serde_json.workspace = true +tracing.workspace = true + +[lints] +workspace = true diff --git a/src/discord/src/activity.rs b/src/discord/src/activity.rs new file mode 100644 index 000000000..f3c843672 --- /dev/null +++ b/src/discord/src/activity.rs @@ -0,0 +1,238 @@ +use serde_json::{Map, Value, json}; + +use crate::projection::Activity; + +fn put(o: &mut Map, key: &str, v: &str) { + if !v.is_empty() { + o.insert(key.to_owned(), Value::String(v.to_owned())); + } +} + +#[must_use] +pub fn to_json(activity: &Activity, now_ms: i64) -> Value { + let mut o = Map::new(); + o.insert("type".to_owned(), json!(activity.activity_type)); + put(&mut o, "name", &activity.name); + put(&mut o, "details", &activity.details); + put(&mut o, "state", &activity.state); + + let primary_link = activity.buttons.first().map_or("", |b| b.url.as_str()); + put(&mut o, "details_url", primary_link); + + let mut assets = Map::new(); + put(&mut assets, "large_image", &activity.large_image); + put(&mut assets, "large_text", &activity.large_text); + put(&mut assets, "large_url", primary_link); + put(&mut assets, "small_image", activity.small_image); + put(&mut assets, "small_text", &activity.small_text); + o.insert("assets".to_owned(), Value::Object(assets)); + + if let Some(t) = activity.timeline { + let rate = if t.rate > 0.0 { t.rate } else { 1.0 }; + let elapsed_ms = us_to_ms_scaled(t.position_us, rate); + let start = now_ms - elapsed_ms; + let mut ts = Map::new(); + ts.insert("start".to_owned(), json!(start)); + if t.duration_us > 0 { + ts.insert( + "end".to_owned(), + json!(start + us_to_ms_scaled(t.duration_us, rate)), + ); + } + o.insert("timestamps".to_owned(), Value::Object(ts)); + } + + if !activity.buttons.is_empty() { + let buttons: Vec = activity + .buttons + .iter() + .map(|b| json!({ "label": b.label, "url": b.url })) + .collect(); + o.insert("buttons".to_owned(), Value::Array(buttons)); + } + + Value::Object(o) +} + +fn us_to_ms_scaled(us: i64, rate: f64) -> i64 { + let ms = (us as f64) / 1000.0 / rate; + if ms.is_finite() { ms as i64 } else { 0 } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::projection::{ASSET_LOGO, ASSET_PAUSE, Activity, Timeline}; + + fn activity(timeline: Option) -> Activity { + Activity { + activity_type: 3, + name: "Frieren".into(), + details: "Frieren".into(), + state: "S1E12".into(), + large_image: ASSET_LOGO.into(), + large_text: "Frieren".into(), + small_image: ASSET_PAUSE, + small_text: "1:00 / 23:20".into(), + timeline, + buttons: Vec::new(), + } + } + + #[test] + fn the_activity_name_carries_the_title() { + let v = to_json(&activity(None), 0); + assert_eq!(v.get("name").and_then(Value::as_str), Some("Frieren")); + } + + #[test] + fn the_primary_link_makes_the_title_and_poster_clickable() { + use crate::projection::Button; + let mut a = activity(None); + a.buttons = vec![Button { + label: "IMDb", + url: "https://www.imdb.com/title/tt15469038/".into(), + }]; + let v = to_json(&a, 0); + let url = Some("https://www.imdb.com/title/tt15469038/"); + assert_eq!(v.get("details_url").and_then(Value::as_str), url); + assert_eq!( + v.get("assets") + .and_then(|a| a.get("large_url")) + .and_then(Value::as_str), + url + ); + } + + #[test] + fn without_a_link_no_url_fields_are_sent() { + let v = to_json(&activity(None), 0); + assert!(v.get("details_url").is_none()); + assert!(v.get("assets").and_then(|a| a.get("large_url")).is_none()); + } + + #[test] + fn no_timeline_means_no_timestamps() { + let v = to_json(&activity(None), 1_000_000); + assert!(v.get("timestamps").is_none()); + } + + #[test] + fn start_is_now_minus_elapsed() { + let v = to_json( + &activity(Some(Timeline { + position_us: 60_000_000, + duration_us: 1_400_000_000, + rate: 1.0, + })), + 1_000_000, + ); + let ts = match v.get("timestamps") { + Some(t) => t, + None => unreachable!("timestamps"), + }; + assert_eq!(ts.get("start").and_then(Value::as_i64), Some(940_000)); + assert_eq!(ts.get("end").and_then(Value::as_i64), Some(2_340_000)); + } + + #[test] + fn double_speed_halves_the_remaining_wall_clock() { + let v = to_json( + &activity(Some(Timeline { + position_us: 0, + duration_us: 3_600_000_000, + rate: 2.0, + })), + 0, + ); + let ts = match v.get("timestamps") { + Some(t) => t, + None => unreachable!("timestamps"), + }; + assert_eq!(ts.get("end").and_then(Value::as_i64), Some(1_800_000)); + } + + #[test] + fn zero_rate_cannot_produce_a_nan() { + let v = to_json( + &activity(Some(Timeline { + position_us: 60_000_000, + duration_us: 0, + rate: 0.0, + })), + 0, + ); + let ts = match v.get("timestamps") { + Some(t) => t, + None => unreachable!("timestamps"), + }; + assert_eq!(ts.get("start").and_then(Value::as_i64), Some(-60_000)); + } + + #[test] + fn buttons_serialise_as_label_url_pairs() { + use crate::projection::Button; + let mut a = activity(None); + a.buttons = vec![Button { + label: "IMDb", + url: "https://www.imdb.com/title/tt15469038/".into(), + }]; + let v = to_json(&a, 0); + let arr = match v.get("buttons").and_then(Value::as_array) { + Some(b) => b, + None => unreachable!("buttons"), + }; + assert_eq!(arr.len(), 1); + assert_eq!(arr[0].get("label").and_then(Value::as_str), Some("IMDb")); + assert_eq!( + arr[0].get("url").and_then(Value::as_str), + Some("https://www.imdb.com/title/tt15469038/") + ); + } + + #[test] + fn an_empty_badge_is_absent_from_the_assets() { + let mut a = activity(None); + a.small_image = ""; + a.small_text = String::new(); + let assets = match to_json(&a, 0).get("assets").cloned() { + Some(v) => v, + None => unreachable!("assets"), + }; + assert!(assets.get("small_image").is_none()); + assert!(assets.get("small_text").is_none()); + assert!(assets.get("large_image").is_some()); + } + + #[test] + fn absent_buttons_are_omitted_entirely() { + assert!(to_json(&activity(None), 0).get("buttons").is_none()); + } + + #[test] + fn empty_text_fields_are_omitted() { + let mut a = activity(None); + a.state = String::new(); + let v = to_json(&a, 0); + assert!(v.get("state").is_none()); + assert!(v.get("details").is_some()); + } + + #[test] + fn live_stream_has_a_start_but_no_end() { + let v = to_json( + &activity(Some(Timeline { + position_us: 5_000_000, + duration_us: 0, + rate: 1.0, + })), + 100_000, + ); + let ts = match v.get("timestamps") { + Some(t) => t, + None => unreachable!("timestamps"), + }; + assert_eq!(ts.get("start").and_then(Value::as_i64), Some(95_000)); + assert!(ts.get("end").is_none()); + } +} diff --git a/src/discord/src/ipc.rs b/src/discord/src/ipc.rs new file mode 100644 index 000000000..aa8f77e1d --- /dev/null +++ b/src/discord/src/ipc.rs @@ -0,0 +1,277 @@ +use std::io::{self, Read, Write}; +use std::path::Path; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; + +use parking_lot::Mutex; +use serde_json::{Value, json}; + +const OP_HANDSHAKE: u32 = 0; +const OP_FRAME: u32 = 1; +const OP_CLOSE: u32 = 2; +const OP_PING: u32 = 3; +const OP_PONG: u32 = 4; + +const MAX_FRAME_LEN: u32 = 64 * 1024; + +trait Stream: Read + Write + Send { + fn try_clone_boxed(&self) -> io::Result>; + fn shutdown(&self); +} + +#[cfg(unix)] +mod platform { + use super::Stream; + use std::io; + use std::os::unix::net::UnixStream; + use std::path::{Path, PathBuf}; + + impl Stream for UnixStream { + fn try_clone_boxed(&self) -> io::Result> { + Ok(Box::new(self.try_clone()?)) + } + fn shutdown(&self) { + let _ = UnixStream::shutdown(self, std::net::Shutdown::Both); + } + } + + const NESTED: [&str; 4] = [ + "app/com.discordapp.Discord", + "app/com.discordapp.DiscordCanary", + "app/com.discordapp.DiscordPTB", + "snap.discord", + ]; + + pub fn candidates() -> Vec { + let mut bases: Vec = Vec::new(); + for key in ["XDG_RUNTIME_DIR", "TMPDIR", "TMP", "TEMP"] { + if let Ok(v) = std::env::var(key) + && !v.is_empty() + { + bases.push(PathBuf::from(v)); + } + } + bases.push(PathBuf::from("/tmp")); + bases.dedup(); + + let mut out = Vec::new(); + for base in &bases { + for i in 0..10 { + out.push(base.join(format!("discord-ipc-{i}"))); + } + for nested in NESTED { + for i in 0..10 { + out.push(base.join(nested).join(format!("discord-ipc-{i}"))); + } + } + } + out + } + + pub fn connect(path: &Path) -> io::Result> { + Ok(Box::new(UnixStream::connect(path)?)) + } +} + +#[cfg(windows)] +mod platform { + use super::Stream; + use std::fs::{File, OpenOptions}; + use std::io; + use std::path::{Path, PathBuf}; + + impl Stream for File { + fn try_clone_boxed(&self) -> io::Result> { + Ok(Box::new(self.try_clone()?)) + } + fn shutdown(&self) {} + } + + pub fn candidates() -> Vec { + (0..10) + .map(|i| PathBuf::from(format!(r"\\.\pipe\discord-ipc-{i}"))) + .collect() + } + + pub fn connect(path: &Path) -> io::Result> { + Ok(Box::new( + OpenOptions::new().read(true).write(true).open(path)?, + )) + } +} + +fn write_frame(w: &mut W, op: u32, payload: &[u8]) -> io::Result<()> { + let len = + u32::try_from(payload.len()).map_err(|_| io::Error::other("discord: frame too large"))?; + let mut buf = Vec::with_capacity(8 + payload.len()); + buf.extend_from_slice(&op.to_le_bytes()); + buf.extend_from_slice(&len.to_le_bytes()); + buf.extend_from_slice(payload); + w.write_all(&buf) +} + +fn read_frame(r: &mut R) -> io::Result<(u32, Vec)> { + let mut hdr = [0u8; 8]; + r.read_exact(&mut hdr)?; + let op = u32::from_le_bytes([hdr[0], hdr[1], hdr[2], hdr[3]]); + let len = u32::from_le_bytes([hdr[4], hdr[5], hdr[6], hdr[7]]); + if len > MAX_FRAME_LEN { + return Err(io::Error::other(format!("discord: frame too large: {len}"))); + } + let mut payload = vec![0u8; len as usize]; + r.read_exact(&mut payload)?; + Ok((op, payload)) +} + +pub struct Connection { + stream: Arc>>, + alive: Arc, +} + +impl Connection { + pub fn connect(application_id: &str) -> Option { + for path in platform::candidates() { + if let Some(conn) = Self::try_path(&path, application_id) { + tracing::info!(target: "Media", "discord: connected via {}", path.display()); + return Some(conn); + } + } + None + } + + fn try_path(path: &Path, application_id: &str) -> Option { + let stream = platform::connect(path).ok()?; + let reader = stream.try_clone_boxed().ok()?; + let shared = Arc::new(Mutex::new(stream)); + + let hello = json!({ "v": 1, "client_id": application_id }).to_string(); + if write_frame(&mut **shared.lock(), OP_HANDSHAKE, hello.as_bytes()).is_err() { + return None; + } + + let alive = Arc::new(AtomicBool::new(true)); + spawn_reader(reader, Arc::clone(&shared), Arc::clone(&alive)); + Some(Self { + stream: shared, + alive, + }) + } + + pub fn is_alive(&self) -> bool { + self.alive.load(Ordering::Acquire) + } + + pub fn send_activity(&self, activity: Option, nonce: u64) -> bool { + let payload = json!({ + "cmd": "SET_ACTIVITY", + "nonce": nonce.to_string(), + "args": { "pid": std::process::id(), "activity": activity }, + }) + .to_string(); + + let failed = { + let mut guard = self.stream.lock(); + write_frame(&mut **guard, OP_FRAME, payload.as_bytes()).is_err() + }; + if failed { + self.close(); + return false; + } + true + } + + pub fn close(&self) { + self.alive.store(false, Ordering::Release); + self.stream.lock().shutdown(); + } +} + +fn spawn_reader( + mut reader: Box, + writer: Arc>>, + alive: Arc, +) { + let on_exit = Arc::clone(&alive); + let spawned = std::thread::Builder::new() + .name("discord-rpc-read".into()) + .spawn(move || { + loop { + match read_frame(&mut *reader) { + Ok((OP_PING, payload)) => { + if write_frame(&mut **writer.lock(), OP_PONG, &payload).is_err() { + break; + } + } + Ok((OP_CLOSE, payload)) => { + tracing::info!( + target: "Media", + "discord: connection closed by client: {}", + String::from_utf8_lossy(&payload) + ); + break; + } + Ok(_) => {} + Err(_) => break, + } + } + on_exit.store(false, Ordering::Release); + }); + + if spawned.is_err() { + alive.store(false, Ordering::Release); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn frames_round_trip() { + let mut buf = Vec::new(); + write_frame(&mut buf, OP_FRAME, b"{\"a\":1}").ok(); + let (op, payload) = match read_frame(&mut buf.as_slice()) { + Ok(v) => v, + Err(_) => unreachable!("round trip"), + }; + assert_eq!(op, OP_FRAME); + assert_eq!(payload, b"{\"a\":1}"); + } + + #[test] + fn header_is_little_endian() { + let mut buf = Vec::new(); + write_frame(&mut buf, OP_HANDSHAKE, b"hi").ok(); + assert_eq!(&buf[0..4], &[0, 0, 0, 0]); + assert_eq!(&buf[4..8], &[2, 0, 0, 0]); + assert_eq!(&buf[8..], b"hi"); + } + + #[test] + fn oversized_length_is_rejected_before_allocating() { + let mut frame = Vec::new(); + frame.extend_from_slice(&OP_FRAME.to_le_bytes()); + frame.extend_from_slice(&u32::MAX.to_le_bytes()); + assert!(read_frame(&mut frame.as_slice()).is_err()); + } + + #[test] + fn truncated_frame_is_an_error_not_a_panic() { + let mut frame = Vec::new(); + frame.extend_from_slice(&OP_FRAME.to_le_bytes()); + frame.extend_from_slice(&64u32.to_le_bytes()); + frame.extend_from_slice(b"short"); + assert!(read_frame(&mut frame.as_slice()).is_err()); + } + + #[test] + fn candidates_are_probed_in_index_order() { + let c = platform::candidates(); + assert!(!c.is_empty()); + let first = c.first().map(|p| p.to_string_lossy().into_owned()); + assert_eq!( + first.as_deref().map(|s| s.ends_with("discord-ipc-0")), + Some(true) + ); + } +} diff --git a/src/discord/src/lib.rs b/src/discord/src/lib.rs new file mode 100644 index 000000000..8ad5a5fef --- /dev/null +++ b/src/discord/src/lib.rs @@ -0,0 +1,6 @@ +mod activity; +mod ipc; +mod projection; +mod sink; + +pub use sink::{start, stop}; diff --git a/src/discord/src/projection.rs b/src/discord/src/projection.rs new file mode 100644 index 000000000..7a5fc3564 --- /dev/null +++ b/src/discord/src/projection.rs @@ -0,0 +1,521 @@ +use jfn_playback::{ItemKind, MediaMetadata, PlaybackPhase}; + +const TYPE_LISTENING: u8 = 2; +const TYPE_WATCHING: u8 = 3; + +const TEXT_MAX_CHARS: usize = 128; +const TEXT_MIN_CHARS: usize = 2; + +pub const ASSET_LOGO: &str = "logo"; +pub const ASSET_PAUSE: &str = "pause"; + +#[derive(Clone, Copy, Debug)] +pub struct ProjectInput<'a> { + pub phase: PlaybackPhase, + pub seeking: bool, + pub buffering: bool, + pub rate: f64, + pub position_us: i64, + pub duration_us: i64, + pub meta: &'a MediaMetadata, + pub timeline_armed: bool, +} + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct Timeline { + pub position_us: i64, + pub duration_us: i64, + pub rate: f64, +} + +const MAX_BUTTONS: usize = 2; +const MAX_ID_CHARS: usize = 32; + +#[derive(Clone, Debug, PartialEq)] +pub struct Button { + pub label: &'static str, + pub url: String, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct Activity { + pub activity_type: u8, + pub name: String, + pub details: String, + pub state: String, + pub large_image: String, + pub large_text: String, + pub small_image: &'static str, + pub small_text: String, + pub timeline: Option, + pub buttons: Vec