// yt - A fully featured command line YouTube client // // Copyright (C) 2024 Benedikt Peetz // SPDX-License-Identifier: GPL-3.0-or-later // // This file is part of Yt. // // You should have received a copy of the License along with this program. // If not, see . use anyhow::Result; use display::{format_video::FormatVideo, FormattedVideo}; use futures::{stream::FuturesUnordered, TryStreamExt}; use nucleo_matcher::{ pattern::{CaseMatching, Normalization, Pattern}, Matcher, }; pub mod display; use crate::{ app::App, storage::video_database::{getters::get_videos, VideoStatus}, }; pub async fn query(app: &App, limit: Option, search_query: Option) -> Result<()> { let all_videos = get_videos(app, VideoStatus::ALL, None).await?; // turn one video to a color display, to pre-warm the hash shrinking cache if let Some(val) = all_videos.first() { val.to_formatted_video(app).await?; } let limit = limit.unwrap_or(all_videos.len()); let all_video_strings: Vec = all_videos .into_iter() .take(limit) .map(|vid| vid.to_formatted_video_owned(app)) .collect::>() .try_collect::>() .await? .into_iter() .map(|vid| (&vid.colorize()).to_line_display()) .collect(); if let Some(query) = search_query { let mut matcher = Matcher::new(nucleo_matcher::Config::DEFAULT.match_paths()); let matches = Pattern::parse( &query.replace(' ', "\\ "), CaseMatching::Ignore, Normalization::Smart, ) .match_list(all_video_strings, &mut matcher); matches .iter() .rev() .for_each(|(val, key)| println!("{} ({})", val, key)); } else { println!("{}", all_video_strings.join("\n")) } Ok(()) }