MiniFlux Starred as Feed

MiniFlux Starred as Feed

Miniflux 是一个非常好用的 RSS 自托管方案,支持自建,支持多种客户端,支持多种订阅方式。 最近由于在折腾 Archivebox,需要将 Miniflux 中的 Starred Feed 作为一个 Feed 输出,以便于 导入星标条目到 Archivebox。 Miniflux 本身并不支持这个功能,但是其提供了 API,可以比较简单的导出 Starred 内容。

备选方案 #

如果是自己使用 Python 写的话,可以利用 https://github.com/miniflux/python-client 这个库,配合 feedgen 也能写个大概的,核心代码大概如下:

import miniflux
from feedgen.feed import FeedGenerator

client = miniflux.Client("https://miniflux.example.com", api_key="api_key")
entries = client.get_entries(starred=True, limit=50)

def create_rss_page(data):
    fg = FeedGenerator()
    fg.title('Miniflux Starred Feed')
    fg.link(href='https://miniflux.wogong.net', rel='self')
    fg.language('en')
    fg.description('Miniflux Starred Feed')

    for entry in data['entries']:
        fe = fg.add_entry()
        fe.id(entry['id'])
        fe.title(entry['title'])
        fe.link(href=entry['url'])
        fe.description('nothing')
        fe.author(name=entry['author'])
        fe.pubDate(entry['published_at'])

    rss_feed = fg.rss_str(pretty=True)
    fg.rss_file('rss.xml')
    return rss_feed

但是本着不自己造轮子的原则,找到了一些现成的工具,例如

  1. Small CLI which can be used to export all your miniflux RSS feeds into an OPML file and to export all starred/bookmarked entries https://github.com/rogierlommers/miniflux-exporter
  2. Atom feed exporter for Miniflux starred items https://github.com/erdnaxe/miniflux-luma

两个项目的 star 数都寥寥,miniflux 有这么小众么,第一个工具尝试了一下,导出 starred item 出问题了, 估计太久没维护,提交了一个 issue https://github.com/rogierlommers/miniflux-exporter/issues/8

第二个项目同样有问题,编译都没通过,我对 go 也是两眼抹黑,同样提交了 issue https://github.com/erdnaxe/miniflux-luma/issues/1

这个作者反应迅速,直接修复了,而且可以通过 web 方式提供 feed,决定就用他了。

Docker-compose 部署 #

当然可以选择直接用编译好的二进制文件,但是我还是喜欢用 docker-compose 来部署,方便管理。 这也不只是一个偏好问题,多维护一个独立的 Web 服务显然是不合理的,而且这个服务只是 Miniflux 的附属,所以要是能集成到 miniflux 的 docker-compose 中就好了。一番折腾,获得如下的 docker-compose.yaml 文件:

version: '3.4'
services:
  miniflux:
    image: miniflux/miniflux:latest
    ports:
      - "127.0.0.1:8080:8080"
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      - DEBUG=0
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=
      - ADMIN_PASSWORD=
  db:
    image: postgres:latest
    environment:
      - POSTGRES_USER=miniflux
      - POSTGRES_PASSWORD=
    volumes:
      - miniflux-db:/var/lib/postgresql/data
      - ./back:/back
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "miniflux"]
      interval: 10s
      start_period: 30s
  luma:
    build: miniflux-luma
    ports:
      - "127.0.0.1:8081:8080"
    command: -endpoint http://miniflux:8080 -listen-addr 0.0.0.0:8080
    volumes:
      - ./miniflux-luma/api_token:/api_token
volumes:
  miniflux-db:

miniflux-luma 官方并没有提供 Dockerfile,可参考我的仓库 https://github.com/wogong/miniflux-luma

之后无论是自己反代 8081 端口还是通过 Cloudflare Tunnel 反代,都可以方便的使用了。 和 miniflux 共同维护也比较方便,挂了一个另一个也没意义了反正。