87 lines
8.7 KiB
Markdown
87 lines
8.7 KiB
Markdown
---
|
||
name: netease-music
|
||
description: 放网易云音乐并控制播放:直接调接口(搜歌点播、每日推荐、我喜欢的音乐、暂停切歌、音量、歌词、喜欢),不像以前那样模拟鼠标点界面。用户说「放首歌/放每日推荐/换一首/暂停/现在在放什么」时使用。
|
||
platforms: [darwin]
|
||
---
|
||
|
||
# 网易云音乐(netease-music)
|
||
|
||
**一句话**:`pi-skill netease-music daily` 直接开播每日推荐;`play <关键词>` 想听什么说什么;控制都是毫秒级命令,状态是真值。
|
||
|
||
## 何时用
|
||
|
||
| 用户说的 | 跑这个 |
|
||
|---|---|
|
||
| 放每日推荐 / 放点歌 | `pi-skill netease-music daily`(`--limit 20` 少放点,`--shuffle` 随机) |
|
||
| 放某首歌 / 某个歌手的歌 | `pi-skill netease-music play "<关键词>"` |
|
||
| 放某张歌单 | `pi-skill netease-music play "<歌单链接>"`(或 `play playlist:<id>`;id 用 `myplaylists` 查) |
|
||
| 放我喜欢的音乐 | `pi-skill netease-music liked` |
|
||
| 放某位歌手的热门 | `pi-skill netease-music artist "陈粒"`(`--limit 20` 少放点;也可给歌手 id) |
|
||
| 放某张专辑 | `pi-skill netease-music album "自传"`(名字、id、专辑链接都行) |
|
||
| 查某歌手有哪些专辑 | `pi-skill netease-music albums "周杰伦"`(只列不播;搜不到正版专辑时用它拿 id) |
|
||
| 放别人做的歌单 | `pi-skill netease-music playlist "夜跑"`(名字直接写;`playlists "夜跑"` 只搜不播) |
|
||
| 放排行榜 | `pi-skill netease-music chart 飙升榜`(`charts` 列全部 63 个) |
|
||
| 放我收藏的歌单 / 专辑 / 歌手 | `pi-skill netease-music myplaylists collected` / `myalbums` / `myartists` |
|
||
| 放点没听过的 | `pi-skill netease-music fm`(私人 FM) |
|
||
| 刚才那首再放一遍 | `pi-skill netease-music replay`(`recent` 看最近播放) |
|
||
| 放播客(订阅的) | `pi-skill netease-music podcasts` → `podcast 黑水公园 --limit 3` |
|
||
| 换队列但别丢现场 | 每次换队列会自动留「上一条」:`back` 切回(含位置);`queue-save 名字` / `queue-load 名字` 自己存取的;`queues` 看有哪些 |
|
||
| 往队列里加一首 | `pi-skill netease-music add "幻听"`(不动正在放的那首) |
|
||
| 把搜索结果整列播放 / 从某首开始 | `pi-skill netease-music play-ids 1000,1001,1002 --start 2`(单个逗号分隔的 ID 参数;按输入顺序,序号从 1 开始) |
|
||
| 看队列 / 跳到第几首 | `pi-skill netease-music queue` / `jump 5` |
|
||
| 删除队列第几首 / 清空 | `pi-skill netease-music remove 3` / `clear`(当前项删除后选下一首,末尾选上一首,删空停止;保留暂停状态) |
|
||
| 单曲循环 / 整列循环 / 关闭循环 | `pi-skill netease-music repeat single` / `repeat list` / `repeat off`(旧 `on` = `list`;状态字段 `repeat_mode`) |
|
||
| 换一首 / 回上一首 | `pi-skill netease-music next` / `prev` |
|
||
| 暂停 / 继续 | `pi-skill netease-music pause` / `resume`(或 `toggle`) |
|
||
| 声音大点 / 小点 | `pi-skill netease-music volume 45`(不带数字=读当前值) |
|
||
| 现在在放什么 | `pi-skill netease-music status` |
|
||
| 这首歌歌词 | `pi-skill netease-music lyric`(`--all` 全文) |
|
||
| 查歌曲封面 / 下载封面 | `pi-skill netease-music cover "<歌曲关键词或id>"`(始终输出 JSON;加 `--download PATH` 下载,覆盖需 `--force`,最多 10 MB = 10,000,000 字节;不改变队列或登录态) |
|
||
| 这首好听,收藏 | `pi-skill netease-music like`(`unlike` 取消) |
|
||
| 私人 FM 这首不喜欢 | `pi-skill netease-music dislike`(也可 `dislike 1000` 指定歌曲 ID;提交 `fm/trash`,不自动切歌) |
|
||
| 查询哪些歌曲已喜欢 | `pi-skill netease-music liked-ids --json`(`{count,total,ids:[数字,...]}` 全表;只读) |
|
||
| 只是查有哪些歌 | `pi-skill netease-music search "<关键词>"`(只列不播) |
|
||
| 取歌曲 JSON 给播放器 | `node scripts/netease-api.mjs song "<关键词或id>"`(歌曲字段依次为 `id/name/artist/album/ms/vip/cover`;没有封面时为 `""`;接口提供布尔 `liked` 时追加它) |
|
||
| 列下一页 | `pi-skill netease-music myplaylists --limit 3 --offset 3`(跳过前 3 条;`--json` 带 `total`,人读样式不变) |
|
||
|
||
**分页**:`playlist` / `liked` / `album` / `artist` / `chart` / `search` / `playlists` / `charts` / `myalbums` / `myartists` / `recent` / `podcasts` / `podcast`,以及 `myplaylists` / `albums` / `daily`,都支持 `--limit N --offset N`。`offset` 默认 0,从 0 起跳过 N 条;后端 JSON 的 `count` 是本页条数,`total` 是接口总数(没给总数时用接口返回、尚未本地截取的条数)。翻过末尾返回空列表,具体口径见 `REFERENCE.md`。
|
||
|
||
**封面**:`cover` 查询返回 `{id,name,artist,cover}`,下载返回 `{id,cover,file,bytes}`(`file` 为绝对路径,`bytes` 为实际字节数)。歌曲或封面缺失时报 `notfound` 错误 JSON;下载路径的父目录须已存在。字段来源与大小检查见 `REFERENCE.md` §2.2。
|
||
|
||
**批量与队列**:`play-ids <id,id,...> [--start N]` 接收一个无空格、逗号分隔的正整数 ID 参数,保留顺序和重复项;默认从输入列表第 1 首开始。`--start` 指输入列表的 1 基序号;指定歌曲无播放地址或任一歌曲详情缺失时报错并保留旧队列,其他无地址项跳过并计入 `skipped`。它关闭随机,不支持 `--shuffle`。`remove N` 按 `queue` 显示的顺序删除(含随机队列);`clear` 停止、清掉本地队列和地址保活,保留配置及快照。
|
||
|
||
**喜欢状态**:列表、搜索和详情的歌曲对象仅在接口提供布尔值时追加 `liked: true|false`;`liked` 歌曲列表全部为 `true`。缺字段表示未知,可用只读 `liked-ids --json`(或 `node scripts/netease-api.mjs liked-ids`)取得完整 ID 数组后按 ID 补齐;不自动为每首歌增加请求。`dislike [id]` 是私人 FM 的不喜欢,与 `unlike` 分开;只提交 API,播放位置和队列保持原样。
|
||
|
||
**循环状态**:`repeat off|list|single` 同时设置 mpv 的两个循环属性;`on` 和无参数继续表示 `list`。`status` 的 `repeat_mode` 报 `off/list/single`,原 `repeat` 布尔字段仍表示是否整列循环。
|
||
|
||
**首次使用**:`pi-skill netease-music check`(自检依赖与登录态)。没登录就登一次,两条路都行:
|
||
`login --sms <手机号>` 收验证码,再 `login --sms <手机号> --sms-code <验证码>`(主力,实测最稳);
|
||
或 `login` 出二维码用手机网易云 App 扫(30 秒)。cookie 只存本机。
|
||
|
||
**与音箱配合**:电脑的声音去哪台设备由系统输出决定,要让家里的 EDIFIER 音箱出声就先 `pi-skill edifier-speaker bt`(它会切音箱档位 + 把系统输出接过去)。
|
||
|
||
## 失败 → 动作
|
||
|
||
| 现象 | 动作 |
|
||
|---|---|
|
||
| `error=auth`(未登录) | `login --sms <手机号>` 两步短信登录;或 `login` 扫码;或 `setup --cookie 'MUSIC_U=…'` 粘浏览器里的 cookie |
|
||
| `error=notfound`(搜不到/歌单不存在) | 换个关键词;歌单 id 用 `myplaylists` 查 |
|
||
| `error=notfound ... 没有一首能播` | 这首/这张全要 VIP 或没版权:换一个(周杰伦正版目录基本都这样) |
|
||
| 歌手/专辑搜到的是翻唱 | 用 `albums <歌手>` 拿正版专辑 id,再 `album <id>`(网易搜索索引会缺正版) |
|
||
| `error=deps missing=mpv` | `brew install mpv`(播放器);`qrencode` 只在扫码登录时要 |
|
||
| `error=external ... url=null` | 那首要 VIP 或没版权,队列会自己跳过并在 `skipped=` 里报数量 |
|
||
| `error=timeout`(扫码超时) | 重新 `login`(二维码 2 分钟过期) |
|
||
| 队列有歌但没声音 | 系统输出没指向音箱:`pi-skill edifier-speaker bt`;或 `volume` 太小 |
|
||
| 播放卡在旧队列 | `stop` 清空队列再来 |
|
||
| `error=notfound 没有上一条可切回` | 还没换过队列;`queues` 看有哪些快照 |
|
||
| 换队列后想找回刚才那条 | `back`(回到上一条,含放到哪儿);更早的看 `queues`,或 `queue-load <名字>` |
|
||
| `add` 之后没马上听到 | 队列开着随机,新歌在队尾按随机顺序插进来;想顺序放先 `shuffle off` |
|
||
| 播客某一期放不出来 | 那期要付费或已下架;换几期:`podcast <播客> --limit 5` |
|
||
|
||
## 边界
|
||
|
||
- 只做「播放与控制」,不碰客户端界面;官方客户端开着不受影响,两边互不干扰(各放各的)。
|
||
- 音质默认无损(`quality`,改成 `exhigh` 可省流量)。
|
||
- 歌单每页默认最多取 500 首,每日推荐 40 首(`--limit` 可调);用 `--offset` 接着取下一页,500 不是歌单总量上限。歌手热门默认 50 首、专辑默认 200 首;后端用 `total` 报分页前数量。
|
||
- 能不能播由版权/VIP 决定:拉不到地址的会被跳过(`skipped=` 报数量),整张都拿不到就 `error=notfound`。
|