diff --git a/src/player/state.rs b/src/player/state.rs new file mode 100644 index 0000000..4c89971 --- /dev/null +++ b/src/player/state.rs @@ -0,0 +1,83 @@ +//! Player state management + +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum PlaybackState { + Stopped, + Playing, + Paused, +} + +impl Default for PlaybackState { + fn default() -> Self { + Self::Stopped + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PlayerState { + pub playback: PlaybackState, + pub current_frame: u64, + pub total_frames: u64, + pub current_time_ms: u64, + pub duration_ms: u64, + pub fps: f64, + pub volume: f32, + pub muted: bool, + pub speed: f32, + pub show_subtitle: bool, + pub show_yolo: bool, + pub show_chunks: bool, + pub zoom: f32, + pub pan_x: f32, + pub pan_y: f32, +} + +impl Default for PlayerState { + fn default() -> Self { + Self { + playback: PlaybackState::Stopped, + current_frame: 0, + total_frames: 0, + current_time_ms: 0, + duration_ms: 0, + fps: 0.0, + volume: 1.0, + muted: false, + speed: 1.0, + show_subtitle: false, + show_yolo: false, + show_chunks: false, + zoom: 1.0, + pan_x: 0.0, + pan_y: 0.0, + } + } +} + +impl PlayerState { + pub fn frame_to_time(frame: u64, fps: f64) -> u64 { + if fps > 0.0 { + ((frame as f64 / fps) * 1000.0) as u64 + } else { + 0 + } + } + + pub fn time_to_frame(time_ms: u64, fps: f64) -> u64 { + if fps > 0.0 { + ((time_ms as f64 / 1000.0) * fps) as u64 + } else { + 0 + } + } + + pub fn format_time(ms: u64) -> String { + let total_secs = ms / 1000; + let hours = total_secs / 3600; + let minutes = (total_secs % 3600) / 60; + let seconds = total_secs % 60; + format!("{:02}:{:02}:{:02}", hours, minutes, seconds) + } +}