Streambed IPC通道参考:所有主进程通信事件与参数速查表
2026/9/16 14:16:52 网站建设 项目流程

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-downloaderfolder(下载器目录){ 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-folderpath在资源管理器/访达中定位文件
file-existspath布尔判断文件是否存在
scan-directorypath文件列表扫描目录生成媒体库

一个值得新手学习的细节: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-allmangaargs输出解析调试信息,便于排查

源码见 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-maximizedboolean主 → 渲染推送,状态变化时更新标题栏图标
get-platform返回process.platform,前端据此适配 UI
open-externalurl用系统浏览器打开外部链接
open-pathfilePath用系统默认程序打开文件
open-path-at-time{ filePath, seconds, subtitlePaths }用 VLC/mpv 从指定秒数续播,附带字幕文件(路径会做白名单校验)
pick-folder弹出原生文件夹选择框
get-install-path返回应用安装位置
get-video-durationfilePath调用 ffprobe 获取视频时长
quit-app请求退出应用
show-notification{ title, body, silent }触发系统原生通知
confirm-close{ count }主 → 渲染推送:有 N 个下载进行时请求关闭确认
close-responseconfirmed渲染 → 主回复:确认后杀掉全部下载进程并退出

confirm-close/close-response构成一个漂亮的"双向协商"案例,完整实现见 index.js#L288-L307。

播放器清理与存储维护通道

通道参数说明
player-stopped无(send单向)播放页卸载时通知主进程:销毁播放器 webview、清空缓存并触发 GC,是 Streambert 低内存占用的关键
query-video-progresswebContentsId主进程递归遍历所有嵌套 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-getkey从 OS 级加密存储(safeStorage)读取密钥,返回{ value }
secure-store-set{ key, value }写入密钥;值为空则删除该键
wyzie-open-redeem打开 Wyzie 兑换页
wyzie-validate-keykey校验兑换码
get-scheduled-backup-settings/set-scheduled-backup-settingssettings读写定时备份配置(频率、保留份数、路径)
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-enabledenabled开关 Discord 富状态(默认关闭)
discord-rpc-update-activityactivity上报"正在看 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 设计给新手的三个启示

  1. 方向分离:请求-响应用invoke,状态推送用send/on,命名一目了然(onXxx必配offXxx);
  2. 敏感逻辑留在主进程:媒体嗅探、代理服务器、二进制路径校验、密钥加密,渲染进程拿到的都是"结果"而非"能力";
  3. 高频事件先聚合再推送:下载进度、拦截统计都做了解析与防抖,避免 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询