从零开始-文件资源管理器-27-BT RSS 订阅管理

114 阅读1分钟

开发

思路

使用 Map 对象管理 rss 订阅列表。自带基础的 get、set、delete 方法。

当添加一条订阅列表时,使用 uuid 作为 Map 的 key,value 为下面 Object 结构

type RSSItemType = {
  key: string
  name: string
  status: 'normal' | 'deactivate'
  update_interval: number
  rss_link: string
  type: 'default'
  include: string
  exclude: string
  download_categories: string
  download_items?: string[]
}

当每次 set、delete 时将 Map 转换为 json 字符串写入文件。

rss 链接内容使用的 rss-parser 解析

增删改查

// ....
import { v4 } from 'uuid'
import Parser from 'rss-parser'
// ....

const getRSSJson = () => {
  if (!fs.existsSync(config_path)) {
    fs.mkdirSync(path.dirname(config_path), { recursive: true })
    fs.writeFileSync(config_path, '{}', 'utf-8')

    return {}
  }

  return JSON.parse(fs.readFileSync(config_path, 'utf-8'))
}

const getRSSMap = () => {
  return new Map(Object.entries(getRSSJson()))
}

const writeConfig = (rssMAP) => {
  fs.writeFile(config_path, JSON.stringify(Object.fromEntries(rssMAP), null, 2), 'utf-8', () => {})
}

export const setRSS = (key, value) => {
  const rssMAP = getRSSMap()
  const rss_info = rssMAP.get(key) || def_rss_item

  if (!rss_info.key) {
    rss_info.key = v4()
  }

  for (let key in value) {
    rss_info[key] = value[key]
  }

  rssMAP.set(rss_info.key, rss_info)

  writeConfig(rssMAP)

  return value
}

export const deleteRSS = (key) => {
  const rssMAP = getRSSMap()
  const status = rssMAP.delete(key)

  writeConfig(rssMAP)

  return status
}

export const getRSS = (key) => {
  const rssMAP = getRSSMap()
  return rssMAP.get(key)
}

export const getRSSLinkDetail = async (key) => {
  const parser = new Parser()

  const { rss_link } = getRSS(key)

  const detail = await parser.parseURL(rss_link)

  return detail.items.map(({ title, link, pubDate, enclosure }) => {
    return { title, link, pubDate, enclosure: { ...enclosure } }
  })
}

//.....

页面呈现

这个就使用 antd 的 List 组件。并按数据条件进行额外呈现

效果

列表 截屏2024-05-13 10.12.19.png

添加、编辑 截屏2024-05-13 10.12.40.png

git-repo

yangWs29/share-explorer