podcasts/hammond-data/src/dbcheckup.rs
2017-10-28 06:57:32 +03:00

82 lines
2.4 KiB
Rust

use rayon::prelude::*;
use errors::*;
use dbqueries;
use index_feed::Database;
use models::Episode;
use chrono::prelude::*;
use std::path::Path;
use std::fs;
// TODO: Write unit test.
pub fn download_checker(db: Database) -> Result<()> {
let mut episodes = {
let tempdb = db.lock().unwrap();
dbqueries::get_downloaded_episodes(&tempdb)?
};
episodes.par_iter_mut().for_each(|ep| {
if ep.local_uri().is_some() {
if !Path::new(ep.local_uri().unwrap()).exists() {
ep.set_local_uri(None);
let res = ep.save(&db.clone());
if let Err(err) = res {
error!("Error while trying to update episode: {:#?}", ep);
error!("Error: {}", err);
};
}
}
});
Ok(())
}
// TODO: Write unit test.
pub fn watched_cleaner(db: &Database) -> Result<()> {
let mut episodes = {
let tempdb = db.lock().unwrap();
dbqueries::get_watched_episodes(&tempdb)?
};
let now_utc = Utc::now().timestamp() as i32;
episodes.par_iter_mut().for_each(|mut ep| {
if ep.local_uri().is_some() && ep.watched().is_some() {
let watched = ep.watched().unwrap().clone();
// TODO: expose a config and a user set option.
let limit = watched + 172_800; // add 2days in seconds
if now_utc > limit {
let e = delete_local_content(db, &mut ep);
if let Err(err) = e {
error!("Error while trying to delete file: {:?}", ep.local_uri());
error!("Error: {}", err);
};
}
}
});
Ok(())
}
// TODO: Write unit test.
pub fn delete_local_content(db: &Database, ep: &mut Episode) -> Result<()> {
if ep.local_uri().is_some() {
let uri = ep.local_uri().unwrap().to_owned();
if Path::new(&uri).exists() {
let res = fs::remove_file(&uri);
if res.is_ok() {
ep.set_local_uri(None);
ep.save(db)?;
} else {
error!("Error while trying to delete file: {}", uri);
error!("Error: {}", res.unwrap_err());
};
}
} else {
error!(
"Something went wrong evaluating the following path: {:?}",
ep.local_uri(),
);
}
Ok(())
}