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 +} | 
