UI Enhancements

dsh-shorts-wall

imkingjh999/dsh-shorts-wall · ★ 2

imkingjh999Curated

DSH plugin: vertical shorts wall for dsh-better-sidebar — YouTube Shorts + Bilibili vertical, dual-source carousel with keyword packs

License
MIT
Added
2026-08-16
Maintenance
active
Install kind
github
npm
dsh-shorts-wall
Manifest details
Manifest status
Declared
Manifest path
dsh.plugin.json
Manifest checked
2026-08-19
Lifecycle scripts
None found

Static manifest checks report declarations only; they are not compatibility or security review.

安装

dsh plugin --profile web add github:imkingjh999/dsh-shorts-wall

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

For install and environment setup, plus plugin development tutorials, see DSH community docs ↗

Screenshots

dsh-shorts-wall screenshotdsh-shorts-wall screenshotdsh-shorts-wall screenshot

README

Source README · body: en · Read Chinese README

Table of contents
  1. Features
  2. Dual-source carousel
  3. Keywords
  4. Playback experience
  5. Project status
  6. Review standard
  7. Running screenshots
  8. Install
  9. Configuration (optional)
  10. Architecture
  11. Known limits
  12. Development
  13. License

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

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+S in 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 declares Alt+S explicitly; 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+M toggles 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-19, v1.3.1 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, and pnpm run build
  • Run node tests/smoke-client.mjs and node tests/e2e-client.mjs
  • Sample the host entry, media proxy, shell state, feed lifecycle, and recently changed files
  • Verify there are no empty catch blocks, debug residues, or unexplained error swallowing
  • Proxy and permission boundaries must have explicit allowlists and failure paths

Running screenshots

Floating Docked Minimized
Floating mode Docked mode 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 search shortsLockupViewModel (+ legacy reelItemRenderer); Bilibili search + concurrent portrait preflight + html5 mp4 playurl.
  • Client (src/client/): the shell comes from the npm package dsh-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), and card-timers (cover/title timing), plus i18n (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