- Android
- iOS
- Pad
- Windows
- Linux
仓库:Chloemlla/PiliPlus
上游参考:bggRGjQaUbCoE/PiliPlus · 更早:orz12/PiliPalaX / guozhigq/pilipala
对比基线:截至 2026-07-31 已合入upstream/main的e89241109;审计时本仓库main为 0 个落后、约 165 个分支增量,后续提交在此基础上继续累积 本文按功能模块汇总本分支相对上游的主要改进:用户可见行为、关键实现入口、平台范围与工程保障。
不是完整 changelog / 提交列表;上游已有的通用能力见下文feat/功能清单。
| 模块 | 平台 | 用户侧收益 | 关键入口 |
|---|---|---|---|
| Seal 外部下载委托 | Android | 多 P、登录 Cookie 与空降助手去广告统一走 Seal 队列 | SealDownloadUtils / SealDownloadChannel |
| B 站网页二维码授权 | Android | 扫网页登录码授权本机账号 | WebQrAuthPage / WebQrAuthHttp / QrScannerActivity |
| 崩溃捕获与历史 | Android + Flutter | 可过滤噪声、本地查看/分享崩溃 | CrashReporter / lumen-crash |
| MMKV 热存储 | Android | 设置/进度/缓存更快,大箱懒加载 | AndroidMmkvBackedBox |
| 密钥旁路与隐私 | 全平台(部分 Android) | Cookie/密钥不再明文落库;复制 Cookie 需系统验证 | AccountSecretStore / AndroidCredentialAuth |
| 媒体导出 / 系统媒体控件 | 多平台 / Android | 内置导出 + 静默即时通知 + 可拖动 MediaSession 进度 | MediaExportUtils / NativeMediaService |
| 评论与设置可用性 | 全平台 | 独立评论收藏、日期恢复、选择过滤防崩与搜索定位高亮 | FavoriteReplyStore / SettingsSearchPage |
| 剪贴板视频链接 | 移动端 | 识别 bilibili / b23 链接并可选自动打开 | ClipboardVideoLinkHandler |
| 首启说明 / 权限 / 更新源 | 全平台(权限仅 Android) | 首装分支说明、开源声明、逐构建更新说明与权限引导 | StartupOverlayCoordinator / WhatsNewGuideService |
| Clash VPN 自动适配 | Android | 与配套 Clash Meta 协作,VPN 切换时自动刷新网络路径 | ClashCompat / Request |
| CI / Baseline Profile | 工程 | 冷启 profile 生成、校验与发布流硬化 | :baselineprofile / .github/workflows/build.yml |
上游详情页「下载视频 / 下载音频」更偏应用内直链导出;复杂清晰度、音视频分离与队列管理成本高。本分支将 菜单下载 委托给 Seal(yt-dlp 前端),由 Seal 负责解析、队列与落盘,PiliPlus 负责发起与状态呈现。
- 视频详情三点菜单:下载视频 / 下载音频
- 离线缓存 仍走应用内
DownloadService,与 Seal 委托互不替代 - 未安装 Seal:Toast「请先安装 Seal」并打开 Seal Releases
- 已安装:拉起 Seal,并显示 PiliPlus 自有动画状态面板
等待确认 / 自动入队 → 进行中 → 完成 / 失败 / 取消
(跳过「正在启动 Seal」中间态,减少闪屏感) - 设置项:委托 Seal 时自动开始下载(默认关;需 Seal 开启 Allow external auto-start)
- UGC 多 P 可选「当前 P / 选择分 P / 全部」,批量链接通过
urls[]交给 Seal;番剧单集保持单任务语义 - 可选把当前登录账号 Cookie 安全透传给 Seal;多账号可选择并记忆,关闭透传、账号不完整或 Seal 不接收时可匿名继续
- 「下载并去除空降助手标记」读取当前 cid 的标记,保留正片区间并输出连续成品;完成面板展示逐段去除报告,多 P 按分集独立处理
- 完成态可打开 / 分享
content_uri;关闭「后台等待」后仍可在终态广播到达时再弹出完成面板
| 项 | 说明 |
|---|---|
| 动作 | L2/L3:com.chloemlla.seal.action.DOWNLOAD + 状态广播 DOWNLOAD_STATUS |
| UGC | https://www.bilibili.com/video/{bvid} |
| PGC | https://www.bilibili.com/bangumi/play/ep{epId} |
| 音频 | Seal QuickDownload + extract_audio=true |
| 批量 | urls[] / Intent extra urls;首项仍写入 url 兼容旧版 |
| Cookie | 协议 v2:cookies_format=json_map、cookies、cookies_mid;不记录明文,默认软失败为匿名下载 |
| 去广告 | 协议 v3:strip_segments + keep_sections;专用 C/D 路径只在片段已实际剥离时上报 applied |
| 会话 | 每次委托生成 requestId,Dart session map 跟踪生命周期 |
lib/pages/video/seal_download_utils.dart:Dart 侧门面;多 P 选择、Cookie 账号选择、空降助手区间计算、面板状态机与防回退逻辑SealDownloadChannel:安装检测、startActivityForResult、打开/分享结果文件SealDownloadStatusBridge(PiliPlusApplication安装):Application 级接收定向状态广播;Dart 引擎未就绪时排队,避免退后台丢终态SegmentStripMath/StripRemovalReport:合并空降助手标记、反转为保留区间并生成用户可读报告- 状态机防护:晚到的 Activity Result
needs_ui/ 空会话canceled不会回退已进入accepted或终态的面板 - v3 终态防假成功:仅实际
strip_result=applied才显示[去广告]、逐段报告和打开/分享;C 分段合成失败会清理后转 D 完整源后处理,D 仍失败则清理并给出可重试错误 - 非 Android:仍走
MediaExportUtils内置导出
edb5ec38a 委托入口 · 6512bd796 L3 状态接收加固 · 938ddbebe 自有动画面板 · 7c350f2c4 跳过 launching 阶段 · 6f8dfff08 音频 QuickDownload · a253eb378 面板 UX 收紧。
Seal 联调文档:third-party-call-guide.md、UI 路径终态。
支持扫描 / 识别 B 站官方网页登录二维码,用本机已登录账号完成网页端授权;补齐 URL 校验、会话完整性、重试与扫码链路稳定性。
- 入口页:
扫描网页登录(WebQrAuthPage) - 输入方式:相机实时扫码 / 相册识别 / 手动粘贴二维码链接
- 解析成功后展示场景信息(环境、是否临时登录、短信二次验证等)
- 可确认授权;失败可重试;权限被永久拒绝时引导打开系统设置
- 授权成功后与现有账号体系打通,登录态接口可继续使用
| 层 | 组件 | 职责 |
|---|---|---|
| UI | lib/pages/web_qr_auth/* |
阶段机 idle/loading/ready/confirming/success/error、场景面板、扫码源面板 |
| HTTP | WebQrAuthHttp |
passport 场景查询 / 确认 / 短信与极验相关接口;请求附着账号 Cookie |
| 模型 | models_new/web_qr_auth |
二维码 key、场景、环境参数;host / 显式默认端口校验 |
| Native 扫码 | QrScannerActivity + 华为 HMS Scan Kit(scanplus RemoteView / decodeWithBitmap) |
无 GMS 可用;MethodChannel 契约不变,替换旧 CameraX/ZXing/ML Kit 路径 |
| Dart 通道 | AndroidQrScanner |
相机权限、错误码映射、相册解码 |
- 授权链路 cookie / verify code 经
LogRedactor脱敏 CrashBreadcrumbs记录扫码阶段(start / decoded / cancelled / error),便于对照崩溃历史
8bc531050 场景模型 · 437f741fd 解码路径替换 · ec8ac7588 延后初始化 · 3ce6a1278 附着 Cookie · 以及多轮 fix(qr) 重试 / 端口 / 权限加固。
播放器与网络层会产生大量不可操作诊断噪声;同时需要跨 Flutter / Android 保留可复盘的真实故障,并在启动时提示最近严重崩溃。
- 本地崩溃历史:列表、详情(系统信息、堆栈、近期事件)、分享
- 启动阶段若存在上一会话严重崩溃,可提示查看
- 常见 media-kit / TCP / SSL seek 等诊断默认过滤,避免误报淹没真实问题
| 模块 | 作用 |
|---|---|
CrashReporter / CrashReportHandler |
安装 FlutterError / PlatformDispatcher 钩子;同步/异步记录 |
CrashReportFilter |
过滤 SSL seek、TCP 断流、AMediaCodec 等非可操作诊断 |
CrashReportStore / CrashReportArchive |
有界本地历史、合并归档语义 |
CrashBreadcrumbs / CrashModuleResolver |
导航与业务面包屑、模块定位 |
lumen-crash |
Android native 捕获桥 |
NativeCrashBridge / NativeCrashChannel |
导入 pending report / lumen report 并 acknowledge |
ProcessExitCollector |
后台线程采集进程退出历史 |
- 依赖:
com.chloemlla.lumen:lumen-crash(Compose BOM 对齐 api 依赖) - 安装点:
PiliPlusApplication.attachBaseContext/onCreate(幂等;失败安装 不阻断 冷启动,适配 Baseline Profile / CI) - Dart 侧:
CrashReporter.ensureInitialized()导入 native / lumen pending report minSdk抬升至 ≥ 26(与 lumen-crash 对齐)
a85ea371b 双侧捕获 · fb82add62 过滤历史 · cff4affcb 崩溃 UI · 6c179a79b lumen-crash · 15b490691 Compose BOM · 相关单测 test/services/crash/*。
将 Android 热读写从纯 Hive 迁移为 MMKV 后端,降低设置、缓存、观看进度等路径延迟;大箱支持懒加载与 LRU 上限,避免启动期全量解码。
- 典型 box:
userInfo、localCache、setting、historyWord、video - 大箱懒加载:
watchProgress、reply(AndroidMmkvLoadMode.lazy) - 非 Android / MMKV 不可用:透明回落 Hive
openAndroidMmkvBackedBox+AndroidMmkvBackedBox:迁移 marker、codec 编解码、批量写、lazy key 集合- 迁移失败 / 解码失败时 不 用过期 Hive 快照覆盖已迁移 MMKV 数据
BoundedStringKeyLru+WatchProgressStore/ReplyCacheStore:写序近似 LRU,控制大箱膨胀- staged open / lighter close,减少启动与退出开销
- 设置导入校验、账号导入一致性、WebDAV 备份安全性同步增强
a70f5d90e 热存储 · 298b811a7 完整迁移 · 7d7c1bd96 批量写/LRU · 655aa5c24 lazy/staged open · 单测 test/utils/android_mmkv_box_test.dart、bounded_string_key_lru_test.dart。
AccountSecretStore:账号 cookies / accessKey / refresh 独立 AES-GCM 加密文件(account_secrets.json.enc+ key 文件)SettingSecretStore:设置侧敏感串(如 WebDAV 密码)同样旁路加密- 账号 adapter 读写时组合公开字段 + secret sidecar;导出 / 备份路径排除或校验敏感字段
- Android 复制登录 Cookie(隐私设置):必须先过
AndroidCredentialAuth(系统锁屏 / PIN / 生物识别) - 未登录、验证失败、系统验证不可用均有明确 Toast
LogRedactor:Cookie / SESSDATA / access_key / refresh_token / 验证码 / 本地路径 / content URI 等统一替换为[REDACTED]或占位符- 崩溃报告与日志页面共享脱敏规则,降低分享报告时的凭据泄露面
account_secret_store_test、setting_secret_store_test、log_redactor_test、settings_backup_validator_test。
MediaExportUtils:
- 视频:MP4 直链(durl,音视频合一;多分段明确失败提示)
- 音频:当前 DASH 音频流导出为
.m4a - Android 详情菜单 优先委托 Seal;非 Android 或未走委托路径时仍可用内置导出
PlPlayerStreamError:区分网络打开失败 vs 中断断流,支撑中断重试- 音频心跳 / seek / 切轨时重置时长,减少异常时长上报
- 下载服务分段并发管理等稳定性调整
NativeMediaService:MediaSession+ 前台通知通道NativeMediaNotificationService:Flutter ↔ native 动作桥(播放/暂停/上下首/快进退/倍速/弹幕/循环/睡眠定时等)- Android 12+ 请求
FOREGROUND_SERVICE_IMMEDIATE;LOW 通道无声音、振动与角标,只承载播放控制 - 非直播且真实时长已知时写入 duration / buffered / position,并声明
ACTION_SEEK_TO;通知栏与系统媒体中心可显示并拖动进度条 - 拖动后先乐观更新位置并屏蔽短时陈旧 tick;播放中位置推送节流,直播与未知时长不会显示误导性进度
- 评论更多菜单支持本地收藏;显式收藏使用独立有界存储,不再与“自动记录评论”共用状态
- 关闭“记录评论”后收藏入口仍可用;升级时旧本地数据采用 copy-on-success 迁移,失败不删除旧数据并可重试
- 「我的」页提供收藏评论入口与数量,支持导入摘要、按 id 去重、导出、清空、查看来源并取消收藏
- 本地收藏页显示完整评论时间,普通评论保留相对/短日期;缺少 IP 属地时不会访问不存在的字段
- 「加入过滤」只处理有效的非空选中文本,避免选择状态消失时空值崩溃
- Windows 右键只有命中当前选区时才保留选择,点到选区外会按 Flutter 原语义折叠
- 搜索结果显示所属分区;点击后跳转到对应设置页并滚动定位
- 目标设置项短暂高亮闪烁,定位后开关、选择项与导航仍可正常操作
- 设置:自动打开剪贴板视频(默认关)
- 回前台时检测剪贴板中的 B 站视频链接(含 b23.tv 短链,会解析跳转)
- 搜索提交 / 活动页打开前可识别链接,避免重复弹窗
- 当前已在视频页(
/videoV)时再次打开剪贴板链接会二次确认 - 同链 3 秒节流 + 会话内 link/videoKey 去重,防止连弹
ClipboardVideoLinkHandler+ 生命周期 observerIdUtils归一化 aid/bvid;UrlUtils.parseRedirectUrl解析 b23
- 首装依次展示「开源声明与第三方鸣谢」和「本分支改进说明」;About 页可随时重新打开,手动查看不污染首装 seen 标记
- 每个新
commitHash + buildTime首次打开会展示「本次更新说明」;同一构建确认后不重复弹出 StartupOverlayCoordinator统一顺序:崩溃恢复 > 开源声明 > 分支改进 > 本次更新 > Android 权限,避免多个启动弹层互相覆盖
AndroidFirstLaunchPermissionGate/AndroidFirstLaunchPermissionService- 首次启动按系统版本请求通知、相册/媒体、存储、亮度等相关权限
- 每项先说明原因;永久拒绝可引导应用设置
- 必须等 Navigator 就绪再弹窗,避免冷启无 context 崩溃;未完成则下次重试
| 项 | 本分支 |
|---|---|
applicationId / namespace |
com.chloemlla.piliplus |
| debug / dev | .debug / .dev suffix |
| 源码与更新 | Constants.sourceCodeRepository = Chloemlla/PiliPlus;检查更新走本仓库 Releases |
minSdk |
max(flutter.minSdk, 26)(lumen-crash) |
| 依赖 | MMKV、HMS Scan Kit(scanplus)、lumen-crash、ProfileInstaller 等 |
- 模块:
android/baselineprofile(BaselineProfileGenerator) - workflow:Generate → Validate(
baseline-prof.txt/startup-prof.txt非空)→ Upload artifact - 合并策略:
mergeIntoMain = true,构建期不自动生成,CI 显式任务生成
- Flutter 模拟器 / ATD / AOSP 默认镜像选择修正
- 启动路径规避 lumen-crash 安装失败拖垮冷启
- 磁盘清理、emulator boot 可靠化、产物归档拆分
- Release APK 重命名稳健化、workflow 英文命名
- 签名 / 私钥检测正则增强;workflow dispatch 写密钥条件修正
- strip pub-cache manifest packages 等 Android 补丁
- 检查更新 action pin,降低供应链漂移
- 持续 merge upstream,在保留本分支特性的前提下吸收上游修复
- 单测扩展:MMKV、密钥 store、崩溃归档/过滤、Web QR 场景、网络策略、播放器 stream error、settings backup、bounded task queue 等
tool/check_import_boundaries.py:导入边界检查- 仓库内 Trellis 任务流 / 规格(
.trellis/,默认本地)支撑 AI 协作开发 - 分析器警告清理、局部 UI 与数据安全修缮
- 安装 Chloemlla/Seal(包名
com.chloemlla.seal) - Seal:设置 → Interface & interaction → External downloads 开启外部委托
- 可选:Seal 开启 Allow external auto-start,并在 PiliPlus 开启「委托 Seal 时自动开始下载」
- 可选:PiliPlus 开启 Cookie 透传;Seal 外部下载设置允许 Cookie。关闭或拒绝时仍可匿名下载
- 视频页三点菜单 → 下载视频 / 下载音频 / 下载并去除空降助手标记;UGC 多 P 可选当前、部分或全部
- 完成态依赖 Seal L3 状态广播;UI 确认后应看到「进行中 → 完成」动画面板自动切换(详见 Seal UI 路径文档)
- 本列表不是完整 changelog,而是本分支相对上游的功能模块级增量说明(覆盖
upstream/main..main主要主题面)。 - 上游已有的通用功能(推荐流、弹幕、动态、私信等)见下文
feat/功能清单。 - 若与上游行为冲突,以本仓库
main与对应实现/commit 为准。
- gRPC [wip]
- 用户界面
- 其他
- 编辑动态
- DLNA 投屏
- 离线缓存/播放
- Android 视频菜单委托 Seal 下载(视频/音频)
- Seal 多 P 批量、登录 Cookie 透传与空降助手标记剥离成品
- 移动端支持点击弹幕悬停,点赞、复制、举报 by @My-Responsitories
- 播放音频
- 跳过番剧片头/片尾
- 安卓端
loudnorm适配 by @My-Responsitories - Win/Mac 支持极验、短信登录 by @My-Responsitories
- 视频截取动图 by @My-Responsitories
- AI 原声翻译
- SuperChat
- 播放课堂视频
- 发起投票
- 发布动态/评论支持
富文本编辑/表情显示/@用户 - 修改消息设置
- 修改聊天设置
- 展示折叠消息
- 查看用户图文
- 动态话题
- 直播分区
- 分享
视频/番剧/动态/专栏/直播至消息 - 创建/修改/删除关注分组
- 移除粉丝
- 直播弹幕发送表情
- 收藏夹排序
- 稍后再看
/未看未看完/分类已看完 - WebDAV 备份/恢复设置
- 保存评论/动态
- 高级弹幕 by @My-Responsitories
- 取消/置顶评论
- 记笔记
- 多账号支持 by @My-Responsitories
- 屏蔽带货动态/评论
- 互动视频
- 发评/动态反诈
- 崩溃捕获过滤与历史
- 高能进度条
- 滑动跳转预览视频缩略图
- Live Photo
- 复制/移动/排序收藏夹/稍后再看视频
- 超分辨率
- 合并弹幕
- 会员彩色弹幕
- 播放全部/继续播放/倒序播放
- Cookie登录
- B 站网页二维码授权(Android)
- Android 华为 Scan Kit 相机 / 相册扫码
- Android Clash VPN 伙伴应用自动适配
- Android MMKV 热存储与懒加载
- 账号/设置密钥旁路存储与 Cookie 凭据保护
- 剪贴板视频链接识别(含 b23)与自动打开
- Android 首次启动权限引导
- Android 系统媒体通知 / MediaSession
- Android 媒体通知可拖动进度与直播 seek 门控
- 首装开源声明、分支改进说明与逐构建更新说明
- 显示视频分段信息
- 调节字幕大小
- 调节全屏弹幕大小
- 收藏夹/稍后再看多选删除
- 搜索用户动态
- 直播弹幕
- 修改头像/用户名/签名/性别/生日
- 创建/编辑/删除收藏夹
- 评论楼中楼查看对话
- 评论楼中楼定位点击查看的评论
- 评论楼中楼按热度/时间排序
- 评论点踩
- 本地收藏评论、导入导出与来源回看
- 设置搜索结果跳转、滚动定位与高亮
- 私信发图
- 投币动画
- 取消/追番,更新追番状态
- 取消/订阅合集
- SponsorBlock
- 显示视频完整合集
- 三连动画
- 番剧三连
- 带图评论
- 视频TAG
- 筛选搜索
- 转发动态
- 合集图片
- 删除/置顶/撤回私信
- 举报用户/评论/视频/动态
- 删除/发布/置顶文本/图片动态
- 其他
- 专栏界面
- 私信界面
- 收藏面板
- PIP
- 视频封面
- 回复界面
- 系统通知
- 评论显示
- 亮度调节
- 视频播放
- 视频staff
- 防止bottomsheet遮挡全屏视频
- 其他
- 番剧分集点赞/投币/收藏
- bugs
-
推荐视频列表(app端)
-
最热视频列表
-
热门直播
-
番剧列表
-
屏蔽黑名单内用户视频
-
无痕模式(播放视为未登录)
-
游客模式(推荐视为未登录)
-
用户相关
- 粉丝、关注用户、拉黑用户查看
- 用户主页查看
- 关注/取关用户
- 离线缓存
- 稍后再看
- 观看记录
- 我的收藏
- 站内私信
-
动态相关
- 全部、投稿、番剧分类查看
- 动态评论查看
- 动态评论回复功能
-
视频播放相关
- 双击快进/快退
- 双击播放/暂停
- 垂直方向调节亮度/音量
- 垂直方向上滑全屏、下滑退出全屏
- 水平方向手势快进/快退
- 全屏方向设置
- 倍速选择/长按2倍速
- 硬件加速(视机型而定)
- 画质选择(高清画质未解锁)
- 音质选择(视视频而定)
- 解码格式选择(视视频而定)
- 弹幕
- 字幕
- 记忆播放
- 视频比例:高度/宽度适应、填充、包含等
-
搜索相关
- 热搜
- 搜索历史
- 默认搜索词
- 投稿、番剧、直播间、用户搜索
- 视频搜索排序、按时长筛选
-
视频详情页相关
- 视频选集(分p)切换
- 点赞、投币、收藏/取消收藏
- 相关视频查看
- 评论用户身份标识
- 评论(排序)查看、二楼评论查看
- 主楼、二楼评论回复功能
- 评论点赞
- 评论笔记图片查看、保存
-
设置相关
- 画质、音质、解码方式预设
- 图片质量设定
- 主题模式:亮色/暗色/跟随系统
- 震动反馈(可选)
- 高帧率
- 自动全屏
- 横屏适配
-
等等
可以通过右侧release进行下载或拉取代码到本地进行编译
此项目(PiliPlus)是个人为了兴趣而开发,仅用于学习和测试,请于下载后24小时内删除。 所用API皆从官方网站收集,不提供任何破解内容。 在此致敬原作者:guozhigq/pilipala 在此致敬上游作者:orz12/PiliPalaX 本仓库做了更激进的修改,感谢原作者的开源精神。
感谢使用




