⚠️
百度网盘授权已失效 {{ baiduLastCheck.error || '未知错误' }}。请前往 api.oplist.org 重新获取 refresh_token,然后在「连接与通知」设置中更新。
去修复
最近一次同步失败 {{ recentSyncFailed.error || '请查看同步日志了解详情' }}
查看日志

后台工作台

内容创作、素材同步与发布状态的入口。

系统健康 检测于 {{ fmtTime(healthCheckedAt) }}
{{ h.label }} 未配置 已配置
上次:{{ fmtTime(baiduLastCheck.at) }} {{ baiduLastCheck.ok ? '✓ '+(baiduLastCheck.baidu_name||'') : '✗ '+(baiduLastCheck.error||'') }}
✓ {{ h.result.error || '正常' }} ✗ {{ h.result.error || '失败' }}
百度 OAuth 自动探测:每小时一次,记录上次于 {{ fmtTime(baiduLastCheck.at) }} — {{ baiduLastCheck.ok ? '可用 · ' + (baiduLastCheck.baidu_name||'') : '已失效 · ' + (baiduLastCheck.error||'') }}

专栏管理

共 {{ filteredColumns.length }} / {{ columns.length }}
已选 {{ selectedCols.length }} 项
封面标题作者分类章节状态
{{c.title}}
{{c.subtitle}}
{{c.author ? c.author.name : '—'}} {{c.category||'—'}} {{c.chapterCount}} {{c.status==='published'?'已发布':'草稿'}}
章节
无匹配专栏,调整筛选条件或
还没有专栏,点右上角新建。
← 返回

{{curColumn ? curColumn.title : ''}}

共 {{ filteredChapters.length }} / {{ chapters.length }}
已选 {{ selectedChs.length }} 项
#标题时长音频试听状态
{{ch.idx}}
{{ch.sectionTitle}}
{{ch.title}} 后台校准中 {{transcribeJob(ch.id).progress||0}}% 校准失败
{{fmtDur(ch.duration_sec)}} 已上传 {{ch.free?'是':'否'}} {{ch.status==='published'?'发布':'草稿'}}
无匹配章节,
该专栏还没有章节。

作者管理

姓名简介关联专栏
{{a.name}} {{a.bio||'—'}} {{a.columnCount}}
还没有作者。

百度浏览

共 {{ browseItems.length }} 项
✗ {{ browseError }}(先去「同步设置」完成百度授权)
加载中…
名称大小mtimefs_id
📁🎵 {{ it.server_filename }} 点击进入 {{ it.isdir ? '—' : fmtBaiduSize(it.size) }} {{ it.mtime ? fmtTime(it.mtime * 1000) : '—' }} {{ it.fs_id }}
这个目录是空的。

群文件库

通过百度网盘浏览器登录态读取群共享文件,支持转存到自己网盘并加入监控。

连接信息
{{ settings.baidu_bduss?.has_secret ? 'BDUSS 已配置' : 'BDUSS 未配置' }} {{ settings.baidu_stoken?.has_secret ? 'STOKEN 已配置' : 'STOKEN 未配置' }}
Cookies 在「连接与通知」中配置。此处修改群号会在列目录时自动保存。
{{ baiduGroupProbe.ok ? '可用' + (baiduGroupProbe.baidu_name ? ' · ' + baiduGroupProbe.baidu_name : '') : (baiduGroupProbe.error || '未授权') }} {{ groupBrowse.error }} {{ groupBrowse.items.length }} 项 · {{ groupBrowse.groupName || ('gid ' + groupBrowse.gid) }}
我加入的群
群文件
填写群号后点击「列出群文件」。
加载中...
/{{ groupBrowse.stack.map(s => s.name).join(' / ') }}
这个目录是空的。

同步设置

