diff --git a/hammond-data/src/dbqueries.rs b/hammond-data/src/dbqueries.rs index 947c671..4923310 100644 --- a/hammond-data/src/dbqueries.rs +++ b/hammond-data/src/dbqueries.rs @@ -33,14 +33,14 @@ pub fn get_podcasts() -> Result, DataError> { .map_err(From::from) } -pub fn get_podcasts_filter(ids_list: &[i32]) -> Result, DataError> { +pub fn get_podcasts_filter(filter_ids: &[i32]) -> Result, DataError> { use schema::podcast::dsl::*; let db = connection(); let con = db.get()?; podcast .order(title.asc()) - .filter(id.eq_any(ids_list)) + .filter(id.ne_any(filter_ids)) .load::(&con) .map_err(From::from) } @@ -115,7 +115,7 @@ pub fn get_episode_local_uri_from_id(ep_id: i32) -> Result, DataE } pub fn get_episodes_widgets_filter_limit( - ids: &[i32], + filter_ids: &[i32], limit: u32, ) -> Result, DataError> { use schema::episode; @@ -135,7 +135,7 @@ pub fn get_episodes_widgets_filter_limit( episode::podcast_id, )) .order(episode::epoch.desc()) - .filter(episode::podcast_id.eq_any(ids)) + .filter(episode::podcast_id.ne_any(filter_ids)) .limit(i64::from(limit)) .load::(&con) .map_err(From::from) diff --git a/hammond-gtk/src/app.rs b/hammond-gtk/src/app.rs index 82c0077..ee3184e 100644 --- a/hammond-gtk/src/app.rs +++ b/hammond-gtk/src/app.rs @@ -17,8 +17,8 @@ use widgets::mark_all_watched; use std::sync::Arc; use std::sync::mpsc::{channel, Receiver, Sender}; -use std::time::Duration; use std::thread; +use std::time::Duration; #[derive(Clone, Debug)] pub enum Action { diff --git a/hammond-gtk/src/utils.rs b/hammond-gtk/src/utils.rs index e67051f..f8a6bcb 100644 --- a/hammond-gtk/src/utils.rs +++ b/hammond-gtk/src/utils.rs @@ -15,8 +15,9 @@ use hammond_data::pipeline; use hammond_data::utils::checkup; use hammond_downloader::downloader; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::sync::{Mutex, RwLock}; +use std::sync::Arc; use std::sync::mpsc::Sender; use std::thread; @@ -25,6 +26,28 @@ use app::Action; use chrono::Duration; use chrono::prelude::*; +lazy_static! { + static ref IGNORESHOWS: Arc>> = Arc::new(Mutex::new(HashSet::new())); +} + +pub fn ignore_show(id: i32) -> Result<(), Error> { + let mut guard = IGNORESHOWS.lock().map_err(|err| format_err!("{}", err))?; + guard.insert(id); + Ok(()) +} + +pub fn uningore_show(id: i32) -> Result<(), Error> { + let mut guard = IGNORESHOWS.lock().map_err(|err| format_err!("{}", err))?; + guard.remove(&id); + Ok(()) +} + +pub fn get_ignored_shows() -> Result, Error> { + let guard = IGNORESHOWS.lock().map_err(|err| format_err!("{}", err))?; + let keys = guard.iter().cloned().collect::>(); + Ok(keys) +} + pub fn cleanup(cleanup_date: DateTime) { if let Err(err) = checkup(cleanup_date) { error!("Check up failed: {}", err); diff --git a/hammond-gtk/src/views/episodes.rs b/hammond-gtk/src/views/episodes.rs index a05bdee..43b9bf7 100644 --- a/hammond-gtk/src/views/episodes.rs +++ b/hammond-gtk/src/views/episodes.rs @@ -7,7 +7,7 @@ use hammond_data::EpisodeWidgetQuery; use hammond_data::dbqueries; use app::Action; -use utils::get_pixbuf_from_path; +use utils::{get_ignored_shows, get_pixbuf_from_path}; use widgets::EpisodeWidget; use std::sync::mpsc::Sender; @@ -77,7 +77,8 @@ impl Default for EpisodesView { impl EpisodesView { pub fn new(sender: Sender) -> Result { let view = EpisodesView::default(); - let episodes = dbqueries::get_episodes_widgets_filter_limit(&[], 50)?; + let ignore = get_ignored_shows()?; + let episodes = dbqueries::get_episodes_widgets_filter_limit(&ignore, 50)?; let now_utc = Utc::now(); episodes.into_iter().for_each(|ep| { diff --git a/hammond-gtk/src/views/shows.rs b/hammond-gtk/src/views/shows.rs index 38dfb0d..2a59984 100644 --- a/hammond-gtk/src/views/shows.rs +++ b/hammond-gtk/src/views/shows.rs @@ -6,7 +6,7 @@ use hammond_data::Podcast; use hammond_data::dbqueries; use app::Action; -use utils::get_pixbuf_from_path; +use utils::{get_ignored_shows, get_pixbuf_from_path}; use std::sync::Arc; use std::sync::mpsc::Sender; @@ -54,7 +54,8 @@ impl ShowsPopulated { } fn populate_flowbox(&self) -> Result<(), Error> { - let podcasts = dbqueries::get_podcasts()?; + let ignore = get_ignored_shows()?; + let podcasts = dbqueries::get_podcasts_filter(&ignore)?; podcasts.into_iter().map(Arc::new).for_each(|parent| { let flowbox_child = ShowsChild::new(parent); diff --git a/hammond-gtk/src/widgets/show.rs b/hammond-gtk/src/widgets/show.rs index b17e1dd..5a304fe 100644 --- a/hammond-gtk/src/widgets/show.rs +++ b/hammond-gtk/src/widgets/show.rs @@ -7,7 +7,7 @@ use open; use hammond_data::Podcast; use hammond_data::dbqueries; -use hammond_data::utils::{replace_extra_spaces}; +use hammond_data::utils::replace_extra_spaces; use app::Action; use utils::get_pixbuf_from_path;