Remove buffer mode feature and relocate cache metrics
All checks were successful
Build and Release / build-and-release (push) Successful in 56s
All checks were successful
Build and Release / build-and-release (push) Successful in 56s
- Remove buffer mode toggle (Normal/Large/Huge) as demuxer settings do not significantly impact local file playback - Move cache duration metric from title bar to bottom status bar - Display cache alongside codec, bitrate, and sample rate info - Remove 'b' key binding and Buffer context menu option - Update version to 0.1.15
This commit is contained in:
parent
ed6765039c
commit
ea72368841
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "cm-player"
|
name = "cm-player"
|
||||||
version = "0.1.14"
|
version = "0.1.15"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@ -348,7 +348,7 @@ async fn handle_key_event<B: ratatui::backend::Backend>(terminal: &mut Terminal<
|
|||||||
let max_items = match menu.menu_type {
|
let max_items = match menu.menu_type {
|
||||||
ContextMenuType::FilePanel => 2,
|
ContextMenuType::FilePanel => 2,
|
||||||
ContextMenuType::Playlist => 2,
|
ContextMenuType::Playlist => 2,
|
||||||
ContextMenuType::TitleBar => 3,
|
ContextMenuType::TitleBar => 4,
|
||||||
};
|
};
|
||||||
if menu.selected_index < max_items - 1 {
|
if menu.selected_index < max_items - 1 {
|
||||||
menu.selected_index += 1;
|
menu.selected_index += 1;
|
||||||
@ -700,7 +700,7 @@ fn handle_mouse_event(state: &mut AppState, mouse: MouseEvent, title_bar_area: r
|
|||||||
let items = match menu.menu_type {
|
let items = match menu.menu_type {
|
||||||
ContextMenuType::FilePanel => 2,
|
ContextMenuType::FilePanel => 2,
|
||||||
ContextMenuType::Playlist => 2,
|
ContextMenuType::Playlist => 2,
|
||||||
ContextMenuType::TitleBar => 3,
|
ContextMenuType::TitleBar => 4,
|
||||||
};
|
};
|
||||||
let popup_width = 13;
|
let popup_width = 13;
|
||||||
let popup_height = items as u16 + 2; // +2 for borders
|
let popup_height = items as u16 + 2; // +2 for borders
|
||||||
|
|||||||
@ -21,6 +21,7 @@ pub struct Player {
|
|||||||
pub audio_codec: Option<String>,
|
pub audio_codec: Option<String>,
|
||||||
pub audio_bitrate: Option<f64>,
|
pub audio_bitrate: Option<f64>,
|
||||||
pub sample_rate: Option<i64>,
|
pub sample_rate: Option<i64>,
|
||||||
|
pub cache_duration: Option<f64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Player {
|
impl Player {
|
||||||
@ -62,6 +63,7 @@ impl Player {
|
|||||||
audio_codec: None,
|
audio_codec: None,
|
||||||
audio_bitrate: None,
|
audio_bitrate: None,
|
||||||
sample_rate: None,
|
sample_rate: None,
|
||||||
|
cache_duration: None,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,6 +121,7 @@ impl Player {
|
|||||||
self.audio_codec = None;
|
self.audio_codec = None;
|
||||||
self.audio_bitrate = None;
|
self.audio_bitrate = None;
|
||||||
self.sample_rate = None;
|
self.sample_rate = None;
|
||||||
|
self.cache_duration = None;
|
||||||
|
|
||||||
// Wait for socket to be created and mpv to be ready
|
// Wait for socket to be created and mpv to be ready
|
||||||
std::thread::sleep(Duration::from_millis(800));
|
std::thread::sleep(Duration::from_millis(800));
|
||||||
@ -246,6 +249,13 @@ impl Player {
|
|||||||
self.is_idle = idle;
|
self.is_idle = idle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update cache duration (how many seconds are buffered ahead)
|
||||||
|
if let Some(val) = self.get_property("demuxer-cache-duration") {
|
||||||
|
self.cache_duration = val.as_f64();
|
||||||
|
} else {
|
||||||
|
self.cache_duration = None;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_metadata(&mut self) {
|
pub fn update_metadata(&mut self) {
|
||||||
|
|||||||
@ -34,7 +34,7 @@ pub fn render(frame: &mut Frame, state: &mut AppState, player: &Player) -> (Rect
|
|||||||
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)])
|
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)])
|
||||||
.split(main_chunks[1]);
|
.split(main_chunks[1]);
|
||||||
|
|
||||||
render_title_bar(frame, state, main_chunks[0]);
|
render_title_bar(frame, state, player, main_chunks[0]);
|
||||||
render_file_panel(frame, state, content_chunks[0]);
|
render_file_panel(frame, state, content_chunks[0]);
|
||||||
render_right_panel(frame, state, content_chunks[1]);
|
render_right_panel(frame, state, content_chunks[1]);
|
||||||
render_status_bar(frame, state, player, main_chunks[2]);
|
render_status_bar(frame, state, player, main_chunks[2]);
|
||||||
@ -349,7 +349,7 @@ fn render_right_panel(frame: &mut Frame, state: &mut AppState, area: Rect) {
|
|||||||
frame.render_stateful_widget(playlist_widget, area, &mut playlist_state);
|
frame.render_stateful_widget(playlist_widget, area, &mut playlist_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_title_bar(frame: &mut Frame, state: &AppState, area: Rect) {
|
fn render_title_bar(frame: &mut Frame, state: &AppState, _player: &Player, area: Rect) {
|
||||||
let background_color = match state.player_state {
|
let background_color = match state.player_state {
|
||||||
PlayerState::Playing => Theme::success(), // Green for playing
|
PlayerState::Playing => Theme::success(), // Green for playing
|
||||||
PlayerState::Paused => Theme::highlight(), // Blue for paused
|
PlayerState::Paused => Theme::highlight(), // Blue for paused
|
||||||
@ -521,7 +521,7 @@ fn render_status_bar(frame: &mut Frame, state: &AppState, player: &Player, area:
|
|||||||
left_parts.push(title.clone());
|
left_parts.push(title.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Right side: Bitrate | Codec | Sample rate
|
// Right side: Bitrate | Codec | Sample rate | Cache
|
||||||
if let Some(bitrate) = player.audio_bitrate {
|
if let Some(bitrate) = player.audio_bitrate {
|
||||||
right_parts.push(format!("{:.0} kbps", bitrate));
|
right_parts.push(format!("{:.0} kbps", bitrate));
|
||||||
}
|
}
|
||||||
@ -534,6 +534,12 @@ fn render_status_bar(frame: &mut Frame, state: &AppState, player: &Player, area:
|
|||||||
right_parts.push(format!("{} Hz", samplerate));
|
right_parts.push(format!("{} Hz", samplerate));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(cache_dur) = player.cache_duration {
|
||||||
|
if cache_dur > 0.0 {
|
||||||
|
right_parts.push(format!("Cache:{:.1}s", cache_dur));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Create layout for left and right sections
|
// Create layout for left and right sections
|
||||||
let chunks = Layout::default()
|
let chunks = Layout::default()
|
||||||
.direction(Direction::Horizontal)
|
.direction(Direction::Horizontal)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user