# web-tv **Repository Path**: chenss_2022/web-tv ## Basic Information - **Project Name**: web-tv - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-20 - **Last Updated**: 2026-08-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # WebTV 局域网版 TV Web 重实现,当前使用纯 JavaScript: - 前端:Vite + Vue 3 + Ant Design Vue + Pinia + Axios - 后端:Node.js(当前骨架使用原生 HTTP,后续业务接口可切换 Express) - Spider Worker:独立无界面 Android APK,负责执行受保护 DEX 和 drpy2 Spider - 默认前端地址:`http://localhost:5173` - 默认后端地址:`http://localhost:9978` ## 开发环境 需要 Node.js 18+。当前 `client` 已存在依赖;新环境首次安装时执行: ```powershell npm --prefix client install ``` 启动前后端: ```powershell npm run dev ``` 浏览器打开 `http://localhost:5173`。前端 `/api` 请求会由 Vite 转发到 `http://localhost:9978`。 如果 5173 已被占用,Vite 会自动选择 5174/5175 等端口,以终端输出的前端地址为准。必须从 `webtv` 根目录执行组合脚本,才能同时启动 Vite 和 Node 后端;只在 `client` 中执行普通 `vite` 不会启动后端。 ## 当前页面 首页按 Android TV 原版 Leanback 布局重做: - 壁纸风格背景 - 顶部标题、服务状态、时钟和日期 - 横向分类筛选胶囊 - 直播、搜索、收藏、推送、历史、设置快捷入口 - 最近观看空状态 - 更新推荐横向海报行 首页、分类、全站搜索、详情、线路、播放、收藏、历史和直播页面均已接入真实 API;未接入 Provider 的站点会显示明确的“暂未接入 Web Provider”,不会混入假数据。 ## 多站点搜索与播放 后端会并发搜索所有已注册且 `searchable !== 0` 的 Web Provider。每条结果都会携带自己的来源信息: ```json { "vodId": "站点自己的内容 ID", "siteKey": "立播", "siteName": "🌟立播┃不卡" } ``` 前端打开搜索结果时使用该条结果的 `siteKey + vodId` 请求详情;选择线路和集数后继续使用同一个 `siteKey` 请求播放地址。这与 Android 原版 `VodBrowse -> SiteApi` 的来源绑定逻辑一致,因此同一影片来自不同站点时,搜索结果会自然形成多个可选来源。 当前订阅共 50 个站点,其中 10 个已有真实 Web Provider:`立播`、`MTV`、`Bili`、`Biliych`、`少儿教育`、`小学课堂`、`初中课堂`、`高中教育`、`ZPan`、`JPan`。`csp_BiliGuard` 已覆盖 B 站类站点,`csp_S_zpsGuard` 已覆盖网盘搜索站点。ZPan/JPan 的详情结果会展示原站提供的网盘资源链接,不能直接当作影视直播放源。 其余站点大多是 Android `type: 3 / csp_*` Spider。Node.js 通过独立 Android Spider Worker 调用它们;Worker 未启动或模拟器 ABI 不兼容时,界面会明确显示不可用,不会伪造站点支持。配置中如果出现标准 HTTP JSON API(`type: 1` 或 `type: 4`),WebTV 仍自动使用通用 HTTP Provider。 ## Android Spider Worker ```powershell npm run worker:build npm run worker:install npm run worker:start ``` Worker 通过 ADB 转发到: ```powershell adb forward tcp:9981 tcp:9981 ``` Node 默认通过 `WEBTV_ANDROID_WORKER=http://127.0.0.1:9981` 调用 Worker。Worker 不修改、不依赖原 Android TV `app`,只复用 `catvod` 和 `quickjs` Library。 Worker 接口为 `POST /spider`,请求格式: ```json { "siteKey": "光影", "site": { "key": "光影", "api": "csp_T4Guard", "ext": "...", "jar": "..." }, "action": "search", "params": { "wd": "庆余年", "page": 1 } } ``` Node 和 Worker 返回 `{ "code": 0, "data": { ... } }`。当前 Web Provider 仍直接处理立播、B站类教育/MV站点以及 ZPan/JPan;Worker 启动后会接管订阅中实际加载成功的其他 Android `csp_*` 和 drpy2 站点。 验证 Worker: ```powershell Invoke-RestMethod http://127.0.0.1:9981/health Invoke-RestMethod http://127.0.0.1:9981/providers Invoke-RestMethod -Method Post -Uri http://127.0.0.1:9981/spider ` -ContentType 'application/json' ` -Body '{"siteKey":"光影","action":"search","params":{"wd":"庆余年","page":1}}' ``` 首页分类会自动保留一个虚拟“首页”入口,并按分类 ID/名称去重;搜索页按“全部 + 站点”分组,单站点独立分页,搜索结果继续携带来源站点用于详情和播放。 播放地址由后端 `/api/media/:token` 代理,转发 Range、Referer 和 User-Agent,避免浏览器直接请求第三方媒体时受到 CORS/防盗链影响。MP4 可直接使用 HTML5 播放;m3u8 会重写清单中的相对分片和 `URI=` 资源到媒体代理,前端播放器会优先使用原生 HLS,其他浏览器按需加载 HLS 播放器。 ## 健康检查 ```text GET http://localhost:9978/api/system/health ``` ## 配置读取 默认读取 `webtv/data/vod.json`,也可以使用 `WEBTV_VOD_CONFIG` 指定其他 JSON 文件。 ```text GET /api/config GET /api/sites PUT /api/config ``` 配置结构沿用 Android 版的 `VodConfig` 顶层字段,包括 `sites`、`parses`、`lives`、`notice` 和 `wallpaper`。 ## 构建 ```powershell npm run build npm run start ``` 前端构建产物输出到 `webtv/dist`。