返回首页
24小时热榜
我确实尽力了。我必须这样做,因为它有一个受“数字极简主义”启发的独特之处。
这个独特之处在于,它只允许你每天(或每X天)获取一次新文章。
为什么呢?让我来解释一下……
我希望我的互联网内容像一份无聊的报纸。你早上拿到它,边喝早咖啡边读完整份,然后就结束了!今天没有更多的新信息了。没有提示,没有警报,宁静、安静、禅意等等。
但为了实现这一点,我需要能够在一次操作中从我数百个源中获取所有文章。这就是Zig和curl优化发挥作用的地方。我尝试了所有的技巧。如果我遗漏了什么,请告诉我!
首先,我在网络层使用了curl multi。它的一个好处是自动进行HTTP/2复用,这意味着如果你的源托管在同一个CDN上,它会重用相同的连接。我将其配置为总共处理50个连接,每个主机最多6个,这似乎是在服务器开始变得可疑之前的最佳点。此外,还使用了条件GET。如果一个源自上次以来没有变化,服务器会直接返回“未修改”,我们立即退出。
在curl下载源的时候,我不想让CPU闲着,所以当curl完成下载一个源时,它会触发一个回调,立即将XML抛入一个工作线程池进行解析。主线程继续管理所有网络事务,而工作线程则并行处理XML。Zig的内存模型非常适合这个。每个源都有自己的ArenaAllocator,这基本上是一个可以在解析过程中分配字符串的游乐场,然后当我们完成时,我们只需一次性清除整个区域。
在解析方面,我使用了libexpat,因为它不会像DOM解析器那样将整个XML加载到内存中。这一点很重要,因为某些播客源的XML文件大小通常超过10MB。因此,通过智能截断,我们下载前几MB(可配置),向后扫描以找到最后一个完整的项目标签,然后在此处截断,只解析这一部分。即使在源的大小变得庞大时,也能保持内存使用的合理性。
至于用户界面,我只是将所有内容通过系统的“less”命令进行管道处理。你可以免费获得vim导航、搜索和分页功能。此外,我还使用了OSC 8超链接,因此你实际上可以点击链接在浏览器中打开它们。完全不需要TUI框架。我还添加了OPML导入/导出和源分组作为附加功能。
结果是:在几秒钟内从数百个RSS源中检索到内容,余下的时间则心安理得。
代码是开源的,采用MIT许可证。如果你有想法让它更快或更好,请在下面评论。功能请求和其他建议也欢迎在这里或GitHub上提出。
这太不真实了。我使用谷歌的 `genai` 发出的请求大多数都出现了 503 错误。有人也遇到同样的问题吗?