Preface¶
Developers working on DSH (DeepSeek Harness) likely have a constantly running host, a browser session, and music playing in their ears. The problem is: if you want to confirm what the current lyric is, you have to switch to the Netease Cloud Music window for a glance. The act of switching windows is more conspicuous than you reading a lyric.
dsh-plugin-netease-lyrics is made for this scenario: it doesn’t pop up windows or add panels, but sticks the current lyric to the right of the DSH status bar “DeepSeeking, took X seconds …”. It uses the font, size, and color of the host’s small text. To an observer, it just looks like your status message is a bit long. Below is an introduction to what this plugin does, how to install it, and what to watch out for.
What is this¶
A DSH plugin, maintained by YardonYan, repository is YardonYan/dsh-plugin-netease-lyrics, current version 1.0.7, license MIT.
It solves a very specific problem: reading the currently playing track from the desktop version of Netease Cloud Music, getting the lyrics, and displaying them on the right side of the DSH status bar. Currently, it only supports Windows 10/11 hosts and the desktop version of Netease Cloud Music; other systems and music platforms are not implemented.
Core Features¶
The way to read playback info is Windows’ System Media Transport Control (SMTC). The plugin’s Host side keeps a PowerShell worker resident in the host process, reading SMTC once per second to get the song title, artist, and playback status.
The Netease PC client does not report playback position via SMTC, so the plugin runs its own stopwatch to calculate progress: song change resets to zero, pause stops the clock, resume continues. The cause of this step and optional solutions are written in the repository’s docs/playback-position.md.
Lyrics are searched by song to get raw LRC. Chinese, English, Korean, and Japanese are displayed directly without language filtering. For songs with official translations, the translation is displayed when hovering over the lyrics. Netease’s public search interface has IP rate limiting; when returning code: 405 操作频繁, since version 1.0.5, the plugin automatically switches to a backup search endpoint with independent rate limit counting, with lyrics potentially delayed until the next song change.
The rendering layer is done on the Client side: polling every second, fixing the current lyric line to the right of the status bar using fixed positioning, and cloning the font, size, and color of the status bar using computed style on the fly. The overlay does not intercept clicks, and controls below remain usable.
Installation and Activation¶
There are three prerequisites; if any are missing, it won’t run: dsh is in PATH; Desktop Netease Cloud Music has SMTC enabled; pnpm can be found in PATH (dsh plugin doesn’t install packages itself, it forwards arguments to pnpm, and if not found it will exit with dsh: pnpm was not found).
The switch on the Netease side is in Settings → General → System → Check “Enable SMTC”. If not enabled, the system cannot read playback status, and the plugin cannot get any data.
Installation uses a single command without cloning the repo:
dsh plugin --profile web add github:YardonYan/dsh-plugin-netease-lyrics
This command treats the repo as an npm package wrapped into the web profile’s dependencies and registers it in dsh.profile.bundles in the same package.json. After installing, restart dsh web, otherwise the Host process won’t load the new plugin, and you’ll need to refresh the page.
After installation, you must confirm separately; add returning 0 does not mean it is installed correctly:
dsh --profile web --dump-config
The output should contain a section like this:
# == dsh-plugin-netease-lyrics
- id: netease-lyrics
name: dsh-plugin-netease-lyrics
config: {}
Without this section, it’s not installed. Common reasons for this are a wrong package name or path; pnpm might install a stub dependency and exit normally. You can use the following command to see what was actually installed:
dsh plugin --profile web why dsh-plugin-netease-lyrics
Typical Usage¶
After installation, getting the plugin running only takes four steps:
- Open the desktop version of Netease Cloud Music and play a song.
- Send any message in DSH to get the AI running and the status bar to appear.
- The same-style lyrics appear on the right side of the status bar, changing lines with the singing progress.
- Hover over the lyrics to see the full sentence and translation (if available).
The actual working location is index.js (Host side) and client.js (Client side) in the plugin source code. To debug or modify the plugin itself, use local cloning for installation:
$dir = "$env:USERPROFILE\dsh-plugins\dsh-plugin-netease-lyrics"
git clone https://github.com/YardonYan/dsh-plugin-netease-lyrics.git $dir
dsh plugin --profile web add $dir
The local directory is remembered by pnpm as a link: dependency; the cloned directory is the plugin entity: deleting, moving, or changing drive letters will immediately invalidate the plugin, so don’t put it in a temp directory or download folder. No need to reinstall after changing source code: restart dsh web after changing index.js, or just refresh the page after changing client.js.
The README suggests installing via local cloning because the plugin needs to stay updated with the host and Netease client, and cloning only requires a git pull network diff. The repository also provides an update prompt text; if the plugin fails, you can send the whole paragraph to the DSH session to let the AI automatically complete “pull new version → determine if restart needed → give conclusion”.
Updates and removals are handled via dsh plugin:
dsh plugin --profile web update dsh-plugin-netease-lyrics
dsh plugin --profile web remove dsh-plugin-netease-lyrics
Both require restarting dsh web to take effect.
Configuration¶
The default anchor is “DeepSeeking, took”. If you change the interface language, you can append a patch targeting by ID to the top-level array of cordis.patch.yml in the profile. Parameters:
- id: netease-lyrics
config:
anchorText: "DeepSeeking, took" # Change to your host status bar text
Note not to write insert, as that will add a new line of plugin instead of modifying this line. anchorText only recognizes this key; its purpose is to locate the host status line in the page, not to replace the lyric content. When not configured, non-string, or empty string, it falls back to the built-in default “DeepSeeking, took”. The text should be a small stable segment in the status bar; too short is easy to match chat body text, too long might not match when the status bar splits text nodes. Refresh the page after changing; restart dsh web only if changing index.js.
Suitable Scenarios and Notes¶
Suitable for DSH users on Windows 10/11 hosts using Desktop Netease Cloud Music who want lyrics to be discreetly visible. Only this combination has been verified: macOS, Linux, and clients like QQ Music, Kugou, Spotify, Apple Music are not implemented. This is not a configuration switch but an implementation-level binding—the playback status comes from Windows-exclusive SMTC, macOS and Linux need to find another system-level playing interface; lyric retrieval goes through Netease’s public interface, changing platforms requires connecting to a different lyric source and rewriting track ID matching.
Known limitations on the runtime side:
| Limitation | Reason | Mitigation |
|---|---|---|
| Lyrics drift after dragging Netease progress bar | SMTC does not report seek | Change to another song and back to re-align |
| Stopwatch runs out of song at end of single loop | Stopwatch doesn’t know total song length | Same as above |
| Inaccurate outside Chinese interface | Anchor matches “DeepSeeking, took” | Change anchorText in config |
| Lyrics don’t display when AI is idle | Design behavior: lyrics hide if status line is gone | Want constant display, need to modify client.js stealth judgment yourself |
| Access only to local machine | Routes only respond to loopback and check Origin | Security feature, not exposed externally |
| Can’t get lyrics | Track has no copyright, or first candidate has no lyrics | Cannot bypass; only tries the first candidate |
| Lyrics have hour-level blank spots | Netease search interface IP rate limiting | Since 1.0.5 automatically switch to backup endpoint |
When lyrics don’t display, the first check item is always the Netease “Enable SMTC” switch; check it and change songs once to take effect. For more detailed troubleshooting, see the “Troubleshooting Quick Reference” section in the README.
This plugin runs with the current dsh process permissions and only listens on loopback. Before installing, you should still read the source code once to confirm the MIT license meets your requirements. The directory page for the DSH ecosystem has no official affiliation with DeepSeek / Huafan; what is given here is just the community directory entry.
Conclusion¶
It hides the “glance at lyrics” action inside the DSH window you already have open, at the cost of a resident worker and a local HTTP route. For those who indeed need to work while listening, this is a more handy answer than switching windows.
Directory page: https://www.skillhub.cn/plugins/YardonYan/dsh-plugin-netease-lyrics
Repository: https://github.com/YardonYan/dsh-plugin-netease-lyrics