UP | HOME

▼ 本文更新于 [2025-05-19 周一 11:06]

emacs-org-mode中同步bangumi的收看进度

[2025-02-16 周日 01:00]

(部分)同步Bangumi的观看进度。

完全同步内容:某一条目的观看情况(在看、看过、抛弃)。

部分同步内容:某一条目章节的观看情况,只能增不能减。

1. 基础配置

需要安装 plz 包以处理HTTP请求。
后面的具体配置细则请直接复制粘贴即可

1.1. bangumi与org-mode

根据org-mode统计进度更新bangumi进度的小函数

;; 在这里 https://next.bgm.tv/demo/access-token 申请token,然后取消下一行的注释并填入你的TOKEN
;; (setq my/bgm-token "YOUR-BANGUMI-ACCESS-TOKEN")
(require 'bangumi)

;; (defun my/bgm--update-episodes()
;;   "更新章节,放在checkbox变化的hook里"
;;   (interactive)
;;   ;; 仅在有BGM property和有TODO-keywords的时候触发
;;   (when (and (org-entry-get nil "BGM") (nth 2 (org-heading-components)))
;;     (let* ((heading (nth 4 (org-heading-components)))
;;            (readed (when (string-match "\\[\\([0-9]+\\)/" heading) (string-to-number (match-string 1 heading))))
;;            (subject (org-entry-get nil "BGM")))
;;       (my/bgm-mark-read-episodes subject readed))))

(setq my/bgm-plz-proxy '("--proxy" "http://127.0.0.1:7890"))
;; 在TODO关键字变化时触发更新subject
(add-hook 'org-after-todo-state-change-hook #'my/bgm-update-subject)
;; 在checkbox统计数字变化时触发更新episode
(add-hook 'org-checkbox-statistics-hook #'my/bgm-async-update-episodes)

;; (defun my/get-heading-content ()
;;   """
;; 获取光标所在标题下的文本内容,不包含抽屉。
;; """
;;   (interactive)
;;   (let* ((element (org-element-at-point))
;;          (contents-begin (org-element-property :contents-begin element))
;;          (contents-end (org-element-property :contents-end element)))
;;     (if (and contents-begin contents-end)
;;         (buffer-substring-no-properties
;;          contents-begin
;;          (save-excursion
;;            (goto-char contents-begin)
;;            (if (re-search-forward "^\\*+ " contents-end t)
;;                (match-beginning 0)  ; 找到子 heading 就截断
;;              contents-end)))  ; 否则返回整个内容
;;       "")))

2. 使用方法

首先是创建一个不含TODO关键字的heading,然后按 C-c C-x p 为其输入 BGM 的属性,具体值为Bangumi网站上的对应值(如该条目的页面网址为 https://bgm.tv/subject/454684 ,则应输入 454684。

\*** AveMujica
:PROPERTIES:
:BGM:      454684
:END:

然后变更其TODO状态,如果变成TODO,则Bangumi网站上会同步变为在看;变到DONE,则同步变为看过;变到XXXX,则同步变为抛弃。

\*** TODO AveMujica
:PROPERTIES:
:BGM:      454684
:END:

最后,为其添加checkbox以及checkbox的统计。

\*** AveMujica[0/12]
:PROPERTIES:
:BGM:      454684
:END:
1. [ ]
2. [ ] 
3. [ ] 
4. [ ] 
5. [ ] 
6. [ ] 
7. [ ] 
8. [ ] 
9. [ ] 
10. [ ] 
11. [ ] 
12. [ ] 

当你调整一个checkbox之后,进度统计变成 [N/12] ,则会将Bangumi网站上前 N 章的观看进度设置为已看。

3. 注意事项

注意,这里我偷了一个懒,观看进度是根据 [0/12] 的前面数字判断的。如果你跳跃式观看,比如只看了第2、3、4集,checkbox统计数据会变成 [3/12] ,则以上代码依然会自动标记前3集为已读。

所以说是(部分)同步,实际上只有TODO关键词可以完全同步,观看进度只能增不能减(心虚)。

© Published by Emacs 31.0.50 (Org mode 9.8-pre) | RSS 评论