feat: queue videos in running player

This commit is contained in:
2026-10-22 16:02:39 +02:00
parent b12bba9125
commit 585907f876
10 changed files with 193 additions and 73 deletions
+51 -35
View File
@@ -647,20 +647,30 @@ fn catalog_and_saved_show_rows_cannot_be_checked() {
let mut browser = directory.browser(Some("anime"));
catalog_results(&mut browser);
browser.key(KeyEvent::new(KeyCode::Char(' '), KeyModifiers::NONE));
let generation = browser.generation;
browser.key(KeyEvent::new(KeyCode::Enter, KeyModifiers::CONTROL));
assert_eq!(browser.generation, generation);
assert!(matches!(browser.screen().content, Content::Catalog { .. }));
assert!(browser.player.is_none());
assert!(browser.screen().checked.is_empty());
assert!(browser.screen().playback_videos().is_empty());
assert!(
!browser
.bindings()
.iter()
.any(|(action, _)| { matches!(action, Action::VideoToggle | Action::VideoClear) })
);
assert!(!browser.bindings().iter().any(|(action, _)| {
matches!(
action,
Action::VideoToggle | Action::VideoClear | Action::VideoEnqueue
)
}));
browser
.state
.save_show(&media("first"), &BTreeSet::new())
.unwrap();
browser.library(BTreeSet::new());
browser.key(KeyEvent::new(KeyCode::Char(' '), KeyModifiers::NONE));
let generation = browser.generation;
browser.key(KeyEvent::new(KeyCode::Enter, KeyModifiers::SUPER));
assert_eq!(browser.generation, generation);
assert!(matches!(browser.screen().content, Content::Library { .. }));
assert!(browser.player.is_none());
assert!(browser.screen().checked.is_empty());
assert!(browser.screen().playback_videos().is_empty());
enter_series(&mut browser);
@@ -726,33 +736,39 @@ fn collection_checks_prune_hidden_and_removed_episodes_without_resurrection() {
#[cfg(unix)]
#[test]
fn episode_launch_retains_checks_on_failure_and_clears_only_after_spawn() {
let directory = Directory::new();
let mut browser = directory.browser(Some("anime"));
catalog_results(&mut browser);
enter_series(&mut browser);
let first = browser.screen().selected_video().unwrap();
browser.key(KeyEvent::new(KeyCode::Char(' '), KeyModifiers::NONE));
browser.select(Action::VideoNext);
let hovered = browser.screen().selected_video().unwrap();
browser.save(CollectionKind::Saved);
browser.set_watch_status(WatchStatus::Watching);
assert!(!browser.state.contains(CollectionKind::Saved, &first.id));
assert!(!browser.state.contains(CollectionKind::Watching, &first.id));
assert!(browser.state.contains(CollectionKind::Saved, &hovered.id));
assert!(
browser
.state
.contains(CollectionKind::Watching, &hovered.id)
);
browser.open();
assert!(browser.screen().error.is_some());
assert_eq!(browser.screen().checked, BTreeSet::from([first.id.clone()]));
assert_eq!(browser.screen().playback_videos()[0].id, first.id);
browser.key(KeyEvent::new(KeyCode::Char(' '), KeyModifiers::NONE));
browser.options.player = "/usr/bin/true".into();
browser.open();
assert!(browser.screen().error.is_none());
assert!(browser.player.is_some());
assert!(browser.screen().checked.is_empty());
assert_eq!(browser.screen().playback_videos()[0].id, hovered.id);
for modifiers in [
KeyModifiers::NONE,
KeyModifiers::SUPER,
KeyModifiers::CONTROL,
] {
let directory = Directory::new();
let mut browser = directory.browser(Some("anime"));
catalog_results(&mut browser);
enter_series(&mut browser);
let first = browser.screen().selected_video().unwrap();
browser.key(KeyEvent::new(KeyCode::Char(' '), KeyModifiers::NONE));
browser.select(Action::VideoNext);
let hovered = browser.screen().selected_video().unwrap();
browser.save(CollectionKind::Saved);
browser.set_watch_status(WatchStatus::Watching);
assert!(!browser.state.contains(CollectionKind::Saved, &first.id));
assert!(!browser.state.contains(CollectionKind::Watching, &first.id));
assert!(browser.state.contains(CollectionKind::Saved, &hovered.id));
assert!(
browser
.state
.contains(CollectionKind::Watching, &hovered.id)
);
browser.key(KeyEvent::new(KeyCode::Enter, modifiers));
assert!(browser.screen().error.is_some());
assert_eq!(browser.screen().checked, BTreeSet::from([first.id.clone()]));
assert_eq!(browser.screen().playback_videos()[0].id, first.id);
browser.key(KeyEvent::new(KeyCode::Char(' '), KeyModifiers::NONE));
browser.options.player = "/usr/bin/true".into();
browser.key(KeyEvent::new(KeyCode::Enter, modifiers));
assert!(browser.screen().error.is_none());
assert!(browser.player.is_some());
assert!(browser.screen().checked.is_empty());
assert_eq!(browser.screen().playback_videos()[0].id, hovered.id);
}
}