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
+30 -23
View File
@@ -193,9 +193,10 @@ fn playback_checks_are_local_to_views_and_previews_and_pruned_with_collections()
#[test]
fn playback_checks_render_independently_and_live_hints_use_configured_keys() {
let mut app = app(&["tubular"]);
let document = "[keys.video.select]\ntoggle = 'f20'\nclear = 'f21'\n"
.parse::<toml_edit::DocumentMut>()
.unwrap();
let document =
"[keys.video.select]\ntoggle = 'f20'\nclear = 'f21'\n[keys.video]\nenqueue = 'f22'\n"
.parse::<toml_edit::DocumentMut>()
.unwrap();
app.config.keys = keys::Bindings::from_toml(document.get("keys")).unwrap();
app.key_hints = KeyHints::new(&app.config.keys);
for context in [
@@ -206,7 +207,7 @@ fn playback_checks_render_independently_and_live_hints_use_configured_keys() {
Context::CollectionInfo,
Context::CollectionDescription,
] {
for key in ["F20", "F21"] {
for key in ["F20", "F21", "F22"] {
assert!(app.key_hints.footer(context).contains(key));
assert!(app.key_hints.preview.iter().all(|hint| hint.contains(key)));
assert!(app.config.keys.help_text().to_string().contains(key));
@@ -238,27 +239,33 @@ fn playback_checks_render_independently_and_live_hints_use_configured_keys() {
#[test]
fn playback_checks_survive_spawn_failure_clear_after_spawn_and_fall_back_to_hover() {
let mut app = app(&["tubular"]);
app.views[0].videos = youtube::search_results(
for modifiers in [
KeyModifiers::NONE,
KeyModifiers::SUPER,
KeyModifiers::CONTROL,
] {
let mut app = app(&["tubular"]);
app.views[0].videos = youtube::search_results(
r#"{"entries":[{"id":"jNQXAC9IVRw","title":"First"},{"id":"rQ_J9WH6CGk","title":"Second"}]}"#,
).unwrap().videos;
app.views[0].selection.select(Some(1));
assert_eq!(app.views[0].playback_videos()[0].id, "rQ_J9WH6CGk");
app.views[0].toggle_checked();
app.views[0].selection.select(Some(0));
app.options.player = "/nonexistent/tubular-test-player".into();
app.play();
assert!(app.player_launch.is_none());
assert!(app.views[0].checked.contains("rQ_J9WH6CGk"));
assert_eq!(app.views[0].playback_videos()[0].id, "rQ_J9WH6CGk");
app.options.player = "/usr/bin/true".into();
app.play();
assert!(app.player_launch.is_some());
assert!(app.views[0].checked.is_empty());
assert_eq!(app.views[0].playback_videos()[0].id, "jNQXAC9IVRw");
app.player_launch = None;
app.play();
assert!(app.player_launch.is_some());
app.views[0].selection.select(Some(1));
assert_eq!(app.views[0].playback_videos()[0].id, "rQ_J9WH6CGk");
app.views[0].toggle_checked();
app.views[0].selection.select(Some(0));
app.options.player = "/nonexistent/tubular-test-player".into();
app.key(KeyEvent::new(KeyCode::Enter, modifiers));
assert!(app.player_launch.is_none());
assert!(app.views[0].checked.contains("rQ_J9WH6CGk"));
assert_eq!(app.views[0].playback_videos()[0].id, "rQ_J9WH6CGk");
app.options.player = "/usr/bin/true".into();
app.key(KeyEvent::new(KeyCode::Enter, modifiers));
assert!(app.player_launch.is_some());
assert!(app.views[0].checked.is_empty());
assert_eq!(app.views[0].playback_videos()[0].id, "jNQXAC9IVRw");
app.player_launch = None;
app.key(KeyEvent::new(KeyCode::Enter, modifiers));
assert!(app.player_launch.is_some());
}
}
#[test]