ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

OmniGet Claude Code 插件媒体下载全解析:fetch 命令、底层脚本与故障排查实战

OmniGet Claude Code 插件媒体下载全解析:fetch 命令、底层脚本与故障排查实战 OmniGet Claude Code 插件媒体下载全解析fetch 命令、底层脚本与故障排查实战【免费下载链接】omnigetDownload Udemy and Hotmart courses, YouTube videos, music and books — 1,800 sites, no terminal. Free open-source desktop app for Windows, macOS and Linux, with a built-in course player, PDF/EPUB reader and music library. Powered by yt-dlp. Your files stay on your computer.项目地址: https://gitcode.com/GitHub_Trending/om/omniget本文围绕 OmniGet 仓库中 Claude Code 插件的fetch命令claude-plugin/omniget/commands/fetch.md展开深入讲解其背后的fetch.sh下载脚本、工具解析机制、Cookie 自动重试与错误分类逻辑。读完本文你将掌握如何在 Claude Code 会话中一键下载 URL 指向的媒体、理解底层 yt-dlp / omniget-cli 调用链、学会用 setup 与 doctor 解决工具缺失和下载失败问题并能通过测试用例验证整个流程的可靠性。一、fetch 命令是什么Claude Code 里的媒体下载入口在 OmniGet 的 Claude Code 插件中fetch是一个面向 Agent 的命令定义文件。它本身只有十几行却是整个媒体下载链路的总入口当用户在对话中粘贴一个视频、音频或社交平台链接并表达下载意图时ClaudeAgent会依据该命令执行真正的下载脚本。命令文件的开头 Frontmatter 定义了三项关键元数据description: Download the media at a URL with OmniGets tooling (yt-dlp, ffmpeg, omniget-cli) argument-hint: url [--audio] [--quality N] [--out DIR] allowed-tools: [Bash, Read]description向 Agent 描述该命令的能力边界——使用 yt-dlp、ffmpeg、omniget-cli 组成的工具链下载媒体argument-hint声明参数形态即url [--audio] [--quality N] [--out DIR]这正是底层脚本的参数契约allowed-tools限定 Agent 执行本命令时只能使用 Bash运行脚本和 Read读取文件两类工具避免权限越界。命令正文给出了唯一的执行动作bash ${CLAUDE_PLUGIN_ROOT}/scripts/fetch.sh $ARGUMENTS执行成功后Agent 需要用一两句话向用户汇报保存的文件路径、大小和时长而非粘贴 JSON若失败则先运行doctor.sh诊断再依据omniget-fetchskill 中的错误表格处理且在安装任何东西前必须先征得用户同意。二、fetch.sh 源码拆解一次下载的完整生命周期命令真正调用的核心是 claude-plugin/omniget/scripts/fetch.sh。它只打印一行 JSON{file,title,duration,size,platform,engine,id}进度信息走 stderr保证输出可被 Agent 程序化解析。2.1 参数解析脚本用while循环手工解析参数支持三个可选开关参数含义底层行为--audio仅保留音频轨道追加-x --audio-format m4a输出.m4a--quality N限制视频高度如 720追加-f bv*[heightN]ba/b[heightN]/b--out DIR指定输出目录未指定时用og_output_dir()得到默认目录未传 URL 或传了未知 flag 时脚本输出 usage 并以退出码 2 结束[ -n $url ] || { echo usage: fetch.sh url [--audio] [--quality N] [--out DIR] 2; exit 2; }2.2 双引擎策略omniget-cli 优先yt-dlp 兜底fetch.sh最核心的设计是引擎选择对部分平台优先使用 OmniGet 自带的原生提取器omniget-cli其余平台回退到通用 yt-dlp。if og_prefers_cli $url cli$(og_tool_path omniget-cli); then info$($cli --json info $url) args(--json download $url -o $out) $audio args(--audio-only) [ -n $quality ] args(-q $quality) ... fiog_prefers_cli在 resolve-tools.sh 中实现命中的主机包括instagram.com、threads.net、threads.com、twitter.com、x.com、bilibili.com、b23.tv。这些站点对登录态与反爬更敏感OmniGet 的原生提取器位于 src-tauri/omniget-cli/src/commands/download.rs比裸 yt-dlp 更可靠还能复用桌面应用里已配置的 Cookie 账号。yt-dlp 分支的参数构造同样值得注意args(--no-warnings --no-playlist --no-simulate --quiet --print %(id)s ||| %(extractor_key)s ||| %(duration)s ||| %(title)s --print after_move:filepath -o $out/%(title).120B [%(id)s].%(ext)s) [ -n $ffmpeg_dir ] args(--ffmpeg-location $ffmpeg_dir)--no-playlistURL 是列表时只取单条媒体避免意外批量下载两条--print第一行输出元数据ID、提取器名、时长、标题第二行在下载完成后输出实际文件路径——脚本随后用head -n 1/tail -n 1分别取回两者-o模板将标题截断到 120 字符并附加视频 ID保证文件名的可读性与唯一性--ffmpeg-location若找到 ffmpeg则显式指定其目录供 yt-dlp 做音视频合并。格式选择遵循三段式--audio用bestaudio/best指定质量用bv*[heightN]ba/b[heightN]/b视频按高度筛选音频兜底默认用bv*ba/b取最佳视频最佳音频均以 mp4 合并输出。2.3 输出与结果校验yt-dlp 分支最后用og_json工具resolve-tools.sh 中的 Python 辅助函数拼装结果 JSONsize:n表示数值字段空值自动省略duration为NA时置空。脚本还会校验文件真实存在[ -f $path ] || { echo download finished but file not found ... }防止下载成功但文件丢失的静默失败。三、工具查找与运行环境resolve-tools.sh 的解析顺序fetch.sh 的所有底层能力都来自被 source 的 resolve-tools.sh。它的核心函数og_find_tool遵循与桌面应用find_tool_with_source一致的三级查找顺序显式覆盖环境变量OMNIGET_TOOL_NAME如OMNIGET_TOOL_YT_DLP指定的路径来源标记为customOmniGet 托管目录data dir/bin下的自管二进制来源为omniget。数据目录按 OS 自动探测——macOS 为~/Library/Application Support/wtf.tonho.omnigetLinux 为${XDG_DATA_HOME:-~/.local/share}/wtf.tonho.omnigetWindows 为${APPDATA}/wtf.tonho.omnigetskill 缓存与系统 PATH先查~/.cache/omniget-skill/bin最后command -v落到系统 PATH来源为system。这套顺序意味着只要桌面端 OmniGet 安装过脚本就能直接复用其管理的 yt-dlp/ffmpeg无需额外安装——这与插件 README 的说明一致claude-plugin/omniget/README.md。其他关键辅助函数og_output_dir输出目录默认~/Downloads/omniget可用环境变量OMNIGET_DIR覆盖og_cookie_file在 OmniGet 的 cookies 目录下按域名找最新的 cookies.txt供 yt-dlp 的--cookies使用og_url_host剥离 URL 协议、路径与www./m.前缀得到裸主机名且将x.com归一化为twitter.com以匹配 Cookie 目录og_arch归一化 CPU 架构aarch64/x86_64与发布产物的 target triple 对齐。四、登录墙与限流的自动应对Cookie 一键重试机制这是 fetch 链路中最具实战价值的机制实现在og_run_ytdlp中。流程如下先用og_cookie_args检测当前域名是否有可用 CookieOmniGet 账号 Cookie 或OMNIGET_COOKIES_FROM_BROWSER指定的浏览器来源携带 Cookie 执行 yt-dlp成功则直接返回失败时若首次尝试未使用任何 Cookie且错误属于登录墙/限流类别则自动探测已登录浏览器og_detect_browser按 Chrome → Brave → Edge → Firefox → Safari 的顺序探测追加--cookies-from-browser browser重试一次重试仍失败则视为硬限流停止并返回错误。值得注意的两点边界macOS 首次读取浏览器 Cookie 可能弹出一次性 Keychain 授权提示多浏览器配置文件场景下可用OMNIGET_COOKIES_FROM_BROWSERchrome:Profile 3固定指定配置。这套逻辑不是纸面设计——仓库提供了专门的离线测试 claude-plugin/omniget/tests/test_retry.sh用 stub yt-dlp 验证三条断言cookie 解锁成功stub 在收到--cookies-from-browser后成功输出 → 期望退出码 0、返回 stdout、打印重试提示硬失败不无限重试stub 始终失败 → 期望退出码 1、stderr 被捕获到错误文件DRM 错误不触发重试stub 报SAMPLE-AES (FairPlay DRM)→ 期望绝不出现retrying with提示。这意味着登录墙自动重试是经过测试保障的确定性行为而非脚本里的侥幸逻辑。五、失败处理错误分类表与 doctor 诊断fetch 命令规定脚本失败后先跑 doctor再按omniget-fetchskill 的错误表格处置。该表格见 skills/omniget-fetch/SKILL.md与og_explain_error的匹配模式一一对应把原始 stderr 映射为可行动建议stderr 症状含义处置动作yt-dlp not found无下载引擎展示 doctor 的安装命令征求同意后再装Sign in to confirm、login required、Private video、HTTP 401/403平台要求登录会话使用 OmniGet 站点 Cookie或设OMNIGET_COOKIES_FROM_BROWSERchrome后重试HTTP 429、rate-limit请求过频等待 30 秒重试一次仍失败则停止并告知用户empty media response、HTTP 400Instagram/X限流或登录门禁等几分钟重试若是私有内容则提供 Cookie。omniget-cli处理这些站点优于裸 yt-dlpDRM、SAMPLE-AES、Widevine受 DRM 保护停止OmniGet 不绕过 DRMUnsupported URL无可用提取器说明情况若有直链可建议用户提供Requested format is not available画质上限过严去掉--quality重试脚本失败时还会输出一行- hint的明文提示归类限流/登录/DRM 三类根因。若某站点之前正常、现在全员失败通常是工具过期执行setup.sh --update刷新即可。og_explain_error的实现resolve-tools.sh 中把上述症状串进 case 匹配例如命中HTTP 429或rate-limit就返回平台正在限流…等待几分钟重试若为私有内容请登录见 Cookie 说明。og_should_retry_with_cookies则复用同一分类逻辑只对限流与登录两类错误放行 Cookie 重试。六、从零到可用的环境准备setup.sh 与 doctor.sh6.1 一键安装 setup.sh首次运行或缺工具时命令文件要求用setup.sh一步补齐而非向用户抛裸安装命令claude-plugin/omniget/scripts/setup.shbash ${CLAUDE_PLUGIN_ROOT}/scripts/setup.sh脚本自动检测 OS 与包管理器mac 用 brewWindows 用 winget/scoop/chocoLinux 用 apt/dnf/pacman/zypper列出缺失项并在单次确认后安装 yt-dlp、ffmpeg同时会下载当前 OS/arch 对应的预编译omniget-cli从 GitHub Releases 按 triple 匹配如x86_64-unknown-linux-gnu为 Instagram/X/Bilibili/Threads 提供原生提取器。主要开关开关作用--yes/-y跳过确认提示--local额外安装本地 Whisper 引擎与默认模型--no-cli跳过 omniget-cli 安装--check-only只报告状态、不安装对 Agent 安全--update刷新 yt-dlp/ffmpeg 并重装 omniget-cli若桌面端 OmniGet 已安装yt-dlp 与 ffmpeg 已由其托管setup 会发现它们而无需任何安装动作。6.2 诊断工具 doctor.shdoctorclaude-plugin/omniget/scripts/doctor.sh以表格形式汇报每个工具的状态与来源omniget-cli、yt-dlp、ffmpeg、ffprobe、whisper-cli、mlx_whisper的存在性Whisper 模型是否就位GEMINI_API_KEY/OPENAI_API_KEY是否配置以及omniget-app是否安装。--check-keys追加密钥检查--json输出机器可读结果。缺什么就打印对应的安装命令brew/winget/apt 等是否执行完全由用户决定。七、完整工作流与实用要点综合 fetch 命令、skill 与脚本一次典型下载的完整链路为用户粘贴 URL 并表达下载意图 →omniget-fetchskill 触发Agent 执行fetch.sh url [--audio] [--quality N] [--out DIR]resolve-tools.sh解析出引擎Instagram/X/Bilibili/Threads 走omniget-cli其余走 yt-dlp ffmpeg下载遇登录墙/限流时自动用浏览器 Cookie 重试一次成功则输出单行 JSONAgent 用一两句话汇报文件路径、大小、时长失败则先doctor.sh --check-keys再按错误表格处置任何安装操作前必须征得用户同意。环境变量速查均可在运行前设置以调整行为变量含义OMNIGET_DIR输出目录默认~/Downloads/omnigetOMNIGET_DATA_DIROmniGet 应用数据目录按 OS 自动探测OMNIGET_TOOL_YT_DLP/OMNIGET_TOOL_FFMPEG显式指定二进制路径OMNIGET_COOKIES_FROM_BROWSERchrome/firefox/safari/edge用于登录态媒体可带 profile 如chrome:Profile 3OMNIGET_KEYS_FILE替换默认的~/.config/ai-keys.env密钥文件边界与原则只下载用户明确索取的媒体裸 URL 加提问属于转写请求而非下载请求应走omniget-transcribeskill绝不绕过 DRM 与付费墙只使用用户已有的会话OmniGet Cookie 账号或浏览器 CookieCookie 文件与 API 密钥永不打印、复制或提交。对播客、演讲等只听不看的场景优先--audio以减小体积并加快下载。这套设计把下载媒体这件看似简单的操作做成了可诊断、可重试、可测试的工程化流程Agent 无需手写 yt-dlp 命令只需调用稳定的脚本契约而脚本复用桌面端已有的全部工具资产——这正是 OmniGet 文件留在你的电脑上理念在 AI 编程助手场景下的自然延伸。【免费下载链接】omnigetDownload Udemy and Hotmart courses, YouTube videos, music and books — 1,800 sites, no terminal. Free open-source desktop app for Windows, macOS and Linux, with a built-in course player, PDF/EPUB reader and music library. Powered by yt-dlp. Your files stay on your computer.项目地址: https://gitcode.com/GitHub_Trending/om/omniget创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表