Add only what is a feed or links one; refuse the rest (#102)
Adding an address looked for the feed a web page links and, finding none, added the address as it was: every check then failed, and the sidebar called it a feed that had moved. cnn.com is one; its page links no feed. find_feed replaces feed_behind_page: the address is added if it is a feed or an OPML list, the feed its page links if it is a web page that links one (and that is a feed), and otherwise the add is refused with the reason, from the web page (400, the dialog stays open) and from `ipx add`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1282,8 +1282,11 @@ async fn add_feed(
|
||||
Json(body): Json<NewFeed>,
|
||||
) -> Result<Json<serde_json::Value>, ApiError> {
|
||||
let mut cfg = (*state.ctx.cfg()).clone();
|
||||
// Before the duplicate check, so a site's page finds the feed someone already has.
|
||||
let url = crate::feed::feed_behind_page(&state.ctx.client, &crate::feed::expand_input(&body.url)).await;
|
||||
// Before the duplicate check, so a site's page finds the feed someone already has. What is
|
||||
// not a feed and links none is refused here, with why, and nothing is added.
|
||||
let url = crate::feed::find_feed(&state.ctx.client, &crate::feed::expand_input(&body.url))
|
||||
.await
|
||||
.map_err(|e| ApiError::bad_request(format!("{e:#}")))?;
|
||||
// Someone else may already have it. Then adding costs nothing: no second fetch, no
|
||||
// second copy on disk, just another name against the same feed.
|
||||
if let Some(existing) = crate::subscriptions(&state.ctx).await?
|
||||
|
||||
Reference in New Issue
Block a user