diff --git a/Cargo.lock b/Cargo.lock index b8eb97d..6c1d6ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -671,6 +671,7 @@ dependencies = [ "open 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "send-cell 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/hammond-data/src/lib.rs b/hammond-data/src/lib.rs index 7e2de25..f498821 100644 --- a/hammond-data/src/lib.rs +++ b/hammond-data/src/lib.rs @@ -1,14 +1,13 @@ #![recursion_limit = "1024"] +#![cfg_attr(all(test, feature = "clippy"), allow(option_unwrap_used, result_unwrap_used))] #![cfg_attr(feature = "cargo-clippy", allow(blacklisted_name))] #![cfg_attr(feature = "clippy", warn(option_unwrap_used, result_unwrap_used, print_stdout, wrong_pub_self_convention, mut_mut, non_ascii_literal, similar_names, unicode_not_nfc, enum_glob_use, if_not_else, items_after_statements, used_underscore_binding))] -#![cfg_attr(all(test, feature = "clippy"), allow(option_unwrap_used, result_unwrap_used))] -//! A libraty for parsing, indexing and retrieving podcast Feeds, -//! into and from a Database. +//! FIXME: Docs #![allow(unknown_lints)] #![deny(bad_style, const_err, dead_code, improper_ctypes, legacy_directory_ownership, @@ -19,7 +18,6 @@ unused_parens, while_true)] #![deny(missing_debug_implementations, missing_docs, trivial_casts, trivial_numeric_casts)] #![deny(unused_extern_crates, unused)] -#![deny(unused_extern_crates, unused)] // #![feature(conservative_impl_trait)] diff --git a/hammond-data/src/utils.rs b/hammond-data/src/utils.rs index 18a38b5..4ecb386 100644 --- a/hammond-data/src/utils.rs +++ b/hammond-data/src/utils.rs @@ -16,12 +16,12 @@ use std::path::Path; /// Scan downloaded `episode` entries that might have broken `local_uri`s and set them to `None`. fn download_checker() -> Result<()> { - let episodes = dbqueries::get_downloaded_episodes()?; + let mut episodes = dbqueries::get_downloaded_episodes()?; episodes - .into_par_iter() + .par_iter_mut() .filter(|ep| !Path::new(ep.local_uri().unwrap()).exists()) - .for_each(|mut ep| { + .for_each(|ep| { ep.set_local_uri(None); if let Err(err) = ep.save() { error!("Error while trying to update episode: {:#?}", ep); diff --git a/hammond-gtk/Cargo.toml b/hammond-gtk/Cargo.toml index 31047ad..e1c8c49 100644 --- a/hammond-gtk/Cargo.toml +++ b/hammond-gtk/Cargo.toml @@ -19,6 +19,7 @@ loggerv = "0.7.0" open = "1.2.1" rayon = "0.9.0" send-cell = "0.1.2" +url = "1.6.0" [dependencies.gtk] features = ["v3_22"] diff --git a/hammond-gtk/resources/gtk/headerbar.ui b/hammond-gtk/resources/gtk/headerbar.ui index e728022..9152d75 100644 --- a/hammond-gtk/resources/gtk/headerbar.ui +++ b/hammond-gtk/resources/gtk/headerbar.ui @@ -129,7 +129,7 @@ Tobias Bernard - + False start You are already subscribed to that feed! diff --git a/hammond-gtk/src/headerbar.rs b/hammond-gtk/src/headerbar.rs index 3f36f80..3babee7 100644 --- a/hammond-gtk/src/headerbar.rs +++ b/hammond-gtk/src/headerbar.rs @@ -2,6 +2,7 @@ use gtk; use gtk::prelude::*; use hammond_data::Source; +use url::Url; use std::sync::Arc; use std::sync::mpsc::Sender; @@ -63,11 +64,12 @@ impl Header { let add_popover: gtk::Popover = builder.get_object("add_popover").unwrap(); let new_url: gtk::Entry = builder.get_object("new_url").unwrap(); let add_button: gtk::Button = builder.get_object("add_button").unwrap(); + let result_label: gtk::Label = builder.get_object("result_label").unwrap(); self.switch.set_stack(&content.get_stack()); - new_url.connect_changed(move |url| { - println!("{:?}", url.get_text()); - }); + new_url.connect_changed(clone!(add_button => move |url| { + on_url_change(url, &result_label, &add_button); + })); add_button.connect_clicked(clone!(add_popover, new_url, sender => move |_| { on_add_bttn_clicked(&new_url, sender.clone()); @@ -139,3 +141,24 @@ fn on_add_bttn_clicked(entry: >k::Entry, sender: Sender) { error!("Error: {:?}", source.unwrap_err()); } } + +fn on_url_change(entry: >k::Entry, result: >k::Label, add_button: >k::Button) { + let uri = entry.get_text().unwrap(); + debug!("Url: {}", uri); + + let url = Url::parse(&uri); + match url { + // TODO: Check if the url exists + Ok(_u) => { + add_button.set_sensitive(true); + result.hide(); + } + // TODO: refactor to avoid duplication + Err(err) => { + add_button.set_sensitive(false); + result.set_label("Invalid url."); + result.show(); + error!("Error: {}", err); + } + } +} diff --git a/hammond-gtk/src/main.rs b/hammond-gtk/src/main.rs index 5c9f969..b36e2ef 100644 --- a/hammond-gtk/src/main.rs +++ b/hammond-gtk/src/main.rs @@ -19,6 +19,7 @@ extern crate log; extern crate loggerv; extern crate open; extern crate send_cell; +extern crate url; // extern crate rayon; // use rayon::prelude::*;