DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Media Web Preview — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
M

dsh-media-web-preview

Media Web Preview

在浏览器中预览音频和视频,显示于 DSH 右侧边栏,并通过经过身份验证的字节范围媒体路由支持远程浏览器播放和定位大型文件,而无需在 Host 上打开原生应用。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:wilsonchengassistant/dsh-media-web-preview#eb1ae92be47e2e79022e72599957643f1357a105
README兼容性版本

兼容性与来源证明

Media Web Preview 以 dsh-media-web-preview 发布,当前版本为 1.0.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/10/19

版本

1.0.0stable
2026/10/19

相关插件

正在加载相关插件…

最新版
1.0.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/10/19
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 vision-media 分类下经过校验的插件。

Experimental Voice Input Bundle@deepseek-ai/dsh-experimental-voice-input-bundle实验性语音输入,使用本地 SenseVoice;首次使用时下载其运行时Modlens@liustack/modlens面向仅支持文本的 LLM 的插件视觉能力,由免费的 Antigravity CLI 提供支持Ab Ocrdsh-ab-ocr--- description: "外部 ocr 工具:逐页识别扫描的 PDF 或图像,仅在处理完最后一页后按顺序合并页面,并使用模型确定的标题级别保存为一个 Markdown 文档。" kind: "package-reference" ---Tool Describe Image@linxin666/dsh-tool-describe-image面向模型的 describe_image 工具,用于 dsh Web GUI:通过在兼容 OpenAI 的端点调用视觉语言模型,为文本模型提供图像理解能力,以描述一张图像(本地路径、http(s) URL 或附件引用)。可热插拔 —

README

dsh-media-web-preview

Play video and audio inside the DSH right Sidebar — including from a remote browser, where the native Open button would otherwise launch QuickTime or Music on the Host Mac.

The problem

DeepSeek Harness's document preview renders text, Markdown, code, images, PDF, HTML, Office documents and spreadsheets. It has no audio or video renderer, and mp4, mp3, wav, flac, ogg, m4a, aac, wma and opus are listed as known binary containers with no viewer. Opening one shows:

Preview is not available for this file type yet. Open

Open asks the Host to launch the file in a native application. On the machine running the Host that is fine; from a phone, another laptop, or a Tailscale peer it opens a window on a screen you are not looking at.

What this plugin does

It registers two document renderers, video and audio, and draws the browser's native player in the preview pane. A companion Host route streams the file with HTTP Range, so seeking works and a large video is never read into memory or into the conversation.

  • Native controls — play/pause, seek, volume, fullscreen (video), and the browser's own picture-in-picture where available.
  • Seek without downloading everything — 206 Partial Content + Content-Range; the player asks for the bytes it needs.
  • Remote-browser ready — the URL is document-relative, so the same preview works under http://127.0.0.1:3080, a LAN address, a Tailscale MagicDNS name, or tailscale serve on port 80. No configuration.
  • Download / open in a new tab — both actions sit under the player.
  • Localized — English and Simplified Chinese dictionaries.
  • Zero runtime dependencies — one Host module and one browser bundle.

Formats

KindSuffixes
Videomp4 m4v webm ogv mov mkv avi mpg mpeg 3gp 3g2 ts m2ts
Audiomp3 m4a m4b aac wav flac ogg oga opus weba aiff aif wma mid midi

Playback is the browser's decision: Chromium plays H.264/AAC MP4, WebM, Ogg and most audio, but usually cannot decode Matroska (.mkv) or AVI. When a codec is unsupported the player shows an explicit message and the download link rather than failing silently.

Install

From npm:

dsh plugin --profile web add dsh-media-web-preview

From a local directory:

dsh plugin --profile web add file:/absolute/path/to/dsh-media-web-preview

dsh plugin add records the dependency and appends the package to dsh.profile.bundles; the package ships dsh.bundle.patch, so no manual insert: row is needed in the profile's cordis.patch.yml.

The Host half hot-mounts into the running dsh web; refresh the page once so the browser bundle enters the module graph. If your build only composes plugins at boot, restart dsh web instead.

Then open any supported file in the Sidebar's Files tab. The native Open menu stays available at the top.

Why a second file route

DSH already has GET /api/file, used by the image and Markdown previews. It always answers with a full 200, ignores Range, and caps the response at the attachment image limit (20 MB by default). That is fine for images and hopeless for video: no seeking, and a large file just returns 413.

Rather than change a shared route, this plugin adds a range-capable sibling:

/api/file/api/media
Full response200200
Range requestignored (full 200)206 + Content-Range
Seekingmust download the whole fileimmediate
Byte cap~20 MBbounded by the filesystem
Readswhole file buffered1 MiB chunks via ctx.fs.readByteRange

Both routes sit under /api, so the Connection service applies the same Host / Origin check and browser-cookie authentication to both.

Implementation

lib/index.js      Host: GET/HEAD /api/media, Range parsing, chunked streaming
lib/client.js     Browser: documentPreviews + sidebar.right.tab.document
cordis.patch.yml  bundle insert row

The browser half registers through ctx.documentPreviews with loading: 'renderer' and declares the suffixes as binary so nothing falls back to a text preview. The player reads the absolute path from the file resource (useResource(resourceAddress).value.absolutePath), builds a document-relative api/media?path=… URL, and calls content.loaded(version) once to end the loading state.

The Host half registers ctx.connection.fetch.register({ path: '/api/media', methods: ['GET', 'HEAD'] }). Requests resolve through ctx.fs, so the Host's own file policy still applies; parseRange turns Range into a closed interval. 416 carries bytes */<size>; HEAD returns headers only; download=1 adds an attachment Content-Disposition.

Security

  • The route lives under /api, so it inherits the same authentication and Host/Origin checks as every other DSH API. Unauthenticated requests get 401; an untrusted Host gets 403.
  • Only absolute paths are accepted; there is no directory listing, and nothing bypasses the filesystem provider's resolution and access policy.
  • Responses carry Cache-Control: private, no-store and X-Content-Type-Options: nosniff.
  • No telemetry, no outbound network requests, no runtime dependencies.

Verified

  • A 59.6 s MP4 plays and seeks to 40 s over a Tailscale MagicDNS URL.
  • A 28.6 MB MP4 returns 413 on /api/file but 200 / 206 on /api/media.
  • Range: bytes=0-1023 returns 206, Content-Length: 1024, Content-Range: bytes 0-1023/<size>.
  • Unauthenticated requests return 401; an invalid range returns 416 with bytes */<size>.
  • An MP3 reads its metadata and seeks to 30 s.

Compatibility

  • DSH 0.2.0-rc.2 web composition, and later versions that keep providing ctx.documentPreviews, sidebar.right.tab.document, ctx.connection.fetch and ctx.fs.readByteRange.
  • Node 22+.
  • Also usable from the DSH desktop app: the in-app route is document-relative.

Scope

This plugin focuses on the stock right Sidebar and remote-browser playback. It does not provide playlists, subtitle tracks, playback-speed controls, or inline media cards in the chat transcript — other community plugins cover those. Playback behaviour is whatever the browser's native controls provide.

Development

npm test        # node --test: Range parsing and MIME mapping

There is no build step. lib/client.js is a hand-written module-loader bundle (window.__ModuleLoader__.load) that requests only react and react/jsx-runtime, so it uses the Host's own React.

End-to-end check: with the plugin installed in a DSH web instance, open a supported file and confirm the <video>/<audio> element reaches readyState 4 and that currentTime follows after a seek.

License

MIT © 2026 Wilson Cheng