mirror of https://github.com/dnaka91/obws
Adjust to the latest changes from obs-websocket
parent
430b408ea9
commit
1f2a7c155b
@ -0,0 +1,56 @@
|
||||
use time::Duration;
|
||||
|
||||
use super::Client;
|
||||
use crate::{common::MediaAction, requests::RequestType, responses, Result};
|
||||
|
||||
/// API functions related to media inputs.
|
||||
pub struct MediaInputs<'a> {
|
||||
pub(super) client: &'a Client,
|
||||
}
|
||||
|
||||
impl<'a> MediaInputs<'a> {
|
||||
pub async fn get_media_input_status(&self, input_name: &str) -> Result<responses::MediaStatus> {
|
||||
self.client
|
||||
.send_message(RequestType::GetMediaInputStatus { input_name })
|
||||
.await
|
||||
}
|
||||
|
||||
pub async fn set_media_input_cursor(
|
||||
&self,
|
||||
input_name: &str,
|
||||
media_cursor: Duration,
|
||||
) -> Result<()> {
|
||||
self.client
|
||||
.send_message(RequestType::SetMediaInputCursor {
|
||||
input_name,
|
||||
media_cursor,
|
||||
})
|
||||
.await
|
||||
}
|
||||
|
||||
pub async fn offset_media_input_cursor(
|
||||
&self,
|
||||
input_name: &str,
|
||||
media_cursor_offset: Duration,
|
||||
) -> Result<()> {
|
||||
self.client
|
||||
.send_message(RequestType::OffsetMediaInputCursor {
|
||||
input_name,
|
||||
media_cursor_offset,
|
||||
})
|
||||
.await
|
||||
}
|
||||
|
||||
pub async fn trigger_media_input_action(
|
||||
&self,
|
||||
input_name: &str,
|
||||
media_action: MediaAction,
|
||||
) -> Result<()> {
|
||||
self.client
|
||||
.send_message(RequestType::TriggerMediaInputAction {
|
||||
input_name,
|
||||
media_action,
|
||||
})
|
||||
.await
|
||||
}
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
use super::Client;
|
||||
use crate::{requests::RequestType, responses, Result};
|
||||
|
||||
/// API functions related to recording.
|
||||
pub struct Recording<'a> {
|
||||
pub(super) client: &'a Client,
|
||||
}
|
||||
|
||||
impl<'a> Recording<'a> {
|
||||
pub async fn get_record_status(&self) -> Result<responses::RecordStatus> {
|
||||
self.client.send_message(RequestType::GetRecordStatus).await
|
||||
}
|
||||
|
||||
pub async fn toggle_record(&self) -> Result<bool> {
|
||||
self.client
|
||||
.send_message::<responses::OutputActive>(RequestType::ToggleRecord)
|
||||
.await
|
||||
.map(|oa| oa.output_active)
|
||||
}
|
||||
|
||||
pub async fn start_record(&self) -> Result<()> {
|
||||
self.client.send_message(RequestType::StartRecord).await
|
||||
}
|
||||
|
||||
pub async fn stop_record(&self) -> Result<()> {
|
||||
self.client.send_message(RequestType::StopRecord).await
|
||||
}
|
||||
|
||||
pub async fn toggle_record_pause(&self) -> Result<bool> {
|
||||
self.client
|
||||
.send_message::<responses::OutputPaused>(RequestType::ToggleRecordPause)
|
||||
.await
|
||||
.map(|op| op.output_paused)
|
||||
}
|
||||
|
||||
pub async fn pause_record(&self) -> Result<()> {
|
||||
self.client.send_message(RequestType::PauseRecord).await
|
||||
}
|
||||
|
||||
pub async fn resume_record(&self) -> Result<()> {
|
||||
self.client.send_message(RequestType::ResumeRecord).await
|
||||
}
|
||||
|
||||
// Currently disabled in obs-websocket and will always fail.
|
||||
#[doc(hidden)]
|
||||
pub async fn get_record_directory(&self) -> Result<String> {
|
||||
self.client
|
||||
.send_message::<responses::RecordDirectory>(RequestType::GetRecordDirectory)
|
||||
.await
|
||||
.map(|rd| rd.record_directory)
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
use bitflags::bitflags;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
bitflags! {
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[serde(transparent)]
|
||||
pub struct Alignment: u32 {
|
||||
const CENTER = 0;
|
||||
const LEFT = 1 << 0;
|
||||
const RIGHT = 1 << 1;
|
||||
const TOP = 1 << 2;
|
||||
const BOTTOM = 1 << 3;
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
|
||||
pub enum BoundsType {
|
||||
#[serde(rename = "OBS_BOUNDS_NONE")]
|
||||
None,
|
||||
#[serde(rename = "OBS_BOUNDS_STRETCH")]
|
||||
Stretch,
|
||||
#[serde(rename = "OBS_BOUNDS_SCALE_INNER")]
|
||||
ScaleInner,
|
||||
#[serde(rename = "OBS_BOUNDS_SCALE_OUTER")]
|
||||
ScaleOuter,
|
||||
#[serde(rename = "OBS_BOUNDS_SCALE_TO_WIDTH")]
|
||||
ScaleToWidth,
|
||||
#[serde(rename = "OBS_BOUNDS_SCALE_TO_HEIGHT")]
|
||||
ScaleToHeight,
|
||||
#[serde(rename = "OBS_BOUNDS_MAX_ONLY")]
|
||||
MaxOnly,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
|
||||
pub enum MediaAction {
|
||||
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY")]
|
||||
Play,
|
||||
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PAUSE")]
|
||||
Pause,
|
||||
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_STOP")]
|
||||
Stop,
|
||||
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_RESTART")]
|
||||
Restart,
|
||||
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NEXT")]
|
||||
Next,
|
||||
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PREVIOUS")]
|
||||
Previous,
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
use serde::Serializer;
|
||||
use time::Duration;
|
||||
|
||||
pub fn duration_nanos<S>(value: &Duration, serializer: S) -> Result<S::Ok, S::Error>
|
||||
pub fn duration_millis<S>(value: &Duration, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_i128(value.whole_nanoseconds())
|
||||
serializer.serialize_i128(value.whole_milliseconds())
|
||||
}
|
||||
|
@ -0,0 +1,28 @@
|
||||
#![cfg(feature = "test-integration")]
|
||||
|
||||
use anyhow::Result;
|
||||
use obws::common::MediaAction;
|
||||
use time::Duration;
|
||||
|
||||
use crate::common::TEST_MEDIA;
|
||||
|
||||
mod common;
|
||||
|
||||
#[tokio::test]
|
||||
async fn main() -> Result<()> {
|
||||
let client = common::new_client().await?;
|
||||
let client = client.media_inputs();
|
||||
|
||||
client.get_media_input_status(TEST_MEDIA).await?;
|
||||
client
|
||||
.set_media_input_cursor(TEST_MEDIA, Duration::seconds(1))
|
||||
.await?;
|
||||
client
|
||||
.offset_media_input_cursor(TEST_MEDIA, Duration::seconds(1))
|
||||
.await?;
|
||||
client
|
||||
.trigger_media_input_action(TEST_MEDIA, MediaAction::Next)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
@ -0,0 +1,96 @@
|
||||
#![cfg(feature = "test-integration")]
|
||||
|
||||
use std::time::Duration;
|
||||
|
||||
use anyhow::Result;
|
||||
use obws::events::{Event, OutputState};
|
||||
use tokio::time;
|
||||
|
||||
mod common;
|
||||
|
||||
#[tokio::test]
|
||||
async fn main() -> Result<()> {
|
||||
let client = common::new_client().await?;
|
||||
let events = client.events()?;
|
||||
let client = client.recording();
|
||||
|
||||
tokio::pin!(events);
|
||||
|
||||
client.get_record_status().await?;
|
||||
|
||||
client.start_record().await?;
|
||||
wait_for!(
|
||||
events,
|
||||
Event::RecordStateChanged {
|
||||
output_state: OutputState::Started,
|
||||
..
|
||||
}
|
||||
);
|
||||
time::sleep(Duration::from_secs(1)).await;
|
||||
client.pause_record().await?;
|
||||
wait_for!(
|
||||
events,
|
||||
Event::RecordStateChanged {
|
||||
output_state: OutputState::Paused,
|
||||
..
|
||||
}
|
||||
);
|
||||
time::sleep(Duration::from_secs(1)).await;
|
||||
client.resume_record().await?;
|
||||
wait_for!(
|
||||
events,
|
||||
Event::RecordStateChanged {
|
||||
output_state: OutputState::Resumed,
|
||||
..
|
||||
}
|
||||
);
|
||||
time::sleep(Duration::from_secs(1)).await;
|
||||
client.stop_record().await?;
|
||||
wait_for!(
|
||||
events,
|
||||
Event::RecordStateChanged {
|
||||
output_state: OutputState::Stopped,
|
||||
..
|
||||
}
|
||||
);
|
||||
time::sleep(Duration::from_secs(1)).await;
|
||||
|
||||
client.toggle_record().await?;
|
||||
wait_for!(
|
||||
events,
|
||||
Event::RecordStateChanged {
|
||||
output_state: OutputState::Started,
|
||||
..
|
||||
}
|
||||
);
|
||||
time::sleep(Duration::from_secs(1)).await;
|
||||
client.toggle_record_pause().await?;
|
||||
wait_for!(
|
||||
events,
|
||||
Event::RecordStateChanged {
|
||||
output_state: OutputState::Paused,
|
||||
..
|
||||
}
|
||||
);
|
||||
time::sleep(Duration::from_secs(1)).await;
|
||||
client.toggle_record_pause().await?;
|
||||
wait_for!(
|
||||
events,
|
||||
Event::RecordStateChanged {
|
||||
output_state: OutputState::Resumed,
|
||||
..
|
||||
}
|
||||
);
|
||||
time::sleep(Duration::from_secs(1)).await;
|
||||
client.toggle_record().await?;
|
||||
wait_for!(
|
||||
events,
|
||||
Event::RecordStateChanged {
|
||||
output_state: OutputState::Stopped,
|
||||
..
|
||||
}
|
||||
);
|
||||
time::sleep(Duration::from_secs(1)).await;
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in New Issue