feat: switch to UNM (Rust) (#1536)

* refactor: use unm-rust-napi

* ci(build): install UNM dependencies for certain platforms

* feat: add the ability to configure UNM

* feat: add the UNM configuration in settings page

* refactor(jsconfig): jsx -> preserve

* fix(ci/build): use bash to get unm version

* chore(deps): upgrade UNM to 0.3.0-pre.0

* refactor(electron/ipcMain): update default sources

* fix(views/settings): remove duplicated config entry

* feat(settings): allow configuring QQ cookie

We also removed some duplicate entries in views/settings.vue.

* chore(deps): UNM -> 0.3.0-pre.1

* refactor: remove unused old UNM

* fix(utils/player): do not include rust-napi in client code

As we only imported the constant, I just expand it as the integer.

Co-authored-by: qier222 <qier222@outlook.com>
This commit is contained in:
pan93412 2022-04-28 01:02:41 +08:00 committed by GitHub
parent e1f7618cbd
commit 93ae57adbe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 452 additions and 208 deletions

View File

@ -1,5 +1,8 @@
name: Release
env:
YARN_INSTALL_NOPT: yarn add --ignore-platform --ignore-optional
on:
push:
branches:
@ -42,6 +45,39 @@ jobs:
with:
snapcraft_token: ${{ secrets.snapcraft_token }}
- id: get_unm_version
name: Get the installed UNM version
run: |
yarn --ignore-optional
unm_version=$(node -e "console.log(require('./node_modules/@unblockneteasemusic/rust-napi/package.json').version)")
echo "::set-output name=unmver::${unm_version}"
shell: bash
- name: Install UNM dependencies for Windows
if: runner.os == 'Windows'
run: |
${{ env.YARN_INSTALL_NOPT }} \
@unblockneteasemusic/rust-napi-win32-x64-msvc@${{steps.get_unm_version.outputs.unmver}}
shell: bash
- name: Install UNM dependencies for macOS
if: runner.os == 'macOS'
run: |
${{ env.YARN_INSTALL_NOPT }} \
@unblockneteasemusic/rust-napi-darwin-x64@${{steps.get_unm_version.outputs.unmver}} \
@unblockneteasemusic/rust-napi-darwin-arm64@${{steps.get_unm_version.outputs.unmver}} \
dmg-license
shell: bash
- name: Install UNM dependencies for Linux
if: runner.os == 'Linux'
run: |
${{ env.YARN_INSTALL_NOPT }} \
@unblockneteasemusic/rust-napi-linux-x64-gnu@${{steps.get_unm_version.outputs.unmver}} \
@unblockneteasemusic/rust-napi-linux-arm64-gnu@${{steps.get_unm_version.outputs.unmver}} \
@unblockneteasemusic/rust-napi-linux-arm-gnueabihf@${{steps.get_unm_version.outputs.unmver}}
shell: bash
- name: Build/release Electron app
uses: samuelmeuli/action-electron-builder@v1.6.0
env:

View File

@ -7,7 +7,8 @@
},
"target": "ES6",
"module": "commonjs",
"allowSyntheticDefaultImports": true
"allowSyntheticDefaultImports": true,
"jsx": "preserve"
},
"include": ["src/**/*"],
"exclude": ["node_modules"]

View File

