Add flag to skip existing files (#67, #109)

This commit is contained in:
ByteDream 2023-01-15 21:38:35 +01:00
parent 17233f2fd2
commit 685ac85857
3 changed files with 45 additions and 23 deletions

View file

@ -122,6 +122,10 @@ pub struct Archive {
#[arg(long)] #[arg(long)]
no_subtitle_optimizations: bool, no_subtitle_optimizations: bool,
#[arg(help = "Skip files which are already existing")]
#[arg(long, default_value_t = false)]
skip_existing: bool,
#[arg(help = "Ignore interactive input")] #[arg(help = "Ignore interactive input")]
#[arg(short, long, default_value_t = false)] #[arg(short, long, default_value_t = false)]
yes: bool, yes: bool,
@ -242,8 +246,7 @@ impl Execute for Archive {
for (formats, mut subtitles) in archive_formats { for (formats, mut subtitles) in archive_formats {
let (primary, additionally) = formats.split_first().unwrap(); let (primary, additionally) = formats.split_first().unwrap();
let path = free_file( let formatted_path = primary.format_path(
primary.format_path(
if self.output.is_empty() { if self.output.is_empty() {
"{title}.mkv" "{title}.mkv"
} else { } else {
@ -251,8 +254,16 @@ impl Execute for Archive {
} }
.into(), .into(),
true, true,
),
); );
let (path, changed) = free_file(formatted_path.clone());
if changed && self.skip_existing {
debug!(
"Skipping already existing file '{}'",
formatted_path.to_string_lossy()
);
continue;
}
info!( info!(
"Downloading {} to '{}'", "Downloading {} to '{}'",

View file

@ -74,6 +74,10 @@ pub struct Download {
#[arg(value_parser = FFmpegPreset::parse)] #[arg(value_parser = FFmpegPreset::parse)]
ffmpeg_preset: Vec<FFmpegPreset>, ffmpeg_preset: Vec<FFmpegPreset>,
#[arg(help = "Skip files which are already existing")]
#[arg(long, default_value_t = false)]
skip_existing: bool,
#[arg(help = "Ignore interactive input")] #[arg(help = "Ignore interactive input")]
#[arg(short, long, default_value_t = false)] #[arg(short, long, default_value_t = false)]
yes: bool, yes: bool,
@ -209,8 +213,7 @@ impl Execute for Download {
} }
for format in formats { for format in formats {
let path = free_file( let formatted_path = format.format_path(
format.format_path(
if self.output.is_empty() { if self.output.is_empty() {
"{title}.mkv" "{title}.mkv"
} else { } else {
@ -218,8 +221,16 @@ impl Execute for Download {
} }
.into(), .into(),
true, true,
),
); );
let (path, changed) = free_file(formatted_path.clone());
if changed && self.skip_existing {
debug!(
"Skipping already existing file '{}'",
formatted_path.to_string_lossy()
);
continue;
}
info!( info!(
"Downloading {} to '{}'", "Downloading {} to '{}'",

View file

@ -36,10 +36,10 @@ pub fn tempfile<S: AsRef<str>>(suffix: S) -> io::Result<NamedTempFile> {
} }
/// Check if the given path exists and rename it until the new (renamed) file does not exist. /// Check if the given path exists and rename it until the new (renamed) file does not exist.
pub fn free_file(mut path: PathBuf) -> PathBuf { pub fn free_file(mut path: PathBuf) -> (PathBuf, bool) {
// if it's a special file does not rename it // if it's a special file does not rename it
if is_special_file(&path) { if is_special_file(&path) {
return path; return (path, false);
} }
let mut i = 0; let mut i = 0;
@ -55,7 +55,7 @@ pub fn free_file(mut path: PathBuf) -> PathBuf {
path.set_file_name(format!("{} ({}).{}", filename, i, ext)) path.set_file_name(format!("{} ({}).{}", filename, i, ext))
} }
path (path, i != 0)
} }
/// Check if the given path is a special file. On Linux this is probably a pipe and on Windows /// Check if the given path is a special file. On Linux this is probably a pipe and on Windows