diff options
Diffstat (limited to 'src/select')
-rw-r--r-- | src/select/mod.rs | 94 |
1 files changed, 42 insertions, 52 deletions
diff --git a/src/select/mod.rs b/src/select/mod.rs index 2288e1a..695e7ed 100644 --- a/src/select/mod.rs +++ b/src/select/mod.rs @@ -33,53 +33,7 @@ use tokio::process::Command; pub mod cmds; pub mod selection_file; -pub async fn select(app: &App, done: bool) -> Result<()> { - let matching_videos = if done { - get_videos( - app, - &[ - VideoStatus::Pick, - // - VideoStatus::Watch, - VideoStatus::Cached, - VideoStatus::Watched, - // - VideoStatus::Drop, - VideoStatus::Dropped, - ], - None, - ) - .await? - } else { - get_videos( - app, - &[ - VideoStatus::Pick, - // - VideoStatus::Watch, - VideoStatus::Cached, - ], - None, - ) - .await? - }; - - // Warmup the cache for the display rendering of the videos. - // Otherwise the futures would all try to warm it up at the same time. - if let Some(vid) = matching_videos.get(0) { - let _ = vid.to_select_file_display(app).await?; - } - - let lines: Vec<String> = join_all( - matching_videos - .iter() - .map(|vid| async { vid.to_select_file_display(app).await }) - .collect::<Vec<_>>(), - ) - .await - .into_iter() - .collect::<Result<Vec<String>>>()?; - +pub async fn select(app: &App, done: bool, use_last_selection: bool) -> Result<()> { let temp_file = Builder::new() .prefix("yt_video_select-") .suffix(".yts") @@ -87,19 +41,55 @@ pub async fn select(app: &App, done: bool) -> Result<()> { .tempfile() .context("Failed to get tempfile")?; - { + if use_last_selection { + fs::copy(&app.config.paths.last_selection_path, &temp_file)?; + } else { + let matching_videos = if done { + get_videos(app, VideoStatus::ALL, None).await? + } else { + get_videos( + app, + &[ + VideoStatus::Pick, + // + VideoStatus::Watch, + VideoStatus::Cached, + ], + None, + ) + .await? + }; + + // Warmup the cache for the display rendering of the videos. + // Otherwise the futures would all try to warm it up at the same time. + if let Some(vid) = matching_videos.get(0) { + let _ = vid.to_select_file_display(app).await?; + } + let mut edit_file = BufWriter::new(&temp_file); - lines.iter().for_each(|line| { + join_all( + matching_videos + .iter() + .map(|vid| async { vid.to_select_file_display(app).await }) + .collect::<Vec<_>>(), + ) + .await + .into_iter() + .try_for_each(|line| -> Result<()> { + let line = line?; edit_file .write_all(line.as_bytes()) .expect("This write should not fail"); - }); - // edit_file.write_all(get_help().await?.as_bytes())?; + Ok(()) + })?; + edit_file.write_all(HELP_STR.as_bytes())?; edit_file.flush().context("Failed to flush edit file")?; + }; + { let editor = env::var("EDITOR").unwrap_or("nvim".to_owned()); let mut nvim = Command::new(editor); @@ -158,7 +148,7 @@ pub async fn select(app: &App, done: bool) -> Result<()> { } // // FIXME: There should be no reason why we need to re-run yt, just to get the help string. But I've -// // jet to find a way to do it with out the extra exec <2024-08-20> +// // yet to find a way to do it with out the extra exec <2024-08-20> // async fn get_help() -> Result<String> { // let binary_name = current_exe()?; // let cmd = Command::new(binary_name) |