音视频桌面应用后端【免费下载链接】mediago跨平台视频提取工具支持流媒体下载、视频下载、m3u8 下载及 B站视频下载提供 Windows 和 Mac 桌面客户端。Cross-platform video extraction tool: Supports streaming download, video download, m3u8 download, and Bilibili video download, with desktop clients for Windows and Mac.项目地址https://gitcode.com/caorushizi/mediago点击查看免费下载MediaGo 把整个下载引擎任务管理、批量下载、媒体嗅探解析暴露为一个 HTTP 服务桌面端监听39719端口Docker 部署监听9900端口。任何会说 HTTP 的客户端——curl、Python、Node.js、Postman、自动化平台——都可以直接驱动它创建、启动、停止下载任务并接收实时事件MediaGo 自己的浏览器扩展和 AI Skill 也只是这套 API 的普通消费者。读完本文你可以脱离图形界面用脚本或 Agent 完整编排发现媒体源 → 创建下载 → 订阅完成通知的自动化流程并理解每个接口背后的源码实现。基础信息接口地址部署方式Base URL桌面端http://localhost:39719Dockerhttp://服务器地址:9900按实际端口映射调整所有接口都在/api前缀下本文示例默认使用桌面端的39719端口Docker 部署请自行替换。桌面端口并非拍脑袋定的数字Electron 端启动 Core 进程时把它作为首选端口写入见 downloader.server.tspreferredPort: 39719官方 CLI 的默认 Base URL 同样是http://127.0.0.1:39719见 main.go。响应包络所有/api/*接口都返回统一的 JSON 包裹结构{ success: true, code: 0, message: ok, data: { ... } }字段类型说明successbool业务是否成功codenumber业务错误码0表示成功messagestring人类可读的提示dataany实际响应载荷结构因接口而异这个包络在源码中就是 response.go 里的一对结构体SuccessResponse用于成功路径ErrorResponse用于失败路径后者还额外带一个errorCode字段omitempty便于程序化地区分具体错误类别。本文下文示例中的响应只展示data字段的内容。认证桌面端默认无需认证直接请求localhost:39719即可Docker 部署启用认证时在 MediaGo设置页面中获取 API Key之后的每个请求都要带Authorization: Bearer key头。此外Docker 部署还有独立的/api/docker/*路由组在 router.go 中注册含docker/status、docker/downloads等用于容器代理场景与主/api/downloads路由并存。快速上手三步串起完整下载流程下面用三条命令串起新建 → 下载 → 完成通知的完整流程。1. 创建下载任务curl -X POST http://localhost:39719/api/downloads \ -H Content-Type: application/json \ -d { tasks: [ { type: m3u8, url: https://example.com/video.m3u8, name: 我的视频 } ], startDownload: true }type下载类型可选m3u8/bilibili/direct/youtube/mediagourl视频链接name任务名称会作为保存文件名startDownload创建后是否立即开始下载。响应data部分DownloadTask[][ { id: 123, name: 我的视频, type: m3u8, url: https://example.com/video.m3u8, status: waiting, createdDate: 2026-04-23T10:00:00Z } ]记下返回的id后续接口都会用到。从源码看这个创建即下载的行为DownloadHandler.Create先把请求体绑定为AddDownloadBatchReq逐条构造AddDownloadTaskInput后交给DownloadTaskService.AddDownloadTasks入库如果startDownload为true它会读取运行时配置里的local保存目录与deleteSegments是否删除分片再对每个新任务调用StartDownloadIfNeeded自动拉起下载——见 download.go。这里还有一个文档没展开的细节批量创建成功后处理函数会通过 SSE Hub 广播一条download-create事件载荷{ids, count}让所有已连接的渲染端和外部客户端同步任务徽章状态这正是下文事件订阅能收到批量创建通知的来源。2. 订阅下载事件SSEcurl -N http://localhost:39719/api/events这是一条长连接服务端推什么、你收什么event: download-start data: {id: 123} event: download-success data: {id: 123}在浏览器 / Node.js 里const es new EventSource(http://localhost:39719/api/events); es.addEventListener(download-success, (e) { const { id } JSON.parse(e.data); console.log(任务完成:, id); });SSE 流的服务端实现很薄event.go 中Stream设置text/event-stream等响应头后从sse.Hub订阅一个带缓冲的 channel容量 10见 hub.go然后死循环地把 Hub 事件按event: name\ndata: json\n\n格式写出并 Flush客户端断开时由context.Done()触发反注册。值得注意的是 Swagger 注释里明确说明该事件流不包含下载进度事件进度需要自行轮询任务详情接口获取。3. 查询状态 / 手动控制# 列出所有下载任务分页 curl http://localhost:39719/api/downloads?current1pageSize20 # 查单个任务 curl http://localhost:39719/api/downloads/123 # 启动已存在的任务 curl -X POST http://localhost:39719/api/downloads/123/start \ -H Content-Type: application/json \ -d {localPath: /Downloads/MediaGo, deleteSegments: true} # 停止任务 curl -X POST http://localhost:39719/api/downloads/123/stop # 查下载日志 curl http://localhost:39719/api/downloads/123/logs下载事件一览GET /api/events是 Server-Sent Events 流下载相关的事件如下事件名载荷说明download-create{ids: number[], count: number}批量创建任务download-start{id: string}下载开始download-success{id: string}下载成功download-failed{id: string, error: string}下载失败download-stop{id: string}下载手动停止对做自动化的读者来说推荐的监听策略是挂一条 SSE 连接收download-success/download-failed作为状态机驱动失败时再按id拉取GET /api/downloads/:id/logs拿底层下载器N_m3u8DL-RE、BBDown、aria2、yt-dlp的原始输出用于排错。接口参考列表 / 查询GET /api/downloads— 分页列出下载任务Query 参数currentnumber默认 1页码pageSizenumber默认 20每页条数filterstring可选按状态筛选如downloading/success/failedlocalPathstring可选按保存路径筛选。响应data{ total: 42, list: [/* DownloadTask[] */] }GET /api/downloads/active— 列出活动中的任务返回所有waiting/downloading状态的任务适合启动时做断点恢复扫描。GET /api/downloads/:id— 查单个任务响应DownloadTask结构{ id: 123, name: 我的视频, type: m3u8, url: https://example.com/video.m3u8, folder: my-folder, headers: User-Agent: ..., isLive: false, status: success, file: /path/to/saved.mp4, createdDate: 2026-04-23T10:00:00Z, updatedDate: 2026-04-23T10:05:30Z }GET /api/downloads/folders— 列出不重复的保存目录响应string[]。GET /api/downloads/export— 导出下载列表返回纯文本每行一个 URL方便批量搬运到其他工具。GET /api/downloads/:id/logs— 查下载日志响应{ id, log: string }。创建 / 删除POST /api/downloads— 批量新建下载请求体{ tasks: [ { type: m3u8 | bilibili | direct | youtube | mediago, url: https://example.com/video.m3u8, name: 任务名, folder: 可选子目录, headers: 可选多行 HTTP 头 } ], startDownload: true }响应DownloadTask[]。URL 重复时返回 HTTP 409 冲突源码中对应ErrDownloadURLAlreadyExists分支见 download.go。DELETE /api/downloads/:id— 删除任务响应{}。编辑 / 状态PUT /api/downloads/:id— 编辑任务请求体字段都可选只更新提供的字段{ name: 新名字, url: 新 URL, headers: 新的 headers, folder: 新的子目录 }PUT /api/downloads/:id/live— 标记 / 取消直播流请求体{ isLive: true }。PUT /api/downloads/status— 批量修改任务状态请求体{ ids: number[], status: waiting | downloading | success | failed | stopped }。启动 / 停止POST /api/downloads/:id/start— 启动下载请求体{ localPath: /Users/me/Downloads/MediaGo, deleteSegments: true }localPath保存到哪里绝对路径deleteSegmentsm3u8 下载完成后是否删除分段.ts文件。源码里有一个值得注意的行为Start处理函数如果收到客户端传入的localPath会把它同步回运行时配置conf.Set(local, ...)见 download.go也就是说通过 API 启动一次任务会改变服务端默认的保存目录后续未显式指定路径的任务都落到这个新目录。自动化脚本如果只想改单个任务的落盘位置需要理解这一副作用。POST /api/downloads/:id/stop— 停止下载响应{}。媒体发现嗅探 / 解析除了直接给 URL 创建下载MediaGo 还提供先发现、再下载的异步发现流程。inspect直接解析 HLSbrowser模式让 Electron 主进程创建一个不可见的隔离浏览器视图并嗅探其媒体请求——它不会跳转或替换用户当前可见的素材提取标签。模式行为auto直接.m3u8URL 使用inspect其他 HTTP(S) 页面使用browserinspect仅接受直接 M3U8 URL不需要 Electron 浏览器执行器browser打开页面并收集媒体请求需要桌面端 Electron 正在运行并已连接 Core独立 Docker/Core 当前没有远程浏览器执行器因此只能使用inspect或让auto处理直接 M3U8 输入页面嗅探会返回discovery_executor_unavailable。发现相关路由在 router.go 中注册创建、查询、取消、从 source 建下载、执行器状态查询共五个端点桌面端与 Core 之间另有一条/api/bridge内部通道events/start/complete/fail用于 Electron 浏览器执行器回传嗅探结果。创建并查询发现任务curl -X POST http://localhost:39719/api/discoveries \ -H Content-Type: application/json \ -d { url: https://example.com/watch/1, mode: browser, timeoutMs: 20000, useSessionCookies: false } curl http://localhost:39719/api/discoveries/discovery-id curl -X POST http://localhost:39719/api/discoveries/discovery-id/cancel curl http://localhost:39719/api/discovery-executor/status关键约束timeoutMs会被限制在 3000–30000 ms任务状态为pending、running、completed、failed或cancelled任务结果在内存中保留约 10 分钟后过期不要依赖 API 长期查询历史发现结果拿到 source 后应尽快转入下载公开 HTTP 响应、CLI 输出和 MCP 结果都不会返回Cookie、Authorization等私密请求头。useSessionCookies默认为false使用隔离会话只有明确设为true才会复用桌面端已登录会话——这可能访问个性化内容凭据只保存在内存中、重启后失效。MediaGo 不绕过 DRM 或站点访问控制。从 source ID 创建下载curl -X POST http://localhost:39719/api/discoveries/discovery-id/downloads \ -H Content-Type: application/json \ -d {sourceIds:[source-1],startDownload:true}一次最多选择 20 个 source ID。下载创建时的请求头处理印证了敏感头不落盘的设计Create处理函数会把入参headers解析成运行期临时头RuntimeHeaders只把其中的持久化安全部分写入数据库PersistentDiscoveryHeaders短期私密请求头只存在于 Core 内部下载交接链路中见 download.go。CLI 与 MCP同一个发现引擎也可以通过官方 CLI 驱动mediago discover https://example.com/watch/1 --mode browser --json mediago discover get discovery-id --json mediago discover cancel discovery-id mediago discover download discovery-id --source source-1需要登录态时显式添加--session-cookies。内置 MCP 使用/mcp端点与 Bearer token并需在设置中启用与本文下载 API 对应的 MCP 工具包括discover_media、get_media_discovery、cancel_media_discovery、download_discovered_media以及下载创建、启动、停止、查询和运行能力查询等完整参数与凭证生命周期见 MCP 协议文档。枚举值下载类型type值说明m3u8HLS 流媒体底层 N_m3u8DL-REbilibiliB 站视频底层 BBDowndirect直接 HTTP 下载底层 aria2youtubeYouTube 及 yt-dlp 支持的 1000 站点mediagoMediaGo 内部类型任务状态status值说明waiting等待开始downloading下载中success已完成failed失败stopped已手动停止架构补充路由注册与能力边界从 router.go 的路由注册结构可以看出两条对集成方有用的边界/api/downloads/*路由只有在数据库可用时才注册if s.downloadHandler ! nil分支此时任务具备持久化与分页查询能力未挂数据库的场景退化为内存任务路由/api/tasks创建、查询、停止、日志功能子集更小。自动化脚本如果依赖GET /api/downloads?current...分页前提是目标部署启用了数据库持久化。/api/eventsSSE 流常驻注册与 downloads 路由相互独立因此即便处于内存模式事件订阅依然可用。配合 Dockerfile 与 docker-entrypoint.sh 的容器化部署这套 API 让 MediaGo 除了桌面客户端之外还可以作为 NAS/服务器上的下载节点被外部系统调度——这也是文档中 Docker9900端口与 API Key 认证存在的意义。赞分享音视频桌面应用后端【免费下载链接】mediago跨平台视频提取工具支持流媒体下载、视频下载、m3u8 下载及 B站视频下载提供 Windows 和 Mac 桌面客户端。Cross-platform video extraction tool: Supports streaming download, video download, m3u8 download, and Bilibili video download, with desktop clients for Windows and Mac.项目地址https://gitcode.com/caorushizi/mediago点击查看免费下载相关推荐OpenFang API 参考指南Agent 操作系统完整 HTTP / WebSocket / SSE 接口实战OpenFang API 参考指南Agent 操作系统完整 HTTP / WebSocket / SSE 接口实战 OpenFang 是一个开源的 Agent人工智能大模型AI Agent自主智能体Agent 编排MCP Clients知识图谱ntfy 订阅 API 完整指南HTTP 流JSON/SSE/Raw与 WebSocket 实时订阅ntfy 订阅 API 完整指南HTTP 流JSON/SSE/Raw与 WebSocket 实时订阅 本篇技术指南围绕 ntfy 开源项目 PUT/PO后端即时通讯消息队列Headlamp 插件事件体系解析EditResourceEvent 接口的字段、触发时机与订阅实践Headlamp 插件事件体系解析EditResourceEvent 接口的字段、触发时机与订阅实践 Headlamp一个功能完整、易于使用且可扩展的 Ku云原生开发工具上一篇oneAPI Threading Building Blocks (oneTBB) 项目推荐下一篇vue-pure-admin 常见问题解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
