Merge branch 'dev' into v1
commit
90e40d5245
|
@ -11,6 +11,12 @@ matrix:
|
||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
dist: trusty
|
dist: trusty
|
||||||
|
sudo: required
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- rpm
|
||||||
|
- bsdtar
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "lx-music-desktop",
|
"name": "lx-music-desktop",
|
||||||
"version": "0.18.2",
|
"version": "0.18.3",
|
||||||
"description": "一个免费的音乐下载助手",
|
"description": "一个免费的音乐下载助手",
|
||||||
"main": "./dist/electron/main.js",
|
"main": "./dist/electron/main.js",
|
||||||
"productName": "lx-music-desktop",
|
"productName": "lx-music-desktop",
|
||||||
|
@ -32,11 +32,13 @@
|
||||||
"publish:mac": "npm run publish:mac:dmg",
|
"publish:mac": "npm run publish:mac:dmg",
|
||||||
"publish:mac:dmg": "electron-builder -m=dmg -p onTagOrDraft",
|
"publish:mac:dmg": "electron-builder -m=dmg -p onTagOrDraft",
|
||||||
"publish:gh:linux": "node build-config/pack.js && npm run publish:linux",
|
"publish:gh:linux": "node build-config/pack.js && npm run publish:linux",
|
||||||
"publish:linux": "npm run publish:linux:deb && npm run publish:linux:appImage",
|
"publish:linux": "npm run publish:linux:deb && npm run publish:linux:appImage && npm run publish:linux:rpm && npm run publish:linux:pacman",
|
||||||
"publish:linux:appImage": "cross-env ARCH=x64 electron-builder -l=AppImage -p onTagOrDraft",
|
"publish:linux:appImage": "cross-env ARCH=x64 electron-builder -l=AppImage -p onTagOrDraft",
|
||||||
"publish:linux:deb": "npm run publish:linux:deb:x64 && npm run publish:linux:deb:x86",
|
"publish:linux:deb": "npm run publish:linux:deb:x64 && npm run publish:linux:deb:x86",
|
||||||
"publish:linux:deb:x64": "cross-env ARCH=x64 electron-builder -l=deb --x64 -p onTagOrDraft",
|
"publish:linux:deb:x64": "cross-env ARCH=x64 electron-builder -l=deb --x64 -p onTagOrDraft",
|
||||||
"publish:linux:deb:x86": "cross-env ARCH=x86 electron-builder -l=deb --ia32 -p onTagOrDraft",
|
"publish:linux:deb:x86": "cross-env ARCH=x86 electron-builder -l=deb --ia32 -p onTagOrDraft",
|
||||||
|
"publish:linux:rpm": "cross-env ARCH=x64 electron-builder -l=rpm -p onTagOrDraft",
|
||||||
|
"publish:linux:pacman": "cross-env ARCH=x64 electron-builder -l=pacman -p onTagOrDraft",
|
||||||
"pack:linux": "node build-config/pack.js && electron-builder -l",
|
"pack:linux": "node build-config/pack.js && electron-builder -l",
|
||||||
"pack:mac": "node build-config/pack.js && electron-builder -m=dmg",
|
"pack:mac": "node build-config/pack.js && electron-builder -m=dmg",
|
||||||
"pack:dir": "node build-config/pack.js && electron-builder --dir",
|
"pack:dir": "node build-config/pack.js && electron-builder --dir",
|
||||||
|
|
|
@ -1,3 +1,14 @@
|
||||||
|
### 新增
|
||||||
|
|
||||||
|
- 新增`rpm`、`pacman`包的打包
|
||||||
|
|
||||||
### 修复
|
### 修复
|
||||||
|
|
||||||
- 修复开启托盘时,可能导致无法自动更新的问题
|
- 修复按住`Ctrl`等键触发多选机制时不松开按键的情况下切换到其他窗口后再松开按键,这时切回软件不按按键都处在多选模式的问题
|
||||||
|
- 修复Linux版开启托盘无法退出的问题
|
||||||
|
- 修复某些情况下可能导致的音源输出问题
|
||||||
|
- 修复某些情况下无法开始下载任务的问题
|
||||||
|
|
||||||
|
### 更变
|
||||||
|
|
||||||
|
- 修改设置-列表-是否显示歌曲源的默认设置为选中(该变更不影响之前的设置)
|
||||||
|
|
|
@ -22,6 +22,18 @@ app.on('second-instance', (event, argv, cwd) => {
|
||||||
|
|
||||||
const isDev = global.isDev = process.env.NODE_ENV !== 'production'
|
const isDev = global.isDev = process.env.NODE_ENV !== 'production'
|
||||||
const { navigationUrlWhiteList } = require('../common/config')
|
const { navigationUrlWhiteList } = require('../common/config')
|
||||||
|
const { getAppSetting, parseEnv, getWindowSizeInfo } = require('./utils')
|
||||||
|
const { isMac, isLinux } = require('../common/utils')
|
||||||
|
|
||||||
|
global.envParams = parseEnv()
|
||||||
|
|
||||||
|
|
||||||
|
// https://github.com/electron/electron/issues/22691
|
||||||
|
app.commandLine.appendSwitch('wm-window-animations-disabled')
|
||||||
|
|
||||||
|
// https://github.com/electron/electron/issues/18397
|
||||||
|
app.allowRendererProcessReuse = true
|
||||||
|
|
||||||
|
|
||||||
app.on('web-contents-created', (event, contents) => {
|
app.on('web-contents-created', (event, contents) => {
|
||||||
contents.on('will-navigate', (event, navigationUrl) => {
|
contents.on('will-navigate', (event, navigationUrl) => {
|
||||||
|
@ -50,22 +62,12 @@ app.on('web-contents-created', (event, contents) => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
// https://github.com/electron/electron/issues/22691
|
|
||||||
app.commandLine.appendSwitch('wm-window-animations-disabled')
|
|
||||||
|
|
||||||
// https://github.com/electron/electron/issues/18397
|
|
||||||
app.allowRendererProcessReuse = !isDev
|
|
||||||
|
|
||||||
const { getAppSetting, parseEnv, getWindowSizeInfo } = require('./utils')
|
|
||||||
|
|
||||||
global.envParams = parseEnv()
|
|
||||||
|
|
||||||
require('../common/error')
|
require('../common/error')
|
||||||
require('./events')
|
require('./events')
|
||||||
require('./rendererEvents')
|
require('./rendererEvents')
|
||||||
const winEvent = require('./rendererEvents/winEvent')
|
const winEvent = require('./rendererEvents/winEvent')
|
||||||
const autoUpdate = require('./utils/autoUpdate')
|
const autoUpdate = require('./utils/autoUpdate')
|
||||||
const { isMac, isLinux } = require('../common/utils')
|
|
||||||
|
|
||||||
|
|
||||||
let winURL
|
let winURL
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
const { isMac } = require('../../common/utils')
|
const { isWin } = require('../../common/utils')
|
||||||
global.isQuitting = false
|
global.isQuitting = false
|
||||||
global.isTrafficLightClose = false // 是否点击软件上的关闭按钮关闭
|
global.isTrafficLightClose = false // 是否点击软件上的关闭按钮关闭
|
||||||
|
|
||||||
module.exports = mainWindow => {
|
module.exports = mainWindow => {
|
||||||
mainWindow.on('close', event => {
|
mainWindow.on('close', event => {
|
||||||
if (global.isQuitting || !global.appSetting.tray.isToTray || (isMac && !global.isTrafficLightClose)) {
|
if (global.isQuitting || !global.appSetting.tray.isToTray || (!isWin && !global.isTrafficLightClose)) {
|
||||||
mainWindow.setProgressBar(-1)
|
mainWindow.setProgressBar(-1)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,9 @@ module.exports = mainWindow => {
|
||||||
// mainWindow.on('restore', () => {
|
// mainWindow.on('restore', () => {
|
||||||
// mainWindow.webContents.send('restore')
|
// mainWindow.webContents.send('restore')
|
||||||
// })
|
// })
|
||||||
|
mainWindow.on('focus', () => {
|
||||||
|
mainWindow.webContents.send('focus')
|
||||||
|
})
|
||||||
|
|
||||||
mainWindow.once('ready-to-show', () => {
|
mainWindow.once('ready-to-show', () => {
|
||||||
mainWindow.show()
|
mainWindow.show()
|
||||||
|
|
|
@ -617,12 +617,12 @@ export default {
|
||||||
},
|
},
|
||||||
async setMediaDevice() {
|
async setMediaDevice() {
|
||||||
let mediaDeviceId = this.setting.player.mediaDeviceId
|
let mediaDeviceId = this.setting.player.mediaDeviceId
|
||||||
if (!mediaDeviceId) return
|
|
||||||
const devices = await navigator.mediaDevices.enumerateDevices()
|
const devices = await navigator.mediaDevices.enumerateDevices()
|
||||||
let device = devices.find(device => device.deviceId === mediaDeviceId)
|
let device = devices.find(device => device.deviceId === mediaDeviceId)
|
||||||
if (!device) return this.setMediaDeviceId('default')
|
const deviceId = device ? device.deviceId : 'default'
|
||||||
|
|
||||||
// console.log(device)
|
// console.log(device)
|
||||||
this.audio.setSinkId(device.deviceId).catch((err) => {
|
this.audio.setSinkId(deviceId).catch(err => {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
this.setMediaDeviceId('default')
|
this.setMediaDeviceId('default')
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,41 +1,38 @@
|
||||||
import mousetrap from 'mousetrap'
|
import mousetrap from 'mousetrap'
|
||||||
|
|
||||||
let eventHub
|
let eventHub
|
||||||
|
|
||||||
|
const bindKeys = [
|
||||||
|
'shift',
|
||||||
|
'mod',
|
||||||
|
'mod+a',
|
||||||
|
]
|
||||||
|
|
||||||
const bindKey = () => {
|
const bindKey = () => {
|
||||||
mousetrap.reset()
|
mousetrap.reset()
|
||||||
mousetrap.bind('shift', (event, combo) => {
|
for (const key of bindKeys) {
|
||||||
eventHub.$emit('key_shift_down', { event, combo })
|
mousetrap.bind(key, (event, combo) => {
|
||||||
|
eventHub.$emit(`key_${key}_down`, { event, combo })
|
||||||
return false
|
return false
|
||||||
}, 'keydown')
|
}, 'keydown')
|
||||||
mousetrap.bind('shift', (event, combo) => {
|
mousetrap.bind(key, (event, combo) => {
|
||||||
eventHub.$emit('key_shift_up', { event, combo })
|
eventHub.$emit(`key_${key}_up`, { event, combo })
|
||||||
return false
|
|
||||||
}, 'keyup')
|
|
||||||
mousetrap.bind('mod', (event, combo) => {
|
|
||||||
eventHub.$emit('key_mod_down', { event, combo })
|
|
||||||
return false
|
|
||||||
}, 'keydown')
|
|
||||||
mousetrap.bind('mod', (event, combo) => {
|
|
||||||
eventHub.$emit('key_mod_up', { event, combo })
|
|
||||||
return false
|
|
||||||
}, 'keyup')
|
|
||||||
mousetrap.bind('mod+a', (event, combo) => {
|
|
||||||
eventHub.$emit('key_mod+a_down', { event, combo })
|
|
||||||
return false
|
|
||||||
}, 'keydown')
|
|
||||||
mousetrap.bind('mod+a', (event, combo) => {
|
|
||||||
eventHub.$emit('key_mod+a_up', { event, combo })
|
|
||||||
return false
|
return false
|
||||||
}, 'keyup')
|
}, 'keyup')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const unbindKey = () => {
|
const unbindKey = () => {
|
||||||
mousetrap.unbind('shift', 'keydown')
|
for (const key of bindKeys) {
|
||||||
mousetrap.unbind('shift', 'keyup')
|
mousetrap.unbind(key, 'keydown')
|
||||||
mousetrap.unbind('mod', 'keydown')
|
mousetrap.unbind(key, 'keyup')
|
||||||
mousetrap.unbind('mod', 'keyup')
|
}
|
||||||
mousetrap.unbind('mod+a', 'keydown')
|
}
|
||||||
mousetrap.unbind('mod+a', 'keyup')
|
|
||||||
|
const handleFocus = () => {
|
||||||
|
for (const key of bindKeys) {
|
||||||
|
eventHub.$emit(`key_${key}_up`, { combo: key })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default () => {
|
export default () => {
|
||||||
|
@ -43,4 +40,5 @@ export default () => {
|
||||||
|
|
||||||
eventHub.$on('bindKey', bindKey)
|
eventHub.$on('bindKey', bindKey)
|
||||||
eventHub.$on('unbindKey', unbindKey)
|
eventHub.$on('unbindKey', unbindKey)
|
||||||
|
eventHub.$on('focus', handleFocus)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
import Vue from 'vue'
|
||||||
|
import bindkey from './bindkey'
|
||||||
|
import { rendererOn } from '../../common/ipc'
|
||||||
|
|
||||||
|
window.eventHub = new Vue()
|
||||||
|
|
||||||
|
bindkey()
|
||||||
|
|
||||||
|
rendererOn('focus', () => {
|
||||||
|
window.eventHub.$emit('focus')
|
||||||
|
})
|
|
@ -1,6 +1,8 @@
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
import { sync } from 'vuex-router-sync'
|
import { sync } from 'vuex-router-sync'
|
||||||
|
|
||||||
|
import './config/event'
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
import './components'
|
import './components'
|
||||||
|
|
||||||
|
@ -14,14 +16,8 @@ import store from './store'
|
||||||
|
|
||||||
import '../common/error'
|
import '../common/error'
|
||||||
|
|
||||||
import bindkey from './config/bindkey'
|
|
||||||
|
|
||||||
sync(store, router)
|
sync(store, router)
|
||||||
|
|
||||||
window.eventHub = new Vue()
|
|
||||||
|
|
||||||
bindkey()
|
|
||||||
|
|
||||||
Vue.config.productionTip = false
|
Vue.config.productionTip = false
|
||||||
|
|
||||||
new Vue({
|
new Vue({
|
||||||
|
|
|
@ -68,7 +68,7 @@ const getStartTask = (list, downloadStatus, maxDownloadNum) => {
|
||||||
let downloadCount = 0
|
let downloadCount = 0
|
||||||
const waitList = list.filter(item => item.status == downloadStatus.WAITING ? true : (item.status === downloadStatus.RUN && ++downloadCount && false))
|
const waitList = list.filter(item => item.status == downloadStatus.WAITING ? true : (item.status === downloadStatus.RUN && ++downloadCount && false))
|
||||||
// console.log(downloadCount, waitList)
|
// console.log(downloadCount, waitList)
|
||||||
return downloadCount < maxDownloadNum && waitList.length > 0 && waitList.shift()
|
return downloadCount < maxDownloadNum ? waitList.shift() || null : false
|
||||||
}
|
}
|
||||||
|
|
||||||
const awaitRequestAnimationFrame = () => new Promise(resolve => window.requestAnimationFrame(() => resolve()))
|
const awaitRequestAnimationFrame = () => new Promise(resolve => window.requestAnimationFrame(() => resolve()))
|
||||||
|
@ -409,12 +409,15 @@ const actions = {
|
||||||
async startTask({ state, rootState, commit, dispatch }, downloadInfo) {
|
async startTask({ state, rootState, commit, dispatch }, downloadInfo) {
|
||||||
// 检查是否可以开始任务
|
// 检查是否可以开始任务
|
||||||
let result = getStartTask(state.list, state.downloadStatus, rootState.setting.download.maxDownloadNum)
|
let result = getStartTask(state.list, state.downloadStatus, rootState.setting.download.maxDownloadNum)
|
||||||
if (result) {
|
if (downloadInfo && !downloadInfo.isComplate && downloadInfo.status != state.downloadStatus.RUN) {
|
||||||
if (!downloadInfo || downloadInfo.isComplate || downloadInfo.status == state.downloadStatus.RUN) downloadInfo = result
|
if (result === false) {
|
||||||
} else {
|
commit('setStatus', { downloadInfo, status: state.downloadStatus.WAITING })
|
||||||
if (downloadInfo) commit('setStatus', { downloadInfo, status: state.downloadStatus.WAITING })
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (!result) return
|
||||||
|
downloadInfo = result
|
||||||
|
}
|
||||||
|
|
||||||
let dl = dls[downloadInfo.key]
|
let dl = dls[downloadInfo.key]
|
||||||
if (dl) {
|
if (dl) {
|
||||||
|
|
|
@ -201,7 +201,7 @@ export const updateSetting = (setting, version) => {
|
||||||
},
|
},
|
||||||
list: {
|
list: {
|
||||||
isShowAlbumName: true,
|
isShowAlbumName: true,
|
||||||
isShowSource: false,
|
isShowSource: true,
|
||||||
scroll: {
|
scroll: {
|
||||||
enable: true,
|
enable: true,
|
||||||
locations: {},
|
locations: {},
|
||||||
|
|
|
@ -614,7 +614,9 @@ export default {
|
||||||
},
|
},
|
||||||
async getMediaDevice() {
|
async getMediaDevice() {
|
||||||
const devices = await navigator.mediaDevices.enumerateDevices()
|
const devices = await navigator.mediaDevices.enumerateDevices()
|
||||||
const audioDevices = devices.filter(device => device.kind === 'audiooutput')
|
let audioDevices = devices.filter(device => device.kind === 'audiooutput')
|
||||||
|
let currentId = this.current_setting.player.mediaDeviceId
|
||||||
|
if (!audioDevices.some(device => device.deviceId === currentId)) this.current_setting.player.mediaDeviceId = 'default'
|
||||||
this.mediaDevices = audioDevices
|
this.mediaDevices = audioDevices
|
||||||
// console.log(this.mediaDevices)
|
// console.log(this.mediaDevices)
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue