[!IMPORTANT] Since version
0.9.0
, elfeed-protocol use variableelfeed-protocol-feeds
instead ofelfeed-feeds
to fix conflict issues to extensions that modify or requireelfeed-feeds
. And elfeed-protocol could work together with elfeed-org and elfeed-autotag without any aditional setup now.
Provide extra protocols to make self-hosting RSS readers work with elfeed, including Fever, NewsBlur, Nextcloud/ownCloud News, Tiny Tiny RSS and even more.
;; Install through package manager
M-x package-install <ENTER>
elfeed-protocol <ENTER>
Setup elfeed-protocol, then switch to search view and and press G to update entries:
;; curl recommend
(setq elfeed-use-curl t)
(elfeed-set-timeout 36000)
(setq elfeed-curl-extra-arguments '("--insecure")) ;necessary for https without a trust certificate
;; setup feeds
(setq elfeed-protocol-feeds '(("owncloud+https://user@myhost.com"
:password "my-password")))
;; enable elfeed-protocol
(setq elfeed-protocol-enabled-protocols '(fever newsblur owncloud ttrss))
(elfeed-protocol-enable)
elfeed-protocol-fever-update-unread-only
to t as a workaroundelfeed-protocol-fever-star-tag
which default value is
star
elfeed-protocol-fever-update-older
elfeed-protocol-fever-update-star
NOTE: Many self-hosted RSS server provide Fever API, and user must provide the URL manually. Here is a list of Fever API URLs I collected for some popular RSS servers:
https://your-ttrss-server/plugins/fever/
https://your-freshrss-server/api/fever.php
https://your-miniflux-server/fever/
Example:
(setq elfeed-protocol-fever-update-unread-only nil)
(setq elfeed-protocol-fever-fetch-category-as-tag t)
(setq elfeed-protocol-feeds '(("fever+https://user@myhost.com"
:api-url "https://myhost.com/plugins/fever/"
:password "my-password")))
elfeed-protocol-ttrss-star-tag
which default value is
star
NOTE: A file for storing session cookies has to be specified via
elfeed-curl-extra-arguments
like in the following example.
Example:
(setq elfeed-protocol-newsblur-maxpages 20)
(setq elfeed-protocol-newsblur-fetch-tags t)
(setq elfeed-protocol-newsblur-fetch-category-as-tag t)
(setq elfeed-protocol-newsblur-sub-category-separator "/")
(setq elfeed-curl-extra-arguments '("--cookie-jar" "/tmp/newsblur-cookie"
"--cookie" "/tmp/newsblur-cookie"))
(setq elfeed-protocol-feeds '(("newsblur+https://user@newsblur.com"
:password "my-password")))
elfeed-protocol-owncloud-star-tag
which default value is star
. For
example, if user add star
tag to one article, the star stat will
be sync to server, tooelfeed-protocol-owncloud-update-since-timestamp
elfeed-protocol-owncloud-update-since-id
elfeed-protocol-owncloud-update-older
Example:
(setq elfeed-protocol-owncloud-maxsize 1000)
(setq elfeed-protocol-owncloud-update-with-modified-time t)
(setq elfeed-protocol-owncloud-fetch-category-as-tag t)
(setq elfeed-protocol-feeds '(("owncloud+https://user@myhost.com"
:password "my-password")))
elfeed-protocol-ttrss-star-tag
which default
value is star
, and the published tag name defined in
elfeed-protocol-ttrss-publish-tag
which default value is
publish
elfeed-protocol-ttrss-update-older
elfeed-protocol-ttrss-update-star
NOTE: For Tiny Tiny RSS only allow fetch Maximize 200 entries each
time, so if your own much more starred entries, just run
elfeed-protocol-ttrss-update-star
manually to fetch them all
Example:
(setq elfeed-protocol-ttrss-maxsize 200) ; bigger than 200 is invalid
(setq elfeed-protocol-ttrss-fetch-category-as-tag t)
(setq elfeed-protocol-feeds '(("ttrss+https://user@myhost.com"
:password "my-password")))
(setq elfeed-protocol-feeds '(
;; same format with elfeed-feeds
"http://foo/"
("http://baz/" comic)
;; format 1
"owncloud+https://user:pass@myhost.com"
;; format 2, for username or password with special characters
("owncloud+https://user@domain.com@myhost.com"
:password "password/with|special@characters:")
;; format 3, for password in file
("owncloud+https://user@myhost.com"
:password-file "~/.password")
;; format 4, for password in .authinfo,
;; ensure (auth-source-search :host "myhost.com" :port "443" :user "user4") exists
("owncloud+https://user@myhost.com"
:use-authinfo t)
;; format 5, for password in gnome-keyring
("owncloud+https://user@myhost.com"
:password (shell-command-to-string "echo -n `secret-tool lookup attribute value`"))
;; format 6, for password in pass(1), using password-store.el
("owncloud+https://user@myhost.com"
:password (password-store-get "owncloud/app-pass"))
;; use autotags
("owncloud+https://user@myhost.com"
:password "password"
:autotags (("example.com" comic)))))
(setq elfeed-feeds '("http://foo/" ("http://baz/" comic)))
(setq elfeed-protocol-feeds '(("owncloud+https://user@myhost.com"
:password "my-password")))
(setq elfeed-protocol-feeds (append elfeed-protocol-feeds elfeed-feeds))
Since version 0.9.0
, elfeed-protocol could work together with
elfeed-org and elfeed-autotag without any aditional setup.
To fix 0 / 0
zero count issue for all feeds, just active the
following advice for rmh-elfeed-org-export-feed
:
(defun elfeed-protocol-advice-rmh-elfeed-org-export-feed (headline)
"Advice for `rmh-elfeed-org-export-feed', add elfeed-protocol ID as suffix for each feed."
(let* ((url (car headline))
(proto-id (car (elfeed-protocol-feed-list))))
(when proto-id
(setcar headline (elfeed-protocol-format-subfeed-id proto-id url)))))
(advice-add 'rmh-elfeed-org-export-feed :before #'elfeed-protocol-advice-rmh-elfeed-org-export-feed)
Besides, don't use elfeed-summary-update
to fetach articles,
use elfeed-update
instead, and press r
to refresh UI manually:
(define-key elfeed-summary-mode-map (kbd "R") #'elfeed-update)
Install cask
system package firstly, and then run following commands
make init
make test
make checkdoc
make elint
make package-lint
Fetch docker image and run it
docker pull nextcloud
docker run --rm -p 80:80 nextcloud
Open http://127.0.0.1 in browser to setup Nextcloud
Setup elfeed-protocol
(setq elfeed-protocol-feeds '("owncloud+http://<admin>:<password>@localhost"))
Fetch related docker images and run them
docker pull clue/ttrss
docker pull nornagon/postgres
docker run --rm -d --name ttrssdb nornagon/postgres
docker run --rm --link ttrssdb:db -p 80:80 clue/ttrss
Open http://127.0.0.1 in browser to setup Tiny Tiny RSS
admin:password
authorization info to loginSetup elfeed-protocol
(setq elfeed-protocol-feeds '("ttrss+http://admin:password@localhost"))
Please collect logs in buffer *elfeed-log*
with the following config
before reporting issues:
(setq elfeed-log-level 'debug)
(toggle-debug-on-error)
;; for more logs
(setq elfeed-protocol-log-trace t)
(setq elfeed-protocol-fever-maxsize 10)
(setq elfeed-protocol-newsblur-maxpages 1)
(setq elfeed-protocol-owncloud-maxsize 10)
(setq elfeed-protocol-ttrss-maxsize 10)
When I run elfeed-update I get the error: elfeed-protocol-feeds malformed, bad entry
Don't forget to enable elfeed-protocol at first:
(elfeed-protocol-enable)
Not working if my password contains special characters like @#$/:
.
Use format 2 instead in previous example for complex password:
;; format 2, for password with special characters
("owncloud+https://user@myhost.com"
:password "password/with|special@characters:")
How to fetch my older headlines in server?
fever
, owncloud
and ttrss
protocol provide method to fetch
older headlines. And the update operations could not executed in
the same time, so run-at-time
with some delays(for example 15s)
will help you:
(setq my-elfeed-update-timer
(run-at-time 15 15
(lambda () (when (= elfeed-curl-queue-active 0)
(elfeed-protocol-ttrss-update-older "ttrss+https://user@host")))))
(cancel-timer my-elfeed-update-timer)
Why the articles still are unread even they were mark read in other client?
Well, only ownCloud News API support two-way synchronization for it fetch articles with modified time. And other API only fetch articles id by id. So your issue just the desired result~
However here is a workaround. For example fever, you could reset the update mark so it will re-fetch the last 1000 articles in following updates and will sync the read state:
(let* ((proto-id "fever+https://user@miniflux-host")
(last-id (elfeed-protocol-fever-get-update-mark proto-id 'update)))
(elfeed-protocol-fever-set-update-mark proto-id 'update (- last-id 1000)))
And Fever limit 50 max size for per request, so update timer may help you:
(run-at-time 300 300
(lambda () (when (= elfeed-curl-queue-active 0)
(elfeed-update))))
Or you could use elfeed-untag-1
mark all selected articles as
read(will not call curl process) then execute
elfeed-protocol-fever-reinit
fetch all unread articles:
(cl-loop for entry in (elfeed-search-selected)
do (elfeed-untag-1 entry 'unread))
Hope helps.
Sometimes emacs may be blocked if the parsing downloaded articles is too large, for example >50MB.
This is caused by the known emacs bug that CPU will be in high usage if a text line is too long. There three methods to workaround this:
Method 1, limit the download size, for example:
(setq elfeed-protocol-owncloud-maxsize 1000)
Method 2, for ownCloud, just update articles since special entry ID instead the modified time, this could run multiple times to keep up to date to avoid download too large entries once time
M-x elfeed-protocol-owncloud-update-since-id
Method 3, some protocol provide update method to reset the last modified time to skip some data, for example:
M-x elfeed-protocol-owncloud-update-since-timestamp
Released under the terms of the GNU GPLv3+.