TGViewer
开发者工具箱|编程·开发工具·资源 开发者工具箱|编程·开发工具·资源 @devtoolboxhub · 779 subscribers
Post #1887 2
SaveNowX 无落盘下载 X 视频的架构设计

SaveNowX 是一个免费工具,把公开的 X(Twitter)帖子解析成可下载的视频,无需账号、无水印、不留历史记录。作者在开发之初设下一条硬约束:服务器端任何内容都不落盘,不存视频文件、不存下载历史,也就没有清理和泄露的问题。这条约束逼出了一系列架构决策。
解析接口 GET /api/resolve?url= 只返回元数据和 CDN 地址,从不下载或代理任何视频字节。它优先走 X 的公开 syndication 接口,失败时才回退到 yt-dlp。结果按推文 ID 缓存,成功解析缓存 1 小时,确认「无视频 / 未找到」只缓存 5 分钟,避免错误链接被反复请求时持续打后端。
解析出直链 MP4 后,后端完全不参与传输。下载按钮指向一个 Cloudflare Worker,它唯一的工作是设置 Content-Disposition: attachment 响应头,因为浏览器会忽略跨域链接上的 HTML download 属性。视频直接从 X 的 CDN 到用户设备,FastAPI 后端一个字节都看不到。

对于只有 HLS 的帖子(.m3u8 加一堆 .ts 分片),重定向无法生成单个文件,需要真正抓取分片并重新封装。这类情况走一套任务系统:POST /api/download/url-start 启动,GET /status/{id} 轮询真实进度,GET /file/{id} 取回文件,发送完成后立即删除临时文件。MP3 提取则把最低码率的音频变体通过 ffmpeg 直接管道输出到 HTTP 响应流,不写中间文件,并发转换数有上限。

整套技术栈是 Next.js + FastAPI + Cloudflare Worker。作者认为,把「永不存储」当作硬性架构约束而非事后补上的策略,才催生了 syndication 优先、双 TTL 缓存、边缘 Worker 替代后端代理、临时文件不跨请求存活这些设计。
More from @devtoolboxhub
  1. Sep 28, 2026GitHub 的 pull_request_target 改动会破坏什么 GitHub 今年调整了 pull_request_target 的运作方式,两项带日期的变更会影响所有使…
  2. Sep 27, 2026Instagram 字体生成器:把普通文字换成 Unicode 样式 Instagram 字体生成器是一类在线工具,把普通字母转换成外观不同的 Unicode 字符,再复制粘贴到…
  3. Sep 27, 2026用一个下午审计公司里的重复性工作 多数公司不需要耗时半年的转型项目,才能发现时间到底流失在哪里。花几个小时追踪三个真实工作流,就能看出很多问题。关键不是问团队哪里效率低,也不是凭记…
  4. Sep 27, 2026竞品关键词调研的自动化流程 从竞品差距分析导出两万个关键词,约一半只是同一词换了词序。真正的瓶颈在导出之后那一小时:一个好问题变成一堵近似重复词组成的墙,外加三种不同口径的搜索量。…
  5. Sep 26, 2026PostgreSQL 复制槽上限参数 max_replication_slots 解析 max_replication_slots 决定共享内存中复制槽数组的长度,仅此而已。它不决…
  6. Sep 26, 2026五仓库架构踩坑:Gitlink 与双 CI Flude 团队复盘了多仓库架构的实践代价。项目从第一分钟起就选择拆分成独立仓库,Pipeline、engine、design-docs…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →