Skip to content

Commit

Permalink
Improve rss/atom feed subscription (#13)
Browse files Browse the repository at this point in the history
* feat: does not fetch old items from RSS feeds

* feat: fetch automatically the rss/atom in the page source

* fix: check if the link is a feed or not

* fix: remove `clone`

* feat: handle exception if feed table already exists

* fix: resolve prevented multiple items from being imported

* chore: `cargo fmt`

* fix: remove excessive database access

* fix: modify error if nothing is entered when adding a feed

* chore: execute second `cargo fmt`

* fix: check most recent only when fetch_old_items is false

* fix: use `pub`

* fix: add table column using `add_column_if_not_exists`

* fix: handle errors when generating feeds in `errors.rc`.

* fix: get feed ids for most recent items

* fix: delete unnecessary HTTP request

* chore: check clippy point
  • Loading branch information
taevel02 authored Feb 4, 2024
1 parent 7fc089f commit 6e56732
Show file tree
Hide file tree
Showing 15 changed files with 331 additions and 63 deletions.
138 changes: 128 additions & 10 deletions src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ reqwest = { version = "0.11", features = ["blocking"] }
sha1_smol = { version = "1", features = ["std"] }
thiserror = "1.0"
regex = "1.9"
scraper = "0.18.1"

[dev-dependencies]
pretty_assertions = "1.4"
Expand Down
27 changes: 24 additions & 3 deletions src-tauri/src/commands/feeds.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,47 @@ use tauri::State;

use crate::models::settings;
use crate::models::settings::SettingKey;
use crate::syndication::Feed as _Feed;
use crate::{
models::feeds::{self, Feed, FeedToCreate, FeedToUpdate},
producer::create_new_items,
syndication::fetch_feed_title,
syndication::{fetch_content, fetch_feed_title, find_feed_link},
DbState,
};

use crate::error::Error;

#[tauri::command]
pub fn create_feed(db_state: State<DbState>, arg: FeedToCreate) -> Result<String, String> {
if arg.link.is_empty() {
return Err(Error::EmptyString.to_string());
}

let db = db_state.db.lock().unwrap();
let proxy = settings::read(&db, &SettingKey::Proxy)
.map(|x| x.value)
.ok();
let title = match fetch_feed_title(&arg.link, proxy.as_deref()) {

let html_content = fetch_content(&arg.link, proxy.as_deref()).unwrap();
let is_feed = html_content.parse::<_Feed>().is_ok();

let link = if is_feed {
arg.link.clone()
} else if let Some(rss_link) = find_feed_link(&html_content).unwrap() {
rss_link
} else {
return Err(Error::InvalidFeedLink(arg.link).to_string());
};

let title = match fetch_feed_title(&link, proxy.as_deref()) {
Ok(title) => title,
Err(err) => return Err(err.to_string()),
};

let arg = FeedToCreate {
title,
link: arg.link,
link,
fetch_old_items: arg.fetch_old_items,
};

match feeds::create(&db, &arg) {
Expand Down
6 changes: 6 additions & 0 deletions src-tauri/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,18 @@ pub enum Error {
#[error("invalid key `{0}` for `{1}`")]
InvalidEnumKey(String, String),

#[error("invalid feed link `{0}`")]
InvalidFeedLink(String),

#[error("forbidden")]
Forbidden,

#[error("failed to parse syndication feed")]
SyndicationParsingFailure,

#[error("empty string")]
EmptyString,

#[error("unknown")]
Unknown,

Expand Down
20 changes: 20 additions & 0 deletions src-tauri/src/models/database.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ pub enum Feeds {
Link,
Status,
CheckedAt,
FetchOldItems,
}

#[derive(Iden)]
Expand Down Expand Up @@ -65,6 +66,12 @@ pub fn migrate(db: &Connection) -> Result<()> {
.default("subscribed"),
)
.col(ColumnDef::new(Feeds::CheckedAt).date_time().not_null())
.col(
ColumnDef::new(Feeds::FetchOldItems)
.boolean()
.not_null()
.default(true),
)
.index(
Index::create()
.unique()
Expand Down Expand Up @@ -147,6 +154,19 @@ pub fn migrate(db: &Connection) -> Result<()> {
let _ = insert_settings(db, "theme", "system");
let _ = insert_settings(db, "items_order", "ReceivedDateDesc");
let _ = insert_settings(db, "proxy", "");
let _ = insert_settings(db, "fetch_old_items", "1");

let add_feeds_columns = Table::alter()
.table(Feeds::Table)
.add_column_if_not_exists(
ColumnDef::new(Feeds::FetchOldItems)
.boolean()
.not_null()
.default(true),
)
.build(SqliteQueryBuilder);

db.execute(&add_feeds_columns, [])?;

Ok(())
}
Expand Down
Loading

0 comments on commit 6e56732

Please sign in to comment.