AI 语音转文稿
音频先由语音识别模型转成逐字稿,再由 GPT-5.6-sol 忠实校错和分段。API Key 仅加密保存在服务器,不会写入 APP。
如果接口没有语音模型,可填写 local-whisper:音频在本机识别,只把识别文字交给校正模型。
{{ aiProbe.ok ? '✓ 连接正常:' + aiProbe.transcribeModel + ' → ' + aiProbe.polishModel : '✗ ' + (aiProbe.error || '连接失败') }}
Obsidian 双向笔记同步
通过 Fast Note Sync Service 将 APP 笔记同步到 Obsidian,每章节生成一个 Markdown 文件。只改写文件中的 REAP 管理区块;双方同时修改时保留原文件并生成冲突副本。
文件路径为 根目录/专栏ID/章节ID.md。Token 需具备 REST、note_r、note_w 和目标 Vault 权限。
{{ fnsObsidianProbe.ok ? '✓ 已连接 ' + fnsObsidianProbe.vault + (fnsObsidianProbe.username ? ' · ' + fnsObsidianProbe.username : '') : '✗ ' + (fnsObsidianProbe.error || '连接失败') }}
腾讯云 COS
同步后文件落在 cos://<bucket>/<此处>/<专栏>/<章节>/...
{{ cosProbe.ok ? '✓ 连接正常' : '✗ ' + (cosProbe.error || ('失败' + (cosProbe.code ? ' (' + cosProbe.code + ')' : ''))) }} 先「保存全部」再测试(会用已保存的 SecretId/Key/Region/Bucket 探测 bucket 连通性)。
百度网盘(OAuth 授权登录)
步骤:① 打开 https://api.oplist.org/, 选「百度网盘验证登录」并勾选「使用 OpenList 提供的参数」;② 点「获取 Token」,跳转百度登录并授权; ③ 把页面给出的 refresh_token 复制粘贴到下方,保存后点「验证授权」。 授权失效后重新走一遍取新的 refresh_token 即可。
注意:官方接口只能访问「你自己网盘」的文件,群共享请先在网盘里转存到自己目录。
{{ baiduProbe.ok ? '✓ 已授权' + (baiduProbe.baidu_name ? ' · ' + baiduProbe.baidu_name : '') : '✗ ' + (baiduProbe.error || '未授权') }}
粘贴 refresh_token 后点「保存全部」,再点「验证授权」。失败常见原因:refresh_token 复制不全 / 已失效(重新去 oplist 取)。
{{ baiduListResult.ok ? '✓ ' + baiduListResult.count + ' 个文件' : '✗ ' + (baiduListResult.error || ('errno ' + baiduListResult.errno)) }}
百度群共享 Cookies
官方 OAuth 接口只能访问你自己网盘,群组共享文件夹必须用浏览器登录态(cookies)。 步骤:① Chrome 登录 pan.baidu.com;② DevTools → Application → Cookies → 选 https://pan.baidu.com; ③ 复制 BDUSSSTOKENBDCLND 粘到下方(BDUSS 必填)。群文件浏览已移到「素材中心 → 群文件库」。
{{ baiduGroupProbe.ok ? '✓ 可用' + (baiduGroupProbe.baidu_name ? ' · ' + baiduGroupProbe.baidu_name : '') : '✗ ' + (baiduGroupProbe.error || '未授权') }}
填好 cookies 点「保存全部」,再点「探测 cookies」验证。失败常见:BDUSS 复制不全 / 已失效 / 触发异地登录。
打开群文件库 {{ baiduGroupProbe.ok ? '可用' + (baiduGroupProbe.baidu_name ? ' · ' + baiduGroupProbe.baidu_name : '') : (baiduGroupProbe.error || '未授权') }}
同步任务
百度下载对高并发敏感;超过 2 路容易被限流并反复超时
开启后,系统 cron 每 6 小时检查关注的群文件夹,发现新文件自动秒传到网盘
专栏映射规则(JSON 数组) 规划中,暂未实现
阶段 1 先不解析,阶段 5 接通后再实现路径→专栏/章节的自动归类。
完成通知(ntfy.sh)
同步/群监控任务结束时推送到手机。用公共服务 ntfy.sh, 手机装 ntfy App 后订阅下方 topic 即可收到通知。 topic 请用随机长串(别人猜不到才能保证私密)。
{{ ntfyProbe.ok ? '✓ 已发送,查看手机 ntfy App' : '✗ ' + (ntfyProbe.error || (ntfyProbe.skipped ? '(未配置 topic)' : '失败')) }}
设置存在本地 SQLite(reap.db),敏感字段 AES-256-GCM 加密(key 派生自本机 machine-id)。换机器无法解密。

