From 49c37b372f621d27f8fedc4b1323a5fb0fe511bd Mon Sep 17 00:00:00 2001 From: kuekhaoyang Date: Wed, 21 Jan 2026 19:13:21 +0800 Subject: [PATCH] feat: Update Next.js to 16.1.4, bump project version to 4.0.0, refine DesktopMoreMenu UI, and remove AD_FILTER_GUIDE.md. --- AD_FILTER_GUIDE.md | 118 ------------------ components/player/desktop/DesktopMoreMenu.tsx | 14 +-- package-lock.json | 100 +++++++-------- package.json | 6 +- 4 files changed, 60 insertions(+), 178 deletions(-) delete mode 100644 AD_FILTER_GUIDE.md diff --git a/AD_FILTER_GUIDE.md b/AD_FILTER_GUIDE.md deleted file mode 100644 index cd264a5..0000000 --- a/AD_FILTER_GUIDE.md +++ /dev/null @@ -1,118 +0,0 @@ -# 🛡️ 广告过滤功能使用指南 - -KVideo 新增了强大的 M3U8 广告过滤系统,支持多种过滤模式,可有效去除视频中插入的切片广告。 - -## ✨ 功能特性 - -- **多模式选择**:支持关闭、关键词过滤、智能启发式过滤(Beta)和激进模式。 -- **UI 集成**:在播放器设置菜单中直接切换模式,实时生效。 -- **自定义关键词**:支持通过环境变量扩展过滤关键词。 -- **高性能**:基于流式处理,对播放加载速度几乎无影响。 - -## 🎮 使用说明 - -1. 打开任意视频播放。 - -2. 点击播放器左上角的 **(···)** 按钮。 - -3. 在 **广告过滤** 下拉菜单中选择模式: - - **关闭**:不过滤任何内容(默认)。 - - **关键词**:仅过滤 URL 中包含特定广告关键词(如 `adjump`, `pre-roll`)的片段。安全稳定,误杀率极低。 - - **智能(Beta)**:推荐使用。结合关键词、文件名特征、时间戳跳变标记 (DISCONTINUITY) 和 HLS 标签进行综合评分。能识别大多数无明显关键词的广告。 - - **激进**:降低判定阈值,过滤更多疑似广告,但可能会误伤正片。仅在智能模式无效时尝试。 - - > ⚠️重要提示:添加关键词时,请勿使用类似`ad` `ads` `video` `20260118` 这类简短相对通用的词汇,会造成误杀率极高。 - ---- - -## 🛠️ 部署配置指南 - -你可以通过环境变量 `NEXT_PUBLIC_AD_KEYWORDS` 自定义额外的广告关键词。 - -### 1. 本地开发 (Local Development) - -在项目根目录的 `.env.local` 文件中添加。支持多行格式(推荐使用引号包裹): - -```env -# 单行模式 -NEXT_PUBLIC_AD_KEYWORDS=spam,promo,intro-ad - -# 多行模式 (更清晰) -NEXT_PUBLIC_AD_KEYWORDS=" -spam -promo -intro-ad -/unwanted-segment/ -" -``` - -### 2. Docker 部署 (运行时热加载) - -我们支持三种方式注入关键词,优先级从高到低: - -1. **文件加载 (推荐)**:通过挂载文件并在运行时读取。 -2. **运行时环境变量**:直接通过 `-e` 传入 `AD_KEYWORDS`。 -3. **构建时环境变量**:构建镜像时打入的 `NEXT_PUBLIC_AD_KEYWORDS`。 - -#### 方案 A:挂载配置文件 (支持运行时修改) - -创建一个关键词文件 `ad_keywords.txt`: -```text -spam -promo -/ad-segment/ -intro -``` - -运行 Docker 时挂载该文件并设置 `AD_KEYWORDS_FILE` 环境变量: - -```bash -docker run -d -p 3000:3000 \ - -v $(pwd)/ad_keywords.txt:/app/ad_keywords.txt \ - -e AD_KEYWORDS_FILE=/app/ad_keywords.txt \ - --name kvideo kuekhaoyang/kvideo:latest -``` -*注:修改宿主机文件后重启容器即可生效,无需重新构建镜像。* - -#### 方案 B:直接注入环境变量 - -```bash -docker run -d -p 3000:3000 \ - -e AD_KEYWORDS="spam,promo,intro-ad" \ - --name kvideo kuekhaoyang/kvideo:latest -``` - -### 3. Vercel 部署 - -1. 进入 Vercel 项目 Dashboard。 -2. 点击 **Settings** -> **Environment Variables**。 -3. 添加新变量: - - **Key**: `NEXT_PUBLIC_AD_KEYWORDS` - - **Value**: `spam,promo,intro-ad` -4. 重新部署项目以生效。 - -### 4. Cloudflare Pages 部署 - -1. 进入 Cloudflare Pages 项目 Dashboard。 -2. 点击 **Settings** -> **Environment variables**。 -3. 添加变量: - - **Variable name**: `NEXT_PUBLIC_AD_KEYWORDS` - - **Value**: `spam,promo,intro-ad` -4. 重新部署项目 (Retry deployment) 以生效。 - ---- - -## 🔍 技术实现细节 - -广告检测逻辑位于 `lib/utils/m3u8-ad-detector.ts`,采用分块评分机制: - -1. **Block 解析**:将 M3U8 播放列表按 `#EXT-X-DISCONTINUITY` 分割成多个块。 -2. **特征学习**:分析最长的块(通常是正片)提取特征,如文件命名模式、路径前缀等。 -3. **评分系统**: - - **HLS 标签**:`#EXT-X-CUE-OUT`/`IN` (+10分,确认为广告) - - **路径前缀**:与正片路径不一致 (+5分,高度疑似) - - **关键词**:URL 包含已知广告词 (+2.5分) - - **文件名模式**:与正片命名规则不符 (+1.5分) -4. **决策过滤**: - - **智能模式**:移除评分 >= 5.0 的块。 - - **激进模式**:移除评分 >= 3.0 的块。 diff --git a/components/player/desktop/DesktopMoreMenu.tsx b/components/player/desktop/DesktopMoreMenu.tsx index f7ac66b..fd41499 100644 --- a/components/player/desktop/DesktopMoreMenu.tsx +++ b/components/player/desktop/DesktopMoreMenu.tsx @@ -83,7 +83,7 @@ export function DesktopMoreMenu({ const MenuContent = (
{/* Show Mode Indicator Switch */} -
+
显示模式指示器 @@ -144,7 +144,7 @@ export function DesktopMoreMenu({
{/* Ad Filter Mode Selector */} -
+
广告过滤 @@ -153,16 +153,16 @@ export function DesktopMoreMenu({
{isAdFilterOpen && ( <>
setAdFilterOpen(false)} /> -
+
{Object.entries(AD_FILTER_LABELS).map(([mode, label]) => (