From 935729ac9340ce7a724aa4e54ff2806bfbf8c1ac Mon Sep 17 00:00:00 2001 From: TheGeneralist <180094941+thegeneralist01@users.noreply.github.com> Date: Wed, 21 Jan 2026 20:29:24 +0100 Subject: [PATCH] feat: add local file downloader Supports file:// URLs for archiving local files. --- src/downloader/local.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/downloader/local.rs diff --git a/src/downloader/local.rs b/src/downloader/local.rs new file mode 100644 index 0000000..f946a2e --- /dev/null +++ b/src/downloader/local.rs @@ -0,0 +1,28 @@ +use anyhow::{Context, Result, bail}; +use std::{path::Path, process::Command}; + +use crate::hash::hash_file; + +pub fn save(path: String, store_path: &Path, timestamp: &String) -> Result { + println!("Saving path: {path}"); + + let temp_dir = store_path.join("temp").join(timestamp); + std::fs::create_dir_all(&temp_dir)?; + + let in_file = Path::new(path.trim_start_matches("file://")); + let extension = in_file + .extension() + .map_or(String::new(), |ext| format!(".{}", ext.to_string_lossy())); + let out_file = temp_dir.join(format!("{timestamp}{extension}")); + + let mut binding = Command::new("cp"); + let cmd = binding.arg(in_file).arg(&out_file); + let out = cmd.output().with_context(|| "failed to spawn cp process")?; + + if !out.status.success() { + let stderr = String::from_utf8_lossy(&out.stderr); + bail!("yt-dlp failed: {stderr}"); + } + + hash_file(&out_file) +}