diff options
| author | Nathan | 2017-07-22 18:03:48 -0400 |
|---|---|---|
| committer | Nathan | 2017-07-22 18:03:48 -0400 |
| commit | 2644d002b80dad81672674bf8825a2a799593896 (patch) | |
| tree | bfa659f3c21a0a6564998aede0c33be95b36086b /src | |
| parent | 81324bf762067b1ed257e506c2ce88421387afd8 (diff) | |
| download | podcast-2644d002b80dad81672674bf8825a2a799593896.tar.bz2 | |
Fix parsing of ranges for downloads
Diffstat (limited to 'src')
| -rw-r--r-- | src/actions.rs | 14 | ||||
| -rw-r--r-- | src/main.rs | 2 | ||||
| -rw-r--r-- | src/structs.rs | 20 | ||||
| -rw-r--r-- | src/utils.rs | 41 |
4 files changed, 61 insertions, 16 deletions
diff --git a/src/actions.rs b/src/actions.rs index b87b2f1..0d32d46 100644 --- a/src/actions.rs +++ b/src/actions.rs @@ -51,22 +51,12 @@ pub fn list_subscriptions(state: &State) { pub fn download_range(state: &State, p_search: &str, e_search: &str) { let re_pod = Regex::new(p_search).unwrap(); - let input = String::from(e_search); - let range: Vec<usize> = input - .split('-') - .map(|i| i.parse::<usize>().unwrap()) - .collect(); for subscription in state.subscriptions() { if re_pod.is_match(&subscription.name) { let podcast = Podcast::from_url(&subscription.url).unwrap(); - let episodes = podcast.episodes(); - - &episodes[episodes.len() - range[1]..episodes.len() - range[0]] - .par_iter() - .for_each(|ref ep| if let Err(err) = ep.download(podcast.title()) { - println!("{}", err); - }); + let episodes_to_download = parse_download_episodes(e_search); + podcast.download_specific(episodes_to_download); } } } diff --git a/src/main.rs b/src/main.rs index c408745..92ae630 100644 --- a/src/main.rs +++ b/src/main.rs @@ -87,7 +87,7 @@ fn main() { let podcast = download_matches.value_of("PODCAST").unwrap(); match download_matches.value_of("EPISODE") { Some(ep) => { - if String::from(ep).contains("-") { + if String::from(ep).contains(|c| c == '-' || c == ',') { download_range(&state, podcast, ep) } else { download_episode(&state, podcast, ep) diff --git a/src/structs.rs b/src/structs.rs index 7087077..a639bd3 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -126,6 +126,26 @@ impl Podcast { }, ); } + + pub fn download_specific(&self, episode_numbers: Vec<usize>) { + let mut path = get_podcast_dir(); + path.push(self.title()); + + let downloaded = already_downloaded(self.title()); + let episodes = self.episodes(); + + episode_numbers.par_iter().for_each( + |ep_num| if let Some(ep_title) = + episodes[episodes.len() - ep_num].title() + { + if !downloaded.contains(ep_title) { + if let Err(err) = episodes[episodes.len() - ep_num].download(self.title()) { + println!("{}", err); + } + } + }, + ); + } } impl Episode { diff --git a/src/utils.rs b/src/utils.rs index b2c590a..02c9983 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -15,10 +15,18 @@ pub fn already_downloaded(dir: &str) -> BTreeSet<String> { if let Ok(entry) = entry { match entry.file_name().into_string() { Ok(val) => { - result.insert(String::from(val.trim_right_matches(".mp3"))); + // TODO There has to be a better way to do this...later + result.insert(String::from( + val.trim_right_matches(".mp3") + .trim_right_matches(".m4a") + .trim_right_matches(".ogg"), + )); } - Err(err) => { - println!("OsString: {:?} couldn't be converted to String", err); + Err(_) => { + println!( + "OsString: {:?} couldn't be converted to String", + entry.file_name() + ); } } } @@ -37,3 +45,30 @@ pub fn get_podcast_dir() -> PathBuf { } } } + +pub fn parse_download_episodes(e_search: &str) -> Vec<usize> { + let input = String::from(e_search); + let mut ranges = Vec::<(usize, usize)>::new(); + let mut elements = Vec::<usize>::new(); + let comma_separated: Vec<&str> = input.split(',').collect(); + for elem in comma_separated { + let temp = String::from(elem); + if temp.contains("-") { + let range: Vec<usize> = elem.split('-') + .map(|i| i.parse::<usize>().unwrap()) + .collect(); + ranges.push((range[0], range[1])); + } else { + elements.push(elem.parse::<usize>().unwrap()); + } + } + + for range in ranges { + // Add 1 to upper range to include given episode in the download + for num in range.0..range.1 + 1 { + elements.push(num); + } + } + elements.dedup(); + elements +} |
