update tencent music api

master
Janx 3 years ago
parent ce738f6b40
commit 8a6b8521c4

@ -1,7 +0,0 @@
VUE_APP_NETEASE_API_URL=/api
VUE_APP_ELECTRON_API_URL=/api
VUE_APP_ELECTRON_API_URL_DEV=http://127.0.0.1:10754
VUE_APP_LASTFM_API_KEY=09c55292403d961aa517ff7f5e8a3d9c
VUE_APP_LASTFM_API_SHARED_SECRET=307c9fda32b3904e53654baff215cb67
DEV_SERVER_PORT=20201

@ -82,7 +82,8 @@ jobs:
uses: samuelmeuli/action-electron-builder@v1.6.0 uses: samuelmeuli/action-electron-builder@v1.6.0
env: env:
VUE_APP_ELECTRON_API_URL: /api VUE_APP_ELECTRON_API_URL: /api
VUE_APP_ELECTRON_API_URL_DEV: http://127.0.0.1:10754 VUE_APP_ELECTRON_API_URL_DEV: /api
# VUE_APP_ELECTRON_API_URL_DEV: http://127.0.0.1:10754
VUE_APP_LASTFM_API_KEY: 09c55292403d961aa517ff7f5e8a3d9c VUE_APP_LASTFM_API_KEY: 09c55292403d961aa517ff7f5e8a3d9c
VUE_APP_LASTFM_API_SHARED_SECRET: 307c9fda32b3904e53654baff215cb67 VUE_APP_LASTFM_API_SHARED_SECRET: 307c9fda32b3904e53654baff215cb67
with: with:

@ -126,5 +126,6 @@
"hooks": { "hooks": {
"pre-commit": "npm run prettier" "pre-commit": "npm run prettier"
} }
} },
} "__npminstall_done": false
}

