Replaced played_cleanup function with a function that accepts a closure.

This commit is contained in:
Rowan Lewis 2018-03-13 23:17:01 +01:00
parent fdf3908494
commit be2d707391

View File

@ -13,6 +13,7 @@ use xdg_dirs::DL_DIR;
use std::fs; use std::fs;
use std::path::Path; use std::path::Path;
use std::sync::Arc;
/// Scan downloaded `episode` entries that might have broken `local_uri`s and /// Scan downloaded `episode` entries that might have broken `local_uri`s and
/// set them to `None`. /// set them to `None`.
@ -38,26 +39,31 @@ fn download_checker() -> Result<(), DataError> {
Ok(()) Ok(())
} }
/// Delete watched `episodes` that have exceded their liftime after played. fn delete_expired_played_episodes() -> Result<(), DataError> {
fn played_cleaner() -> Result<(), DataError> { let expiry = Utc::now().timestamp() as i32;
expiry -= 172_800;
delete_played_episodes(|ep| ep.played().is_some() && ep.played().unwrap() > expiry)
}
fn delete_all_played_episodes() -> Result<(), DataError> {
delete_played_episodes(|ep| ep.played().is_some())
}
fn delete_played_episodes<F>(filter: F) -> Result<(), DataError> where F: FnOnce(&EpisodeCleanerQuery) -> bool + Send + Sync {
let mut episodes = dbqueries::get_played_cleaner_episodes()?; let mut episodes = dbqueries::get_played_cleaner_episodes()?;
let now_utc = Utc::now().timestamp() as i32;
episodes episodes
.par_iter_mut() .par_iter_mut()
.filter(|ep| ep.local_uri().is_some() && ep.played().is_some()) .filter(|ep| ep.local_uri().is_some() && filter(ep))
.for_each(|ep| { .for_each(|ep| {
// TODO: expose a config and a user set option. if let Err(err) = delete_local_content(ep) {
// Chnage the test too when exposed error!("Error while trying to delete file: {:?}", ep.local_uri());
let limit = ep.played().unwrap() + 172_800; // add 2days in seconds error!("{}", err);
if now_utc > limit { } else {
if let Err(err) = delete_local_content(ep) { info!("Episode {:?} was deleted succesfully.", ep.local_uri());
error!("Error while trying to delete file: {:?}", ep.local_uri()); };
error!("{}", err);
} else {
info!("Episode {:?} was deleted succesfully.", ep.local_uri());
};
}
}); });
Ok(()) Ok(())
} }
@ -95,7 +101,7 @@ fn delete_local_content(ep: &mut EpisodeCleanerQuery) -> Result<(), DataError> {
pub fn checkup() -> Result<(), DataError> { pub fn checkup() -> Result<(), DataError> {
info!("Running database checks."); info!("Running database checks.");
download_checker()?; download_checker()?;
played_cleaner()?; delete_expired_played_episodes()?;
info!("Checks completed."); info!("Checks completed.");
Ok(()) Ok(())
} }
@ -258,37 +264,49 @@ mod tests {
} }
#[test] #[test]
fn test_played_cleaner_expired() { fn test_delete_expired_played_episodes_some() {
let _tmp_dir = helper_db(); let _tmp_dir = helper_db();
let mut episode = dbqueries::get_episode_from_pk("foo_bar", 0).unwrap(); let mut episode = dbqueries::get_episode_from_pk("foo_bar", 0).unwrap();
let now_utc = Utc::now().timestamp() as i32; let now_utc = Utc::now().timestamp() as i32;
// let limit = now_utc - 172_800;
let epoch = now_utc - 200_000; let epoch = now_utc - 200_000;
episode.set_played(Some(epoch)); episode.set_played(Some(epoch));
episode.save().unwrap(); episode.save().unwrap();
let valid_path = episode.local_uri().unwrap().to_owned(); let valid_path = episode.local_uri().unwrap().to_owned();
// This should delete the file // This should delete the file
played_cleaner().unwrap(); delete_expired_played_episodes().unwrap();
assert_eq!(Path::new(&valid_path).exists(), false); assert_eq!(Path::new(&valid_path).exists(), false);
} }
#[test] #[test]
fn test_played_cleaner_none() { fn test_delete_expired_played_episodes_none() {
let _tmp_dir = helper_db(); let _tmp_dir = helper_db();
let mut episode = dbqueries::get_episode_from_pk("foo_bar", 0).unwrap(); let mut episode = dbqueries::get_episode_from_pk("foo_bar", 0).unwrap();
let now_utc = Utc::now().timestamp() as i32; let now_utc = Utc::now().timestamp() as i32;
// limit = 172_800;
let epoch = now_utc - 20_000; let epoch = now_utc - 20_000;
episode.set_played(Some(epoch)); episode.set_played(Some(epoch));
episode.save().unwrap(); episode.save().unwrap();
let valid_path = episode.local_uri().unwrap().to_owned(); let valid_path = episode.local_uri().unwrap().to_owned();
// This should not delete the file // This should not delete the file
played_cleaner().unwrap(); delete_expired_played_episodes().unwrap();
assert_eq!(Path::new(&valid_path).exists(), true); assert_eq!(Path::new(&valid_path).exists(), true);
} }
#[test]
fn test_delete_all_played_episodes() {
let _tmp_dir = helper_db();
let mut episode = dbqueries::get_episode_from_pk("foo_bar", 0).unwrap();
let now_utc = Utc::now().timestamp() as i32;
episode.set_played(Some(now_utc));
episode.save().unwrap();
let valid_path = episode.local_uri().unwrap().to_owned();
// This should delete the file
delete_all_played_episodes().unwrap();
assert_eq!(Path::new(&valid_path).exists(), false);
}
#[test] #[test]
fn test_url_cleaner() { fn test_url_cleaner() {
let good_url = "http://traffic.megaphone.fm/FL8608731318.mp3"; let good_url = "http://traffic.megaphone.fm/FL8608731318.mp3";