[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FCTAFQQ4WF6G0CH50F6T2C":3,"skill-same:01M6FCTAFQQ4WF6G0CH50F6T2C":47},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":20,"linkOnly":21,"markdownContent":22,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":29,"ownerHtmlUrl":30,"ownerBlogUrl":6,"ownerDescription":31,"updatedAt":32,"install":33,"resources":46},"01M6FCTAFQQ4WF6G0CH50F6T2C","media-utils",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fmichaelboeding\u002Fskills\u002Fmedia-utils\u002FSKILL.md",[],[18,19],"Media","media utils","2026-11-10 10:12:30",false,"# Media Utilities\n\n**Internal utilities for media assembly. Used by producer skills.**\n\nThese scripts wrap FFmpeg to provide reliable media operations.\n\n## Prerequisites\n\n- **FFmpeg** must be installed: `brew install ffmpeg` (macOS) or `apt install ffmpeg` (Linux)\n- Check with: `python3 check_ffmpeg.py`\n\n## Available Utilities\n\n### audio_concat.py\nConcatenate multiple audio files into one.\n\n```bash\n# Simple concatenation\npython3 audio_concat.py -i intro.wav segment1.wav outro.wav -o podcast.mp3\n\n# With crossfade between clips\npython3 audio_concat.py -i track1.wav track2.wav --crossfade 2.0\n\n# With normalization\npython3 audio_concat.py -i *.wav -o mixed.mp3 --normalize\n```\n\n### audio_mix.py\nMix voice\u002Fnarration with background music (with optional ducking).\n\n```bash\n# Voice + music with ducking (music lowers when voice plays)\npython3 audio_mix.py --voice narration.wav --music background.mp3 -o final.mp3\n\n# Adjust music volume (default: 0.3)\npython3 audio_mix.py --voice voice.wav --music music.mp3 --music-volume 0.2\n\n# No ducking\npython3 audio_mix.py --voice voice.wav --music music.mp3 --no-duck\n\n# With fade in\u002Fout on music\npython3 audio_mix.py --voice voice.wav --music music.mp3 --fade-in 2 --fade-out 3\n```\n\n### video_concat.py\nConcatenate multiple video clips.\n\n```bash\n# Simple concatenation\npython3 video_concat.py -i clip1.mp4 clip2.mp4 clip3.mp4 -o final.mp4\n\n# With fade transition\npython3 video_concat.py -i *.mp4 -o final.mp4 --transition fade --duration 1.0\n\n# Normalize to 1080p\npython3 video_concat.py -i *.mp4 -o final.mp4 --resolution 1080p\n\n# Available transitions: fade, dissolve, wipeleft, wiperight, slideup, slidedown\n```\n\n### video_audio_merge.py\nAdd audio track(s) to video.\n\n```bash\n# Replace video audio\npython3 video_audio_merge.py --video clip.mp4 --audio voiceover.mp3 -o final.mp4\n\n# Add voice + music with ducking\npython3 video_audio_merge.py --video clip.mp4 --voice narration.wav --music bg.mp3\n\n# Mix with existing video audio\npython3 video_audio_merge.py --video clip.mp4 --audio music.mp3 --mix\n\n# Audio sync offset\npython3 video_audio_merge.py --video clip.mp4 --audio audio.mp3 --offset 0.5\n```\n\n### video_strip_audio.py\nRemove audio from video files (for replacing with custom audio).\n\n```bash\n# Strip audio from single file\npython3 video_strip_audio.py -i video.mp4 -o silent_video.mp4\n\n# Strip audio from multiple files (batch mode)\npython3 video_strip_audio.py -i clip1.mp4 clip2.mp4 clip3.mp4\n\n# Strip with custom output directory\npython3 video_strip_audio.py -i *.mp4 --output-dir .\u002Fsilent\u002F\n\n# Re-encode video instead of copying\npython3 video_strip_audio.py -i video.mp4 --reencode\n```\n\n### check_ffmpeg.py\nVerify FFmpeg installation.\n\n```bash\npython3 check_ffmpeg.py\n# ✅ FFmpeg is available!\n#    ffmpeg version 6.0 ...\n```\n\n### report_to_pdf.py\nConvert Markdown reports to professional PDF documents.\n\n```bash\n# Basic conversion\npython3 report_to_pdf.py -i analysis.md -o analysis.pdf\n\n# With custom title and executive style\npython3 report_to_pdf.py -i report.md -o report.pdf --title \"Q4 Market Analysis\" --style executive\n\n# Technical documentation with table of contents\npython3 report_to_pdf.py -i docs.md -o docs.pdf --style technical --toc\n```\n\n**Available styles:**\n| Style | Description |\n|-------|-------------|\n| `business` | Clean, professional (default) |\n| `executive` | Executive summary with larger fonts |\n| `technical` | Technical documentation |\n| `minimal` | Minimal styling, maximum content |\n\n**Requires:** `pip install markdown weasyprint`\n\n## Usage by Producer Skills\n\nThese utilities are called by the producer skills to assemble final outputs:\n\n```python\nfrom pathlib import Path\nimport subprocess\nimport sys\n\n# Get path to media-utils\nUTILS_PATH = Path(__file__).parent.parent.parent \u002F \"media-utils\" \u002F \"scripts\"\n\ndef concat_audio(files: list, output: str):\n    cmd = [\n        sys.executable,\n        str(UTILS_PATH \u002F \"audio_concat.py\"),\n        \"-i\", *files,\n        \"-o\", output\n    ]\n    subprocess.run(cmd, check=True)\n```\n\n## Output Formats\n\n| Utility | Default Output | Options |\n|---------|----------------|---------|\n| audio_concat | MP3 | Inherits from input |\n| audio_mix | MP3 | MP3 |\n| video_concat | MP4 (H.264) | MP4 |\n| video_audio_merge | MP4 (H.264) | MP4 |\n| video_strip_audio | MP4 (copy) | MP4 |\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fmichaelboeding\u002Fskills\u002Fmedia-utils",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill media-utils",{"tool":39,"command":40},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill media-utils",{"tool":42,"command":43},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill media-utils","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fmichaelboeding\u002Fskills\u002Fmedia-utils\u002FSKILL.md",true,[],[48,62,72,81,87,94],{"skillNo":49,"name":50,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":51,"categories":52,"keywords":58,"publishedAt":20},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[53],{"categoryNo":54,"categoryName":55,"taxonomyType":56,"taxonomyTypeDesc":57},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[59,60,61],"model","model hierarchy","model hierarchy skill",{"skillNo":63,"name":64,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":68,"publishedAt":20},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[67],{"categoryNo":54,"categoryName":55,"taxonomyType":56,"taxonomyTypeDesc":57},[69,70,71],"MCP","zoom","zoom mcp",{"skillNo":73,"name":74,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":20},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[78,79,80,70],"sdk","zoom apps sdk","apps",{"skillNo":82,"name":83,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":20},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[83],{"skillNo":88,"name":89,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":93,"publishedAt":20},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[92],{"categoryNo":54,"categoryName":55,"taxonomyType":56,"taxonomyTypeDesc":57},[89],{"skillNo":95,"name":96,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":20},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[96]]