Rework elfeed

All my feeds are stored in a separate org file.  I've written a parser
`elfeed-org` which parses the headings-as-links with the overarching
tags into a format for `elfeed-feeds`.

Why didn't I use the third-party elfeed-org package?  It uses an older
version of org which straight will clone entirely.  Don't want two
versions of org, and its a task just simple enough for me to do
myself.
This commit is contained in:
2025-02-17 14:53:54 +00:00
parent cd58595d2e
commit 70940c79bd
3 changed files with 88 additions and 47 deletions

View File

@@ -0,0 +1,18 @@
#+title: RSS Feeds
#+author: Aryadev Chavali
#+date: 2025-02-17
* News :news:
** [[https://www.archlinux.org/feeds/news/][Arch Linux]]
* Social :social:
** [[https://news.ycombinator.com/rss][Hacker News]]
** [[https://www.theonion.com/rss][The Onion]]
** [[https://www.hackerfactor.com/blog/index.php?/feeds/index.rss2][Hacker Factor]]
* YouTube :youtube:
** [[https://www.youtube.com/feeds/videos.xml?channel_id=UC0uTPqBCFIpZxlz_Lv1tk_g][Protesilaos Stavrou]]
** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCrqM0Ym_NbK1fqeQG2VIohg][Tsoding Daily]]
** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCrqM0Ym_NbK1fqeQG2VIohg][Tsoding]]
** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCYO_jab_esuFRV4b17AJtAw][3B1B]]
** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCbWcXB0PoqOsAvAdfzWMf0w][Fredrik Knusden]]
** [[https://www.youtube.com/feeds/videos.xml?channel_id=UC9PIn6-XuRKZ5HmYeu46AIw][Barely Sociable]]
** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCn8OYopT9e8tng-CGEWzfmw][Atrocity Guide]]

View File

@@ -3623,10 +3623,7 @@ most distribution nowadays.
default-directory))) default-directory)))
(evil-set-initial-state 'rg-mode 'normal)) (evil-set-initial-state 'rg-mode 'normal))
#+end_src #+end_src
** TODO Elfeed ** Elfeed
:PROPERTIES:
:header-args:emacs-lisp: :tangle no :results none
:END:
Elfeed is the perfect RSS feed reader, integrated into Emacs Elfeed is the perfect RSS feed reader, integrated into Emacs
perfectly. I've got a set of feeds that I use for a large variety of perfectly. I've got a set of feeds that I use for a large variety of
stuff, mostly media and entertainment. I've also bound "<leader> ar" stuff, mostly media and entertainment. I've also bound "<leader> ar"
@@ -3647,53 +3644,11 @@ it out again.
"<return>" #'elfeed-search-show-entry) "<return>" #'elfeed-search-show-entry)
:init :init
(setq elfeed-db-directory (no-littering-expand-var-file-name "elfeed/")) (setq elfeed-db-directory (no-littering-expand-var-file-name "elfeed/"))
(setq +rss/feed-urls
'(("Arch Linux"
"https://www.archlinux.org/feeds/news/"
News Technology)
("The Onion"
"https://www.theonion.com/rss"
Social)
("Protesilaos Stavrou"
"https://www.youtube.com/@protesilaos"
YouTube Technology)
("Tsoding Daily"
"https://www.youtube.com/feeds/videos.xml?channel_id=UCrqM0Ym_NbK1fqeQG2VIohg"
YouTube Technology)
("Tsoding"
"https://www.youtube.com/feeds/videos.xml?channel_id=UCrqM0Ym_NbK1fqeQG2VIohg"
YouTube Technology)
("Nexpo"
"https://www.youtube.com/feeds/videos.xml?channel_id=UCpFFItkfZz1qz5PpHpqzYBw"
YouTube Stories)
("3B1B"
"https://www.youtube.com/feeds/videos.xml?channel_id=UCYO_jab_esuFRV4b17AJtAw"
YouTube)
("Fredrik Knusden"
"https://www.youtube.com/feeds/videos.xml?channel_id=UCbWcXB0PoqOsAvAdfzWMf0w"
YouTube Stories)
("Barely Sociable"
"https://www.youtube.com/feeds/videos.xml?channel_id=UC9PIn6-XuRKZ5HmYeu46AIw"
YouTube Stories)
("Atrocity Guide"
"https://www.youtube.com/feeds/videos.xml?channel_id=UCn8OYopT9e8tng-CGEWzfmw"
YouTube Stories)
("Hacker News"
"https://news.ycombinator.com/rss"
Social News Technology)
("Hacker Factor"
"https://www.hackerfactor.com/blog/index.php?/feeds/index.rss2"
Social)))
:config :config
(with-eval-after-load "evil-collection" (with-eval-after-load "evil-collection"
(evil-collection-elfeed-setup)) (evil-collection-elfeed-setup))
(setq elfeed-feeds (cl-map 'list #'(lambda (item) (advice-add 'elfeed-search-show-entry :after #'+elfeed/dispatch-entry)
(append (list (nth 1 item)) (cdr (cdr item))))
+rss/feed-urls))
(advice-add 'elfeed-search-show-entry :after #'+elfeed/dispatch-entry)
(defun +elfeed/dispatch-entry (entry) (defun +elfeed/dispatch-entry (entry)
"Process each type of entry differently. "Process each type of entry differently.
@@ -3704,6 +3659,18 @@ it out again.
(mpv-play-url url)) (mpv-play-url url))
(_ (eww url)))))) (_ (eww url))))))
#+end_src #+end_src
*** Elfeed-org
#+begin_src emacs-lisp
(use-package elfeed-org
:load-path "elisp/"
:after elfeed
:init
(thread-last "elfeed/feeds.org"
no-littering-expand-etc-file-name
(setq elfeed-org/file))
:config
(elfeed-org))
#+end_src
** IBuffer ** IBuffer
IBuffer is the dired of buffers. Nothing much else to be said. IBuffer is the dired of buffers. Nothing much else to be said.

View File

@@ -0,0 +1,56 @@
;;; elfeed-org.el --- Org integration with elfeed -*- lexical-binding: t; -*-
;; Copyright (C) 2025 Aryadev Chavali
;; Author: Aryadev Chavali <aryadev@aryadevchavali.com>
;; Keywords:
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
;;
;;; Code:
(defvar elfeed-org/file nil)
(defun elfeed-org/--parse-link (context)
(thread-last (org-element-property :title context)
search-forward)
(let ((title-context (org-element-context)))
(org-element-property :raw-link title-context)))
(defun elfeed-org/--parse-tags ()
(mapcar #'intern (org-get-tags)))
(defun elfeed-org/--parse-headline ()
(if-let* ((ctx (org-element-context))
(link (elfeed-org/--parse-link ctx))
(tags (elfeed-org/--parse-tags)))
(cons link tags)
nil))
(defun elfeed-org/--parse-headlines ()
(cl-remove-if
#'null
(org-map-entries #'elfeed-org/--parse-headline t)))
(defun elfeed-org ()
(setq elfeed-feeds
(with-current-buffer (find-file-noselect elfeed-org/file)
(elfeed-org/--parse-headlines))))
(provide 'elfeed-org)
;;; elfeed-org.el ends here