ipod syncing; updated readme; rust 2024; version bump
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
use std::{
|
||||
fs,
|
||||
io,
|
||||
iter,
|
||||
path,
|
||||
collections::BTreeMap,
|
||||
@@ -28,12 +29,16 @@ impl<'a> Playlist<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Writes the playlist file based on the specified filename.
|
||||
///
|
||||
/// Output boolean indicates if the playlist was written (if it was
|
||||
/// different from the existing file)
|
||||
fn write_as(
|
||||
&self,
|
||||
name: &str,
|
||||
reverse: bool,
|
||||
) -> anyhow::Result<()> {
|
||||
let playlists_folder = self.root.join("Playlists");
|
||||
) -> anyhow::Result<bool> {
|
||||
let playlists_folder = self.root.join(folders::LOCAL_PLAYLISTS_DIR);
|
||||
if !playlists_folder.exists() {
|
||||
fs::create_dir(&playlists_folder)
|
||||
.context(format!("failed to create output directory for playlists"))?;
|
||||
@@ -41,9 +46,8 @@ impl<'a> Playlist<'a> {
|
||||
let mut path = playlists_folder.join(sanitise(name));
|
||||
path.set_extension("m3u");
|
||||
|
||||
let mut file = fs::File::create(path)?;
|
||||
|
||||
let mut writer = m3u::Writer::new(&mut file);
|
||||
let mut output = io::BufWriter::new(Vec::new());
|
||||
let mut writer = m3u::Writer::new(&mut output);
|
||||
let entries =
|
||||
self
|
||||
.files
|
||||
@@ -61,7 +65,15 @@ impl<'a> Playlist<'a> {
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
drop(writer);
|
||||
let output = output.into_inner()?;
|
||||
if fs::read(&path)? != output {
|
||||
fs::write(path, output.as_slice())?;
|
||||
Ok(true)
|
||||
} else {
|
||||
Ok(false)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn insert(
|
||||
@@ -71,9 +83,9 @@ impl<'a> Playlist<'a> {
|
||||
) {
|
||||
let entry = m3u::path_entry({
|
||||
let relative = absolute_path.strip_prefix(
|
||||
&self.root.join(folders::PODCASTS_DIR)
|
||||
&self.root.join(folders::LOCAL_PODCASTS_DIR)
|
||||
).unwrap();
|
||||
path::Path::new("/Podcasts").join(relative)
|
||||
path::Path::new(folders::IPOD_PODCASTS_DIR).join(relative)
|
||||
});
|
||||
|
||||
match self.files.get_mut(&published) {
|
||||
@@ -98,7 +110,7 @@ pub(crate) fn generate_master_m3u(
|
||||
|
||||
for (podcast, _) in &config.podcasts {
|
||||
let output = folders::podcast_folder(root, podcast.as_str());
|
||||
let spec_file = output.join("spec.toml");
|
||||
let spec_file = output.join(folders::SPEC_FILE);
|
||||
let spec = Specification::read_from(&spec_file)?;
|
||||
|
||||
let (feed, files) = spec.into_feed_and_files();
|
||||
@@ -117,7 +129,11 @@ pub(crate) fn generate_master_m3u(
|
||||
}
|
||||
}
|
||||
|
||||
playlist.write_as("[Podcast Master Feed]", true)
|
||||
if playlist.write_as(folders::MASTER_PLAYLIST_PATH, true)? {
|
||||
println!("[info] generated master playlist");
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
@@ -129,7 +145,7 @@ pub(crate) fn generate_podcast_m3u(
|
||||
let mut playlist = Playlist::new(root);
|
||||
|
||||
let output = folders::podcast_folder(root, alias);
|
||||
let spec_file = output.join("spec.toml");
|
||||
let spec_file = output.join(folders::SPEC_FILE);
|
||||
let spec = Specification::read_from(&spec_file)?;
|
||||
|
||||
let episodes =
|
||||
@@ -153,9 +169,15 @@ pub(crate) fn generate_podcast_m3u(
|
||||
);
|
||||
}
|
||||
|
||||
if unlistened_only {
|
||||
playlist.write_as(&format!("{} (unlistened)", alias), false)
|
||||
let written = if unlistened_only {
|
||||
playlist.write_as(&format!("[PC] {} (unlistened)", alias), false)
|
||||
} else {
|
||||
playlist.write_as(alias, false)
|
||||
playlist.write_as(&format!("[PC] {}", alias), false)
|
||||
}?;
|
||||
|
||||
if written {
|
||||
println!("[info] generated playlist for podcast {:?}.", alias);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
Reference in New Issue
Block a user