mirror of
https://framagit.org/veretcle/scootaloo.git
synced 2025-07-21 09:31:19 +02:00
54 lines
1.4 KiB
Rust
54 lines
1.4 KiB
Rust
use std::error::Error;
|
|
use crate::ScootalooError;
|
|
use reqwest::Url;
|
|
use tokio::{
|
|
io::copy,
|
|
fs::{File, create_dir_all},
|
|
};
|
|
|
|
/// Gets and caches Twitter Media inside the determined temp dir
|
|
pub async fn cache_media(u: &str, t: &str) -> Result<String, Box<dyn Error>> {
|
|
// create dir
|
|
create_dir_all(t).await?;
|
|
|
|
// get file
|
|
let mut response = reqwest::get(u).await?;
|
|
|
|
// create local file
|
|
let url = Url::parse(u)?;
|
|
let dest_filename = url.path_segments().ok_or_else(|| ScootalooError::new(&format!("Cannot determine the destination filename for {}", u)))?
|
|
.last().ok_or_else(|| ScootalooError::new(&format!("Cannot determine the destination filename for {}", u)))?;
|
|
|
|
let dest_filepath = format!("{}/{}", t, dest_filename);
|
|
|
|
let mut dest_file = File::create(&dest_filepath).await?;
|
|
|
|
while let Some(chunk) = response.chunk().await? {
|
|
copy(&mut &*chunk, &mut dest_file).await?;
|
|
}
|
|
|
|
Ok(dest_filepath)
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
use std::{
|
|
path::Path,
|
|
fs::remove_dir_all,
|
|
};
|
|
|
|
const TMP_DIR: &'static str = "/tmp/scootaloo_test";
|
|
|
|
#[tokio::test]
|
|
async fn test_cache_media() {
|
|
let dest = cache_media("https://forum.nintendojo.fr/styles/prosilver/theme/images/ndfr_casual.png", TMP_DIR).await.unwrap();
|
|
|
|
assert!(Path::new(&dest).exists());
|
|
|
|
remove_dir_all(TMP_DIR).unwrap();
|
|
}
|
|
}
|
|
|