diff --git a/.travis.yml b/.travis.yml index b14318c0..7284625e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,12 @@ matrix: - os: linux dist: trusty + sudo: required + addons: + apt: + packages: + - rpm + - bsdtar cache: directories: diff --git a/package.json b/package.json index cc33d169..3c864192 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "0.18.2", + "version": "0.18.3", "description": "一个免费的音乐下载助手", "main": "./dist/electron/main.js", "productName": "lx-music-desktop", @@ -32,11 +32,13 @@ "publish:mac": "npm run publish:mac:dmg", "publish:mac:dmg": "electron-builder -m=dmg -p onTagOrDraft", "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: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: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:mac": "node build-config/pack.js && electron-builder -m=dmg", "pack:dir": "node build-config/pack.js && electron-builder --dir", diff --git a/publish/changeLog.md b/publish/changeLog.md index 105616e8..a42e6497 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,3 +1,14 @@ +### 新增 + +- 新增`rpm`、`pacman`包的打包 + ### 修复 -- 修复开启托盘时,可能导致无法自动更新的问题 +- 修复按住`Ctrl`等键触发多选机制时不松开按键的情况下切换到其他窗口后再松开按键,这时切回软件不按按键都处在多选模式的问题 +- 修复Linux版开启托盘无法退出的问题 +- 修复某些情况下可能导致的音源输出问题 +- 修复某些情况下无法开始下载任务的问题 + +### 更变 + +- 修改设置-列表-是否显示歌曲源的默认设置为选中(该变更不影响之前的设置) diff --git a/src/main/index.js b/src/main/index.js index 979e5c9f..022e0154 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -22,6 +22,18 @@ app.on('second-instance', (event, argv, cwd) => { const isDev = global.isDev = process.env.NODE_ENV !== 'production' 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) => { 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('./events') require('./rendererEvents') const winEvent = require('./rendererEvents/winEvent') const autoUpdate = require('./utils/autoUpdate') -const { isMac, isLinux } = require('../common/utils') let winURL diff --git a/src/main/rendererEvents/winEvent.js b/src/main/rendererEvents/winEvent.js index 5bbd0139..42957e21 100644 --- a/src/main/rendererEvents/winEvent.js +++ b/src/main/rendererEvents/winEvent.js @@ -1,10 +1,10 @@ -const { isMac } = require('../../common/utils') +const { isWin } = require('../../common/utils') global.isQuitting = false global.isTrafficLightClose = false // 是否点击软件上的关闭按钮关闭 module.exports = mainWindow => { 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) return } @@ -21,6 +21,9 @@ module.exports = mainWindow => { // mainWindow.on('restore', () => { // mainWindow.webContents.send('restore') // }) + mainWindow.on('focus', () => { + mainWindow.webContents.send('focus') + }) mainWindow.once('ready-to-show', () => { mainWindow.show() diff --git a/src/renderer/components/core/Player.vue b/src/renderer/components/core/Player.vue index c5e108dd..411083d5 100644 --- a/src/renderer/components/core/Player.vue +++ b/src/renderer/components/core/Player.vue @@ -617,12 +617,12 @@ export default { }, async setMediaDevice() { let mediaDeviceId = this.setting.player.mediaDeviceId - if (!mediaDeviceId) return const devices = await navigator.mediaDevices.enumerateDevices() let device = devices.find(device => device.deviceId === mediaDeviceId) - if (!device) return this.setMediaDeviceId('default') + const deviceId = device ? device.deviceId : 'default' + // console.log(device) - this.audio.setSinkId(device.deviceId).catch((err) => { + this.audio.setSinkId(deviceId).catch(err => { console.log(err) this.setMediaDeviceId('default') }) diff --git a/src/renderer/config/bindkey.js b/src/renderer/config/bindkey.js index 9eb16f47..eaddc52d 100644 --- a/src/renderer/config/bindkey.js +++ b/src/renderer/config/bindkey.js @@ -1,41 +1,38 @@ import mousetrap from 'mousetrap' + let eventHub +const bindKeys = [ + 'shift', + 'mod', + 'mod+a', +] + const bindKey = () => { mousetrap.reset() - mousetrap.bind('shift', (event, combo) => { - eventHub.$emit('key_shift_down', { event, combo }) - return false - }, 'keydown') - mousetrap.bind('shift', (event, combo) => { - eventHub.$emit('key_shift_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 - }, 'keyup') + for (const key of bindKeys) { + mousetrap.bind(key, (event, combo) => { + eventHub.$emit(`key_${key}_down`, { event, combo }) + return false + }, 'keydown') + mousetrap.bind(key, (event, combo) => { + eventHub.$emit(`key_${key}_up`, { event, combo }) + return false + }, 'keyup') + } } const unbindKey = () => { - mousetrap.unbind('shift', 'keydown') - mousetrap.unbind('shift', 'keyup') - mousetrap.unbind('mod', 'keydown') - mousetrap.unbind('mod', 'keyup') - mousetrap.unbind('mod+a', 'keydown') - mousetrap.unbind('mod+a', 'keyup') + for (const key of bindKeys) { + mousetrap.unbind(key, 'keydown') + mousetrap.unbind(key, 'keyup') + } +} + +const handleFocus = () => { + for (const key of bindKeys) { + eventHub.$emit(`key_${key}_up`, { combo: key }) + } } export default () => { @@ -43,4 +40,5 @@ export default () => { eventHub.$on('bindKey', bindKey) eventHub.$on('unbindKey', unbindKey) + eventHub.$on('focus', handleFocus) } diff --git a/src/renderer/config/event.js b/src/renderer/config/event.js new file mode 100644 index 00000000..e4e0cb6d --- /dev/null +++ b/src/renderer/config/event.js @@ -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') +}) diff --git a/src/renderer/main.js b/src/renderer/main.js index bfc2085f..d2791bc8 100644 --- a/src/renderer/main.js +++ b/src/renderer/main.js @@ -1,6 +1,8 @@ import Vue from 'vue' import { sync } from 'vuex-router-sync' +import './config/event' + // Components import './components' @@ -14,14 +16,8 @@ import store from './store' import '../common/error' -import bindkey from './config/bindkey' - sync(store, router) -window.eventHub = new Vue() - -bindkey() - Vue.config.productionTip = false new Vue({ diff --git a/src/renderer/store/modules/download.js b/src/renderer/store/modules/download.js index 4d7c5894..de8695eb 100644 --- a/src/renderer/store/modules/download.js +++ b/src/renderer/store/modules/download.js @@ -68,7 +68,7 @@ const getStartTask = (list, downloadStatus, maxDownloadNum) => { let downloadCount = 0 const waitList = list.filter(item => item.status == downloadStatus.WAITING ? true : (item.status === downloadStatus.RUN && ++downloadCount && false)) // 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())) @@ -409,11 +409,14 @@ const actions = { async startTask({ state, rootState, commit, dispatch }, downloadInfo) { // 检查是否可以开始任务 let result = getStartTask(state.list, state.downloadStatus, rootState.setting.download.maxDownloadNum) - if (result) { - if (!downloadInfo || downloadInfo.isComplate || downloadInfo.status == state.downloadStatus.RUN) downloadInfo = result + if (downloadInfo && !downloadInfo.isComplate && downloadInfo.status != state.downloadStatus.RUN) { + if (result === false) { + commit('setStatus', { downloadInfo, status: state.downloadStatus.WAITING }) + return + } } else { - if (downloadInfo) commit('setStatus', { downloadInfo, status: state.downloadStatus.WAITING }) - return + if (!result) return + downloadInfo = result } let dl = dls[downloadInfo.key] diff --git a/src/renderer/utils/index.js b/src/renderer/utils/index.js index 974e75da..62bad9e2 100644 --- a/src/renderer/utils/index.js +++ b/src/renderer/utils/index.js @@ -201,7 +201,7 @@ export const updateSetting = (setting, version) => { }, list: { isShowAlbumName: true, - isShowSource: false, + isShowSource: true, scroll: { enable: true, locations: {}, diff --git a/src/renderer/views/Setting.vue b/src/renderer/views/Setting.vue index f48c8bab..004129b0 100644 --- a/src/renderer/views/Setting.vue +++ b/src/renderer/views/Setting.vue @@ -614,7 +614,9 @@ export default { }, async getMediaDevice() { 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 // console.log(this.mediaDevices) },