diff --git a/src/file/env.rs b/src/file/env.rs index 1718b75..241de60 100644 --- a/src/file/env.rs +++ b/src/file/env.rs @@ -1,3 +1,4 @@ +use crate::params::Args; use crate::prelude::*; use std::fs::{File, OpenOptions}; @@ -12,13 +13,13 @@ pub struct FileEnv { pub append_line: FileAppendLineFn, } impl FileEnv { - pub fn create(directory: String) -> Self { - let open_dir = directory.clone(); - let append_dir = directory.clone(); + pub fn create(a: &Args) -> Self { + let open_dir = a.downloads.clone(); + let append_dir = a.downloads.clone(); Self { open: Box::new(move |file_name| { let path = format!("{}/{}", &open_dir, file_name); - let file = File::open(&path)?; + let file = File::open(path)?; Ok(file) }), append_line: Box::new(move |file_name, line| { @@ -27,7 +28,7 @@ impl FileEnv { .write(true) .append(true) .create(true) - .open(&path) + .open(path) .unwrap(); writeln!(file, "{}", line)?; Ok(()) diff --git a/src/file/read.rs b/src/file/read.rs index a5b6926..1bd98e8 100644 --- a/src/file/read.rs +++ b/src/file/read.rs @@ -18,7 +18,7 @@ pub fn lines_from(file_name: &str, e: &FileEnv) -> Result> { #[cfg(test)] mod tests { - use crate::test_utils::create_text_file; + use crate::{params::Args, test_utils::create_text_file}; use super::*; @@ -30,7 +30,10 @@ mod tests { file_name, include_bytes!("../../test/data/subscriptions.txt"), )?; - let file_env = FileEnv::create(dir.path().to_string_lossy().to_string()); + let file_env = FileEnv::create(&Args { + downloads: dir.path().to_string_lossy().to_string(), + history: "downloaded.txt".to_string(), + }); //when let result = lines_from(file_name, &file_env)?; @@ -49,7 +52,10 @@ mod tests { file_name, include_bytes!("../../test/data/subscriptions-blank-line.txt"), )?; - let file_env = FileEnv::create(dir.path().to_string_lossy().to_string()); + let file_env = FileEnv::create(&Args { + downloads: dir.path().to_string_lossy().to_string(), + history: "downloaded.txt".to_string(), + }); //when let result = lines_from(file_name, &file_env)?; @@ -68,7 +74,10 @@ mod tests { file_name, include_bytes!("../../test/data/subscriptions-comment.txt"), )?; - let file_env = FileEnv::create(dir.path().to_string_lossy().to_string()); + let file_env = FileEnv::create(&Args { + downloads: dir.path().to_string_lossy().to_string(), + history: "downloaded.txt".to_string(), + }); //when let result = lines_from(file_name, &file_env)?; diff --git a/src/history/add.rs b/src/history/add.rs index 492916b..7ea8036 100644 --- a/src/history/add.rs +++ b/src/history/add.rs @@ -13,6 +13,7 @@ mod tests { use crate::{ history::Link, + params::Args, test_utils::{create_text_file, read_text_file}, }; @@ -38,7 +39,10 @@ mod tests { add( &link, file_name, - &FileEnv::create(dir.path().to_string_lossy().to_string()), + &FileEnv::create(&Args { + downloads: dir.path().to_string_lossy().to_string(), + history: "downloaded.txt".to_string(), + }), )?; //then @@ -69,7 +73,10 @@ mod tests { add( &link, file_name, - &FileEnv::create(dir.path().to_string_lossy().to_string()), + &FileEnv::create(&Args { + downloads: dir.path().to_string_lossy().to_string(), + history: "downloaded.txt".to_string(), + }), )?; //then diff --git a/src/history/find.rs b/src/history/find.rs index 63c236b..148a623 100644 --- a/src/history/find.rs +++ b/src/history/find.rs @@ -18,7 +18,7 @@ pub fn find(link: &Link, file_name: &str, e: &FileEnv) -> Result { #[cfg(test)] mod test { - use crate::{history::Link, test_utils::create_text_file}; + use crate::{history::Link, params::Args, test_utils::create_text_file}; use super::*; #[test] @@ -38,7 +38,10 @@ mod test { let result = find( &link, file_name, - &FileEnv::create(dir.path().to_string_lossy().to_string()), + &FileEnv::create(&Args { + downloads: dir.path().to_string_lossy().to_string(), + history: "downloaded.txt".to_string(), + }), )?; //then @@ -70,7 +73,10 @@ mod test { let result = find( &link, file_name, - &FileEnv::create(dir.path().to_string_lossy().to_string()), + &FileEnv::create(&Args { + downloads: dir.path().to_string_lossy().to_string(), + history: "downloaded.txt".to_string(), + }), )?; //then @@ -102,7 +108,10 @@ mod test { let result = find( &link, file_name, - &FileEnv::create(dir.path().to_string_lossy().to_string()), + &FileEnv::create(&Args { + downloads: dir.path().to_string_lossy().to_string(), + history: "downloaded.txt".to_string(), + }), )?; //then diff --git a/src/lib.rs b/src/lib.rs index 67ceced..2095452 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +use params::Args; use prelude::*; mod errors; @@ -19,16 +20,16 @@ pub struct Env { pub file: FileEnv, } -pub fn run(subscriptions: &str, history: &str, site: &str, e: Env) -> Result<()> { +pub fn run(subscriptions: &str, site: &str, a: &Args, e: Env) -> Result<()> { for channel_name in file::read::lines_from(subscriptions, &e.file)? { println!("Channel: {}", channel_name); let feed_url = feed::find(site, &channel_name, &e.network)?; for entry in feed::get(&feed_url, &e.network)?.entries() { if let Some(link) = entry.links().get(0).cloned() { - if !history::find(&link, history, &e.file)? { + if !history::find(&link, &a.history, &e.file)? { println!("Downloading {}: {}", &channel_name, entry.title().as_str()); (e.network.download_as_mp3)(&link.href)?; - history::add(&link, history, &e.file)?; + history::add(&link, &a.history, &e.file)?; } } } @@ -65,6 +66,15 @@ mod tests { let history_file_name = "history"; let history_dir = create_text_file(history_file_name, "c1-f2\nc2-f3".as_bytes())?; + let history_file_name = format!( + "{}/{}", + history_dir.path().to_string_lossy(), + history_file_name + ); + let args = Args { + downloads: subs_dir.path().to_string_lossy().to_string(), + history: history_file_name.clone(), + }; let env = Env { network: NetworkEnv { fetch_as_text: mock_fetch_as_text_with_rss_url(HashMap::from([ @@ -89,21 +99,14 @@ mod tests { subs_file_name.to_string(), format!("{}/{}", subs_dir.path().to_string_lossy(), subs_file_name), ), - ( - history_file_name.to_string(), - format!( - "{}/{}", - history_dir.path().to_string_lossy(), - history_file_name - ), - ), + (history_file_name.to_string(), history_file_name), ])), append_line: mock_file_append_line(), }, }; //when - run(subs_file_name, history_file_name, site, env)?; + run(subs_file_name, site, &args, env)?; //then drop(subs_dir); drop(history_dir); diff --git a/src/main.rs b/src/main.rs index 8a0034e..4fcb4d8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,18 +7,17 @@ use podal::prelude::*; fn main() -> Result<()> { println!("Podal"); let subscriptions = "subscriptions.txt"; - let history = "downloaded.txt"; let site = "https://www.youtube.com/"; let args = Args::parse(); podal::run( subscriptions, - history, site, + &args, podal::Env { network: NetworkEnv::default(), - file: FileEnv::create(args.directory), + file: FileEnv::create(&args), }, )?; diff --git a/src/params/mod.rs b/src/params/mod.rs index f92355f..10c3199 100644 --- a/src/params/mod.rs +++ b/src/params/mod.rs @@ -6,5 +6,10 @@ pub struct Args { /// This is also the directory where the subscription and history files are stored. /// Defaults to the current directory #[arg(short, long, default_value = ".")] - pub directory: String, + pub downloads: String, + + /// The name of the history file. + /// Defaults to "downloaded.txt" located in the downloads directory. + #[arg(long, default_value = "downloaded.txt")] + pub history: String, }