后台工作台
内容创作、素材同步与发布状态的入口。
专栏
{{ columns.length }}
{{ publishedColumns }} 个已发布 · {{ draftColumns }} 个草稿
章节
{{ totalChapters }}
来自当前创作库
作者
{{ authors.length }}
可关联到多个专栏
同步任务
{{ syncStatus.status === 'running' ? '运行中' : (syncStatus.status === 'queued' ? '队列中' : '空闲') }}
{{ syncStatus.current?.processed || 0 }} / {{ syncStatus.current?.total || 0 }}
百度网盘 → COS
系统健康
检测于 {{ fmtTime(healthCheckedAt) }}
{{ h.label }}
未配置
已配置
上次:{{ fmtTime(baiduLastCheck.at) }} {{ baiduLastCheck.ok ? '✓ '+(baiduLastCheck.baidu_name||'') : '✗ '+(baiduLastCheck.error||'') }} ✓ {{ h.result.error || '正常' }} ✗ {{ h.result.error || '失败' }}
上次:{{ 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||'') }}
专栏管理
| 封面 | 标题 | 作者 | 分类 | 章节 | 状态 | ||
|---|---|---|---|---|---|---|---|
| {{c.title}}
{{c.subtitle}} |
{{c.author ? c.author.name : '—'}} | {{c.category||'—'}} | {{c.chapterCount}} | {{c.status==='published'?'已发布':'草稿'}} | |||
| 无匹配专栏,调整筛选条件或 | |||||||
还没有专栏,点右上角新建。
← 返回
{{curColumn ? curColumn.title : ''}}
| # | 标题 | 时长 | 音频 | 试听 | 状态 | |||
|---|---|---|---|---|---|---|---|---|
| ⠿ | {{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}} |
还没有作者。
百度浏览
✗ {{ browseError }}(先去「同步设置」完成百度授权)
加载中…
| 名称 | 大小 | mtime | fs_id | |
|---|---|---|---|---|
| 📁🎵 | {{ it.server_filename }} 点击进入 | {{ it.isdir ? '—' : fmtBaiduSize(it.size) }} | {{ it.mtime ? fmtTime(it.mtime * 1000) : '—' }} |
这个目录是空的。
群文件库
通过百度网盘浏览器登录态读取群共享文件,支持转存到自己网盘并加入监控。
连接信息
{{ settings.baidu_bduss?.has_secret ? 'BDUSS 已配置' : 'BDUSS 未配置' }}
{{ settings.baidu_stoken?.has_secret ? 'STOKEN 已配置' : 'STOKEN 未配置' }}
Cookies 在「连接与通知」中配置。此处修改群号会在列目录时自动保存。
我加入的群
群文件
填写群号后点击「列出群文件」。
加载中...
这个目录是空的。
同步设置
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;
③ 复制 BDUSS、STOKEN、BDCLND 粘到下方(BDUSS 必填)。群文件浏览已移到「素材中心 → 群文件库」。
{{ baiduGroupProbe.ok ? '✓ 可用' + (baiduGroupProbe.baidu_name ? ' · ' + baiduGroupProbe.baidu_name : '') : '✗ ' + (baiduGroupProbe.error || '未授权') }}
填好 cookies 点「保存全部」,再点「探测 cookies」验证。失败常见:BDUSS 复制不全 / 已失效 / 触发异地登录。
同步任务
百度下载对高并发敏感;超过 2 路容易被限流并反复超时
开启后,系统 cron 每 6 小时检查关注的群文件夹,发现新文件自动秒传到网盘
专栏映射规则(JSON 数组) 规划中,暂未实现
阶段 1 先不解析,阶段 5 接通后再实现路径→专栏/章节的自动归类。
完成通知(ntfy.sh)
{{ 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
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 }}
{{ e.sectionTitle }}
{{ e.title }}
从目录图片自动设为封面
增量重跑:已入库章节不再处理
清洗完成或课程信息更新后会自动发布到 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}} |
有 {{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}} |
还没有同步记录。
已同步文件(最近 50)
| 源路径 | 大小 | mtime | 状态 | 同步时间 |
|---|---|---|---|---|
| {{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 }})
| 群 / 文件夹 | 群内路径 | 状态 | 上次检查 | 上次新增 | 操作 |
|---|---|---|---|---|---|
| {{ w.group_name }} / {{ w.name }} | {{ w.enabled ? '启用' : '暂停' }} | {{ w.last_checked_at ? fmtTime(w.last_checked_at) : '—' }} | {{ w.last_added }} | ||
|
{{ Number(w.clean_enabled) ? '会自动发布' : '不自动清洗' }}
|
|||||
还没有关注的文件夹。去「同步设置 → 百度群共享」浏览群文件,对文件夹点「加入监控」。
App 更新提示(最近 {{ appUpdates.length }})
| 时间 | 课程 | 新增 | 提示内容 |
|---|---|---|---|
| {{ fmtTime(u.createdAt) }} | {{ u.columnTitle || u.columnId || '—' }} | {{ u.added || 0 }} |
还没有 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 }} |
还没有检查记录。点右上角「立即检查」试一次。
