From a4c5208a5f61125ab32e2cf5f88f7a494cd59a65 Mon Sep 17 00:00:00 2001 From: Norbaev Date: Fri, 28 Jun 2024 17:27:29 +0500 Subject: [PATCH] =?UTF-8?q?=D0=B2=D0=B7=D0=BE=D1=80=D0=B2=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D1=83=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B2?= =?UTF-8?q?=D1=83=D0=BA=D0=B0=20=D0=B2=20=D0=BF=D0=BB=D0=B5=D0=B5=D1=80?= =?UTF-8?q?=D0=B5,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B8?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D0=BA=D1=83=20=D0=BF=D1=80=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D0=B8,=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B3=D0=B4=D0=B0=20=D0=B7=D0=B2=D1=83=D0=BA=20=D0=B2=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/postcss.config.cjs | 38 ++--- client/src/assets/css/module/player.scss | 54 ++++--- client/src/assets/img/icon/volume-off.svg | 13 ++ client/src/components/player.vue | 173 +++++++++++++--------- client/src/store/index.js | 18 ++- 5 files changed, 180 insertions(+), 116 deletions(-) create mode 100644 client/src/assets/img/icon/volume-off.svg diff --git a/client/postcss.config.cjs b/client/postcss.config.cjs index 4ac40cd..b27c076 100644 --- a/client/postcss.config.cjs +++ b/client/postcss.config.cjs @@ -1,20 +1,20 @@ module.exports = { - parser: 'postcss', - plugins: { - 'postcss-import': {}, - 'postcss-mixins': {}, - 'postcss-nested': {}, - 'postcss-simple-vars': {}, - 'postcss-hexrgba': {}, - 'postcss-color-function': {}, - 'postcss-font-weights': {}, - 'postcss-inline-svg': { - paths: ['./src'] - }, - 'postcss-math': { - functionName: 'calculate' - }, - 'postcss-conditionals': {}, - 'postcss-preset-env': {} - } -} + parser: 'postcss', + plugins: { + 'postcss-import': {}, + 'postcss-mixins': {}, + 'postcss-nested': {}, + 'postcss-simple-vars': {}, + 'postcss-hexrgba': {}, + 'postcss-color-function': {}, + 'postcss-font-weights': {}, + 'postcss-inline-svg': { + paths: ['./src'], + }, + 'postcss-math': { + functionName: 'calculate', + }, + 'postcss-conditionals': {}, + 'postcss-preset-env': {}, + }, +}; diff --git a/client/src/assets/css/module/player.scss b/client/src/assets/css/module/player.scss index 12ff961..931ca61 100644 --- a/client/src/assets/css/module/player.scss +++ b/client/src/assets/css/module/player.scss @@ -34,7 +34,7 @@ span { color: var(--color-white-opacity); } - &.m--skeleton{ + &.m--skeleton { min-width: 135px; } } @@ -42,16 +42,18 @@ &__favorites { width: 27px; height: 27px; - background: svg-load('./assets/img/icon/favorites.svg', fill=#404145FF) no-repeat 100%; + background: svg-load('./assets/img/icon/favorites.svg', fill=#404145FF) + no-repeat 100%; margin-left: var(--space-between-block); - &.m--skeleton{ + &.m--skeleton { background: none; } &:hover { - cursor: url("./assets/img/icon/cursor.svg"), auto; + cursor: url('./assets/img/icon/cursor.svg'), auto; } - &.m--active{ - background: svg-load('./assets/img/icon/favorites.svg', fill=#FFF) no-repeat 100%; + &.m--active { + background: svg-load('./assets/img/icon/favorites.svg', fill=#FFF) + no-repeat 100%; } } @@ -82,26 +84,36 @@ } } } - &__tools{ + &__tools { display: flex; gap: var(--space-between-block); align-items: center; margin-left: auto; - &.m--skeleton{ + &.m--skeleton { min-width: 200px; } } - &__volume{ + &__volume { display: flex; align-items: center; position: relative; gap: 10px; - span{ + &-on { width: 24px; height: 24px; - background: svg-load('./assets/img/icon/volume.svg', fill=#FFFF) no-repeat 100%; + background: svg-load('./assets/img/icon/volume.svg', fill=#FFFF) no-repeat + 100%; &:hover { - cursor: url("./assets/img/icon/cursor.svg"), auto; + cursor: url('./assets/img/icon/cursor.svg'), auto; + } + } + &-off { + width: 24px; + height: 24px; + background: svg-load('./assets/img/icon/volume-off.svg', fill=#FFFF) + no-repeat 100%; + &:hover { + cursor: url('./assets/img/icon/cursor.svg'), auto; } } input { @@ -116,7 +128,7 @@ margin: 0; &:hover { - cursor: url("./assets/img/icon/cursor.svg"), auto; + cursor: url('./assets/img/icon/cursor.svg'), auto; } &::-webkit-slider-thumb, @@ -145,7 +157,7 @@ margin: 0; &:hover { - cursor: url("./assets/img/icon/cursor.svg"), auto; + cursor: url('./assets/img/icon/cursor.svg'), auto; } &::-webkit-slider-thumb, @@ -175,12 +187,14 @@ width: 18px; height: 18px; margin: auto; - background: svg-load('./assets/img/icon/play.svg', fill=#FFFF) no-repeat 100%; + background: svg-load('./assets/img/icon/play.svg', fill=#FFFF) no-repeat + 100%; background-size: contain; } &:hover:after { - background: svg-load('./assets/img/icon/play.svg', fill=$color-primary) no-repeat 100%; + background: svg-load('./assets/img/icon/play.svg', fill=$color-primary) + no-repeat 100%; background-size: contain; } } @@ -192,17 +206,19 @@ width: 18px; height: 18px; margin: auto; - background: svg-load('./assets/img/icon/pause.svg', fill=#FFFF) no-repeat 100%; + background: svg-load('./assets/img/icon/pause.svg', fill=#FFFF) + no-repeat 100%; background-size: contain; } &:hover:after { - background: svg-load('./assets/img/icon/pause.svg', fill=$color-primary) no-repeat 100%; + background: svg-load('./assets/img/icon/pause.svg', fill=$color-primary) + no-repeat 100%; background-size: contain; } } - &.m--skeleton{ + &.m--skeleton { background: none; } } diff --git a/client/src/assets/img/icon/volume-off.svg b/client/src/assets/img/icon/volume-off.svg new file mode 100644 index 0000000..8a52483 --- /dev/null +++ b/client/src/assets/img/icon/volume-off.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/src/components/player.vue b/client/src/components/player.vue index e1a1587..25d48ca 100644 --- a/client/src/components/player.vue +++ b/client/src/components/player.vue @@ -55,8 +55,22 @@ />
- - + +
@@ -98,7 +112,7 @@ export default { isPlayRadio: false, connection: null, isUserMusic: !this.$store.state.currentPlay.live, - songVolume: this.$store.state.currentPlay.volume, + songVolume: 0.5, playerInfo: { progress: 0, currentTime: 0, @@ -160,7 +174,7 @@ export default { this.connectionPlayer(); }, mounted() { - this.$store.dispatch('initPlayer'); + this.$store.dispatch('initPlayer', { volume: this.songVolume }); if (this.user?.id) { this.checkSongIsFavorite(); this.getSongList(); @@ -254,17 +268,18 @@ export default { if (dataUrl !== playerUrl) { // console.log('data.np.station.listen_url', dataUrl); this.$store.dispatch('changePlayer', dataUrl); - console.log(this.player); + // console.log(this.player); const params = { ...this.currentPlay, + // Инфа про текущий трек ...data.np.now_playing.song, azura_id: data.np.now_playing.song.id, isLoader: false, live: true, currentIndex: null, }; - console.log('params in getPlaying ', params); - delete params.unique_id; + // console.log('params in getPlaying ', params); + // delete params.unique_id; this.$store.dispatch('setCurrentPlay', params); } } @@ -351,81 +366,95 @@ export default { this.$emit('shopAuthentication', true); } }, - changeVolume(type) { - let volume = this.songVolume; - if (type === 'set') { - volume = this.songVolume === 0 ? 0.9 : 0.01; - this.songVolume = this.songVolume === 0 ? 100 : 0; + // changeVolume(type) { + // let volume = this.songVolume; + // console.log(volume); + // console.log(this.songVolume); + // if (type === 'set') { + // volume = this.songVolume === 0 ? 0.9 : 0.01; + // this.songVolume = this.songVolume === 0 ? 100 : 0; + // } else { + // volume = this.songVolume / 100; + // } + // if (volume === 0) volume = 0.01; + // this.$store.dispatch('handlerPlayer', { volume }); + // }, + changeVolume() { + console.log(this.songVolume); + this.$store.dispatch('handlerPlayer', { volume: this.songVolume }); + }, + toggleVolume() { + if (this.songVolume === 0) { + this.songVolume = 1; + console.log(this.songVolume); + this.$store.dispatch('handlerPlayer', { volume: this.songVolume }); } else { - volume = this.songVolume / 100; + this.songVolume = 0.0; + console.log(this.songVolume); + this.$store.dispatch('handlerPlayer', { volume: this.songVolume }); } - if (volume === 0) volume = 0.01; - this.$store.dispatch('handlerPlayer', { volume }); }, - getAudio(id) { - app - .getAudio(id) - .then((res) => { - console.log('res в методе getAudio', res); - const blob = new Blob([res], { type: 'application/audio' }); - const audioUrl = URL.createObjectURL(blob); - this.$store.dispatch('changePlayer', audioUrl); - this.player.target.addEventListener( - 'timeupdate', - this.updateProgress, - ); + }, + getAudio(id) { + app + .getAudio(id) + .then((res) => { + console.log('res в методе getAudio', res); + const blob = new Blob([res], { type: 'application/audio' }); + const audioUrl = URL.createObjectURL(blob); + this.$store.dispatch('changePlayer', audioUrl); + this.player.target.addEventListener('timeupdate', this.updateProgress); - blob.arrayBuffer().then((buffer) => { - var audioContext = new (window.AudioContext || - window.webkitAudioContext)(); - audioContext.decodeAudioData(buffer, (decodedData) => { - this.playerInfo.duration = decodedData.duration; - }); + blob.arrayBuffer().then((buffer) => { + var audioContext = new (window.AudioContext || + window.webkitAudioContext)(); + audioContext.decodeAudioData(buffer, (decodedData) => { + this.playerInfo.duration = decodedData.duration; }); - this.$store.dispatch('setCurrentPlay', { - ...this.currentPlay, - isLoader: false, - }); - }) - .catch((err) => { - this.$store.dispatch('setCurrentPlay', { - ...this.currentPlay, - isLoader: false, - }); - console.debug(err); }); - }, - changeLive() { - if (this.currentPlay.live) { - console.log('избранное'); - this.playerInfo.progress = 0; - const params = { - ...this.userSongList[this.currentPlay.currentIndex || 0], - live: false, - isLoader: true, - }; - if (!this.currentPlay.currentIndex) params.currentIndex = 0; - this.$store.dispatch('setCurrentPlay', params); - } else { - this.playerInfo.progress = 100; this.$store.dispatch('setCurrentPlay', { ...this.currentPlay, - live: true, - isLoader: true, + isLoader: false, }); - console.log('поток'); - } - }, - getTime(value) { - let minutes = Math.floor(value / 60); - let seconds = Math.round(value % 60); + }) + .catch((err) => { + this.$store.dispatch('setCurrentPlay', { + ...this.currentPlay, + isLoader: false, + }); + console.debug(err); + }); + }, + changeLive() { + if (this.currentPlay.live) { + console.log('избранное'); + this.playerInfo.progress = 0; + const params = { + ...this.userSongList[this.currentPlay.currentIndex || 0], + live: false, + isLoader: true, + }; + if (!this.currentPlay.currentIndex) params.currentIndex = 0; + this.$store.dispatch('setCurrentPlay', params); + } else { + this.playerInfo.progress = 100; + this.$store.dispatch('setCurrentPlay', { + ...this.currentPlay, + live: true, + isLoader: true, + }); + console.log('поток'); + } + }, + getTime(value) { + let minutes = Math.floor(value / 60); + let seconds = Math.round(value % 60); - let paddedMinutes = minutes < 10 ? '0' + minutes : minutes; - let paddedSeconds = seconds < 10 ? '0' + seconds : seconds; - if (!paddedMinutes) paddedMinutes = '00'; - if (!paddedSeconds) paddedSeconds = '00'; - return `${paddedMinutes}:${paddedSeconds}`; - }, + let paddedMinutes = minutes < 10 ? '0' + minutes : minutes; + let paddedSeconds = seconds < 10 ? '0' + seconds : seconds; + if (!paddedMinutes) paddedMinutes = '00'; + if (!paddedSeconds) paddedSeconds = '00'; + return `${paddedMinutes}:${paddedSeconds}`; }, }; diff --git a/client/src/store/index.js b/client/src/store/index.js index 155b7b6..4851531 100644 --- a/client/src/store/index.js +++ b/client/src/store/index.js @@ -26,7 +26,7 @@ export default createStore({ isPlay: false, isLoader: false, live: true, - volume: 50, + // volume: 0.5, currentIndex: null, }, player: { @@ -61,12 +61,15 @@ export default createStore({ setPlayer(state, params) { state.player = { ...state.player, ...params }; }, - initPlayer(state) { + initPlayer(state, { volume }) { + // console.log(params); state.player.target = document.createElement('audio'); + console.log(state.player.target); state.player.target.src = ''; state.player.target.preload = 'auto'; state.player.target.controls = true; - state.player.target.volume = 0.5; + // По умолчанию создается с volume 1 + state.player.target.volume = volume; }, changePlayer(state, params) { const awaitPlay = () => { @@ -87,6 +90,7 @@ export default createStore({ state.player.target.addEventListener('canplaythrough', awaitPlay); }, handlerPlayer(state, params) { + console.log('hanlerPlayer', params); if (params.pause) { state.currentPlay.isPlay = false; state.player.target.pause(); @@ -98,8 +102,10 @@ export default createStore({ state.player.target.play(); } } - if (params.volume) { + if ('volume' in params) { + // console.log('handlerPlayer', params.volume); state.player.target.volume = params.volume; + // console.log('audio.volume', state.player.target.volume); } }, setUserFavorite(state, params) { @@ -126,8 +132,8 @@ export default createStore({ setPlayer(context, params) { context.commit('setPlayer', params); }, - initPlayer(context) { - context.commit('initPlayer'); + initPlayer(context, params) { + context.commit('initPlayer', params); }, handlerPlayer(context, params) { context.commit('handlerPlayer', params);