mirror of
https://github.com/SqrtMinusOne/elfeed-sync.git
synced 2025-12-10 20:13:02 +03:00
feat: reading entries
This commit is contained in:
parent
671c690d60
commit
941359b39c
2 changed files with 108 additions and 49 deletions
143
elfeed-sync.el
143
elfeed-sync.el
|
|
@ -78,6 +78,9 @@
|
||||||
(defvar elfeed-sync--elfeed-missed nil
|
(defvar elfeed-sync--elfeed-missed nil
|
||||||
"List of elfeed entries missed in tt-rss.")
|
"List of elfeed entries missed in tt-rss.")
|
||||||
|
|
||||||
|
(defvar elfeed-sync--tt-rss-missed nil
|
||||||
|
"List of tt-rss entries missed in elfeed.")
|
||||||
|
|
||||||
(cl-defstruct (elfeed-sync-datum (:constructor elfeed-sync-datum--create))
|
(cl-defstruct (elfeed-sync-datum (:constructor elfeed-sync-datum--create))
|
||||||
id tags)
|
id tags)
|
||||||
|
|
||||||
|
|
@ -272,10 +275,10 @@ called only after a succesful login query."
|
||||||
STATUS is a boolean. If nil, the entry is marked as read. ENTRY
|
STATUS is a boolean. If nil, the entry is marked as read. ENTRY
|
||||||
is an instance of `elfeed-entry'."
|
is an instance of `elfeed-entry'."
|
||||||
(let ((is-unread (elfeed-sync--entry-unread-p entry)))
|
(let ((is-unread (elfeed-sync--entry-unread-p entry)))
|
||||||
(if (and is-unread status)
|
(when (and is-unread (not status))
|
||||||
(elfeed-untag entry elfeed-sync-unread-tag)
|
(elfeed-untag entry elfeed-sync-unread-tag))
|
||||||
(when (not is-unread)
|
(when (and (not is-unread) status)
|
||||||
(elfeed-tag entry elfeed-sync-unread-tag)))))
|
(elfeed-tag entry elfeed-sync-unread-tag))))
|
||||||
|
|
||||||
(defun elfeed-sync--set-entry-marked (entry status)
|
(defun elfeed-sync--set-entry-marked (entry status)
|
||||||
"Set the marked status of ENTRY to STATUS.
|
"Set the marked status of ENTRY to STATUS.
|
||||||
|
|
@ -283,10 +286,10 @@ is an instance of `elfeed-entry'."
|
||||||
STATUS is a boolean. If nil, the entry is marked as
|
STATUS is a boolean. If nil, the entry is marked as
|
||||||
unmarked. ENTRY is an instance of `elfeed-entry'."
|
unmarked. ENTRY is an instance of `elfeed-entry'."
|
||||||
(let ((is-marked (elfeed-sync--entry-marked-p entry)))
|
(let ((is-marked (elfeed-sync--entry-marked-p entry)))
|
||||||
(if (and is-marked status)
|
(when (and is-marked (not status))
|
||||||
(elfeed-untag entry elfeed-sync-marked-tag)
|
(elfeed-untag entry elfeed-sync-marked-tag))
|
||||||
(when (not is-marked)
|
(when (and (not is-marked) status)
|
||||||
(elfeed-tag entry elfeed-sync-marked-tag)))))
|
(elfeed-tag entry elfeed-sync-marked-tag))))
|
||||||
|
|
||||||
(defun elfeed-sync--ttrss-key (bad-feeds ttrss-entry)
|
(defun elfeed-sync--ttrss-key (bad-feeds ttrss-entry)
|
||||||
(let ((feed-url (alist-get 'feed_url ttrss-entry)))
|
(let ((feed-url (alist-get 'feed_url ttrss-entry)))
|
||||||
|
|
@ -295,12 +298,11 @@ unmarked. ENTRY is an instance of `elfeed-entry'."
|
||||||
(alist-get 'updated ttrss-entry))
|
(alist-get 'updated ttrss-entry))
|
||||||
(alist-get 'link ttrss-entry))))
|
(alist-get 'link ttrss-entry))))
|
||||||
|
|
||||||
(defun elfeed-sync--elfeed-key (bad-feeds elfeed-entry)
|
(defun elfeed-sync--elfeed-key (bad-feeds elfeed-entry feed-url)
|
||||||
(let ((feed-url (elfeed-entry-feed elfeed-entry)))
|
(if (gethash feed-url bad-feeds)
|
||||||
(if (gethash feed-url bad-feeds)
|
(format "%s---%s" (elfeed-entry-title elfeed-entry)
|
||||||
(format "%s---%s" (elfeed-entry-title elfeed-entry)
|
(floor (elfeed-entry-date elfeed-entry)))
|
||||||
(floor (elfeed-entry-date elfeed-entry)))
|
(elfeed-entry-link elfeed-entry)))
|
||||||
(elfeed-entry-link elfeed-entry))))
|
|
||||||
|
|
||||||
(defun elfeed-sync--ttrss-get-updated-time (ttrss-entry)
|
(defun elfeed-sync--ttrss-get-updated-time (ttrss-entry)
|
||||||
(if (and (alist-get 'last_read ttrss-entry)
|
(if (and (alist-get 'last_read ttrss-entry)
|
||||||
|
|
@ -322,22 +324,23 @@ unmarked. ENTRY is an instance of `elfeed-entry'."
|
||||||
(alist-get :last-sync-time elfeed-sync--state)))
|
(alist-get :last-sync-time elfeed-sync--state)))
|
||||||
|
|
||||||
(defun elfeed-sync--update-ttrss-missing (ttrss-entries ttrss-entries-processed)
|
(defun elfeed-sync--update-ttrss-missing (ttrss-entries ttrss-entries-processed)
|
||||||
(maphash (lambda (ttrss-id ttrss-entry)
|
(let (all-missing)
|
||||||
(when-let ((ttrss-time (elfeed-sync--ttrss-get-updated-time
|
(maphash (lambda (ttrss-id ttrss-entry)
|
||||||
ttrss-entry)))
|
(unless (gethash ttrss-id ttrss-entries-processed)
|
||||||
(if (gethash ttrss-id ttrss-entries-processed)
|
(push ttrss-entry all-missing)
|
||||||
(remhash ttrss-id (alist-get :ids-missing-tt-rss
|
(when-let ((ttrss-time (elfeed-sync--ttrss-get-updated-time
|
||||||
elfeed-sync--state))
|
ttrss-entry)))
|
||||||
(if-let ((old-val (gethash ttrss-id
|
(if-let ((old-val (gethash ttrss-id
|
||||||
(alist-get :ids-missing-tt-rss
|
(alist-get :ids-missing-tt-rss
|
||||||
elfeed-sync--state)))
|
elfeed-sync--state)))
|
||||||
(is-equal (= (car old-val) ttrss-time)))
|
(is-equal (= (car old-val) ttrss-time)))
|
||||||
t ;; do nothing
|
t ;; do nothing
|
||||||
(puthash ttrss-id (cons ttrss-time
|
(puthash ttrss-id (cons ttrss-time
|
||||||
elfeed-sync--start-time)
|
elfeed-sync--start-time)
|
||||||
(alist-get :ids-missing-tt-rss
|
(alist-get :ids-missing-tt-rss
|
||||||
elfeed-sync--state))))))
|
elfeed-sync--state))))))
|
||||||
ttrss-entries))
|
ttrss-entries)
|
||||||
|
all-missing))
|
||||||
|
|
||||||
(defun elfeed-sync--do-sync (entries bad-feeds)
|
(defun elfeed-sync--do-sync (entries bad-feeds)
|
||||||
(let ((ttrss-entries (make-hash-table :test #'equal))
|
(let ((ttrss-entries (make-hash-table :test #'equal))
|
||||||
|
|
@ -353,8 +356,9 @@ unmarked. ENTRY is an instance of `elfeed-entry'."
|
||||||
ttrss-entry ttrss-entries))
|
ttrss-entry ttrss-entries))
|
||||||
(with-elfeed-db-visit (entry feed)
|
(with-elfeed-db-visit (entry feed)
|
||||||
(cl-incf elfeed-total-entries)
|
(cl-incf elfeed-total-entries)
|
||||||
(if-let ((ttrss-entry (gethash (elfeed-sync--elfeed-key bad-feeds entry)
|
(if-let ((ttrss-entry
|
||||||
ttrss-entries)))
|
(gethash (elfeed-sync--elfeed-key bad-feeds entry (elfeed-feed-url feed))
|
||||||
|
ttrss-entries)))
|
||||||
(let* ((is-unread (elfeed-sync--entry-unread-p entry))
|
(let* ((is-unread (elfeed-sync--entry-unread-p entry))
|
||||||
(is-marked (elfeed-sync--entry-marked-p entry))
|
(is-marked (elfeed-sync--entry-marked-p entry))
|
||||||
(ttrss-id (alist-get 'id ttrss-entry))
|
(ttrss-id (alist-get 'id ttrss-entry))
|
||||||
|
|
@ -384,7 +388,8 @@ unmarked. ENTRY is an instance of `elfeed-entry'."
|
||||||
elfeed-sync-look-back)
|
elfeed-sync-look-back)
|
||||||
(elfeed-entry-date entry))
|
(elfeed-entry-date entry))
|
||||||
(elfeed-db-return)))
|
(elfeed-db-return)))
|
||||||
(elfeed-sync--update-ttrss-missing ttrss-entries ttrss-entries-processed)
|
(setq elfeed-sync--tt-rss-missed
|
||||||
|
(elfeed-sync--update-ttrss-missing ttrss-entries ttrss-entries-processed))
|
||||||
(setf (alist-get :last-sync-time elfeed-sync--state)
|
(setf (alist-get :last-sync-time elfeed-sync--state)
|
||||||
elfeed-sync--start-time)
|
elfeed-sync--start-time)
|
||||||
`((:ttrss-toggle-unread . ,ttrss-toggle-unread)
|
`((:ttrss-toggle-unread . ,ttrss-toggle-unread)
|
||||||
|
|
@ -399,7 +404,6 @@ unmarked. ENTRY is an instance of `elfeed-entry'."
|
||||||
(hash-table-count ttrss-entries-processed))))))
|
(hash-table-count ttrss-entries-processed))))))
|
||||||
|
|
||||||
(defun elfeed-sync--process-sync-data (sync-data)
|
(defun elfeed-sync--process-sync-data (sync-data)
|
||||||
(setq my/test4 sync-data)
|
|
||||||
(elfeed-log 'info "Total entries in %s: %s"
|
(elfeed-log 'info "Total entries in %s: %s"
|
||||||
(propertize "elfeed" 'face 'elfeed-log-info-level-face)
|
(propertize "elfeed" 'face 'elfeed-log-info-level-face)
|
||||||
(alist-get :elfeed-total-entries sync-data))
|
(alist-get :elfeed-total-entries sync-data))
|
||||||
|
|
@ -411,7 +415,7 @@ unmarked. ENTRY is an instance of `elfeed-entry'."
|
||||||
(alist-get :elfeed-toggle-unread-count sync-data))
|
(alist-get :elfeed-toggle-unread-count sync-data))
|
||||||
(elfeed-log 'info "Toggled marked in %s: %s"
|
(elfeed-log 'info "Toggled marked in %s: %s"
|
||||||
(propertize "elfeed" 'face 'elfeed-log-info-level-face)
|
(propertize "elfeed" 'face 'elfeed-log-info-level-face)
|
||||||
(alist-get :elfeed-toggle-unread-count sync-data))
|
(alist-get :elfeed-toggle-marked-count sync-data))
|
||||||
(elfeed-log 'info "Toggled unread in %s: %s"
|
(elfeed-log 'info "Toggled unread in %s: %s"
|
||||||
(propertize "tt-rss" 'face 'elfeed-log-warn-level-face)
|
(propertize "tt-rss" 'face 'elfeed-log-warn-level-face)
|
||||||
(length (alist-get :ttrss-toggle-unread sync-data)))
|
(length (alist-get :ttrss-toggle-unread sync-data)))
|
||||||
|
|
@ -432,13 +436,12 @@ unmarked. ENTRY is an instance of `elfeed-entry'."
|
||||||
(elfeed-sync--session
|
(elfeed-sync--session
|
||||||
(request (concat elfeed-sync-tt-rss-instance "/api/")
|
(request (concat elfeed-sync-tt-rss-instance "/api/")
|
||||||
:type "POST"
|
:type "POST"
|
||||||
:data (setq my/test3
|
:data (json-encode
|
||||||
(json-encode
|
`(("op" . "toggleEntries")
|
||||||
`(("op" . "toggleEntries")
|
("sid" . ,elfeed-sync--tt-rss-sid)
|
||||||
("sid" . ,elfeed-sync--tt-rss-sid)
|
("data" .
|
||||||
("data" .
|
(("toggle_unread" . ,(alist-get :ttrss-toggle-unread sync-data))
|
||||||
(("toggle_unread" . ,(alist-get :ttrss-toggle-unread sync-data))
|
("toggle_marked" . ,(alist-get :ttrss-toggle-marked sync-data))))))
|
||||||
("toggle_marked" . ,(alist-get :ttrss-toggle-marked sync-data)))))))
|
|
||||||
:headers '(("Content-Type" . "application/json"))
|
:headers '(("Content-Type" . "application/json"))
|
||||||
:parser 'elfeed-sync--json-read-safe
|
:parser 'elfeed-sync--json-read-safe
|
||||||
:success (elfeed-sync--handler
|
:success (elfeed-sync--handler
|
||||||
|
|
@ -496,14 +499,56 @@ unmarked. ENTRY is an instance of `elfeed-entry'."
|
||||||
(force-mode-line-update))
|
(force-mode-line-update))
|
||||||
(run-hooks 'elfeed-search-update-hook)))
|
(run-hooks 'elfeed-search-update-hook)))
|
||||||
|
|
||||||
|
(defun elfeed-sync-read-ttrss-missing ()
|
||||||
|
(interactive)
|
||||||
|
(when (y-or-n-p "This will read all the missing tt-rss entries. Are you sure? ")
|
||||||
|
(elfeed-sync--session
|
||||||
|
(request (concat elfeed-sync-tt-rss-instance "/api/")
|
||||||
|
:type "POST"
|
||||||
|
:data (json-encode
|
||||||
|
`(("op" . "toggleEntries")
|
||||||
|
("sid" . ,elfeed-sync--tt-rss-sid)
|
||||||
|
("data" .
|
||||||
|
(("toggle_unread"
|
||||||
|
. ,(cl-loop for ttrss-entry in elfeed-sync--tt-rss-missed
|
||||||
|
if (eq t (alist-get 'unread ttrss-entry))
|
||||||
|
collect (alist-get 'id ttrss-entry)))
|
||||||
|
("toggle_marked" . ())))))
|
||||||
|
:headers '(("Content-Type" . "application/json"))
|
||||||
|
:parser 'elfeed-sync--json-read-safe
|
||||||
|
:success (elfeed-sync--handler
|
||||||
|
(message "Success!"))
|
||||||
|
:error
|
||||||
|
(cl-function (lambda (&key error-thrown &allow-other-keys)
|
||||||
|
(message "Error: %S" error-thrown)))))))
|
||||||
|
|
||||||
|
(defun elfeed-sync-read-ttrss-old ()
|
||||||
|
(interactive)
|
||||||
|
(when (y-or-n-p "This will read all the old tt-rss entries. Are you sure? ")
|
||||||
|
(elfeed-sync--session
|
||||||
|
(request (concat elfeed-sync-tt-rss-instance "/api/")
|
||||||
|
:type "POST"
|
||||||
|
:data (json-encode
|
||||||
|
`(("op" . "readOldEntries")
|
||||||
|
("sid" . ,elfeed-sync--tt-rss-sid)
|
||||||
|
("data" .
|
||||||
|
(("look_back" . ,elfeed-sync-look-back)))))
|
||||||
|
:headers '(("Content-Type" . "application/json"))
|
||||||
|
:parser 'elfeed-sync--json-read-safe
|
||||||
|
:success (elfeed-sync--handler
|
||||||
|
(message "Success!"))
|
||||||
|
:error
|
||||||
|
(cl-function (lambda (&key error-thrown &allow-other-keys)
|
||||||
|
(message "Error: %S" error-thrown)))))))
|
||||||
|
|
||||||
;;;###autoload
|
;;;###autoload
|
||||||
(define-minor-mode elfeed-sync-mode
|
(define-minor-mode elfeed-sync-mode
|
||||||
"TODO"
|
"TODO"
|
||||||
:global t
|
:global t
|
||||||
(if elfeed-sync-mode
|
(if elfeed-sync-mode
|
||||||
(progn
|
(progn
|
||||||
(add-hook 'kill-emacs-hook #'elfeed-sync-state-save-safe))
|
(add-hook 'kill-emacs-hook #'elfeed-sync-state-save-safe))
|
||||||
(remove-hook 'kill-emacs-hook #'elfeed-sync-state-save-safe)))
|
(remove-hook 'kill-emacs-hook #'elfeed-sync-state-save-safe)))
|
||||||
|
|
||||||
|
|
||||||
(provide 'elfeed-sync)
|
(provide 'elfeed-sync)
|
||||||
|
|
|
||||||
14
init.php
14
init.php
|
|
@ -16,6 +16,7 @@ class Elfeed_Sync extends Plugin {
|
||||||
$this->host->add_api_method("setFeedsTree", $this);
|
$this->host->add_api_method("setFeedsTree", $this);
|
||||||
$this->host->add_api_method("getSyncEntries", $this);
|
$this->host->add_api_method("getSyncEntries", $this);
|
||||||
$this->host->add_api_method("toggleEntries", $this);
|
$this->host->add_api_method("toggleEntries", $this);
|
||||||
|
$this->host->add_api_method("readOldEntries", $this);
|
||||||
}
|
}
|
||||||
|
|
||||||
function createCategoriesTree($tree, $feed_categories = null, $current_cat = null) {
|
function createCategoriesTree($tree, $feed_categories = null, $current_cat = null) {
|
||||||
|
|
@ -188,4 +189,17 @@ class Elfeed_Sync extends Plugin {
|
||||||
|
|
||||||
return array(API::STATUS_OK, array());
|
return array(API::STATUS_OK, array());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function readOldEntries() {
|
||||||
|
$data = $_REQUEST["data"];
|
||||||
|
$date = date('Y-m-d H:i:s', time() - $data['look_back']);
|
||||||
|
$query=<<<EOD
|
||||||
|
UPDATE ttrss_user_entries t
|
||||||
|
SET unread = false
|
||||||
|
FROM ttrss_entries e
|
||||||
|
WHERE t.owner_uid = ? AND e.updated < ? AND t.ref_id = e.id
|
||||||
|
EOD;
|
||||||
|
ORM::raw_execute($query, array($_SESSION['uid'], $date));
|
||||||
|
return array(API::STATUS_OK, array());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue