init-elfeed.el 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. ;;; Elfeed
  2. (setq elfeed-db-directory (expand-file-name "elfeed" user-emacs-directory)
  3. elfeed-search-title-max-width 100)
  4. ;; The following is only useful if curl is not set up to always use Tor.
  5. ;; (when (member "tor"
  6. ;; (mapcar (lambda (p) (alist-get 'comm (process-attributes p)))
  7. ;; (list-system-processes)))
  8. ;; (setq elfeed-curl-extra-arguments '("--socks5" "localhost:9050")))
  9. (defun ambrevar/elfeed-add-bookmark ()
  10. "Add bookmark using `eww-add-bookmark'."
  11. (interactive)
  12. (let ((entry (if (eq major-mode 'elfeed-show-mode) elfeed-show-entry (elfeed-search-selected :single))))
  13. (eww-add-bookmark (elfeed-entry-link entry)
  14. (elfeed-entry-title entry))))
  15. (define-key elfeed-search-mode-map "m" #'ambrevar/elfeed-add-bookmark)
  16. (define-key elfeed-show-mode-map "m" #'ambrevar/elfeed-add-bookmark)
  17. (defun ambrevar/elfeed-play-with-mpv ()
  18. "Play entry link with mpv."
  19. (interactive)
  20. (let ((entry (if (eq major-mode 'elfeed-show-mode) elfeed-show-entry (elfeed-search-selected :single)))
  21. (quality-arg "")
  22. (quality-val (completing-read "Max height resolution (0 for unlimited): " '("0" "480" "720") nil nil)))
  23. (setq quality-val (string-to-number quality-val))
  24. (message "Opening %s with height≤%s with mpv..." (elfeed-entry-link entry) quality-val)
  25. (when (< 0 quality-val)
  26. (setq quality-arg (format "--ytdl-format=[height<=?%s]" quality-val)))
  27. (start-process "elfeed-mpv" nil "mpv" quality-arg (elfeed-entry-link entry))))
  28. (defun ambrevar/elfeed-download-with-youtube-dl ()
  29. "Download entry with youtube-dl."
  30. (interactive)
  31. (let ((entry (if (eq major-mode 'elfeed-show-mode) elfeed-show-entry (elfeed-search-selected :single)))
  32. (default-directory (expand-file-name "~/Downloads")))
  33. ;; TODO: Use ytdl.
  34. (message "Downloading %s with youtube-dl..." (elfeed-entry-link entry))
  35. (start-process "elfeed-youtube-dl" nil "youtube-dl" "-f" "best" (elfeed-entry-link entry))))
  36. (defun ambrevar/elfeed-open-with-eww ()
  37. "Open in eww with `eww-readable'."
  38. (interactive)
  39. (let ((entry (if (eq major-mode 'elfeed-show-mode) elfeed-show-entry (elfeed-search-selected :single))))
  40. (eww (elfeed-entry-link entry))
  41. (add-hook 'eww-after-render-hook 'eww-readable nil t)))
  42. (defvar ambrevar/elfeed-visit-patterns
  43. '(("//[^/]*youtu\\.?be" . ambrevar/elfeed-download-with-youtube-dl)
  44. ("phoronix" . ambrevar/elfeed-open-with-eww))
  45. "List of (regexps . function) to match against elfeed entry link to know
  46. whether how to visit the link.")
  47. (defun ambrevar/elfeed-visit-maybe-external ()
  48. "Visit with external function if entry link matches `ambrevar/elfeed-visit-patterns',
  49. visit otherwise."
  50. (interactive)
  51. (let ((entry (if (eq major-mode 'elfeed-show-mode)
  52. elfeed-show-entry
  53. (elfeed-search-selected :single)))
  54. (patterns ambrevar/elfeed-visit-patterns))
  55. (while (and patterns (not (string-match (caar patterns) (elfeed-entry-link entry))))
  56. (setq patterns (cdr patterns)))
  57. (cond
  58. (patterns
  59. (elfeed-untag entry 'unread)
  60. (elfeed-search-update-entry entry)
  61. (funcall (cdar patterns)))
  62. ((eq major-mode 'elfeed-search-mode)
  63. (call-interactively 'elfeed-search-show-entry))
  64. (t (elfeed-show-visit)))))
  65. (defun ambrevar/elfeed-kill-entry ()
  66. "Like `elfeed-kill-buffer' but pop elfeed search."
  67. (interactive)
  68. (elfeed-kill-buffer)
  69. (switch-to-buffer "*elfeed-search*"))
  70. (define-key elfeed-show-mode-map "q" #'ambrevar/elfeed-kill-entry)
  71. ;; Show entry in different buffers.
  72. ;; REVIEW: Reported upstream:
  73. ;; https://github.com/skeeto/elfeed/issues/307
  74. ;; Merged, remove the advice in Elfeed >3.0.0.
  75. (defvar ambrevar/elfeed-show-unique-buffers t)
  76. (defun ambrevar/elfeed-show-entry (entry)
  77. "Display ENTRY in the current buffer."
  78. (let ((buff (get-buffer-create (if ambrevar/elfeed-show-unique-buffers
  79. (format "*elfeed-entry-<%s>*"
  80. (elfeed-entry-title entry))
  81. "*elfeed-entry*"))))
  82. (with-current-buffer buff
  83. (elfeed-show-mode)
  84. (setq elfeed-show-entry entry)
  85. (elfeed-show-refresh))
  86. (funcall elfeed-show-entry-switch buff)))
  87. (advice-add 'elfeed-show-entry :override 'ambrevar/elfeed-show-entry)
  88. (defun ambrevar/elfeed-setup ()
  89. (add-hook 'window-configuration-change-hook 'elfeed-search-update--force nil t))
  90. ;; This is too slow on big buffers.
  91. ;; (add-hook 'elfeed-search-mode-hook 'ambrevar/elfeed-setup)
  92. (load (expand-file-name "news/elfeed.el.gpg" (getenv "PERSONAL")) :noerror)
  93. (provide 'init-elfeed)