From 052550e0c084b573a6a6d5506220f6bdc8371a15 Mon Sep 17 00:00:00 2001 From: maogeigei Date: Thu, 3 Sep 2026 15:04:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E5=8F=B0=E8=B5=9B=E9=81=93?= =?UTF-8?q?=E7=AD=9B=E9=80=89=E7=99=BD=E5=90=8D=E5=8D=95=EF=BC=9A=E4=B8=89?= =?UTF-8?q?=E6=A6=9C=E5=8F=AA=E4=BF=9D=E7=95=99=E6=89=80=E9=9C=80=E8=B5=9B?= =?UTF-8?q?=E9=81=93=EF=BC=88=E5=90=AB=E3=80=8C=E5=85=A8=E9=83=A8=E3=80=8D?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dsh-data.js 新增 RANK_KEEP 白名单(生活记录/生活vlog/小剧场/亲子/美食/旅行,覆盖账号榜与作品榜两套赛道枚举) - collectCategories:赛道下拉=白名单∩实际出现,按白名单顺序(当期 0 条赛道不显示) - getRanking:hot/likes 条目无条件白名单过滤(选「全部」也只保留白名单条目),再按请求赛道过滤;week 不变 - 验证:week 250/5 赛道不变;hot 下拉 4 赛道全 29 条;likes 下拉 4 赛道全 28 条;服务 5500 运行 --- .workbuddy/memory/2026-09-03.md | 6 ++++ .../V1.0/mcn-work-shop/dsh-data.js | 36 +++++++++++++------ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/.workbuddy/memory/2026-09-03.md b/.workbuddy/memory/2026-09-03.md index fdd5a6a..59816b4 100644 --- a/.workbuddy/memory/2026-09-03.md +++ b/.workbuddy/memory/2026-09-03.md @@ -155,3 +155,9 @@ - **新落盘契约**:`抖音榜单/` 三子目录 `账号周榜/`(抖音周榜_{赛道}_{周一}×多期,douyin-top-account 落盘)、`视频热榜/`(抖音周榜_视频热榜_{周一}.json 全品类单文件/期)、`点赞榜/`(抖音周榜_点赞榜_{周一}.json);旧 28 赛道 56 文件归档 `_archive_旧28赛道结构_20260903/`;顶层 category="全部",赛道在 list[].category - **后端改造**:dsh-data.js RANK_SUB 子目录映射 + rankFilePath(dir,name) + parseRankFileIn/listRankFiles(子目录优先+根目录旧平铺回退)/collectCategories(week=文件名赛道;hot/likes=条目 category 并集)/getRanking 赛道过滤(week 文件名级、hot/likes 条目级);工作台实际读取桌面目录(源技能 __dirname 无 .dsh → 桌面 71→15+2 文件;D:/dshworkspace/抖音榜单 为空是 dsh 部署形态) - **验证**:node --check ✓;node 直调 week 250/3期/5赛道 + hot 50/12赛道 + likes 50/14赛道;筛亲子 hot=2/likes=3;服务重启(29172→3912)curl 三榜 API 全通;前端赛道下拉动态(meta.categories)无需改动 + +## 工作台赛道白名单过滤(09-03 15:05,用户要求「只留所需赛道」) +- **需求**:热点数据页赛道筛选下拉与列表(含「全部」)只保留所需赛道数据 +- **口径**:与账号周榜 douyin-top-account 保留 5 赛道一致;**账号榜 type=生活vlog / 作品榜条目 category=生活记录**(两套枚举),白名单取并集 RANK_KEEP=['生活记录','生活vlog','小剧场','亲子','美食','旅行'](dsh-data.js) +- **实现**:collectCategories 白名单∩实际出现(按 RANK_KEEP 顺序);getRanking hot/likes 条目无条件白名单过滤(「全部」也只留白名单)+ 请求赛道过滤;week 不受影响 +- **验证**(服务 5500):week 下拉 5 赛道/250 条不变;hot 下拉[生活记录,小剧场,亲子,美食]全部 29 条;likes 下拉[生活记录,小剧场,亲子,旅行]全部 28 条;当期 0 条赛道(hot 旅行/likes 美食)不进下拉 diff --git a/project/短视频脚本创作/V1.0/mcn-work-shop/dsh-data.js b/project/短视频脚本创作/V1.0/mcn-work-shop/dsh-data.js index 83e913d..904e4fd 100644 --- a/project/短视频脚本创作/V1.0/mcn-work-shop/dsh-data.js +++ b/project/短视频脚本创作/V1.0/mcn-work-shop/dsh-data.js @@ -343,6 +343,12 @@ const RANK_FILE_RE = { likes: /^抖音周榜_点赞榜_(\d{4}-\d{2}-\d{2})\.json$/, }; +// 工作台所需赛道白名单(09-03 定:与账号周榜 douyin-top-account 保留 5 赛道同口径) +// 口径差异:账号榜 type=「生活vlog」;作品榜条目 category=「生活记录」——并集同时放行。 +// 生效范围:hot/likes(全品类文件)赛道下拉与列表(含「全部」)只保留白名单条目;week 文件名赛道天然在白名单内。 +const RANK_KEEP = ['生活记录', '生活vlog', '小剧场', '亲子', '美食', '旅行']; +const RANK_KEEP_SET = new Set(RANK_KEEP); + function rankFilePath(dir, name) { return dir ? path.join(RANKING_DIR, dir, name) : path.join(RANKING_DIR, name); } @@ -373,17 +379,21 @@ function listRankFiles(board) { return out.sort((a, b) => b.date.localeCompare(a.date)); } -// week:文件名赛道;hot/likes:条目 category 并集(「全部」文件读 list 去重) +// 赛道下拉:白名单内且当期数据实际出现者,按 RANK_KEEP 顺序输出 +// week:文件名赛道;hot/likes:条目 category 并集 function collectCategories(board, files) { - if (board === 'week') return [...new Set(files.map((f) => f.category))]; - const set = new Set(); - for (const pf of files) { - try { - const d = JSON.parse(fs.readFileSync(rankFilePath(pf.dir, pf.name), 'utf8')); - for (const it of (d.list || [])) { const c = String(it.category || '').trim(); if (c) set.add(c); } - } catch (e) {} + const found = new Set(); + if (board === 'week') { + for (const f of files) found.add(f.category); + } else { + for (const pf of files) { + try { + const d = JSON.parse(fs.readFileSync(rankFilePath(pf.dir, pf.name), 'utf8')); + for (const it of (d.list || [])) { const c = String(it.category || '').trim(); if (c) found.add(c); } + } catch (e) {} + } } - return [...set].sort(); + return RANK_KEEP.filter((c) => found.has(c)); } function rankingMeta(board = 'week') { @@ -416,8 +426,12 @@ function getRanking({ board = 'week', date = '', category = '', sortBy = '', ord for (const pf of selFiles) { try { items = items.concat(JSON.parse(fs.readFileSync(rankFilePath(pf.dir, pf.name), 'utf8')).list || []); } catch (e) {} } - if (board !== 'week' && category && category !== '全部') { - items = items.filter((it) => String(it.category || '').trim() === category); + // 全品类单文件(hot/likes):①白名单过滤(含「全部」也只保留所需赛道条目)②按请求赛道条目过滤 + if (board !== 'week') { + items = items.filter((it) => RANK_KEEP_SET.has(String(it.category || '').trim())); + if (category && category !== '全部') { + items = items.filter((it) => String(it.category || '').trim() === category); + } } // 默认排序键随榜:week=综合得分 / hot=点赞 / likes=新增点赞(同分按排名升序) const DEF_KEY = board === 'week' ? 'comprehensiveScore' : board === 'hot' ? 'likeCount' : 'add_digg_count';