EAF的rss阅读器插件

我参与了这次中科院软件研究所的暑期活动,任务是帮助EAF社区完成一个基于EAF的rss-reader,现在阅读器的主体部分已经完成了!

链接:GitHub - emacs-eaf/eaf-rss-reader: RSS Reader in Emacs

eaf-rss-reader是基于eaf的,所以在使用前当然要先安装eaf啦。

rss-reader1

rss-reader2

主要功能

  • 以列表形式呈现feeds和feed内的文章,查阅文章的preview
  • 通过eaf的browser来访问文章原页面
  • 添加新的feed
  • 删除一个feed
  • 刷新feed(可以手动或者设置时间间隔后台自动刷新)
  • 标记文章为已读/未读
  • 根据文章的阅读状态来显示文章列表

其中添加和刷新功能使用了QThread,是多线程的,不会在抓取数据的时候使图形界面卡住。

按键

Key Event 功能
A add_feed 添加feed
* add_feed 添加feed
R remove_feed 删除feed
x remove_feed 删除feed
r alter_read_status 改变文章阅读状态
u alter_read_status 改变文章阅读状态
g handle_refresh_rsshub_list 手动刷新
b js_goback 返回上一项目
v js_view_original_page 查看原页面
o js_view_original_page 查看原页面
k js_select_prev_item 选择上一个项目
j js_select_next_item 选择下一个项目
C-k js_open_current_item 打开当前项目
C-j js_up_item 返回上一目录
h js_up_item 返回上一目录
l js_open_current_item 打开当前项目
i js_open_current_item 打开当前项目
<down> js_select_next_item 选择下一个项目
<up> js_select_prev_file 选择上一个项目
<right> js_open_current_item 打开当前项目
<left> js_up_item 返回上一目录
C-m js_open_current_item 打开当前项目
C-n js_select_next_item 选择下一个项目
C-p js_select_prev_item 选择上一个项目
< select_prev_view_key 上一个呈现状态
> select_next_view_key 下一个呈现状态
F select_prev_view_key 上一个呈现状态
H select_next_view_key 下一个呈现状态

后续计划

因为这个项目是我在7~9月的三个月内一边学习vue.js、PyQt、eaf现有代码等内容的同时一边写的,还有很多欠缺的功能。我会在后面空闲的时间里面继续完成这些功能,当然大家也可以提出需要的功能。这里先简单列举一些:

  • 当前只支持Linux,win/mac平台我还没有调试过
  • 将各种设置使用一个统一的文件来写,现在是直接将配色、刷新间隔等设置直接写在python和js的代码里面了
  • 文章的preview存在排版问题,无法显示图片等
  • 对feeds列表和feed内的文章列表应该还需要更多操作,比如排序功能
  • 搜索关键字

最后十分感谢 @MatthewZMD@manateelazycat 对我这个项目的帮助和支持!

16 个赞

厉害,可以考虑把项目移动到emacs-eaf仓库,我们共同维护,我帮你顺便美化一下UI。

同时,可以考虑三列设计:

  1. 第一列只显示feed标题
  2. 第二列显示文章列表
  3. 第三列就显示当前网页

feed summary可以放到第二列顶部,节省空间。

1 个赞

优化了UI, 直接复用EAF的浏览器。

@scheng 再把下面功能改改就很好用了:

  1. 第一列默认差一个信息:未读数量
  2. 第二列选中即表示 “已读”,避免用户手动标记 “已读”,类似gmail
  3. 第二列“已读”的帖子是灰色,“未读”的帖子用颜色标记
2 个赞

现在阅读器已经迁移到emacs-eaf啦。 链接:GitHub - emacs-eaf/eaf-rss-reader: RSS Reader in Emacs

@manateelazycat 的帮助下,现在有了更好的排版和UI,更新了eaf-browser的调用方法,能更加流畅地显示原页面并且也不存在文章排版的问题了。

今天我重构了选择feed和文章的代码,现在能用一种更便捷的操作方法选择文章了。并且会在选择文章的同时直接标记为已读,不再需要手动标记了。

有考虑支持elfeed-org么,通过一个org 文件配置所有的feed,之前的200多feed就不用手动添加了,可以无缝从elfeed 到 eaf-rss-reader

