mirror of
https://github.com/jackwener/OpenCLI.git
synced 2026-09-14 18:25:42 +08:00
86f57c0846
* feat(reddit): 在 listing 命令上暴露 post_hint / url / preview / gallery 4 个媒体路由列 5 个 reddit listing 命令(popular / hot / frontpage / search / subreddit) 每行新增 4 列,下游消费者不用 scrape selftext 也能区分 image / gallery / hosted:video / link / self 五类内容: - `post_hint` — Reddit 自报的内容类型(image | hosted:video | link | self 等) - `url_overridden_by_dest` — 外链帖的原始 URL(image/link 类型才有) - `preview_image_url` — 缩略图地址(HTML-decoded,Reddit 即便 raw_json=1 也会在 preview URL 里返回 `&`) - `gallery_urls` — 多图相册数组(HTML-decoded) ## 实现 每个 adapter 的 evaluate 块内嵌两个 helper: - `decodeHtml(s)` — 6 个 HTML entity 替换(& / < / > / " / ' / ') - `extractRedditMedia(d)` — 从 post `data` 中抽 4 个字段,gallery_urls 从 `gallery_data.items[].media_id` × `media_metadata[id].s.u` 组合得到 helper 在每个 adapter 里 inline 复制(reddit 没有 shared 文件,模式跟现有 adapter 一致)。`clis/reddit/extract-media.test.js` 把 helper 行为锁在 8 个 fixture(plain / image / gallery / hosted-video / link / html-decode / 缺字段 / nullish input);每个 adapter 的 .test.js 额外 grep 自己源码里有 `function extractRedditMedia` 和 `...extractRedditMedia(c.data)` 两处接入痕迹,并断言 columns 数组形状。 frontpage 和 subreddit 之前 evaluate 返回原始 `children`、map 块按 `item.data.title` 索引;为了让 `gallery_urls` 这种数组字段能被 map 块的 模板字符串渲染,refactor 成和 popular/hot/search 一致的"evaluate 内部 就 map 成中间对象、map 块按 `item.title` 索引"模式。 ## 范围 只覆盖 5 个 listing 命令。**`read` 不在本 PR 内**:它的 evaluate 块在 post-#1651 时代已经是 error-kind-discriminated 的富结构(`kind: 'inaccessible'` / `kind: 'http'` / `kind: 'malformed'`),原始 commit 的"POST 行带 media、 comment 行空"模式和当前结构冲突太深,单独的 read 接入留作后续 PR。 完全 additive:既有字段名、顺序、值都不变;新字段加在每行末尾。 ## 验证 - `npx vitest run clis/reddit/ --project adapter` → 84/84 通过 - `node scripts/check-silent-column-drop.mjs` → current=97, baseline=97, new=0 - `npx tsc --noEmit` 干净 - `npm run build` 干净 * feat(reddit): expose home media route columns --------- Co-authored-by: huanghe <he.huang@extremevision.mo> Co-authored-by: jackwener <jakevingoo@gmail.com>