APK 版本管理

原生 App 发布控制台 · 签名校验 · 灰度 · 强制升级 · 回滚

上传正式签名 APK
服务端会自动校验包名、版本号、发布证书和 SHA-256;校验通过后先进入草稿。
{{ apkUploadMsg.text }}
{{ appVersionMsg.text }}
版本列表 {{ appVersionCurrent.releases?.length || 0 }} 个版本
尚未上传原生 App 版本。
v{{ release.versionName }}
Code {{ release.versionCode }} · {{ (release.size/1048576).toFixed(1) }} MB
{{ release.active ? '当前全量' : release.status==='draft' ? '草稿' : release.status==='published' ? '已发布' : '已归档' }} 强制升级 下载 APK
SHA-256 {{ release.sha256.slice(0,12) }}…
问题反馈记录
暂无反馈记录。
{{ fbTypeLabel(f.type) }} {{ fmtTime(f.created_at) }} #{{ f.id }} · {{ fbStatusLabel(f.status) }}
{{ f.column_title || f.column_id || '—' }} · {{ f.chapter_title || f.chapter_id || '—' }}
COS raw 课程目录
未发现可清洗目录(reap-raw/ 为空)。先在「群监控/同步状态」把素材同步进来。
{{ f.folder }}
音频 {{ f.audio }} · 文稿PDF {{ f.pdf }}
当前选择
清洗参数
已选择 COS 目录
{{ cleanForm.rawPrefix }}
得到数据清洗
用于得到课程元数据预填。
湛庐精读数据清洗
自动启用湛庐标题清洗规则,并拉取封面、介绍、官方目录。
三联中读数据清洗
自动启用三联中读标题清洗规则,并拉取封面、介绍、课程目录。
看理想数据清洗
自动启用看理想标题清洗规则,并拉取封面、介绍、课程目录。
{{ zhanluPreview.title }} · {{ zhanluPreview.totalDuration || '时长未知' }}
官方目录 {{ zhanluPreview.episodeNum || (zhanluPreview.episodes||[]).length }} 条;清洗类型:{{ cleanForm.sourceType }}
{{ String(e.index).padStart(2, '0') }} {{ e.title }}
{{ zhongduPreview.title }} · 三联中读
官方目录 {{ zhongduPreview.episodeNum || (zhongduPreview.episodes||[]).length }} 条;清洗类型:{{ cleanForm.sourceType }}
{{ String(e.index).padStart(2, '0') }} {{ e.title }}
{{ vistopiaPreview.title }} · 看理想
官方目录 {{ vistopiaPreview.episodeNum || (vistopiaPreview.episodes||[]).length }} 条;清洗类型:{{ cleanForm.sourceType }}
从目录图片自动设为封面
增量重跑:已入库章节不再处理
清洗完成或课程信息更新后会自动发布到 data/,手机端刷新后可见
清洗进度
运行中:{{ cleanStatus.current.processed }} / {{ cleanStatus.current.total }}({{ cleanStatus.current.columnId }})
{{ cleanStatus.current.currentFile || '准备中...' }}
{{ cleanEta }}
上次:{{ cleanStatus.last.ok ? ('完成 ' + (cleanStatus.last.columnId||'') + ',章节 ' + (cleanStatus.last.done||0) + '/' + (cleanStatus.last.total||0) + (cleanStatus.last.skipped ? (',跳过 ' + cleanStatus.last.skipped) : '') + (cleanStatus.last.failed ? (',失败 ' + cleanStatus.last.failed) : '')) : ('失败:' + cleanStatus.last.error) }}
空闲。选择目录后点「开始清洗入库」。

同步状态

