From 67073417c345cc7399808ffec03a7e34eb350b91 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 10 Nov 2018 04:52:09 -0500 Subject: add a command to recommend things to listen to --- src/cmd/recommend.rs | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/cmd/recommend.rs (limited to 'src/cmd/recommend.rs') diff --git a/src/cmd/recommend.rs b/src/cmd/recommend.rs new file mode 100644 index 0000000..6788e0c --- /dev/null +++ b/src/cmd/recommend.rs @@ -0,0 +1,89 @@ +use db; +use util; + +use clap; + +pub struct Command { + count: u64, + random: bool, + album: bool, + include: db::TimeWindow, + exclude: db::TimeWindow, + + db: db::DB, +} + +pub fn subcommand<'a, 'b>() -> clap::App<'a, 'b> { + clap::SubCommand::with_name("recommend") + .about("Recommends an artist or album to listen to") + .arg( + clap::Arg::with_name("count") + .default_value("20") + .help("number of results to return") + ) + .arg( + clap::Arg::with_name("random") + .long("random") + .help("pick a random artist instead of by weight") + ) + .arg( + clap::Arg::with_name("album") + .long("album") + .help("also choose a random album by the chosen artists") + ) + .arg( + clap::Arg::with_name("include") + .long("include") + .default_value("yearly") + .possible_values(&["all", "yearly", "monthly", "weekly"]) + ) + .arg( + clap::Arg::with_name("exclude") + .long("exclude") + .default_value("weekly") + .possible_values(&["all", "yearly", "monthly", "weekly", "none"]) + ) +} + +impl Command { + pub fn new<'a>(matches: &clap::ArgMatches<'a>) -> failure::Fallible { + Ok(Command { + count: matches.value_of("count").unwrap().parse()?, + random: matches.is_present("random"), + album: matches.is_present("album"), + include: db::parse_timewindow(matches.value_of("include").unwrap()), + exclude: db::parse_timewindow(matches.value_of("exclude").unwrap()), + + db: db::DB::new(&util::db_path()?)?, + }) + } +} + +impl super::Command for Command { + fn run(&self) -> failure::Fallible<()> { + let mut artists = self.db.recommend_artists( + self.count, + self.random, + self.include, + self.exclude + )?; + if self.album { + artists = artists.iter().map(|artist| { + Ok(format!( + "{} - {}", + artist, + self.db.recommend_album( + &artist, + self.random, + self.include, + self.exclude + )? + )) + }).collect::>>()?; + } + for line in artists { + println!("{}", line); + } + Ok(()) + } +} -- cgit v1.2.3-54-g00ecf