Merge branch 'dev'
commit
0f323ce04f
|
@ -34,7 +34,7 @@ assignees: ''
|
||||||
|
|
||||||
**环境:**
|
**环境:**
|
||||||
-操作系统及版本:[例如:Windows 10 64位 18362.156]
|
-操作系统及版本:[例如:Windows 10 64位 18362.156]
|
||||||
-软件安装包及版本:[例如:Windows 64位绿色版 1.0.0]
|
-软件安装包及版本:[例如:1.0.0 安装版]
|
||||||
|
|
||||||
|
|
||||||
**其他内容**
|
**其他内容**
|
||||||
|
|
22
FAQ.md
22
FAQ.md
|
@ -98,10 +98,24 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看下面的
|
||||||
|
|
||||||
### Linux 系统下桌面歌词窗口异常
|
### Linux 系统下桌面歌词窗口异常
|
||||||
|
|
||||||
目前在 Ubuntu 18.10 下第一次开启桌面歌词时歌词窗口会变白,需要关闭后再开启,
|
`v1.2.1`以前的版本在 Ubuntu 18.10 下第一次开启桌面歌词时歌词窗口会变白,需要关闭后再开启,
|
||||||
|
`v1.2.1`及之后的版本已修复该问题。
|
||||||
|
|
||||||
其他 Linux 系统未测试,如有异常也是意料之中,目前不打算去处理 Linux 平台的桌面歌词问题。
|
其他 Linux 系统未测试,如有异常也是意料之中,目前不打算去处理 Linux 平台的桌面歌词问题。
|
||||||
|
|
||||||
|
## 歌曲下载失败
|
||||||
|
|
||||||
|
### 提示 `ENOENT: no such file or directory, mkdir`
|
||||||
|
|
||||||
|
更换下载歌曲目录即可解决(一般是设置的歌曲下载目录没有读写入权限导致的)。
|
||||||
|
|
||||||
|
### 提示 `请求异常` 或 `Fail`
|
||||||
|
|
||||||
|
尝试更换网络,如切换到移动网络。
|
||||||
|
|
||||||
|
### 其他错误
|
||||||
|
|
||||||
|
按照前面的 "歌曲无法试听与下载" 方案解决。
|
||||||
|
|
||||||
## 软件安装包说明
|
## 软件安装包说明
|
||||||
|
|
||||||
|
@ -125,6 +139,12 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看下面的
|
||||||
注意:**绿色版**的软件自动更新功能**不可用**,建议使用安装版!!<br>
|
注意:**绿色版**的软件自动更新功能**不可用**,建议使用安装版!!<br>
|
||||||
注意:**Mac版**、**Linux deb**版不支持自动更新!
|
注意:**Mac版**、**Linux deb**版不支持自动更新!
|
||||||
|
|
||||||
|
## 更新已收藏的在线歌单
|
||||||
|
|
||||||
|
该功能仅对直接从歌单详情页点“收藏”按钮收藏的歌单有效,可右击已收藏的列表名从弹出的菜单中选择“同步”使用该功能,
|
||||||
|
|
||||||
|
需要注意的是:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表。
|
||||||
|
|
||||||
## 缺少`xxx.dll`
|
## 缺少`xxx.dll`
|
||||||
|
|
||||||
这个是电脑缺少某些dll导致的,正常的系统是没有这个问题的,可以尝试如下几个解决办法:
|
这个是电脑缺少某些dll导致的,正常的系统是没有这个问题的,可以尝试如下几个解决办法:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "lx-music-desktop",
|
"name": "lx-music-desktop",
|
||||||
"version": "1.5.0-beta",
|
"version": "1.6.0-beta",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -7239,9 +7239,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"electron": {
|
"electron": {
|
||||||
"version": "9.3.3",
|
"version": "9.4.0",
|
||||||
"resolved": "https://registry.npm.taobao.org/electron/download/electron-9.3.3.tgz",
|
"resolved": "https://registry.npm.taobao.org/electron/download/electron-9.4.0.tgz?cache=0&sync_timestamp=1608583696623&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron%2Fdownload%2Felectron-9.4.0.tgz",
|
||||||
"integrity": "sha1-maZhnV32j5dpel0dgu86imP83zY=",
|
"integrity": "sha1-w8YH41mCJt26r/i6vN/6i7IhCTY=",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@electron/get": "^1.0.1",
|
"@electron/get": "^1.0.1",
|
||||||
|
@ -7250,9 +7250,9 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "12.19.8",
|
"version": "12.19.9",
|
||||||
"resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-12.19.8.tgz?cache=0&sync_timestamp=1607590769174&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-12.19.8.tgz",
|
"resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-12.19.9.tgz?cache=0&sync_timestamp=1608047797419&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-12.19.9.tgz",
|
||||||
"integrity": "sha1-79bRqQUlUZ/GCMnbFsinj3aTqXg=",
|
"integrity": "sha1-mQrWh62LJu9tzDSk9pwz1AyVtnk=",
|
||||||
"dev": true
|
"dev": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8686,7 +8686,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"debug": {
|
"debug": {
|
||||||
"version": "2.6.9",
|
"version": "2.6.9",
|
||||||
"resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1607566533140&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
|
"resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
|
||||||
"integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
|
"integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
|
@ -8695,7 +8695,7 @@
|
||||||
},
|
},
|
||||||
"ms": {
|
"ms": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433842694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
|
"resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
|
||||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
|
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
|
||||||
"dev": true
|
"dev": true
|
||||||
}
|
}
|
||||||
|
@ -12103,9 +12103,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node-id3": {
|
"node-id3": {
|
||||||
"version": "0.1.21",
|
"version": "0.1.19",
|
||||||
"resolved": "https://registry.npm.taobao.org/node-id3/download/node-id3-0.1.21.tgz",
|
"resolved": "https://registry.npm.taobao.org/node-id3/download/node-id3-0.1.19.tgz",
|
||||||
"integrity": "sha1-bp+8x68J9lEUkJoR90otcLVFu/M=",
|
"integrity": "sha1-cQAMuCna3HYQAKSBAV5T88ydqto=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"iconv-lite": "0.5.1"
|
"iconv-lite": "0.5.1"
|
||||||
},
|
},
|
||||||
|
@ -14770,7 +14770,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"type-fest": {
|
"type-fest": {
|
||||||
"version": "0.13.1",
|
"version": "0.13.1",
|
||||||
"resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.13.1.tgz?cache=0&sync_timestamp=1606468844109&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype-fest%2Fdownload%2Ftype-fest-0.13.1.tgz",
|
"resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.13.1.tgz?cache=0&sync_timestamp=1602623859603&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype-fest%2Fdownload%2Ftype-fest-0.13.1.tgz",
|
||||||
"integrity": "sha1-AXLLW86AsL1ULqNI21DH4hg02TQ=",
|
"integrity": "sha1-AXLLW86AsL1ULqNI21DH4hg02TQ=",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"optional": true
|
"optional": true
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "lx-music-desktop",
|
"name": "lx-music-desktop",
|
||||||
"version": "1.5.0",
|
"version": "1.6.0-beta",
|
||||||
"description": "一个免费的音乐下载助手",
|
"description": "一个免费的音乐下载助手",
|
||||||
"main": "./dist/electron/main.js",
|
"main": "./dist/electron/main.js",
|
||||||
"productName": "lx-music-desktop",
|
"productName": "lx-music-desktop",
|
||||||
|
@ -178,7 +178,7 @@
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"css-loader": "^4.3.0",
|
"css-loader": "^4.3.0",
|
||||||
"del": "^6.0.0",
|
"del": "^6.0.0",
|
||||||
"electron": "^9.3.3",
|
"electron": "^9.4.0",
|
||||||
"electron-builder": "^22.9.1",
|
"electron-builder": "^22.9.1",
|
||||||
"electron-debug": "^3.1.0",
|
"electron-debug": "^3.1.0",
|
||||||
"electron-devtools-installer": "^3.1.1",
|
"electron-devtools-installer": "^3.1.1",
|
||||||
|
|
|
@ -1,14 +1,8 @@
|
||||||
### 新增
|
### 新增
|
||||||
|
|
||||||
- 直接从歌单详情收藏的列表新增同步功能。注意:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表
|
- 我的列表右键菜单新增列表排序功能,可调整单曲、多选后的歌曲的顺序。注意:多选排序还将会按照选中歌曲时的顺序排序
|
||||||
|
|
||||||
### 优化
|
|
||||||
|
|
||||||
- 优化软件启动时恢复上一次播放的歌曲进度功能
|
|
||||||
|
|
||||||
### 修复
|
### 修复
|
||||||
|
|
||||||
- 修复MAC平台上下载歌曲封面嵌入无法显示的问题
|
- 修复恢复上次播放的歌曲时在随机播放模式下不把恢复播放的歌曲放入已播放队列的问题(该问题会导致随机模式下会导致未播放完整个列表前就会再次随机到该歌曲,以及无法通过上一曲切回该歌曲)
|
||||||
- 修复MAC平台首次运行软件最小化、关闭控制按钮默认在右边的问题
|
- 修复音乐嵌入的封面在 Mac 系统无法显示的问题
|
||||||
- 修复酷狗源的某些歌曲没有专辑字段导致的列表加载失败问题
|
|
||||||
- 修复某些酷狗源歌单链接无法打开的问题
|
|
||||||
|
|
|
@ -264,6 +264,7 @@ export default {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.sendProgressEvent(this.progress, 'paused')
|
this.sendProgressEvent(this.progress, 'paused')
|
||||||
})
|
})
|
||||||
|
if (this.setting.player.togglePlayMethod == 'random') this.setPlayedList(musicInfo)
|
||||||
window.restorePlayInfo = null
|
window.restorePlayInfo = null
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template lang="pug">
|
<template lang="pug">
|
||||||
input(:class="$style.input" :type="type" :placeholder="placeholder" :value="value" :disabled="disabled"
|
input(:class="$style.input" ref="dom_input" :type="type" :placeholder="placeholder" :value="value" :disabled="disabled"
|
||||||
@focus="$emit('focus', $event)" @blur="$emit('blur', $event)" @input="$emit('input', $event.target.value.trim())" @change="$emit('change', $event.target.value.trim())"
|
@focus="$emit('focus', $event)" @blur="$emit('blur', $event)" @input="handleInput" @change="$emit('change', $event.target.value.trim())"
|
||||||
@keyup.enter="$emit('submit', $event.target.value.trim())")
|
@keyup.enter="$emit('submit', $event.target.value.trim())")
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -24,6 +24,16 @@ export default {
|
||||||
default: 'text',
|
default: 'text',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
methods: {
|
||||||
|
handleInput(event) {
|
||||||
|
let value = event.target.value.trim()
|
||||||
|
event.target.value = value
|
||||||
|
this.$emit('input', value)
|
||||||
|
},
|
||||||
|
focus() {
|
||||||
|
this.$refs.dom_input.focus()
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -41,6 +51,13 @@ export default {
|
||||||
transition: background-color 0.2s ease;
|
transition: background-color 0.2s ease;
|
||||||
background-color: @color-btn-background;
|
background-color: @color-btn-background;
|
||||||
font-size: 13.3px;
|
font-size: 13.3px;
|
||||||
|
|
||||||
|
&::-webkit-outer-spin-button,
|
||||||
|
&::-webkit-inner-spin-button {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
&[disabled] {
|
&[disabled] {
|
||||||
opacity: .4;
|
opacity: .4;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,121 @@
|
||||||
|
<template lang="pug">
|
||||||
|
material-modal(:show="show" @close="handleClose")
|
||||||
|
main(:class="$style.main")
|
||||||
|
h2 {{selectedNum > 0 ? $t('material.list_sort_modal.title_multiple', { num: selectedNum }) : $t('material.list_sort_modal.title', { name: musicInfo ? musicInfo.name : '' })}}
|
||||||
|
material-input(:class="$style.input" type="number" v-model="sortNum" ref="input" @blur.native="verify" :placeholder="$t('material.list_sort_modal.input_tip')" @keydown.native.enter="handleSubmit")
|
||||||
|
div(:class="$style.footer")
|
||||||
|
material-btn(:class="$style.btn" @click="handleSubmit") {{$t('material.list_sort_modal.btn_confirm')}}
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
show: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
musicInfo: {
|
||||||
|
type: Object,
|
||||||
|
default() {
|
||||||
|
return {}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
selectedNum: {
|
||||||
|
type: Number,
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
sortNum: '',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
show(n) {
|
||||||
|
if (n) {
|
||||||
|
this.sortNum = ''
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.input.focus()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleClose() {
|
||||||
|
this.$emit('close')
|
||||||
|
},
|
||||||
|
verify() {
|
||||||
|
let num = /^[1-9]\d*/.exec(this.sortNum)
|
||||||
|
num = num ? parseInt(num[0]) : ''
|
||||||
|
this.sortNum = num.toString()
|
||||||
|
return num
|
||||||
|
},
|
||||||
|
handleSubmit() {
|
||||||
|
let num = this.verify()
|
||||||
|
if (this.sortNum == '') return
|
||||||
|
this.$emit('confirm', num)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="less" module>
|
||||||
|
@import '../../assets/styles/layout.less';
|
||||||
|
|
||||||
|
.main {
|
||||||
|
padding: 0 15px;
|
||||||
|
max-width: 530px;
|
||||||
|
min-width: 280px;
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column nowrap;
|
||||||
|
min-height: 0;
|
||||||
|
// max-height: 100%;
|
||||||
|
// overflow: hidden;
|
||||||
|
h2 {
|
||||||
|
font-size: 13px;
|
||||||
|
color: @color-theme_2-font;
|
||||||
|
line-height: 1.3;
|
||||||
|
word-break: break-all;
|
||||||
|
// text-align: center;
|
||||||
|
padding: 15px 0 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.input {
|
||||||
|
// width: 100%;
|
||||||
|
// height: 26px;
|
||||||
|
padding: 8px 8px;
|
||||||
|
}
|
||||||
|
.footer {
|
||||||
|
margin: 20px 0 15px auto;
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
// box-sizing: border-box;
|
||||||
|
// margin-left: 15px;
|
||||||
|
// margin-bottom: 15px;
|
||||||
|
// height: 36px;
|
||||||
|
// line-height: 36px;
|
||||||
|
// padding: 0 10px !important;
|
||||||
|
min-width: 70px;
|
||||||
|
// .mixin-ellipsis-1;
|
||||||
|
|
||||||
|
+.btn {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
each(@themes, {
|
||||||
|
:global(#container.@{value}) {
|
||||||
|
.main {
|
||||||
|
h2 {
|
||||||
|
color: ~'@{color-@{value}-theme_2-font}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
</style>
|
|
@ -138,10 +138,10 @@ export default {
|
||||||
// will-change: transform;
|
// will-change: transform;
|
||||||
li {
|
li {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
min-width: 80px;
|
min-width: 90px;
|
||||||
line-height: 34px;
|
line-height: 34px;
|
||||||
// color: @color-btn;
|
// color: @color-btn;
|
||||||
padding: 0 5px;
|
padding: 0 10px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
outline: none;
|
outline: none;
|
||||||
transition: @transition-theme;
|
transition: @transition-theme;
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"title": "Adjust the position of {name} to:",
|
||||||
|
"title_multiple": "Adjust the position of the selected {num} songs to:",
|
||||||
|
"input_tip": "Please input which position you want to adjust to",
|
||||||
|
"btn_confirm": "Confirm"
|
||||||
|
}
|
|
@ -10,6 +10,7 @@
|
||||||
"list_copy_name": "Copy name",
|
"list_copy_name": "Copy name",
|
||||||
"list_add_to": "Add to ...",
|
"list_add_to": "Add to ...",
|
||||||
"list_move_to": "Move to ...",
|
"list_move_to": "Move to ...",
|
||||||
|
"list_sort": "Adjust position",
|
||||||
"list_download": "Download",
|
"list_download": "Download",
|
||||||
"list_remove": "Remove",
|
"list_remove": "Remove",
|
||||||
"list_source_detail": "Song Page",
|
"list_source_detail": "Song Page",
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"title": "将 {name} 的位置调整到:",
|
||||||
|
"title_multiple": "将已选的 {num} 首歌曲的位置调整到:",
|
||||||
|
"input_tip": "请输入要调整到第几个位置",
|
||||||
|
"btn_confirm": "确定"
|
||||||
|
}
|
|
@ -11,6 +11,7 @@
|
||||||
"list_source_detail": "歌曲详情页",
|
"list_source_detail": "歌曲详情页",
|
||||||
"list_add_to": "添加到...",
|
"list_add_to": "添加到...",
|
||||||
"list_move_to": "移动到...",
|
"list_move_to": "移动到...",
|
||||||
|
"list_sort": "调整位置",
|
||||||
"list_download": "下载",
|
"list_download": "下载",
|
||||||
"list_remove": "删除",
|
"list_remove": "删除",
|
||||||
"default_list": "试听列表",
|
"default_list": "试听列表",
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"title": "將 {name} 的位置調整到:",
|
||||||
|
"title_multiple": "將已選的 {num} 首歌曲的位置調整到:",
|
||||||
|
"input_tip": "請輸入要調整到第幾個位置",
|
||||||
|
"btn_confirm": "確定"
|
||||||
|
}
|
|
@ -10,6 +10,7 @@
|
||||||
"list_copy_name": "複製歌曲名",
|
"list_copy_name": "複製歌曲名",
|
||||||
"list_add_to": "添加到...",
|
"list_add_to": "添加到...",
|
||||||
"list_move_to": "移動到...",
|
"list_move_to": "移動到...",
|
||||||
|
"list_sort": "調整位置",
|
||||||
"list_download": "下載",
|
"list_download": "下載",
|
||||||
"list_remove": "刪除",
|
"list_remove": "刪除",
|
||||||
"list_source_detail": "歌曲詳情頁",
|
"list_source_detail": "歌曲詳情頁",
|
||||||
|
|
|
@ -4,11 +4,14 @@ import { debounce } from '../../utils'
|
||||||
let instance
|
let instance
|
||||||
let prevTips
|
let prevTips
|
||||||
|
|
||||||
const getTips = el => el.getAttribute('tips')
|
const getTips = el =>
|
||||||
|
el
|
||||||
|
? el.getAttribute('tips')
|
||||||
? el.getAttribute('tips')
|
? el.getAttribute('tips')
|
||||||
: el.parentNode === document.documentElement
|
: el.parentNode === document.documentElement
|
||||||
? null
|
? null
|
||||||
: getTips(el.parentNode)
|
: getTips(el.parentNode)
|
||||||
|
: null
|
||||||
|
|
||||||
const showTips = debounce(event => {
|
const showTips = debounce(event => {
|
||||||
let msg = getTips(event.target)
|
let msg = getTips(event.target)
|
||||||
|
|
|
@ -185,6 +185,12 @@ const mutations = {
|
||||||
setListScroll(state, { id, location }) {
|
setListScroll(state, { id, location }) {
|
||||||
if (allList[id]) allList[id].location = location
|
if (allList[id]) allList[id].location = location
|
||||||
},
|
},
|
||||||
|
sortList(state, { id, sortNum, musicInfos }) {
|
||||||
|
let targetList = allList[id]
|
||||||
|
this.commit('list/listRemoveMultiple', { id, list: musicInfos })
|
||||||
|
|
||||||
|
targetList.list.splice(sortNum - 1, 0, ...musicInfos)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
material-menu(:menus="listsItemMenu" :location="listsData.menuLocation" item-name="name" :isShow="listsData.isShowItemMenu" @menu-click="handleListsItemMenuClick")
|
material-menu(:menus="listsItemMenu" :location="listsData.menuLocation" item-name="name" :isShow="listsData.isShowItemMenu" @menu-click="handleListsItemMenuClick")
|
||||||
material-menu(:menus="listItemMenu" :location="listMenu.menuLocation" item-name="name" :isShow="listMenu.isShowItemMenu" @menu-click="handleListItemMenuClick")
|
material-menu(:menus="listItemMenu" :location="listMenu.menuLocation" item-name="name" :isShow="listMenu.isShowItemMenu" @menu-click="handleListItemMenuClick")
|
||||||
material-search-list(:list="list" @action="handleMusicSearchAction" :visible="isVisibleMusicSearch")
|
material-search-list(:list="list" @action="handleMusicSearchAction" :visible="isVisibleMusicSearch")
|
||||||
|
material-list-sort-modal(:show="isShowListSortModal" :music-info="musicInfo" :selected-num="selectdListDetailData.length" @close="isShowListSortModal = false" @confirm="handleSortMusicInfo")
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
@ -91,6 +92,7 @@ export default {
|
||||||
delayShow: false,
|
delayShow: false,
|
||||||
isShowListAdd: false,
|
isShowListAdd: false,
|
||||||
isShowListAddMultiple: false,
|
isShowListAddMultiple: false,
|
||||||
|
isShowListSortModal: false,
|
||||||
delayTimeout: null,
|
delayTimeout: null,
|
||||||
isToggleList: true,
|
isToggleList: true,
|
||||||
focusTarget: 'listDetail',
|
focusTarget: 'listDetail',
|
||||||
|
@ -123,6 +125,7 @@ export default {
|
||||||
copyName: true,
|
copyName: true,
|
||||||
addTo: true,
|
addTo: true,
|
||||||
moveTo: true,
|
moveTo: true,
|
||||||
|
sort: true,
|
||||||
download: true,
|
download: true,
|
||||||
remove: true,
|
remove: true,
|
||||||
sourceDetail: true,
|
sourceDetail: true,
|
||||||
|
@ -229,6 +232,11 @@ export default {
|
||||||
action: 'sourceDetail',
|
action: 'sourceDetail',
|
||||||
disabled: !this.listMenu.itemMenuControl.sourceDetail,
|
disabled: !this.listMenu.itemMenuControl.sourceDetail,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: this.$t('view.list.list_sort'),
|
||||||
|
action: 'sort',
|
||||||
|
disabled: !this.listMenu.itemMenuControl.sort,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: this.$t('view.list.list_add_to'),
|
name: this.$t('view.list.list_add_to'),
|
||||||
action: 'addTo',
|
action: 'addTo',
|
||||||
|
@ -280,6 +288,12 @@ export default {
|
||||||
this.handleDelayShow()
|
this.handleDelayShow()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
this.isShowDownload = false
|
||||||
|
this.isShowDownloadMultiple = false
|
||||||
|
this.isShowListAdd = false
|
||||||
|
this.isShowListAddMultiple = false
|
||||||
|
this.isShowListSortModal = false
|
||||||
|
this.listMenu.isShowItemMenu = false
|
||||||
next()
|
next()
|
||||||
},
|
},
|
||||||
// mounted() {
|
// mounted() {
|
||||||
|
@ -329,6 +343,7 @@ export default {
|
||||||
'removeUserList',
|
'removeUserList',
|
||||||
'setListScroll',
|
'setListScroll',
|
||||||
'setList',
|
'setList',
|
||||||
|
'sortList',
|
||||||
]),
|
]),
|
||||||
...mapActions('songList', ['getListDetailAll']),
|
...mapActions('songList', ['getListDetailAll']),
|
||||||
...mapActions('download', ['createDownload', 'createDownloadMultiple']),
|
...mapActions('download', ['createDownload', 'createDownloadMultiple']),
|
||||||
|
@ -809,6 +824,20 @@ export default {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
case 'sort':
|
||||||
|
this.isShowListSortModal = true
|
||||||
|
this.musicInfo = this.list[index]
|
||||||
|
// if (this.selectdListDetailData.length) {
|
||||||
|
// this.isShowDownloadMultiple = true
|
||||||
|
// } else {
|
||||||
|
// minfo = this.list[index]
|
||||||
|
// if (!this.assertApiSupport(minfo.source)) return
|
||||||
|
// this.musicInfo = minfo
|
||||||
|
// this.$nextTick(() => {
|
||||||
|
// this.isShowDownload = true
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
break
|
||||||
case 'remove':
|
case 'remove':
|
||||||
if (this.selectdListDetailData.length) {
|
if (this.selectdListDetailData.length) {
|
||||||
this.listRemoveMultiple({ id: this.listId, list: this.selectdListDetailData })
|
this.listRemoveMultiple({ id: this.listId, list: this.selectdListDetailData })
|
||||||
|
@ -846,21 +875,30 @@ export default {
|
||||||
} else {
|
} else {
|
||||||
this.fetchingListStatus[id] = true
|
this.fetchingListStatus[id] = true
|
||||||
}
|
}
|
||||||
return this.getListDetailAll({ source, id: sourceListId }).catch(err => {
|
return this.getListDetailAll({ source, id: sourceListId }).finally(() => {
|
||||||
return Promise.reject(err)
|
|
||||||
}).finally(() => {
|
|
||||||
this.fetchingListStatus[id] = false
|
this.fetchingListStatus[id] = false
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
async handleSyncSourceList(index) {
|
async handleSyncSourceList(index) {
|
||||||
const targetList = this.userList[index]
|
const targetListInfo = this.userList[index]
|
||||||
const list = await this.fetchList(targetList.id, targetList.source, targetList.sourceListId)
|
const list = await this.fetchList(targetListInfo.id, targetListInfo.source, targetListInfo.sourceListId)
|
||||||
// console.log(targetList.list.length, list.length)
|
// console.log(targetListInfo.list.length, list.length)
|
||||||
|
this.removeAllSelectListDetail()
|
||||||
this.setList({
|
this.setList({
|
||||||
...targetList,
|
...targetListInfo,
|
||||||
list,
|
list,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
handleSortMusicInfo(num) {
|
||||||
|
num = Math.min(num, this.list.length)
|
||||||
|
this.sortList({
|
||||||
|
id: this.listId,
|
||||||
|
sortNum: num,
|
||||||
|
musicInfos: this.selectdListDetailData.length ? [...this.selectdListDetailData] : [this.musicInfo],
|
||||||
|
})
|
||||||
|
this.removeAllSelectListDetail()
|
||||||
|
this.isShowListSortModal = false
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -405,9 +405,7 @@ export default {
|
||||||
},
|
},
|
||||||
async fetchList() {
|
async fetchList() {
|
||||||
this.detailLoading = true
|
this.detailLoading = true
|
||||||
return this.getListDetailAll({ source: this.source, id: this.selectListInfo.id }).catch(err => {
|
return this.getListDetailAll({ source: this.source, id: this.selectListInfo.id }).finally(() => {
|
||||||
return Promise.reject(err)
|
|
||||||
}).finally(() => {
|
|
||||||
this.detailLoading = false
|
this.detailLoading = false
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue