sharoon7171/ployan-stream-resolver

GitHub: sharoon7171/ployan-stream-resolver

将 Ployan 嵌入页面 URL 解析为可直接播放的 HLS M3U8 流地址的自托管 Node.js 服务,提供 REST API 与简易 Web UI。

Stars: 0 | Forks: 0

# ployan-stream-resolver 自托管的 Node.js **HLS stream resolver**。粘贴一个 Ployan 嵌入页面 URL,通过本地 **REST API** 将其解析为直接的 **M3U8 master playlist**,解码 base64 格式的播放器 origin,构建 AES-256-GCM 会话 token,并在浏览器中播放。零 npm 运行时依赖。 ## stream resolver 的工作原理 - 获取嵌入页面 HTML,并从 `data-id` 属性或 URL slug 中提取 `mediaId` - 解码页面 JavaScript 中 base64 编码的 `plyURL` 常量,以发现播放器的 origin - 使用 PBKDF2 和 AES-256-GCM 从 `{mediaId}+{episode}+{server}+{timestamp}` 构建具有时效性的 token - 调用 `{origin}/get/{token}`,并将 `direct` 模式映射到 `{origin}/hls/{info}/master.m3u8` - 提供一个小型 Web UI,支持 Safari 原生 HLS 播放,以及其他浏览器的 M3U8 复制功能 ## 快速开始 ``` npm start ``` 打开 `http://127.0.0.1:8765`,粘贴一个 Ployan 嵌入页面 URL,点击 **Resolve**。 要求 Node.js 18+(原生 `fetch`)。默认在端口 `8765` 上作为本地 **HTTP server** 运行(可通过 `PORT` 环境变量覆盖)。 ## 架构 ``` flowchart LR Browser["Browser UI\npublic/"] Server["HTTP server\nsrc/server/"] Routes["API routes\nsrc/api/"] Embed["Embed parser\nsrc/embed/"] Ployan["Ployan client\nsrc/ployan/"] Upstream["Embed + player hosts"] Browser -->|"/api/stream"| Server Server --> Routes Routes -->|resolve| Embed Routes --> Ployan Embed --> Upstream Ployan --> Upstream ``` ### 解析流程 1. **解析页面** — `src/embed/parse.js` 获取嵌入 HTML,提取 `mediaId`,解码 `plyURL`,并读取页面标题 2. **封装 token** — `src/ployan/stream.js` 使用 PBKDF2-SHA256 和 AES-256-GCM 加密 `{mediaId}+{episode}+1+{unixTimestamp}` 3. **流查找** — 带有 player referer 的 `GET {origin}/get/{token}` 返回 `mode` 和一个不透明的 `info` 值 4. **M3U8 URL** — 当 `mode` 为 `direct` 时,HLS master playlist 为 `{origin}/hls/{info}/master.m3u8` 5. **响应** — 将包含 `title`、`url` 和 `mode` 的 JSON 返回给浏览器或 API 客户端 ## 项目结构 ``` src/ server/index.js HTTP entry, static files, CORS api/routes.js GET /api/health, GET /api/stream core/resolve.js parse → fetch orchestration embed/parse.js embed HTML extraction ployan/stream.js AES token builder and /get client lib/ config.js host, port, user-agent http.js upstream fetch helpers public/ index.html UI shell and styles app.js resolve, playback, copy ``` ## 流式 API ### `GET /api/stream` 将 Ployan 嵌入页面 URL 解析为直接的 HLS master playlist 链接。 | 参数 | 必填 | 描述 | | --- | --- | --- | | `url` | 是 | 完整的嵌入页面 URL | | `episode` | 否 | token payload 中的剧集编号(默认为 `1`) | **响应** ``` { "title": "Show Title", "url": "https://player.example/hls/abc123/master.m3u8", "mode": "direct" } ``` `url` 仅在 `/get` 返回 `mode: "direct"` 时才会设置。Resolver 错误将返回 HTTP `502` 及 `{ "error": "…" }`。 ### `GET /api/health` ``` { "ok": true } ``` ## 嵌入页面要求 嵌入页面必须暴露包含 base64 `plyURL` 常量的 Ployan 播放器脚本,并通过播放器元素上的 `data-id`(或 URL 路径中 `-{id}` 结尾的 slug)提供数字格式的 `mediaId`。运行此服务器的机器必须能够访问该嵌入站点和 player 主机。 ## 技术栈 - Node.js ES modules,零 npm 运行时依赖 - 原生 `fetch`、`node:http`、`node:crypto` - Web UI 中的 Safari 原生 HLS;其他浏览器可使用 VLC 或 Stremio
标签:AES-256-GCM, API, GNU通用公共许可证, HLS, MITM代理, Node.js, TCP SYN 扫描, Web UI, 流媒体解析, 网络测绘, 自定义脚本, 自托管