Define new Diesel Model and impl From<Podcast> trait, Change the signature of downloader::cache_image function, Change and merge hammond-gtk::utils::get_pixbuf_from_path functions.
95 lines
2.8 KiB
Rust
95 lines
2.8 KiB
Rust
use glib;
|
|
use gdk_pixbuf::Pixbuf;
|
|
|
|
use hammond_data::feed;
|
|
use hammond_data::{PodcastCoverQuery, Source};
|
|
use hammond_downloader::downloader;
|
|
|
|
use std::thread;
|
|
use std::cell::RefCell;
|
|
use std::sync::mpsc::{channel, Receiver};
|
|
use std::rc::Rc;
|
|
|
|
use content::Content;
|
|
|
|
type Foo = RefCell<Option<(Rc<Content>, Receiver<bool>)>>;
|
|
|
|
// Create a thread local storage that will store the arguments to be transfered.
|
|
thread_local!(static GLOBAL: Foo = RefCell::new(None));
|
|
|
|
/// Update the rss feed(s) originating from `Source`.
|
|
/// If `source` is None, Fetches all the `Source` entries in the database and updates them.
|
|
/// `delay` represents the desired time in seconds for the thread to sleep before executing.
|
|
/// When It's done,it queues up a `podcast_view` refresh.
|
|
pub fn refresh_feed(content: Rc<Content>, source: Option<Vec<Source>>) {
|
|
// Create a async channel.
|
|
let (sender, receiver) = channel();
|
|
|
|
// Pass the desired arguments into the Local Thread Storage.
|
|
GLOBAL.with(clone!(content => move |global| {
|
|
*global.borrow_mut() = Some((content.clone(), receiver));
|
|
}));
|
|
|
|
thread::spawn(move || {
|
|
let feeds = {
|
|
if let Some(vec) = source {
|
|
Ok(feed::fetch(vec))
|
|
} else {
|
|
feed::fetch_all()
|
|
}
|
|
};
|
|
|
|
if let Ok(x) = feeds {
|
|
feed::index(x);
|
|
|
|
sender.send(true).expect("Couldn't send data to channel");;
|
|
glib::idle_add(refresh_podcasts_view);
|
|
};
|
|
});
|
|
}
|
|
|
|
fn refresh_podcasts_view() -> glib::Continue {
|
|
GLOBAL.with(|global| {
|
|
if let Some((ref content, ref reciever)) = *global.borrow() {
|
|
if reciever.try_recv().is_ok() {
|
|
content.update();
|
|
}
|
|
}
|
|
});
|
|
glib::Continue(false)
|
|
}
|
|
|
|
// FIXME: use something that would just scale?
|
|
pub fn get_pixbuf_from_path(pd: &PodcastCoverQuery, size: u32) -> Option<Pixbuf> {
|
|
let img_path = downloader::cache_image(pd)?;
|
|
Pixbuf::new_from_file_at_scale(&img_path, size as i32, size as i32, true).ok()
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use hammond_data::Source;
|
|
use hammond_data::feed::index;
|
|
use hammond_data::dbqueries;
|
|
use diesel::associations::Identifiable;
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_get_pixbuf_from_path() {
|
|
let url = "http://www.newrustacean.com/feed.xml";
|
|
|
|
// Create and index a source
|
|
let source = Source::from_url(url).unwrap();
|
|
// Copy it's id
|
|
let sid = source.id().clone();
|
|
|
|
// Convert Source it into a Feed and index it
|
|
let feed = source.into_feed().unwrap();
|
|
index(vec![feed]);
|
|
|
|
// Get the Podcast
|
|
let pd = dbqueries::get_podcast_from_source_id(sid).unwrap();
|
|
let pxbuf = get_pixbuf_from_path(&pd.into(), 256);
|
|
assert!(pxbuf.is_some());
|
|
}
|
|
}
|