aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNathan2017-07-22 18:03:48 -0400
committerNathan2017-07-22 18:03:48 -0400
commit2644d002b80dad81672674bf8825a2a799593896 (patch)
treebfa659f3c21a0a6564998aede0c33be95b36086b /src
parent81324bf762067b1ed257e506c2ce88421387afd8 (diff)
downloadpodcast-2644d002b80dad81672674bf8825a2a799593896.tar.bz2
Fix parsing of ranges for downloads
Diffstat (limited to 'src')
-rw-r--r--src/actions.rs14
-rw-r--r--src/main.rs2
-rw-r--r--src/structs.rs20
-rw-r--r--src/utils.rs41
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
+}