{
  "schemaVersion": "1.0",
  "item": {
    "slug": "tubescribe",
    "name": "TubeScribe",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/matusvojtek/tubescribe",
    "canonicalUrl": "https://clawhub.ai/matusvojtek/tubescribe",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/tubescribe",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=tubescribe",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "CHANGELOG.md",
      "README.md",
      "SKILL.md",
      "scripts/config.py",
      "scripts/html_writer.py",
      "scripts/setup.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/tubescribe"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/tubescribe",
    "agentPageUrl": "https://openagent3.xyz/skills/tubescribe/agent",
    "manifestUrl": "https://openagent3.xyz/skills/tubescribe/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/tubescribe/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "TubeScribe 🎬",
        "body": "Turn any YouTube video into a polished document + audio summary.\n\nDrop a YouTube link → get a beautiful transcript with speaker labels, key quotes, timestamps that link back to the video, and an audio summary you can listen to on the go."
      },
      {
        "title": "💸 Free & No Paid APIs",
        "body": "No subscriptions or API keys — works out of the box\nLocal processing — transcription, speaker detection, and TTS run on your machine\nNetwork access — fetching from YouTube (captions, metadata, comments) requires internet\nNo data uploaded — nothing is sent to external services; all processing stays on your machine\nSafe sub-agent — spawned sub-agent has strict instructions: no software installation, no network calls beyond YouTube"
      },
      {
        "title": "✨ Features",
        "body": "📄 Transcript with summary and key quotes — Export as DOCX, HTML, or Markdown\n🎯 Smart Speaker Detection — Automatically identifies participants\n🔊 Audio Summaries — Listen to key points (MP3/WAV)\n📝 Clickable Timestamps — Every quote links directly to that moment in the video\n💬 YouTube Comments — Viewer sentiment analysis and best comments\n📋 Queue Support — Send multiple links, they get processed in order\n🚀 Non-Blocking Workflow — Conversation continues while video processes in background"
      },
      {
        "title": "🎬 Works With Any Video",
        "body": "Interviews & podcasts (multi-speaker detection)\nLectures & tutorials (single speaker)\nMusic videos (lyrics extraction)\nNews & documentaries\nAny YouTube content with captions"
      },
      {
        "title": "Quick Start",
        "body": "When user sends a YouTube URL:\n\nSpawn sub-agent with the full pipeline task immediately\nReply: \"🎬 TubeScribe is processing — I'll let you know when it's ready!\"\nContinue conversation (don't wait!)\nSub-agent notification will announce completion with title and details\n\nDO NOT BLOCK — spawn and move on instantly."
      },
      {
        "title": "First-Time Setup",
        "body": "Run setup to check dependencies and configure defaults:\n\npython skills/tubescribe/scripts/setup.py\n\nThis checks: summarize CLI, pandoc, ffmpeg, Kokoro TTS"
      },
      {
        "title": "Full Workflow (Single Sub-Agent)",
        "body": "Spawn ONE sub-agent that does the entire pipeline:\n\nsessions_spawn(\n    task=f\"\"\"\n## TubeScribe: Process {youtube_url}\n\n⚠️ CRITICAL: Do NOT install any software.\nNo pip, brew, curl, venv, or binary downloads.\nIf a tool is missing, STOP and report what's needed.\n\nRun the COMPLETE pipeline — do not stop until all steps are done.\n\n### Step 1: Extract\n```bash\npython3 skills/tubescribe/scripts/tubescribe.py \"{youtube_url}\"\n\nNote the Source and Output paths printed by the script. Use those exact paths in subsequent steps."
      },
      {
        "title": "Step 2: Read source JSON",
        "body": "Read the Source path from Step 1 output and note:\n\nmetadata.title (for filename)\nmetadata.video_id\nmetadata.channel, upload_date, duration_string"
      },
      {
        "title": "Step 3: Create formatted markdown",
        "body": "Write to the Output path from Step 1:\n\n# **<title>**\n\nVideo info block — Channel, Date, Duration, URL (clickable). Empty line between each field.\n\n## **Participants** — table with bold headers:\n| **Name** | **Role** | **Description** |\n|----------|----------|-----------------|\n\n## **Summary** — 3-5 paragraphs of prose\n\n## **Key Quotes** — 5 best with clickable YouTube timestamps. Format each as:\n\"Quote text here.\" - [12:34](https://www.youtube.com/watch?v=ID&t=754s)\n\n\"Another quote.\" - [25:10](https://www.youtube.com/watch?v=ID&t=1510s)\n\nUse regular dash -, NOT em dash —. Do NOT use blockquotes >. Plain paragraphs only.\n\n## **Viewer Sentiment** (if comments exist)\n\n## **Best Comments** (if comments exist) — Top 5, NO lines between them:\nComment text here.\n\n*- ▲ 123 @AuthorName*\n\nNext comment text here.\n\n*- ▲ 45 @AnotherAuthor*\n\nAttribution line: dash + italic. Just blank line between comments, NO --- separators.\n\n## **Full Transcript** — merge segments, speaker labels, clickable timestamps"
      },
      {
        "title": "Step 4: Create DOCX",
        "body": "Clean the title for filename (remove special chars), then:\n\npandoc <output_path> -o ~/Documents/TubeScribe/<safe_title>.docx"
      },
      {
        "title": "Step 5: Generate audio",
        "body": "Write the summary text to a temp file, then use TubeScribe's built-in audio generation:\n\n# Write summary to temp file (use python3 to write, avoids shell escaping issues)\npython3 -c \"\ntext = '''YOUR SUMMARY TEXT HERE'''\nwith open('<temp_dir>/tubescribe_<video_id>_summary.txt', 'w') as f:\n    f.write(text)\n\"\n\n# Generate audio (auto-detects engine, voice, format from config)\npython3 skills/tubescribe/scripts/tubescribe.py \\\n  --generate-audio <temp_dir>/tubescribe_<video_id>_summary.txt \\\n  --audio-output ~/Documents/TubeScribe/<safe_title>_summary\n\nThis reads ~/.tubescribe/config.json and uses the configured TTS engine (mlx/kokoro/builtin), voice blend, and speed automatically. Output format (mp3/wav) comes from config."
      },
      {
        "title": "Step 6: Cleanup",
        "body": "python3 skills/tubescribe/scripts/tubescribe.py --cleanup <video_id>"
      },
      {
        "title": "Step 7: Open folder",
        "body": "open ~/Documents/TubeScribe/"
      },
      {
        "title": "Report",
        "body": "Tell what was created: DOCX name, MP3 name + duration, video stats.\n\"\"\",\nlabel=\"tubescribe\",\nrunTimeoutSeconds=900,\ncleanup=\"delete\"\n)\n\n**After spawning, reply immediately:**\n> 🎬 TubeScribe is processing - I'll let you know when it's ready!\nThen continue the conversation. The sub-agent notification announces completion.\n\n## Configuration\n\nConfig file: `~/.tubescribe/config.json`\n\n```json\n{\n  \"output\": {\n    \"folder\": \"~/Documents/TubeScribe\",\n    \"open_folder_after\": true,\n    \"open_document_after\": false,\n    \"open_audio_after\": false\n  },\n  \"document\": {\n    \"format\": \"docx\",\n    \"engine\": \"pandoc\"\n  },\n  \"audio\": {\n    \"enabled\": true,\n    \"format\": \"mp3\",\n    \"tts_engine\": \"mlx\"\n  },\n  \"mlx_audio\": {\n    \"path\": \"~/.openclaw/tools/mlx-audio\",\n    \"model\": \"mlx-community/Kokoro-82M-bf16\",\n    \"voice\": \"af_heart\",\n    \"lang_code\": \"a\",\n    \"speed\": 1.05\n  },\n  \"kokoro\": {\n    \"path\": \"~/.openclaw/tools/kokoro\",\n    \"voice_blend\": { \"af_heart\": 0.6, \"af_sky\": 0.4 },\n    \"speed\": 1.05\n  },\n  \"processing\": {\n    \"subagent_timeout\": 600,\n    \"cleanup_temp_files\": true\n  }\n}"
      },
      {
        "title": "Output Options",
        "body": "OptionDefaultDescriptionoutput.folder~/Documents/TubeScribeWhere to save filesoutput.open_folder_aftertrueOpen output folder when doneoutput.open_document_afterfalseAuto-open generated documentoutput.open_audio_afterfalseAuto-open generated audio summary"
      },
      {
        "title": "Document Options",
        "body": "OptionDefaultValuesDescriptiondocument.formatdocxdocx, html, mdOutput formatdocument.enginepandocpandocConverter for DOCX (falls back to HTML)"
      },
      {
        "title": "Audio Options",
        "body": "OptionDefaultValuesDescriptionaudio.enabledtruetrue, falseGenerate audio summaryaudio.formatmp3mp3, wavAudio format (mp3 needs ffmpeg)audio.tts_enginemlxmlx, kokoro, builtinTTS engine (mlx = fastest on Apple Silicon)"
      },
      {
        "title": "MLX-Audio Options (preferred on Apple Silicon)",
        "body": "OptionDefaultDescriptionmlx_audio.path~/.openclaw/tools/mlx-audiomlx-audio venv locationmlx_audio.modelmlx-community/Kokoro-82M-bf16MLX model to usemlx_audio.voiceaf_heartVoice preset (used if no voice_blend)mlx_audio.voice_blend{af_heart: 0.6, af_sky: 0.4}Custom voice mix (weighted blend)mlx_audio.lang_codeaLanguage code (a=US English)mlx_audio.speed1.05Playback speed (1.0 = normal, 1.05 = 5% faster)"
      },
      {
        "title": "Kokoro PyTorch Options (fallback)",
        "body": "OptionDefaultDescriptionkokoro.path~/.openclaw/tools/kokoroKokoro repo locationkokoro.voice_blend{af_heart: 0.6, af_sky: 0.4}Custom voice mixkokoro.speed1.05Playback speed (1.0 = normal, 1.05 = 5% faster)"
      },
      {
        "title": "Processing Options",
        "body": "OptionDefaultDescriptionprocessing.subagent_timeout600Seconds for sub-agent (increase for long videos)processing.cleanup_temp_filestrueRemove /tmp files after completion"
      },
      {
        "title": "Comment Options",
        "body": "OptionDefaultDescriptioncomments.max_count50Number of comments to fetchcomments.timeout90Timeout for comment fetching (seconds)"
      },
      {
        "title": "Queue Options",
        "body": "OptionDefaultDescriptionqueue.stale_minutes30Consider a processing job stale after this many minutes"
      },
      {
        "title": "Output Structure",
        "body": "~/Documents/TubeScribe/\n├── {Video Title}.html         # Formatted document (or .docx / .md)\n└── {Video Title}_summary.mp3  # Audio summary (or .wav)\n\nAfter generation, opens the folder (not individual files) so you can access everything."
      },
      {
        "title": "Dependencies",
        "body": "Required:\n\nsummarize CLI — brew install steipete/tap/summarize\nPython 3.8+\n\nOptional (better quality):\n\npandoc — DOCX output: brew install pandoc\nffmpeg — MP3 audio: brew install ffmpeg\nyt-dlp — YouTube comments: brew install yt-dlp\nmlx-audio — Fastest TTS on Apple Silicon: pip install mlx-audio (uses MLX backend for Kokoro)\nKokoro TTS — PyTorch fallback: see https://github.com/hexgrad/kokoro"
      },
      {
        "title": "yt-dlp Search Paths",
        "body": "TubeScribe checks these locations (in order):\n\nPriorityPathSource1which yt-dlpSystem PATH2/opt/homebrew/bin/yt-dlpHomebrew (Apple Silicon)3/usr/local/bin/yt-dlpHomebrew (Intel) / Linux4~/.local/bin/yt-dlppip install --user5~/.local/pipx/venvs/yt-dlp/bin/yt-dlppipx6~/.openclaw/tools/yt-dlp/yt-dlpTubeScribe auto-install\n\nIf not found, setup downloads a standalone binary to the tools directory.\nThe tools directory version doesn't conflict with system installations."
      },
      {
        "title": "Queue Handling",
        "body": "When user sends multiple YouTube URLs while one is processing:"
      },
      {
        "title": "Check Before Starting",
        "body": "python skills/tubescribe/scripts/tubescribe.py --queue-status"
      },
      {
        "title": "If Already Processing",
        "body": "# Add to queue instead of starting parallel processing\npython skills/tubescribe/scripts/tubescribe.py --queue-add \"NEW_URL\"\n# → Replies: \"📋 Added to queue (position 2)\""
      },
      {
        "title": "After Completion",
        "body": "# Check if more in queue\npython skills/tubescribe/scripts/tubescribe.py --queue-next\n# → Automatically pops and processes next URL"
      },
      {
        "title": "Queue Commands",
        "body": "CommandDescription--queue-statusShow what's processing + queued items--queue-add URLAdd URL to queue--queue-nextProcess next item from queue--queue-clearClear entire queue"
      },
      {
        "title": "Batch Processing (multiple URLs at once)",
        "body": "python skills/tubescribe/scripts/tubescribe.py url1 url2 url3\n\nProcesses all URLs sequentially with a summary at the end."
      },
      {
        "title": "Error Handling",
        "body": "The script detects and reports these errors with clear messages:\n\nErrorMessageInvalid URL❌ Not a valid YouTube URLPrivate video❌ Video is private — can't accessVideo removed❌ Video not found or removedNo captions❌ No captions available for this videoAge-restricted❌ Age-restricted video — can't access without loginRegion-blocked❌ Video blocked in your regionLive stream❌ Live streams not supported — wait until it endsNetwork error❌ Network error — check your connectionTimeout❌ Request timed out — try again later\n\nWhen an error occurs, report it to the user and don't proceed with that video."
      },
      {
        "title": "Tips",
        "body": "For long videos (>30 min), increase sub-agent timeout to 900s\nSpeaker detection works best with clear interview/podcast formats\nSingle-speaker videos (tutorials, lectures) skip speaker labels automatically\nTimestamps link directly to YouTube at that moment\nUse batch mode for multiple videos: tubescribe url1 url2 url3"
      }
    ],
    "body": "TubeScribe 🎬\n\nTurn any YouTube video into a polished document + audio summary.\n\nDrop a YouTube link → get a beautiful transcript with speaker labels, key quotes, timestamps that link back to the video, and an audio summary you can listen to on the go.\n\n💸 Free & No Paid APIs\nNo subscriptions or API keys — works out of the box\nLocal processing — transcription, speaker detection, and TTS run on your machine\nNetwork access — fetching from YouTube (captions, metadata, comments) requires internet\nNo data uploaded — nothing is sent to external services; all processing stays on your machine\nSafe sub-agent — spawned sub-agent has strict instructions: no software installation, no network calls beyond YouTube\n✨ Features\n📄 Transcript with summary and key quotes — Export as DOCX, HTML, or Markdown\n🎯 Smart Speaker Detection — Automatically identifies participants\n🔊 Audio Summaries — Listen to key points (MP3/WAV)\n📝 Clickable Timestamps — Every quote links directly to that moment in the video\n💬 YouTube Comments — Viewer sentiment analysis and best comments\n📋 Queue Support — Send multiple links, they get processed in order\n🚀 Non-Blocking Workflow — Conversation continues while video processes in background\n🎬 Works With Any Video\nInterviews & podcasts (multi-speaker detection)\nLectures & tutorials (single speaker)\nMusic videos (lyrics extraction)\nNews & documentaries\nAny YouTube content with captions\nQuick Start\n\nWhen user sends a YouTube URL:\n\nSpawn sub-agent with the full pipeline task immediately\nReply: \"🎬 TubeScribe is processing — I'll let you know when it's ready!\"\nContinue conversation (don't wait!)\nSub-agent notification will announce completion with title and details\n\nDO NOT BLOCK — spawn and move on instantly.\n\nFirst-Time Setup\n\nRun setup to check dependencies and configure defaults:\n\npython skills/tubescribe/scripts/setup.py\n\n\nThis checks: summarize CLI, pandoc, ffmpeg, Kokoro TTS\n\nFull Workflow (Single Sub-Agent)\n\nSpawn ONE sub-agent that does the entire pipeline:\n\nsessions_spawn(\n    task=f\"\"\"\n## TubeScribe: Process {youtube_url}\n\n⚠️ CRITICAL: Do NOT install any software.\nNo pip, brew, curl, venv, or binary downloads.\nIf a tool is missing, STOP and report what's needed.\n\nRun the COMPLETE pipeline — do not stop until all steps are done.\n\n### Step 1: Extract\n```bash\npython3 skills/tubescribe/scripts/tubescribe.py \"{youtube_url}\"\n\n\nNote the Source and Output paths printed by the script. Use those exact paths in subsequent steps.\n\nStep 2: Read source JSON\n\nRead the Source path from Step 1 output and note:\n\nmetadata.title (for filename)\nmetadata.video_id\nmetadata.channel, upload_date, duration_string\nStep 3: Create formatted markdown\n\nWrite to the Output path from Step 1:\n\n# **<title>**\nVideo info block — Channel, Date, Duration, URL (clickable). Empty line between each field.\n## **Participants** — table with bold headers:\n| **Name** | **Role** | **Description** |\n|----------|----------|-----------------|\n\n## **Summary** — 3-5 paragraphs of prose\n## **Key Quotes** — 5 best with clickable YouTube timestamps. Format each as:\n\"Quote text here.\" - [12:34](https://www.youtube.com/watch?v=ID&t=754s)\n\n\"Another quote.\" - [25:10](https://www.youtube.com/watch?v=ID&t=1510s)\n\nUse regular dash -, NOT em dash —. Do NOT use blockquotes >. Plain paragraphs only.\n## **Viewer Sentiment** (if comments exist)\n## **Best Comments** (if comments exist) — Top 5, NO lines between them:\nComment text here.\n\n*- ▲ 123 @AuthorName*\n\nNext comment text here.\n\n*- ▲ 45 @AnotherAuthor*\n\nAttribution line: dash + italic. Just blank line between comments, NO --- separators.\n## **Full Transcript** — merge segments, speaker labels, clickable timestamps\nStep 4: Create DOCX\n\nClean the title for filename (remove special chars), then:\n\npandoc <output_path> -o ~/Documents/TubeScribe/<safe_title>.docx\n\nStep 5: Generate audio\n\nWrite the summary text to a temp file, then use TubeScribe's built-in audio generation:\n\n# Write summary to temp file (use python3 to write, avoids shell escaping issues)\npython3 -c \"\ntext = '''YOUR SUMMARY TEXT HERE'''\nwith open('<temp_dir>/tubescribe_<video_id>_summary.txt', 'w') as f:\n    f.write(text)\n\"\n\n# Generate audio (auto-detects engine, voice, format from config)\npython3 skills/tubescribe/scripts/tubescribe.py \\\n  --generate-audio <temp_dir>/tubescribe_<video_id>_summary.txt \\\n  --audio-output ~/Documents/TubeScribe/<safe_title>_summary\n\n\nThis reads ~/.tubescribe/config.json and uses the configured TTS engine (mlx/kokoro/builtin), voice blend, and speed automatically. Output format (mp3/wav) comes from config.\n\nStep 6: Cleanup\npython3 skills/tubescribe/scripts/tubescribe.py --cleanup <video_id>\n\nStep 7: Open folder\nopen ~/Documents/TubeScribe/\n\nReport\n\nTell what was created: DOCX name, MP3 name + duration, video stats. \"\"\", label=\"tubescribe\", runTimeoutSeconds=900, cleanup=\"delete\" )\n\n\n**After spawning, reply immediately:**\n> 🎬 TubeScribe is processing - I'll let you know when it's ready!\nThen continue the conversation. The sub-agent notification announces completion.\n\n## Configuration\n\nConfig file: `~/.tubescribe/config.json`\n\n```json\n{\n  \"output\": {\n    \"folder\": \"~/Documents/TubeScribe\",\n    \"open_folder_after\": true,\n    \"open_document_after\": false,\n    \"open_audio_after\": false\n  },\n  \"document\": {\n    \"format\": \"docx\",\n    \"engine\": \"pandoc\"\n  },\n  \"audio\": {\n    \"enabled\": true,\n    \"format\": \"mp3\",\n    \"tts_engine\": \"mlx\"\n  },\n  \"mlx_audio\": {\n    \"path\": \"~/.openclaw/tools/mlx-audio\",\n    \"model\": \"mlx-community/Kokoro-82M-bf16\",\n    \"voice\": \"af_heart\",\n    \"lang_code\": \"a\",\n    \"speed\": 1.05\n  },\n  \"kokoro\": {\n    \"path\": \"~/.openclaw/tools/kokoro\",\n    \"voice_blend\": { \"af_heart\": 0.6, \"af_sky\": 0.4 },\n    \"speed\": 1.05\n  },\n  \"processing\": {\n    \"subagent_timeout\": 600,\n    \"cleanup_temp_files\": true\n  }\n}\n\nOutput Options\nOption\tDefault\tDescription\noutput.folder\t~/Documents/TubeScribe\tWhere to save files\noutput.open_folder_after\ttrue\tOpen output folder when done\noutput.open_document_after\tfalse\tAuto-open generated document\noutput.open_audio_after\tfalse\tAuto-open generated audio summary\nDocument Options\nOption\tDefault\tValues\tDescription\ndocument.format\tdocx\tdocx, html, md\tOutput format\ndocument.engine\tpandoc\tpandoc\tConverter for DOCX (falls back to HTML)\nAudio Options\nOption\tDefault\tValues\tDescription\naudio.enabled\ttrue\ttrue, false\tGenerate audio summary\naudio.format\tmp3\tmp3, wav\tAudio format (mp3 needs ffmpeg)\naudio.tts_engine\tmlx\tmlx, kokoro, builtin\tTTS engine (mlx = fastest on Apple Silicon)\nMLX-Audio Options (preferred on Apple Silicon)\nOption\tDefault\tDescription\nmlx_audio.path\t~/.openclaw/tools/mlx-audio\tmlx-audio venv location\nmlx_audio.model\tmlx-community/Kokoro-82M-bf16\tMLX model to use\nmlx_audio.voice\taf_heart\tVoice preset (used if no voice_blend)\nmlx_audio.voice_blend\t{af_heart: 0.6, af_sky: 0.4}\tCustom voice mix (weighted blend)\nmlx_audio.lang_code\ta\tLanguage code (a=US English)\nmlx_audio.speed\t1.05\tPlayback speed (1.0 = normal, 1.05 = 5% faster)\nKokoro PyTorch Options (fallback)\nOption\tDefault\tDescription\nkokoro.path\t~/.openclaw/tools/kokoro\tKokoro repo location\nkokoro.voice_blend\t{af_heart: 0.6, af_sky: 0.4}\tCustom voice mix\nkokoro.speed\t1.05\tPlayback speed (1.0 = normal, 1.05 = 5% faster)\nProcessing Options\nOption\tDefault\tDescription\nprocessing.subagent_timeout\t600\tSeconds for sub-agent (increase for long videos)\nprocessing.cleanup_temp_files\ttrue\tRemove /tmp files after completion\nComment Options\nOption\tDefault\tDescription\ncomments.max_count\t50\tNumber of comments to fetch\ncomments.timeout\t90\tTimeout for comment fetching (seconds)\nQueue Options\nOption\tDefault\tDescription\nqueue.stale_minutes\t30\tConsider a processing job stale after this many minutes\nOutput Structure\n~/Documents/TubeScribe/\n├── {Video Title}.html         # Formatted document (or .docx / .md)\n└── {Video Title}_summary.mp3  # Audio summary (or .wav)\n\n\nAfter generation, opens the folder (not individual files) so you can access everything.\n\nDependencies\n\nRequired:\n\nsummarize CLI — brew install steipete/tap/summarize\nPython 3.8+\n\nOptional (better quality):\n\npandoc — DOCX output: brew install pandoc\nffmpeg — MP3 audio: brew install ffmpeg\nyt-dlp — YouTube comments: brew install yt-dlp\nmlx-audio — Fastest TTS on Apple Silicon: pip install mlx-audio (uses MLX backend for Kokoro)\nKokoro TTS — PyTorch fallback: see https://github.com/hexgrad/kokoro\nyt-dlp Search Paths\n\nTubeScribe checks these locations (in order):\n\nPriority\tPath\tSource\n1\twhich yt-dlp\tSystem PATH\n2\t/opt/homebrew/bin/yt-dlp\tHomebrew (Apple Silicon)\n3\t/usr/local/bin/yt-dlp\tHomebrew (Intel) / Linux\n4\t~/.local/bin/yt-dlp\tpip install --user\n5\t~/.local/pipx/venvs/yt-dlp/bin/yt-dlp\tpipx\n6\t~/.openclaw/tools/yt-dlp/yt-dlp\tTubeScribe auto-install\n\nIf not found, setup downloads a standalone binary to the tools directory. The tools directory version doesn't conflict with system installations.\n\nQueue Handling\n\nWhen user sends multiple YouTube URLs while one is processing:\n\nCheck Before Starting\npython skills/tubescribe/scripts/tubescribe.py --queue-status\n\nIf Already Processing\n# Add to queue instead of starting parallel processing\npython skills/tubescribe/scripts/tubescribe.py --queue-add \"NEW_URL\"\n# → Replies: \"📋 Added to queue (position 2)\"\n\nAfter Completion\n# Check if more in queue\npython skills/tubescribe/scripts/tubescribe.py --queue-next\n# → Automatically pops and processes next URL\n\nQueue Commands\nCommand\tDescription\n--queue-status\tShow what's processing + queued items\n--queue-add URL\tAdd URL to queue\n--queue-next\tProcess next item from queue\n--queue-clear\tClear entire queue\nBatch Processing (multiple URLs at once)\npython skills/tubescribe/scripts/tubescribe.py url1 url2 url3\n\n\nProcesses all URLs sequentially with a summary at the end.\n\nError Handling\n\nThe script detects and reports these errors with clear messages:\n\nError\tMessage\nInvalid URL\t❌ Not a valid YouTube URL\nPrivate video\t❌ Video is private — can't access\nVideo removed\t❌ Video not found or removed\nNo captions\t❌ No captions available for this video\nAge-restricted\t❌ Age-restricted video — can't access without login\nRegion-blocked\t❌ Video blocked in your region\nLive stream\t❌ Live streams not supported — wait until it ends\nNetwork error\t❌ Network error — check your connection\nTimeout\t❌ Request timed out — try again later\n\nWhen an error occurs, report it to the user and don't proceed with that video.\n\nTips\nFor long videos (>30 min), increase sub-agent timeout to 900s\nSpeaker detection works best with clear interview/podcast formats\nSingle-speaker videos (tutorials, lectures) skip speaker labels automatically\nTimestamps link directly to YouTube at that moment\nUse batch mode for multiple videos: tubescribe url1 url2 url3"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/matusvojtek/tubescribe",
    "publisherUrl": "https://clawhub.ai/matusvojtek/tubescribe",
    "owner": "matusvojtek",
    "version": "1.1.8",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/tubescribe",
    "downloadUrl": "https://openagent3.xyz/downloads/tubescribe",
    "agentUrl": "https://openagent3.xyz/skills/tubescribe/agent",
    "manifestUrl": "https://openagent3.xyz/skills/tubescribe/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/tubescribe/agent.md"
  }
}