Merge branch 'dev'

pull/930/merge v1.22.1
lyswhut 2022-07-09 12:03:42 +08:00
commit aa4b09436c
23 changed files with 1916 additions and 1981 deletions

View File

@ -30,5 +30,5 @@
"settings": {
"html/html-extensions": [".html", ".vue"]
},
"ignorePatterns": ["vendors", "*.min.js"]
"ignorePatterns": ["vendors", "*.min.js", "dist", "node_modules"]
}

View File

@ -6,6 +6,22 @@ Project versioning adheres to [Semantic Versioning](http://semver.org/).
Commit convention is based on [Conventional Commits](http://conventionalcommits.org).
Change log format is based on [Keep a Changelog](http://keepachangelog.com/).
## [1.22.1](https://github.com/lyswhut/lx-music-desktop/compare/v1.22.0...v1.22.1) - 2022-07-09
### 优化
- 歌单列表添加歌单内歌曲数量显示目前只有kw、mg、wy、tx部分源支持显示
### 修复
- 修复处于不支持的源时,歌单、排行榜的右键下载菜单没有禁用的问题
- 修复若桌面歌词窗口与主窗口重叠时,鼠标划过重叠区域鼠标会闪烁的问题,注:此修复只对未启用“鼠标移入歌词区域时降低歌词透明度”时有效
- 修复tx源搜索失效的问题
### 其他
- 升级Electron到 v17.4.10
## [1.22.0](https://github.com/lyswhut/lx-music-desktop/compare/v1.21.0...v1.22.0) - 2022-06-19
### 新增

3691
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "lx-music-desktop",
"version": "1.22.0",
"version": "1.22.1",
"description": "一个免费的音乐查找助手",
"main": "./dist/main.js",
"productName": "lx-music-desktop",
@ -178,40 +178,38 @@
},
"homepage": "https://github.com/lyswhut/lx-music-desktop#readme",
"devDependencies": {
"@babel/core": "^7.18.5",
"@babel/core": "^7.18.6",
"@babel/eslint-parser": "^7.18.2",
"@babel/plugin-proposal-class-properties": "^7.17.12",
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-modules-umd": "^7.18.0",
"@babel/plugin-transform-runtime": "^7.18.5",
"@babel/polyfill": "^7.12.1",
"@babel/preset-env": "^7.18.2",
"@babel/plugin-transform-modules-umd": "^7.18.6",
"@babel/plugin-transform-runtime": "^7.18.6",
"@babel/preset-env": "^7.18.6",
"babel-loader": "^8.2.5",
"babel-preset-minify": "^0.5.2",
"browserslist": "^4.20.4",
"browserslist": "^4.21.1",
"chalk": "^4.1.2",
"changelog-parser": "^2.8.1",
"copy-webpack-plugin": "^11.0.0",
"core-js": "^3.23.1",
"core-js": "^3.23.3",
"cross-env": "^7.0.3",
"css-loader": "^6.7.1",
"css-minimizer-webpack-plugin": "^4.0.0",
"del": "^6.1.1",
"electron": "^17.4.7",
"electron-builder": "^23.1.0",
"electron": "^17.4.10",
"electron-builder": "^23.3.0",
"electron-debug": "^3.2.0",
"electron-devtools-installer": "^3.2.0",
"electron-to-chromium": "^1.4.161",
"electron-updater": "^5.0.5",
"eslint": "^8.18.0",
"electron-to-chromium": "^1.4.184",
"electron-updater": "^5.1.0",
"eslint": "^8.19.0",
"eslint-config-standard": "^17.0.0",
"eslint-formatter-friendly": "git+https://github.com/lyswhut/eslint-friendly-formatter.git#2170d1320e2fad13615a9dcf229669f0bb473a53",
"eslint-plugin-html": "^6.2.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^6.0.0",
"eslint-plugin-standard": "^4.1.0",
"eslint-webpack-plugin": "^3.1.1",
"eslint-webpack-plugin": "^3.2.0",
"file-loader": "^6.2.0",
"html-webpack-plugin": "^5.5.0",
"less": "^4.1.3",
@ -233,17 +231,17 @@
"terser-webpack-plugin": "^5.3.3",
"url-loader": "^4.1.1",
"vue-loader": "^17.0.0",
"vue-template-compiler": "^2.7.0-beta.2",
"vue-template-compiler": "^2.7.4",
"webpack": "^5.73.0",
"webpack-cli": "^4.10.0",
"webpack-dev-server": "^4.9.2",
"webpack-dev-server": "^4.9.3",
"webpack-hot-middleware": "git+https://github.com/lyswhut/webpack-hot-middleware.git#329c4375134b89d39da23a56a94db651247c74a1",
"webpack-merge": "^5.8.0"
},
"dependencies": {
"bufferutil": "^4.0.6",
"crypto-js": "^4.1.1",
"electron-log": "^4.4.7",
"electron-log": "^4.4.8",
"electron-store": "^8.0.2",
"font-list": "git+https://github.com/lyswhut/node-font-list.git#4edbb1933b49a9bac1eedd63a31da16b487fe57d",
"http-terminator": "^3.2.0",
@ -261,11 +259,12 @@
"utf-8-validate": "^5.0.9",
"vue": "^3.2.37",
"vue-i18n": "^9.2.0-beta.36",
"vue-router": "^4.1.0-aabe509",
"vue-router": "^4.1.1",
"vuex": "^4.0.2"
},
"overrides": {
"async": "^2.3.0",
"got": "^11.8.5",
"svg-sprite-loader": {
"postcss": "8.2.13"
}

View File

@ -1,26 +1,13 @@
### 新增
- 新增设置-以全屏模式启动设置
- 新增设置-桌面歌词设置-鼠标移入歌词区域时降低歌词透明度(#883默认关闭此设置不支持linux此功能存在兼容性问题若鼠标移出后无法恢复到正常透明度可尝试再移入移出即可恢复
### 优化
- 添加歌曲到“我的列表”时,若按住`ctrl`键Mac对应`Command`),则不会自动关闭添加窗口,这对想要将同一首(一批)歌曲添加到多个列表时会很有用
- 支持mg源逐字歌词的播放感谢 @mozbugbox 提供的帮助
- 添加歌曲列表更新操作的二次确认
- 添加导入文件错误时的指引提示
- 歌单列表添加歌单内歌曲数量显示目前只有kw、mg、wy、tx部分源支持显示
### 修复
- 修复若配置了`http_proxy`环境变量时,会意外使用此代理配置的问题
- 修复多选后切换列表后不会清空多选内容的问题
- 修复设置快捷键时的处理逻辑问题
- 修复在新建歌单输入框、歌单内歌曲搜索输入框会意外触发设置的全局快捷键的问题(#879
### 文档
桌面版文档已迁移到:<https://lyswhut.github.io/lx-music-doc/desktop>
- 修复处于不支持的源时,歌单、排行榜的右键下载菜单没有禁用的问题
- 修复若桌面歌词窗口与主窗口重叠时,鼠标划过重叠区域鼠标会闪烁的问题,注:此修复只对未启用“鼠标移入歌词区域时降低歌词透明度”时有效
- 修复tx源搜索失效的问题
### 其他
- 更新 Electron 到 v17.4.7
- 升级Electron到 v17.4.10

File diff suppressed because one or more lines are too long

View File

@ -65,6 +65,7 @@ const hotKey = {
}
const keyName = {
common: names.mainWindow.name,
player: names.mainWindow.name,
desktop_lyric: names.winLyric.name,
}

View File

@ -83,14 +83,13 @@ app.on('open-url', (event, url) => {
init()
}
})
if (isDev && process.platform === 'win32') {
// Set the path of electron.exe and your app.
// These two additional parameters are only available on windows.
// console.log(process.execPath, process.argv)
app.setAsDefaultProtocolClient('lxmusic', process.execPath, process.argv.slice(1))
} else {
app.setAsDefaultProtocolClient('lxmusic')
}
// if (isDev && process.platform === 'win32') {
// // Set the path of electron.exe and your app.
// // These two additional parameters are only available on windows.
// // console.log(process.execPath, process.argv)
// app.setAsDefaultProtocolClient('lxmusic', process.execPath, process.argv.slice(1))
// }
if (!isDev) app.setAsDefaultProtocolClient('lxmusic')
const { navigationUrlWhiteList, themes } = require('../common/config')
const { getWindowSizeInfo, initSetting, updateSetting } = require('./utils')

View File

@ -9,6 +9,7 @@ let isEnable = null
let isAlwaysOnTop = null
let isAlwaysOnTopLoop = null
let isLockScreen = null
let isHoverHide = null
const alwaysOnTopTools = {
timeout: null,
@ -48,9 +49,15 @@ const setLrcConfig = () => {
if (isLock != desktopLyric.isLock) {
isLock = desktopLyric.isLock
if (desktopLyric.isLock) {
global.modules.lyricWindow.setIgnoreMouseEvents(true, { forward: !isLinux })
global.modules.lyricWindow.setIgnoreMouseEvents(true, { forward: !isLinux && global.appSetting.desktopLyric.isHoverHide })
} else {
global.modules.lyricWindow.setIgnoreMouseEvents(false, { forward: !isLinux })
global.modules.lyricWindow.setIgnoreMouseEvents(false, { forward: !isLinux && global.appSetting.desktopLyric.isHoverHide })
}
}
if (isHoverHide != desktopLyric.isHoverHide) {
isHoverHide = desktopLyric.isHoverHide
if (!isLinux) {
global.modules.lyricWindow.setIgnoreMouseEvents(desktopLyric.isLock, { forward: global.appSetting.desktopLyric.isHoverHide })
}
}
if (isAlwaysOnTop != desktopLyric.isAlwaysOnTop) {

View File

@ -64,7 +64,7 @@ const winEvent = lyricWindow => {
lyricWindow.once('ready-to-show', () => {
lyricWindow.show()
if (global.appSetting.desktopLyric.isLock) {
global.modules.lyricWindow.setIgnoreMouseEvents(true, { forward: !isLinux })
global.modules.lyricWindow.setIgnoreMouseEvents(true, { forward: !isLinux && global.appSetting.desktopLyric.isHoverHide })
}
// linux下每次重开时貌似要重新设置置顶
if (isLinux && global.appSetting.desktopLyric.isAlwaysOnTop) {

View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,1C7,1 3,5 3,10V17A3,3 0 0,0 6,20H9V12H5V10A7,7 0 0,1 12,3A7,7 0 0,1 19,10V12H15V20H18A3,3 0 0,0 21,17V10C21,5 16.97,1 12,1Z" /></svg>

After

Width:  |  Height:  |  Size: 422 B

View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M21,3V15.5A3.5,3.5 0 0,1 17.5,19A3.5,3.5 0 0,1 14,15.5A3.5,3.5 0 0,1 17.5,12C18.04,12 18.55,12.12 19,12.34V6.47L9,8.6V17.5A3.5,3.5 0 0,1 5.5,21A3.5,3.5 0 0,1 2,17.5A3.5,3.5 0 0,1 5.5,14C6.04,14 6.55,14.12 7,14.34V6L21,3Z" /></svg>

After

Width:  |  Height:  |  Size: 515 B

View File

@ -1,4 +1,4 @@
import { computed, ref, useI18n, useCssModule, nextTick } from '@renderer/utils/vueTools'
import { computed, ref, reactive, useI18n, useCssModule, nextTick } from '@renderer/utils/vueTools'
import musicSdk from '@renderer/utils/music'
export default ({
@ -13,7 +13,7 @@ export default ({
handleShowMusicAddModal,
handleOpenMusicDetail,
}) => {
const itemMenuControl = ref({
const itemMenuControl = reactive({
play: true,
addTo: true,
playLater: true,
@ -31,38 +31,38 @@ export default ({
{
name: t('list__play'),
action: 'play',
disabled: !itemMenuControl.value.play,
disabled: !itemMenuControl.play,
},
{
name: t('list__download'),
action: 'download',
disabled: !itemMenuControl.value.download,
disabled: !itemMenuControl.download,
},
{
name: t('list__play_later'),
action: 'playLater',
disabled: !itemMenuControl.value.playLater,
disabled: !itemMenuControl.playLater,
},
{
name: t('list__search'),
action: 'search',
disabled: !itemMenuControl.value.search,
disabled: !itemMenuControl.search,
},
{
name: t('list__add_to'),
action: 'addTo',
disabled: !itemMenuControl.value.addTo,
disabled: !itemMenuControl.addTo,
},
{
name: t('list__source_detail'),
action: 'sourceDetail',
disabled: !itemMenuControl.value.sourceDetail,
disabled: !itemMenuControl.sourceDetail,
},
]
})
const showMenu = (event, musicInfo) => {
itemMenuControl.value.sourceDetail = !!musicSdk[musicInfo.source].getMusicDetailPageUrl
itemMenuControl.sourceDetail = !!musicSdk[musicInfo.source].getMusicDetailPageUrl
// this.listMenu.itemMenuControl.play =
// this.listMenu.itemMenuControl.playLater =
itemMenuControl.download = assertApiSupport(musicInfo.source)

View File

@ -18,7 +18,10 @@ export const allListInit = (newLists) => {
}
allListUpdate(defaultList.id, newLists.defaultList.list)
allListUpdate(loveList.id, newLists.loveList.list)
if (newLists.tempList) allListUpdate(tempList.id, newLists.tempList.list)
if (newLists.tempList) {
allListUpdate(tempList.id, newLists.tempList.list)
tempList.meta = newLists.tempList.meta ?? {}
}
userLists.splice(0, userLists.length)
for (const { list, ...listInfo } of newLists.userList) {
allListUpdate(listInfo.id, list)

View File

@ -94,7 +94,7 @@ const useListInit = ({
const usePlayInfoInit = () => {
const setPlayList = useCommit('player', 'setList')
return downloadList => {
return () => {
return getPlayInfo().then(info => {
window.restorePlayInfo = null
if (!info?.listId || info.index < 0) return
@ -157,7 +157,7 @@ export default ({
]).catch(err => log.error(err))
music.init() // 初始化音乐sdk
await initList().catch(err => log.error(err)) // 初始化列表
await initPlayInfo(downloadList.value).catch(err => log.error(err)) // 初始化上次的歌曲播放信息
await initPlayInfo(downloadList).catch(err => log.error(err)) // 初始化上次的歌曲播放信息
await initSearchHistory(saveSearchHistoryListThrottle).catch(err => log.error(err)) // 初始化搜索历史记录
}
}

View File

@ -137,6 +137,7 @@ export default {
author: item.uname,
name: item.name,
// time: item.publish_time,
total: item.total,
img: item.img,
grade: item.favorcnt / 10,
desc: item.desc,
@ -153,6 +154,7 @@ export default {
id: `digest-${item.digest}__${item.id}`,
author: item.uname,
name: item.name,
total: item.total,
// time: item.publish_time,
img: item.img,
grade: item.favorcnt && item.favorcnt / 10,

View File

@ -284,6 +284,7 @@ export default {
// })
},
filterList(rawData) {
// console.log(rawData)
return rawData.map(item => ({
play_count: this.formatPlayCount(item.playCount),
id: item.playListId,
@ -292,6 +293,7 @@ export default {
time: item.createTime,
img: item.image,
grade: item.grade,
total: item.contentCount,
desc: item.summary,
source: 'mg',
}))

View File

@ -6,18 +6,49 @@ export default {
if (this._requestObj) this._requestObj.cancelHttp()
if (retryNum > 2) return Promise.reject(new Error('try max num'))
const _requestObj = httpFetch('https://c.y.qq.com/splcloud/fcgi-bin/gethotkey.fcg', {
method: 'get',
// const _requestObj = httpFetch('https://c.y.qq.com/splcloud/fcgi-bin/gethotkey.fcg', {
// method: 'get',
// headers: {
// Referer: 'https://y.qq.com/portal/player.html',
// },
// })
const _requestObj = httpFetch('https://u.y.qq.com/cgi-bin/musicu.fcg', {
method: 'post',
body: {
comm: {
ct: '19',
cv: '1803',
guid: '0',
patch: '118',
psrf_access_token_expiresAt: 0,
psrf_qqaccess_token: '',
psrf_qqopenid: '',
psrf_qqunionid: '',
tmeAppID: 'qqmusic',
tmeLoginType: 0,
uin: '0',
wid: '0',
},
hotkey: {
method: 'GetHotkeyForQQMusicPC',
module: 'tencent_musicsoso_hotkey.HotkeyService',
param: {
search_id: '',
uin: 0,
},
},
},
headers: {
Referer: 'https://y.qq.com/portal/player.html',
},
})
const { body, statusCode } = await _requestObj.promise
// console.log(body)
if (statusCode != 200 || body.code !== 0) throw new Error('获取热搜词失败')
// console.log(body)
return { source: 'tx', list: this.filterList(body.data.hotkey) }
return { source: 'tx', list: this.filterList(body.hotkey.data.vec_hotkey) }
},
filterList(rawList) {
return rawList.map(item => item.k)
return rawList.map(item => item.query)
},
}

View File

@ -14,7 +14,7 @@ export default {
musicSearch(str, page, limit, retryNum = 0) {
if (retryNum > 5) return Promise.reject(new Error('搜索失败'))
// searchRequest = httpFetch(`https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=sizer.yqq.song_next&searchid=49252838123499591&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=${page}&n=${limit}&w=${encodeURIComponent(str)}&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0`)
const searchRequest = httpFetch(`https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&remoteplace=txt.yqq.top&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=${page}&n=${limit}&w=${encodeURIComponent(str)}&cv=4747474&ct=24&format=json&inCharset=utf-8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0&uin=0&hostUin=0&loginUin=0`)
const searchRequest = httpFetch(`https://shc.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&remoteplace=txt.yqq.top&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=${page}&n=${limit}&w=${encodeURIComponent(str)}&cv=4747474&ct=24&format=json&inCharset=utf-8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0&uin=0&hostUin=0&loginUin=0`)
// searchRequest = httpFetch(`http://ioscdn.kugou.com/api/v3/search/song?keyword=${encodeURIComponent(str)}&page=${page}&pagesize=${this.limit}&showtype=10&plat=2&version=7910&tag=1&correct=1&privilege=1&sver=5`)
return searchRequest.promise.then(({ body }) => {
if (body.code !== this.successCode) return this.musicSearch(str, page, limit, ++retryNum)

View File

@ -142,6 +142,7 @@ export default {
// time: item.publish_time,
img: item.cover_url_medium,
// grade: item.favorcnt / 10,
total: item.song_ids?.length,
desc: item.desc,
source: 'tx',
})),

View File

@ -218,6 +218,7 @@ export default {
})
},
filterList(rawData) {
// console.log(rawData)
return rawData.map(item => ({
play_count: this.formatPlayCount(item.playCount),
id: item.id,
@ -226,6 +227,7 @@ export default {
time: item.createTime,
img: item.coverImgUrl,
grade: item.grade,
total: item.trackCount,
desc: item.description,
source: 'wy',
}))

View File

@ -17,7 +17,7 @@ material-modal(:show="modelValue" bg-close @close="handleClose" teleport="#view"
div(:class="$style.note")
p(:class="[$style.ruleLink]")
| {{$t('user_api__readme')}}
span.hover.underline(@click="handleOpenUrl('https://lxmusic.toside.cn/desktop/custom-source')" aria-label="https://lxmusic.toside.cn/desktop/custom-source") FAQ
span.hover.underline(@click="handleOpenUrl('https://lyswhut.github.io/lx-music-doc/desktop/custom-source')" aria-label="https://lxmusic.toside.cn/desktop/custom-source") FAQ
p {{$t('user_api__note')}}
div(:class="$style.footer")
base-btn(:class="$style.footerBtn" @click="handleImport") {{$t('user_api__btn_import')}}

View File

@ -33,7 +33,13 @@ div(:class="$style.container")
//- img(:src="item.img")
div(:class="$style.right" :src="item.img")
h4 {{item.name}}
p(:class="$style.play_count") {{item.play_count}}
div(:class="$style.songlist_info")
span(v-if="item.total != null")
svg-icon(name="music")
| {{item.total}}
span
svg-icon(name="headphones")
| {{item.play_count}}
p(:class="$style.author") {{item.author}}
li(:class="$style.item" style="cursor: default;" v-for="i in spaceNum")
div(:class="$style.pagination")
@ -529,7 +535,10 @@ export default {
.mixin-ellipsis-2;
}
}
.play_count {
.songlist_info {
display: flex;
flex-flow: row nowrap;
gap: 15px;
margin-top: 12px;
font-size: 12px;
.mixin-ellipsis-1;
@ -537,6 +546,9 @@ export default {
line-height: 1.2;
// text-indent: 24px;
color: @color-theme_2-font-label;
svg {
margin-right: 2px;
}
}
.author {
margin-top: 6px;