当前状态
空闲中。可以点「立即同步」触发一次。
运行中:{{syncStatus.current.processed}} / {{syncStatus.current.total}}
已请求取消;正在中断目录扫描或下载,已进入 COS 上传的当前文件可能仍需等待 SDK 返回。
{{syncStatus.current.currentFile || '准备中...'}}
{{ syncEta }}
队列中:还有 {{syncStatus.queueDepth}} 个等待执行
COS 探测:{{ cosProbe.ok ? '✓ 连通' : '✗ ' + (cosProbe.error || ('HTTP ' + cosProbe.code)) }}
Obsidian 双向笔记同步
运行中:{{obsidianStatus.current.processed}} / {{obsidianStatus.current.total}}
{{obsidianStatus.current.currentPath || '准备中...'}}
空闲。同步只处理章节 Markdown 中带 REAP 标记的笔记区块。
开始状态总数拉取推送跳过冲突失败错误
{{fmtTime(l.started_at)}}{{l.status==='success'?'成功':(l.status==='running'?'运行中':'失败')}} {{l.total}}{{l.pulled}}{{l.pushed}}{{l.skipped}}{{l.conflicts}}{{l.failed}} {{l.error || '—'}}
有 {{obsidianState.filter(s => s.status==='conflict').length}} 个章节存在双方修改,已在 Obsidian 中生成 .reap-conflict-*.md 副本,请人工合并后再次同步。
最近同步日志
ID开始耗时触发状态总数新增跳过失败错误
{{l.id}} {{fmtTime(l.started_at)}} {{fmtDurMs(l.finished_at - l.started_at)}} {{l.trigger === 'recovery' ? '自动恢复' : (l.trigger === 'manual' ? '手动' : (l.trigger === 'cron' ? '定时' : l.trigger))}} {{l.status === 'success' ? '成功' : (l.status === 'failed' ? '失败' : (l.status === 'cancelled' ? '已中断并恢复' : l.status))}} {{l.total}} {{l.added}} {{l.skipped}} {{l.failed}} {{l.error || '—'}}
还没有同步记录。
已同步文件(最近 50)
源路径大小mtime状态同步时间
{{s.source_path}} {{fmtSize(s.size)}} {{fmtTime(s.mtime * 1000)}} {{s.status}} {{fmtTime(s.synced_at)}}
还没有文件被同步过。

群监控

监控设置
定时(系统 cron,默认 6 小时)检查下方关注的群文件夹,发现增量文件自动「秒传」到你网盘的同步源目录 {{ settings.baidu_source_dir?.value || 'baidu_source_dir(未设置)' }} 下,按「群名/文件夹名」归类, 并自动同步到 COS。每次检查的结果见下方日志。
全局开关:group_watch_enabled {{ settings.group_watch_enabled?.value==='1' ? '已启用' : '未启用(cron 触发也会跳过)' }} ;到「同步设置」可调整。转存后自动传 COS:group_watch_sync_cos;自动清洗:group_watch_auto_clean
调度: {{ watchSchedule.cron || '0 */6 * * *' }} {{ watchSchedule.enabled ? '已启用' : '已关闭' }} 上次运行:{{ fmtTime(watchSchedule.lastRun) }} 预计下次:{{ fmtTime(watchSchedule.nextRun) }}
下方每个关注文件夹可绑定到一个 App 课程;后续增量文件会按绑定配置自动清洗、发布 data,并写入 App 首页的课程更新。
关注的文件夹({{ watches.length }})
群 / 文件夹群内路径状态上次检查上次新增操作
还没有关注的文件夹。去「同步设置 → 百度群共享」浏览群文件,对文件夹点「加入监控」。
App 更新提示(最近 {{ appUpdates.length }})
时间课程新增提示内容
{{ fmtTime(u.createdAt) }} {{ u.columnTitle || u.columnId || '—' }} {{ u.added || 0 }} {{ u.message || '—' }}
还没有 App 更新提示。自动清洗发布后会显示在这里。
检查日志(最近 20)
开始结束状态触发扫描新增跳过失败错误
{{ fmtTime(l.started_at) }} {{ l.finished_at ? fmtTime(l.finished_at) : '运行中' }} {{ l.status }} {{ l.trigger }} {{ l.total }} {{ l.added }} {{ l.skipped }} {{ l.failed }} {{ l.error || '—' }}
还没有检查记录。点右上角「立即检查」试一次。
{{toast.msg}} ×