dsh-video-player
用于 DeepSeek Harness 的可拖拽、可缩放悬浮视频播放器。
ip050
@ip050
⬇ 2
★ 1
main
安装
dsh plugin --profile web add github:ip050/dsh-video-player
需要可复现安装时,可在仓库后追加 #commit 固定提交。
用于 DeepSeek Harness 的可拖拽、可缩放悬浮视频播放器。
该插件未提供要点说明,请参考仓库 README。
deepseek-harnessdeepseek-harness-plugindsh-plugindsh-plugin-marketstashvideo-player
- 安装并启动 DeepSeek Harness:
npx @deepseek-ai/dsh web - 在终端执行上面的安装命令(CLI 会解析插件并核验来源)
- 用 dsh plugins list 确认已安装,必要时重启 Harness 生效
插件以当前 dsh 进程的权限运行,安装时可能执行代码。请先通读仓库源码与许可证,确认无破坏性命令与越权访问;本站只做索引,不对第三方插件安全性作担保。
| 代码仓库 | github.com/ip050/dsh-video-player |
| 许可证 | MIT |
| 主要语言 | main |
| 下载量 | 2 |
| GitHub 星标 | 1 |
| 最近推送 | 2026-08-25 |
| 收录日期 | 2026-09-19 |
| 分类 | 趣味 |
事实信息来自公开插件目录快照(2026-10-01),介绍文案由本站再加工。
以下为插件仓库 README 全文(原始内容,由公开目录抓取整理)。
# dsh-video-player


A floating, draggable, resizable **video player** for DeepSeek Harness (DSH).
It mounts a small window over the web UI that plays scene-per-MP4 clips from a
Stash-style scene server — propping a video feed beside your chat and paging
through clips while you work. The window moves and resizes in real time, like a
real PiP video. **Stash is the star**; other sources are best-effort.
## Install
```sh
npm install -g pnpm@11 # the container image ships no pnpm
dsh plugin --profile web add /path/to/dsh-video-player
# restart the web profile (bundle changes apply at boot only):
sh ~/.dsh/dsh-guard/restart-web.sh
```
> **Linked installs need an import bridge.** `dsh plugin add ` installs the
> plugin as a `link:` symlink, and Node resolves the host module's imports from
> its realpath (`/path/to/dsh-video-player`), which sits outside the profile's
> `node_modules`. Before installing from a local dir, give it a bridge:
>
> ```sh
> mkdir -p /path/to/dsh-video-player/node_modules/@deepseek-ai
> ln -s ~/.dsh/profiles/node_modules/@deepseek-ai/dsh-settings /path/to/dsh-video-player/node_modules/@deepseek-ai/dsh-settings
> ln -s ~/.dsh/profiles/web/node_modules/schemastery /path/to/dsh-video-player/node_modules/schemastery
> ```
## Features
- **Floating, resizable window** — drag the title bar to move it, drag the
bottom-right corner to resize live (min 200×140). Native `` player with
controls (play/pause, scrub, fullscreen, volume). Inputs and buttons in the
title bar are excluded from the drag handler, so they stay clickable/typable.
- **Stash scene navigation (the star)** — `◀` / `▶` step scenes, a number
field + `Go` / Enter jumps anywhere, and a status line shows the exact stream
URL. The default server is `http://host.docker.internal:9999` with
`/scene/{no}/stream` per clip; it supports Range requests (verified
`206 Partial Content`), so seeking works.
- **Channel dropdown (custom widget)** — Stash / Custom link / YouTube / Twitch
/ Jellyfin. Built as buttons, not a native `` (which was unreliable in
DSH's dark UI). Picking a channel switches the source immediately.
- **Link field with auto-detect** — paste a YouTube / Twitch / Jellyfin /
direct-file link and it auto-picks the channel and plays it (never appends a
`/scene/N/stream` suffix). Enter or the ▶ button plays; paste auto-plays.
- **Gear panel (⚙) = window + Stash config only** — width, height, opacity, and
the **Stash base URL** (scene server root). Source/channel config deliberately
does NOT live here.
- **Persisted geometry** — position, size, and opacity survive reloads
(localStorage).
- **Coexists with the pet & themes** — it's a separate fixed overlay alongside
the DSH pet and dream-skin wallpaper.
## Architecture
- **Host half (`lib/index.js`)** — registers the `dsh-video-player` settings
namespace (schema: `base`, `channel`, `url`, `scene`) and serves
`GET/POST /api/dsh-video-player/config`. The POST handler writes through the
DSH settings service, so the source config persists in the real settings
store (not localStorage).
- **Client half (`lib/client.js`)** — self-contained (plain DOM, `inject: []`,
activates immediately). It polls `GET /api/dsh-video-player/config` (~2.5s)
and pushes title-bar changes back with `POST`, so the floating window and the
settings store stay in sync.
## Bugs we hit and fixed (the lessons)
1. **Host `export default` drops `inject`.** DSH's bundle loader unwraps a
module's `default` export to the bare function, silently discarding
`inject`/`name` — services then throw `cannot get property "webServer"
without inject` at boot and take the whole app down. Fix: use **named
exports only** (`export function apply`, `export const inject`, `export const
name`), exactly like the dsh-pet host bundle.
2. **A client that declares an inject it never uses hangs.** The client once
declared `inject: ["@deepseek-ai/dsh-client-runtime"]` without requiring it,
and sat forever in `pending (waiting for service: …)`. Fix: keep the client
self-contained with `inject: []`.
3. **Host imports don't resolve for `link:` installs.** See the bridge note
above.
## Roadmap
- **Layer control** — put the window in front of chat (default), behind it /
tuck into the sidebar, or "minimize to sidebar".
- **Transparency** — window opacity (done: 0.3–1.0 in the gear panel) plus a
click-through toggle for when you want to watch but not interact.
- **Alarm / "someone walked in" button** — one click plays a sound (TBA).
- **Scene thumbnail rail** — thumbnails for the current scene ± a few, for
faster paging.
- **Settings-menu card** — the `dsh-video-player` settings namespace is
registered; if the generic settings surface doesn't render it as its own
section, add a client settings card (like the pet's) so channel/link are
editable from Settings → dsh-video-player.
- **Stash scene list** — probe the server for valid scene numbers and page
within the real set instead of ±1.
数据来源:公开的 DeepSeek Harness 插件目录与各插件 GitHub 仓库。本站为独立第三方目录,与 DeepSeek、幻方(High-Flyer)及插件作者均无隶属或背书关系。