我觉得这个看上去很棒,有空的时候我会考虑实现的。

1 个赞

RSS阅读器可以像 vimium 那样操作看新闻了。

2 个赞

有考虑给rss-reader 加上 dark 模式么,我现在浏览器是黑的,rss reader 是白的,看起来就有点违和hhh

那个是已知任务,等一段时间就支持了

Key Event
A add_feed
R remove_feed
g refresh_feed
n js_select_next_feed
p js_select_prev_feed
j js_select_next_article
k js_select_prev_article
m js_mark_article_as_read
M js_mark_feed_as_read
N js_select_last_feed
P js_select_first_feed
J js_select_last_article
K js_select_first_article
x eaf-rss-reader-close-web-page
, eaf-rss-reader-scroll-up-web-page
. eaf-rss-reader-scroll-down-web-page
r eaf-rss-reader-refresh-web-page
u jump_to_unread
C-j jump_to_unread
f open_link
<f12> open_devtools

RSS阅读器最新更新了很多功能,操作已经非常实用了,现在已经用它完全替代 elfeed 了。

4 个赞

mf 都没法打开文章页面,同时eaf buffer 报这个错

Uncaught TypeError: Cannot read property 'feed_article_list' of undefined
TypeError: Cannot read property 'feed_article_list' of undefined

可以描述地再详细一些吗?或者试一试更新到最新?

系统是 manjaro,emacs 是 emacs-native-comp-git 29.0.5

就是最新的呀,每次更新都是经过

git pull
./install-eaf.py --install  rss-reader

按f 和 m 都无法打开最右边的文章页面

刚把整个eaf 删掉,重新 clone 安装,然后就没有问题了 :joy:

原来是这样吗 :joy:

git pull
./install-eaf.py --install  rss-reader

会不会是因为没有顺便更新eaf呢?因为rss-reader还有基于eaf的浏览器的。

我用的完整的更新命令是这样的,所以应该不是没更新eaf

git pull
./install-eaf.py --install js-video-player org-previewer image-viewer file-sender file-browser airshare browser pdf-viewer video-player mindmap markdown-previewer file-manager camera terminal rss-reader

应该是有bug,我已经推送了几个补丁修复了。

现在已经能够使rss-reader的主题跟随emacs主题啦!

1 个赞

我调整了一下选中的颜色,基于背景色而不是反色,避免我这种绿色前景色主题反色后太扎眼。

1 个赞

现在导入opml时,如果title 里面包含特殊字符,会报

lxml.etree.XMLSyntaxError: xmlParseEntityRef: no name

比如

        <outline title="Code, Design & Things in between" xmlUrl="https://rss.lilydjwg.me/zhihuzhuanlan/evanyou"/>

另外还会报

Traceback (most recent call last):
  File "/home/liuyan/bin/eaf/app/rss-reader/buffer.py", line 575, in run
    new_rss = self.get_rss_result(feed, index)
  File "/home/liuyan/bin/eaf/app/rss-reader/buffer.py", line 569, in get_rss_result
    return RssFeedParser(link, index).feed_info
  File "/home/liuyan/bin/eaf/app/rss-reader/buffer.py", line 403, in __init__
    self.d = feedparser.parse(self.feed)
  File "/usr/lib/python3.9/site-packages/feedparser/api.py", line 214, in parse
    data = _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers, request_headers, result)
  File "/usr/lib/python3.9/site-packages/feedparser/api.py", line 114, in _open_resource
    return http.get(url_file_stream_or_string, etag, modified, agent, referrer, handlers, request_headers, result)
  File "/usr/lib/python3.9/site-packages/feedparser/http.py", line 158, in get
    f = opener.open(request)
  File "/usr/lib/python3.9/urllib/request.py", line 517, in open
    response = self._open(req, data)
  File "/usr/lib/python3.9/urllib/request.py", line 534, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "/usr/lib/python3.9/urllib/request.py", line 494, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.9/urllib/request.py", line 1389, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
  File "/usr/lib/python3.9/urllib/request.py", line 1349, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [Errno -2] Name or service not known>