From 15c1614d8c98f9689bb34f9e11aab15e8850145c Mon Sep 17 00:00:00 2001 From: Drew Short Date: Tue, 3 Mar 2020 22:24:09 -0600 Subject: [PATCH] Added basic EXTINF parsing --- src/lib/m3u.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/src/lib/m3u.rs b/src/lib/m3u.rs index d21fcb6..ca8d6c7 100644 --- a/src/lib/m3u.rs +++ b/src/lib/m3u.rs @@ -9,14 +9,35 @@ fn read_lines

(path: P) -> io::Result>> Ok(io::BufReader::new(file).lines()) } +#[derive(Debug)] +pub struct PlaylistTrack { + duration: String, + display: String, + track: String +} + +impl PlaylistTrack { + pub fn new(duration: Option, display: Option, track: &str) -> PlaylistTrack { + PlaylistTrack { + duration: duration.unwrap_or(String::from("")), + display: display.unwrap_or(String::from("")), + track: String::from(track) + } + } + + pub fn render(&self) -> String { + format!("#EXTINFO:{},{}\n{}\n", self.duration, self.display, self.track) + } +} + #[derive(Debug)] pub struct Playlist { path: String, - tracks: Box> + tracks: Box> } impl Playlist { - pub fn new(path: &str, tracks: Vec) -> Playlist { + pub fn new(path: &str, tracks: Vec) -> Playlist { Playlist { path: String::from(path), tracks: Box::new(tracks) @@ -24,13 +45,40 @@ impl Playlist { } pub fn read(path: &str) -> Result { - let mut playlist_tracks: Vec = Vec::new(); + let mut playlist_tracks: Vec = Vec::new(); let lines = read_lines(path)?; + + let mut found_header = false; + let mut duration: Option = None; + let mut display: Option = None; + lines.for_each(|read_line| { if read_line.is_ok() { let line = read_line.unwrap(); - if line.len() > 0 && !line.starts_with("#") { - playlist_tracks.push(line) + if line.len() > 0 { + if line.starts_with("#") { + if line.starts_with("#EXTINF:") { + found_header = true; + let slice = String::from(&line[8..]); + let split = slice.split(","); + let parts: Vec<&str> = split.collect(); + if parts[0].len() > 0 { + duration = Some(String::from(parts[0])) + } + if parts[1].len() > 0 { + display = Some(String::from(parts[1])) + } + } + } else { + if ! found_header { + panic!("Misformatted m3u!!!"); + } + let track = &line; + playlist_tracks.push(PlaylistTrack::new(duration.clone(), display.clone(), track)); + duration = None; + display = None; + found_header = false; + } } } }); @@ -41,8 +89,7 @@ impl Playlist { let mut file = File::create(path)?; file.write("#EXTM3U\n".as_bytes())?; for track in &*self.tracks { - file.write(track.as_bytes())?; - file.write("\n".as_bytes())?; + file.write(track.render().as_bytes())?; } Ok(()) }