@ -23,7 +23,7 @@
},
"main": "background.js",
"dependencies": {
"@unblockneteasemusic/server": "v0.27.0-rc.6",
"@unblockneteasemusic/rust-napi": "^0.3.0-pre.1",
"NeteaseCloudMusicApi": "^4.5.2",
"axios": "^0.26.1",
"change-case": "^4.1.2",

View File

@ -1,5 +1,5 @@
import { app, dialog, globalShortcut, ipcMain } from 'electron';
import match from '@unblockneteasemusic/server';
import UNM from '@unblockneteasemusic/rust-napi';
import { registerGlobalShortcut } from '@/electron/globalShortcut';
import cloneDeep from 'lodash/cloneDeep';
import shortcuts from '@/utils/shortcuts';
@ -112,55 +112,91 @@ async function getBiliVideoFile(url) {
/**
* Parse the source string (`a, b`) to source list `['a', 'b']`.
*
* @param {import("@unblockneteasemusic/rust-napi").Executor} executor
* @param {string} sourceString The source string.
* @returns {string[]} The source list.
*/
function parseSourceStringToList(sourceString) {
return sourceString.split(',').map(s => s.trim());
function parseSourceStringToList(executor, sourceString) {
const availableSource = executor.list();
return sourceString
.split(',')
.map(s => s.trim().toLowerCase())
.filter(s => {
const isAvailable = availableSource.includes(s);
if (!isAvailable) {
log(`This source is not one of the supported source: ${s}`);
}
return isAvailable;
});
}
export function initIpcMain(win, store, trayEventEmitter) {
ipcMain.handle('unblock-music', async (_, track, source) => {
// 兼容 unblockneteasemusic 所使用的 api 字段
track.alias = track.alia || [];
track.duration = track.dt || 0;
track.album = track.al || [];
track.artists = track.ar || [];
// WIP: Do not enable logging as it has some issues in non-blocking I/O environment.
// UNM.enableLogging(UNM.LoggingType.ConsoleEnv);
const unmExecutor = new UNM.Executor();
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => {
reject('timeout');
}, 5000);
});
ipcMain.handle(
'unblock-music',
/**
*
* @param {*} _
* @param {string | null} sourceListString
* @param {Record<string, any>} ncmTrack
* @param {UNM.Context} context
*/
async (_, sourceListString, ncmTrack, context) => {
// Formt the track input
// FIXME: Figure out the structure of Track
const song = {
id: ncmTrack.id && ncmTrack.id.toString(),
name: ncmTrack.name,
duration: ncmTrack.dt,
album: ncmTrack.al && {
id: ncmTrack.al.id && ncmTrack.al.id.toString(),
name: ncmTrack.al.name,
},
artists: ncmTrack.ar
? ncmTrack.ar.map(({ id, name }) => ({
id: id && id.toString(),
name,
}))
: [],
};
const sourceList =
typeof source === 'string' ? parseSourceStringToList(source) : null;
log(`[UNM] using source: ${sourceList || '<default>'}`);
typeof sourceListString === 'string'
? parseSourceStringToList(unmExecutor, sourceListString)
: ['migu', 'ytdl', 'bilibili', 'pyncm', 'kugou'];
log(`[UNM] using source: ${sourceList.join(', ')}`);
log(`[UNM] using configuration: ${JSON.stringify(context)}`);
try {
const matchedAudio = await Promise.race([
// TODO: tell users to install yt-dlp.
// we passed "null" to source, to let UNM choose the default source.
match(track.id, sourceList, track),
timeoutPromise,
]);
if (!matchedAudio || !matchedAudio.url) {
throw new Error('no such a song found');
}
const matchedAudio = await unmExecutor.search(
sourceList,
song,
context
);
const retrievedSong = await unmExecutor.retrieve(matchedAudio, context);
// bilibili's audio file needs some special treatment
if (matchedAudio.url.includes('bilivideo.com')) {
matchedAudio.url = await getBiliVideoFile(matchedAudio.url);
if (retrievedSong.url.includes('bilivideo.com')) {
retrievedSong.url = await getBiliVideoFile(retrievedSong.url);
}
return matchedAudio;
log(`respond with retrieve song…`);
log(JSON.stringify(matchedAudio));
return retrievedSong;
} catch (err) {
const errorMessage = err instanceof Error ? `${err.message}` : `${err}`;
log(`UnblockNeteaseMusic failed: ${errorMessage}`);
return null;
}
});
}
);
ipcMain.on('close', e => {
if (isMac) {

View File

@ -370,22 +370,61 @@ export default class {
}
async _getAudioSourceFromUnblockMusic(track) {
console.debug(`[debug][Player.js] _getAudioSourceFromUnblockMusic`);
if (
process.env.IS_ELECTRON !== true ||
store.state.settings.enableUnblockNeteaseMusic === false
) {
return null;
}
const source = await ipcRenderer.invoke(
'unblock-music',
track,
store.state.settings.unmSource
);
if (store.state.settings.automaticallyCacheSongs && source?.url) {
// TODO: 将unblockMusic字样换成真正的来源比如酷我咪咕等
cacheTrackSource(track, source.url, 128000, 'unblockMusic');
/**
*
* @param {string=} searchMode
* @returns {import("@unblockneteasemusic/rust-napi").SearchMode}
*/
const determineSearchMode = searchMode => {
/**
* FastFirst = 0
* OrderFirst = 1
*/
switch (searchMode) {
case 'fast-first':
return 0;
case 'order-first':
return 1;
default:
return 0;
}
return source?.url;
};
/** @type {import("@unblockneteasemusic/rust-napi").RetrievedSongInfo | null} */
const retrieveSongInfo = await ipcRenderer.invoke(
'unblock-music',
store.state.settings.unmSource,
track,
/** @type {import("@unblockneteasemusic/rust-napi").Context} */ ({
enableFlac: store.state.settings.unmEnableFlac || null,
proxyUri: store.state.settings.unmProxyUri || null,
searchMode: determineSearchMode(store.state.settings.unmSearchMode),
config: {
'joox:cookie': store.state.settings.unmJooxCookie || null,
'qq:cookie': store.state.settings.unmQQCookie || null,
'ytdl:exe': store.state.settings.unmYtDlExe || null,
},
})
);
if (store.state.settings.automaticallyCacheSongs && retrieveSongInfo?.url) {
cacheTrackSource(
track,
retrieveSongInfo.url,
128000,
`unm:${retrieveSongInfo.source}`
);
}
return retrieveSongInfo?.url;
}
_getAudioSource(track) {
return this._getAudioSourceFromCache(String(track.id))

View File

@ -223,11 +223,11 @@
</div>
<section v-if="isElectron" class="unm-configuration">
<h3>UnblockNeteaseMusic </h3>
<h3>UnblockNeteaseMusic </h3>
<div class="item">
<div class="left">
<div class="title"
>启用
>激活
<a
href="https://github.com/UnblockNeteaseMusic/server"
target="blank"
@ -247,16 +247,17 @@
</div>
</div>
</div>
<div class="item">
<div class="left">
<div class="title"> 备选音源 </div>
<div class="description">
音源的具体代号
<a
href="https://github.com/UnblockNeteaseMusic/server#音源清单"
href="https://github.com/UnblockNeteaseMusic/server-rust/blob/main/README.md#支援的所有引擎"
target="_blank"
>
可以点此到 UNM 的说明页面查询 </a
可以点此到 UNM 的说明页面查询 </a
><br />
多个音源请用 <code>,</code> 逗号分隔<br />
留空则使用 UNM 内置的默认值
@ -264,12 +265,135 @@
</div>
<div class="right">
<input
id="unm-source"
v-model="unmSource"
class="text-input"
class="text-input margin-right-0"
placeholder="例 bilibili, kuwo"
/>
<label for="unm-source"></label>
</div>
</div>
<div class="item">
<div class="left">
<div class="title"> 激活无损音质 (FLAC) </div>
<div class="description"> 设置后需要清掉快取才能生效 </div>
</div>
<div class="right">
<div class="toggle">
<input
id="unm-enable-flac"
v-model="unmEnableFlac"
type="checkbox"
/>
<label for="unm-enable-flac" />
</div>
</div>
</div>
<div class="item">
<div class="left">
<div class="title"> 音源搜索模式 </div>
</div>
<div class="right">
<select v-model="unmSearchMode">
<option value="fast-first"> 速度优先不论顺序 </option>
<option value="order-first"> 顺序优先不论速度 </option>
</select>
</div>
</div>
<div class="item">
<div class="left">
<div class="title"> 请求用代理服务器 (Proxy) </div>
<div class="description">
请求如 YouTube 音源服务时要使用的代理服务器<br />
留空则不进行相关设置
</div>
</div>
<div class="right">
<input
v-model="unmProxyUri"
class="text-input margin-right-0"
placeholder="例 https://192.168.11.45"
/>
</div>
</div>
<div class="item">
<div class="left">
<div class="title"> Joox 引擎的 Cookie </div>
<div class="description">
<a
href="https://github.com/UnblockNeteaseMusic/server-rust/tree/main/engines#joox-cookie-設定說明"
target="_blank"
>设置说明请参见此处</a
>
留空则不进行相关设置
</div>
</div>
<div class="right">
<input
v-model="unmJooxCookie"
class="text-input margin-right-0"
placeholder="wmid=..; session_key=.."
/>
</div>
</div>
<div class="item">
<div class="left">
<div class="title"> QQ 引擎的 Cookie </div>
<div class="description">
<a
href="https://github.com/UnblockNeteaseMusic/server-rust/tree/main/engines#qq-cookie-設定說明"
target="_blank"
>设置说明请参见此处</a
>
留空则不进行相关设置
</div>
</div>
<div class="right">
<input
v-model="unmQQCookie"
class="text-input margin-right-0"
placeholder="uin=..; qm_keyst=..;"
/>
</div>
</div>
<div class="item">
<div class="left">
<div class="title"> YtDl 引擎要使用的 youtube-dl 运行档 </div>
<div class="description">
<a
href="https://github.com/UnblockNeteaseMusic/server-rust/tree/main/engines#ytdlexe-設定說明"
target="_blank"
>设置说明请参见此处</a
>留空则不进行相关设置
</div>
</div>
<div class="right">
<input
v-model="unmYtDlExe"
class="text-input margin-right-0"
placeholder="ex. youtube-dl"
/>
</div>
</div>
<div class="item">
<div class="left">
<div class="title"> 用于 UNM Proxy 服务器 </div>
<div class="description">
请求如 YouTube 音源服务时要使用的 Proxy 服务器<br />
留空则不进行相关设置
</div>
</div>
<div class="right">
<input
v-model="unmProxyUri"
class="text-input margin-right-0"
placeholder="例 https://192.168.11.45"
/>
</div>
</div>
</section>
@ -944,7 +1068,73 @@ export default {
set(value) {
this.$store.commit('updateSettings', {
key: 'unmSource',
value: value.length ? value : null,
value: value.length && value,
});
},
},
unmSearchMode: {
get() {
return this.settings.unmSearchMode || 'fast-first';
},
set(value) {
this.$store.commit('updateSettings', {
key: 'unmSearchMode',
value: value,
});
},
},
unmEnableFlac: {
get() {
return this.settings.unmEnableFlac || false;
},
set(value) {
this.$store.commit('updateSettings', {
key: 'unmEnableFlac',
value: value || false,
});
},
},
unmProxyUri: {
get() {
return this.settings.unmProxyUri || '';
},
set(value) {
this.$store.commit('updateSettings', {
key: 'unmProxyUri',
value: value.length && value,
});
},
},
unmJooxCookie: {
get() {
return this.settings.unmJooxCookie || '';
},
set(value) {
this.$store.commit('updateSettings', {
key: 'unmJooxCookie',
value: value.length && value,
});
},
},
unmQQCookie: {
get() {
return this.settings.unmQQCookie || '';
},
set(value) {
this.$store.commit('updateSettings', {
key: 'unmQQCookie',
value: value.length && value,
});
},
},
unmYtDlExe: {
get() {
return this.settings.unmYtDlExe || '';
},
set(value) {
this.$store.commit('updateSettings', {
key: 'unmYtDlExe',
value: value.length && value,
});
},
},
@ -1274,6 +1464,9 @@ button {
}
}
input.text-input.margin-right-0 {
margin-right: 0;
}
input.text-input {
background: var(--color-secondary-bg);
border: none;

View File

@ -56,6 +56,13 @@ module.exports = {
symbolId: 'icon-[name]',
})
.end();
config.module
.rule('napi')
.test(/\.node$/)
.use('node-loader')
.loader('node-loader')
.end();
// LimitChunkCountPlugin 可以通过合并块来对块进行后期处理。用以解决 chunk 包太多的问题
config.plugin('chunkPlugin').use(webpack.optimize.LimitChunkCountPlugin, [
{
@ -69,10 +76,7 @@ module.exports = {
// electron-builder的配置文件
electronBuilder: {
nodeIntegration: true,
externals: [
'@unblockneteasemusic/server',
'@unblockneteasemusic/server/src/consts',
],
externals: ['@unblockneteasemusic/rust-napi'],
builderOptions: {
productName: 'YesPlayMusic',
copyright: 'Copyright © YesPlayMusic',

235
yarn.lock
View File

@ -1714,14 +1714,89 @@
dependencies:
"@types/node" "*"
"@unblockneteasemusic/server@v0.27.0-rc.6":
version "0.27.0-rc.6"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/server/-/server-0.27.0-rc.6.tgz#a6ce8d025d3fcfad0f93d1944e4cd0810fedd019"
integrity sha512-H/dtVM5tmvuYeBhqmLrUo2sbGZKSN1xtZs4Km0rOqsiKkX/vMAlF1gmy61Wnc0hLjL1orY6eHnvRdZV/2hWnvQ==
dependencies:
node-windows "^1.0.0-beta.6"
pino "6.14.0"
pino-pretty "^7.5.3"
"@unblockneteasemusic/rust-napi-android-arm-eabi@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-android-arm-eabi/-/rust-napi-android-arm-eabi-0.3.0-pre.1.tgz#290f22c5155f95bc5919cab2954cf051a88dcf85"
integrity sha512-932T6uUSHbWXTS2lt0wTI5F2lsIrGea2aU22VwSFaHfpTgxB8qDfd+jn+zMRlpnqTmuglyd0hk/1yUZd9tgu+w==
"@unblockneteasemusic/rust-napi-android-arm64@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-android-arm64/-/rust-napi-android-arm64-0.3.0-pre.1.tgz#442461c328153dc5eaaec1047dd5333b74eaa452"
integrity sha512-RQMCzO7+0Iw+R/MHy0hvv9Vg6BzqrUmWk9bMLR0mkkYKxR0wPEaB7WpAvUfLRKevSqiWP8rrNRuzqGVBu0PaCg==
"@unblockneteasemusic/rust-napi-darwin-arm64@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-darwin-arm64/-/rust-napi-darwin-arm64-0.3.0-pre.1.tgz#b4175437dab3738360c94f696af5bc5512822df4"
integrity sha512-M3YvPhYNyBSytho3FmyX1cj5k21ZlW14mPuy/5oLRw4qehAmjsSYjCEFLG5I29IlZTLN0sbIz92dqHkYclSXSg==
"@unblockneteasemusic/rust-napi-darwin-x64@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-darwin-x64/-/rust-napi-darwin-x64-0.3.0-pre.1.tgz#dc2016d49f4d33ef7b7eaa8d607706c99e56831d"
integrity sha512-kN4Bur22hFo2UAJ4vljuEX4ue7TlhhOnz9Q3KrwhxOtv2KlQi2iQ/8tCl+/whKpqgf/cs/klQLDJj73PsE1G+w==
"@unblockneteasemusic/rust-napi-freebsd-x64@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-freebsd-x64/-/rust-napi-freebsd-x64-0.3.0-pre.1.tgz#551f3e888655dd6cb02bbeb03fe997001c3fc22d"
integrity sha512-tRBudpZX+0X8sDSP+LmnU9nfsT7939rCu+bZhizjHHe2jt02iX/ZLHOkEcVBh0VHhHVvTehj0zH3iHFkfYnR2Q==
"@unblockneteasemusic/rust-napi-linux-arm-gnueabihf@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-linux-arm-gnueabihf/-/rust-napi-linux-arm-gnueabihf-0.3.0-pre.1.tgz#893aba87269a3d9f25b3ad36be4c663ccca3dc62"
integrity sha512-3vkXlBm6f2dWOWLKaosTcFAO5b/VV9WvyT3PQBJFvq0PtRGonr2Zr1gYJC4zUz2UraSKaFg4GMKgopU2Duxgow==
"@unblockneteasemusic/rust-napi-linux-arm64-gnu@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-linux-arm64-gnu/-/rust-napi-linux-arm64-gnu-0.3.0-pre.1.tgz#739f21a7d0e088be654a4c007cd2e3041f7959b5"
integrity sha512-Zq1kjjXhle0OA7NzadzBQvjbTZfbK/qMuHay97+ZGXZH4uxv0jmJ2aQWR7HlrrKmQKpknURvrxbXmi8dxeI+SA==
"@unblockneteasemusic/rust-napi-linux-arm64-musl@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-linux-arm64-musl/-/rust-napi-linux-arm64-musl-0.3.0-pre.1.tgz#18301a8e8cfdf6c45b068ec21b452ce353ad76cf"
integrity sha512-Yp7+Ra8ksx2nCZs18duK7BPtsY2chzdrBIrWY14N7aP0IIglwBcazP+GGFNaqqDx0nW+/0463pUsi8OgbWX+mA==
"@unblockneteasemusic/rust-napi-linux-x64-gnu@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-linux-x64-gnu/-/rust-napi-linux-x64-gnu-0.3.0-pre.1.tgz#ed453b556c6f8914b557eef1d8e1311c75f26806"
integrity sha512-A71/PhBCotAQPimGIJnZEYJwBv2FilhYC1OC4wOy3Rt54C9Cw12FJp49c7J13mZLktZfCJOSu6/6RPY8+6Yfrw==
"@unblockneteasemusic/rust-napi-linux-x64-musl@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-linux-x64-musl/-/rust-napi-linux-x64-musl-0.3.0-pre.1.tgz#ce1e308491df2d2b671223ad255192e0d5de2064"
integrity sha512-klXwwdVb4LdHmUrdclZSfn6nQwXddBwJJk392wRagjGUyNbUkC9b3JHfMEdrssMIPtIGtNHWt/43z+saovZl2g==
"@unblockneteasemusic/rust-napi-win32-arm64-msvc@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-win32-arm64-msvc/-/rust-napi-win32-arm64-msvc-0.3.0-pre.1.tgz#f78512ef26951ef98f63cc6fc51c39e47c0cf80f"
integrity sha512-jaX6UvQlRuH1iyextG34l8b19MtVFTZZX8U34oW3d7rZxcas5ZitEHzd6XfjpHcTtkXSyhQxx+WjDiY2BQ+B3A==
"@unblockneteasemusic/rust-napi-win32-ia32-msvc@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-win32-ia32-msvc/-/rust-napi-win32-ia32-msvc-0.3.0-pre.1.tgz#6fe03b8862c46e2d4b9758c36450138db81cbabd"
integrity sha512-QgO05vQxxkU0+bfprxQMVLXxguI8N1ApPQCyAYNnvrKTQ/F6OjV+bQghlWaKwcIeve8zoYN1zgSHDyNj+0xrYA==
"@unblockneteasemusic/rust-napi-win32-x64-msvc@0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-win32-x64-msvc/-/rust-napi-win32-x64-msvc-0.3.0-pre.1.tgz#99b1e5c1f09241b436a2797bdfc01d7a4c566f51"
integrity sha512-6CI0YlQxHiU6vetwoAjYgBOFlWoTkLVUSd0tpEN9/5R7iExRUHdFdRfpXqPJzpYnAhZlGqAIslCayoNcf7vnQw==
"@unblockneteasemusic/rust-napi@^0.3.0-pre.1":
version "0.3.0-pre.1"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi/-/rust-napi-0.3.0-pre.1.tgz#ff5a18c0d8fbdde14af79b89fe8d760153406c6d"
integrity sha512-n1zDJvy5OEEMPQdhTPARRRQLM4Tnvx9UGq0smVKWu6CjutK6rcSIVoxe4ADILzBOY3RCe5vuo9Qn4RUzKCeeWQ==
optionalDependencies:
"@unblockneteasemusic/rust-napi-android-arm-eabi" "0.3.0-pre.1"
"@unblockneteasemusic/rust-napi-android-arm64" "0.3.0-pre.1"
"@unblockneteasemusic/rust-napi-darwin-arm64" "0.3.0-pre.1"
"@unblockneteasemusic/rust-napi-darwin-x64" "0.3.0-pre.1"
"@unblockneteasemusic/rust-napi-freebsd-x64" "0.3.0-pre.1"
"@unblockneteasemusic/rust-napi-linux-arm-gnueabihf" "0.3.0-pre.1"
"@unblockneteasemusic/rust-napi-linux-arm64-gnu" "0.3.0-pre.1"
"@unblockneteasemusic/rust-napi-linux-arm64-musl" "0.3.0-pre.1"
"@unblockneteasemusic/rust-napi-linux-x64-gnu" "0.3.0-pre.1"
"@unblockneteasemusic/rust-napi-linux-x64-musl" "0.3.0-pre.1"
"@unblockneteasemusic/rust-napi-win32-arm64-msvc" "0.3.0-pre.1"
"@unblockneteasemusic/rust-napi-win32-ia32-msvc" "0.3.0-pre.1"
"@unblockneteasemusic/rust-napi-win32-x64-msvc" "0.3.0-pre.1"
"@vibrant/color@^3.2.1-alpha.1":
version "3.2.1-alpha.1"
@ -4382,11 +4457,6 @@ data-uri-to-buffer@3:
resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636"
integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==
dateformat@^4.6.3:
version "4.6.3"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5"
integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==
dayjs@^1.8.36:
version "1.11.1"
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.1.tgz#90b33a3dda3417258d48ad2771b415def6545eb0"
@ -4907,7 +4977,7 @@ duplexify@^3.4.2, duplexify@^3.6.0:
readable-stream "^2.0.0"
stream-shift "^1.0.0"
duplexify@^4.1.1, duplexify@^4.1.2:
duplexify@^4.1.1:
version "4.1.2"
resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0"
integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==
@ -5795,16 +5865,6 @@ fast-levenshtein@~2.0.6:
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
fast-redact@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.1.tgz#790fcff8f808c2e12fabbfb2be5cb2deda448fa0"
integrity sha512-odVmjC8x8jNeMZ3C+rPMESzXVSEU8tSWSHv9HFxP2mm89G/1WwqhrerJDQm9Zus8X6aoRgQDThKqptdNA6bt+A==
fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.0.8:
version "2.1.1"
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
fastq@^1.6.0:
version "1.13.0"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
@ -5993,11 +6053,6 @@ flat-cache@^2.0.1:
rimraf "2.6.3"
write "1.0.3"
flatstr@^1.0.12:
version "1.0.12"
resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931"
integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==
flatted@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
@ -7618,11 +7673,6 @@ jimp@^0.16.1:
"@jimp/types" "^0.16.1"
regenerator-runtime "^0.13.3"
joycon@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03"
integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==
jpeg-js@0.4.2:
version "0.4.2"
resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.2.tgz#8b345b1ae4abde64c2da2fe67ea216a114ac279d"
@ -8441,11 +8491,6 @@ minimist@^1.2.3:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
minimist@~0.0.1:
version "0.0.10"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
minipass-collect@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
@ -8778,14 +8823,6 @@ node-vibrant@^3.2.1-alpha.1:
"@vibrant/quantizer-mmcq" "^3.2.1-alpha.1"
url "^0.11.0"
node-windows@^1.0.0-beta.6:
version "1.0.0-beta.6"
resolved "https://registry.yarnpkg.com/node-windows/-/node-windows-1.0.0-beta.6.tgz#04bf66946760bb8507f1d1326267587b56b8c8b3"
integrity sha512-Ehig70tF9A9Wns4VMpnsvT7dyat/d2fio6C4g1RAEaAi+piAjN6Wc+/fdSOifl8YCCncVllijv5Q9wdyHvdgeA==
dependencies:
optimist "~0.6.0"
xml "0.0.12"
normalize-package-data@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@ -9050,14 +9087,6 @@ opn@^5.5.0:
dependencies:
is-wsl "^1.1.0"
optimist@~0.6.0:
version "0.6.1"
resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY=
dependencies:
minimist "~0.0.1"
wordwrap "~0.0.2"
optionator@^0.8.1, optionator@^0.8.3:
version "0.8.3"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
@ -9516,50 +9545,6 @@ pinkie@^2.0.0:
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
pino-abstract-transport@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0"
integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==
dependencies:
duplexify "^4.1.2"
split2 "^4.0.0"
pino-pretty@^7.5.3:
version "7.5.3"
resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-7.5.3.tgz#cceb5f0ae193c949d8a0b302227b1cec69b7491c"
integrity sha512-jOGysjWxOfaeUElKTeJPstiitt1Ii7owcb21lDc1BS5F4P4HRDDcGxL1f1jskSA0zkTyj64/iaXlMLGhwtLVtg==
dependencies:
args "^5.0.1"
colorette "^2.0.7"
dateformat "^4.6.3"
fast-safe-stringify "^2.0.7"
joycon "^3.1.1"
pino-abstract-transport "^0.5.0"
pump "^3.0.0"
readable-stream "^3.6.0"
rfdc "^1.3.0"
secure-json-parse "^2.4.0"
sonic-boom "^2.2.0"
strip-json-comments "^3.1.1"
pino-std-serializers@^3.1.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz#b56487c402d882eb96cd67c257868016b61ad671"
integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==
pino@6.14.0:
version "6.14.0"
resolved "https://registry.yarnpkg.com/pino/-/pino-6.14.0.tgz#b745ea87a99a6c4c9b374e4f29ca7910d4c69f78"
integrity sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==
dependencies:
fast-redact "^3.0.0"
fast-safe-stringify "^2.0.8"
flatstr "^1.0.12"
pino-std-serializers "^3.1.0"
process-warning "^1.0.0"
quick-format-unescaped "^4.0.3"
sonic-boom "^1.0.2"
pixelmatch@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854"
@ -10118,11 +10103,6 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
process-warning@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616"
integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==
process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
@ -10287,11 +10267,6 @@ queue-microtask@^1.2.2:
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
quick-format-unescaped@^4.0.3:
version "4.0.4"
resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7"
integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@ -10680,11 +10655,6 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rfdc@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b"
integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
rgb-regex@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
@ -10848,11 +10818,6 @@ schema-utils@^3.0.0:
ajv "^6.12.5"
ajv-keywords "^3.5.2"
secure-json-parse@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.4.0.tgz#5aaeaaef85c7a417f76271a4f5b0cc3315ddca85"
integrity sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg==
select-hose@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
@ -11220,21 +11185,6 @@ socks@^2.3.3:
ip "^1.1.5"
smart-buffer "^4.2.0"
sonic-boom@^1.0.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e"
integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==
dependencies:
atomic-sleep "^1.0.0"
flatstr "^1.0.12"
sonic-boom@^2.2.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.6.0.tgz#8786fc78be07c18a90381acd816d1d4afe3537a2"
integrity sha512-6xYZFRmDEtxGqfOKcDQ4cPLrNa0SPEDI+wlzDAHowXE6YV42NeXqg9mP2KkiM8JVu3lHfZ2iQKYlGOz+kTpphg==
dependencies:
atomic-sleep "^1.0.0"
sort-keys-length@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188"
@ -11361,11 +11311,6 @@ split2@^3.0.0:
dependencies:
readable-stream "^3.0.0"
split2@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809"
integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==
split@0.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
@ -11624,7 +11569,7 @@ strip-indent@^2.0.0:
resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
strip-json-comments@^3.0.1, strip-json-comments@^3.1.1:
strip-json-comments@^3.0.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
@ -12924,11 +12869,6 @@ word-wrap@~1.2.3:
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
wordwrap@~0.0.2:
version "0.0.3"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=
workbox-background-sync@^4.3.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950"
@ -13167,11 +13107,6 @@ xml2js@^0.4.17, xml2js@^0.4.5:
sax ">=0.6.0"
xmlbuilder "~11.0.0"
xml@0.0.12:
version "0.0.12"
resolved "https://registry.yarnpkg.com/xml/-/xml-0.0.12.tgz#f08b347109912be00285785f46f15ad8e50a5f67"
integrity sha1-8Is0cQmRK+AChXhfRvFa2OUKX2c=
xmlbuilder@>=11.0.1:
version "15.1.1"
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5"