新增播放详情页

pull/225/head
lyswhut 2020-04-28 13:33:55 +08:00
parent db04b0c285
commit 346fa2c004
15 changed files with 935 additions and 82 deletions

View File

@ -11,9 +11,14 @@ module.exports = {
'line-height', 'line-height',
'letter-spacing', 'letter-spacing',
'padding', 'margin', 'padding', 'margin',
'padding-left', 'padding-right',
'padding-top', 'padding-bottom',
'margin-left', 'margin-right',
'margin-top', 'margin-bottom',
'height', 'width', 'height', 'width',
'max-width', 'max-height', 'max-width', 'max-height',
'min-width', 'min-height', 'min-width', 'min-height',
'flex', '::-webkit-scrollbar',
'top', 'left', 'bottom', 'right', 'top', 'left', 'bottom', 'right',
'border-radius', 'border-radius',
], ],

View File

@ -8,6 +8,7 @@
- 新增虾米音源 - 新增虾米音源
- 新增新皮肤“粉妆玉琢”、“青出于黑”,可去体验下~ - 新增新皮肤“粉妆玉琢”、“青出于黑”,可去体验下~
- 新增“超大”、“巨大”窗口尺寸 - 新增“超大”、“巨大”窗口尺寸
- 新增播放详情页(退出详情页可点击右上角退出按钮或者在播放详情页任意地方**鼠标快速右击两次**
### 优化 ### 优化
@ -20,6 +21,7 @@
- 下载列表的歌曲下载、播放将随设置中的保存路径改变而改变,不再固定指向其初始位置 - 下载列表的歌曲下载、播放将随设置中的保存路径改变而改变,不再固定指向其初始位置
- 移除列表多选框,现在多选需要键盘配合,想要多选前需按下`Shift`或`Ctrl`键然后再鼠标点击想要选中的内容即可触发多选机制,其中`Shift`键用于连续选择,`Ctrl`键用于不连续选择,`Ctrl+a`用于快速全选。例子一想要选中1-5项则先按下`Shift`键后鼠标点击第一项再点击第五项即可完成选择例子二想要选中1项与第3项则先按下`Ctrl`键后,鼠标点击第一项,再点击第三项即可完成选择;例子三:想要选中当前列表的全部内容,键盘先按下`Ctrl`键不放,然后按`a`键,即可完成选择。用`Shift`或`Ctrl`选择时,鼠标点击未选中的内容会将其选中,点击已选择的内容会将其取消选择,若想全部取消选择,在不按`Shift`或`Alt`键的情况下,随意点击列表里的一项内容即可全部取消选择。(P.S`Ctrl`键对应Mac OS上的`Command`键) - 移除列表多选框,现在多选需要键盘配合,想要多选前需按下`Shift`或`Ctrl`键然后再鼠标点击想要选中的内容即可触发多选机制,其中`Shift`键用于连续选择,`Ctrl`键用于不连续选择,`Ctrl+a`用于快速全选。例子一想要选中1-5项则先按下`Shift`键后鼠标点击第一项再点击第五项即可完成选择例子二想要选中1项与第3项则先按下`Ctrl`键后,鼠标点击第一项,再点击第三项即可完成选择;例子三:想要选中当前列表的全部内容,键盘先按下`Ctrl`键不放,然后按`a`键,即可完成选择。用`Shift`或`Ctrl`选择时,鼠标点击未选中的内容会将其选中,点击已选择的内容会将其取消选择,若想全部取消选择,在不按`Shift`或`Alt`键的情况下,随意点击列表里的一项内容即可全部取消选择。(P.S`Ctrl`键对应Mac OS上的`Command`键)
- 现在进度条的封面图左击改为打开播放详情页,在列表定位歌曲改为右击
### 修复 ### 修复

View File

@ -19,7 +19,6 @@ const writeMeta = async(filePath, meta, picPath) => {
} }
if (picPath) { if (picPath) {
const apicData = await fsPromises.readFile(picPath) const apicData = await fsPromises.readFile(picPath)
console.log(apicData)
let imgSize = getImgSize(apicData) let imgSize = getImgSize(apicData)
let mime_type let mime_type
let bitsPerPixel let bitsPerPixel

View File

@ -1,24 +1,24 @@
<template lang="pug"> <template lang="pug">
#container(v-if="isProd && !isNt" :class="theme" @mouseenter="enableIgnoreMouseEvents" @mouseleave="dieableIgnoreMouseEvents") #container(v-if="isProd && !isNt" :class="[theme, nd ? 'nd' : '']" @mouseenter="enableIgnoreMouseEvents" @mouseleave="dieableIgnoreMouseEvents")
core-aside#left core-aside#left
#right #right
core-toolbar#toolbar core-toolbar#toolbar
core-view#view core-view#view
core-player#player core-player#player
core-icons core-icons
material-pact-modal(v-show="!setting.isAgreePact || globalObj.isShowPact")
material-version-modal(v-show="version.showModal")
material-xm-verify-modal(v-show="globalObj.xm.isShowVerify" :show="globalObj.xm.isShowVerify" :bg-close="false" @close="handleXMVerifyModalClose") material-xm-verify-modal(v-show="globalObj.xm.isShowVerify" :show="globalObj.xm.isShowVerify" :bg-close="false" @close="handleXMVerifyModalClose")
#container(v-else :class="theme") material-version-modal(v-show="version.showModal")
material-pact-modal(v-show="!setting.isAgreePact || globalObj.isShowPact")
#container(v-else :class="[theme, nd ? 'nd' : '']")
core-aside#left core-aside#left
#right #right
core-toolbar#toolbar core-toolbar#toolbar
core-view#view core-view#view
core-player#player core-player#player
core-icons core-icons
material-pact-modal(v-show="!setting.isAgreePact || globalObj.isShowPact")
material-version-modal(v-show="version.showModal")
material-xm-verify-modal(v-show="globalObj.xm.isShowVerify" :show="globalObj.xm.isShowVerify" :bg-close="false" @close="handleXMVerifyModalClose") material-xm-verify-modal(v-show="globalObj.xm.isShowVerify" :show="globalObj.xm.isShowVerify" :bg-close="false" @close="handleXMVerifyModalClose")
material-version-modal(v-show="version.showModal")
material-pact-modal(v-show="!setting.isAgreePact || globalObj.isShowPact")
</template> </template>
<script> <script>
@ -55,6 +55,7 @@ export default {
} }
}, },
computed: { computed: {
...mapGetters('player', ['isShowPlayerDetail']),
...mapGetters(['setting', 'theme', 'version', 'windowSizeActive']), ...mapGetters(['setting', 'theme', 'version', 'windowSizeActive']),
...mapGetters('list', ['defaultList', 'loveList']), ...mapGetters('list', ['defaultList', 'loveList']),
...mapGetters('download', { ...mapGetters('download', {
@ -64,6 +65,9 @@ export default {
...mapGetters('search', { ...mapGetters('search', {
searchHistoryList: 'historyList', searchHistoryList: 'historyList',
}), }),
nd() {
return this.isShowPlayerDetail
},
}, },
created() { created() {
this.saveSetting = throttle(n => { this.saveSetting = throttle(n => {

View File

@ -46,14 +46,17 @@
@color-player-progress-bar1: darken(@color-theme_2, 12%); @color-player-progress-bar1: darken(@color-theme_2, 12%);
@color-player-progress-bar2: lighten(@color-theme, 12%); @color-player-progress-bar2: lighten(@color-theme, 12%);
@color-player-status-text: lighten(@color-theme_2-font, 10%); @color-player-status-text: lighten(@color-theme_2-font, 10%);
@color-player-detail-play-btn: lighten(@color-theme, 7%);
@color-tab-btn-background: fadeout(lighten(@color-theme, 10%), 80%); @color-tab-btn-background: fadeout(lighten(@color-theme, 10%), 80%);
@color-tab-btn-background-hover: @color-theme_2-hover; @color-tab-btn-background-hover: @color-theme_2-hover;
@color-tab-border-top: fadeout(lighten(@color-theme, 5%), 50%); @color-tab-border-top: fadeout(lighten(@color-theme, 5%), 50%);
@color-tab-border-bottom: lighten(@color-theme, 5%); @color-tab-border-bottom: lighten(@color-theme, 5%);
@color-hideBtn: #3bc2b2;
@color-minBtn: #85c43b; @color-minBtn: #85c43b;
@color-maxBtn: #e7aa36; @color-maxBtn: #e7aa36;
@color-closeBtn: #ea6e4d; @color-closeBtn: #ea6e4d;
@color-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-minBtn-hover: fadeout(@color-minBtn, 10%); @color-minBtn-hover: fadeout(@color-minBtn, 10%);
@color-maxBtn-hover: fadeout(@color-maxBtn, 10%); @color-maxBtn-hover: fadeout(@color-maxBtn, 10%);
@color-closeBtn-hover: fadeout(@color-closeBtn, 10%); @color-closeBtn-hover: fadeout(@color-closeBtn, 10%);
@ -101,13 +104,16 @@
@color-green-player-progress-bar1: darken(@color-green-theme_2, 12%); @color-green-player-progress-bar1: darken(@color-green-theme_2, 12%);
@color-green-player-progress-bar2: lighten(@color-green-theme, 12%); @color-green-player-progress-bar2: lighten(@color-green-theme, 12%);
@color-green-player-status-text: lighten(@color-green-theme_2-font, 10%); @color-green-player-status-text: lighten(@color-green-theme_2-font, 10%);
@color-green-player-detail-play-btn: lighten(@color-green-theme, 7%);
@color-green-tab-btn-background: fadeout(lighten(@color-green-theme, 10%), 80%); @color-green-tab-btn-background: fadeout(lighten(@color-green-theme, 10%), 80%);
@color-green-tab-btn-background-hover: @color-green-theme_2-hover; @color-green-tab-btn-background-hover: @color-green-theme_2-hover;
@color-green-tab-border-top: fadeout(lighten(@color-green-theme, 5%), 50%); @color-green-tab-border-top: fadeout(lighten(@color-green-theme, 5%), 50%);
@color-green-tab-border-bottom: lighten(@color-green-theme, 5%); @color-green-tab-border-bottom: lighten(@color-green-theme, 5%);
@color-green-hideBtn: #3bc2b2;
@color-green-minBtn: #85c43b; @color-green-minBtn: #85c43b;
@color-green-maxBtn: #e7aa36; @color-green-maxBtn: #e7aa36;
@color-green-closeBtn: #ea6e4d; @color-green-closeBtn: #ea6e4d;
@color-green-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-green-minBtn-hover: fadeout(@color-green-minBtn, 10%); @color-green-minBtn-hover: fadeout(@color-green-minBtn, 10%);
@color-green-maxBtn-hover: fadeout(@color-green-maxBtn, 10%); @color-green-maxBtn-hover: fadeout(@color-green-maxBtn, 10%);
@color-green-closeBtn-hover: fadeout(@color-green-closeBtn, 10%); @color-green-closeBtn-hover: fadeout(@color-green-closeBtn, 10%);
@ -151,13 +157,16 @@
@color-yellow-player-progress-bar1: darken(@color-yellow-theme_2, 12%); @color-yellow-player-progress-bar1: darken(@color-yellow-theme_2, 12%);
@color-yellow-player-progress-bar2: lighten(@color-yellow-theme, 2%); @color-yellow-player-progress-bar2: lighten(@color-yellow-theme, 2%);
@color-yellow-player-status-text: lighten(@color-yellow-theme_2-font, 10%); @color-yellow-player-status-text: lighten(@color-yellow-theme_2-font, 10%);
@color-yellow-player-detail-play-btn: lighten(@color-yellow-theme, 7%);
@color-yellow-tab-btn-background: fadeout(lighten(@color-yellow-theme, 10%), 70%); @color-yellow-tab-btn-background: fadeout(lighten(@color-yellow-theme, 10%), 70%);
@color-yellow-tab-btn-background-hover: @color-yellow-theme_2-hover; @color-yellow-tab-btn-background-hover: @color-yellow-theme_2-hover;
@color-yellow-tab-border-top: fadeout(lighten(@color-yellow-theme, 5%), 40%); @color-yellow-tab-border-top: fadeout(lighten(@color-yellow-theme, 5%), 40%);
@color-yellow-tab-border-bottom: @color-yellow-theme; @color-yellow-tab-border-bottom: @color-yellow-theme;
@color-yellow-hideBtn: #3bc2b2;
@color-yellow-minBtn: #85c43b; @color-yellow-minBtn: #85c43b;
@color-yellow-maxBtn: #e7aa36; @color-yellow-maxBtn: #e7aa36;
@color-yellow-closeBtn: #ea6e4d; @color-yellow-closeBtn: #ea6e4d;
@color-yellow-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-yellow-minBtn-hover: fadeout(@color-yellow-minBtn, 10%); @color-yellow-minBtn-hover: fadeout(@color-yellow-minBtn, 10%);
@color-yellow-maxBtn-hover: fadeout(@color-yellow-maxBtn, 10%); @color-yellow-maxBtn-hover: fadeout(@color-yellow-maxBtn, 10%);
@color-yellow-closeBtn-hover: fadeout(@color-yellow-closeBtn, 10%); @color-yellow-closeBtn-hover: fadeout(@color-yellow-closeBtn, 10%);
@ -200,13 +209,16 @@
@color-orange-player-progress-bar1: darken(@color-orange-theme_2, 12%); @color-orange-player-progress-bar1: darken(@color-orange-theme_2, 12%);
@color-orange-player-progress-bar2: lighten(@color-orange-theme, 12%); @color-orange-player-progress-bar2: lighten(@color-orange-theme, 12%);
@color-orange-player-status-text: lighten(@color-orange-theme_2-font, 10%); @color-orange-player-status-text: lighten(@color-orange-theme_2-font, 10%);
@color-orange-player-detail-play-btn: lighten(@color-orange-theme, 7%);
@color-orange-tab-btn-background: fadeout(lighten(@color-orange-theme, 10%), 80%); @color-orange-tab-btn-background: fadeout(lighten(@color-orange-theme, 10%), 80%);
@color-orange-tab-btn-background-hover: @color-orange-theme_2-hover; @color-orange-tab-btn-background-hover: @color-orange-theme_2-hover;
@color-orange-tab-border-top: fadeout(lighten(@color-orange-theme, 5%), 50%); @color-orange-tab-border-top: fadeout(lighten(@color-orange-theme, 5%), 50%);
@color-orange-tab-border-bottom: lighten(@color-orange-theme, 5%); @color-orange-tab-border-bottom: lighten(@color-orange-theme, 5%);
@color-orange-hideBtn: #3bc2b2;
@color-orange-minBtn: #85c43b; @color-orange-minBtn: #85c43b;
@color-orange-maxBtn: #e7aa36; @color-orange-maxBtn: #e7aa36;
@color-orange-closeBtn: #ea6e4d; @color-orange-closeBtn: #ea6e4d;
@color-orange-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-orange-minBtn-hover: fadeout(@color-orange-minBtn, 10%); @color-orange-minBtn-hover: fadeout(@color-orange-minBtn, 10%);
@color-orange-maxBtn-hover: fadeout(@color-orange-maxBtn, 10%); @color-orange-maxBtn-hover: fadeout(@color-orange-maxBtn, 10%);
@color-orange-closeBtn-hover: fadeout(@color-orange-closeBtn, 10%); @color-orange-closeBtn-hover: fadeout(@color-orange-closeBtn, 10%);
@ -249,13 +261,16 @@
@color-blue-player-progress-bar1: darken(@color-blue-theme_2, 12%); @color-blue-player-progress-bar1: darken(@color-blue-theme_2, 12%);
@color-blue-player-progress-bar2: lighten(@color-blue-theme, 12%); @color-blue-player-progress-bar2: lighten(@color-blue-theme, 12%);
@color-blue-player-status-text: lighten(@color-blue-theme_2-font, 10%); @color-blue-player-status-text: lighten(@color-blue-theme_2-font, 10%);
@color-blue-player-detail-play-btn: lighten(@color-blue-theme, 7%);
@color-blue-tab-btn-background: fadeout(lighten(@color-blue-theme, 10%), 80%); @color-blue-tab-btn-background: fadeout(lighten(@color-blue-theme, 10%), 80%);
@color-blue-tab-btn-background-hover: @color-blue-theme_2-hover; @color-blue-tab-btn-background-hover: @color-blue-theme_2-hover;
@color-blue-tab-border-top: fadeout(lighten(@color-blue-theme, 5%), 50%); @color-blue-tab-border-top: fadeout(lighten(@color-blue-theme, 5%), 50%);
@color-blue-tab-border-bottom: lighten(@color-blue-theme, 5%); @color-blue-tab-border-bottom: lighten(@color-blue-theme, 5%);
@color-blue-hideBtn: #3bc2b2;
@color-blue-minBtn: #85c43b; @color-blue-minBtn: #85c43b;
@color-blue-maxBtn: #e7aa36; @color-blue-maxBtn: #e7aa36;
@color-blue-closeBtn: #ea6e4d; @color-blue-closeBtn: #ea6e4d;
@color-blue-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-blue-minBtn-hover: fadeout(@color-blue-minBtn, 10%); @color-blue-minBtn-hover: fadeout(@color-blue-minBtn, 10%);
@color-blue-maxBtn-hover: fadeout(@color-blue-maxBtn, 10%); @color-blue-maxBtn-hover: fadeout(@color-blue-maxBtn, 10%);
@color-blue-closeBtn-hover: fadeout(@color-blue-closeBtn, 10%); @color-blue-closeBtn-hover: fadeout(@color-blue-closeBtn, 10%);
@ -298,15 +313,18 @@
@color-red-player-progress-bar1: darken(@color-red-theme_2, 12%); @color-red-player-progress-bar1: darken(@color-red-theme_2, 12%);
@color-red-player-progress-bar2: lighten(@color-red-theme, 12%); @color-red-player-progress-bar2: lighten(@color-red-theme, 12%);
@color-red-player-status-text: lighten(@color-red-theme_2-font, 10%); @color-red-player-status-text: lighten(@color-red-theme_2-font, 10%);
@color-red-player-detail-play-btn: lighten(@color-red-theme, 7%);
@color-red-tab-border-top: fadeout(lighten(@color-red-theme, 25%), 70%); @color-red-tab-border-top: fadeout(lighten(@color-red-theme, 25%), 70%);
@color-red-tab-border-bottom: lighten(@color-red-theme, 35%); @color-red-tab-border-bottom: lighten(@color-red-theme, 35%);
@color-red-tab-btn-background: fadeout(lighten(@color-red-theme, 10%), 80%); @color-red-tab-btn-background: fadeout(lighten(@color-red-theme, 10%), 80%);
@color-red-tab-btn-background-hover: @color-red-theme_2-hover; @color-red-tab-btn-background-hover: @color-red-theme_2-hover;
@color-red-tab-border-top: fadeout(lighten(@color-red-theme, 5%), 50%); @color-red-tab-border-top: fadeout(lighten(@color-red-theme, 5%), 50%);
@color-red-tab-border-bottom: lighten(@color-red-theme, 5%); @color-red-tab-border-bottom: lighten(@color-red-theme, 5%);
@color-red-hideBtn: #3bc2b2;
@color-red-minBtn: #85c43b; @color-red-minBtn: #85c43b;
@color-red-maxBtn: #e7aa36; @color-red-maxBtn: #e7aa36;
@color-red-closeBtn: #ea6e4d; @color-red-closeBtn: #ea6e4d;
@color-red-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-red-minBtn-hover: fadeout(@color-red-minBtn, 10%); @color-red-minBtn-hover: fadeout(@color-red-minBtn, 10%);
@color-red-maxBtn-hover: fadeout(@color-red-maxBtn, 10%); @color-red-maxBtn-hover: fadeout(@color-red-maxBtn, 10%);
@color-red-closeBtn-hover: fadeout(@color-red-closeBtn, 10%); @color-red-closeBtn-hover: fadeout(@color-red-closeBtn, 10%);
@ -349,13 +367,16 @@
@color-pink-player-progress-bar1: darken(@color-pink-theme_2, 12%); @color-pink-player-progress-bar1: darken(@color-pink-theme_2, 12%);
@color-pink-player-progress-bar2: lighten(@color-pink-theme, 2%); @color-pink-player-progress-bar2: lighten(@color-pink-theme, 2%);
@color-pink-player-status-text: lighten(@color-pink-theme_2-font, 10%); @color-pink-player-status-text: lighten(@color-pink-theme_2-font, 10%);
@color-pink-player-detail-play-btn: lighten(@color-pink-theme, 7%);
@color-pink-tab-btn-background: fadeout(lighten(@color-pink-theme, 10%), 70%); @color-pink-tab-btn-background: fadeout(lighten(@color-pink-theme, 10%), 70%);
@color-pink-tab-btn-background-hover: @color-pink-theme_2-hover; @color-pink-tab-btn-background-hover: @color-pink-theme_2-hover;
@color-pink-tab-border-top: fadeout(lighten(@color-pink-theme, 5%), 40%); @color-pink-tab-border-top: fadeout(lighten(@color-pink-theme, 5%), 40%);
@color-pink-tab-border-bottom: @color-pink-theme; @color-pink-tab-border-bottom: @color-pink-theme;
@color-pink-hideBtn: #3bc2b2;
@color-pink-minBtn: #85c43b; @color-pink-minBtn: #85c43b;
@color-pink-maxBtn: #e7aa36; @color-pink-maxBtn: #e7aa36;
@color-pink-closeBtn: #ea6e4d; @color-pink-closeBtn: #ea6e4d;
@color-pink-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-pink-minBtn-hover: fadeout(@color-pink-minBtn, 10%); @color-pink-minBtn-hover: fadeout(@color-pink-minBtn, 10%);
@color-pink-maxBtn-hover: fadeout(@color-pink-maxBtn, 10%); @color-pink-maxBtn-hover: fadeout(@color-pink-maxBtn, 10%);
@color-pink-closeBtn-hover: fadeout(@color-pink-closeBtn, 10%); @color-pink-closeBtn-hover: fadeout(@color-pink-closeBtn, 10%);
@ -398,13 +419,16 @@
@color-purple-player-progress-bar1: darken(@color-purple-theme_2, 12%); @color-purple-player-progress-bar1: darken(@color-purple-theme_2, 12%);
@color-purple-player-progress-bar2: lighten(@color-purple-theme, 12%); @color-purple-player-progress-bar2: lighten(@color-purple-theme, 12%);
@color-purple-player-status-text: lighten(@color-purple-theme_2-font, 10%); @color-purple-player-status-text: lighten(@color-purple-theme_2-font, 10%);
@color-purple-player-detail-play-btn: lighten(@color-purple-theme, 7%);
@color-purple-tab-btn-background: fadeout(lighten(@color-purple-theme, 10%), 80%); @color-purple-tab-btn-background: fadeout(lighten(@color-purple-theme, 10%), 80%);
@color-purple-tab-btn-background-hover: @color-purple-theme_2-hover; @color-purple-tab-btn-background-hover: @color-purple-theme_2-hover;
@color-purple-tab-border-top: fadeout(lighten(@color-purple-theme, 5%), 50%); @color-purple-tab-border-top: fadeout(lighten(@color-purple-theme, 5%), 50%);
@color-purple-tab-border-bottom: lighten(@color-purple-theme, 5%); @color-purple-tab-border-bottom: lighten(@color-purple-theme, 5%);
@color-purple-hideBtn: #3bc2b2;
@color-purple-minBtn: #85c43b; @color-purple-minBtn: #85c43b;
@color-purple-maxBtn: #e7aa36; @color-purple-maxBtn: #e7aa36;
@color-purple-closeBtn: #ea6e4d; @color-purple-closeBtn: #ea6e4d;
@color-purple-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-purple-minBtn-hover: fadeout(@color-purple-minBtn, 10%); @color-purple-minBtn-hover: fadeout(@color-purple-minBtn, 10%);
@color-purple-maxBtn-hover: fadeout(@color-purple-maxBtn, 10%); @color-purple-maxBtn-hover: fadeout(@color-purple-maxBtn, 10%);
@color-purple-closeBtn-hover: fadeout(@color-purple-closeBtn, 10%); @color-purple-closeBtn-hover: fadeout(@color-purple-closeBtn, 10%);
@ -447,13 +471,16 @@
@color-grey-player-progress-bar1: darken(@color-grey-theme_2, 12%); @color-grey-player-progress-bar1: darken(@color-grey-theme_2, 12%);
@color-grey-player-progress-bar2: lighten(@color-grey-theme, 12%); @color-grey-player-progress-bar2: lighten(@color-grey-theme, 12%);
@color-grey-player-status-text: lighten(@color-grey-theme_2-font, 10%); @color-grey-player-status-text: lighten(@color-grey-theme_2-font, 10%);
@color-grey-player-detail-play-btn: lighten(@color-grey-theme, 7%);
@color-grey-tab-btn-background: fadeout(lighten(@color-grey-theme, 10%), 80%); @color-grey-tab-btn-background: fadeout(lighten(@color-grey-theme, 10%), 80%);
@color-grey-tab-btn-background-hover: @color-grey-theme_2-hover; @color-grey-tab-btn-background-hover: @color-grey-theme_2-hover;
@color-grey-tab-border-top: fadeout(lighten(@color-grey-theme, 5%), 50%); @color-grey-tab-border-top: fadeout(lighten(@color-grey-theme, 5%), 50%);
@color-grey-tab-border-bottom: lighten(@color-grey-theme, 5%); @color-grey-tab-border-bottom: lighten(@color-grey-theme, 5%);
@color-grey-hideBtn: #3bc2b2;
@color-grey-minBtn: #85c43b; @color-grey-minBtn: #85c43b;
@color-grey-maxBtn: #e7aa36; @color-grey-maxBtn: #e7aa36;
@color-grey-closeBtn: #ea6e4d; @color-grey-closeBtn: #ea6e4d;
@color-grey-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-grey-minBtn-hover: fadeout(@color-grey-minBtn, 10%); @color-grey-minBtn-hover: fadeout(@color-grey-minBtn, 10%);
@color-grey-maxBtn-hover: fadeout(@color-grey-maxBtn, 10%); @color-grey-maxBtn-hover: fadeout(@color-grey-maxBtn, 10%);
@color-grey-closeBtn-hover: fadeout(@color-grey-closeBtn, 10%); @color-grey-closeBtn-hover: fadeout(@color-grey-closeBtn, 10%);
@ -497,15 +524,18 @@
@color-ming-player-progress-bar1: darken(@color-ming-theme_2, 12%); @color-ming-player-progress-bar1: darken(@color-ming-theme_2, 12%);
@color-ming-player-progress-bar2: lighten(@color-ming-theme, 12%); @color-ming-player-progress-bar2: lighten(@color-ming-theme, 12%);
@color-ming-player-status-text: lighten(@color-ming-theme_2-font, 10%); @color-ming-player-status-text: lighten(@color-ming-theme_2-font, 10%);
@color-ming-player-detail-play-btn: lighten(@color-ming-theme, 10%);
@color-ming-tab-border-top: fadeout(lighten(@color-ming-theme, 25%), 70%); @color-ming-tab-border-top: fadeout(lighten(@color-ming-theme, 25%), 70%);
@color-ming-tab-border-bottom: lighten(@color-ming-theme, 35%); @color-ming-tab-border-bottom: lighten(@color-ming-theme, 35%);
@color-ming-tab-btn-background: fadeout(lighten(@color-ming-theme, 10%), 80%); @color-ming-tab-btn-background: fadeout(lighten(@color-ming-theme, 10%), 80%);
@color-ming-tab-btn-background-hover: @color-ming-theme_2-hover; @color-ming-tab-btn-background-hover: @color-ming-theme_2-hover;
@color-ming-tab-border-top: fadeout(lighten(@color-ming-theme, 5%), 50%); @color-ming-tab-border-top: fadeout(lighten(@color-ming-theme, 5%), 50%);
@color-ming-tab-border-bottom: lighten(@color-ming-theme, 5%); @color-ming-tab-border-bottom: lighten(@color-ming-theme, 5%);
@color-ming-hideBtn: #3bc2b2;
@color-ming-minBtn: #85c43b; @color-ming-minBtn: #85c43b;
@color-ming-maxBtn: #e7aa36; @color-ming-maxBtn: #e7aa36;
@color-ming-closeBtn: #ea6e4d; @color-ming-closeBtn: #ea6e4d;
@color-ming-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-ming-minBtn-hover: fadeout(@color-ming-minBtn, 10%); @color-ming-minBtn-hover: fadeout(@color-ming-minBtn, 10%);
@color-ming-maxBtn-hover: fadeout(@color-ming-maxBtn, 10%); @color-ming-maxBtn-hover: fadeout(@color-ming-maxBtn, 10%);
@color-ming-closeBtn-hover: fadeout(@color-ming-closeBtn, 10%); @color-ming-closeBtn-hover: fadeout(@color-ming-closeBtn, 10%);
@ -548,13 +578,16 @@
@color-mid_autumn-player-progress-bar1: darken(@color-mid_autumn-theme_2, 12%); @color-mid_autumn-player-progress-bar1: darken(@color-mid_autumn-theme_2, 12%);
@color-mid_autumn-player-progress-bar2: lighten(@color-mid_autumn-theme, 12%); @color-mid_autumn-player-progress-bar2: lighten(@color-mid_autumn-theme, 12%);
@color-mid_autumn-player-status-text: lighten(@color-mid_autumn-theme_2-font, 10%); @color-mid_autumn-player-status-text: lighten(@color-mid_autumn-theme_2-font, 10%);
@color-mid_autumn-player-detail-play-btn: lighten(@color-mid_autumn-theme, 7%);
@color-mid_autumn-tab-btn-background: fadeout(lighten(@color-mid_autumn-theme, 10%), 80%); @color-mid_autumn-tab-btn-background: fadeout(lighten(@color-mid_autumn-theme, 10%), 80%);
@color-mid_autumn-tab-btn-background-hover: @color-mid_autumn-theme_2-hover; @color-mid_autumn-tab-btn-background-hover: @color-mid_autumn-theme_2-hover;
@color-mid_autumn-tab-border-top: fadeout(lighten(@color-mid_autumn-theme, 5%), 50%); @color-mid_autumn-tab-border-top: fadeout(lighten(@color-mid_autumn-theme, 5%), 50%);
@color-mid_autumn-tab-border-bottom: lighten(@color-mid_autumn-theme, 5%); @color-mid_autumn-tab-border-bottom: lighten(@color-mid_autumn-theme, 5%);
@color-mid_autumn-hideBtn: #3bc2b2;
@color-mid_autumn-minBtn: #85c43b; @color-mid_autumn-minBtn: #85c43b;
@color-mid_autumn-maxBtn: #e7aa36; @color-mid_autumn-maxBtn: #e7aa36;
@color-mid_autumn-closeBtn: #ea6e4d; @color-mid_autumn-closeBtn: #ea6e4d;
@color-mid_autumn-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-mid_autumn-minBtn-hover: fadeout(@color-mid_autumn-minBtn, 10%); @color-mid_autumn-minBtn-hover: fadeout(@color-mid_autumn-minBtn, 10%);
@color-mid_autumn-maxBtn-hover: fadeout(@color-mid_autumn-maxBtn, 10%); @color-mid_autumn-maxBtn-hover: fadeout(@color-mid_autumn-maxBtn, 10%);
@color-mid_autumn-closeBtn-hover: fadeout(@color-mid_autumn-closeBtn, 10%); @color-mid_autumn-closeBtn-hover: fadeout(@color-mid_autumn-closeBtn, 10%);
@ -597,13 +630,16 @@
@color-naruto-player-progress-bar1: darken(@color-naruto-theme_2, 12%); @color-naruto-player-progress-bar1: darken(@color-naruto-theme_2, 12%);
@color-naruto-player-progress-bar2: lighten(@color-naruto-theme, 12%); @color-naruto-player-progress-bar2: lighten(@color-naruto-theme, 12%);
@color-naruto-player-status-text: lighten(@color-naruto-theme_2-font, 10%); @color-naruto-player-status-text: lighten(@color-naruto-theme_2-font, 10%);
@color-naruto-player-detail-play-btn: lighten(@color-naruto-theme, 7%);
@color-naruto-tab-btn-background: fadeout(lighten(@color-naruto-theme, 10%), 80%); @color-naruto-tab-btn-background: fadeout(lighten(@color-naruto-theme, 10%), 80%);
@color-naruto-tab-btn-background-hover: @color-naruto-theme_2-hover; @color-naruto-tab-btn-background-hover: @color-naruto-theme_2-hover;
@color-naruto-tab-border-top: fadeout(lighten(@color-naruto-theme, 5%), 50%); @color-naruto-tab-border-top: fadeout(lighten(@color-naruto-theme, 5%), 50%);
@color-naruto-tab-border-bottom: lighten(@color-naruto-theme, 5%); @color-naruto-tab-border-bottom: lighten(@color-naruto-theme, 5%);
@color-naruto-hideBtn: #3bc2b2;
@color-naruto-minBtn: #85c43b; @color-naruto-minBtn: #85c43b;
@color-naruto-maxBtn: #e7aa36; @color-naruto-maxBtn: #e7aa36;
@color-naruto-closeBtn: #ea6e4d; @color-naruto-closeBtn: #ea6e4d;
@color-naruto-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-naruto-minBtn-hover: fadeout(@color-naruto-minBtn, 10%); @color-naruto-minBtn-hover: fadeout(@color-naruto-minBtn, 10%);
@color-naruto-maxBtn-hover: fadeout(@color-naruto-maxBtn, 10%); @color-naruto-maxBtn-hover: fadeout(@color-naruto-maxBtn, 10%);
@color-naruto-closeBtn-hover: fadeout(@color-naruto-closeBtn, 10%); @color-naruto-closeBtn-hover: fadeout(@color-naruto-closeBtn, 10%);
@ -646,13 +682,16 @@
@color-happy_new_year-player-progress-bar1: darken(@color-happy_new_year-theme_2, 12%); @color-happy_new_year-player-progress-bar1: darken(@color-happy_new_year-theme_2, 12%);
@color-happy_new_year-player-progress-bar2: lighten(@color-happy_new_year-theme, 9%); @color-happy_new_year-player-progress-bar2: lighten(@color-happy_new_year-theme, 9%);
@color-happy_new_year-player-status-text: lighten(@color-happy_new_year-theme_2-font, 10%); @color-happy_new_year-player-status-text: lighten(@color-happy_new_year-theme_2-font, 10%);
@color-happy_new_year-player-detail-play-btn: lighten(@color-happy_new_year-theme, 7%);
@color-happy_new_year-tab-btn-background: fadeout(lighten(@color-happy_new_year-theme, 10%), 80%); @color-happy_new_year-tab-btn-background: fadeout(lighten(@color-happy_new_year-theme, 10%), 80%);
@color-happy_new_year-tab-btn-background-hover: @color-happy_new_year-theme_2-hover; @color-happy_new_year-tab-btn-background-hover: @color-happy_new_year-theme_2-hover;
@color-happy_new_year-tab-border-top: fadeout(lighten(@color-happy_new_year-theme, 5%), 50%); @color-happy_new_year-tab-border-top: fadeout(lighten(@color-happy_new_year-theme, 5%), 50%);
@color-happy_new_year-tab-border-bottom: lighten(@color-happy_new_year-theme, 5%); @color-happy_new_year-tab-border-bottom: lighten(@color-happy_new_year-theme, 5%);
@color-happy_new_year-hideBtn: #64a130;
@color-happy_new_year-minBtn: #c4943b; @color-happy_new_year-minBtn: #c4943b;
@color-happy_new_year-maxBtn: #e7aa36; @color-happy_new_year-maxBtn: #e7aa36;
@color-happy_new_year-closeBtn: #ea6e4d; @color-happy_new_year-closeBtn: #ea6e4d;
@color-happy_new_year-hideBtn-hover: fadeout(@color-hideBtn, 10%);
@color-happy_new_year-minBtn-hover: fadeout(@color-happy_new_year-minBtn, 10%); @color-happy_new_year-minBtn-hover: fadeout(@color-happy_new_year-minBtn, 10%);
@color-happy_new_year-maxBtn-hover: fadeout(@color-happy_new_year-maxBtn, 10%); @color-happy_new_year-maxBtn-hover: fadeout(@color-happy_new_year-maxBtn, 10%);
@color-happy_new_year-closeBtn-hover: fadeout(@color-happy_new_year-closeBtn, 10%); @color-happy_new_year-closeBtn-hover: fadeout(@color-happy_new_year-closeBtn, 10%);

View File

@ -66,6 +66,11 @@ export default {
display: flex; display: flex;
flex-flow: column nowrap; flex-flow: column nowrap;
} }
:global(.nd) {
.aside {
-webkit-app-region: no-drag;
}
}
.logo { .logo {
box-sizing: border-box; box-sizing: border-box;
padding: 12% 13%; padding: 12% 13%;

View File

@ -70,6 +70,9 @@ svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/19
g#icon-down g#icon-down
// 0 0 451.847 451.847 // 0 0 451.847 451.847
path(fill='currentColor' d='M225.923,354.706c-8.098,0-16.195-3.092-22.369-9.263L9.27,151.157c-12.359-12.359-12.359-32.397,0-44.751c12.354-12.354,32.388-12.354,44.748,0l171.905,171.915l171.906-171.909c12.359-12.354,32.391-12.354,44.744,0c12.365,12.354,12.365,32.392,0,44.751L248.292,345.449C242.115,351.621,234.018,354.706,225.923,354.706z') path(fill='currentColor' d='M225.923,354.706c-8.098,0-16.195-3.092-22.369-9.263L9.27,151.157c-12.359-12.359-12.359-32.397,0-44.751c12.354-12.354,32.388-12.354,44.748,0l171.905,171.915l171.906-171.909c12.359-12.354,32.391-12.354,44.744,0c12.365,12.354,12.365,32.392,0,44.751L248.292,345.449C242.115,351.621,234.018,354.706,225.923,354.706z')
g#icon-back
// 0 0 512 512
path(fill='currentColor' d='M511.563,434.259c-1.728-142.329-124.42-258.242-277.087-263.419V95.999c0-17.645-14.342-31.999-31.974-31.999 c-7.931,0-15.591,3.042-21.524,8.562c0,0-134.828,124.829-173.609,163.755C2.623,241.109,0,248.088,0,255.994 c0,7.906,2.623,14.885,7.369,19.687c38.781,38.915,173.609,163.745,173.609,163.745c5.933,5.521,13.593,8.562,21.524,8.562 c17.631,0,31.974-14.354,31.974-31.999v-74.591c153.479,2.156,255.792,50.603,255.792,95.924c0,5.896,4.767,10.666,10.658,10.666 c0.167,0.021,0.333,0.01,0.416,0c5.891,0,10.658-4.771,10.658-10.666C512,436.259,511.854,435.228,511.563,434.259z')
g#icon-refresh g#icon-refresh
// 0 0 512 512 // 0 0 512 512
path(fill='currentColor' d='M440.65 12.57l4 82.77A247.16 247.16 0 0 0 255.83 8C134.73 8 33.91 94.92 12.29 209.82A12 12 0 0 0 24.09 224h49.05a12 12 0 0 0 11.67-9.26 175.91 175.91 0 0 1 317-56.94l-101.46-4.86a12 12 0 0 0-12.57 12v47.41a12 12 0 0 0 12 12H500a12 12 0 0 0 12-12V12a12 12 0 0 0-12-12h-47.37a12 12 0 0 0-11.98 12.57zM255.83 432a175.61 175.61 0 0 1-146-77.8l101.8 4.87a12 12 0 0 0 12.57-12v-47.4a12 12 0 0 0-12-12H12a12 12 0 0 0-12 12V500a12 12 0 0 0 12 12h47.35a12 12 0 0 0 12-12.6l-4.15-82.57A247.17 247.17 0 0 0 255.83 504c121.11 0 221.93-86.92 243.55-201.82a12 12 0 0 0-11.8-14.18h-49.05a12 12 0 0 0-11.67 9.26A175.86 175.86 0 0 1 255.83 432z') path(fill='currentColor' d='M440.65 12.57l4 82.77A247.16 247.16 0 0 0 255.83 8C134.73 8 33.91 94.92 12.29 209.82A12 12 0 0 0 24.09 224h49.05a12 12 0 0 0 11.67-9.26 175.91 175.91 0 0 1 317-56.94l-101.46-4.86a12 12 0 0 0-12.57 12v47.41a12 12 0 0 0 12 12H500a12 12 0 0 0 12-12V12a12 12 0 0 0-12-12h-47.37a12 12 0 0 0-11.98 12.57zM255.83 432a175.61 175.61 0 0 1-146-77.8l101.8 4.87a12 12 0 0 0 12.57-12v-47.4a12 12 0 0 0-12-12H12a12 12 0 0 0-12 12V500a12 12 0 0 0 12 12h47.35a12 12 0 0 0 12-12.6l-4.15-82.57A247.17 247.17 0 0 0 255.83 504c121.11 0 221.93-86.92 243.55-201.82a12 12 0 0 0-11.8-14.18h-49.05a12 12 0 0 0-11.67 9.26A175.86 175.86 0 0 1 255.83 432z')

View File

@ -1,10 +1,10 @@
<template lang="pug"> <template lang="pug">
div(:class="$style.player") div(:class="$style.player")
div(:class="$style.left" @click="handleToMusicLocation") div(:class="$style.left" @contextmenu="handleToMusicLocation" @click="showPlayerDetail")
img(v-if="musicInfo.img" :src="musicInfo.img" @error="imgError") img(v-if="musicInfo.img" :src="musicInfo.img" @error="imgError")
svg(v-else version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' width='100%' height='100%' viewBox='0 0 60 60' space='preserve') svg(v-else version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' width='100%' height='100%' viewBox='0 0 60 60' space='preserve')
use(:xlink:href='`#${$style.iconPic}`') use(:xlink:href='`#${$style.iconPic}`')
div(:class="$style.right") div(:class="$style.right" v-if="!isShowPlayerDetail")
div(:class="$style.column1") div(:class="$style.column1")
div(:class="$style.container") div(:class="$style.container")
div(:class="$style.title" @click="handleCopy(title)" :title="title + $t('core.player.copy_title')") {{title}} div(:class="$style.title" @click="handleCopy(title)" :title="title + $t('core.player.copy_title')") {{title}}
@ -25,14 +25,21 @@ div(:class="$style.player")
svg(v-else version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 170 170' space='preserve') svg(v-else version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 170 170' space='preserve')
use(xlink:href='#icon-play') use(xlink:href='#icon-play')
div(:class="$style.column2") div(:class="$style.column2")
div(:class="$style.progress") div(:class="$style.progress" v-if="!isShowPlayerDetail")
//- div(:class="[$style.progressBar, $style.progressBar1]" :style="{ transform: `scaleX(${progress || 0})` }") //- div(:class="[$style.progressBar, $style.progressBar1]" :style="{ transform: `scaleX(${progress || 0})` }")
div(:class="[$style.progressBar, $style.progressBar2, isActiveTransition ? $style.barTransition : '']" @transitionend="handleTransitionEnd" :style="{ transform: `scaleX(${progress || 0})` }") div(:class="[$style.progressBar, $style.progressBar2, isActiveTransition ? $style.barTransition : '']" @transitionend="handleTransitionEnd" :style="{ transform: `scaleX(${progress || 0})` }")
div(:class="$style.progressMask" @click='setProgess' ref="dom_progress") div(:class="$style.progressMask" @click='handleSetProgress' ref="dom_progress")
div(:class="$style.column3") div(:class="$style.column3")
span {{nowPlayTimeStr}} span {{nowPlayTimeStr}}
span(:class="$style.statusText") {{status}} span(:class="$style.statusText") {{statusText}}
span {{maxPlayTimeStr}} span {{maxPlayTimeStr}}
//- transition(enter-active-class="animated lightSpeedIn"
transition(enter-active-class="animated lightSpeedIn"
leave-active-class="animated slideOutDown")
core-player-detail(v-if="isShowPlayerDetail" :musicInfo="musicInfo"
:lyric="lyric" :list="list" :listId="listId"
:playInfo="{ nowPlayTimeStr, maxPlayTimeStr, progress, nowPlayTime, status }"
:isPlay="isPlay" @action="handlePlayDetailAction")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' style="display: none;") svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' style="display: none;")
defs defs
g(:id="$style.iconPic") g(:id="$style.iconPic")
@ -64,19 +71,21 @@ export default {
nowPlayTime: 0, nowPlayTime: 0,
maxPlayTime: 0, maxPlayTime: 0,
isPlay: false, isPlay: false,
status: '^-^', status: '',
statusText: '^-^',
musicInfo: { musicInfo: {
songmid: null, songmid: null,
img: null, img: null,
lrc: null, lrc: null,
url: null, url: null,
name: '^', name: '',
singer: '^', singer: '',
album: '',
}, },
targetSong: null, targetSong: null,
pregessWidth: 0, pregessWidth: 0,
lyric: { lyric: {
lrc: null, lines: [],
text: '', text: '',
line: 0, line: 0,
}, },
@ -98,14 +107,14 @@ export default {
}, },
computed: { computed: {
...mapGetters(['setting']), ...mapGetters(['setting']),
...mapGetters('player', ['list', 'playIndex', 'changePlay', 'listId']), ...mapGetters('player', ['list', 'playIndex', 'changePlay', 'listId', 'isShowPlayerDetail']),
// pic() { // pic() {
// return this.musicInfo.img ? this.musicInfo.img : '' // return this.musicInfo.img ? this.musicInfo.img : ''
// }, // },
title() { title() {
return this.musicInfo.name return this.musicInfo.name
? `${this.musicInfo.name} - ${this.musicInfo.singer}` ? `${this.musicInfo.name} - ${this.musicInfo.singer}`
: '' : '^-^'
}, },
nowPlayTimeStr() { nowPlayTimeStr() {
return this.nowPlayTime ? formatPlayTime2(this.nowPlayTime) : '00:00' return this.nowPlayTime ? formatPlayTime2(this.nowPlayTime) : '00:00'
@ -123,7 +132,7 @@ export default {
mounted() { mounted() {
this.init() this.init()
this.$nextTick(() => { this.$nextTick(() => {
this.setProgessWidth() this.setProgressWidth()
}) })
this.handleSaveVolume = debounce(volume => { this.handleSaveVolume = debounce(volume => {
this.setVolume(volume) this.setVolume(volume)
@ -190,6 +199,7 @@ export default {
'setPlayIndex', 'setPlayIndex',
'fixPlayIndex', 'fixPlayIndex',
'resetChangePlay', 'resetChangePlay',
'visiblePlayerDetail',
]), ]),
...mapMutations(['setVolume']), ...mapMutations(['setVolume']),
...mapMutations('list', ['updateMusicInfo']), ...mapMutations('list', ['updateMusicInfo']),
@ -205,19 +215,20 @@ export default {
this.audio.addEventListener('playing', () => { this.audio.addEventListener('playing', () => {
console.log('开始播放') console.log('开始播放')
this.status = this.$t('core.player.playing') this.statusText = this.$t('core.player.playing')
this.status = ''
this.startPlay() this.startPlay()
}) })
this.audio.addEventListener('pause', () => { this.audio.addEventListener('pause', () => {
console.log('暂停播放') console.log('暂停播放')
this.lyric.lrc.pause() window.lrc.pause()
this.stopPlay() this.stopPlay()
// this.status = this.$t('core.player.stop') // this.status = this.statusText = this.$t('core.player.stop')
}) })
this.audio.addEventListener('ended', () => { this.audio.addEventListener('ended', () => {
console.log('播放完毕') console.log('播放完毕')
this.stopPlay() this.stopPlay()
this.status = this.$t('core.player.end') this.status = this.statusText = this.$t('core.player.end')
this.handleNext() this.handleNext()
}) })
this.audio.addEventListener('error', () => { this.audio.addEventListener('error', () => {
@ -230,12 +241,12 @@ export default {
if (!this.audioErrorTime) this.audioErrorTime = this.audio.currentTime // if (!this.audioErrorTime) this.audioErrorTime = this.audio.currentTime //
this.retryNum++ this.retryNum++
this.setUrl(this.list[this.playIndex], true) this.setUrl(this.list[this.playIndex], true)
this.status = this.$t('core.player.refresh_url') this.status = this.statusText = this.$t('core.player.refresh_url')
return return
} }
this.sendProgressEvent(this.progress, 'error') this.sendProgressEvent(this.progress, 'error')
this.status = this.$t('core.player.error') this.status = this.statusText = this.$t('core.player.error')
this.addDelayNextTimeout() this.addDelayNextTimeout()
}) })
this.audio.addEventListener('loadeddata', () => { this.audio.addEventListener('loadeddata', () => {
@ -245,10 +256,10 @@ export default {
this.audioErrorTime = 0 this.audioErrorTime = 0
} }
if (!this.targetSong.interval && this.listId != 'download') this.updateMusicInfo({ id: 'default', index: this.playIndex, data: { interval: formatPlayTime2(this.maxPlayTime) } }) if (!this.targetSong.interval && this.listId != 'download') this.updateMusicInfo({ id: 'default', index: this.playIndex, data: { interval: formatPlayTime2(this.maxPlayTime) } })
this.status = this.$t('core.player.loading') this.status = this.statusText = this.$t('core.player.loading')
}) })
this.audio.addEventListener('loadstart', () => { this.audio.addEventListener('loadstart', () => {
this.status = this.$t('core.player.loading') this.status = this.statusText = this.$t('core.player.loading')
}) })
this.audio.addEventListener('canplay', () => { this.audio.addEventListener('canplay', () => {
console.log('加载完成开始播放') console.log('加载完成开始播放')
@ -260,20 +271,20 @@ export default {
if (this.mediaBuffer.timeout) { if (this.mediaBuffer.timeout) {
this.clearBufferTimeout() this.clearBufferTimeout()
} }
// if (this.musicInfo.lrc) this.lyric.lrc.play(this.audio.currentTime * 1000) // if (this.musicInfo.lrc) window.lrc.play(this.audio.currentTime * 1000)
this.status = this.$t('core.player.loading') this.status = this.statusText = this.$t('core.player.loading')
}) })
// this.audio.addEventListener('canplaythrough', () => { // this.audio.addEventListener('canplaythrough', () => {
// console.log('') // console.log('')
// // if (this.musicInfo.lyric.orgLrc) this.musicInfo.lyric.lrc.play(this.audio.currentTime * 1000) // // if (this.musicInfo.lyric.orgLrc) this.musicInfo.lyric.lrc.play(this.audio.currentTime * 1000)
// this.status = '...' // this.status = this.statusText = '...'
// }) // })
this.audio.addEventListener('emptied', () => { this.audio.addEventListener('emptied', () => {
this.mediaBuffer.playTime = 0 this.mediaBuffer.playTime = 0
this.clearBufferTimeout() this.clearBufferTimeout()
// console.log(' or ') // console.log(' or ')
// this.status = '' // this.status = this.statusText = ''
}) })
this.audio.addEventListener('timeupdate', () => { this.audio.addEventListener('timeupdate', () => {
@ -285,17 +296,22 @@ export default {
// console.log('...') // console.log('...')
this.stopPlay() this.stopPlay()
this.startBuffering() this.startBuffering()
this.status = this.$t('core.player.buffering') this.status = this.statusText = this.$t('core.player.buffering')
}) })
this.lyric.lrc = new Lyric({ window.lrc = new Lyric({
onPlay: (line, text) => { onPlay: (line, text) => {
this.lyric.text = text this.lyric.text = text
this.lyric.line = line this.lyric.line = line
this.status = text this.statusText = text
// console.log(line, text) // console.log(line, text)
}, },
offset: 150, onSetLyric: lines => { // listening lyrics seting event
// console.log(lines) // lines is array of all lyric text
this.lyric.lines = lines
this.lyric.line = 0
},
offset: 100,
}) })
}, },
async play() { async play() {
@ -314,6 +330,7 @@ export default {
this.musicInfo.songmid = targetSong.musicInfo.songmid this.musicInfo.songmid = targetSong.musicInfo.songmid
this.musicInfo.singer = targetSong.musicInfo.singer this.musicInfo.singer = targetSong.musicInfo.singer
this.musicInfo.name = targetSong.musicInfo.name this.musicInfo.name = targetSong.musicInfo.name
this.musicInfo.album = targetSong.albumName
this.audio.src = filePath this.audio.src = filePath
// console.log(filePath) // console.log(filePath)
this.setImg(targetSong.musicInfo) this.setImg(targetSong.musicInfo)
@ -322,6 +339,7 @@ export default {
this.musicInfo.songmid = targetSong.songmid this.musicInfo.songmid = targetSong.songmid
this.musicInfo.singer = targetSong.singer this.musicInfo.singer = targetSong.singer
this.musicInfo.name = targetSong.name this.musicInfo.name = targetSong.name
this.musicInfo.album = targetSong.albumName
this.setUrl(targetSong) this.setUrl(targetSong)
this.setImg(targetSong) this.setImg(targetSong)
this.setLrc(targetSong) this.setLrc(targetSong)
@ -341,7 +359,7 @@ export default {
this.handleNext() this.handleNext()
}, 5000) }, 5000)
}, },
async handleNext() { async filterList() {
// if (this.list.listName === null) return // if (this.list.listName === null) return
let list let list
if (this.listId == 'download') { if (this.listId == 'download') {
@ -353,21 +371,23 @@ export default {
} else if (this.isAPITemp) { } else if (this.isAPITemp) {
list = this.list.filter(s => s.source == 'kw') list = this.list.filter(s => s.source == 'kw')
} else { } else {
list = [...this.list] list = this.list
} }
return list
},
async handlePrev() {
// console.log(playIndex)
let list = await this.filterList()
if (!list.length) return this.setPlayIndex(-1) if (!list.length) return this.setPlayIndex(-1)
let playIndex = this.list === list ? this.playIndex : list.indexOf(this.list[this.playIndex]) let playIndex = this.list === list ? this.playIndex : list.indexOf(this.list[this.playIndex])
// console.log(playIndex)
let index let index
switch (this.setting.player.togglePlayMethod) { switch (this.setting.player.togglePlayMethod) {
case 'listLoop':
index = this.hanldeListLoop(list, playIndex)
break
case 'random': case 'random':
index = this.hanldeListRandom(list, playIndex) index = this.hanldeListRandom(list, playIndex)
break break
case 'listLoop':
case 'list': case 'list':
index = this.hanldeListNext(list, playIndex) index = playIndex === 0 ? list.length - 1 : playIndex - 1
break break
default: default:
return return
@ -376,44 +396,62 @@ export default {
if (this.list !== list) index = this.list.indexOf(list[index]) if (this.list !== list) index = this.list.indexOf(list[index])
this.setPlayIndex(index) this.setPlayIndex(index)
}, },
hanldeListLoop(list, index) { async handleNext() {
return index === list.length - 1 ? 0 : index + 1 // if (this.list.listName === null) return
}, let list = await this.filterList()
hanldeListNext(list, index) { if (!list.length) return this.setPlayIndex(-1)
return index === list.length - 1 ? -1 : index + 1 let playIndex = this.list === list ? this.playIndex : list.indexOf(this.list[this.playIndex])
// console.log(playIndex)
let index
switch (this.setting.player.togglePlayMethod) {
case 'listLoop':
index = playIndex === list.length - 1 ? 0 : playIndex + 1
break
case 'random':
index = this.hanldeListRandom(list, playIndex)
break
case 'list':
index = playIndex === list.length - 1 ? -1 : playIndex + 1
break
default:
return
}
if (index < 0) return
if (this.list !== list) index = this.list.indexOf(list[index])
this.setPlayIndex(index)
}, },
hanldeListRandom(list, index) { hanldeListRandom(list, index) {
return getRandom(0, list.length) return getRandom(0, list.length)
}, },
startPlay() { startPlay() {
this.isPlay = true this.isPlay = true
if (this.musicInfo.lrc) this.lyric.lrc.play(this.audio.currentTime * 1000) if (this.musicInfo.lrc) window.lrc.play(this.audio.currentTime * 1000)
this.setAppTitle() this.setAppTitle()
this.sendProgressEvent(this.progress, 'normal') this.sendProgressEvent(this.progress, 'normal')
}, },
stopPlay() { stopPlay() {
this.isPlay = false this.isPlay = false
this.lyric.lrc.pause() window.lrc.pause()
this.sendProgressEvent(this.progress, 'paused') this.sendProgressEvent(this.progress, 'paused')
this.clearAppTitle() this.clearAppTitle()
}, },
setProgess(e) { handleSetProgress(event) {
if (!this.audio.src) return this.setProgress(event.offsetX / this.pregessWidth)
// this.isActiveTransition = true
this.$nextTick(() => {
const time = (e.offsetX / this.pregessWidth) * this.maxPlayTime
if (this.audioErrorTime) this.audioErrorTime = time
if (this.mediaBuffer.playTime) {
this.clearBufferTimeout()
this.mediaBuffer.playTime = time
this.startBuffering()
}
this.audio.currentTime = time
if (!this.isPlay) this.audio.play()
})
}, },
setProgessWidth() { setProgress(pregress) {
if (!this.audio.src) return
const time = pregress * this.maxPlayTime
if (this.audioErrorTime) this.audioErrorTime = time
if (this.mediaBuffer.playTime) {
this.clearBufferTimeout()
this.mediaBuffer.playTime = time
this.startBuffering()
}
this.audio.currentTime = time
if (!this.isPlay) this.audio.play()
},
setProgressWidth() {
this.pregessWidth = parseInt( this.pregessWidth = parseInt(
window.getComputedStyle(this.$refs.dom_progress, null).width, window.getComputedStyle(this.$refs.dom_progress, null).width,
) )
@ -445,14 +483,14 @@ export default {
setUrl(targetSong, isRefresh, isRetryed = false) { setUrl(targetSong, isRefresh, isRetryed = false) {
let type = this.getPlayType(this.setting.player.highQuality, targetSong) let type = this.getPlayType(this.setting.player.highQuality, targetSong)
this.musicInfo.url = targetSong.typeUrl[type] this.musicInfo.url = targetSong.typeUrl[type]
this.status = this.$t('core.player.geting_url') this.status = this.statusText = this.$t('core.player.geting_url')
return this.getUrl({ musicInfo: targetSong, type, isRefresh }).then(() => { return this.getUrl({ musicInfo: targetSong, type, isRefresh }).then(() => {
this.audio.src = this.musicInfo.url = targetSong.typeUrl[type] this.audio.src = this.musicInfo.url = targetSong.typeUrl[type]
}).catch(err => { }).catch(err => {
if (err.message == requestMsg.cancelRequest) return if (err.message == requestMsg.cancelRequest) return
if (!isRetryed) return this.setUrl(targetSong, isRefresh, true) if (!isRetryed) return this.setUrl(targetSong, isRefresh, true)
this.status = err.message this.status = this.statusText = err.message
this.addDelayNextTimeout() this.addDelayNextTimeout()
return Promise.reject(err) return Promise.reject(err)
}) })
@ -477,25 +515,28 @@ export default {
lrcP lrcP
.then(() => { .then(() => {
this.lyric.lrc.setLyric(this.musicInfo.lrc) window.lrc.setLyric(this.musicInfo.lrc)
if (this.isPlay && (this.musicInfo.url || this.listId == 'download')) this.lyric.lrc.play(this.audio.currentTime * 1000) if (this.isPlay && (this.musicInfo.url || this.listId == 'download')) window.lrc.play(this.audio.currentTime * 1000)
}) })
.catch(() => { .catch(() => {
this.status = this.$t('core.player.lyric_error') this.status = this.statusText = this.$t('core.player.lyric_error')
}) })
}, },
handleRemoveMusic() { handleRemoveMusic() {
this.stopPlay() this.stopPlay()
this.audio.src = null this.audio.src = null
this.audio.removeAttribute('src') this.audio.removeAttribute('src')
this.status = '^-^' this.statusText = '^-^'
this.musicInfo.img = null this.musicInfo.img = null
this.musicInfo.name = this.musicInfo.singer = '^' this.status = this.musicInfo.name = this.musicInfo.singer = ''
this.musicInfo.songmid = null this.musicInfo.songmid = null
this.musicInfo.lrc = null this.musicInfo.lrc = null
this.musicInfo.url = null this.musicInfo.url = null
this.nowPlayTime = 0 this.nowPlayTime = 0
this.maxPlayTime = 0 this.maxPlayTime = 0
this.lyric.lines = []
this.lyric.line = 0
this.lyric.text = 0
}, },
sendProgressEvent(status, mode) { sendProgressEvent(status, mode) {
// console.log(status) // console.log(status)
@ -512,7 +553,6 @@ export default {
}, },
handleVolumeMsDown(e) { handleVolumeMsDown(e) {
this.volumeEvent.isMsDown = true this.volumeEvent.isMsDown = true
this.volumeEvent.isMsMoved = false
this.volumeEvent.msDownX = e.clientX this.volumeEvent.msDownX = e.clientX
let val = e.offsetX / 70 let val = e.offsetX / 70
@ -538,7 +578,7 @@ export default {
clipboardWriteText(text) clipboardWriteText(text)
}, },
handleResize() { handleResize() {
this.setProgessWidth() this.setProgressWidth()
}, },
handleToMusicLocation() { handleToMusicLocation() {
if (this.listId == 'download') return if (this.listId == 'download') return
@ -551,6 +591,9 @@ export default {
}, },
}) })
}, },
showPlayerDetail() {
this.visiblePlayerDetail(true)
},
handleTransitionEnd(e) { handleTransitionEnd(e) {
// console.log(e) // console.log(e)
this.isActiveTransition = false this.isActiveTransition = false
@ -593,6 +636,24 @@ export default {
this.setMediaDeviceId('default') this.setMediaDeviceId('default')
}) })
}, },
handlePlayDetailAction({ type, data }) {
switch (type) {
case 'prev':
this.handlePrev()
break
case 'togglePlay':
this.togglePlay()
break
case 'next':
this.handleNext()
break
case 'progress':
this.setProgress(data)
break
case 'volume':
break
}
},
}, },
} }
</script> </script>
@ -609,13 +670,14 @@ export default {
border-top: 2px solid @color-theme; border-top: 2px solid @color-theme;
box-sizing: border-box; box-sizing: border-box;
display: flex; display: flex;
z-index: 1; z-index: 2;
* { * {
box-sizing: border-box; box-sizing: border-box;
} }
} }
.left { .left {
width: @height-player - 2; width: @height-player - 2;
height: @height-player - 2;
color: @color-theme; color: @color-theme;
transition: @transition-theme; transition: @transition-theme;
transition-property: color; transition-property: color;
@ -863,7 +925,6 @@ each(@themes, {
.volume-bar { .volume-bar {
background-color: ~'@{color-@{value}-theme}'; background-color: ~'@{color-@{value}-theme}';
box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);
} }
@ -875,7 +936,6 @@ each(@themes, {
} }
.progress-bar2 { .progress-bar2 {
background-color: ~'@{color-@{value}-player-progress-bar2}'; background-color: ~'@{color-@{value}-player-progress-bar2}';
box-shadow: 0 0 2px rgba(0, 0, 0, 0.2);
} }
.column3 { .column3 {

View File

@ -0,0 +1,706 @@
<template lang="pug">
div(:class="$style.container" @contextmenu="handleContextMenu")
//- div(:class="$style.bg" :style="bgStyle")
//- div(:class="$style.bg2")
div(:class="$style.header")
div(:class="$style.control")
button(type="button" :class="$style.hide" :title="$t('core.player.hide_detail')" @click="visiblePlayerDetail(false)")
button(type="button" :class="$style.min" :title="$t('core.toolbar.min')" @click="min")
//- button(type="button" :class="$style.max" @click="max")
button(type="button" :class="$style.close" :title="$t('core.toolbar.close')" @click="close")
div(:class="$style.main")
div(:class="$style.left")
div(:class="$style.info")
div(:class="$style.img")
img(:src="musicInfo.img" v-if="musicInfo.img")
div(:class="$style.description")
p {{$t('core.player.name')}}{{musicInfo.name}}
p {{$t('core.player.singer')}}{{musicInfo.singer}}
p(v-if="musicInfo.album") {{$t('core.player.album')}}{{musicInfo.album}}
//- div(:class="$style.list")
ul
div(:class="$style.right")
div(:class="[$style.lyric, lyricEvent.isMsDown ? $style.draging : null]" @mousedown="handleLyricMouseDown" ref="dom_lyric")
div(:class="$style.lyricSpace")
p(v-for="(info, index) in lyric.lines" :key="index" :class="lyric.line == index ? $style.lrcActive : null") {{info.text}}
div(:class="$style.lyricSpace")
div(:class="$style.footer")
div(:class="$style.left")
div(:class="$style.progressContainer")
div(:class="$style.progressContent")
div(:class="$style.progress")
//- div(:class="[$style.progressBar, $style.progressBar1]" :style="{ transform: `scaleX(${progress || 0})` }")
div(:class="[$style.progressBar, $style.progressBar2, isActiveTransition ? $style.barTransition : '']" @transitionend="handleTransitionEnd" :style="{ transform: `scaleX(${playInfo.progress || 0})` }")
div(:class="$style.progressMask" @click='setProgress' ref="dom_progress")
div(:class="$style.timeLabel")
span(style="margin-left: 15px") {{playInfo.status}}
div
span {{playInfo.nowPlayTimeStr}}
span(style="margin: 0 5px;") /
span {{playInfo.maxPlayTimeStr}}
div(:class="$style.playControl")
//- div(:class="$style.playBtn")
//- div(:class="$style.playBtn")
div(:class="$style.playBtn" @click="$emit('action', { type: 'prev' })" style="transform: rotate(180deg);" :title="$t('core.player.prev')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 220.847 220.847' space='preserve')
use(xlink:href='#icon-nextMusic')
div(:class="$style.playBtn" :title="isPlay ? $t('core.player.pause') : $t('core.player.play')" @click="$emit('action', { type: 'togglePlay' })")
svg(v-if="isPlay" version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 277.338 277.338' space='preserve')
use(xlink:href='#icon-pause')
svg(v-else version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 170 170' space='preserve')
use(xlink:href='#icon-play')
div(:class="$style.playBtn" @click="$emit('action', { type: 'next' })" :title="$t('core.player.next')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 220.847 220.847' space='preserve')
use(xlink:href='#icon-nextMusic')
</template>
<script>
import { mapGetters, mapMutations } from 'vuex'
import { rendererSend } from 'common/ipc'
import { scrollTo } from '../../utils'
let cancelScrollFn = null
export default {
props: {
musicInfo: {
type: Object,
default() {
return {
songmid: null,
img: null,
lrc: null,
url: null,
name: '^',
singer: '^',
}
},
},
lyric: {
type: Object,
default() {
return {
line: 0,
text: '',
lines: [],
}
},
},
playInfo: {
type: Object,
default() {
return {
nowPlayTimeStr: '00:00',
maxPlayTimeStr: '00:00',
progress: 0,
nowPlayTime: 0,
status: 0,
}
},
},
list: {
type: Array,
default() {
return []
},
},
listId: {
type: String,
default() {
return ''
},
},
isPlay: {
type: Boolean,
default: false,
},
},
watch: {
'musicInfo.img': {
handler(n) {
if (n) {
this.bgStyle.backgroundImage = `url(${n})`
}
},
immediate: true,
},
'lyric.lines': {
handler() {
this.$nextTick(() => {
this.dom_lines = this.$refs.dom_lyric.querySelectorAll('p')
this.handleScrollLrc()
})
},
immediate: true,
},
'lyric.line': {
handler(n) {
this.handleScrollLrc()
},
immediate: true,
},
'playInfo.nowPlayTime'(n, o) {
if (Math.abs(n - o) > 2) this.isActiveTransition = true
},
},
data() {
return {
bgStyle: {
backgroundImage: null,
},
dom_lines: [],
isActiveTransition: false,
pregessWidth: 0,
clickTime: 0,
volumeEvent: {
isMsDown: false,
msDownX: 0,
msDownValue: 0,
},
lyricEvent: {
isMsDown: false,
msDownY: 0,
msDownScrollY: 0,
isStopScroll: false,
timeout: null,
},
}
},
mounted() {
this.$nextTick(() => {
this.setProgressWidth()
})
document.addEventListener('mousemove', this.handleMouseMsMove)
document.addEventListener('mouseup', this.handleMouseMsUp)
window.addEventListener('resize', this.handleResize)
},
beforeDestroy() {
this.clearLyricScrollTimeout()
document.removeEventListener('mousemove', this.handleMouseMsMove)
document.removeEventListener('mouseup', this.handleMouseMsUp)
window.removeEventListener('resize', this.handleResize)
},
computed: {
...mapGetters('player', ['isShowPlayerDetail']),
},
methods: {
...mapMutations('player', [
'visiblePlayerDetail',
]),
handleResize() {
this.setProgressWidth()
},
handleScrollLrc() {
if (!this.dom_lines.length) return
if (cancelScrollFn) {
cancelScrollFn()
cancelScrollFn = null
}
if (this.lyricEvent.isStopScroll) return
let dom_p = this.dom_lines[this.lyric.line]
cancelScrollFn = scrollTo(this.$refs.dom_lyric, dom_p ? (dom_p.offsetTop - this.$refs.dom_lyric.clientHeight * 0.38) : 0)
},
handleTransitionEnd() {
this.isActiveTransition = false
},
setProgress(event) {
this.$emit('action', {
type: 'progress',
data: event.offsetX / this.pregessWidth,
})
},
setProgressWidth() {
this.pregessWidth = parseInt(
window.getComputedStyle(this.$refs.dom_progress, null).width,
)
},
handleContextMenu() {
if (window.performance.now() - this.clickTime > 400) {
this.clickTime = window.performance.now()
return
}
this.clickTime = 0
this.visiblePlayerDetail(false)
},
handleLyricMouseDown(e) {
// console.log(e)
this.lyricEvent.isMsDown = true
this.lyricEvent.msDownY = e.clientY
this.lyricEvent.msDownScrollY = this.$refs.dom_lyric.scrollTop
},
handleMouseMsUp(e) {
this.lyricEvent.isMsDown = this.volumeEvent.isMsDown = false
},
handleMouseMsMove(e) {
if (this.lyricEvent.isMsDown) {
if (!this.lyricEvent.isStopScroll) this.lyricEvent.isStopScroll = true
if (cancelScrollFn) {
cancelScrollFn()
cancelScrollFn = null
}
this.$refs.dom_lyric.scrollTop = this.lyricEvent.msDownScrollY + this.lyricEvent.msDownY - e.clientY
this.startLyricScrollTimeout()
}
// if (this.volumeEvent.isMsDown) {
// let val = this.volumeEvent.msDownValue + (e.clientX - this.volumeEvent.msDownX) / 70
// this.volume = val < 0 ? 0 : val > 1 ? 1 : val
// if (this.audio) this.audio.volume = this.volume
// }
// console.log(val)
},
startLyricScrollTimeout() {
this.clearLyricScrollTimeout()
this.lyricEvent.timeout = setTimeout(() => {
this.lyricEvent.timeout = null
this.lyricEvent.isStopScroll = false
if (!this.isPlay) return
this.handleScrollLrc()
}, 3000)
},
clearLyricScrollTimeout() {
if (!this.lyricEvent.timeout) return
clearTimeout(this.lyricEvent.timeout)
this.lyricEvent.timeout = null
},
min() {
rendererSend('min')
},
max() {
rendererSend('max')
},
close() {
rendererSend('close')
},
},
}
</script>
<style lang="less" module>
@import '../../assets/styles/layout.less';
@control-btn-width: @height-toolbar * .5;
.container {
position: absolute;
display: flex;
flex-flow: column nowrap;
width: 100%;
height: 100%;
top: 0;
left: 0;
background-color: #fff;
z-index: 10;
// -webkit-app-region: drag;
overflow: hidden;
border-radius: 4px;
color: @color-theme_2-font;
border-left: 12px solid @color-theme;
}
.bg {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background-size: 110% 110%;
filter: blur(60px);
z-index: -1;
}
.bg2 {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: -1;
background-color: rgba(255, 255, 255, .8);
}
.header {
position: relative;
flex: 0 0 @height-toolbar;
-webkit-app-region: drag;
}
.control {
position: absolute;
right: 0;
top: 0;
display: flex;
align-items: center;
height: @height-toolbar;
-webkit-app-region: no-drag;
padding: 0 @control-btn-width * 0.6;
&:hover {
button:before {
opacity: 1;
}
}
button {
position: relative;
width: @control-btn-width;
height: @control-btn-width;
background: none;
border: none;
display: flex;
justify-content: center;
align-items: center;
outline: none;
padding: 0;
cursor: pointer;
+ button {
margin-left: @control-btn-width * .4;
}
&:after {
content: ' ';
display: block;
border-radius: 50%;
width: 14px;
height: 14px;
transition: background-color 0.2s ease-in-out;
}
&:before {
display: block;
position: absolute;
opacity: 0;
transition: opacity @transition-theme;
}
&.hide:after {
background-color: @color-hideBtn;
}
&.min:after {
background-color: @color-minBtn;
}
&.max:after {
background-color: @color-maxBtn;
}
&.close:after {
background-color: @color-closeBtn;
}
&.hide:hover:after {
background-color: @color-hideBtn-hover;
}
&.min:hover:after {
background-color: @color-minBtn-hover;
opacity: 1;
}
&.max:hover:after {
background-color: @color-maxBtn-hover;
}
&.close:hover:after {
background-color: @color-closeBtn-hover;
}
}
}
.hide {
&:before {
content: '';
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
font-size: 14px;
line-height: 1;
color: #fff;
}
}
.min {
&:before {
content: ' ';
width: 8px;
height: 2px;
left: @control-btn-width / 2 - 4;
top: @control-btn-width / 2 - 1;
background-color: #fff;
}
}
.close {
&:before {
content: '×';
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
font-size: 14px;
line-height: 1;
color: #fff;
}
}
.main {
flex: auto;
min-height: 0;
overflow: hidden;
display: flex;
padding: 0 30px;
}
.left {
flex: 0 0 40%;
overflow: hidden;
}
.info {
display: flex;
flex-flow: column nowrap;
align-items: center;
}
.img {
width: 300px;
height: 300px;
display: flex;
justify-content: flex-start;
align-items: center;
-webkit-app-region: drag;
img {
max-width: 100%;
max-height: 100%;
border: 5px solid @color-theme-hover;
// border: 5px solid #fff;
}
}
.description {
width: 300px;
padding: 15px 0;
overflow: hidden;
p {
line-height: 1.5;
font-size: 14px;
overflow-wrap: break-word;
}
}
.right {
flex: 0 0 60%;
// padding: 0 30px;
position: relative;
&:before {
position: absolute;
top: 0;
left: 0;
content: ' ';
height: 100px;
width: 100%;
background-image: linear-gradient(0deg,rgba(255,255,255,0) 0%,#fff 95%);
pointer-events: none;
}
&:after {
position: absolute;
bottom: 0;
left: 0;
content: ' ';
height: 100px;
width: 100%;
background-image: linear-gradient(-180deg,rgba(255,255,255,0) 0%,#fff 95%);
pointer-events: none;
}
}
.lyric {
text-align: center;
height: 100%;
overflow: hidden;
font-size: 16px;
cursor: grab;
&.draging {
cursor: grabbing;
}
p {
padding: 8px 0;
line-height: 1.2;
overflow-wrap: break-word;
transition: @transition-theme;
transition-property: color, font-size;
}
}
.lyric-space {
height: 70%;
}
.lrc-active {
color: @color-theme;
font-size: 1.2em;
}
.footer {
flex: 0 0 100px;
overflow: hidden;
display: flex;
align-items: center;
}
.left {
flex: auto;
display: flex;
flex-flow: column nowrap;
align-items: center;
padding-top: 13px;
}
.progress-container {
width: 100%;
position: relative;
padding: 3px 0;
}
.progress-content {
position: relative;
height: 15px;
padding: 5px 0;
width: 100%;
}
.progress {
height: 100%;
width: 100%;
border-radius: 0.2rem;
// overflow: hidden;
transition: @transition-theme;
transition-property: background-color;
background-color: @color-player-progress;
// background-color: #f5f5f5;
position: relative;
border-radius: @radius-progress-border;
}
.progress-mask {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
cursor: pointer;
}
.progress-bar {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
transform-origin: 0;
border-top-right-radius: @radius-progress-border;
border-bottom-right-radius: @radius-progress-border;
}
.progress-bar1 {
background-color: @color-player-progress-bar1;
}
.progress-bar2 {
background-color: @color-player-progress-bar2;
box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);
border-top-right-radius: 20px;
border-bottom-right-radius: 20px;
}
.bar-transition {
transition-property: transform;
transition-timing-function: ease-out;
transition-duration: 0.2s;
}
.time-label {
width: 100%;
display: flex;
justify-content: space-between;
span {
font-size: 13px;
}
}
.play-control {
flex: none;
height: 100%;
display: flex;
justify-content: flex-end;
align-items: center;
padding: 0 25px;
color: @color-btn;
}
.play-btn {
height: 40%;
padding: 5px;
cursor: pointer;
flex: none;
transition: @transition-theme;
transition-property: color;
color: @color-player-detail-play-btn;
transition: opacity 0.1s ease;
opacity: 1;
cursor: pointer;
+.play-btn {
margin-left: 10px;
}
svg {
fill: currentColor;
filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.2));
}
&:hover {
opacity: 0.8;
}
&:active {
opacity: 0.6;
}
}
each(@themes, {
:global(#container.@{value}) {
.container {
border-left-color: ~'@{color-@{value}-theme}';
}
.control {
button {
// &.hide:after {
// background-color: ~'@{color-@{value}-hideBtn}';
// }
&.hide:after {
background-color: ~'@{color-@{value}-hideBtn}';
}
&.min:after {
background-color: ~'@{color-@{value}-minBtn}';
}
&.max:after {
background-color: ~'@{color-@{value}-maxBtn}';
}
&.close:after {
background-color: ~'@{color-@{value}-closeBtn}';
}
&.hide:hover:after {
background-color: ~'@{color-@{value}-hideBtn-hover}';
}
&.min:hover:after {
background-color: ~'@{color-@{value}-minBtn-hover}';
}
&.max:hover:after {
background-color: ~'@{color-@{value}-maxBtn-hover}';
}
&.close:hover:after {
background-color: ~'@{color-@{value}-closeBtn-hover}';
}
}
}
.img {
img {
border-color: ~'@{color-@{value}-theme-hover}';
}
}
.lrc-active {
color: ~'@{color-@{value}-theme}';
}
.progress {
background-color: ~'@{color-@{value}-player-progress}';
}
.progress-bar1 {
background-color: ~'@{color-@{value}-player-progress-bar1}';
}
.progress-bar2 {
background-color: ~'@{color-@{value}-player-progress-bar2}';
}
.play-btn {
color: ~'@{color-@{value}-player-detail-play-btn}';
}
}
})
</style>

View File

@ -141,6 +141,11 @@ export default {
z-index: 2; z-index: 2;
position: relative; position: relative;
} }
:global(.nd) {
.toolbar {
-webkit-app-region: no-drag;
}
}
.input { .input {
-webkit-app-region: no-drag; -webkit-app-region: no-drag;
position: absolute; position: absolute;
@ -166,7 +171,7 @@ export default {
align-items: center; align-items: center;
height: 100%; height: 100%;
-webkit-app-region: no-drag; -webkit-app-region: no-drag;
padding: 0 @control-btn-width / 2; padding: 0 @control-btn-width * 0.6;
&:hover { &:hover {
button:before { button:before {
opacity: 1; opacity: 1;
@ -186,7 +191,7 @@ export default {
padding: 0; padding: 0;
cursor: pointer; cursor: pointer;
+ button { + button {
margin-left: @control-btn-width / 2; margin-left: @control-btn-width * 0.4;
} }
&:after { &:after {

View File

@ -3,6 +3,7 @@
"volume": "当前音量:", "volume": "当前音量:",
"pause": "暂停", "pause": "暂停",
"play": "播放", "play": "播放",
"prev": "上一首",
"next": "下一首", "next": "下一首",
"playing": "播放中...", "playing": "播放中...",
"stop": "暂停播放", "stop": "暂停播放",
@ -12,5 +13,9 @@
"loading": "音乐加载中...", "loading": "音乐加载中...",
"buffering": "缓冲中...", "buffering": "缓冲中...",
"geting_url": "歌曲链接获取中...", "geting_url": "歌曲链接获取中...",
"lyric_error": "歌词获取失败" "lyric_error": "歌词获取失败",
"hide_detail": "隐藏详情页",
"name": "歌曲名:",
"singer": "艺术家:",
"album": "专辑名:"
} }

View File

@ -3,6 +3,7 @@
"volume": "當前音量:", "volume": "當前音量:",
"pause": "暫停", "pause": "暫停",
"play": "播放", "play": "播放",
"prev": "上一首",
"next": "下一首", "next": "下一首",
"playing": "播放中...", "playing": "播放中...",
"stop": "暫停播放", "stop": "暫停播放",
@ -12,5 +13,9 @@
"loading": "音樂加載中...", "loading": "音樂加載中...",
"buffering": "緩衝中...", "buffering": "緩衝中...",
"geting_url": "歌曲鏈接獲取中...", "geting_url": "歌曲鏈接獲取中...",
"lyric_error": "歌詞獲取失敗" "lyric_error": "歌詞獲取失敗",
"hide_detail": "隱藏詳情頁",
"name": "歌曲名:",
"singer": "藝術家:",
"album": "專輯名:"
} }

View File

@ -3,6 +3,7 @@
"volume": "Volume: ", "volume": "Volume: ",
"pause": "Pause", "pause": "Pause",
"play": "Play", "play": "Play",
"prev": "Prev",
"next": "Next", "next": "Next",
"playing": "Now playing...", "playing": "Now playing...",
"stop": "Paused", "stop": "Paused",
@ -12,5 +13,9 @@
"loading": "Music loading...", "loading": "Music loading...",
"buffering": "Buffering...", "buffering": "Buffering...",
"geting_url": "Getting music link...", "geting_url": "Getting music link...",
"lyric_error": "Failed to get lyrics" "lyric_error": "Failed to get lyrics",
"hide_detail": "Hide detail page",
"name": "Name: ",
"singer": "Artist: ",
"album": "Album: "
} }

View File

@ -6,6 +6,7 @@ const state = {
listId: null, listId: null,
playIndex: -1, playIndex: -1,
changePlay: false, changePlay: false,
isShowPlayerDetail: false,
} }
let urlRequest let urlRequest
@ -18,6 +19,7 @@ const getters = {
listId: state => state.listId, listId: state => state.listId,
changePlay: satte => satte.changePlay, changePlay: satte => satte.changePlay,
playIndex: state => state.playIndex, playIndex: state => state.playIndex,
isShowPlayerDetail: state => state.isShowPlayerDetail,
} }
// actions // actions
@ -87,6 +89,9 @@ const mutations = {
resetChangePlay(state) { resetChangePlay(state) {
state.changePlay = false state.changePlay = false
}, },
visiblePlayerDetail(state, visible) {
state.isShowPlayerDetail = visible
},
} }
export default { export default {

View File

@ -65,6 +65,7 @@ const easeInOutQuad = (t, b, c, d) => {
export const scrollTo = (element, to, duration = 300, fn = () => {}) => { export const scrollTo = (element, to, duration = 300, fn = () => {}) => {
if (!element) return if (!element) return
const start = element.scrollTop || element.scrollY || 0 const start = element.scrollTop || element.scrollY || 0
let cancel = false
if (to > start) { if (to > start) {
let maxScrollTop = element.scrollHeight - element.clientHeight let maxScrollTop = element.scrollHeight - element.clientHeight
if (to > maxScrollTop) to = maxScrollTop if (to > maxScrollTop) to = maxScrollTop
@ -87,12 +88,16 @@ export const scrollTo = (element, to, duration = 300, fn = () => {}) => {
element.scrollTop = val element.scrollTop = val
} }
if (currentTime < duration) { if (currentTime < duration) {
if (cancel) return fn()
setTimeout(animateScroll, increment) setTimeout(animateScroll, increment)
} else { } else {
fn() fn()
} }
} }
animateScroll() animateScroll()
return () => {
cancel = true
}
} }
/** /**