# yao-media **Repository Path**: yao-coder/yao-media ## Basic Information - **Project Name**: yao-media - **Description**: 让喜欢的内容,随时留存。 一条链接,收藏每一份灵感。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-19 - **Last Updated**: 2026-10-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # YAO Media 免费、无广告的媒体解析与下载网站。粘贴分享链接或完整分享文案,即可解析公开作品、预览并保存支持的媒体格式。 [在线使用](https://media.yaoiw.com/) · [Gitee 源码](https://gitee.com/yao-coder/yao-media) · [部署指南](deploy/native-host/GIT-DEPLOY.md) · [项目文档](docs/README.md) **部署方式:** 服务器从 Gitee 拉取指定提交,原地编译并发布。实际版本与状态见 `.runtime/last-publish.json` 和服务端发布记录。 ## 功能与平台支持 下表结合当前代码与仓库内发布记录说明支持范围;实际可用类型以服务端能力开关和本次解析结果为准。历史样例通过不保证任意作品均可访问,也不代表当前提交的全部功能都重新完成了公网验收。 | 平台 | 状态与格式 | 范围 | | --- | --- | --- | | Bilibili | MP4、MP3、兼容 AAC 的 M4A;另有专栏/动态图片与正文适配 | 公开单视频、指定分 P、`b23.tv` 短链;支持扫码授权自己的账号,只展示当前来源与账号实际可用的清晰度,分离音视频轨在下载时合并 | | 小红书 | MP4、MP3、兼容 AAC 的 M4A、单图、图集 ZIP、正文 TXT | 公开视频及图文笔记,支持 `xhslink.cn` 分享链接;视频和图集已有公网完整下载验证,HEIC 图片使用经校验的同源 JPEG 版本提供预览与下载 | | 抖音 | MP4、MP3、兼容 AAC 的 M4A、图片、正文;LIVE 放大后静音自动播放 | 2026-10-30 已移除 LIVE 原生控件遮罩,播放/重播及声音按钮位于画面下方;原链接桌面及窄屏共 8 次自动播放与两组控件操作通过,详见 [预览验收](work/verification/douyin-live-clean-preview-20261030/README.md);4 个完整 MP4 下载见 [此前线上验收](work/verification/douyin-live-bootstrap-20261029/README.md);不等同于原生 iOS 实况照片导出 | | 快手 | MP4、MP3、M4A,已发布并通过公网验收 | 公开视频分享页及原声音轨 | | 微信视频号 | MP4、MP3、M4A、公开文案 TXT、封面图片 | 两个 `sph` 样例已通过专用元宝会话的自建解析及生产验收;会话需维护,公开路径按实际可用内容回退 | | 微博 | MP4、MP3、M4A,已有生产样例验收 | 使用平台官方匿名访客初始化读取作品信息,不使用用户账号 Cookie | | 微信公众号 | 文章正文 TXT、单图与图片文案 ZIP,已发布并通过公网验收 | 与视频号独立;按实际内容提供正文及图片,纯文字可下载,保留图片水印;视频和音频尚未验证 | | TikTok | MP4、MP3、M4A,已有生产样例验收 | 通过专用代理读取公开作品,地区重定向不当作作品结果 | | X | MP4、MP3、M4A、图片和正文 TXT | 视频、图片帖与纯文字帖已有生产样例验收;长文按实际取得的全文或公开摘要展示 | | YouTube | 匿名播放器解析及音视频处理已实现;开放状态需核对 | 现有验收记录仍标记 `VERIFYING`,包含完整下载成功与来源过期等失败;不能据部分成功宣称稳定开放 | | Instagram | MP4、MP3、M4A,已有生产样例验收 | 读取精确作品的官方公开嵌入页,校验 shortcode 和媒体 ID | | Google Drive | 已实现公开 MP4、MP3、M4A、图片与 PDF 原文件下载 | 仅匿名可访问的单文件分享,不支持文件夹或在线文档;PDF 下载上限 100 MiB、全文预览上限 20 MiB,V18 初始能力为 `VERIFYING` | | 米游社 | MP4、MP3、兼容 AAC 的 M4A、图片和正文;已上线 | 支持桌面文章链接和移动端 `#/article/` 分享链接,读取官方公开帖子接口;首页点击“查看更多”展示 | | 两步路 | MP4、MP3、兼容 AAC 的 M4A、图片和正文;已上线 | 支持 APP 公开动态分享链接 `/spaceindex/personal_dynamic_new.htm?did=…`,保留编码后的动态标识,分页读取正文图片;[功能提交](https://gitee.com/yao-coder/yao-media/commit/46a01a79db93f3a606c58e236958de687fe13194),发布后未重跑功能验收 | | Telegram | 已上线;正文 TXT、单图、相册 ZIP 和 MP4 已于 2026-10-29 通过公网完整下载验收;原声音轨提取已实现,本轮未实测 | 支持 `t.me/<频道>/<消息编号>` 公开帖子,读取官方公开页面;可配置独立固定代理,见[出口配置与维护](deploy/native-host/TELEGRAM-PROXY.md);私有频道和需登录内容不在支持范围内 | | 小黑盒 | 原图、图片 ZIP、正文 TXT | 支持官方 APP 分享及网页帖子链接,匿名读取官方公开图文;不含评论、头像和推荐图片,视频尚未适配 | | 王者营地 | 原图、图片 ZIP、正文 TXT | 支持 camp.qq.com 公开帖子分享链接,匿名读取官方图文;保留正文图片顺序,视频尚未适配 | | TapTap | 公开视频 MP4、MP3 音频、封面和正文 TXT | 支持 `taptap.cn/moment/...` 公开动态;分片视频由服务端安全下载后合并,暂不提供视频直连 | - **解析与下载:** 识别分享文案、展示标题与作者、视频和封面预览、规格选择、任务取消、刷新恢复。 - **B 站账号:** 可从 B 站解析结果或需要授权的错误页打开官方扫码登录;授权后显示账号状态入口,需主动重新解析以取得账号有权观看的完整内容。凭据加密保存在服务端 Redis,仅供当前访客使用,最长保留 24 小时且不超过访客会话期限。每个任务固定授权版本,授权结果不进入公共解析缓存;退出或换号不会把新账号套用到旧任务,不绕过账号权限或 DRM。 - **视频保存:** 当前代码会为选中的视频规格在后台预先准备文件,点击保存时复用或提升同一任务;预热失败不阻止手动保存。兼容的 iOS 浏览器提供系统分享入口,仍需用户在系统面板中完成保存,是否提供入口由浏览器能力和文件大小决定。 - **媒体限制:** 默认输入和输出各最多 2 GiB,媒体时长最多 12 小时,下载准备期限 20 分钟,文件传输期限 40 分钟,主动保存的成品保留 60 分钟;未转为主动保存的预热成品保留 5 分钟。图片、PDF 和相册分享另有限制,实际速度取决于网络。详见[媒体容量与发布](deploy/native-host/LARGE-MEDIA.md)及[默认限额](backend/media-infrastructure/src/main/java/com/yao/media/infra/LimitDefaults.java)。 - **页面体验:** 响应式布局,默认浅色、明暗一键切换,Enter 解析、数字渐变计数与统一交互动画。 - **解析历史:** 当前浏览器保存最近 200 条解析摘要,可搜索、查看源链接、重新解析或删除,不保存临时媒体票据。 - **反馈通知:** 加密存储反馈,补充短时冷却、内容去重与全站额度;可由 Worker 的专用签名机器人异步通知维护者飞书群。配置和限制见[历史与飞书运维](docs/operations/history-and-feishu.md)。 - **成功统计:** 累计与北京时间今日解析数只计成功;失败、取消和重复完成不会增加计数。 - **内部维护:** 平台能力开关、反馈处理、长期解析记录与搜索、失败链接核查、平台统计与平均耗时、每日日报查询与发送计划管理、运行指标、排空发布、加密备份与恢复。管理记录与当前浏览器的个人历史独立。 - 小红书、公众号、X、米游社与两步路已有图片/正文支持;其他平台的图文适配按具体作品与 IMAGE/TEXT 开关提供,不能一概视为已验收。视频原声属于音频,不等于独立背景音乐。 - 平台能力按类型控制;单条作品成功不代表所有作品均可访问。 - V8 迁移仅默认启用快手 VIDEO/AUDIO,其余新平台初始为 `VERIFYING`;已有运营开关不被覆盖,首页只展示已启用平台。生产当前开关以实际公网验收和维护记录为准。 - V9 独立补录微信公众号 IMAGE / VIDEO / AUDIO,初始均为 `VERIFYING`;图文适配只保存当前文章公开提供的正文图片与文案,不把文章朗读标识或空视频信息当成音视频来源。 - 公众号文章的“图片”页签展示提取出的图片,“图文”页签按原文顺序展示文字与图片,阅读模式也保留这一顺序;纯文字文章显示“正文”。复制及 UTF-8 TXT 仅保存文字,图片可单独下载或打包为 ZIP。V10 新增独立 TEXT 能力及数据库约束,需要迁移发布,不能沿用仅补录数据的自动发布路径。 - X 等返回媒体位置的文章可按正文顺序内联展示图片与视频,阅读模式保留相同顺序;实际展示以本次取得的正文和媒体为准。 - V11 仅补录视频号 TEXT / IMAGE,初始 VERIFYING;提高媒体时长限制时需要同步核对 Runner 配置。见[平台修复发布流程](deploy/native-host/PLATFORM-REPAIR.md)。 - V17 补录各平台缺失的 IMAGE/TEXT 能力,初始 `VERIFYING`;登记能力不等于启用或完成验收。V18 增加 Google Drive 与 PDF 文件约束,需显式迁移发布。 - V24 为解析任务记录 Bilibili 授权会话引用,账号凭据仍加密保存在 Redis;授权功能需同步发布前端、API、Worker 与迁移。 - V25 补录米游社 VIDEO / AUDIO / IMAGE / TEXT 能力,已有平台开关不被覆盖;代码与迁移需一起发布。 - V26 增加下载预热/主动保存状态,需与 API、Worker、Web 同步发布;不能只更新前端。全部实际迁移以 [Flyway 目录](backend/media-infrastructure/src/main/resources/db/migration/)为准。 - V27 补录两步路 VIDEO / AUDIO / IMAGE / TEXT 能力,保留已有运营开关;需要与前端、API 和 Worker 一起发布。 - V28 补录 Telegram VIDEO / AUDIO / IMAGE / TEXT 能力,缺失能力初始为 `ENABLED`,保留已有运营开关;需要与前端、API 和 Worker 一起发布,登记能力不代表已经发布或完成公网验收。 - V29 仅补录王者营地 IMAGE / TEXT 能力,缺失能力初始为 `ENABLED`,保留已有运营开关;需与前端、API 和 Worker 一起发布。 - Telegram 可选 `YAO_MEDIA_TELEGRAM_PROXY`;留空沿用全局代理,有值时仅 Telegram 使用已验证的固定 listener。API 与 Worker 必须一致,并在维护排空后同步设置和重启;解析、预览与下载沿用同一配置,不提供动态自动切换。操作见[Telegram 固定出口配置](deploy/native-host/TELEGRAM-PROXY.md)。 - 默认使用公开访问路径;Bilibili 可使用当前访客主动授权的账号,微信视频号可使用维护者明确授权的专用元宝会话,并通过腾讯接口取得媒体,不接入第三方代解析服务。视频号凭据维护见[专用会话运维](docs/operations/wechat-authorized-session.md)。 ## 技术栈 | 层次 | 技术与版本 | | --- | --- | | 前端 | Next.js **16.4.2**、React **19.3.1**、TypeScript **5.9.3** | | 样式与状态 | Tailwind CSS **4.3.3**、Zustand **5.0.15** | | 后端 | Java **21**、Spring Boot **4.1.1**、Tomcat **11.0.27** | | 数据访问与认证 | MyBatis-Plus **3.5.17**、Sa-Token **1.46.0** | | 存储 | 独立 MySQL **8**、Redis **7** | | 媒体与浏览器 | FFmpeg/FFprobe、Bubblewrap、Playwright、Chrome | | 运行与发布 | Node.js **24**、Nginx、systemd、Docker 隔离沙箱、Git 源码部署 | 依赖锁定以 [前端 package.json](apps/web/package.json)、[后端 POM](backend/pom.xml)及各运行镜像配置为准。 ## 系统架构 ```mermaid flowchart TB User[用户浏览器] -->|HTTPS| Nginx[Nginx] subgraph Native[宿主机 · systemd] Nginx --> Web[Next.js Web] Nginx -->|业务与媒体接口| API[Java API] API --> MySQL[(MySQL · 持久任务与数据)] API --> Redis[(Redis · 会话与限流)] Worker[Java Worker] --> MySQL Worker --> Redis end subgraph Isolated[Docker · 非 root · 无直接网络] Browser[隔离浏览器 · 元数据] Runner[媒体 Runner · FFmpeg] end Worker -->|Unix RPC| Browser Worker -->|Unix RPC| Runner Worker -->|受控 HTTP · DNS/IP 校验| Public[公开媒体来源] Git[Gitee · 指定提交] --> Build[服务器编译] Build --> Release[releases / current] Release -.-> Web Release -.-> API Release -.-> Worker ``` - **API** 负责加密接口、任务受理、所有权校验及媒体传输;**Worker** 执行解析与文件准备。 - 浏览器网络请求由 Java 受控转发;媒体 Runner 在无网络环境处理文件。 - 生产采用宿主 Nginx + 原生服务,仅浏览器与媒体 Runner 使用容器。完整 Compose 保留作开发、隔离验收及备选部署。 ## 目录结构 | 路径 | 职责 | | --- | --- | | `apps/web/` | Next.js 页面、组件、状态与交互测试 | | `apps/browser-provider/` | 隔离浏览器元数据服务及 Unix RPC 协议 | | `backend/media-contract/` | 媒体、任务和执行上下文契约 | | `backend/media-infrastructure/` | 数据库、加密、事务、限额及迁移 | | `backend/media-adapters/` | 平台解析、安全 HTTP 获取与媒体准备 | | `backend/media-api/`、`backend/media-worker/` | 公共/维护 API 与后台任务 | | `backend/media-sandbox-runner/` | 隔离媒体处理服务 | | `deploy/` | 原生部署、Nginx、沙箱和 Compose 配置 | | `scripts/` | 开发启停、一键发布、维护与验证工具 | | `docs/`、`work/verification/` | 设计文档、验收对照与历史验证记录 | ## 本地开发 当前一键开发流程面向 **Windows + PowerShell + WSL2**。准备 Java 21 JDK、Maven、Node.js 24、Python(含 `cryptography`)与 WSL。 ```powershell # 首次准备独立开发数据库、密钥与媒体工具,并构建启动 .\scripts\bootstrap-dev.ps1 # 检查服务 node scripts/check-health.mjs ``` 访问 **https://localhost:3443/**。本地使用项目证书,不自动修改系统证书信任;密钥和日志保存在被 Git 忽略的 `.runtime/`。 ```powershell # 修改代码后重新构建启动 .\scripts\stop-dev.ps1 .\scripts\start-dev.ps1 # 已有构建产物时快速启动 .\scripts\start-dev.ps1 -SkipBuild # 停止本项目进程 .\scripts\stop-dev.ps1 ``` 开发脚本使用独立 `YaoMediaDev` 环境,不替换电脑原有数据库。隔离浏览器服务运行于 Linux 环境,Windows 一键开发脚本不启动该服务;相关能力需另行准备,见[浏览器服务说明](apps/browser-provider/README.md)。 ### 构建与测试 ```powershell mvn -s backend/maven-settings.xml -f backend/pom.xml verify Set-Location apps/web npm ci npm exec -- next typegen npm run typecheck npm run lint npm test npm run build Set-Location ../.. # 隔离浏览器服务的单元测试(不启动真实 Chrome) Set-Location apps/browser-provider npm ci --ignore-scripts npm test Set-Location ../.. ``` 数据库集成测试需要显式启用 `YAO_INTEGRATION_TESTS=true`,并配置独立的 `*_test` MySQL 库及 Redis;未启用的可选测试不计为通过。外部平台测试另行启用。现有 [GitHub Actions 配置](.github/workflows/ci.yml)可供迁移或镜像仓库使用,不会由 Gitee 推送自动运行。 ## 加密接口与安全 | 边界 | 实现 | | --- | --- | | JSON 业务接口 | HTTPS + 双向 JWE,绑定通道、请求与响应,校验时效、防重放与 CSRF | | 预览与下载 | 授权票据、HTTPS 流与 Range;不把媒体二进制包装进 JWE | | 匿名任务 | 访客所有权校验、幂等提交、持久租约与 fencing | | 来源访问 | 公网 DNS/IP 校验、连接固定、重定向检查及请求/字节/时间预算 | | 处理隔离 | 非 root、无直接网络、只读文件系统及 CPU/内存/进程限制 | | 运维与数据 | 私有维护入口、分层限流、加密存储与备份、脱敏日志 | 这些措施不等同于边缘 WAF 或大流量 DDoS 防护。生产密钥、数据库与媒体临时文件不进入 Git;详见[安全与加密设计](docs/04-安全与加密设计.md)。 ## 生产一键发布 **发布流程:** 本地提交 → 核对线上版本与发布锁 → 按变更范围检查 → 推送 Gitee → 服务器在锁内复核版本和范围 → 构建所需产物 → 切换 `current` 并验证。仅允许的说明文档变化为 `none`,只推送;已有平台图标替换可走 `static`,复用构建并只重启 Web;其他前端变化为 `web`,只构建和重启 Web;后端、部署脚本及未知范围为 `full`,执行完整构建、排空和应用切换。图标更新说明见[平台图标快速更新](apps/web/public/brand/platforms/README.md#fast-updates-of-existing-icons)。 本机发布检查还需要 Python **3.12**(Windows 通过 `py -3.12` 调用),且 Maven 离线测试所需依赖须已缓存;首次可先运行上方联网构建与测试命令。 首次配置: ```powershell New-Item -ItemType Directory -Force .runtime Copy-Item deploy/publish.example.json .runtime/publish.json # 编辑配置中的服务器、SSH 私钥路径;先核对服务器 SSH 指纹。 ``` 日常发布: ```powershell git add <本次发布的文件> git commit -m "更新页面与解析功能" .\scripts\publish.ps1 -Plan .\scripts\publish.ps1 ``` - 默认只发布已有提交;已跟踪文件有未提交修改时拒绝发布。`-CommitTracked -Message "..."` 显式提交全部已跟踪文件的修改,未跟踪文件(如 `work/` 下的产物)始终不会提交。 - `-Plan` 显示线上基线、检查、构建与重启范围;`-Full` 强制完整发布;`-Recheck` 忽略 24 小时内同提交、同基线、同工具环境的成功检查缓存。目标提交必须包含线上提交,并发发布改变线上基线时会停止。 - 推送前在临时目录导出该提交,按范围检查:`static` 只核验变更资源;`web` 执行 `npm ci`、lint 和前端单元测试;`full` 另加部署 Python 回归与后端 `mvn -o test`。任一失败即停止,不推送、不部署。`-CheckOnly -BaseCommit <线上提交>` 可离线检查;没有基线时保守执行完整检查。 - 应用在服务器构建,不再上传 JAR 或前端压缩包;编译失败不停止现有网站。发布前保留下载并发所需空间及 3 GiB 构建余量。 - 发布任务由后台 systemd 执行,SSH 断开不终止构建。切换失败会尝试回退;自动保留当前版本、最近三个成功回滚版本及所有运行引用版本,详见[清理规则](deploy/native-host/RELEASE-RETENTION.md)。 - `full` 更新 API/Worker/Web,`web` 与 `static` 保持后端服务运行;已预构建、通过脚本严格校验的浏览器代码补丁镜像可随完整发布协调切换。浏览器依赖或隔离边界变更、媒体 Runner 及未登记的数据库迁移仍需独立审查与发布;数据库服务不会随应用重启。 - 最近发布回执:`.runtime/last-publish.json`;以服务端 `SUCCEEDED` 和实际服务状态确认结果。 参数、服务器前置条件及故障处理见[一键源码发布](deploy/native-host/GIT-DEPLOY.md);完整安装与运维见[部署运行](docs/06-部署运行.md)。 ## 文档与验证 | 主题 | 入口 | | --- | --- | | 产品范围与验收要求 | [需求说明](docs/01-需求说明书.md)、[全量验收对照](docs/08-全量验收对照.md) | | 架构与接口设计 | [架构方案](docs/02-项目架构方案.md)、[详细设计](docs/03-详细设计方案.md) | | 日常维护 | [备份与恢复](docs/维护恢复.md)、[运维趋势](docs/运维趋势监控.md) | | 三平台真实分享链路 | [解析、预览与完整下载验证](work/verification/douyin-browser-native-release/README.md) | | 扩展平台与代理 | [真实样例验证及当前限制](work/verification/extended-platforms/README.md)、[海外平台代理配置](docs/海外平台代理.md) | | 清晰度、图集与新增平台 | [Bilibili 清晰度实现](https://gitee.com/yao-coder/yao-media/commit/cd9e3438f135fa6cd49a6f6487c482caf77997fa)、[小红书视频与图集](work/verification/xhs-resilience-20261025/README.md)、[米游社开发验证](https://gitee.com/yao-coder/yao-media/blob/91b2487cae6ee0c218e110b1146a8153819433e1/work/verification/miyoushe-20261026/README.md)、[两步路功能提交](https://gitee.com/yao-coder/yao-media/commit/46a01a79db93f3a606c58e236958de687fe13194) | | 管理与通知 | [解析记录](work/verification/parse-records-20261021/README.md)、[失败链接核查实现](https://gitee.com/yao-coder/yao-media/commit/a18a5303eeaceb33e1d1bb38f78eed45c769d00e)、[日报工作台](https://gitee.com/yao-coder/yao-media/blob/2769c80c6f9629a8c1523e69d2f3d0f7b86c97ae/docs/operations/history-and-feishu.md)、[飞书日报](docs/operations/parse-daily-feishu.md) | | 历史测试与剩余事项 | [验证记录](work/verification/)、[文档目录](docs/README.md) | 尚未完成的范围包括部分平台/媒体类型的完整样本矩阵、独立音乐来源、部分移动设备真机兼容性及完整 24 小时稳定性验证;当前配置的容量结果不替代原 4 vCPU/8 GiB 参考条件。各阶段结果绑定当时版本,历史记录不代表最新提交全部重跑。小红书 HEIC 兼容的开发验证与后续发布整合分别见[专项记录](https://gitee.com/yao-coder/yao-media/blob/347d0ec8993c5b4c83b654adef6066b86190cc21/work/verification/xhs-heic-20261027/README.md),不能把原本地测试视为发布提交的重新验收。