登录之后站点里多了几样偏自用的东西:记事本、传文件、图床、音乐、影视、蓝奏、直播、书签、速记,热榜还能按兴趣筛一下。每样都卡着账号能力,没开对应权限的人看不见。

这些东西我自己天天用,懒得再开一堆 App。数据在 mono,页面在 Stereo。入口和接口一起卡权限,缺一不可。

一、私密记事本(vault)

私人记事本。写进去的不会跑到公开文章或动态里,得开了 vault 才能看。能写一点 Markdown,能插私密图,也能挂文件。文件在笔记里是 vault-file://{id},点开走站内代理,跳到蓝奏分享链接。

登录进去翻自己的笔记就行。写字、插图、挂文件,跟公开博客是两回事。不是把文章改成「仅自己可见」糊弄一下。

页面是 Astro 上挂的 VaultPanel,交互用 TypeScript,没再套一层 Vue。列表和详情走 vault-notes,带着登录 token,顺手查有没有权限。图不裸链,走 vault-image,转成 webp。文件记录也不直接露,正文只放那个自定义协议,前台画成卡片,再经 /vault-file/{id} 打开。

Markdown 是自己啃的一小撮:先把 HTML 转义掉,再把加粗、斜体、代码、链接、图片、文件卡片还原回来。随手写个标签,不至于把页面弄花。数据在 mono,Stereo 负责展示和卡权限。真正写入、插图、挂文件都在后台做,这边只读。

链接只认 http/https/mailto,图片只认 http/https,私密图用 vault-image://,文件用 vault-file://。知道一个 id 没用,还得对上归属。

文件没硬塞进 S3。图还走原来的私密图链路;普通文件传到配好的蓝奏目录,mono 只记记录、分享链接、提取码和引用关系。孤儿资源会清:图连 S3 一起删,蓝奏源文件只删本地记录,不动云盘。

列表能往下滚,点开看标题、时间和正文。常用 Markdown 都有。图和文件都能放进笔记,文件新窗口打开。后台能上传、打开、删记录,也能清掉没被引用的图和文件。

有些东西不想发公开,又懒得再开个备忘录,还想跟站点账号绑在一起。光有文字不够,截图、压缩包、临时材料现在也能丢进去。

二、传文件(catbox)

选个文件传上去,拿下载链接,自己这边留一条。文件实际在 Catbox,我们代传、记账。浏览器把 multipart 交给 mono,中台异步丢给 Catbox,轮询 upload-jobs,完了写回列表。复制链接、删记录都行。能看到大小和上传时间。不再选保留多久,也不走钛盘了。

还是 Astro + TypeScript。交文件,建任务,轮询,再写下文件名、大小、链接。进度条会走过上传、处理、完成。文件名后面拼一段时间戳,少撞名。单文件上限 200MB。浏览器只管交文件和看进度。能力码是 catbox,没开就没入口。

删记录先清本地。远端 deletefiles 失败只打日志,不挡你把记录抹掉。任务状态放 Redis,PM2 多实例也能查到,不然会出现「创建成功了,却轮询不到」。

临时甩个包、搬个安装文件、丢段日志,邮箱嫌大,聊天软件又压缩又过期。自建网盘太重。图个快:传完有链接,回头还能翻自己传过啥。

三、图床(gallery)

个人图床。上传、打标签、改名、批量删,也能跟 R2 对一下。地址是固定的,写文章配图、存截图都方便。网格,往下滚继续加载,能按标签筛。JPG / PNG / WebP / GIF,单张不超过 10MB,一次最多 9 张。

GalleryPanel 还是 Astro + TypeScript,上传编辑弹层自己写的。登录态打 gallery 接口:提交拿 jobId,轮询 upload-jobs,成功后再写标签。还能改信息、批量删、同步 R2。前台叫 gallery,后台能力码是 cf 这类图床 option。展示跟站点动态多图差不多,懒得再发明一套。文件在 mono / R2。

图挂在账号上,不是谁都能扔。标签没有就建,多了按标签找。勾选就能批量删。同步 R2 是给「桶里有文件、库里没记录」这种对不齐用的。上传前先查类型和大小,不合格的别浪费请求。任务同样走 Redis。删除做成幂等,库里没有的 id 直接跳过。

免费图床三天两头防盗链、限流,或者哪天没了。只放本地又没法在网页里引用。自己图床地址稳一点,配图不用看别人脸色。

四、音乐(music)

自己的曲库,底下一条播放器。按专辑翻,点歌就播。顺序、列表循环、单曲循环、随机都有。队列和进度会尽量记住,刷新还能接着听。曲库优先读本地缓存,想更新再点刷新,不用每次打开都干等。没开 music 的人,入口和接口都没有。

面板和底栏是 Astro 挂的。播放器自己写,底下就是 HTMLAudioElement。曲库走 music-library.json;localStorage 里缓存快照和播放状态。右侧一块正在播放,跟选歌、底栏分开,别挤一块。音频 URL 还是 mono / 存储出,Stereo 管听着顺不顺手。

