* update deps
* make the sniff package independent
* rename sniffer to feedfinder for a more neutral meaning
* allow setting Proxy when creating a feed
* ci: support pushing to GitHub Container Registry
In addition to Dockerhub, images will also be published to GHCR.
Fixes: #135
* update build push action
* lower-case repository due to ghcr reqs
fusion's previous behavior was to immediately retry requesting a feed when the request fails. This made more sense before we added failure recovery (df412f17d3). Now, immediately retrying on failure complicates the implementation and risks getting the client banned if the server is responding with HTTP 429 errors and we just keep spamming the same requests.
This changes the polling behavior so that we only request each feed once per polling interval. If the request fails, we'll try again at the next polling interval.
* fix: correct translation key and handle missing text in translation function
* refactor: update ItemList component to use Promise for data fetching and remove placeholder component
* fix: add reactivity for ActionMenu component
* refactor: prevent unused API calls after triggering an item action
* fix: fix the edge cases of the item switcher
* refactor: display feed_import error message on form instead of using a toast notification
* chore: add `feed.import.manually.no_valid_feed_error` into i18n
* chore: update deps
* refactor: display feed meta info on item page
* Recover after feed fetch failure with exponential backoff
The current implementation stops attempting to fetch a feed if fusion encounters any error fetching it. The only way to continue fetching the feed is if the user manually forces a refresh.
This allows fusion to recover from feed fetch errors by tracking the number of consecutive failures and slowing down requests for consistent failure. If a feed always fails, we eventually slow to only checking it once per week.
Fixes#67
* Add comment
I realized it's simpler to just create the actual error type in the testcase than to define the error message and wait until the test body to convert it to an error type.
FusionRequest currently specifies model.FeedRequestOptions as a pointer rather than as a regular parameter. This is unnecessary, as it's easy for us to treat model.FeedRequestOptions{} as the 'default options' value. With it as a pointer, we clutter our code with extra != nil checks.
This change updates FusionRequest to just take a model.FeedRequestOptions rather than a *model.FeedRequestOptions.
Co-authored-by: rook1e <rook1e404@outlook.com>
* Add FeedClient.FetchDeclaredLink method
The sniff package uses redundant RSS parsing logic that duplicates logic that's in the service/pull/client package now.
This change adds a FetchDeclaredLink method that exposes functionality that the sniff package needs and switches the sniff.parseRSSUrl to use the client package instead of duplicating RSS parsing functionality.
* Reorder imports
The feed ID doesn't really belong in ParseGoFeedItems because its job is to convert gofeed objects to fusion objects, but the feed ID is not a concept in gofeed.
The only reason we need to store the feed ID in each feed item is so that each feed item references its parent feed in the database, so we should handle populating feed ID with the database logic, not with the gofeed parsing logic.