Install
Inside DeepSeek Harness, with dsh-market
dsh plugin --profile web add dshmarket
Or from the command line
dsh plugin --profile web add dsh-shorts-wall
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.
Screenshots
README
Repo: https://github.com/imkingjh999/dsh-shorts-wall · issues welcome
中文 | English
A vertical shorts wall plugin for DeepSeek Harness (DSH) that runs docked to the right edge by default: switch on the Float toggle for a draggable/resizable floating window, or close it and recall from the bottom-right launcher. Dual source: YouTube Shorts + Bilibili vertical — wheel/keys/buttons to advance, auto-next on end, auto-append at the tail.
Personal viewing only. Anonymous public APIs and official playback channels throughout: no login, no cracking, no signature forging. Respect each platform's terms of service.
Features
Dual-source carousel
Header YT / B站 chips switch sources (remembered), with a "Switching…" toast.
| YouTube Shorts | Bilibili vertical | |
|---|---|---|
| Playback | Official iframe embed | Native mp4 <video> (host-proxied, Range seek works) |
| Content | Anonymous search (shorts filter) | Anonymous search + portrait preflight (concurrent view calls confirm 9:16; landscape dropped) |
| Auto-advance | End events + watchdog fallback | Native events (most reliable) |
| Tail append | Same-keyword re-search, deduped | Paged append |
Keywords
- The active keyword shows as a chip in the header (right of the B站 chip); click it to open the keyword picker and switch with one click
- "More videos" fetches a fresh batch under the SAME keyword (not a keyword change)
- ⚙ keyword panel:
- Preset packs (click to replace the list, + to append with dedup): KPOP fancam / Fashion / Costume / Pets / POV / Beach & swimwear / Stage
- Custom: add entries one by one with region + keyword fields
- Inline edit / reorder / delete / reset; per-source lists persisted independently (localStorage)
Playback experience
- Window modes: the title-bar Float toggle turns floating mode on (drag / corner-hover resize cursors); off is the default docked rail; both modes share one remembered position and size, so the window never moves when toggling, and the “Minimize” button lives at the window's bottom-right
- Boss key: the title bar shows “Boss key Alt+S”; press
Alt+Sin floating or docked mode to minimize instantly, and press it again to restore the previous floating/docked layout and size without reloading playback (this window declaresAlt+Sexplicitly; other float windows on screen — e.g. deepsea — auto-receive non-conflicting combos) - 9:16 locked: the player is the largest vertical rectangle inscribed in the card — width and height both fit the viewport
- Navigation: wheel (debounced) /
↑↓/j·k/ ‹ › buttons; a wheel-catcher veil over the iframe (wheel never swallowed), click to hand control to the player for 6s - Auto-play chain: end → next; tail → append; dead items auto-skip (3-in-a-row breaker); platform-level YT outage shows a "YouTube unavailable" banner with a one-click switch to Bilibili
- Sound: text buttons "Sound on / Muted" (no emoji), preference persisted;
Alt+Mtoggles mute quickly - Intro chrome: cover lifts after 1s, title hides after 2s (hover to see) — never blocks the picture
- i18n: UI follows the DSH host language (中文 / English), switching live
Project status
Current review_audit score: 90 / 100 (2026-08-18, v1.1.0 review baseline).
Review standard
DSH review_audit provides the objective baseline, followed by sampled review of the host entry, proxy boundary, shell-state module, and lifecycle tests. The score is engineering health, not a security certification.
Overall score
- Arithmetic mean of eight dimensions, rounded to an integer
- Passing threshold: 60
- Release target for this repository: ≥ 90
- Any dimension below 40 is treated as a priority failure
Dimensions and deductions
| Dimension | Current | Scoring rule |
|---|---|---|
| Structure | 88 | Starts at 88; minus 6 per source file over 500 lines, minus 15 when there is no directory structure |
| Maintainability | 90 | Starts at 90; minus 2 per file containing legacy work markers, minus 4 per oversized file, minus 1 per 40 lines over 120 characters (maximum deduction 30) |
| Consistency | 90 | Starts at 90; minus 8 per file mixing tab/space indentation, plus minus 15 for project-wide mixed indentation |
| Robustness | 85 | Starts at 85; minus 5 per empty catch, minus 2 per leftover debug output |
| Tests | 100 | Passing suite scores 60 + min(40, test-file count × 10); a failing suite scores 20 |
| Docs | 100 | README 40, LICENSE 25, .gitignore 20, and README completeness 15 |
| Performance | 83 | Starts at 85; minus 3 per oversized file, minus 4 per 10 dependencies (maximum deduction 20), plus minus 15 above 20,000 lines |
| Security | 86 | Starts at 90; dependency-count deduction capped at 25, additional deductions for debug residue and empty catch; dependency-audit vulnerabilities add further penalties when enabled |
Minimum manual review
- Run
pnpm typecheck,pnpm test, andpnpm run build - Run
node tests/smoke-client.mjsandnode tests/e2e-client.mjs - Sample the host entry, media proxy, shell state, feed lifecycle, and recently changed files
- Verify there are no empty
catchblocks, debug residues, or unexplained error swallowing - Proxy and permission boundaries must have explicit allowlists and failure paths
Running screenshots
| Floating | Docked | Minimized |
|---|---|---|
![]() |
![]() |
![]() |
Install
Requires DSH ≥ 0.1.0 with a web profile. No other plugins required.
dsh plugin --profile web add github:imkingjh999/dsh-shorts-wall
# restart dsh web, then hard-refresh (⌘⇧R / Ctrl+Shift+R)
A「Shorts」floating-window entry appears at the bottom-right of the page.
cd ~/.dsh/profiles/web
pnpm add link:~/projects/dsh-plugins/dsh-shorts-wall
# append "dsh-shorts-wall" to dsh.profile.bundles in package.json
pnpm install && pnpm run build # in the plugin directory
Configuration (optional)
In the profile's cordis.patch.yml:
- id: shorts-wall
config:
extraAllowSuffixes: [cdn.example.com] # extra proxy allowlist suffixes
resolveProxyUrl: http://127.0.0.1:7890 # optional personal proxy for feed scraping
Architecture
- Host (
src/index.ts):POST /shorts/api/feed(youtube shorts search · bilibili vertical search) +POST /shorts/api/play(bilibili mp4) +GET /shorts/proxy(browser-trust fence + CDN allowlist + Range passthrough). Legacy/bilibili/*prefixes kept for compat. - Resolvers (
src/youtube.ts,src/bilibili-shorts.ts): YT anonymous searchshortsLockupViewModel(+ legacyreelItemRenderer); Bilibili search + concurrent portrait preflight + html5 mp4 playurl. - Client (
src/client/): the shell comes from the npm packagedsh-float-window(float/dock/minimize, four-corner resizing, boss key); this repository supplies only plugin labels and content. Behavior hooks:embed-events(YT player events/watchdog),feed-state(dual-source batches/append/keywords), andcard-timers(cover/title timing), plusi18n(zh/en). better-sidebar is no longer required.
Known limits
- The YouTube source needs the browser to reach YouTube; during platform risk-control (bot walls) that source is unavailable — the plugin shows a clear banner and a one-click switch to Bilibili, which is unaffected.
- Anonymous quality tier: YT per the official embed; Bilibili ~480p/720p (higher needs login — out of scope).
- YT anonymous search has no pagination: ~15–30 items per batch; appends re-search the same keyword with dedup.
Development
pnpm install
pnpm test # vitest: resolvers / lifecycle (jsdom) / i18n dictionaries
pnpm typecheck
pnpm run build # tsdown: host ESM + dual-channel client CJS factories
node tests/smoke-client.mjs && node tests/e2e-client.mjs # headless smoke + jsdom render e2e
License
MIT