Streambed IPC通道参考:所有主进程通信事件与参数速查表
【免费下载链接】streambertA cross-platform Electron Desktop App to stream and download any Movie, TV Series or Anime in the World. Zero Ads and Tracking项目地址: https://gitcode.com/GitHub_Trending/st/streambert
Streambert是一款跨平台 Electron 桌面应用,可流媒体播放和下载全球电影、剧集与动漫,主打零广告、零追踪。它的功能之所以丰富,核心在于渲染进程与主进程之间大量经过精心设计的IPC 通道(Inter-Process Communication)。本文整理出 Streambert IPC 通道参考:按功能分组列出所有主进程通信事件、触发方向与参数速查表,帮助新手和普通用户快速理解每个通道"谁调用谁、传什么参数、返回什么结果"。
先看架构:IPC 是怎么组织的
Streambert 的进程通信集中在两个入口文件:
| 文件 | 作用 |
|---|---|
| preload.js | 通过contextBridge向页面暴露安全的window.electronAPI,是渲染进程唯一能摸到主进程的"大门" |
| index.js | 主进程入口:创建窗口、配置会话、广告拦截,并在 src/ipc/ 各模块上注册全部ipcMain.handle通道 |
各功能模块的处理器源码分布:
- 下载管理:src/ipc/downloads.js
- 播放器与窗口控制:src/ipc/player.js
- 字幕搜索与下载:src/ipc/subtitles.js
- 加密密钥存储与定时备份:src/ipc/storage.js
- 动漫剧集解析(AllManga):src/ipc/allmanga.js
- 拦截统计:src/ipc/blockStats.js
- Discord 富状态:src/ipc/discordRpc.js
每个通道都遵循同一套命名约定:invoke系列(请求-响应)由渲染进程主动调用;on/off系列(主进程推送)用于主进程主动通知渲染进程,如onDownloadProgress/offDownloadProgress。
媒体捕获通道:m3u8 与字幕流自动嗅探
这是 Streambert 最"魔法"的部分。主进程在 index.js#L140-L186 通过webRequest拦截网络请求,一旦嗅探到媒体流就推送给渲染进程:
| 通道 | 方向 | 参数 | 说明 |
|---|---|---|---|
m3u8-found | 主 → 渲染 | url(字符串) | 捕获到 m3u8 播放地址,供播放器接管或下载 |
subtitle-found | 主 → 渲染 | { url, lang } | 捕获到 .vtt/.srt 字幕,lang从 URL 解析 |
渲染进程通过 preload.js#L4-L18 的onM3u8Found(cb)/onSubtitleFound(cb)订阅,用完调用对应的off方法解绑。
下载管理通道速查表
下载是 Streambed 使用频率最高的 IPC 场景,全部通道注册在 src/ipc/downloads.js:
| 通道 | 参数 | 返回值 | 说明 |
|---|---|---|---|
check-downloader | folder(下载器目录) | { exists, reason }或{ exists, token } | 校验下载器二进制是否存在;有效时签发一次性 token,真实路径永不离开主进程 |
run-download | { token, m3u8Url, name, downloadPath, mediaId, mediaType, season, episode, posterPath, tmdbId, subtitles } | 启动结果 | 启动下载子进程,token 换取受信任的二进制路径 |
download-progress | { id, progress, speed, size, ... } | —(主 → 渲染推送) | 解析下载器/ffmpeg 输出后实时推送进度 |
get-downloads | 无 | 下载列表 | 读取全部下载记录 |
delete-download | { id, filePath } | 删除结果 | 删除单条下载及文件 |
delete-all-downloads | 无 | 清理结果 | 一键清空全部下载 |
get-downloads-size | 无 | 占用字节数 | 统计下载目录体积 |
show-in-folder | path | — | 在资源管理器/访达中定位文件 |
file-exists | path | 布尔 | 判断文件是否存在 |
scan-directory | path | 文件列表 | 扫描目录生成媒体库 |
一个值得新手学习的细节:check-downloader返回的不是路径而是token(见 downloads.js#L211-L216),真实路径只保存在主进程内存的trustedBinaryPaths中,从架构上杜绝了渲染进程伪造任意路径执行命令。
字幕通道:从搜索到随文件下发
字幕相关通道注册在 src/ipc/subtitles.js,渲染进程入口见 preload.js#L114-L120:
| 通道 | 参数 | 说明 |
|---|---|---|
search-subtitles | { tmdbId, mediaType, season, episode, languages, subdlApiKey, wyzieApiKey } | 并行查询 SubDL 与 Wyzie 两个字幕源 |
get-subtitle-url | { fileId } | 生成字幕直链 |
download-subtitles-for-file | { downloadId, ... } | 为某条下载记录批量下载字幕 |
delete-subtitle-file | { downloadId, subtitlePath } | 删除已下载的字幕文件 |
prune-subtitle-paths | { downloadId } | 清理失效的字幕路径引用 |
字幕搜索走主进程fetch,天然绕过浏览器 CORS 与反爬限制——这也是 Streambert 把网络请求尽量放在主进程的原因。
动漫剧集解析通道:主进程代劳的 HTTP 请求
动漫(AllManga)解析是典型的"渲染进程搞不定、必须主进程代劳"的场景:
| 通道 | 参数 | 说明 |
|---|---|---|
resolve-allmanga | { title, seasonNumber, episodeNumber, isMovie, translationType } | 解析出可直接播放的视频地址,内置分季映射表与硬编码 showId |
set-player-video | { url, referer, startTime } | 返回{ playerUrl },主进程启动本地代理服务器中转视频流 |
debug-allmanga | args | 输出解析调试信息,便于排查 |
源码见 src/ipc/allmanga.js#L769-L776,其中set-player-video会在本机 127.0.0.1 上拉起一个代理服务器,用来携带正确的 Referer 头绕过源站校验。
窗口控制与系统交互通道
Streambert 在 Windows 上使用自定义标题栏(src/components/WindowTitlebar.jsx),因此窗口操作也要走 IPC:
| 通道 | 参数 | 说明 |
|---|---|---|
window-minimize/window-toggle-maximize/window-close | 无 | 最小化 / 切换最大化 / 关闭 |
window-is-maximized | 无 | 查询当前最大化状态 |
window-maximized | boolean | 主 → 渲染推送,状态变化时更新标题栏图标 |
get-platform | 无 | 返回process.platform,前端据此适配 UI |
open-external | url | 用系统浏览器打开外部链接 |
open-path | filePath | 用系统默认程序打开文件 |
open-path-at-time | { filePath, seconds, subtitlePaths } | 用 VLC/mpv 从指定秒数续播,附带字幕文件(路径会做白名单校验) |
pick-folder | 无 | 弹出原生文件夹选择框 |
get-install-path | 无 | 返回应用安装位置 |
get-video-duration | filePath | 调用 ffprobe 获取视频时长 |
quit-app | 无 | 请求退出应用 |
show-notification | { title, body, silent } | 触发系统原生通知 |
confirm-close | { count } | 主 → 渲染推送:有 N 个下载进行时请求关闭确认 |
close-response | confirmed | 渲染 → 主回复:确认后杀掉全部下载进程并退出 |
confirm-close/close-response构成一个漂亮的"双向协商"案例,完整实现见 index.js#L288-L307。
播放器清理与存储维护通道
| 通道 | 参数 | 说明 |
|---|---|---|
player-stopped | 无(send单向) | 播放页卸载时通知主进程:销毁播放器 webview、清空缓存并触发 GC,是 Streambert 低内存占用的关键 |
query-video-progress | webContentsId | 主进程递归遍历所有嵌套 iframe 查询播放进度,突破跨域同源限制(见 player.js#L649-L693) |
get-cache-size/get-downloads-size | 无 | 分别查询缓存与下载占用 |
clear-app-cache/clear-watch-data/reset-app | 无 | 分级清理:仅缓存 → 观看记录 → 全量重置 |
webview-enter-fullscreen/webview-leave-fullscreen | 无 | 主 → 渲染推送,播放器 webview 进入/退出全屏时同步 UI |
player-stopped的三步清理逻辑(销毁 WebContents → 冲刷 HTTP/着色器缓存 → 主渲染双端 GC)写在 index.js#L335-L367。
画中画(Pop-out)弹出窗口通道
Streambert 支持把正在播放的流媒体弹到独立小窗(始终置顶),相关通道注册在 index.js#L386-L488:
| 通道 | 参数 | 说明 |
|---|---|---|
open-pip-window | { url, title } | 创建 640×360 置顶窗口加载指定 URL;已有窗口则复用并跳转 |
close-pip-window | 无 | 关闭弹出窗口 |
get-pip-webcontents-id | 无 | 返回弹出窗口的 webContents id,供进度查询使用 |
pip-window-opened/pip-window-closed | 无 | 主 → 渲染推送,主窗口据此暂停/恢复自己的播放 |
popout-window-minimize等 4 个 | 无 | 弹出窗口自定义标题栏的按钮通道,由 popout-preload.js 桥接 |
安全存储、Wyzie 兑换与定时备份通道
| 通道 | 参数 | 说明 |
|---|---|---|
secure-store-get | key | 从 OS 级加密存储(safeStorage)读取密钥,返回{ value } |
secure-store-set | { key, value } | 写入密钥;值为空则删除该键 |
wyzie-open-redeem | 无 | 打开 Wyzie 兑换页 |
wyzie-validate-key | key | 校验兑换码 |
get-scheduled-backup-settings/set-scheduled-backup-settings | settings | 读写定时备份配置(频率、保留份数、路径) |
perform-scheduled-backup | { data, settings } | 执行备份并自动清理超出保留份数的旧备份 |
scheduled-backup-requested | 无 | 主 → 渲染推送:应用启动后判定"该备份了",通知前端发起导出 |
备份文件的生成与轮转逻辑见 src/ipc/storage.js#L202-L258。
自动更新、拦截统计与 Discord 通道
| 通道 | 参数 | 说明 |
|---|---|---|
detect-update-format | 无 | 按平台返回exe/dmg/deb/pacman/appimage |
download-and-install-update | { url, format } | 校验来源域名白名单后下载并安装更新包 |
cancel-update | 无 | 中止正在进行的更新下载 |
update-progress | { ...进度 } | 主 → 渲染推送更新下载进度 |
fetch-release-image | { url } | 安全抓取更新日志里的截图 |
blocked-stats-update | { total, domains } | 主 → 渲染推送:被拦截广告/追踪器的批量增量(250ms 防抖) |
get-block-stats | 无 | 获取历史拦截总量与域名分布 |
discord-rpc-set-enabled | enabled | 开关 Discord 富状态(默认关闭) |
discord-rpc-update-activity | activity | 上报"正在看 XXX"状态 |
拦截统计的"内存累计 + 250ms 批量推送 + 3 秒防抖落盘"策略,是处理高频事件的优秀范例,见 src/ipc/blockStats.js#L48-L82。
其他杂项通道一览
| 通道 | 说明 |
|---|---|
get-app-version | 从 Electron 读取 package.json 版本号(storage.js#L170) |
audio-device-changed | 仅 macOS:navigator.mediaDevices检测到音频设备切换时上报,用于 HDMI 切屏后的音频恢复 |
总结:这套 IPC 设计给新手的三个启示
- 方向分离:请求-响应用
invoke,状态推送用send/on,命名一目了然(onXxx必配offXxx); - 敏感逻辑留在主进程:媒体嗅探、代理服务器、二进制路径校验、密钥加密,渲染进程拿到的都是"结果"而非"能力";
- 高频事件先聚合再推送:下载进度、拦截统计都做了解析与防抖,避免 IPC 风暴拖垮界面。
如果你想动手研究,建议从 preload.js 入手——它是整张速查表的"目录",按功能注释分区,对照本文的表格逐行阅读,半小时就能通读 Streambert 全部主进程通信事件与参数。
【免费下载链接】streambertA cross-platform Electron Desktop App to stream and download any Movie, TV Series or Anime in the World. Zero Ads and Tracking项目地址: https://gitcode.com/GitHub_Trending/st/streambert
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考