@ -1,6 +1,13 @@
<template> <template>
<div id="app" :class="{ 'user-select-none': userSelectNone }"> <div
id="app"
class="no-scrollbar"
:class="{ 'user-select-none': userSelectNone }"
>
<Scrollbar v-show="!showLyrics" ref="scrollbar" /> <Scrollbar v-show="!showLyrics" ref="scrollbar" />
<transition name="slide-up">
<Player v-if="enablePlayer" v-show="showPlayer" ref="player" />
</transition>
<Navbar v-show="showNavbar" ref="navbar" /> <Navbar v-show="showNavbar" ref="navbar" />
<main <main
ref="main" ref="main"
@ -12,9 +19,7 @@
</keep-alive> </keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view> <router-view v-if="!$route.meta.keepAlive"></router-view>
</main> </main>
<transition name="slide-up">
<Player v-if="enablePlayer" v-show="showPlayer" ref="player" />
</transition>
<Toast /> <Toast />
<ModalAddTrackToPlaylist v-if="isAccountLoggedIn" /> <ModalAddTrackToPlaylist v-if="isAccountLoggedIn" />
<ModalNewPlaylist v-if="isAccountLoggedIn" /> <ModalNewPlaylist v-if="isAccountLoggedIn" />
@ -110,24 +115,39 @@ export default {
</script> </script>
<style lang="scss"> <style lang="scss">
html,
body,
#app { #app {
position: fixed;
width: 100%; width: 100%;
height: 100%;
}
* {
padding: 0;
margin: 0;
}
#app {
position: relative;
transition: all 0.4s; transition: all 0.4s;
} }
main { main {
position: fixed; position: absolute;
top: 0; top: 0;
bottom: 0; bottom: 0;
right: 0; right: 0;
left: 0; left: 0;
overflow: auto;
padding: 64px 10vw 96px 10vw; padding: 64px 10vw 96px 10vw;
box-sizing: border-box; box-sizing: border-box;
scrollbar-width: none; // firefox scrollbar-width: none; // firefox
} }
.no-scrollbar::-webkit-scrollbar {
@media (max-width: 1336px) { display: none;
}
.no-scrollbar {
overflow: scroll;
}
@media (max-width: 576px) {
main { main {
padding: 64px 5vw 96px 5vw; padding: 64px 5vw 96px 5vw;
} }

@ -73,7 +73,7 @@ body {
html { html {
overflow-y: var(--html-overflow-y); overflow-y: var(--html-overflow-y);
min-width: 768px; min-width: 576px;
overscroll-behavior: none; overscroll-behavior: none;
} }

@ -130,7 +130,7 @@
} }
} }
@media (min-width: 768px) { @media (min-width: 576px) {
.plyr__captions { .plyr__captions {
font-size: 18px; font-size: 18px;
font-size: var(--plyr-font-size-large, 18px); font-size: var(--plyr-font-size-large, 18px);
@ -774,7 +774,7 @@ a.plyr__control::before {
margin-right: var(--plyr-control-spacing, 10px); margin-right: var(--plyr-control-spacing, 10px);
} }
@media (max-width: calc(768px - 1)) { @media (max-width: calc(576px - 1)) {
.plyr__time + .plyr__time { .plyr__time + .plyr__time {
display: none; display: none;
} }

@ -1,7 +1,7 @@
import Vue from 'vue'; import Vue from 'vue';
import SvgIcon from '@/components/SvgIcon'; import SvgIcon from '@/components/SvgIcon';
Vue.component('svg-icon', SvgIcon); Vue.component('SvgIcon', SvgIcon);
const requireAll = requireContext => requireContext.keys().map(requireContext); const requireAll = requireContext => requireContext.keys().map(requireContext);
const req = require.context('./', true, /\.svg$/); const req = require.context('./', true, /\.svg$/);
requireAll(req); requireAll(req);

@ -1,5 +1,5 @@
<template> <template>
<div class="cover-row" :style="rowStyles"> <div class="cover-row no-scrollbar" :style="rowStyles">
<div <div
v-for="item in items" v-for="item in items"
:key="item.id" :key="item.id"
@ -54,7 +54,7 @@ export default {
subTextFontSize: { type: String, default: '16px' }, subTextFontSize: { type: String, default: '16px' },
showPlayCount: { type: Boolean, default: false }, showPlayCount: { type: Boolean, default: false },
columnNumber: { type: Number, default: 5 }, columnNumber: { type: Number, default: 5 },
gap: { type: String, default: '44px 24px' }, gap: { type: String, default: '44px 16px' },
playButtonSize: { type: Number, default: 22 }, playButtonSize: { type: Number, default: 22 },
}, },
computed: { computed: {
@ -124,6 +124,7 @@ export default {
.item { .item {
color: var(--color-text); color: var(--color-text);
min-width: 100px;
.text { .text {
margin-top: 8px; margin-top: 8px;
.title { .title {
@ -161,7 +162,11 @@ export default {
} }
} }
@media (max-width: 834px) { @media (max-width: 576px) {
.cover-row {
display: grid;
overflow-x: auto;
}
.item .text .title { .item .text .title {
font-size: 14px; font-size: 14px;
} }

@ -1,5 +1,5 @@
<template> <template>
<div> <div class="navView">
<nav :class="{ 'has-custom-titlebar': hasCustomTitlebar }"> <nav :class="{ 'has-custom-titlebar': hasCustomTitlebar }">
<Win32Titlebar v-if="enableWin32Titlebar" /> <Win32Titlebar v-if="enableWin32Titlebar" />
<LinuxTitlebar v-if="enableLinuxTitlebar" /> <LinuxTitlebar v-if="enableLinuxTitlebar" />
@ -46,8 +46,8 @@
<img <img
class="avatar" class="avatar"
:src="avatarUrl" :src="avatarUrl"
@click="showUserProfileMenu"
loading="lazy" loading="lazy"
@click="showUserProfileMenu"
/> />
</div> </div>
</nav> </nav>
@ -65,6 +65,12 @@
<svg-icon icon-class="logout" /> <svg-icon icon-class="logout" />
{{ $t('library.userProfileMenu.logout') }} {{ $t('library.userProfileMenu.logout') }}
</div> </div>
<div class="item" @click="toTheme">
<svg-icon
:icon-class="settings.appearance == 'dark' ? 'moon' : 'sun'"
/>
{{ $t('nav.theme') }}
</div>
<hr /> <hr />
<div class="item" @click="toGitHub"> <div class="item" @click="toGitHub">
<svg-icon icon-class="github" /> <svg-icon icon-class="github" />
@ -86,7 +92,7 @@ import Win32Titlebar from '@/components/Win32Titlebar.vue';
import LinuxTitlebar from '@/components/LinuxTitlebar.vue'; import LinuxTitlebar from '@/components/LinuxTitlebar.vue';
import ContextMenu from '@/components/ContextMenu.vue'; import ContextMenu from '@/components/ContextMenu.vue';
import ButtonIcon from '@/components/ButtonIcon.vue'; import ButtonIcon from '@/components/ButtonIcon.vue';
import { changeAppearance } from '@/utils/common';
export default { export default {
name: 'Navbar', name: 'Navbar',
components: { components: {
@ -157,6 +163,15 @@ export default {
toSettings() { toSettings() {
this.$router.push({ name: 'settings' }); this.$router.push({ name: 'settings' });
}, },
toTheme() {
if (this.settings.appearance != 'dark') {
this.settings.appearance = 'dark';
changeAppearance('dark');
} else {
this.settings.appearance = 'light';
changeAppearance('light');
}
},
toGitHub() { toGitHub() {
window.open('https://github.com/qier222/YesPlayMusic'); window.open('https://github.com/qier222/YesPlayMusic');
}, },
@ -172,8 +187,12 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.navView {
position: absolute;
z-index: 100;
width: 100%;
}
nav { nav {
position: fixed;
top: 0; top: 0;
right: 0; right: 0;
left: 0; left: 0;
@ -188,16 +207,9 @@ nav {
backdrop-filter: saturate(180%) blur(20px); backdrop-filter: saturate(180%) blur(20px);
background-color: var(--color-navbar-bg); background-color: var(--color-navbar-bg);
z-index: 100;
-webkit-app-region: drag; -webkit-app-region: drag;
} }
@media (max-width: 1336px) {
nav {
padding: 0 5vw;
}
}
@supports (-moz-appearance: none) { @supports (-moz-appearance: none) {
nav { nav {
background-color: var(--color-body-bg); background-color: var(--color-body-bg);
@ -221,7 +233,31 @@ nav.has-custom-titlebar {
-webkit-app-region: no-drag; -webkit-app-region: no-drag;
} }
} }
@media (max-width: 970px) { @media (max-width: 1000px) {
.navigation-buttons {
flex: unset;
}
}
@media (max-width: 576px) {
.search-box .container {
width: 120px !important;
}
nav {
padding: {
right: 10px;
left: 10px;
}
}
.navigation-links {
a {
padding: 0 !important;
margin: 0 auto !important;
font-size: 14px !important;
}
}
.navigation-buttons {
display: none;
}
.navigation-buttons { .navigation-buttons {
flex: unset; flex: unset;
} }

@ -22,7 +22,7 @@
:silent="true" :silent="true"
></vue-slider> ></vue-slider>
</div> </div>
<div class="controls"> <div class="controls no-scrollbar">
<div class="playing"> <div class="playing">
<div class="container" @click.stop> <div class="container" @click.stop>
<img <img
@ -67,6 +67,11 @@
></svg-icon> ></svg-icon>
</button-icon> </button-icon>
</div> </div>
<button-icon
style="display: inline-block; vertical-align: middle"
@click.native="Download"
><svg-icon icon-class="download"
/></button-icon>
</div> </div>
<div class="blank"></div> <div class="blank"></div>
</div> </div>
@ -170,7 +175,6 @@
<button-icon <button-icon
class="lyrics-button" class="lyrics-button"
title="歌词" title="歌词"
style="margin-left: 12px"
@click.native="toggleLyrics" @click.native="toggleLyrics"
><svg-icon icon-class="arrow-up" ><svg-icon icon-class="arrow-up"
/></button-icon> /></button-icon>
@ -247,6 +251,32 @@ export default {
hasList() { hasList() {
return hasListSource(); return hasListSource();
}, },
Download() {
let that = this;
let xhr = new XMLHttpRequest();
xhr.open('GET', this.player.nowMp3Url, true);
xhr.responseType = 'blob';
xhr.onload = function () {
if (xhr.status === 200) {
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(xhr.response, that.currentTrack.name);
} else {
let link = document.createElement('a');
let body = document.querySelector('body');
link.href = window.URL.createObjectURL(xhr.response);
link.download =
that.currentTrack.name + '-' + that.currentTrack.ar[0].name;
// fix Firefox
link.style.display = 'none';
body.appendChild(link);
link.click();
body.removeChild(link);
window.URL.revokeObjectURL(link.href);
}
}
};
xhr.send();
},
goToList() { goToList() {
goToListSource(); goToListSource();
}, },
@ -278,16 +308,15 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.player { .player {
position: fixed; position: absolute;
bottom: 0; bottom: 0;
right: 0;
left: 0; left: 0;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-around; justify-content: space-around;
height: 64px; height: 64px;
width: 100%;
backdrop-filter: saturate(180%) blur(30px); backdrop-filter: saturate(180%) blur(30px);
// background-color: rgba(255, 255, 255, 0.86);
background-color: var(--color-navbar-bg); background-color: var(--color-navbar-bg);
z-index: 100; z-index: 100;
} }
@ -307,6 +336,7 @@ export default {
.controls { .controls {
display: grid; display: grid;
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr);
overflow-x: scroll;
height: 100%; height: 100%;
padding: { padding: {
right: 10vw; right: 10vw;
@ -314,9 +344,13 @@ export default {
} }
} }
@media (max-width: 1336px) { @media (max-width: 576px) {
.controls .button-icon {
padding: 0 5px !important;
margin: 0 5px !important;
}
.controls { .controls {
padding: 0 5vw; padding: 0 5px;
} }
} }
@ -341,6 +375,7 @@ export default {
.track-info { .track-info {
height: 46px; height: 46px;
margin-left: 12px; margin-left: 12px;
min-width: 100px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
@ -432,10 +467,6 @@ export default {
} }
} }
.like-button {
margin-left: 16px;
}
.button-icon.disabled { .button-icon.disabled {
cursor: default; cursor: default;
opacity: 0.38; opacity: 0.38;

@ -152,7 +152,7 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
#scrollbar { #scrollbar {
position: fixed; position: absolute;
right: 0; right: 0;
top: 0; top: 0;
bottom: 0; bottom: 0;

@ -1,5 +1,5 @@
<template> <template>
<div class="track-list"> <div class="track-list no-scrollbar">
<ContextMenu ref="menu"> <ContextMenu ref="menu">
<div v-show="type !== 'cloudDisk'" class="item-info"> <div v-show="type !== 'cloudDisk'" class="item-info">
<img <img

@ -283,7 +283,7 @@ button {
border-radius: 8px; border-radius: 8px;
height: 46px; height: 46px;
width: 46px; width: 46px;
margin-right: 20px; margin-right: 14px;
border: 1px solid rgba(0, 0, 0, 0.04); border: 1px solid rgba(0, 0, 0, 0.04);
cursor: pointer; cursor: pointer;
} }
@ -293,6 +293,7 @@ button {
} }
.title-and-artist { .title-and-artist {
min-width: 120px;
flex: 1; flex: 1;
display: flex; display: flex;
.container { .container {
@ -300,11 +301,11 @@ button {
flex-direction: column; flex-direction: column;
} }
.title { .title {
font-size: 18px; font-size: 16px;
font-weight: 600; font-weight: 600;
color: var(--color-text); color: var(--color-text);
cursor: default; cursor: default;
padding-right: 16px; padding-right: 12px;
display: -webkit-box; display: -webkit-box;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
-webkit-line-clamp: 1; -webkit-line-clamp: 1;
@ -347,6 +348,7 @@ button {
flex: 1; flex: 1;
display: flex; display: flex;
font-size: 16px; font-size: 16px;
min-width: 80px;
opacity: 0.88; opacity: 0.88;
color: var(--color-text); color: var(--color-text);
display: -webkit-box; display: -webkit-box;

@ -8,6 +8,7 @@ export default {
explore: '发现', explore: '发现',
library: '音乐库', library: '音乐库',
search: '搜索', search: '搜索',
theme: '主题',
github: 'GitHub 仓库', github: 'GitHub 仓库',
}, },
home: { home: {

@ -8,6 +8,7 @@ const routes = [
path: '/', path: '/',
name: 'home', name: 'home',
component: () => import('@/views/home.vue'), component: () => import('@/views/home.vue'),
children: [],
meta: { meta: {
keepAlive: true, keepAlive: true,
savePosition: true, savePosition: true,

@ -20,7 +20,7 @@ let localStorage = {
automaticallyCacheSongs: true, automaticallyCacheSongs: true,
cacheLimit: 8192, cacheLimit: 8192,
enableReversedMode: false, enableReversedMode: false,
nyancatStyle: false, nyancatStyle: true,
showLyricsTranslation: true, showLyricsTranslation: true,
lyricsBackground: true, lyricsBackground: true,
closeAppOption: 'ask', closeAppOption: 'ask',

@ -333,6 +333,7 @@ export default class {
this._nextTrackCallback(); this._nextTrackCallback();
}, },
}); });
this._howler.on('loaderror', (_, errCode) => { this._howler.on('loaderror', (_, errCode) => {
// https://developer.mozilla.org/en-US/docs/Web/API/MediaError/code // https://developer.mozilla.org/en-US/docs/Web/API/MediaError/code
// code 3: MEDIA_ERR_DECODE // code 3: MEDIA_ERR_DECODE
@ -509,6 +510,7 @@ export default class {
ifUnplayableThen = UNPLAYABLE_CONDITION.PLAY_NEXT_TRACK ifUnplayableThen = UNPLAYABLE_CONDITION.PLAY_NEXT_TRACK
) { ) {
return this._getAudioSource(track).then(source => { return this._getAudioSource(track).then(source => {
// 获取mp3url 代理
if (source) { if (source) {
let replaced = false; let replaced = false;
if (track.id === this.currentTrackID) { if (track.id === this.currentTrackID) {
@ -731,7 +733,6 @@ export default class {
if (retryCount < 0) { if (retryCount < 0) {
let content = '获取私人FM数据时重试次数过多请手动切换下一首'; let content = '获取私人FM数据时重试次数过多请手动切换下一首';
store.dispatch('showToast', content); store.dispatch('showToast', content);
console.log(content);
return false; return false;
} }
// 这里只能拿到一条数据 // 这里只能拿到一条数据
@ -786,7 +787,7 @@ export default class {
this._howler?.once('play', () => { this._howler?.once('play', () => {
this._howler?.fade(0, this.volume, PLAY_PAUSE_FADE_DURATION); this._howler?.fade(0, this.volume, PLAY_PAUSE_FADE_DURATION);
this.nowMp3Url = this._howler._src;
this._setPlaying(true); this._setPlaying(true);
if (this._currentTrack.name) { if (this._currentTrack.name) {
setTitle(this._currentTrack); setTitle(this._currentTrack);

@ -1,7 +1,6 @@
import router from '@/router'; import router from '@/router';
import { doLogout, getCookie } from '@/utils/auth'; import { doLogout, getCookie } from '@/utils/auth';
import axios from 'axios'; import axios from 'axios';
let baseURL = ''; let baseURL = '';
// Web 和 Electron 跑在不同端口避免同时启动时冲突 // Web 和 Electron 跑在不同端口避免同时启动时冲突
if (process.env.IS_ELECTRON) { if (process.env.IS_ELECTRON) {
@ -13,9 +12,8 @@ if (process.env.IS_ELECTRON) {
} else { } else {
baseURL = process.env.VUE_APP_NETEASE_API_URL; baseURL = process.env.VUE_APP_NETEASE_API_URL;
} }
const service = axios.create({ const service = axios.create({
baseURL, baseURL: baseURL,
withCredentials: true, withCredentials: true,
timeout: 15000, timeout: 15000,
}); });

@ -7,7 +7,6 @@
:show-play-button="true" :show-play-button="true"
:always-show-shadow="true" :always-show-shadow="true"
:click-cover-to-play="true" :click-cover-to-play="true"
:fixed-size="288"
type="album" type="album"
:cover-hover="false" :cover-hover="false"
:play-button-size="18" :play-button-size="18"
@ -437,4 +436,33 @@ export default {
overflow: hidden; overflow: hidden;
white-space: pre-line; white-space: pre-line;
} }
.cover {
height: 288px;
width: 288px;
}
@media (max-width: 576px) {
.playlist {
margin-top: 14px;
}
.cover {
width: auto !important;
height: auto !important;
}
.playlist-info {
width: auto;
margin: 0;
flex-direction: column;
}
.playlist-info .info .title {
font-size: 24px;
font-weight: 700;
}
.playlist-info .info {
padding: 14px;
margin: 0;
}
.search-box-likepage {
right: 8vw;
}
}
</style> </style>

@ -542,4 +542,31 @@ export default {
overflow: hidden; overflow: hidden;
white-space: pre-line; white-space: pre-line;
} }
@media (max-width: 576px) {
.artist {
margin-top: 14px;
}
.head {
width: auto !important;
height: auto !important;
}
.artist-info img {
margin-right: 0;
}
.artist-info {
margin: 0;
flex-direction: column;
.name {
margin-top: 20px;
}
}
.artist-info .info {
padding: 14px;
margin: 0;
}
.search-box-likepage {
right: 8vw;
}
}
</style> </style>

@ -27,7 +27,7 @@
</div> </div>
<div class="index-row"> <div class="index-row">
<div class="title"> For You </div> <div class="title"> For You </div>
<div class="for-you-row"> <div class="for-you-row no-scrollbar">
<DailyTracksCard ref="DailyTracksCard" /> <DailyTracksCard ref="DailyTracksCard" />
<FMCard /> <FMCard />
</div> </div>
@ -202,4 +202,11 @@ footer {
gap: 24px; gap: 24px;
margin-bottom: 78px; margin-bottom: 78px;
} }
@media (max-width: 576px) {
.for-you-row {
overflow: auto;
grid-template-columns: repeat(1, 1fr);
margin-bottom: 0;
}
}
</style> </style>

@ -31,7 +31,7 @@
</button> </button>
</div> </div>
</div> </div>
<div class="songs"> <div class="songs no-scrollbar">
<TrackList <TrackList
:id="liked.playlists.length > 0 ? liked.playlists[0].id : 0" :id="liked.playlists.length > 0 ? liked.playlists[0].id : 0"
:tracks="liked.songsWithDetails" :tracks="liked.songsWithDetails"
@ -621,4 +621,16 @@ button.playHistory-button--selected {
transform: none; transform: none;
} }
} }
@media (max-width: 576px) {
.section-one {
flex-direction: column;
}
.section-one .songs {
margin: 20px 0;
overflow: auto;
}
.section-two {
margin: 0;
}
}
</style> </style>

@ -29,217 +29,224 @@
class="gradient-background" class="gradient-background"
:style="{ background }" :style="{ background }"
></div> ></div>
<div class="main-container">
<div class="left-side"> <div class="left-side">
<div> <div>
<div v-if="settings.showLyricsTime" class="date"> <div v-if="settings.showLyricsTime" class="date">
{{ date }} {{ date }}
</div>
<div class="cover">
<div class="cover-container">
<img :src="imageUrl" loading="lazy" />
<div
class="shadow"
:style="{ backgroundImage: `url(${imageUrl})` }"
></div>
</div> </div>
</div> <div class="cover">
<div class="controls"> <div class="cover-container">
<div class="top-part"> <img :src="imageUrl" loading="lazy" />
<div class="track-info"> <div
<div class="title" :title="currentTrack.name"> class="shadow"
<router-link :style="{ backgroundImage: `url(${imageUrl})` }"
v-if="hasList()" ></div>
:to="`${getListPath()}`" </div>
@click.native="toggleLyrics" </div>
>{{ currentTrack.name }} <div class="controls">
</router-link> <div class="top-part">
<span v-else> <div class="track-info">
{{ currentTrack.name }} <div class="title" :title="currentTrack.name">
</span>
</div>
<div class="subtitle">
<router-link
v-if="artist.id !== 0"
:to="`/artist/${artist.id}`"
@click.native="toggleLyrics"
>{{ artist.name }}
</router-link>
<span v-else>
{{ artist.name }}
</span>
<span v-if="album.id !== 0">
-
<router-link <router-link
:to="`/album/${album.id}`" v-if="hasList()"
:title="album.name" :to="`${getListPath()}`"
@click.native="toggleLyrics" @click.native="toggleLyrics"
>{{ album.name }} >{{ currentTrack.name }}
</router-link> </router-link>
</span> <span v-else>
</div> {{ currentTrack.name }}
</div> </span>
<div class="top-right"> </div>
<div class="volume-control"> <div class="subtitle">
<button-icon :title="$t('player.mute')" @click.native="mute"> <router-link
<svg-icon v-show="volume > 0.5" icon-class="volume" /> v-if="artist.id !== 0"
<svg-icon v-show="volume === 0" icon-class="volume-mute" /> :to="`/artist/${artist.id}`"
<svg-icon @click.native="toggleLyrics"
v-show="volume <= 0.5 && volume !== 0" >{{ artist.name }}
icon-class="volume-half" </router-link>
/> <span v-else>
</button-icon> {{ artist.name }}
<div class="volume-bar"> </span>
<vue-slider <span v-if="album.id !== 0">
v-model="volume" -
:min="0" <router-link
:max="1" :to="`/album/${album.id}`"
:interval="0.01" :title="album.name"
:drag-on-click="true" @click.native="toggleLyrics"
:duration="0" >{{ album.name }}
tooltip="none" </router-link>
:dot-size="12" </span>
></vue-slider>
</div> </div>
</div> </div>
<div class="buttons"> <div class="top-right">
<button-icon <div class="volume-control">
:title="$t('player.like')" <button-icon
@click.native="likeATrack(player.currentTrack.id)" :title="$t('player.mute')"
> @click.native="mute"
<svg-icon >
:icon-class=" <svg-icon v-show="volume > 0.5" icon-class="volume" />
player.isCurrentTrackLiked ? 'heart-solid' : 'heart' <svg-icon
" v-show="volume === 0"
/> icon-class="volume-mute"
</button-icon> />
<button-icon <svg-icon
:title="$t('contextMenu.addToPlaylist')" v-show="volume <= 0.5 && volume !== 0"
@click.native="addToPlaylist" icon-class="volume-half"
> />
<svg-icon icon-class="plus" /> </button-icon>
</button-icon> <div class="volume-bar">
<!-- <button-icon @click.native="openMenu" title="Menu" <vue-slider
v-model="volume"
:min="0"
:max="1"
:interval="0.01"
:drag-on-click="true"
:duration="0"
tooltip="none"
:dot-size="12"
></vue-slider>
</div>
</div>
<div class="buttons">
<button-icon
:title="$t('player.like')"
@click.native="likeATrack(player.currentTrack.id)"
>
<svg-icon
:icon-class="
player.isCurrentTrackLiked ? 'heart-solid' : 'heart'
"
/>
</button-icon>
<button-icon
:title="$t('contextMenu.addToPlaylist')"
@click.native="addToPlaylist"
>
<svg-icon icon-class="plus" />
</button-icon>
<!-- <button-icon @click.native="openMenu" title="Menu"
><svg-icon icon-class="more" ><svg-icon icon-class="more"
/></button-icon> --> /></button-icon> -->
</div>
</div> </div>
</div> </div>
</div> <div class="progress-bar">
<div class="progress-bar"> <span>{{ formatTrackTime(player.progress) || '0:00' }}</span>
<span>{{ formatTrackTime(player.progress) || '0:00' }}</span> <div class="slider">
<div class="slider"> <vue-slider
<vue-slider v-model="player.progress"
v-model="player.progress" :min="0"
:min="0" :max="player.currentTrackDuration"
:max="player.currentTrackDuration" :interval="1"
:interval="1" :drag-on-click="true"
:drag-on-click="true" :duration="0"
:duration="0" :dot-size="12"
:dot-size="12" :height="2"
:height="2" :tooltip-formatter="formatTrackTime"
:tooltip-formatter="formatTrackTime" :lazy="true"
:lazy="true" :silent="true"
:silent="true" ></vue-slider>
></vue-slider> </div>
<span>{{ formatTrackTime(player.currentTrackDuration) }}</span>
</div> </div>
<span>{{ formatTrackTime(player.currentTrackDuration) }}</span> <div class="media-controls">
</div>
<div class="media-controls">
<button-icon
v-show="!player.isPersonalFM"
:title="
player.repeatMode === 'one'
? $t('player.repeatTrack')
: $t('player.repeat')
"
:class="{ active: player.repeatMode !== 'off' }"
@click.native="switchRepeatMode"
>
<svg-icon
v-show="player.repeatMode !== 'one'"
icon-class="repeat"
/>
<svg-icon
v-show="player.repeatMode === 'one'"
icon-class="repeat-1"
/>
</button-icon>
<div class="middle">
<button-icon <button-icon
v-show="!player.isPersonalFM" v-show="!player.isPersonalFM"
:title="$t('player.previous')" :title="
@click.native="playPrevTrack" player.repeatMode === 'one'
> ? $t('player.repeatTrack')
<svg-icon icon-class="previous" /> : $t('player.repeat')
</button-icon> "
<button-icon :class="{ active: player.repeatMode !== 'off' }"
v-show="player.isPersonalFM" @click.native="switchRepeatMode"
title="不喜欢"
@click.native="moveToFMTrash"
>
<svg-icon icon-class="thumbs-down" />
</button-icon>
<button-icon
id="play"
:title="$t(player.playing ? 'player.pause' : 'player.play')"
@click.native="playOrPause"
> >
<svg-icon :icon-class="player.playing ? 'pause' : 'play'" /> <svg-icon
v-show="player.repeatMode !== 'one'"
icon-class="repeat"
/>
<svg-icon
v-show="player.repeatMode === 'one'"
icon-class="repeat-1"
/>
</button-icon> </button-icon>
<div class="middle">
<button-icon
v-show="!player.isPersonalFM"
:title="$t('player.previous')"
@click.native="playPrevTrack"
>
<svg-icon icon-class="previous" />
</button-icon>
<button-icon
v-show="player.isPersonalFM"
title="不喜欢"
@click.native="moveToFMTrash"
>
<svg-icon icon-class="thumbs-down" />
</button-icon>
<button-icon
id="play"
:title="$t(player.playing ? 'player.pause' : 'player.play')"
@click.native="playOrPause"
>
<svg-icon :icon-class="player.playing ? 'pause' : 'play'" />
</button-icon>
<button-icon
:title="$t('player.next')"
@click.native="playNextTrack"
>
<svg-icon icon-class="next" />
</button-icon>
</div>
<button-icon <button-icon
:title="$t('player.next')" v-show="!player.isPersonalFM"
@click.native="playNextTrack" :title="$t('player.shuffle')"
:class="{ active: player.shuffle }"
@click.native="switchShuffle"
> >
<svg-icon icon-class="next" /> <svg-icon icon-class="shuffle" />
</button-icon> </button-icon>
</div> </div>
<button-icon
v-show="!player.isPersonalFM"
:title="$t('player.shuffle')"
:class="{ active: player.shuffle }"
@click.native="switchShuffle"
>
<svg-icon icon-class="shuffle" />
</button-icon>
</div> </div>
</div> </div>
</div> </div>
</div> <div class="right-side">
<div class="right-side"> <transition name="slide-fade">
<transition name="slide-fade">
<div
v-show="!noLyric"
ref="lyricsContainer"
class="lyrics-container"
:style="lyricFontSize"
>
<div id="line-1" class="line"></div>
<div <div
v-for="(line, index) in lyricWithTranslation" v-show="!noLyric"
:id="`line${index}`" ref="lyricsContainer"
:key="index" class="lyrics-container"
class="line" :style="lyricFontSize"
:class="{
highlight: highlightLyricIndex === index,
}"
@click="clickLyricLine(line.time)"
@dblclick="clickLyricLine(line.time, true)"
> >
<div class="content"> <div id="line-1" class="line"></div>
<span v-if="line.contents[0]">{{ line.contents[0] }}</span> <div
<br /> v-for="(line, index) in lyricWithTranslation"
<span :id="`line${index}`"
v-if=" :key="index"
line.contents[1] && class="line"
$store.state.settings.showLyricsTranslation :class="{
" highlight: highlightLyricIndex === index,
class="translation" }"
>{{ line.contents[1] }}</span @click="clickLyricLine(line.time)"
> @dblclick="clickLyricLine(line.time, true)"
>
<div class="content">
<span v-if="line.contents[0]">{{ line.contents[0] }}</span>
<br />
<span
v-if="
line.contents[1] &&
$store.state.settings.showLyricsTranslation
"
class="translation"
>{{ line.contents[1] }}</span
>
</div>
</div> </div>
</div> </div>
</div> </transition>
</transition> </div>
</div> </div>
<div class="close-button" @click="toggleLyrics"> <div class="close-button" @click="toggleLyrics">
<button> <button>
@ -564,13 +571,17 @@ export default {
--contrast-lyrics-background: 125%; --contrast-lyrics-background: 125%;
--brightness-lyrics-background: 50%; --brightness-lyrics-background: 50%;
} }
.main-container {
display: flex;
margin: 0 auto;
flex-direction: row;
}
.lyrics-background { .lyrics-background {
filter: blur(50px) contrast(var(--contrast-lyrics-background)) filter: blur(50px) contrast(var(--contrast-lyrics-background))
brightness(var(--brightness-lyrics-background)); brightness(var(--brightness-lyrics-background));
position: absolute; position: absolute;
height: 100vh; height: 100vh;
width: 100vw; width: 100%;
.top-right, .top-right,
.bottom-left { .bottom-left {
z-index: 0; z-index: 0;
@ -611,14 +622,14 @@ export default {
.gradient-background { .gradient-background {
position: absolute; position: absolute;
height: 100vh; height: 100vh;
width: 100vw; width: 100%;
} }
.left-side { .left-side {
flex: 1; flex: 1;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
margin-right: 32px; margin-right: 40px;
margin-top: 24px; margin-top: 24px;
align-items: center; align-items: center;
transition: all 0.5s; transition: all 0.5s;
@ -794,7 +805,7 @@ export default {
flex: 1; flex: 1;
font-weight: 600; font-weight: 600;
color: var(--color-text); color: var(--color-text);
margin-right: 24px; margin-right: 30px;
z-index: 0; z-index: 0;
.lyrics-container { .lyrics-container {
@ -906,21 +917,30 @@ export default {
} }
} }
@media (max-aspect-ratio: 10/9) { @media screen and (min-width: 1200px) {
.right-side .lyrics-container {
max-width: 600px;
}
}
@media screen and (max-width: 576px) {
.lyrics-container .line .content {
transform-origin: center !important;
font-size: 0.8em;
}
.left-side { .left-side {
display: none; display: none;
} }
.right-side .lyrics-container { .right-side .lyrics-container {
max-width: 100%; text-align: center;
padding: 0;
margin: 0;
font-size: 0.8;
width: 100%;
} }
} .right-side {
margin: 0;
@media screen and (min-width: 1200px) {
.right-side .lyrics-container {
max-width: 600px;
} }
} }
.slide-up-enter-active, .slide-up-enter-active,
.slide-up-leave-active { .slide-up-leave-active {
transition: all 0.4s; transition: all 0.4s;

@ -56,7 +56,7 @@ import MvRow from '@/components/MvRow.vue';
import { mapActions } from 'vuex'; import { mapActions } from 'vuex';
export default { export default {
name: 'mv', name: 'Mv',
components: { components: {
MvRow, MvRow,
ButtonIcon, ButtonIcon,

@ -10,7 +10,6 @@
:show-play-button="true" :show-play-button="true"
:always-show-shadow="true" :always-show-shadow="true"
:click-cover-to-play="true" :click-cover-to-play="true"
:fixed-size="288"
type="playlist" type="playlist"
:cover-hover="false" :cover-hover="false"
:play-button-size="18" :play-button-size="18"
@ -933,8 +932,26 @@ export default {
} }
} }
} }
.cover {
@media (max-width: 1336px) { height: 288px;
width: 288px;
}
@media (max-width: 576px) {
.playlist {
margin-top: 14px;
}
.cover {
width: auto !important;
height: auto !important;
}
.playlist-info {
margin: 0;
flex-direction: column;
}
.playlist-info .info {
padding: 14px;
margin: 0;
}
.search-box-likepage { .search-box-likepage {
right: 8vw; right: 8vw;
} }

@ -1,5 +1,14 @@
<template> <template>
<div v-show="show" class="search-page"> <div v-show="show" class="search-page">
<div v-show="tracks.length > 0" class="tracks">
<div class="section-title"
>{{ $t('search.song')
}}<router-link :to="`/search/${keywords}/tracks`">{{
$t('home.seeMore')
}}</router-link></div
>
<TrackList :tracks="tracks" type="tracklist" />
</div>
<div v-show="artists.length > 0 || albums.length > 0" class="row"> <div v-show="artists.length > 0 || albums.length > 0" class="row">
<div v-show="artists.length > 0" class="artists"> <div v-show="artists.length > 0" class="artists">
<div v-show="artists.length > 0" class="section-title" <div v-show="artists.length > 0" class="section-title"
@ -34,27 +43,6 @@
/> />
</div> </div>
</div> </div>
<div v-show="tracks.length > 0" class="tracks">
<div class="section-title"
>{{ $t('search.song')
}}<router-link :to="`/search/${keywords}/tracks`">{{
$t('home.seeMore')
}}</router-link></div
>
<TrackList :tracks="tracks" type="tracklist" />
</div>
<div v-show="musicVideos.length > 0" class="music-videos">
<div class="section-title"
>{{ $t('search.mv')
}}<router-link :to="`/search/${keywords}/music-videos`">{{
$t('home.seeMore')
}}</router-link></div
>
<MvRow :mvs="musicVideos.slice(0, 5)" />
</div>
<div v-show="playlists.length > 0" class="playlists"> <div v-show="playlists.length > 0" class="playlists">
<div class="section-title" <div class="section-title"
>{{ $t('search.playlist') >{{ $t('search.playlist')
@ -72,7 +60,15 @@
:play-button-size="26" :play-button-size="26"
/> />
</div> </div>
<div v-show="musicVideos.length > 0" class="music-videos">
<div class="section-title"
>{{ $t('search.mv')
}}<router-link :to="`/search/${keywords}/music-videos`">{{
$t('home.seeMore')
}}</router-link></div
>
<MvRow :mvs="musicVideos.slice(0, 5)" />
</div>
<div v-show="!haveResult" class="no-results"> <div v-show="!haveResult" class="no-results">
<div <div
><svg-icon icon-class="search" /> ><svg-icon icon-class="search" />
@ -89,7 +85,7 @@ import { mapActions } from 'vuex';
import { getTrackDetail } from '@/api/track'; import { getTrackDetail } from '@/api/track';
import { search } from '@/api/others'; import { search } from '@/api/others';
import NProgress from 'nprogress'; import NProgress from 'nprogress';
// import { get } from '@/utils/metingAPI';
import TrackList from '@/components/TrackList.vue'; import TrackList from '@/components/TrackList.vue';
import MvRow from '@/components/MvRow.vue'; import MvRow from '@/components/MvRow.vue';
import CoverRow from '@/components/CoverRow.vue'; import CoverRow from '@/components/CoverRow.vue';
@ -134,6 +130,11 @@ export default {
}, },
created() { created() {
this.getData(); this.getData();
// get({ server: 'tencent', type: 'search', }).then(data => {
// // if (data.result?.song !== undefined)
// // data.result.song.songs = mapTrackPlayableStatus(data.result.song.songs);
// return data;
// });
}, },
methods: { methods: {
...mapActions(['showToast']), ...mapActions(['showToast']),

@ -5,6 +5,7 @@ function resolve(dir) {
} }
module.exports = { module.exports = {
publicPath: './',
// 生产环境打包不输出 map // 生产环境打包不输出 map
productionSourceMap: false, productionSourceMap: false,
devServer: { devServer: {
@ -12,12 +13,20 @@ module.exports = {
port: process.env.DEV_SERVER_PORT || 8080, port: process.env.DEV_SERVER_PORT || 8080,
proxy: { proxy: {
'^/api': { '^/api': {
target: 'http://localhost:3000', target:
'https://service-osrz4um8-1257251314.gz.apigw.tencentcs.com/release/',
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
'^/api': '/', '^/api': '/',
}, },
}, },
'^/meting': {
target: 'https://api.wuenci.com/meting/api/',
changeOrigin: true,
pathRewrite: {
'^/meting': '/',
},
},
}, },
}, },
pwa: { pwa: {

@ -1772,89 +1772,89 @@
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@unblockneteasemusic/rust-napi-android-arm-eabi@0.3.0": "@unblockneteasemusic/rust-napi-android-arm-eabi@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-android-arm-eabi/-/rust-napi-android-arm-eabi-0.3.0.tgz#71e020bbc3b6662efc1c4c80354e775580c6ffca" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-android-arm-eabi/-/rust-napi-android-arm-eabi-0.4.0.tgz#30d71b473ea34442dc82c041e18092040fd00278"
integrity sha512-PSgb5j8sSs4gGUBy3FcPvQTsLlCc6HknyyK5Ax7caUMEzGK/oTFhpwkldulidc+eLh5mRCuNeKq9NvdMZuYp6A== integrity sha512-XKplW125O+YkbEq8AlhrdiLQJMZRG4+e+w8VKUndC9gIv8SB+xINFshtJISszBwP3eRg0kB3v8ZSl2gBMKZpEA==
"@unblockneteasemusic/rust-napi-android-arm64@0.3.0": "@unblockneteasemusic/rust-napi-android-arm64@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-android-arm64/-/rust-napi-android-arm64-0.3.0.tgz#837998a6b06e802ac0e149d3d231d0874f38f01e" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-android-arm64/-/rust-napi-android-arm64-0.4.0.tgz#8ca2e90f445672eb91c13cbb5169f7f9c21b08ef"
integrity sha512-0Zi8QgIxDYTEWaOTbDYIPoL0ECfsQXUd0N43HBjMnFsgAkc/FViNAFaKN1SkowrZNQoXYM/5I928Ea18Bv2ivQ== integrity sha512-gV6bPA6Ve8uK9NM9n6hw/XVcOnFJUsfZkCawiZBeUbpGilcgJdE0KzxDVvdM7UtOSebdNdlOjix1o0zyYPtZ4w==
"@unblockneteasemusic/rust-napi-darwin-arm64@0.3.0": "@unblockneteasemusic/rust-napi-darwin-arm64@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-darwin-arm64/-/rust-napi-darwin-arm64-0.3.0.tgz#4732257c048720e7966011381507db55ca8acc59" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-darwin-arm64/-/rust-napi-darwin-arm64-0.4.0.tgz#311564870084790e3af98586174acd83a55de84a"
integrity sha512-EByiGPy6GUk6bpZFZ+gdnalaomWjztOGuj8Ei7XExGJbl5gHw9ab+eh5v73frricGWpyz25SpSq4Nta8BDaoxw== integrity sha512-2aRJaODkgQST++6jRovr6xwp4oJaUprGaPXFNbW0v9v7kmwrwXaXg5zz0TOoP28MB41hJQ48KjTNY0VaPzDROw==
"@unblockneteasemusic/rust-napi-darwin-x64@0.3.0": "@unblockneteasemusic/rust-napi-darwin-x64@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-darwin-x64/-/rust-napi-darwin-x64-0.3.0.tgz#26081090e00da553ba77e0b6dc03d7cc5a2d61e9" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-darwin-x64/-/rust-napi-darwin-x64-0.4.0.tgz#7ddd74ef08390c52abdd7ac34a6fd344f24653bd"
integrity sha512-5CYwFCtpU+cxdPsDmqVyaPQ2ZzmZQ1OdOT2zQFfhWR6ru8px/8PhlYSaO+/T9d5z/OkXU6T8so8yBUHyhOBJng== integrity sha512-j1dWvz8+qIoa3750RoibUk59SKPemhcf39uRwp+phfk5mj1+z3sobgcHZfO/3w/6CTtJ0Smh78ljYYIaPycEjQ==
"@unblockneteasemusic/rust-napi-freebsd-x64@0.3.0": "@unblockneteasemusic/rust-napi-freebsd-x64@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-freebsd-x64/-/rust-napi-freebsd-x64-0.3.0.tgz#421e832d9f7212f5525b1273a474261105835dab" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-freebsd-x64/-/rust-napi-freebsd-x64-0.4.0.tgz#f0d5a4b0f4746d1f66a9d26f0742f6fd03d85ba7"
integrity sha512-Ndh5UUVDpkqWvNJtkTQX3BloxQcWahnixvS6MtJ2orSem0GOTxB1AaVwguofF3DDA2MdIWEogmMNbML+YfGq1A== integrity sha512-g/7rQ4U8AhkTA5/hrEKAcNjFpfZL3aQyy53fTQ8VXmrME5WKvzxFMpEl+FYh5dMfSCqfEKemJeCdvUrJxNGs1w==
"@unblockneteasemusic/rust-napi-linux-arm-gnueabihf@0.3.0": "@unblockneteasemusic/rust-napi-linux-arm-gnueabihf@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-linux-arm-gnueabihf/-/rust-napi-linux-arm-gnueabihf-0.3.0.tgz#b222416565074a9e5832fc8b9d961bac144ab543" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-linux-arm-gnueabihf/-/rust-napi-linux-arm-gnueabihf-0.4.0.tgz#a4ff72c97ae59d23a4f749a13cb4b2499860fec5"
integrity sha512-DJGg8KozC/bUETGkR9+frcEnytNDCBaROIDM1OjgsqXlILMAStK8fAxhNhXHRvrHQcgVL2xZ7NXQayvSwJSRsw== integrity sha512-2kRdVhMpfTAPAIImLuAv9sGqlh5Kcb51d8gKeNBIYCWR2SVNqEBNIAaKmkp9PtUY8Colr+LJaOZtUro9ipQ6rw==
"@unblockneteasemusic/rust-napi-linux-arm64-gnu@0.3.0": "@unblockneteasemusic/rust-napi-linux-arm64-gnu@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-linux-arm64-gnu/-/rust-napi-linux-arm64-gnu-0.3.0.tgz#4eb22a7012c87daf86f00fddbf3c13d76ad29ea2" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-linux-arm64-gnu/-/rust-napi-linux-arm64-gnu-0.4.0.tgz#1a92506f9280ef8f4f45205c9959ad084bd60ebe"
integrity sha512-Xi5oo+E4RGMCPI2S5rtd7Hb1K86R89D+tptCwoZDC4xAoQ6Tjn7/psL1hpnBI5dx76YG/PLELjrdlV8UwUV2Mg== integrity sha512-uw4+NlJkc9oncyNSzKWPHE+KH5KLRsz0RTgdihDTnaSSatHr668Ip1CDcL59t6JpuBgRkP0T02OcQTXv92NJzA==
"@unblockneteasemusic/rust-napi-linux-arm64-musl@0.3.0": "@unblockneteasemusic/rust-napi-linux-arm64-musl@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-linux-arm64-musl/-/rust-napi-linux-arm64-musl-0.3.0.tgz#a722158e96ead9fa30fdd205504dd1684db156f6" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-linux-arm64-musl/-/rust-napi-linux-arm64-musl-0.4.0.tgz#05ad6eeaf783248d9a537ecdf92410d910518727"
integrity sha512-ZiF/bQbaIr+d+8JVxQ2pwvevrWAF3l4q7PzKytV/z0mzZo70ZOpfseZkQ08puAfzzDhAmRls0gTsDX1ktvuNPA== integrity sha512-9XqghLSk1QBkmkdlb3O+IJaxelEOPXouGXJXPx9NMmcsgEFgD1RL0h5H3pFKKpV6hjHKFwi7Ue6kfUBM6Z6Tnw==
"@unblockneteasemusic/rust-napi-linux-x64-gnu@0.3.0": "@unblockneteasemusic/rust-napi-linux-x64-gnu@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-linux-x64-gnu/-/rust-napi-linux-x64-gnu-0.3.0.tgz#8a52b909b0bba19416901f475928ce90e8585af7" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-linux-x64-gnu/-/rust-napi-linux-x64-gnu-0.4.0.tgz#6057fe710970d99df019794bff11fac48fbc6664"
integrity sha512-fyWDKdcUGdJCGlCOJ7nPIuWEhEI3J2GvptVegYnE6XEIfLkvbPOYVmPylI/Gw3pVwZ2dvU0V2hPjqcfgUqzJGg== integrity sha512-HGywXQAcIQkTBpI66i+cPHvCr1t5smKuJJaTcwV/5WfoHYsP+uuO522R4XNV/EPEIV9PDUwinoemiDKUQumJVw==
"@unblockneteasemusic/rust-napi-linux-x64-musl@0.3.0": "@unblockneteasemusic/rust-napi-linux-x64-musl@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-linux-x64-musl/-/rust-napi-linux-x64-musl-0.3.0.tgz#507e6791db634ce9ac55cdcc9c30bce74bc85e8a" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-linux-x64-musl/-/rust-napi-linux-x64-musl-0.4.0.tgz#86dd367c46b71df7bbb014095602a5a967830c86"
integrity sha512-NQ/axCrjzBbzgPjxY88PN/b9oQeryCOjpCwXD90fMJXuV8llUA4BsTILxVneiPwt2VI4fCvth1O5BMsNfeFAWw== integrity sha512-0Nxx9914zH6EEJ88v0zFKynOnZ1umv2SFWbAaEPZ5x3tqh896M3OFyxtbGfBKgJJfvz7b3XKiQ5+aTBlYg8Wmg==
"@unblockneteasemusic/rust-napi-win32-arm64-msvc@0.3.0": "@unblockneteasemusic/rust-napi-win32-arm64-msvc@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-win32-arm64-msvc/-/rust-napi-win32-arm64-msvc-0.3.0.tgz#a8bd63de5897c540541d9ce4d7b843be7b088a6b" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-win32-arm64-msvc/-/rust-napi-win32-arm64-msvc-0.4.0.tgz#3c4274e2b3429e5736c6b451ef8d9f9cc5530eb2"
integrity sha512-TvAMHneV9cB2HULnMQfOnTgd7p+E4L+MtG2I5foHD3h0IeLC8+fPvYzs/HIKhfZCBWcHR5hfoQ/102V6uHFxJg== integrity sha512-wX5k9FrnejxZQZEocbJ9QdTC30jc9r77GeqjyGBLRa04e019IMLT+Orj1+SVJawKXk43rLS96Ish+7GKLOeWog==
"@unblockneteasemusic/rust-napi-win32-ia32-msvc@0.3.0": "@unblockneteasemusic/rust-napi-win32-ia32-msvc@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-win32-ia32-msvc/-/rust-napi-win32-ia32-msvc-0.3.0.tgz#002231d22bfa378bdb88c7f21b11e9e121cb3385" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-win32-ia32-msvc/-/rust-napi-win32-ia32-msvc-0.4.0.tgz#8758ba79e5d8af85b5b42e059382a4866dbe4b13"
integrity sha512-x68DuYHZOHDIlzcG9HbTbpABiSwP9Uc3GK0WuCXl03HTOMKYjT+OJ0aA8HtTyeXMe+IpSJPpg2UIOT3XqaCaeg== integrity sha512-B86TVJKpsaYwzE5JfkcIvmFIyjo66P999I5RfkzNYVV+vqi9Z5wsOUZ5K9BcECaGtGfyRUJRYUJ8G5R6WdP6ZA==
"@unblockneteasemusic/rust-napi-win32-x64-msvc@0.3.0": "@unblockneteasemusic/rust-napi-win32-x64-msvc@0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi-win32-x64-msvc/-/rust-napi-win32-x64-msvc-0.3.0.tgz#53242eea5ee6af30fa68330be752b030be72c1f6" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi-win32-x64-msvc/-/rust-napi-win32-x64-msvc-0.4.0.tgz#bfb173acb99147fb9aee7520a9db21514f5ac791"
integrity sha512-ACmTzPih91FmVt87BIdGhiKVbjKHNawRj5vgHcFlPX6KQ8NrxSigXXNs0/JWWDvAK9BLpOmeCtieXHnMdv+YQQ== integrity sha512-b0BzkWHxzcXRtFAMi8CluPgfuUympnqI2lgXMVNYEKllcQj/Hu5crQIKB4A3w8Z5d9xxW9qIMGo8y66ygXRjeg==
"@unblockneteasemusic/rust-napi@^0.3.0-pre.1": "@unblockneteasemusic/rust-napi@^0.4.0":
version "0.3.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/@unblockneteasemusic/rust-napi/-/rust-napi-0.3.0.tgz#607562e51b0bd50cfee19fb23bf7eff139296bda" resolved "https://registry.npmmirror.com/@unblockneteasemusic/rust-napi/-/rust-napi-0.4.0.tgz#2c46be08da74cd4450c28579b04a7ed554ebbcea"
integrity sha512-UA20K1T72XkFFoaY7D+XNqlX4zakrGDsrIsChs92e4qqhzu2mPJWNYV/cS2xOWFUbeFve84Hz7Kwl/OocjTDpQ== integrity sha512-I/XAjjBlBqA+sO7XJFPbmxDiPABgINPaIE6dR7grNQlFPAPDYgfdR0Iz5R7Fg7MuKMClRpPIR2QYAm6dJXQIsQ==
optionalDependencies: optionalDependencies:
"@unblockneteasemusic/rust-napi-android-arm-eabi" "0.3.0" "@unblockneteasemusic/rust-napi-android-arm-eabi" "0.4.0"
"@unblockneteasemusic/rust-napi-android-arm64" "0.3.0" "@unblockneteasemusic/rust-napi-android-arm64" "0.4.0"
"@unblockneteasemusic/rust-napi-darwin-arm64" "0.3.0" "@unblockneteasemusic/rust-napi-darwin-arm64" "0.4.0"
"@unblockneteasemusic/rust-napi-darwin-x64" "0.3.0" "@unblockneteasemusic/rust-napi-darwin-x64" "0.4.0"
"@unblockneteasemusic/rust-napi-freebsd-x64" "0.3.0" "@unblockneteasemusic/rust-napi-freebsd-x64" "0.4.0"
"@unblockneteasemusic/rust-napi-linux-arm-gnueabihf" "0.3.0" "@unblockneteasemusic/rust-napi-linux-arm-gnueabihf" "0.4.0"
"@unblockneteasemusic/rust-napi-linux-arm64-gnu" "0.3.0" "@unblockneteasemusic/rust-napi-linux-arm64-gnu" "0.4.0"
"@unblockneteasemusic/rust-napi-linux-arm64-musl" "0.3.0" "@unblockneteasemusic/rust-napi-linux-arm64-musl" "0.4.0"
"@unblockneteasemusic/rust-napi-linux-x64-gnu" "0.3.0" "@unblockneteasemusic/rust-napi-linux-x64-gnu" "0.4.0"
"@unblockneteasemusic/rust-napi-linux-x64-musl" "0.3.0" "@unblockneteasemusic/rust-napi-linux-x64-musl" "0.4.0"
"@unblockneteasemusic/rust-napi-win32-arm64-msvc" "0.3.0" "@unblockneteasemusic/rust-napi-win32-arm64-msvc" "0.4.0"
"@unblockneteasemusic/rust-napi-win32-ia32-msvc" "0.3.0" "@unblockneteasemusic/rust-napi-win32-ia32-msvc" "0.4.0"
"@unblockneteasemusic/rust-napi-win32-x64-msvc" "0.3.0" "@unblockneteasemusic/rust-napi-win32-x64-msvc" "0.4.0"
"@vibrant/color@^3.2.1-alpha.1": "@vibrant/color@^3.2.1-alpha.1":
version "3.2.1-alpha.1" version "3.2.1-alpha.1"
@ -2397,12 +2397,12 @@
resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
NeteaseCloudMusicApi@^4.5.2: NeteaseCloudMusicApi@^4.8.7:
version "4.6.6" version "4.8.9"
resolved "https://registry.yarnpkg.com/NeteaseCloudMusicApi/-/NeteaseCloudMusicApi-4.6.6.tgz#97ac29a34dd6d3022ead4246fef62ec7f3dedfbe" resolved "https://registry.npmmirror.com/NeteaseCloudMusicApi/-/NeteaseCloudMusicApi-4.8.9.tgz#b1c077bd74f55a995b40d9c9b436636fa40306be"
integrity sha512-7VNbW6MlMleuG6WDglIFYHtlICJNxF7Nw20vZxaiGdrvQDB6LJvOy6kpXivwATYlkAwzXhz67dNuQVJ16ctXLw== integrity sha512-3YcbljD8nGn0KsjoPq6pBxZSuu3Sk4M3c8ZZhdvEAL+P+1noYftq/ZhA+CY0uQXLMkgbHRpLapBdGXMXhhB6/Q==
dependencies: dependencies:
axios "^0.24.0" axios "^1.2.2"
express "^4.17.1" express "^4.17.1"
express-fileupload "^1.1.9" express-fileupload "^1.1.9"
md5 "^2.3.0" md5 "^2.3.0"
@ -2868,13 +2868,6 @@ aws4@^1.8.0:
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
axios@^0.24.0:
version "0.24.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6"
integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==
dependencies:
follow-redirects "^1.14.4"
axios@^0.26.1: axios@^0.26.1:
version "0.26.1" version "0.26.1"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9"
@ -2882,6 +2875,15 @@ axios@^0.26.1:
dependencies: dependencies:
follow-redirects "^1.14.8" follow-redirects "^1.14.8"
axios@^1.2.2:
version "1.3.1"
resolved "https://registry.npmmirror.com/axios/-/axios-1.3.1.tgz#80bf6c8dbb46e6db1fa8fe9ab114c1ca7405c2ee"
integrity sha512-78pWJsQTceInlyaeBQeYZ/QgZeWS8hGeKiIJiDKQe3hEyBb7sEMq0K4gjx+Va6WHTYO4zI/RRl8qGRzn0YMadA==
dependencies:
follow-redirects "^1.15.0"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
babel-eslint@^10.1.0: babel-eslint@^10.1.0:
version "10.1.0" version "10.1.0"
resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
@ -6139,7 +6141,7 @@ flush-write-stream@^1.0.0:
inherits "^2.0.3" inherits "^2.0.3"
readable-stream "^2.3.6" readable-stream "^2.3.6"
follow-redirects@^1.0.0, follow-redirects@^1.14.4: follow-redirects@^1.0.0:
version "1.15.1" version "1.15.1"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
@ -6149,6 +6151,11 @@ follow-redirects@^1.14.8:
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7"
integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==
follow-redirects@^1.15.0:
version "1.15.2"
resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
for-in@^1.0.2: for-in@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
@ -10221,6 +10228,11 @@ proxy-addr@~2.0.7:
forwarded "0.2.0" forwarded "0.2.0"
ipaddr.js "1.9.1" ipaddr.js "1.9.1"
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
prr@~1.0.1: prr@~1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"

Loading…
Cancel
Save