From f7dcec7c61d70429f41ec41fd0a70ac4eaa4f30a Mon Sep 17 00:00:00 2001 From: zwx08 Date: Thu, 25 Jun 2026 14:18:06 +0800 Subject: [PATCH 1/8] feat: change package name to @neteasecloudmusicapienhanced/api and update this package --- Dockerfile | 4 +- package.json | 4 +- src/electron/services.js | 2 +- src/ncmModDef.js | 248 +++++++------- src/views/settings.vue | 9 +- yarn.lock | 687 ++++++++++++++++++++++++++++++++++----- 6 files changed, 737 insertions(+), 217 deletions(-) diff --git a/Dockerfile b/Dockerfile index 87a5567997..e3864ff1ef 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,10 +19,10 @@ COPY --from=build /app/package.json /usr/local/lib/ RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \ && apk add --no-cache libuv nodejs npm \ && npm config set registry https://registry.npmmirror.com \ - && npm i -g $(awk -F \" '{if($2=="@neteaseapireborn/api@latest") print $2"@"$4}' /usr/local/lib/package.json) \ + && npm i -g $(awk -F \" '{if($2=="@neteasecloudmusicapienhanced/api@latest") print $2"@"$4}' /usr/local/lib/package.json) \ && rm -f /usr/local/lib/package.json COPY --from=build /app/docker/nginx.conf.example /etc/nginx/conf.d/default.conf COPY --from=build /app/dist /usr/share/nginx/html -CMD ["sh", "-c", "nginx && exec npx @neteaseapireborn/api@latest"] +CMD ["sh", "-c", "nginx && exec npx @neteasecloudmusicapienhanced/api@latest"] diff --git a/package.json b/package.json index e65f5fd1a1..b6fb974277 100644 --- a/package.json +++ b/package.json @@ -19,14 +19,14 @@ "postinstall": "electron-builder install-app-deps", "postuninstall": "electron-builder install-app-deps", "prettier": "npx prettier --write ./src", - "netease_api:run": "npx @neteaseapireborn/api" + "netease_api:run": "npx @neteasecloudmusicapienhanced/api" }, "main": "background.js", "engines": { "node": "14 || 16" }, "dependencies": { - "@neteaseapireborn/api": "^4.29.7", + "@neteasecloudmusicapienhanced/api": "^4.36.1", "@unblockneteasemusic/rust-napi": "^0.4.0", "axios": "^0.26.1", "change-case": "^4.1.2", diff --git a/src/electron/services.js b/src/electron/services.js index 94720ceb24..6eaebeea49 100644 --- a/src/electron/services.js +++ b/src/electron/services.js @@ -1,6 +1,6 @@ import clc from 'cli-color'; import checkAuthToken from '../utils/checkAuthToken'; -import server from '@neteaseapireborn/api/server'; +import server from '@neteasecloudmusicapienhanced/api/server'; export async function startNeteaseMusicApi() { // Let user know that the service is starting diff --git a/src/ncmModDef.js b/src/ncmModDef.js index fd8c84ddb7..1b3f501bff 100644 --- a/src/ncmModDef.js +++ b/src/ncmModDef.js @@ -2,621 +2,621 @@ module.exports = [ { identifier: 'user_update', route: '/user/update', - module: require('@neteaseapireborn/api/module/user_update'), + module: require('@neteasecloudmusicapienhanced/api/module/user_update'), }, { identifier: 'user_subcount', route: '/user/subcount', - module: require('@neteaseapireborn/api/module/user_subcount'), + module: require('@neteasecloudmusicapienhanced/api/module/user_subcount'), }, { identifier: 'user_replacephone', route: '/user/replacephone', - module: require('@neteaseapireborn/api/module/user_replacephone'), + module: require('@neteasecloudmusicapienhanced/api/module/user_replacephone'), }, { identifier: 'user_record', route: '/user/record', - module: require('@neteaseapireborn/api/module/user_record'), + module: require('@neteasecloudmusicapienhanced/api/module/user_record'), }, { identifier: 'user_playlist', route: '/user/playlist', - module: require('@neteaseapireborn/api/module/user_playlist'), + module: require('@neteasecloudmusicapienhanced/api/module/user_playlist'), }, { identifier: 'user_level', route: '/user/level', - module: require('@neteaseapireborn/api/module/user_level'), + module: require('@neteasecloudmusicapienhanced/api/module/user_level'), }, { identifier: 'user_follows', route: '/user/follows', - module: require('@neteaseapireborn/api/module/user_follows'), + module: require('@neteasecloudmusicapienhanced/api/module/user_follows'), }, { identifier: 'user_followeds', route: '/user/followeds', - module: require('@neteaseapireborn/api/module/user_followeds'), + module: require('@neteasecloudmusicapienhanced/api/module/user_followeds'), }, { identifier: 'user_event', route: '/user/event', - module: require('@neteaseapireborn/api/module/user_event'), + module: require('@neteasecloudmusicapienhanced/api/module/user_event'), }, { identifier: 'user_dj', route: '/user/dj', - module: require('@neteaseapireborn/api/module/user_dj'), + module: require('@neteasecloudmusicapienhanced/api/module/user_dj'), }, { identifier: 'user_detail', route: '/user/detail', - module: require('@neteaseapireborn/api/module/user_detail'), + module: require('@neteasecloudmusicapienhanced/api/module/user_detail'), }, { identifier: 'user_cloud_detail', route: '/user/cloud/detail', - module: require('@neteaseapireborn/api/module/user_cloud_detail'), + module: require('@neteasecloudmusicapienhanced/api/module/user_cloud_detail'), }, { identifier: 'user_cloud_del', route: '/user/cloud/del', - module: require('@neteaseapireborn/api/module/user_cloud_del'), + module: require('@neteasecloudmusicapienhanced/api/module/user_cloud_del'), }, { identifier: 'user_cloud', route: '/user/cloud', - module: require('@neteaseapireborn/api/module/user_cloud'), + module: require('@neteasecloudmusicapienhanced/api/module/user_cloud'), }, { identifier: 'user_bindingcellphone', route: '/user/bindingcellphone', - module: require('@neteaseapireborn/api/module/user_bindingcellphone'), + module: require('@neteasecloudmusicapienhanced/api/module/user_bindingcellphone'), }, { identifier: 'user_binding', route: '/user/binding', - module: require('@neteaseapireborn/api/module/user_binding'), + module: require('@neteasecloudmusicapienhanced/api/module/user_binding'), }, { identifier: 'user_audio', route: '/user/audio', - module: require('@neteaseapireborn/api/module/user_audio'), + module: require('@neteasecloudmusicapienhanced/api/module/user_audio'), }, { identifier: 'user_account', route: '/user/account', - module: require('@neteaseapireborn/api/module/user_account'), + module: require('@neteasecloudmusicapienhanced/api/module/user_account'), }, { identifier: 'toplist_detail', route: '/toplist/detail', - module: require('@neteaseapireborn/api/module/toplist_detail'), + module: require('@neteasecloudmusicapienhanced/api/module/toplist_detail'), }, { identifier: 'toplist_artist', route: '/toplist/artist', - module: require('@neteaseapireborn/api/module/toplist_artist'), + module: require('@neteasecloudmusicapienhanced/api/module/toplist_artist'), }, { identifier: 'toplist', route: '/toplist', - module: require('@neteaseapireborn/api/module/toplist'), + module: require('@neteasecloudmusicapienhanced/api/module/toplist'), }, { identifier: 'topic_sublist', route: '/topic/sublist', - module: require('@neteaseapireborn/api/module/topic_sublist'), + module: require('@neteasecloudmusicapienhanced/api/module/topic_sublist'), }, { identifier: 'topic_detail_event_hot', route: '/topic/detail/event/hot', - module: require('@neteaseapireborn/api/module/topic_detail_event_hot'), + module: require('@neteasecloudmusicapienhanced/api/module/topic_detail_event_hot'), }, { identifier: 'topic_detail', route: '/topic/detail', - module: require('@neteaseapireborn/api/module/topic_detail'), + module: require('@neteasecloudmusicapienhanced/api/module/topic_detail'), }, { identifier: 'top_song', route: '/top/song', - module: require('@neteaseapireborn/api/module/top_song'), + module: require('@neteasecloudmusicapienhanced/api/module/top_song'), }, { identifier: 'top_playlist_highquality', route: '/top/playlist/highquality', - module: require('@neteaseapireborn/api/module/top_playlist_highquality'), + module: require('@neteasecloudmusicapienhanced/api/module/top_playlist_highquality'), }, { identifier: 'top_playlist', route: '/top/playlist', - module: require('@neteaseapireborn/api/module/top_playlist'), + module: require('@neteasecloudmusicapienhanced/api/module/top_playlist'), }, { identifier: 'top_mv', route: '/top/mv', - module: require('@neteaseapireborn/api/module/top_mv'), + module: require('@neteasecloudmusicapienhanced/api/module/top_mv'), }, { identifier: 'top_list', route: '/top/list', - module: require('@neteaseapireborn/api/module/top_list'), + module: require('@neteasecloudmusicapienhanced/api/module/top_list'), }, { identifier: 'top_artists', route: '/top/artists', - module: require('@neteaseapireborn/api/module/top_artists'), + module: require('@neteasecloudmusicapienhanced/api/module/top_artists'), }, { identifier: 'top_album', route: '/top/album', - module: require('@neteaseapireborn/api/module/top_album'), + module: require('@neteasecloudmusicapienhanced/api/module/top_album'), }, { identifier: 'song_url', route: '/song/url', - module: require('@neteaseapireborn/api/module/song_url'), + module: require('@neteasecloudmusicapienhanced/api/module/song_url'), }, { identifier: 'song_download_url', route: '/song/download/url', - module: require('@neteaseapireborn/api/module/song_download_url'), + module: require('@neteasecloudmusicapienhanced/api/module/song_download_url'), }, { identifier: 'song_detail', route: '/song/detail', - module: require('@neteaseapireborn/api/module/song_detail'), + module: require('@neteasecloudmusicapienhanced/api/module/song_detail'), }, { identifier: 'simi_mv', route: '/simi/mv', - module: require('@neteaseapireborn/api/module/simi_mv'), + module: require('@neteasecloudmusicapienhanced/api/module/simi_mv'), }, { identifier: 'simi_artist', route: '/simi/artist', - module: require('@neteaseapireborn/api/module/simi_artist'), + module: require('@neteasecloudmusicapienhanced/api/module/simi_artist'), }, { identifier: 'search', route: '/search', - module: require('@neteaseapireborn/api/module/search'), + module: require('@neteasecloudmusicapienhanced/api/module/search'), }, { identifier: 'scrobble', route: '/scrobble', - module: require('@neteaseapireborn/api/module/scrobble'), + module: require('@neteasecloudmusicapienhanced/api/module/scrobble'), }, { identifier: 'recommend_songs', route: '/recommend/songs', - module: require('@neteaseapireborn/api/module/recommend_songs'), + module: require('@neteasecloudmusicapienhanced/api/module/recommend_songs'), }, { identifier: 'recommend_resource', route: '/recommend/resource', - module: require('@neteaseapireborn/api/module/recommend_resource'), + module: require('@neteasecloudmusicapienhanced/api/module/recommend_resource'), }, { identifier: 'playmode_intelligence_list', route: '/playmode/intelligence/list', - module: require('@neteaseapireborn/api/module/playmode_intelligence_list'), + module: require('@neteasecloudmusicapienhanced/api/module/playmode_intelligence_list'), }, { identifier: 'playlist_video_recent', route: '/playlist/video/recent', - module: require('@neteaseapireborn/api/module/playlist_video_recent'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_video_recent'), }, { identifier: 'playlist_update', route: '/playlist/update', - module: require('@neteaseapireborn/api/module/playlist_update'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_update'), }, { identifier: 'playlist_tracks', route: '/playlist/tracks', - module: require('@neteaseapireborn/api/module/playlist_tracks'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_tracks'), }, { identifier: 'playlist_track_delete', route: '/playlist/track/delete', - module: require('@neteaseapireborn/api/module/playlist_track_delete'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_track_delete'), }, { identifier: 'playlist_track_all', route: '/playlist/track/all', - module: require('@neteaseapireborn/api/module/playlist_track_all'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_track_all'), }, { identifier: 'playlist_track_add', route: '/playlist/track/add', - module: require('@neteaseapireborn/api/module/playlist_track_add'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_track_add'), }, { identifier: 'playlist_tags_update', route: '/playlist/tags/update', - module: require('@neteaseapireborn/api/module/playlist_tags_update'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_tags_update'), }, { identifier: 'playlist_subscribers', route: '/playlist/subscribers', - module: require('@neteaseapireborn/api/module/playlist_subscribers'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_subscribers'), }, { identifier: 'playlist_subscribe', route: '/playlist/subscribe', - module: require('@neteaseapireborn/api/module/playlist_subscribe'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_subscribe'), }, { identifier: 'playlist_privacy', route: '/playlist/privacy', - module: require('@neteaseapireborn/api/module/playlist_privacy'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_privacy'), }, { identifier: 'playlist_order_update', route: '/playlist/order/update', - module: require('@neteaseapireborn/api/module/playlist_order_update'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_order_update'), }, { identifier: 'playlist_name_update', route: '/playlist/name/update', - module: require('@neteaseapireborn/api/module/playlist_name_update'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_name_update'), }, { identifier: 'playlist_mylike', route: '/playlist/mylike', - module: require('@neteaseapireborn/api/module/playlist_mylike'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_mylike'), }, { identifier: 'playlist_hot', route: '/playlist/hot', - module: require('@neteaseapireborn/api/module/playlist_hot'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_hot'), }, { identifier: 'playlist_highquality_tags', route: '/playlist/highquality/tags', - module: require('@neteaseapireborn/api/module/playlist_highquality_tags'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_highquality_tags'), }, { identifier: 'playlist_detail_dynamic', route: '/playlist/detail/dynamic', - module: require('@neteaseapireborn/api/module/playlist_detail_dynamic'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_detail_dynamic'), }, { identifier: 'playlist_detail', route: '/playlist/detail', - module: require('@neteaseapireborn/api/module/playlist_detail'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_detail'), }, { identifier: 'playlist_desc_update', route: '/playlist/desc/update', - module: require('@neteaseapireborn/api/module/playlist_desc_update'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_desc_update'), }, { identifier: 'playlist_delete', route: '/playlist/delete', - module: require('@neteaseapireborn/api/module/playlist_delete'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_delete'), }, { identifier: 'playlist_create', route: '/playlist/create', - module: require('@neteaseapireborn/api/module/playlist_create'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_create'), }, { identifier: 'playlist_cover_update', route: '/playlist/cover/update', - module: require('@neteaseapireborn/api/module/playlist_cover_update'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_cover_update'), }, { identifier: 'playlist_catlist', route: '/playlist/catlist', - module: require('@neteaseapireborn/api/module/playlist_catlist'), + module: require('@neteasecloudmusicapienhanced/api/module/playlist_catlist'), }, { identifier: 'personalized', route: '/personalized', - module: require('@neteaseapireborn/api/module/personalized'), + module: require('@neteasecloudmusicapienhanced/api/module/personalized'), }, { identifier: 'personal_fm', route: '/personal_fm', - module: require('@neteaseapireborn/api/module/personal_fm'), + module: require('@neteasecloudmusicapienhanced/api/module/personal_fm'), }, { identifier: 'mv_url', route: '/mv/url', - module: require('@neteaseapireborn/api/module/mv_url'), + module: require('@neteasecloudmusicapienhanced/api/module/mv_url'), }, { identifier: 'mv_sublist', route: '/mv/sublist', - module: require('@neteaseapireborn/api/module/mv_sublist'), + module: require('@neteasecloudmusicapienhanced/api/module/mv_sublist'), }, { identifier: 'mv_sub', route: '/mv/sub', - module: require('@neteaseapireborn/api/module/mv_sub'), + module: require('@neteasecloudmusicapienhanced/api/module/mv_sub'), }, { identifier: 'mv_first', route: '/mv/first', - module: require('@neteaseapireborn/api/module/mv_first'), + module: require('@neteasecloudmusicapienhanced/api/module/mv_first'), }, { identifier: 'mv_exclusive_rcmd', route: '/mv/exclusive/rcmd', - module: require('@neteaseapireborn/api/module/mv_exclusive_rcmd'), + module: require('@neteasecloudmusicapienhanced/api/module/mv_exclusive_rcmd'), }, { identifier: 'mv_detail_info', route: '/mv/detail/info', - module: require('@neteaseapireborn/api/module/mv_detail_info'), + module: require('@neteasecloudmusicapienhanced/api/module/mv_detail_info'), }, { identifier: 'mv_detail', route: '/mv/detail', - module: require('@neteaseapireborn/api/module/mv_detail'), + module: require('@neteasecloudmusicapienhanced/api/module/mv_detail'), }, { identifier: 'mv_all', route: '/mv/all', - module: require('@neteaseapireborn/api/module/mv_all'), + module: require('@neteasecloudmusicapienhanced/api/module/mv_all'), }, { identifier: 'lyric', route: '/lyric', - module: require('@neteaseapireborn/api/module/lyric'), + module: require('@neteasecloudmusicapienhanced/api/module/lyric'), }, { identifier: 'logout', route: '/logout', - module: require('@neteaseapireborn/api/module/logout'), + module: require('@neteasecloudmusicapienhanced/api/module/logout'), }, { identifier: 'login_status', route: '/login/status', - module: require('@neteaseapireborn/api/module/login_status'), + module: require('@neteasecloudmusicapienhanced/api/module/login_status'), }, { identifier: 'login_refresh', route: '/login/refresh', - module: require('@neteaseapireborn/api/module/login_refresh'), + module: require('@neteasecloudmusicapienhanced/api/module/login_refresh'), }, { identifier: 'login_qr_key', route: '/login/qr/key', - module: require('@neteaseapireborn/api/module/login_qr_key'), + module: require('@neteasecloudmusicapienhanced/api/module/login_qr_key'), }, { identifier: 'login_qr_create', route: '/login/qr/create', - module: require('@neteaseapireborn/api/module/login_qr_create'), + module: require('@neteasecloudmusicapienhanced/api/module/login_qr_create'), }, { identifier: 'login_qr_check', route: '/login/qr/check', - module: require('@neteaseapireborn/api/module/login_qr_check'), + module: require('@neteasecloudmusicapienhanced/api/module/login_qr_check'), }, { identifier: 'login_cellphone', route: '/login/cellphone', - module: require('@neteaseapireborn/api/module/login_cellphone'), + module: require('@neteasecloudmusicapienhanced/api/module/login_cellphone'), }, { identifier: 'login', route: '/login', - module: require('@neteaseapireborn/api/module/login'), + module: require('@neteasecloudmusicapienhanced/api/module/login'), }, { identifier: 'likelist', route: '/likelist', - module: require('@neteaseapireborn/api/module/likelist'), + module: require('@neteasecloudmusicapienhanced/api/module/likelist'), }, { identifier: 'like', route: '/like', - module: require('@neteaseapireborn/api/module/like'), + module: require('@neteasecloudmusicapienhanced/api/module/like'), }, { identifier: 'follow', route: '/follow', - module: require('@neteaseapireborn/api/module/follow'), + module: require('@neteasecloudmusicapienhanced/api/module/follow'), }, { identifier: 'fm_trash', route: '/fm_trash', - module: require('@neteaseapireborn/api/module/fm_trash'), + module: require('@neteasecloudmusicapienhanced/api/module/fm_trash'), }, { identifier: 'daily_signin', route: '/daily_signin', - module: require('@neteaseapireborn/api/module/daily_signin'), + module: require('@neteasecloudmusicapienhanced/api/module/daily_signin'), }, { identifier: 'cloudsearch', route: '/cloudsearch', - module: require('@neteaseapireborn/api/module/cloudsearch'), + module: require('@neteasecloudmusicapienhanced/api/module/cloudsearch'), }, { identifier: 'cloud', route: '/cloud', - module: require('@neteaseapireborn/api/module/cloud'), + module: require('@neteasecloudmusicapienhanced/api/module/cloud'), }, { identifier: 'check_music', route: '/check/music', - module: require('@neteaseapireborn/api/module/check_music'), + module: require('@neteasecloudmusicapienhanced/api/module/check_music'), }, { identifier: 'cellphone_existence_check', route: '/cellphone/existence/check', - module: require('@neteaseapireborn/api/module/cellphone_existence_check'), + module: require('@neteasecloudmusicapienhanced/api/module/cellphone_existence_check'), }, { identifier: 'captcha_verify', route: '/captcha/verify', - module: require('@neteaseapireborn/api/module/captcha_verify'), + module: require('@neteasecloudmusicapienhanced/api/module/captcha_verify'), }, { identifier: 'captcha_sent', route: '/captcha/sent', - module: require('@neteaseapireborn/api/module/captcha_sent'), + module: require('@neteasecloudmusicapienhanced/api/module/captcha_sent'), }, { identifier: 'calendar', route: '/calendar', - module: require('@neteaseapireborn/api/module/calendar'), + module: require('@neteasecloudmusicapienhanced/api/module/calendar'), }, { identifier: 'batch', route: '/batch', - module: require('@neteaseapireborn/api/module/batch'), + module: require('@neteasecloudmusicapienhanced/api/module/batch'), }, { identifier: 'banner', route: '/banner', - module: require('@neteaseapireborn/api/module/banner'), + module: require('@neteasecloudmusicapienhanced/api/module/banner'), }, { identifier: 'avatar_upload', route: '/avatar/upload', - module: require('@neteaseapireborn/api/module/avatar_upload'), + module: require('@neteasecloudmusicapienhanced/api/module/avatar_upload'), }, { identifier: 'audio_match', route: '/audio/match', - module: require('@neteaseapireborn/api/module/audio_match'), + module: require('@neteasecloudmusicapienhanced/api/module/audio_match'), }, { identifier: 'artists', route: '/artists', - module: require('@neteaseapireborn/api/module/artists'), + module: require('@neteasecloudmusicapienhanced/api/module/artists'), }, { identifier: 'artist_video', route: '/artist/video', - module: require('@neteaseapireborn/api/module/artist_video'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_video'), }, { identifier: 'artist_top_song', route: '/artist/top/song', - module: require('@neteaseapireborn/api/module/artist_top_song'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_top_song'), }, { identifier: 'artist_sublist', route: '/artist/sublist', - module: require('@neteaseapireborn/api/module/artist_sublist'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_sublist'), }, { identifier: 'artist_sub', route: '/artist/sub', - module: require('@neteaseapireborn/api/module/artist_sub'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_sub'), }, { identifier: 'artist_songs', route: '/artist/songs', - module: require('@neteaseapireborn/api/module/artist_songs'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_songs'), }, { identifier: 'artist_new_song', route: '/artist/new/song', - module: require('@neteaseapireborn/api/module/artist_new_song'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_new_song'), }, { identifier: 'artist_new_mv', route: '/artist/new/mv', - module: require('@neteaseapireborn/api/module/artist_new_mv'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_new_mv'), }, { identifier: 'artist_mv', route: '/artist/mv', - module: require('@neteaseapireborn/api/module/artist_mv'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_mv'), }, { identifier: 'artist_list', route: '/artist/list', - module: require('@neteaseapireborn/api/module/artist_list'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_list'), }, { identifier: 'artist_fans', route: '/artist/fans', - module: require('@neteaseapireborn/api/module/artist_fans'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_fans'), }, { identifier: 'artist_detail', route: '/artist/detail', - module: require('@neteaseapireborn/api/module/artist_detail'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_detail'), }, { identifier: 'artist_desc', route: '/artist/desc', - module: require('@neteaseapireborn/api/module/artist_desc'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_desc'), }, { identifier: 'artist_album', route: '/artist/album', - module: require('@neteaseapireborn/api/module/artist_album'), + module: require('@neteasecloudmusicapienhanced/api/module/artist_album'), }, { identifier: 'album_sublist', route: '/album/sublist', - module: require('@neteaseapireborn/api/module/album_sublist'), + module: require('@neteasecloudmusicapienhanced/api/module/album_sublist'), }, { identifier: 'album_sub', route: '/album/sub', - module: require('@neteaseapireborn/api/module/album_sub'), + module: require('@neteasecloudmusicapienhanced/api/module/album_sub'), }, { identifier: 'album_songsaleboard', route: '/album/songsaleboard', - module: require('@neteaseapireborn/api/module/album_songsaleboard'), + module: require('@neteasecloudmusicapienhanced/api/module/album_songsaleboard'), }, { identifier: 'album_newest', route: '/album/newest', - module: require('@neteaseapireborn/api/module/album_newest'), + module: require('@neteasecloudmusicapienhanced/api/module/album_newest'), }, { identifier: 'album_new', route: '/album/new', - module: require('@neteaseapireborn/api/module/album_new'), + module: require('@neteasecloudmusicapienhanced/api/module/album_new'), }, { identifier: 'album_list_style', route: '/album/list/style', - module: require('@neteaseapireborn/api/module/album_list_style'), + module: require('@neteasecloudmusicapienhanced/api/module/album_list_style'), }, { identifier: 'album_list', route: '/album/list', - module: require('@neteaseapireborn/api/module/album_list'), + module: require('@neteasecloudmusicapienhanced/api/module/album_list'), }, { identifier: 'album_detail_dynamic', route: '/album/detail/dynamic', - module: require('@neteaseapireborn/api/module/album_detail_dynamic'), + module: require('@neteasecloudmusicapienhanced/api/module/album_detail_dynamic'), }, { identifier: 'album_detail', route: '/album/detail', - module: require('@neteaseapireborn/api/module/album_detail'), + module: require('@neteasecloudmusicapienhanced/api/module/album_detail'), }, { identifier: 'album', route: '/album', - module: require('@neteaseapireborn/api/module/album'), + module: require('@neteasecloudmusicapienhanced/api/module/album'), }, { identifier: 'activate_init_profile', route: '/activate/init/profile', - module: require('@neteaseapireborn/api/module/activate_init_profile'), + module: require('@neteasecloudmusicapienhanced/api/module/activate_init_profile'), }, { identifier: 'api', route: '/api', - module: require('@neteaseapireborn/api/module/api'), + module: require('@neteasecloudmusicapienhanced/api/module/api'), }, ]; diff --git a/src/views/settings.vue b/src/views/settings.vue index 08f23d2b14..3387803548 100644 --- a/src/views/settings.vue +++ b/src/views/settings.vue @@ -811,10 +811,11 @@ import { mapState, mapActions } from 'vuex'; import { isLooseLoggedIn, doLogout } from '@/utils/auth'; import { auth as lastfmAuth } from '@/api/lastfm'; -import { - changeAppearance, - changeThemeColor, - bytesToSize } from '@/utils/common'; +import { + changeAppearance, + changeThemeColor, + bytesToSize, +} from '@/utils/common'; import { countDBSize, clearDB } from '@/utils/db'; import pkg from '../../package.json'; diff --git a/yarn.lock b/yarn.lock index f6390d0129..b68e6e23d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -999,6 +999,11 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@borewit/text-codec@^0.2.1", "@borewit/text-codec@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@borewit/text-codec/-/text-codec-0.2.2.tgz#75025f735c0983b3a871668804a57387e3649375" + integrity sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ== + "@develar/schema-utils@~2.6.5": version "2.6.5" resolved "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" @@ -1659,26 +1664,37 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@neteaseapireborn/api@^4.29.7": - version "4.29.7" - resolved "https://registry.npmmirror.com/@neteaseapireborn/api/-/api-4.29.7.tgz#14fd91504150564ffe7ebe9253b1e3eeb9d041d4" - integrity sha512-cjjuJ4XBlmklKjWpI1IJRzA6etrhWBCRgk8rtrZZ4JSEPfVmXGLew5DV80owGKSHqnVDAxGQkraxesqX7O2PDQ== +"@neteasecloudmusicapienhanced/api@^4.36.1": + version "4.36.1" + resolved "https://registry.yarnpkg.com/@neteasecloudmusicapienhanced/api/-/api-4.36.1.tgz#8492ed077c9c82a4aa013b3fe5819e7d585a2c7e" + integrity sha512-Do677SCn+I62Sk+CWxQVinG8LRhD1qejrsNjoTT9twfU+JzdjK1VsYGR7k3IsEfPkZudKLdQUJq63ohfxQ5WPg== dependencies: - "@unblockneteasemusic/server" "^0.28.0" - axios "^1.12.2" + "@neteasecloudmusicapienhanced/unblockmusic-utils" "^0.3.3" + axios "^1.18.0" crypto-js "^4.2.0" - dotenv "^16.6.1" - express "^4.21.2" + dotenv "^17.4.2" + express "^5.2.1" express-fileupload "^1.5.2" - md5 "^2.3.0" - music-metadata "^7.14.0" - node-forge "^1.3.1" + gzip "^0.1.0" + music-metadata "^11.13.0" + node-forge "^1.4.0" pac-proxy-agent "^7.2.0" qrcode "^1.5.4" safe-decode-uri-component "^1.2.1" tunnel "^0.0.6" xml2js "^0.6.2" - yargs "^17.7.2" + yargs "^18.0.0" + +"@neteasecloudmusicapienhanced/unblockmusic-utils@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@neteasecloudmusicapienhanced/unblockmusic-utils/-/unblockmusic-utils-0.3.3.tgz#56f68ac1b51a0fdfe8034e1ef5ccf368572c74fb" + integrity sha512-Lm2Zxod4Qfhp3HNDmaHxzJPLiMfMNkUT2PXp0VVrDW+/dDZBfSANO+pnCHx+MkK7tDUb3wGwYp5q2w9Kw1+4OA== + dependencies: + "@unblockneteasemusic/server" "^0.28.0" + axios "^1.16.1" + dotenv "^17.4.2" + express "^4.22.2" + https "^1.0.0" "@node-ipc/js-queue@2.0.3": version "2.0.3" @@ -1844,6 +1860,14 @@ dependencies: defer-to-connect "^1.0.1" +"@tokenizer/inflate@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@tokenizer/inflate/-/inflate-0.4.1.tgz#fa6cdb8366151b3cc8426bf9755c1ea03a2fba08" + integrity sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA== + dependencies: + debug "^4.4.3" + token-types "^6.1.1" + "@tokenizer/token@^0.3.0": version "0.3.0" resolved "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" @@ -2826,6 +2850,14 @@ abstract-socket@^2.0.0: bindings "^1.2.1" nan "^2.12.1" +accepts@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" + integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== + dependencies: + mime-types "^3.0.0" + negotiator "^1.0.0" + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -2965,6 +2997,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -2984,6 +3021,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + any-base@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" @@ -3312,14 +3354,15 @@ axios@^0.26.1: dependencies: follow-redirects "^1.14.8" -axios@^1.12.2: - version "1.12.2" - resolved "https://registry.npmmirror.com/axios/-/axios-1.12.2.tgz#6c307390136cf7a2278d09cec63b136dfc6e6da7" - integrity sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw== +axios@^1.16.1, axios@^1.18.0: + version "1.18.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.18.1.tgz#d63f9863bcd8938815c86f9e2abd380189d96dfe" + integrity sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g== dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.4" - proxy-from-env "^1.1.0" + follow-redirects "^1.16.0" + form-data "^4.0.5" + https-proxy-agent "^5.0.1" + proxy-from-env "^2.1.0" babel-eslint@^10.1.0: version "10.1.0" @@ -3556,6 +3599,39 @@ body-parser@1.20.3: type-is "~1.6.18" unpipe "1.0.0" +body-parser@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.3.0.tgz#6d8662f4d8c336028b8ac9aa24251b0ca64ba437" + integrity sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw== + dependencies: + bytes "^3.1.2" + content-type "^2.0.0" + debug "^4.4.3" + http-errors "^2.0.1" + iconv-lite "^0.7.2" + on-finished "^2.4.1" + qs "^6.15.2" + raw-body "^3.0.2" + type-is "^2.1.0" + +body-parser@~1.20.5: + version "1.20.5" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.5.tgz#303c8c34423d1d6fa799bc764e93c1e4dc6ebf64" + integrity sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA== + dependencies: + bytes "~3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "~1.2.0" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + on-finished "~2.4.1" + qs "~6.15.1" + raw-body "~2.5.3" + type-is "~1.6.18" + unpipe "~1.0.0" + bonjour@^3.5.0: version "3.5.0" resolved "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" @@ -3817,7 +3893,7 @@ bytes@3.0.0: resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== -bytes@3.1.2: +bytes@3.1.2, bytes@^3.1.2, bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== @@ -3926,6 +4002,14 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: get-intrinsic "^1.2.4" set-function-length "^1.2.1" +call-bound@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + call-me-maybe@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" @@ -4304,6 +4388,15 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +cliui@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-9.0.1.tgz#6f7890f386f6f1f79953adc1f78dec46fcc2d291" + integrity sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w== + dependencies: + string-width "^7.2.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + clone-response@^1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" @@ -4550,18 +4643,28 @@ constants-browserify@^1.0.0: resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== -content-disposition@0.5.4: +content-disposition@0.5.4, content-disposition@~0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" +content-disposition@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.1.0.tgz#f3db789c752d45564cc7e9e1e0b31790d4a38e17" + integrity sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g== + content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== +content-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-2.0.0.tgz#2fb3ede69dffa0af78ca7c4ce7589680638b56df" + integrity sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ== + convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -4572,6 +4675,16 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie-signature@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" + integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== + +cookie-signature@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" + integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== + cookie@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" @@ -4582,6 +4695,11 @@ cookie@0.7.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== +cookie@^0.7.1, cookie@~0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -5033,6 +5151,13 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" +debug@^4.4.0, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -5202,7 +5327,7 @@ delegate@^3.1.2: resolved "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== -depd@2.0.0: +depd@2.0.0, depd@^2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -5220,7 +5345,7 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@1.2.0: +destroy@1.2.0, destroy@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== @@ -5461,10 +5586,10 @@ dotenv-expand@^5.1.0: resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== -dotenv@^16.6.1: - version "16.6.1" - resolved "https://registry.npmmirror.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" - integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== +dotenv@^17.4.2: + version "17.4.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.4.2.tgz#c07e54a746e11eba021dd9e1047ced5afdc1c034" + integrity sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw== dotenv@^8.2.0: version "8.6.0" @@ -5723,6 +5848,11 @@ elliptic@^6.5.3, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emoji-regex@^10.3.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -5748,7 +5878,7 @@ encodeurl@^1.0.2, encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encodeurl@~2.0.0: +encodeurl@^2.0.0, encodeurl@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== @@ -6039,7 +6169,7 @@ escape-goat@^2.0.0: resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== -escape-html@~1.0.3: +escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== @@ -6235,7 +6365,7 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: +etag@^1.8.1, etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -6466,43 +6596,77 @@ express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" -express@^4.21.2: - version "4.21.2" - resolved "https://registry.npmmirror.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" - integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== +express@^4.22.2: + version "4.22.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.22.2.tgz#c17ae0981e5efc24b22272f0e041c4662503b700" + integrity sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" + body-parser "~1.20.5" + content-disposition "~0.5.4" content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" + cookie "~0.7.1" + cookie-signature "~1.0.6" debug "2.6.9" depd "2.0.0" encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" + finalhandler "~1.3.1" + fresh "~0.5.2" + http-errors "~2.0.0" merge-descriptors "1.0.3" methods "~1.1.2" - on-finished "2.4.1" + on-finished "~2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.12" + path-to-regexp "~0.1.12" proxy-addr "~2.0.7" - qs "6.13.0" + qs "~6.15.1" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" + send "~0.19.0" + serve-static "~1.16.2" setprototypeof "1.2.0" - statuses "2.0.1" + statuses "~2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" +express@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/express/-/express-5.2.1.tgz#8f21d15b6d327f92b4794ecf8cb08a72f956ac04" + integrity sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== + dependencies: + accepts "^2.0.0" + body-parser "^2.2.1" + content-disposition "^1.0.0" + content-type "^1.0.5" + cookie "^0.7.1" + cookie-signature "^1.2.1" + debug "^4.4.0" + depd "^2.0.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + finalhandler "^2.1.0" + fresh "^2.0.0" + http-errors "^2.0.0" + merge-descriptors "^2.0.0" + mime-types "^3.0.0" + on-finished "^2.4.1" + once "^1.4.0" + parseurl "^1.3.3" + proxy-addr "^2.0.7" + qs "^6.14.0" + range-parser "^1.2.1" + router "^2.2.0" + send "^1.1.0" + serve-static "^2.2.0" + statuses "^2.0.1" + type-is "^2.0.1" + vary "^1.1.2" + ext-list@^2.0.0: version "2.2.2" resolved "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" @@ -6714,6 +6878,16 @@ file-type@^16.5.4: strtok3 "^6.2.4" token-types "^4.1.1" +file-type@^21.3.4: + version "21.3.4" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-21.3.4.tgz#e3f902faee8ec4aa152909fc902a7a77f9c06725" + integrity sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g== + dependencies: + "@tokenizer/inflate" "^0.4.1" + strtok3 "^10.3.4" + token-types "^6.1.1" + uint8array-extras "^1.4.0" + file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -6779,6 +6953,31 @@ finalhandler@1.3.1: statuses "2.0.1" unpipe "~1.0.0" +finalhandler@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.1.tgz#a2c517a6559852bcdb06d1f8bd7f51b68fad8099" + integrity sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA== + dependencies: + debug "^4.4.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + on-finished "^2.4.1" + parseurl "^1.3.3" + statuses "^2.0.1" + +finalhandler@~1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" + integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "~2.4.1" + parseurl "~1.3.3" + statuses "~2.0.2" + unpipe "~1.0.0" + find-cache-dir@^0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" @@ -6876,10 +7075,10 @@ follow-redirects@^1.0.0, follow-redirects@^1.14.8: resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== +follow-redirects@^1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" + integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== for-each@^0.3.3: version "0.3.3" @@ -6907,16 +7106,16 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@^4.0.4: - version "4.0.4" - resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" - integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== +form-data@^4.0.5: + version "4.0.6" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.6.tgz#28e864e1b786dbebb68db1f452f9635278665827" + integrity sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" es-set-tostringtag "^2.1.0" - hasown "^2.0.2" - mime-types "^2.1.12" + hasown "^2.0.4" + mime-types "^2.1.35" form-data@~2.3.2: version "2.3.3" @@ -6939,11 +7138,16 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fresh@0.5.2: +fresh@0.5.2, fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" + integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== + friendly-errors-webpack-plugin@^1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz#efc86cbb816224565861a1be7a9d84d0aafea136" @@ -7104,6 +7308,11 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz#216900f91df11a8b2c198c3e1d93d6c035a776b9" + integrity sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -7115,7 +7324,7 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@ has-symbols "^1.0.3" hasown "^2.0.0" -get-intrinsic@^1.2.6: +get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== @@ -7415,6 +7624,11 @@ gzip-size@^5.0.0: duplexer "^0.1.1" pify "^4.0.1" +gzip@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/gzip/-/gzip-0.1.0.tgz#ed5496fc37aa47ee6b55a06b4f8da2593b8367c9" + integrity sha512-o2kq0ogD3MMAwDUt3G8y6EtFPqXDtpNI/zNWkZoOwYkjp/j8/Q9QLpVySPxYaQ521hPT8GoV9g1/WTkd7DM5Aw== + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -7566,6 +7780,13 @@ hasown@^2.0.1: dependencies: function-bind "^1.1.2" +hasown@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== + dependencies: + function-bind "^1.1.2" + he@1.2.x, he@^1.1.1, he@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -7729,6 +7950,17 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-errors@^2.0.0, http-errors@^2.0.1, http-errors@~2.0.0, http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== + dependencies: + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" + http-errors@~1.6.2: version "1.6.3" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -7814,7 +8046,7 @@ https-browserify@^1.0.0: resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== -https-proxy-agent@5, https-proxy-agent@^5.0.0: +https-proxy-agent@5, https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -7830,6 +8062,11 @@ https-proxy-agent@^7.0.6: agent-base "^7.1.2" debug "4" +https@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https/-/https-1.0.0.tgz#3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4" + integrity sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg== + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -7876,7 +8113,7 @@ iconv-corefoundation@^1.1.7: cli-truncate "^2.1.0" node-addon-api "^1.6.3" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -7890,6 +8127,13 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +iconv-lite@^0.7.2, iconv-lite@~0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" + integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" @@ -8010,7 +8254,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -8365,6 +8609,11 @@ is-promise@^2.2.2: resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -9132,6 +9381,11 @@ media-typer@^1.1.0: resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== +media-typer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-2.0.0.tgz#5f43742a44d474b83ad4d1bd0f0c5cf56c0cd280" + integrity sha512-kOy3OxT2HH39N70UnKgu4NWDZjLOz8W/mfyvniHjRH/DrL3f2pOfvWQ4p60offbbtDAnXWp0v9LfMIqMec269Q== + memoizee@^0.4.15: version "0.4.15" resolved "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" @@ -9172,6 +9426,11 @@ merge-descriptors@1.0.3: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== +merge-descriptors@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" + integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== + merge-options@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz#2a64b24457becd4e4dc608283247e94ce589aa32" @@ -9268,13 +9527,25 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-types@^2.1.12, mime-types@^2.1.35, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime-types@^3.0.0, mime-types@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" + integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== + dependencies: + mime-db "^1.54.0" + mime@1.6.0, mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -9509,7 +9780,23 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" -music-metadata@^7.14.0, music-metadata@^7.5.3: +music-metadata@^11.13.0: + version "11.13.0" + resolved "https://registry.yarnpkg.com/music-metadata/-/music-metadata-11.13.0.tgz#bb7355e8c6dc200551aa13c846bfd6ab552e723d" + integrity sha512-uXRaov9dfjSpQufXIU7sMxVZnh+FilCQv2mXn+K5EJ/decP3dTWrgvPYa5r6MtRbieNSCE708Da4J0u1UGfQIw== + dependencies: + "@borewit/text-codec" "^0.2.2" + "@tokenizer/token" "^0.3.0" + content-type "^2.0.0" + debug "^4.4.3" + file-type "^21.3.4" + media-typer "^2.0.0" + strtok3 "^10.3.5" + token-types "^6.1.2" + uint8array-extras "^1.5.0" + win-guid "^0.2.1" + +music-metadata@^7.5.3: version "7.14.0" resolved "https://registry.npmjs.org/music-metadata/-/music-metadata-7.14.0.tgz#74e3e5fc8e09b86d1a3e791fb5ce9ccdc4347ad9" integrity sha512-xrm3w7SV0Wk+OythZcSbaI8mcr/KHd0knJieu8bVpaPfMv/Agz5EooCAPz3OR5hbYMiUG6dgAPKZKnMzV+3amA== @@ -9578,6 +9865,11 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== + neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -9647,10 +9939,10 @@ node-forge@^0.10.0: resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== -node-forge@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== +node-forge@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.4.0.tgz#1c7b7d8bdc2d078739f58287d589d903a11b2fc2" + integrity sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ== node-libs-browser@^2.2.1: version "2.2.1" @@ -9834,6 +10126,11 @@ object-inspect@^1.13.1: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + object-is@^1.1.5: version "1.1.6" resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" @@ -9906,7 +10203,7 @@ on-exit-leak-free@^0.2.0: resolved "https://registry.npmmirror.com/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== -on-finished@2.4.1: +on-finished@2.4.1, on-finished@^2.4.1, on-finished@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -10227,7 +10524,7 @@ parse5@^6.0.1: resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parseurl@~1.3.2, parseurl@~1.3.3: +parseurl@^1.3.3, parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -10310,16 +10607,21 @@ path-to-regexp@0.1.10: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== -path-to-regexp@0.1.12: - version "0.1.12" - resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" - integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== - path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@^8.0.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz#795c420c4f7ca45c5b887366f622ee0c9852cccd" + integrity sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA== + +path-to-regexp@~0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz#9b22ec16bc3ab88d05a0c7e369869421401ab17d" + integrity sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA== + path-type@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -11054,7 +11356,7 @@ proto-list@~1.2.1: resolved "https://registry.npmmirror.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== -proxy-addr@~2.0.7: +proxy-addr@^2.0.7, proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== @@ -11062,10 +11364,10 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +proxy-from-env@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" + integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== prr@~1.0.1: version "1.0.1" @@ -11180,6 +11482,14 @@ qs@^6.11.2: dependencies: side-channel "^1.0.4" +qs@^6.14.0, qs@^6.15.2, qs@~6.15.1: + version "6.15.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.3.tgz#76852132a58ed5c7c0ef67e4441b9bb5d6061b3b" + integrity sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A== + dependencies: + es-define-property "^1.0.1" + side-channel "^1.1.1" + qs@~6.5.2: version "6.5.3" resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -11248,6 +11558,26 @@ raw-body@2.5.2, raw-body@^2.2.0, raw-body@^2.3.0: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.2.tgz#3e3ada5ae5568f9095d84376fd3a49b8fb000a51" + integrity sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA== + dependencies: + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.7.0" + unpipe "~1.0.0" + +raw-body@~2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" + integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== + dependencies: + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + unpipe "~1.0.0" + rc@^1.2.7: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -11634,6 +11964,17 @@ roarr@^2.15.3: semver-compare "^1.0.0" sprintf-js "^1.1.2" +router@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" + integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== + dependencies: + debug "^4.4.0" + depd "^2.0.0" + is-promise "^4.0.0" + parseurl "^1.3.3" + path-to-regexp "^8.0.0" + run-async@^2.4.0: version "2.4.1" resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -11880,6 +12221,42 @@ send@0.19.0: range-parser "~1.2.1" statuses "2.0.1" +send@^1.1.0, send@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/send/-/send-1.2.1.tgz#9eab743b874f3550f40a26867bf286ad60d3f3ed" + integrity sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ== + dependencies: + debug "^4.4.3" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + fresh "^2.0.0" + http-errors "^2.0.1" + mime-types "^3.0.2" + ms "^2.1.3" + on-finished "^2.4.1" + range-parser "^1.2.1" + statuses "^2.0.2" + +send@~0.19.0, send@~0.19.1: + version "0.19.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" + integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "~0.5.2" + http-errors "~2.0.1" + mime "1.6.0" + ms "2.1.3" + on-finished "~2.4.1" + range-parser "~1.2.1" + statuses "~2.0.2" + sentence-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" @@ -11936,6 +12313,26 @@ serve-static@1.16.2: parseurl "~1.3.3" send "0.19.0" +serve-static@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.1.tgz#7f186a4a4e5f5b663ad7a4294ff1bf37cf0e98a9" + integrity sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw== + dependencies: + encodeurl "^2.0.0" + escape-html "^1.0.3" + parseurl "^1.3.3" + send "^1.2.0" + +serve-static@~1.16.2: + version "1.16.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" + integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "~0.19.1" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -11983,7 +12380,7 @@ setprototypeof@1.1.0: resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -setprototypeof@1.2.0: +setprototypeof@1.2.0, setprototypeof@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== @@ -12044,6 +12441,35 @@ shell-quote@^1.8.1: resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== +side-channel-list@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127" + integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.4" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" @@ -12054,6 +12480,17 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" +side-channel@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab" + integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.4" + side-channel-list "^1.0.1" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -12447,6 +12884,11 @@ statuses@2.0.1: resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@^2.0.1, statuses@^2.0.2, statuses@~2.0.1, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -12522,6 +12964,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^7.0.0, string-width@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + string.prototype.trim@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" @@ -12605,6 +13056,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" + integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== + dependencies: + ansi-regex "^6.2.2" + strip-comments@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" @@ -12638,6 +13096,13 @@ strip-json-comments@~2.0.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strtok3@^10.3.4, strtok3@^10.3.5: + version "10.3.5" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-10.3.5.tgz#7213285da0dc3dec0fc8ce5df4b8b7a733f14360" + integrity sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA== + dependencies: + "@tokenizer/token" "^0.3.0" + strtok3@^6.2.4, strtok3@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz#358b80ffe6d5d5620e19a073aa78ce947a90f9a0" @@ -13024,7 +13489,7 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -toidentifier@1.0.1: +toidentifier@1.0.1, toidentifier@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== @@ -13037,6 +13502,15 @@ token-types@^4.1.1, token-types@^4.2.1: "@tokenizer/token" "^0.3.0" ieee754 "^1.2.1" +token-types@^6.1.1, token-types@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-6.1.2.tgz#18d0fd59b996d421f9f83914d6101c201bd08129" + integrity sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww== + dependencies: + "@borewit/text-codec" "^0.2.1" + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" + toposort@^1.0.0: version "1.0.7" resolved "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" @@ -13146,6 +13620,15 @@ type-fest@^2.17.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== +type-is@^2.0.1, type-is@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.1.0.tgz#71d1a7053293582e16ac9f3ebaf1ab9aa49e5570" + integrity sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA== + dependencies: + content-type "^2.0.0" + media-typer "^1.1.0" + mime-types "^3.0.0" + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -13223,6 +13706,11 @@ uglify-js@3.4.x: commander "~2.19.0" source-map "~0.6.1" +uint8array-extras@^1.4.0, uint8array-extras@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/uint8array-extras/-/uint8array-extras-1.5.0.tgz#10d2a85213de3ada304fea1c454f635c73839e86" + integrity sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -13529,7 +14017,7 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vary@~1.1.2: +vary@^1.1.2, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== @@ -13941,6 +14429,11 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +win-guid@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/win-guid/-/win-guid-0.2.1.tgz#576915ba5e10bf92ec6a32b71ab06b5f75403fc0" + integrity sha512-gEIQU4mkgl2OPeoNrWflcJFJ3Ae2BPd4eCsHHA/XikslkIVms/nHhvnvzIZV7VLmBvtFlDOzLt9rrZT+n6D67A== + word-wrap@~1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" @@ -14115,6 +14608,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98" + integrity sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -14271,6 +14773,11 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs-parser@^22.0.0: + version "22.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-22.0.0.tgz#87b82094051b0567717346ecd00fd14804b357c8" + integrity sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw== + yargs@^13.3.2: version "13.3.2" resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" @@ -14317,7 +14824,7 @@ yargs@^16.0.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.5.1, yargs@^17.7.2: +yargs@^17.5.1: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -14330,6 +14837,18 @@ yargs@^17.5.1, yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-18.0.0.tgz#6c84259806273a746b09f579087b68a3c2d25bd1" + integrity sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg== + dependencies: + cliui "^9.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + string-width "^7.2.0" + y18n "^5.0.5" + yargs-parser "^22.0.0" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" From a1ac16456171e50ac1ae31d20572b7e7cf97a7ea Mon Sep 17 00:00:00 2001 From: zwx08 Date: Fri, 26 Jun 2026 16:55:50 +0800 Subject: [PATCH 2/8] chore: add out/ to gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d8dd8fc0f3..a627629ebc 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ pnpm-debug.log* #Electron-builder output /dist_electron +out NeteaseCloudMusicApi-master NeteaseCloudMusicApi-master.zip @@ -40,4 +41,4 @@ devenv.local.nix .direnv # pre-commit -.pre-commit-config.yaml +.pre-commit-config.yaml \ No newline at end of file From db11ac16e25ec9a57cacc1abea0ff2cb5af89ffb Mon Sep 17 00:00:00 2001 From: zwx08 Date: Fri, 26 Jun 2026 17:02:24 +0800 Subject: [PATCH 3/8] feat: add web login (cookie/Electron browser login) from dev branch --- src/api/user.js | 19 +++++ src/electron/ipcMain.js | 88 ++++++++++++++++++- src/locale/lang/en.js | 7 ++ src/locale/lang/tr.js | 8 ++ src/locale/lang/zh-CN.js | 6 ++ src/locale/lang/zh-TW.js | 6 ++ src/utils/auth.js | 54 ++++++++++-- src/views/loginAccount.vue | 168 +++++++++++++++++++++++++++++++++++-- 8 files changed, 345 insertions(+), 11 deletions(-) diff --git a/src/api/user.js b/src/api/user.js index ec020144c7..a0eeac2f8d 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -30,6 +30,25 @@ export function userAccount() { }, }); } +/** + * 通过 Cookie 获取账号详情(网页登录) + * 说明 : 登录后调用此接口 ,可获取用户账号信息 + * - cookie: 网易云 Cookie 字符串 + * @param {string} cookie + */ +export function userAccountWithCookie(cookie) { + const data = new URLSearchParams(); + data.set('cookie', cookie); + + return request({ + url: '/user/account', + method: 'post', + params: { + timestamp: new Date().getTime(), + }, + data, + }); +} /** * 获取用户歌单 diff --git a/src/electron/ipcMain.js b/src/electron/ipcMain.js index 09f3ca855f..b02f2acca0 100644 --- a/src/electron/ipcMain.js +++ b/src/electron/ipcMain.js @@ -1,4 +1,11 @@ -import { app, dialog, globalShortcut, ipcMain } from 'electron'; +import { + app, + BrowserWindow, + dialog, + globalShortcut, + ipcMain, + session, +} from 'electron'; import UNM from '@unblockneteasemusic/rust-napi'; import { registerGlobalShortcut } from '@/electron/globalShortcut'; import cloneDeep from 'lodash/cloneDeep'; @@ -133,6 +140,15 @@ function parseSourceStringToList(executor, sourceString) { }); } + +const getNeteaseCookieString = async loginSession => { + const cookies = await loginSession.cookies.get({ + domain: 'music.163.com', + }); + + return cookies.map(cookie => `${cookie.name}=${cookie.value}`).join('; '); +}; + export function initIpcMain(win, store, trayEventEmitter) { // WIP: Do not enable logging as it has some issues in non-blocking I/O environment. // UNM.enableLogging(UNM.LoggingType.ConsoleEnv); @@ -198,6 +214,76 @@ export function initIpcMain(win, store, trayEventEmitter) { } ); + + ipcMain.handle('open-netease-web-login', async () => { + const loginSession = session.fromPartition('persist:netease-web-login'); + const existingCookieString = await getNeteaseCookieString(loginSession); + if (existingCookieString.includes('MUSIC_U=')) { + return existingCookieString; + } + + return new Promise((resolve, reject) => { + let settled = false; + const loginWindow = new BrowserWindow({ + width: 960, + height: 720, + parent: win, + title: 'NetEase Web Login', + webPreferences: { + partition: 'persist:netease-web-login', + nodeIntegration: false, + contextIsolation: true, + }, + }); + + const cleanup = () => { + loginSession.cookies.removeListener('changed', handleCookieChanged); + loginWindow.removeListener('closed', handleClosed); + }; + + const finish = cookieString => { + if (settled) return; + settled = true; + cleanup(); + if (!loginWindow.isDestroyed()) loginWindow.close(); + resolve(cookieString); + }; + + const fail = error => { + if (settled) return; + settled = true; + cleanup(); + reject(error); + }; + + const checkLoginCookie = async () => { + try { + const cookieString = await getNeteaseCookieString(loginSession); + if (cookieString.includes('MUSIC_U=')) finish(cookieString); + } catch (error) { + fail(error); + } + }; + + const handleCookieChanged = (_event, cookie) => { + if (cookie.domain?.includes('music.163.com')) { + checkLoginCookie(); + } + }; + + const handleClosed = () => { + if (!settled) { + cleanup(); + resolve(''); + } + }; + + loginSession.cookies.on('changed', handleCookieChanged); + loginWindow.on('closed', handleClosed); + loginWindow.loadURL('https://music.163.com/#/login').catch(fail); + }); + }); + ipcMain.on('close', e => { if (isMac) { win.hide(); diff --git a/src/locale/lang/en.js b/src/locale/lang/en.js index 4e1c947d3e..5e9ef69c94 100644 --- a/src/locale/lang/en.js +++ b/src/locale/lang/en.js @@ -87,6 +87,13 @@ export default { login: 'Login', loginWithEmail: 'Login with Email', loginWithPhone: 'Login with Phone', + webLogin: 'Web Login', + openWebLogin: 'Open NetEase Web Login', + webLoginTip: + 'After logging in on the NetEase page, copy that page Cookie and paste it below.', + cookiePlaceholder: 'Paste NetEase Cookie such as MUSIC_U=...; __csrf=...', + cookieTip: + 'MUSIC_U is required. Cookies are only stored in this browser and localStorage.', notice: `YesPlayMusic promises not to save any of your account information to the cloud.
Your password will be MD5 encrypted locally and then transmitted to NetEase Music API.
YesPlayMusic is not the official website of NetEase Music, please consider carefully before entering account information. You can also go to YesPlayMusic's GitHub repository to build and use the self-hosted NetEase Music API.`, diff --git a/src/locale/lang/tr.js b/src/locale/lang/tr.js index 8def25779d..ef8b27f4dc 100644 --- a/src/locale/lang/tr.js +++ b/src/locale/lang/tr.js @@ -83,6 +83,14 @@ export default { login: 'Giriş Yap', loginWithEmail: 'Email ile giriş yap', loginWithPhone: 'Phone ile giriş yap', + webLogin: 'Web ile giriş yap', + openWebLogin: 'NetEase web girişini aç', + webLoginTip: + 'NetEase sayfasında giriş yaptıktan sonra sayfanın Cookie bilgisini kopyalayıp aşağıya yapıştır.', + cookiePlaceholder: + 'MUSIC_U=...; __csrf=... gibi NetEase Cookie bilgisini yapıştır', + cookieTip: + 'MUSIC_U gereklidir. Cookie yalnızca bu tarayıcıda ve localStorage içinde saklanır.', notice: `YesPlayMusic hesabınızın hiçbir bilgisini kaydetmeyeceğine dair söz veriyor
Şifren MD5 şifreleme ile yerel olarak şifrelenir ve daha sonra NetEase Müzik API'sine gönderilir
YesPlayMusic, NetEase Music'in resmi websitesi değildir, lütfen hesap bilgilerinizi girmeden önce dikkatlice düşününüz. Aynı zamanda, Kendi NetEase Musix API'nızı host etmek için YesPlayMusic'in GitHub Repo'suna gidebilirsiniz.`, diff --git a/src/locale/lang/zh-CN.js b/src/locale/lang/zh-CN.js index 968e02077b..3f89e0cdd8 100644 --- a/src/locale/lang/zh-CN.js +++ b/src/locale/lang/zh-CN.js @@ -84,6 +84,12 @@ export default { login: '登录', loginWithEmail: '邮箱登录', loginWithPhone: '手机号登录', + webLogin: '网页登录', + openWebLogin: '打开网易云网页登录', + webLoginTip: + '在打开的网易云页面完成登录后,复制该页面的 Cookie 并粘贴到下方。', + cookiePlaceholder: '粘贴 MUSIC_U=...; __csrf=... 等网易云 Cookie', + cookieTip: '至少需要 MUSIC_U。Cookie 只会保存在本机浏览器和 localStorage。', notice: `YesPlayMusic 承诺不会保存你的任何账号信息到云端。
你的密码会在本地进行 MD5 加密后再传输到网易云 API。
YesPlayMusic 并非网易云官方网站,输入账号信息前请慎重考虑。 你也可以前往 diff --git a/src/locale/lang/zh-TW.js b/src/locale/lang/zh-TW.js index e91bc4a640..96644c7e5b 100644 --- a/src/locale/lang/zh-TW.js +++ b/src/locale/lang/zh-TW.js @@ -80,6 +80,12 @@ export default { login: '登入', loginWithEmail: '信箱登入', loginWithPhone: '手機號碼登入', + webLogin: '網頁登入', + openWebLogin: '打開網易雲網頁登入', + webLoginTip: + '在打開的網易雲頁面完成登入後,複製該頁面的 Cookie 並貼到下方。', + cookiePlaceholder: '貼上 MUSIC_U=...; __csrf=... 等網易雲 Cookie', + cookieTip: '至少需要 MUSIC_U。Cookie 只會保存在本機瀏覽器和 localStorage。', notice: `YesPlayMusic 承諾不會保存您的任何帳戶資訊到雲端。
您的密碼會在本地進行 MD5 加密後再傳輸到網易雲 API。
YesPlayMusic 並非網易雲官方網站,輸入帳戶資訊前請慎重考慮。 您也可以前往 diff --git a/src/utils/auth.js b/src/utils/auth.js index 6c43863e38..92b22c9780 100644 --- a/src/utils/auth.js +++ b/src/utils/auth.js @@ -2,12 +2,49 @@ import Cookies from 'js-cookie'; import { logout } from '@/api/auth'; import store from '@/store'; +const cookieAttributes = new Set([ + 'domain', + 'expires', + 'httponly', + 'max-age', + 'path', + 'samesite', + 'secure', +]); + +export function normalizeCookieString(string) { + const cookies = string.includes(';;') + ? string.split(';;') + : string.split(';'); + + return cookies + .map(cookie => { + const [rawKey, ...rawValue] = cookie.trim().split('='); + const key = rawKey?.trim(); + const value = rawValue.join('=').trim(); + + if (!key || !value || cookieAttributes.has(key.toLowerCase())) { + return null; + } + + return `${key}=${value}`; + }) + .filter(Boolean) + .join('; '); +} + export function setCookies(string) { - const cookies = string.split(';;'); - cookies.map(cookie => { - document.cookie = cookie; - const cookieKeyValue = cookie.split(';')[0].split('='); - localStorage.setItem(`cookie-${cookieKeyValue[0]}`, cookieKeyValue[1]); + const cookies = normalizeCookieString(string).split(';'); + + cookies.forEach(cookie => { + const [rawKey, ...rawValue] = cookie.trim().split('='); + const key = rawKey?.trim(); + const value = rawValue.join('=').trim(); + + if (!key || !value || cookieAttributes.has(key.toLowerCase())) return; + + document.cookie = `${key}=${value}; path=/`; + localStorage.setItem(`cookie-${key}`, value); }); } @@ -15,6 +52,13 @@ export function getCookie(key) { return Cookies.get(key) ?? localStorage.getItem(`cookie-${key}`); } +export function getCookieString() { + return Object.keys(localStorage) + .filter(key => key.startsWith('cookie-')) + .map(key => `${key.replace('cookie-', '')}=${localStorage.getItem(key)}`) + .join('; '); +} + export function removeCookie(key) { Cookies.remove(key); localStorage.removeItem(`cookie-${key}`); diff --git a/src/views/loginAccount.vue b/src/views/loginAccount.vue index 8b2a2d3300..69fa2c8766 100644 --- a/src/views/loginAccount.vue +++ b/src/views/loginAccount.vue @@ -51,7 +51,7 @@ -
+
@@ -78,6 +78,26 @@ {{ qrCodeInformation }}
+
@@ -116,7 +140,8 @@ import QRCode from 'qrcode'; import md5 from 'crypto-js/md5'; import NProgress from 'nprogress'; import { mapMutations } from 'vuex'; -import { setCookies } from '@/utils/auth'; +import { normalizeCookieString, removeCookie, setCookies } from '@/utils/auth'; +import { userAccountWithCookie } from '@/api/user'; import nativeAlert from '@/utils/nativeAlert'; import { loginWithPhone, @@ -136,6 +161,8 @@ export default { email: '', password: '', smsCode: '', + cookieText: '', + cookieError: '', inputFocus: '', qrCodeKey: '', qrCodeSvg: '', @@ -149,7 +176,7 @@ export default { }, }, created() { - if (['phone', 'email', 'qrCode'].includes(this.$route.query.mode)) { + if (['phone', 'email', 'qrCode', 'cookie'].includes(this.$route.query.mode)) { this.mode = this.$route.query.mode; } this.getQrCodeKey(); @@ -185,7 +212,9 @@ export default { return true; }, login() { - if (this.mode === 'phone') { + if (this.mode === 'cookie') { + this.loginWithCookie(); + } else if (this.mode === 'phone') { this.processing = this.validatePhone(); if (!this.processing) return; loginWithPhone({ @@ -232,6 +261,77 @@ export default { nativeAlert(data.msg ?? data.message ?? '账号或密码错误,请检查'); } }, + loginWithCookie() { + if (!this.cookieText.includes('MUSIC_U=')) { + this.cookieError = 'Cookie 中缺少 MUSIC_U'; + return; + } + + this.processing = true; + this.cookieError = ''; + const cookie = normalizeCookieString(this.cookieText); + userAccountWithCookie(cookie) + .then(result => { + if (!result?.profile?.userId) { + const message = result?.msg ?? result?.message ?? result?.code; + throw new Error( + message + ? `无法获取账号信息:${message}` + : '无法获取账号信息,请检查 Cookie 是否有效' + ); + } + + setCookies(cookie); + this.updateData({ key: 'loginMode', value: 'account' }); + this.updateData({ key: 'user', value: result.profile }); + this.processing = false; + this.$router.push({ path: '/library' }); + this.$store.dispatch('fetchLikedPlaylist').catch(error => { + console.warn( + 'Failed to fetch liked playlists after cookie login', + error + ); + }); + }) + .catch(error => { + console.error('Cookie login failed', error); + this.processing = false; + this.cookieError = error.message ?? `Cookie 登录失败:${error}`; + this.updateData({ key: 'loginMode', value: null }); + removeCookie('MUSIC_U'); + removeCookie('__csrf'); + }); + }, + loginWithWeb() { + if (!this.isElectron) { + window.open('https://music.163.com/#/login', '_blank', 'noopener'); + return; + } + + this.processing = true; + this.cookieError = ''; + try { + const { ipcRenderer } = window.require('electron'); + ipcRenderer + .invoke('open-netease-web-login') + .then(cookie => { + if (!cookie) { + this.processing = false; + return; + } + + this.cookieText = cookie; + this.loginWithCookie(); + }) + .catch(error => { + this.processing = false; + this.cookieError = error.message ?? `网页登录失败:${error}`; + }); + } catch (error) { + this.processing = false; + this.cookieError = `网页登录失败:${error}`; + } + }, getQrCodeKey() { return loginQrCodeKey().then(result => { if (result.code === 200) { @@ -488,4 +588,62 @@ button.loading { text-align: center; margin-bottom: 28px; } +.cookie-login { + width: 300px; + + .web-login-button { + width: 100%; + border-radius: 8px; + padding: 10px 12px; + margin-bottom: 10px; + background: var(--color-primary-bg); + color: var(--color-primary); + font-size: 14px; + font-weight: 600; + transition: 0.2s; + + &:hover { + transform: scale(1.03); + } + + &:active { + transform: scale(0.97); + } + } + + textarea { + width: 100%; + min-height: 128px; + resize: vertical; + box-sizing: border-box; + border: none; + border-radius: 8px; + padding: 12px; + background: var(--color-secondary-bg); + color: var(--color-text); + font-size: 13px; + line-height: 1.5; + } + + textarea:focus { + outline: none; + background: var(--color-primary-bg); + } + + .cookie-tip { + margin-top: 8px; + color: var(--color-text); + font-size: 12px; + line-height: 1.5; + opacity: 0.58; + } + + .cookie-error { + margin-top: 8px; + color: #e9546b; + font-size: 12px; + line-height: 1.5; + } +} + From 22339abea6ccb2750e43831522635cdc708ccc86 Mon Sep 17 00:00:00 2001 From: zwx08 Date: Mon, 29 Jun 2026 14:42:48 +0800 Subject: [PATCH 4/8] chore: adjust netease api dependency range --- package.json | 2 +- src/electron/ipcMain.js | 2 -- src/electron/mpris.js | 8 ++++++-- src/views/loginAccount.vue | 5 +++-- yarn.lock | 2 +- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index b6fb974277..ffd26bd2a2 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "node": "14 || 16" }, "dependencies": { - "@neteasecloudmusicapienhanced/api": "^4.36.1", + "@neteasecloudmusicapienhanced/api": "^4.29.7", "@unblockneteasemusic/rust-napi": "^0.4.0", "axios": "^0.26.1", "change-case": "^4.1.2", diff --git a/src/electron/ipcMain.js b/src/electron/ipcMain.js index b02f2acca0..e09d9499d4 100644 --- a/src/electron/ipcMain.js +++ b/src/electron/ipcMain.js @@ -140,7 +140,6 @@ function parseSourceStringToList(executor, sourceString) { }); } - const getNeteaseCookieString = async loginSession => { const cookies = await loginSession.cookies.get({ domain: 'music.163.com', @@ -214,7 +213,6 @@ export function initIpcMain(win, store, trayEventEmitter) { } ); - ipcMain.handle('open-netease-web-login', async () => { const loginSession = session.fromPartition('persist:netease-web-login'); const existingCookieString = await getNeteaseCookieString(loginSession); diff --git a/src/electron/mpris.js b/src/electron/mpris.js index d778b34f8c..f7ae54324a 100644 --- a/src/electron/mpris.js +++ b/src/electron/mpris.js @@ -44,11 +44,15 @@ export function createMpris(window) { ipcMain.on('playerCurrentTrackTime', (e, position) => { player.getPosition = () => position * 1000 * 1000; - try { player.seeked(position * 1000 * 1000); } catch {} + try { + player.seeked(position * 1000 * 1000); + } catch {} }); ipcMain.on('seeked', (e, position) => { - try { player.seeked(position * 1000 * 1000); } catch {} + try { + player.seeked(position * 1000 * 1000); + } catch {} }); ipcMain.on('switchRepeatMode', (e, mode) => { diff --git a/src/views/loginAccount.vue b/src/views/loginAccount.vue index 69fa2c8766..5a73d70589 100644 --- a/src/views/loginAccount.vue +++ b/src/views/loginAccount.vue @@ -176,7 +176,9 @@ export default { }, }, created() { - if (['phone', 'email', 'qrCode', 'cookie'].includes(this.$route.query.mode)) { + if ( + ['phone', 'email', 'qrCode', 'cookie'].includes(this.$route.query.mode) + ) { this.mode = this.$route.query.mode; } this.getQrCodeKey(); @@ -645,5 +647,4 @@ button.loading { line-height: 1.5; } } - diff --git a/yarn.lock b/yarn.lock index b68e6e23d4..8e514921c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1664,7 +1664,7 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@neteasecloudmusicapienhanced/api@^4.36.1": +"@neteasecloudmusicapienhanced/api@^4.29.7": version "4.36.1" resolved "https://registry.yarnpkg.com/@neteasecloudmusicapienhanced/api/-/api-4.36.1.tgz#8492ed077c9c82a4aa013b3fe5819e7d585a2c7e" integrity sha512-Do677SCn+I62Sk+CWxQVinG8LRhD1qejrsNjoTT9twfU+JzdjK1VsYGR7k3IsEfPkZudKLdQUJq63ohfxQ5WPg== From 7bf413af0541eb02e60f5c9e0510fd3216015bb6 Mon Sep 17 00:00:00 2001 From: zwx08 Date: Mon, 29 Jun 2026 15:10:09 +0800 Subject: [PATCH 5/8] ci: ignore node engine during yarn install --- .github/workflows/build.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ddb6a8fd18..101083b350 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,7 +1,7 @@ name: Release env: - YARN_INSTALL_NOPT: yarn add --ignore-platform --ignore-optional + YARN_INSTALL_NOPT: yarn add --ignore-platform --ignore-optional --ignore-engines on: push: @@ -48,7 +48,7 @@ jobs: - id: get_unm_version name: Get the installed UNM version run: | - yarn --ignore-optional + npx yarn@1.22.22 --ignore-engines --frozen-lockfile install --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 From 97dfbeed1f3f0a9ed0df3a146a9a27b6274173f0 Mon Sep 17 00:00:00 2001 From: zwx08 Date: Mon, 29 Jun 2026 15:50:41 +0800 Subject: [PATCH 6/8] fix: wait for liked playlist after cookie login --- src/store/actions.js | 2 ++ src/views/loginAccount.vue | 9 +++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/store/actions.js b/src/store/actions.js index 83c0666ef9..6539073911 100644 --- a/src/store/actions.js +++ b/src/store/actions.js @@ -76,6 +76,8 @@ export default { } }, fetchLikedSongsWithDetails: ({ state, commit }) => { + if (!state.data.likedSongPlaylistID) return Promise.resolve(); + return getPlaylistDetail(state.data.likedSongPlaylistID, true).then( result => { if (result.playlist?.trackIds?.length === 0) { diff --git a/src/views/loginAccount.vue b/src/views/loginAccount.vue index 5a73d70589..e9d4165434 100644 --- a/src/views/loginAccount.vue +++ b/src/views/loginAccount.vue @@ -286,14 +286,11 @@ export default { setCookies(cookie); this.updateData({ key: 'loginMode', value: 'account' }); this.updateData({ key: 'user', value: result.profile }); + return this.$store.dispatch('fetchLikedPlaylist'); + }) + .then(() => { this.processing = false; this.$router.push({ path: '/library' }); - this.$store.dispatch('fetchLikedPlaylist').catch(error => { - console.warn( - 'Failed to fetch liked playlists after cookie login', - error - ); - }); }) .catch(error => { console.error('Cookie login failed', error); From cc2caf2edf68ca2314eae6c10700c243a1a9d583 Mon Sep 17 00:00:00 2001 From: zwx08 Date: Mon, 29 Jun 2026 15:59:20 +0800 Subject: [PATCH 7/8] fix: harden API error handling --- src/assets/icons/index.js | 2 +- src/components/Navbar.vue | 2 +- src/electron/ipcMain.js | 2 +- src/main.js | 16 +++++----- src/utils/Player.js | 15 ++++++--- src/utils/playList.js | 13 +++++--- src/utils/request.js | 25 ++++++++++----- src/views/home.vue | 51 ++++++++++++++++++------------ src/views/loginAccount.vue | 63 ++++++++++++++++++++------------------ src/views/mv.vue | 2 +- vue.config.js | 4 +-- 11 files changed, 116 insertions(+), 79 deletions(-) diff --git a/src/assets/icons/index.js b/src/assets/icons/index.js index ee45a5672b..20af16fbec 100644 --- a/src/assets/icons/index.js +++ b/src/assets/icons/index.js @@ -1,7 +1,7 @@ import Vue from 'vue'; import SvgIcon from '@/components/SvgIcon'; -Vue.component('svg-icon', SvgIcon); +Vue.component('SvgIcon', SvgIcon); const requireAll = requireContext => requireContext.keys().map(requireContext); const req = require.context('./', true, /\.svg$/); requireAll(req); diff --git a/src/components/Navbar.vue b/src/components/Navbar.vue index dce629bd93..10c3dff54c 100644 --- a/src/components/Navbar.vue +++ b/src/components/Navbar.vue @@ -46,8 +46,8 @@
diff --git a/src/electron/ipcMain.js b/src/electron/ipcMain.js index e09d9499d4..8ebd6a46d4 100644 --- a/src/electron/ipcMain.js +++ b/src/electron/ipcMain.js @@ -264,7 +264,7 @@ export function initIpcMain(win, store, trayEventEmitter) { }; const handleCookieChanged = (_event, cookie) => { - if (cookie.domain?.includes('music.163.com')) { + if (cookie.domain && cookie.domain.includes('music.163.com')) { checkLoginCookie(); } }; diff --git a/src/main.js b/src/main.js index 73f7e8e8e4..7f384d5aac 100644 --- a/src/main.js +++ b/src/main.js @@ -28,13 +28,15 @@ console.log( 'background:unset;color:unset;' ); -Vue.use( - VueGtag, - { - config: { id: 'G-KMJJCFZDKF' }, - }, - router -); +if (process.env.NODE_ENV === 'production') { + Vue.use( + VueGtag, + { + config: { id: 'G-KMJJCFZDKF' }, + }, + router + ); +} Vue.config.productionTip = false; NProgress.configure({ showSpinner: false, trickleSpeed: 100 }); diff --git a/src/utils/Player.js b/src/utils/Player.js index a0073ec45b..cdb39d2ebd 100644 --- a/src/utils/Player.js +++ b/src/utils/Player.js @@ -232,11 +232,16 @@ export default class { this._personalFMNextTrack.id === 0 || this._personalFMTrack.id === this._personalFMNextTrack.id ) { - personalFM().then(result => { - this._personalFMTrack = result.data[0]; - this._personalFMNextTrack = result.data[1]; - return this._personalFMTrack; - }); + personalFM() + .then(result => { + if (!result?.data?.length) return this._personalFMTrack; + this._personalFMTrack = result.data[0]; + this._personalFMNextTrack = result.data[1] ?? result.data[0]; + return this._personalFMTrack; + }) + .catch(() => { + return this._personalFMTrack; + }); } } _setPlaying(isPlaying) { diff --git a/src/utils/playList.js b/src/utils/playList.js index d135fc3789..23d95b0aa8 100644 --- a/src/utils/playList.js +++ b/src/utils/playList.js @@ -29,19 +29,22 @@ export function getListSourcePath() { export async function getRecommendPlayList(limit, removePrivateRecommand) { if (isAccountLoggedIn()) { - const playlists = await Promise.all([ + const playlists = await Promise.allSettled([ dailyRecommendPlaylist(), recommendPlaylist({ limit }), ]); - let recommend = playlists[0].recommend ?? []; + const daily = playlists[0].status === 'fulfilled' ? playlists[0].value : {}; + const personalized = + playlists[1].status === 'fulfilled' ? playlists[1].value : {}; + let recommend = daily.recommend ?? []; if (recommend.length) { if (removePrivateRecommand) recommend = recommend.slice(1); await replaceRecommendResult(recommend); } - return recommend.concat(playlists[1].result).slice(0, limit); + return recommend.concat(personalized.result ?? []).slice(0, limit); } else { - const response = await recommendPlaylist({ limit }); - return response.result; + const response = await recommendPlaylist({ limit }).catch(() => ({})); + return response.result ?? []; } } diff --git a/src/utils/request.js b/src/utils/request.js index 6ac7bc3842..cba8c9cfdf 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -6,12 +6,20 @@ let baseURL = ''; // Web 和 Electron 跑在不同端口避免同时启动时冲突 if (process.env.IS_ELECTRON) { if (process.env.NODE_ENV === 'production') { - baseURL = process.env.VUE_APP_ELECTRON_API_URL; + baseURL = process.env.VUE_APP_ELECTRON_API_URL || '/api'; } else { - baseURL = process.env.VUE_APP_ELECTRON_API_URL_DEV; + baseURL = process.env.VUE_APP_ELECTRON_API_URL_DEV || '/api'; } } else { - baseURL = process.env.VUE_APP_NETEASE_API_URL; + baseURL = process.env.VUE_APP_NETEASE_API_URL || '/api'; +} + +function getSettings() { + try { + return JSON.parse(localStorage.getItem('settings')) || {}; + } catch (error) { + return {}; + } } const service = axios.create({ @@ -39,17 +47,16 @@ service.interceptors.request.use(function (config) { } // Force real_ip - const enableRealIP = JSON.parse( - localStorage.getItem('settings') - ).enableRealIP; - const realIP = JSON.parse(localStorage.getItem('settings')).realIP; + const settings = getSettings(); + const enableRealIP = settings.enableRealIP; + const realIP = settings.realIP; if (process.env.VUE_APP_REAL_IP) { config.params.realIP = process.env.VUE_APP_REAL_IP; } else if (enableRealIP) { config.params.realIP = realIP; } - const proxy = JSON.parse(localStorage.getItem('settings')).proxyConfig; + const proxy = settings.proxyConfig || {}; if (['HTTP', 'HTTPS'].includes(proxy.protocol)) { config.params.proxy = `${proxy.protocol}://${proxy.server}:${proxy.port}`; } @@ -93,6 +100,8 @@ service.interceptors.response.use( router.push({ name: 'login' }); } } + + return Promise.reject(error); } ); diff --git a/src/views/home.vue b/src/views/home.vue index b166e7e802..f898a56086 100644 --- a/src/views/home.vue +++ b/src/views/home.vue @@ -121,9 +121,13 @@ export default { newAlbums({ area: this.settings.musicLanguage ?? 'ALL', limit: 10, - }).then(data => { - this.newReleasesAlbum.items = data.albums; - }); + }) + .then(data => { + this.newReleasesAlbum.items = data?.albums ?? []; + }) + .catch(() => { + this.newReleasesAlbum.items = []; + }); const toplistOfArtistsAreaTable = { all: null, @@ -134,22 +138,31 @@ export default { }; toplistOfArtists( toplistOfArtistsAreaTable[this.settings.musicLanguage ?? 'all'] - ).then(data => { - let indexs = []; - while (indexs.length < 6) { - let tmp = ~~(Math.random() * 100); - if (!indexs.includes(tmp)) indexs.push(tmp); - } - this.recommendArtists.indexs = indexs; - this.recommendArtists.items = data.list.artists.filter((l, index) => - indexs.includes(index) - ); - }); - toplists().then(data => { - this.topList.items = data.list.filter(l => - this.topList.ids.includes(l.id) - ); - }); + ) + .then(data => { + let indexs = []; + while (indexs.length < 6) { + let tmp = ~~(Math.random() * 100); + if (!indexs.includes(tmp)) indexs.push(tmp); + } + this.recommendArtists.indexs = indexs; + const artists = data?.list?.artists ?? []; + this.recommendArtists.items = artists.filter((l, index) => + indexs.includes(index) + ); + }) + .catch(() => { + this.recommendArtists.items = []; + }); + toplists() + .then(data => { + this.topList.items = (data?.list ?? []).filter(l => + this.topList.ids.includes(l.id) + ); + }) + .catch(() => { + this.topList.items = []; + }); this.$refs.DailyTracksCard.loadDailyTracks(); }, }, diff --git a/src/views/loginAccount.vue b/src/views/loginAccount.vue index e9d4165434..6db59a15b5 100644 --- a/src/views/loginAccount.vue +++ b/src/views/loginAccount.vue @@ -332,35 +332,40 @@ export default { } }, getQrCodeKey() { - return loginQrCodeKey().then(result => { - if (result.code === 200) { - this.qrCodeKey = result.data.unikey; - QRCode.toString( - `https://music.163.com/login?codekey=${this.qrCodeKey}`, - { - width: 192, - margin: 0, - color: { - dark: '#335eea', - light: '#00000000', - }, - type: 'svg', - } - ) - .then(svg => { - this.qrCodeSvg = `data:image/svg+xml;utf8,${encodeURIComponent( - svg - )}`; - }) - .catch(err => { - console.error(err); - }) - .finally(() => { - NProgress.done(); - }); - } - this.checkQrCodeLogin(); - }); + return loginQrCodeKey() + .then(result => { + if (result?.code === 200 && result?.data?.unikey) { + this.qrCodeKey = result.data.unikey; + QRCode.toString( + `https://music.163.com/login?codekey=${this.qrCodeKey}`, + { + width: 192, + margin: 0, + color: { + dark: '#335eea', + light: '#00000000', + }, + type: 'svg', + } + ) + .then(svg => { + this.qrCodeSvg = `data:image/svg+xml;utf8,${encodeURIComponent( + svg + )}`; + }) + .catch(err => { + console.error(err); + }) + .finally(() => { + NProgress.done(); + }); + } + this.checkQrCodeLogin(); + }) + .catch(error => { + this.cookieError = error?.message ?? `二维码登录初始化失败:${error}`; + NProgress.done(); + }); }, checkQrCodeLogin() { // 清除二维码检测 diff --git a/src/views/mv.vue b/src/views/mv.vue index 54dd54499c..a57dd63ac6 100644 --- a/src/views/mv.vue +++ b/src/views/mv.vue @@ -56,7 +56,7 @@ import MvRow from '@/components/MvRow.vue'; import { mapActions } from 'vuex'; export default { - name: 'mv', + name: 'Mv', components: { MvRow, ButtonIcon, diff --git a/vue.config.js b/vue.config.js index bbbc54e07a..017f349efc 100644 --- a/vue.config.js +++ b/vue.config.js @@ -70,7 +70,7 @@ module.exports = { .end() .use('esbuild-loader') .loader('esbuild-loader') - .options({ target: 'es2015', format: "cjs" }) + .options({ target: 'es2015', format: 'cjs' }) .end(); // LimitChunkCountPlugin 可以通过合并块来对块进行后期处理。用以解决 chunk 包太多的问题 @@ -187,7 +187,7 @@ module.exports = { .end() .use('esbuild-loader') .loader('esbuild-loader') - .options({ target: 'es2015', format: "cjs" }) + .options({ target: 'es2015', format: 'cjs' }) .end(); }, // 渲染线程的配置文件 From 61fb2b09e796d3aa3b07e92eb949fced5ccf58eb Mon Sep 17 00:00:00 2001 From: zwx08 Date: Mon, 29 Jun 2026 16:06:18 +0800 Subject: [PATCH 8/8] ci: use electron download mirrors --- .github/workflows/build.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 101083b350..13b777b162 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -2,6 +2,8 @@ name: Release env: YARN_INSTALL_NOPT: yarn add --ignore-platform --ignore-optional --ignore-engines + ELECTRON_MIRROR: https://npmmirror.com/mirrors/electron/ + ELECTRON_BUILDER_BINARIES_MIRROR: https://npmmirror.com/mirrors/electron-builder-binaries/ on: push: