Skip to content
dsh-market Browse plugins GitHub 中文

STARDUSTLC666/dsh-ffmpeg

Ten video tools (probe/cut/concat/encode/subtitle/extract/gif/frames/adjust/health) on the official subprocess service: probe summaries, batch frame extraction, speed/volume/mute/rotate adjust, shell-free argv, zero runtime dependencies.

Stars ★ 5 Category Tools & Capabilities Listed 2026-08-15 npm dsh-ffmpeg

Install

Inside DeepSeek Harness, with dsh-market

dsh plugin --profile web add dshmarket

Or from the command line

dsh plugin --profile web add dsh-ffmpeg

Installing runs third-party code with your own permissions — it can read your files, use your credentials and reach the network. Review the source first, and pin a commit (github:owner/repo#sha) when you can.

README

中文

dsh-ffmpeg

DSH (DeepSeek Harness) video-processing plugin: seven tools covering probing, cutting, concatenation, transcoding, subtitles, extraction and GIF creation — all powered by ffmpeg/ffprobe.

Compatibility

Validation host: Harness 0.2.0-rc.1 built from official sources (commit 407e65c8) with Node 24.16.0 on 2026-09-28. All 96 plugin tests pass in an isolated environment; all 18 plugins mount together in one host registering 10 tools, with tool schemas and health-check contracts passing. No live ports or external services were exercised in this round.

2026-09-13 fix: retain the service receiver when calling subprocess.spawn, preventing failures caused by passing the method as an unbound callback. Verified against a real isolated host subprocess service. FFmpeg/ffprobe version checks and probing a real MP4 pass. This fixes the tool invocation failure reported in #3.

Installation

dsh plugin --profile web add dsh-ffmpeg

ffmpeg must be installed locally (ffmpeg -version should work); use ffmpegPath / ffprobePath, or the DSH_FFMPEG_PATH / DSH_FFPROBE_PATH environment variables, when it is not on PATH.

Uninstall

dsh plugin --profile web remove dsh-ffmpeg

Then restart the web service. To clean up fully, also remove the plugin entry from your profile cordis.patch.yml if you overrode it.

Configuration

Override the plugin row in your profile's cordis.patch.yml (defaults apply when absent):

- id: ffmpeg
  name: 'dsh-ffmpeg'
  config:
    # ffmpegPath: C:\tools\ffmpeg\bin\ffmpeg.exe   # explicit path (or DSH_FFMPEG_PATH)
    # ffprobePath: C:\tools\ffmpeg\bin\ffprobe.exe # or DSH_FFPROBE_PATH
    timeoutMs: 300000                                # per-operation timeout (default 5 min, 10s - 2h)
    # overwrite: true                                 # allow overwriting outputs (default auto-suffix _1/_2)

Tools

Tool Purpose Key parameters
ffmpeg_probe Probe media info (format/duration/resolution/fps/bitrate/audio/subtitle streams; multi-video files return a full videos list) input required
ffmpeg_cut Cut a clip (stream copy by default, accurate re-encode optional) input required; start/end/duration
ffmpeg_concat Concatenate 2-20 clips (stream copy for identical codecs / re-encode for mixed; video-only when any input has no audio) inputs array required
ffmpeg_encode Transcode with presets (bilibili 1080p/4K, vertical 1080p, web-720p) plus crf/fps/scale overrides input required; preset optional
ffmpeg_subtitle Burn subtitles (SRT/ASS hard subs) input + subtitle required
ffmpeg_extract Extract audio (m4a; non-AAC is auto-transcoded to AAC) / frame sequences / single frame / subtitle stream input + what required
ffmpeg_gif Video to high-quality GIF (two-pass palette) input required; fps/width/duration optional

Examples

ffmpeg_probe { input: E:\videos\raw.mp4 }
ffmpeg_cut { input: E:\videos\raw.mp4, start: 10, end: 30 }
ffmpeg_encode { input: E:\videos\raw.mp4, preset: bilibili-1080p }
ffmpeg_subtitle { input: E:\videos\raw.mp4, subtitle: E:\videos\subs.srt }
ffmpeg_extract { input: E:\videos\raw.webm, what: audio }
ffmpeg_gif { input: E:\videos\raw.mp4, duration: 3, width: 480 }

Safety

  • No shell: every argument is passed as its own argv element — user input cannot inject commands
  • Runs on the official DSH subprocess service: the timeout AbortSignal now really drives tree-scoped termination (SIGTERM → kill; taskkill /T on Windows), zero runtime dependencies
  • No accidental overwrites: existing outputs get auto-suffixed; output == input is rejected
  • Timeout clamps: per-operation 10s - 2h; probes additionally capped at 60s
  • Input validation: time formats, preset enums, crf/fps/scale ranges are validated up front; directory inputs are rejected and extension-less frame-sequence outputs are auto-fixed

Development

pnpm install
pnpm test       # build + 102 tests, including a real-ffmpeg end-to-end suite (auto-skipped without ffmpeg)

License

MIT

Changelog

  • 0.4.3 (2026-09-18): 修复抽帧数到旧帧/清单截断、取消被当成功、取消文案丢原因、+2dB 被拒; 音轨提取非 AAC 自动转 AAC、concat 混合音轨可用、ffprobe 截断明确报错. 测试 102 项.

Content from the project README on GitHub ↗

Comments

Comments live in GitHub Discussions. Sign in with GitHub to post or react.