按「听着逛站」做的,不是打开音乐页才存在、关掉就没。四种模式够用,没必要为听歌拉个巨型播放器库。进度等 metadata 好了再跳,少乱蹦。这是私人曲库,不是给访客放的背景音乐。

就想在自己站点听自己整理的歌,不想被推荐和广告缠上。干巴巴的外链列表又难用。塞进日常路径里,登录就能听,听着还能去干别的。

五、影视(tv)

登录能搜片、收藏,也能刷豆瓣热门电影和剧集,点进详情看评分和热评。播放页能续看,右侧有「接着看」。HLS,经 mono 的 hls-proxy。能记片头片尾跳过,剧集会自动连播。列表用文字海报,不拉封面。没有「随便看看」。

弹幕也接了。进片按片名和集数去对一下,对上了就按时间轴飘;对不上或对错了,自己搜片名换一条。显隐用 DPlayer 自带按钮,默认关,记在 sessionStorage,切集重建播放器还在。面板能看匹配到哪、有多少条,薄厚、高度、字号也能调。

片源走 /web/tv/source/*,iyf 签钥取流。浏览器只拿 m3u8,再包成 hls-proxy。豆瓣、历史、收藏、跳过、弹幕还是 /web/tv/*

这块交互最重,所以用了 Vue islands。播放器是 DPlayer,hls.js 按需挂。搜片、选集、取流走 source。搜索历史放本地,输入框聚焦才出 popover,能单项清也能清空。

hls-proxy 只代理 *.pipecdn.vip,请求上游补 Origin / Referer / UA,清单里的分片地址回写到代理,免得浏览器直连 CDN 被拦。没登录或没 tv,打发回文章流。

弹幕不是直播那种立刻全刷上屏。按 time 排好,塞进 DPlayer 时间轴,跟着 currentTime 往外冒。加载完再 clear + seek 对齐,拖进度条也不会满屏乱飞。

该重的地方用 Vue,别的页面还是 Astro。密钥和签名留在 mono。文字海报省掉封面防盗链那一堆。续看和跳过跟账号走,换设备还能接着。弹幕先自动匹配,歪了手搜;默认关着,切集还记得。VOD 按时间轴出,别跟直播 draw 混用。

旧片源挂了换成 iyf。不是要取代正版,就是给自己弄个顺手的观影台。片能播了画面还干巴巴的,想看吐槽还得另开播放器。现在播着就能飘。

六、蓝奏文件管理(lanzou)

/?tab=lanzou。不是公开网盘,就是给有 lanzou 能力的人管自己的蓝奏文件。进去先填 ylogin 和 phpdisk_info,只存在当前浏览器 localStorage,不入库,也不写日志。后面列目录、上传、复制分享、开新窗口、建文件夹、丢回收站,都带着这份 Cookie 打 mono。

Stereo 还是 Astro + TypeScript,没上 Vue。UI、面包屑、连接设置、选文件、toast 在这边。真正碰蓝奏的是 mono 的 WebLanzouService。上传也不是 Stereo 代理:文件交给 mono,临时落盘再转发给蓝奏,完了删临时文件。限制从 lanzou/status 来,最大 100MB,只允许官方支持的扩展名。前端选中就先拦一遍。

Cookie 只留在你浏览器里,mono 随请求用,不持久化。写操作限得更死,还按客户端串行,免得一个账号同时打太多。只读接口 Redis 缓存 120 秒;upload / delete / mkdir 不缓存,写成功清掉 lanzou scope。

蓝奏接口不太稳,分享信息里 name、name_all、folder_name、url 都做了兼容。login not 会明确说登录失效。上传失败尽量把蓝奏返回的 info / text 透出来。中文文件名也按实际上传链路修过。

UI 按文件管理器来:当前路径和上传位置写清楚,按钮就叫「上传到此处」。打开、复制链接、移入回收站都有。图标按扩展名走 vscode-icons,至少 txt、pdf、zip 不会长一个样。

蓝奏适合放小文件,但每次进它网页后台挺烦。只是想看目录、传个文件、复制链接,没必要绕一圈。不替代完整后台,只管我自己高频用的那几步。

七、直播(live)

电视直播

侧栏影视下面,「直播」,地址 /?tab=live。电视机加遥控器。上面播,桌面遥控在右侧发现栏,窄屏掉到主栏下面。数字键、CH、热门键切台。

源是华视 IPTV。台单同步进 MySQL,playlist 走 mono 的 HLS 代理;分片在清单里留着 CDN 绝对地址,浏览器直连,不再经 mono 中转带宽。Cookie 本机登记三项:cf_clearance、CF_HUAREN_LIVE、server_name_session,请求时拼成 X-Huavod-Cookie,不入库。

Stereo 是 LiveApp,Vue Options API。电视机壳、hls.js 播放、遥控、Cookie 对话框。台号逻辑在 channel-zap:数字连按,停大约两秒或按 OK 切台,超出总数取余,画面有 OSD。

mono 这边,channels 读已同步台单,hot-channels 读热门地方台快捷键,sync 抓 liveshow/1+2 写入 MySQL,并按 Cookie 指纹预热 Redis 里的 streamUrl。播放地址固定 /web/live/huavod/hls?id=。playlist / KEY 走原生 HTTP 代理;.ts 分片浏览器直连 CDN。hls.js 只对 mono 的 hls/asset 带 Bearer 和 Cookie。

旧的 TXT 节目单、udpxy、mpegts.js、stream-proxy 都扔了。Admin /setting 还能配热门地方台,能拖排序。Web 会话大约 30 秒进程内缓存,能力校验复用当前会话,少回库。

你只关心台号和画面。Cookie 留浏览器,mono 按指纹隔离缓存。streamUrl 默认大约 30 分钟;playlist 403 会记存活时长,大概 80% 寿命时后台提前换签。hls.js 碰到 fatal,先 startLoad,再短延迟重挂,最多两次。切离直播 tab 先停再卸,免得后台还在出声。能力码是单独的 live,跟影视 tv 分开。

以前本地 TXT + TS 中转,CORS 和混合内容自己打架,后来浏览器→mono→CDN 带宽又顶不住。现在台单固化,playlist 代理,分片直连。Cookie 挂了就重新登一下华视再同步。想看电视,按台号切就行。

八、书签(bookmarks)

图片描述

侧栏「文件与笔记」里,「书签」,/?tab=bookmarks。一份站点共享书签池。浏览器扩展把 Edge / Chrome 书签同步上来,前台按文件夹树展示,经常访问有个 Top10。点开记一次访问,不需要的可以删云端记录。同步走 Client API,x-oolaf-client-key,不是在网页里一条条加。Stereo 只负责读、点开、删除;写目录结构是扩展那边。

BookmarksPanel,Astro + TypeScript。GET /web/bookmarks 返回 items 和 folders,按 positionPath 还原 Edge 同层顺序,空文件夹也在。经常访问、记访问、删除各走 frequent / visit / delete。表是 web_bookmark 和 web_bookmark_folder。Client POST /client/bookmarks/sync 全量换 folders。删除只动 MySQL,不动你本机浏览器书签。

光有链接列表不够。空文件夹、同层交错顺序都得回来,不然看起来就不像自己那份。Top10 日常少翻树。全员共享同一份池子,家里几台机器对着同一套收藏夹挺合适。

换电脑或重装浏览器,收藏夹对齐很烦。扩展同步一次,登录就能翻。

九、速记(dump)

导航「速记」,/?tab=dump。私人单会话,长得像聊天。气泡往下排,能发文字、备注、附件,事后也能改正文。不是公开动态。

附件任意类型最多 5 个。小于 10MB 走 mono 上传 dump_small,默认 MinIO;10MB 到 500MB 预签名直传 dump_large,默认 R2。选文件或拖拽先暂存在 IndexedDB,点发送再传。图片优先缩略图,点开 PhotoSwipe;多图列表只露首图加 +n。

DumpApp 是 Vue island。进页先读 IndexedDB 最近一页,再后台拉齐。待发附件也在 IndexedDB。可以 #备注 正文,备注不超过 20 字,也能事后改。发送端带 pc / mobile,分组旁有设备图标。

表是 dump_message / dump_attachment。小文件上传和大文件 complete 尽量出 WebP 缩略图,最长边 720,GIF 跳过。删消息只删库,不删对象文件。

秒开靠本地快照。附件先暂存,刷新也不会把刚选的弄丢。索引按备注和上海时区日期下钻。PC 是 Enter 发送、Shift+Enter 换行;手机反过来,另有发送按钮。图片从缩略图 zoom 进出。PC 预览栏有下载,移动端没有。

临时链接、截图、说话碎片、稍后处理的文件,既不像正式笔记,也不想发动态。丢进同一会话,手机电脑都能扔,回来按备注或日期翻。

十、热榜一键发现(hotlist-discover)

今日热榜是公开的,导航在意见反馈上方,也可以 /?tab=hotlist。不登录也能刷。登录相关的是「一键发现」:账号要开 hotlist-discover,才会出现兴趣标签栏和按钮。

本地写几个兴趣标签,点一下。服务端拿当前可见的热榜标题去问 AI,常见是 DeepSeek,按标签筛一圈,命中的高亮。标签只存在浏览器,不入库。

HotlistApp,Vue island。列表经同源 /hotlist.json 转发,浏览器不直连 /web/hotlist*。一键发现走 BFF 的 analyze,落到 POST /web/hotlist/analyze

中台大约 30 个平台采集器,结果进 Redis,成功 TTL 8 小时。列表只读缓存立刻返回;缺源或失败的丢后台补采,并发大约 3,单源最多 2 次。失败尽量留上一份。analyze 走 AI JSON,强制关 thinking,校验 source/id/tags,把幻觉条目滤掉。限流大概每 IP 6 次/小时。

谁都能看热榜;带 AI 筛选才要权限。平台卡一行两列,卡内新闻也是两列。桌面每平台最多 20 条,窄屏 10 条,analyze 只提交当前看得见的那些。省略标题用浮层提示全称,命中的跟着高亮描边。

热搜平台多,刷一圈费眼。公开页先拢到一起;开了发现权限,按自己关心的词把相关标题标出来就行。

评论

在这里阅读读者对这篇文章的讨论。

暂无评论