From db59bed69d7e1f1d21842d155ded25399881b7ce Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Wed, 20 Dec 2017 19:18:20 +0200 Subject: [PATCH] hammond-data::utils: Modified EpisodeCleaner Diesel model to also be used with played_cleaner. --- hammond-data/src/dbqueries.rs | 19 +++++++++++---- hammond-data/src/models/queryables.rs | 34 +++++++++++++++++++-------- hammond-data/src/utils.rs | 22 ++++++++--------- hammond-gtk/src/widgets/episode.rs | 4 +++- 4 files changed, 52 insertions(+), 27 deletions(-) diff --git a/hammond-data/src/dbqueries.rs b/hammond-data/src/dbqueries.rs index 2ce9061..4f0c5d2 100644 --- a/hammond-data/src/dbqueries.rs +++ b/hammond-data/src/dbqueries.rs @@ -2,7 +2,7 @@ use diesel::prelude::*; use diesel; -use models::queryables::{Episode, EpisodeDownloadCleanerQuery, EpisodeWidgetQuery, Podcast, +use models::queryables::{Episode, EpisodeCleanerQuery, EpisodeWidgetQuery, Podcast, PodcastCoverQuery, Source}; use chrono::prelude::*; use errors::*; @@ -33,15 +33,15 @@ pub fn get_episodes() -> Result> { Ok(episode.order(epoch.desc()).load::(&*con)?) } -pub(crate) fn get_downloaded_episodes() -> Result> { +pub(crate) fn get_downloaded_episodes() -> Result> { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; Ok(episode - .select((rowid, local_uri)) + .select((rowid, local_uri, played)) .filter(local_uri.is_not_null()) - .load::(&*con)?) + .load::(&*con)?) } pub fn get_played_episodes() -> Result> { @@ -52,6 +52,17 @@ pub fn get_played_episodes() -> Result> { Ok(episode.filter(played.is_not_null()).load::(&*con)?) } +pub fn get_played_cleaner_episodes() -> Result> { + use schema::episode::dsl::*; + + let db = connection(); + let con = db.get()?; + Ok(episode + .select((rowid, local_uri, played)) + .filter(played.is_not_null()) + .load::(&*con)?) +} + pub fn get_episode_from_rowid(ep_id: i32) -> Result { use schema::episode::dsl::*; diff --git a/hammond-data/src/models/queryables.rs b/hammond-data/src/models/queryables.rs index cf6dded..9ba23bb 100644 --- a/hammond-data/src/models/queryables.rs +++ b/hammond-data/src/models/queryables.rs @@ -325,24 +325,26 @@ impl EpisodeWidgetQuery { #[changeset_options(treat_none_as_null = "true")] #[primary_key(title, podcast_id)] #[derive(Debug, Clone)] -/// Diesel Model to be used for constructing `EpisodeWidgets`. -pub(crate) struct EpisodeDownloadCleanerQuery { +/// Diesel Model to be used internal with the `utils::checkup` function. +pub struct EpisodeCleanerQuery { rowid: i32, local_uri: Option, + played: Option, } -impl From for EpisodeDownloadCleanerQuery { - fn from(e: Episode) -> EpisodeDownloadCleanerQuery { - EpisodeDownloadCleanerQuery { +impl From for EpisodeCleanerQuery { + fn from(e: Episode) -> EpisodeCleanerQuery { + EpisodeCleanerQuery { rowid: e.rowid(), local_uri: e.local_uri, + played: e.played, } } } -impl EpisodeDownloadCleanerQuery { +impl EpisodeCleanerQuery { /// Get the value of the sqlite's `ROW_ID` - pub(crate) fn rowid(&self) -> i32 { + pub fn rowid(&self) -> i32 { self.rowid } @@ -350,17 +352,29 @@ impl EpisodeDownloadCleanerQuery { /// /// Represents the local uri,usually filesystem path, /// that the media file will be located at. - pub(crate) fn local_uri(&self) -> Option<&str> { + pub fn local_uri(&self) -> Option<&str> { self.local_uri.as_ref().map(|s| s.as_str()) } /// Set the `local_uri`. - pub(crate) fn set_local_uri(&mut self, value: Option<&str>) { + pub fn set_local_uri(&mut self, value: Option<&str>) { self.local_uri = value.map(|x| x.to_string()); } + /// Epoch representation of the last time the episode was played. + /// + /// None/Null for unplayed. + pub fn played(&self) -> Option { + self.played + } + + /// Set the `played` value. + pub fn set_played(&mut self, value: Option) { + self.played = value; + } + /// Helper method to easily save/"sync" current state of self to the Database. - pub(crate) fn save(&self) -> Result { + pub fn save(&self) -> Result { use schema::episode::dsl::*; let db = connection(); diff --git a/hammond-data/src/utils.rs b/hammond-data/src/utils.rs index 39ea52b..07dc34d 100644 --- a/hammond-data/src/utils.rs +++ b/hammond-data/src/utils.rs @@ -8,14 +8,12 @@ use itertools::Itertools; use errors::*; use dbqueries; -use models::queryables::{Episode, EpisodeDownloadCleanerQuery}; +use models::queryables::EpisodeCleanerQuery; use std::path::Path; use std::fs; fn download_checker() -> Result<()> { - // TODO: give it it's own diesel model, - // so it does not pull useless and expensive stuff like description. let episodes = dbqueries::get_downloaded_episodes()?; episodes @@ -25,7 +23,7 @@ fn download_checker() -> Result<()> { Ok(()) } -fn checker_helper(ep: &mut EpisodeDownloadCleanerQuery) { +fn checker_helper(ep: &mut EpisodeCleanerQuery) { if !Path::new(ep.local_uri().unwrap()).exists() { ep.set_local_uri(None); let res = ep.save(); @@ -37,9 +35,7 @@ fn checker_helper(ep: &mut EpisodeDownloadCleanerQuery) { } fn played_cleaner() -> Result<()> { - // TODO: give it it's own diesel model, - // so it does not pull useless and expensive stuff like description. - let episodes = dbqueries::get_played_episodes()?; + let episodes = dbqueries::get_played_cleaner_episodes()?; let now_utc = Utc::now().timestamp() as i32; episodes.into_par_iter().for_each(|mut ep| { @@ -54,7 +50,7 @@ fn played_cleaner() -> Result<()> { error!("Error while trying to delete file: {:?}", ep.local_uri()); error!("Error: {}", err); } else { - info!("Episode {:?} was deleted succesfully.", ep.title()); + info!("Episode {:?} was deleted succesfully.", ep.local_uri()); }; } } @@ -63,7 +59,7 @@ fn played_cleaner() -> Result<()> { } /// Check `ep.local_uri` field and delete the file it points to. -pub fn delete_local_content(ep: &mut Episode) -> Result<()> { +pub fn delete_local_content(ep: &mut EpisodeCleanerQuery) -> Result<()> { if ep.local_uri().is_some() { let uri = ep.local_uri().unwrap().to_owned(); if Path::new(&uri).exists() { @@ -110,7 +106,7 @@ pub fn url_cleaner(s: &str) -> String { } } -/// Helper functions that strips extra spaces and newlines and all the tabs. +/// Helper functions that strips extra spaces and newlines and ignores the tabs. #[allow(match_same_arms)] pub fn replace_extra_spaces(s: &str) -> String { s.trim() @@ -210,10 +206,12 @@ mod tests { #[test] fn test_download_cleaner() { let _tmp_dir = helper_db(); - let mut episode = { + let mut episode: EpisodeCleanerQuery = { let db = connection(); let con = db.get().unwrap(); - dbqueries::get_episode_from_pk(&con, "foo_bar", 0).unwrap() + dbqueries::get_episode_from_pk(&con, "foo_bar", 0) + .unwrap() + .into() }; let valid_path = episode.local_uri().unwrap().to_owned(); diff --git a/hammond-gtk/src/widgets/episode.rs b/hammond-gtk/src/widgets/episode.rs index 7bd11e3..93ce6dd 100644 --- a/hammond-gtk/src/widgets/episode.rs +++ b/hammond-gtk/src/widgets/episode.rs @@ -232,7 +232,9 @@ fn on_play_bttn_clicked(episode_id: i32) { } fn on_delete_bttn_clicked(episode_id: i32) { - let mut ep = dbqueries::get_episode_from_rowid(episode_id).unwrap(); + let mut ep = dbqueries::get_episode_from_rowid(episode_id) + .unwrap() + .into(); let e = delete_local_content(&mut ep); if let Err(err) = e {