diff --git a/.github/ISSUE_TEMPLATE/--bug.md b/.github/ISSUE_TEMPLATE/--bug.md
index be948180..f0a8160b 100644
--- a/.github/ISSUE_TEMPLATE/--bug.md
+++ b/.github/ISSUE_TEMPLATE/--bug.md
@@ -34,7 +34,7 @@ assignees: ''
**环境:**
-操作系统及版本:[例如:Windows 10 64位 18362.156]
- -软件安装包及版本:[例如:Windows 64位绿色版 1.0.0]
+ -软件安装包及版本:[例如:1.0.0 安装版]
**其他内容**
diff --git a/FAQ.md b/FAQ.md
index 9c808d33..9c17aaf2 100644
--- a/FAQ.md
+++ b/FAQ.md
@@ -98,10 +98,24 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看下面的
### Linux 系统下桌面歌词窗口异常
-目前在 Ubuntu 18.10 下第一次开启桌面歌词时歌词窗口会变白,需要关闭后再开启,
+`v1.2.1`以前的版本在 Ubuntu 18.10 下第一次开启桌面歌词时歌词窗口会变白,需要关闭后再开启,
+`v1.2.1`及之后的版本已修复该问题。
其他 Linux 系统未测试,如有异常也是意料之中,目前不打算去处理 Linux 平台的桌面歌词问题。
+## 歌曲下载失败
+
+### 提示 `ENOENT: no such file or directory, mkdir`
+
+更换下载歌曲目录即可解决(一般是设置的歌曲下载目录没有读写入权限导致的)。
+
+### 提示 `请求异常` 或 `Fail`
+
+尝试更换网络,如切换到移动网络。
+
+### 其他错误
+
+按照前面的 "歌曲无法试听与下载" 方案解决。
## 软件安装包说明
@@ -125,6 +139,12 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看下面的
注意:**绿色版**的软件自动更新功能**不可用**,建议使用安装版!!
注意:**Mac版**、**Linux deb**版不支持自动更新!
+## 更新已收藏的在线歌单
+
+该功能仅对直接从歌单详情页点“收藏”按钮收藏的歌单有效,可右击已收藏的列表名从弹出的菜单中选择“同步”使用该功能,
+
+需要注意的是:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表。
+
## 缺少`xxx.dll`
这个是电脑缺少某些dll导致的,正常的系统是没有这个问题的,可以尝试如下几个解决办法:
diff --git a/package-lock.json b/package-lock.json
index f207b79a..ad704f7b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "lx-music-desktop",
- "version": "1.5.0-beta",
+ "version": "1.6.0-beta",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -7239,9 +7239,9 @@
}
},
"electron": {
- "version": "9.3.3",
- "resolved": "https://registry.npm.taobao.org/electron/download/electron-9.3.3.tgz",
- "integrity": "sha1-maZhnV32j5dpel0dgu86imP83zY=",
+ "version": "9.4.0",
+ "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-w8YH41mCJt26r/i6vN/6i7IhCTY=",
"dev": true,
"requires": {
"@electron/get": "^1.0.1",
@@ -7250,9 +7250,9 @@
},
"dependencies": {
"@types/node": {
- "version": "12.19.8",
- "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",
- "integrity": "sha1-79bRqQUlUZ/GCMnbFsinj3aTqXg=",
+ "version": "12.19.9",
+ "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-mQrWh62LJu9tzDSk9pwz1AyVtnk=",
"dev": true
}
}
@@ -8686,7 +8686,7 @@
"dependencies": {
"debug": {
"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=",
"dev": true,
"requires": {
@@ -8695,7 +8695,7 @@
},
"ms": {
"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=",
"dev": true
}
@@ -12103,9 +12103,9 @@
"dev": true
},
"node-id3": {
- "version": "0.1.21",
- "resolved": "https://registry.npm.taobao.org/node-id3/download/node-id3-0.1.21.tgz",
- "integrity": "sha1-bp+8x68J9lEUkJoR90otcLVFu/M=",
+ "version": "0.1.19",
+ "resolved": "https://registry.npm.taobao.org/node-id3/download/node-id3-0.1.19.tgz",
+ "integrity": "sha1-cQAMuCna3HYQAKSBAV5T88ydqto=",
"requires": {
"iconv-lite": "0.5.1"
},
@@ -14770,7 +14770,7 @@
"dependencies": {
"type-fest": {
"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=",
"dev": true,
"optional": true
diff --git a/package.json b/package.json
index 378935fa..ea143e7c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "lx-music-desktop",
- "version": "1.5.0",
+ "version": "1.6.0-beta",
"description": "一个免费的音乐下载助手",
"main": "./dist/electron/main.js",
"productName": "lx-music-desktop",
@@ -178,7 +178,7 @@
"cross-env": "^7.0.3",
"css-loader": "^4.3.0",
"del": "^6.0.0",
- "electron": "^9.3.3",
+ "electron": "^9.4.0",
"electron-builder": "^22.9.1",
"electron-debug": "^3.1.0",
"electron-devtools-installer": "^3.1.1",
diff --git a/publish/changeLog.md b/publish/changeLog.md
index 085d884a..1f305c55 100644
--- a/publish/changeLog.md
+++ b/publish/changeLog.md
@@ -1,14 +1,8 @@
### 新增
-- 直接从歌单详情收藏的列表新增同步功能。注意:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表
-
-### 优化
-
-- 优化软件启动时恢复上一次播放的歌曲进度功能
+- 我的列表右键菜单新增列表排序功能,可调整单曲、多选后的歌曲的顺序。注意:多选排序还将会按照选中歌曲时的顺序排序
### 修复
-- 修复MAC平台上下载歌曲封面嵌入无法显示的问题
-- 修复MAC平台首次运行软件最小化、关闭控制按钮默认在右边的问题
-- 修复酷狗源的某些歌曲没有专辑字段导致的列表加载失败问题
-- 修复某些酷狗源歌单链接无法打开的问题
+- 修复恢复上次播放的歌曲时在随机播放模式下不把恢复播放的歌曲放入已播放队列的问题(该问题会导致随机模式下会导致未播放完整个列表前就会再次随机到该歌曲,以及无法通过上一曲切回该歌曲)
+- 修复音乐嵌入的封面在 Mac 系统无法显示的问题
diff --git a/src/renderer/components/core/Player.vue b/src/renderer/components/core/Player.vue
index 21cab61f..44c24259 100644
--- a/src/renderer/components/core/Player.vue
+++ b/src/renderer/components/core/Player.vue
@@ -264,6 +264,7 @@ export default {
this.$nextTick(() => {
this.sendProgressEvent(this.progress, 'paused')
})
+ if (this.setting.player.togglePlayMethod == 'random') this.setPlayedList(musicInfo)
window.restorePlayInfo = null
return
}
diff --git a/src/renderer/components/material/Input.vue b/src/renderer/components/material/Input.vue
index 1f0bf89f..8b1ac781 100644
--- a/src/renderer/components/material/Input.vue
+++ b/src/renderer/components/material/Input.vue
@@ -1,6 +1,6 @@
- input(:class="$style.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())"
+ input(:class="$style.input" ref="dom_input" :type="type" :placeholder="placeholder" :value="value" :disabled="disabled"
+ @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())")
@@ -24,6 +24,16 @@ export default {
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()
+ },
+ },
}
@@ -41,6 +51,13 @@ export default {
transition: background-color 0.2s ease;
background-color: @color-btn-background;
font-size: 13.3px;
+
+ &::-webkit-outer-spin-button,
+ &::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+ }
+
&[disabled] {
opacity: .4;
}
diff --git a/src/renderer/components/material/listAddModal.vue b/src/renderer/components/material/ListAddModal.vue
similarity index 100%
rename from src/renderer/components/material/listAddModal.vue
rename to src/renderer/components/material/ListAddModal.vue
diff --git a/src/renderer/components/material/listAddMultipleModal.vue b/src/renderer/components/material/ListAddMultipleModal.vue
similarity index 100%
rename from src/renderer/components/material/listAddMultipleModal.vue
rename to src/renderer/components/material/ListAddMultipleModal.vue
diff --git a/src/renderer/components/material/ListSortModal.vue b/src/renderer/components/material/ListSortModal.vue
new file mode 100644
index 00000000..981ed4f5
--- /dev/null
+++ b/src/renderer/components/material/ListSortModal.vue
@@ -0,0 +1,121 @@
+
+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')}}
+
+
+
+
+
+
diff --git a/src/renderer/components/material/Menu.vue b/src/renderer/components/material/Menu.vue
index 534cf82a..a48afd6e 100644
--- a/src/renderer/components/material/Menu.vue
+++ b/src/renderer/components/material/Menu.vue
@@ -138,10 +138,10 @@ export default {
// will-change: transform;
li {
cursor: pointer;
- min-width: 80px;
+ min-width: 90px;
line-height: 34px;
// color: @color-btn;
- padding: 0 5px;
+ padding: 0 10px;
text-align: center;
outline: none;
transition: @transition-theme;
diff --git a/src/renderer/components/material/xmVerifyModal.vue b/src/renderer/components/material/XmVerifyModal.vue
similarity index 100%
rename from src/renderer/components/material/xmVerifyModal.vue
rename to src/renderer/components/material/XmVerifyModal.vue
diff --git a/src/renderer/lang/en-us/material/list_sort_modal.json b/src/renderer/lang/en-us/material/list_sort_modal.json
new file mode 100644
index 00000000..c767e46e
--- /dev/null
+++ b/src/renderer/lang/en-us/material/list_sort_modal.json
@@ -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"
+}
diff --git a/src/renderer/lang/en-us/view/list.json b/src/renderer/lang/en-us/view/list.json
index 37809cf7..37d039d6 100644
--- a/src/renderer/lang/en-us/view/list.json
+++ b/src/renderer/lang/en-us/view/list.json
@@ -10,6 +10,7 @@
"list_copy_name": "Copy name",
"list_add_to": "Add to ...",
"list_move_to": "Move to ...",
+ "list_sort": "Adjust position",
"list_download": "Download",
"list_remove": "Remove",
"list_source_detail": "Song Page",
diff --git a/src/renderer/lang/zh-cn/material/list_sort_modal.json b/src/renderer/lang/zh-cn/material/list_sort_modal.json
new file mode 100644
index 00000000..457585b2
--- /dev/null
+++ b/src/renderer/lang/zh-cn/material/list_sort_modal.json
@@ -0,0 +1,6 @@
+{
+ "title": "将 {name} 的位置调整到:",
+ "title_multiple": "将已选的 {num} 首歌曲的位置调整到:",
+ "input_tip": "请输入要调整到第几个位置",
+ "btn_confirm": "确定"
+}
diff --git a/src/renderer/lang/zh-cn/view/list.json b/src/renderer/lang/zh-cn/view/list.json
index 87778d88..3fbbf6bb 100644
--- a/src/renderer/lang/zh-cn/view/list.json
+++ b/src/renderer/lang/zh-cn/view/list.json
@@ -11,6 +11,7 @@
"list_source_detail": "歌曲详情页",
"list_add_to": "添加到...",
"list_move_to": "移动到...",
+ "list_sort": "调整位置",
"list_download": "下载",
"list_remove": "删除",
"default_list": "试听列表",
diff --git a/src/renderer/lang/zh-tw/material/list_sort_modal.json b/src/renderer/lang/zh-tw/material/list_sort_modal.json
new file mode 100644
index 00000000..7e3ddd66
--- /dev/null
+++ b/src/renderer/lang/zh-tw/material/list_sort_modal.json
@@ -0,0 +1,6 @@
+{
+ "title": "將 {name} 的位置調整到:",
+ "title_multiple": "將已選的 {num} 首歌曲的位置調整到:",
+ "input_tip": "請輸入要調整到第幾個位置",
+ "btn_confirm": "確定"
+}
diff --git a/src/renderer/lang/zh-tw/view/list.json b/src/renderer/lang/zh-tw/view/list.json
index 1f218c54..68b7f9fe 100644
--- a/src/renderer/lang/zh-tw/view/list.json
+++ b/src/renderer/lang/zh-tw/view/list.json
@@ -10,6 +10,7 @@
"list_copy_name": "複製歌曲名",
"list_add_to": "添加到...",
"list_move_to": "移動到...",
+ "list_sort": "調整位置",
"list_download": "下載",
"list_remove": "刪除",
"list_source_detail": "歌曲詳情頁",
diff --git a/src/renderer/plugins/Tips/index.js b/src/renderer/plugins/Tips/index.js
index 4e2aee98..eede83c9 100644
--- a/src/renderer/plugins/Tips/index.js
+++ b/src/renderer/plugins/Tips/index.js
@@ -4,11 +4,14 @@ import { debounce } from '../../utils'
let instance
let prevTips
-const getTips = el => el.getAttribute('tips')
- ? el.getAttribute('tips')
- : el.parentNode === document.documentElement
- ? null
- : getTips(el.parentNode)
+const getTips = el =>
+ el
+ ? el.getAttribute('tips')
+ ? el.getAttribute('tips')
+ : el.parentNode === document.documentElement
+ ? null
+ : getTips(el.parentNode)
+ : null
const showTips = debounce(event => {
let msg = getTips(event.target)
diff --git a/src/renderer/store/modules/list.js b/src/renderer/store/modules/list.js
index 9df804c3..ce6ce500 100644
--- a/src/renderer/store/modules/list.js
+++ b/src/renderer/store/modules/list.js
@@ -185,6 +185,12 @@ const mutations = {
setListScroll(state, { id, 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 {
diff --git a/src/renderer/views/List.vue b/src/renderer/views/List.vue
index d0f1a077..9e2e888c 100644
--- a/src/renderer/views/List.vue
+++ b/src/renderer/views/List.vue
@@ -69,6 +69,7 @@
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-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")
diff --git a/src/renderer/views/SongList.vue b/src/renderer/views/SongList.vue
index 2c1b5cda..d99241dc 100644
--- a/src/renderer/views/SongList.vue
+++ b/src/renderer/views/SongList.vue
@@ -405,9 +405,7 @@ export default {
},
async fetchList() {
this.detailLoading = true
- return this.getListDetailAll({ source: this.source, id: this.selectListInfo.id }).catch(err => {
- return Promise.reject(err)
- }).finally(() => {
+ return this.getListDetailAll({ source: this.source, id: this.selectListInfo.id }).finally(() => {
this.detailLoading = false
})
},