From 2e06205eda3a3dd23a3fb9bed80dfb4328484b8e Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Wed, 20 Dec 2017 18:19:31 +0200 Subject: [PATCH] Define a new Diesel Model for PodcastCover querries. Define new Diesel Model and impl From trait, Change the signature of downloader::cache_image function, Change and merge hammond-gtk::utils::get_pixbuf_from_path functions. --- hammond-data/src/dbqueries.rs | 13 ++++++++++- hammond-data/src/lib.rs | 2 +- hammond-data/src/models/queryables.rs | 33 +++++++++++++++++++++++++++ hammond-downloader/src/downloader.rs | 6 ++--- hammond-gtk/src/utils.rs | 20 ++++------------ hammond-gtk/src/views/episodes.rs | 6 ++--- hammond-gtk/src/views/shows.rs | 2 +- hammond-gtk/src/widgets/show.rs | 4 ++-- 8 files changed, 59 insertions(+), 27 deletions(-) diff --git a/hammond-data/src/dbqueries.rs b/hammond-data/src/dbqueries.rs index caaa76a..261bd8b 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, EpisodeWidgetQuery, Podcast, Source}; +use models::queryables::{Episode, EpisodeWidgetQuery, Podcast, PodcastCoverQuery, Source}; use chrono::prelude::*; use errors::*; @@ -114,6 +114,17 @@ pub fn get_podcast_from_id(pid: i32) -> Result { Ok(podcast.filter(id.eq(pid)).get_result::(&*con)?) } +pub fn get_podcast_cover_from_id(pid: i32) -> Result { + use schema::podcast::dsl::*; + + let db = connection(); + let con = db.get()?; + Ok(podcast + .select((id, title, image_uri)) + .filter(id.eq(pid)) + .get_result::(&*con)?) +} + pub fn get_pd_episodes(parent: &Podcast) -> Result> { use schema::episode::dsl::*; diff --git a/hammond-data/src/lib.rs b/hammond-data/src/lib.rs index 97aec76..21b70ac 100644 --- a/hammond-data/src/lib.rs +++ b/hammond-data/src/lib.rs @@ -61,7 +61,7 @@ pub(crate) mod models; mod parser; mod schema; -pub use models::queryables::{Episode, EpisodeWidgetQuery, Podcast, Source}; +pub use models::queryables::{Episode, EpisodeWidgetQuery, Podcast, PodcastCoverQuery, Source}; /// [XDG Base Direcotory](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) Paths. #[allow(missing_debug_implementations)] diff --git a/hammond-data/src/models/queryables.rs b/hammond-data/src/models/queryables.rs index 4290979..bd15320 100644 --- a/hammond-data/src/models/queryables.rs +++ b/hammond-data/src/models/queryables.rs @@ -427,6 +427,39 @@ impl Podcast { } } +#[derive(Queryable, Debug, Clone)] +/// Diesel Model of the podcast cover query. +/// Used for fetching information about a Podcast's cover. +pub struct PodcastCoverQuery { + id: i32, + title: String, + image_uri: Option, +} + +impl From for PodcastCoverQuery { + fn from(p: Podcast) -> PodcastCoverQuery { + PodcastCoverQuery { + id: *p.id(), + title: p.title, + image_uri: p.image_uri, + } + } +} + +impl PodcastCoverQuery { + /// Get the Feed `title`. + pub fn title(&self) -> &str { + &self.title + } + + /// Get the `image_uri`. + /// + /// Represents the uri(url usually) that the Feed cover image is located at. + pub fn image_uri(&self) -> Option<&str> { + self.image_uri.as_ref().map(|s| s.as_str()) + } +} + #[derive(Queryable, Identifiable, AsChangeset, PartialEq)] #[table_name = "source"] #[changeset_options(treat_none_as_null = "true")] diff --git a/hammond-downloader/src/downloader.rs b/hammond-downloader/src/downloader.rs index e3a4a0c..eb0fd2f 100644 --- a/hammond-downloader/src/downloader.rs +++ b/hammond-downloader/src/downloader.rs @@ -8,7 +8,7 @@ use std::io::{BufWriter, Read, Write}; use std::path::Path; use errors::*; -use hammond_data::{EpisodeWidgetQuery, Podcast}; +use hammond_data::{EpisodeWidgetQuery, PodcastCoverQuery}; use hammond_data::xdg_dirs::{DL_DIR, HAMMOND_CACHE}; // TODO: Replace path that are of type &str with std::path. @@ -131,7 +131,7 @@ pub fn get_episode(ep: &mut EpisodeWidgetQuery, download_folder: &str) -> Result } } -pub fn cache_image(pd: &Podcast) -> Option { +pub fn cache_image(pd: &PodcastCoverQuery) -> Option { let url = pd.image_uri()?.to_owned(); if url == "" { return None; @@ -207,7 +207,7 @@ mod tests { index(vec![feed]); // Get the Podcast - let pd = dbqueries::get_podcast_from_source_id(sid).unwrap(); + let pd = dbqueries::get_podcast_from_source_id(sid).unwrap().into(); let img_path = cache_image(&pd); let foo_ = format!( diff --git a/hammond-gtk/src/utils.rs b/hammond-gtk/src/utils.rs index 3e22f8e..9c5eca9 100644 --- a/hammond-gtk/src/utils.rs +++ b/hammond-gtk/src/utils.rs @@ -2,7 +2,7 @@ use glib; use gdk_pixbuf::Pixbuf; use hammond_data::feed; -use hammond_data::{Podcast, Source}; +use hammond_data::{PodcastCoverQuery, Source}; use hammond_downloader::downloader; use std::thread; @@ -60,21 +60,9 @@ fn refresh_podcasts_view() -> glib::Continue { } // FIXME: use something that would just scale? -// TODO: make a diesel model with only title, local_uri - -pub fn get_pixbuf_from_path(pd: &Podcast) -> Option { +pub fn get_pixbuf_from_path(pd: &PodcastCoverQuery, size: u32) -> Option { let img_path = downloader::cache_image(pd)?; - Pixbuf::new_from_file_at_scale(&img_path, 256, 256, true).ok() -} - -pub fn get_pixbuf_from_path_128(pd: &Podcast) -> Option { - let img_path = downloader::cache_image(pd)?; - Pixbuf::new_from_file_at_scale(&img_path, 128, 128, true).ok() -} - -pub fn get_pixbuf_from_path_64(pd: &Podcast) -> Option { - let img_path = downloader::cache_image(pd)?; - Pixbuf::new_from_file_at_scale(&img_path, 64, 64, true).ok() + Pixbuf::new_from_file_at_scale(&img_path, size as i32, size as i32, true).ok() } #[cfg(test)] @@ -100,7 +88,7 @@ mod tests { // Get the Podcast let pd = dbqueries::get_podcast_from_source_id(sid).unwrap(); - let pxbuf = get_pixbuf_from_path(&pd); + let pxbuf = get_pixbuf_from_path(&pd.into(), 256); assert!(pxbuf.is_some()); } } diff --git a/hammond-gtk/src/views/episodes.rs b/hammond-gtk/src/views/episodes.rs index 57191f1..51ce199 100644 --- a/hammond-gtk/src/views/episodes.rs +++ b/hammond-gtk/src/views/episodes.rs @@ -6,7 +6,7 @@ use hammond_data::dbqueries; use hammond_data::EpisodeWidgetQuery; use widgets::episode::EpisodeWidget; -use utils::get_pixbuf_from_path_64; +use utils::get_pixbuf_from_path; use std::rc::Rc; @@ -216,8 +216,8 @@ impl EpisodesViewWidget { let image: gtk::Image = builder.get_object("cover").unwrap(); // FIXME: - if let Ok(pd) = dbqueries::get_podcast_from_id(episode.podcast_id()) { - let img = get_pixbuf_from_path_64(&pd); + if let Ok(pd) = dbqueries::get_podcast_cover_from_id(episode.podcast_id()) { + let img = get_pixbuf_from_path(&pd, 64); if let Some(i) = img { image.set_from_pixbuf(&i); } diff --git a/hammond-gtk/src/views/shows.rs b/hammond-gtk/src/views/shows.rs index d12dc58..acd1022 100644 --- a/hammond-gtk/src/views/shows.rs +++ b/hammond-gtk/src/views/shows.rs @@ -111,7 +111,7 @@ impl ShowsChild { fn init(&self, pd: &Podcast) { self.container.set_tooltip_text(pd.title()); - let cover = get_pixbuf_from_path(pd); + let cover = get_pixbuf_from_path(&pd.clone().into(), 256); if let Some(img) = cover { self.cover.set_from_pixbuf(&img); }; diff --git a/hammond-gtk/src/widgets/show.rs b/hammond-gtk/src/widgets/show.rs index 7a30a63..54b9840 100644 --- a/hammond-gtk/src/widgets/show.rs +++ b/hammond-gtk/src/widgets/show.rs @@ -10,7 +10,7 @@ use hammond_data::utils::replace_extra_spaces; use hammond_downloader::downloader; use widgets::episode::episodes_listbox; -use utils::get_pixbuf_from_path_128; +use utils::get_pixbuf_from_path; use content::ShowStack; use headerbar::Header; @@ -77,7 +77,7 @@ impl ShowWidget { let desc = dissolve::strip_html_tags(pd.description()).join(" "); self.description.set_text(&replace_extra_spaces(&desc)); - let img = get_pixbuf_from_path_128(pd); + let img = get_pixbuf_from_path(&pd.clone().into(), 128); if let Some(i) = img { self.cover.set_from_pixbuf(&i); }