Merge branch 'dev' into v1

This commit is contained in:
lyswhut
2020-05-08 20:24:12 +08:00
13 changed files with 223 additions and 182 deletions
+3 -1
View File
@@ -32,7 +32,9 @@ global.envParams = parseEnv()
app.commandLine.appendSwitch('wm-window-animations-disabled')
// https://github.com/electron/electron/issues/18397
app.allowRendererProcessReuse = true
// 开发模式下为true时 多次引入native模块会导致渲染进程卡死
// https://github.com/electron/electron/issues/22791
app.allowRendererProcessReuse = !isDev
app.on('web-contents-created', (event, contents) => {
+19 -4
View File
@@ -135,11 +135,13 @@ export default {
this.setVolume(volume)
}, 300)
navigator.mediaDevices.addEventListener('devicechange', this.handleMediaListChange)
document.addEventListener('mousemove', this.handleVolumeMsMove)
document.addEventListener('mouseup', this.handleVolumeMsUp)
window.addEventListener('resize', this.handleResize)
},
beforeDestroy() {
navigator.mediaDevices.removeEventListener('devicechange', this.handleMediaListChange)
document.removeEventListener('mousemove', this.handleVolumeMsMove)
document.removeEventListener('mouseup', this.handleVolumeMsUp)
window.removeEventListener('resize', this.handleResize)
@@ -479,6 +481,7 @@ export default {
return this.getUrl({ musicInfo: targetSong, type, isRefresh }).then(() => {
this.audio.src = this.musicInfo.url = targetSong.typeUrl[type]
}).catch(err => {
// console.log('err', err.message)
if (err.message == requestMsg.cancelRequest) return
if (!isRetryed) return this.setUrl(targetSong, isRefresh, true)
this.status = this.statusText = err.message
@@ -617,16 +620,28 @@ export default {
},
async setMediaDevice() {
let mediaDeviceId = this.setting.player.mediaDeviceId
const devices = await navigator.mediaDevices.enumerateDevices()
let device = devices.find(device => device.deviceId === mediaDeviceId)
const deviceId = device ? device.deviceId : 'default'
if (mediaDeviceId != 'default') {
const devices = await navigator.mediaDevices.enumerateDevices()
let device = devices.find(device => device.deviceId === mediaDeviceId)
mediaDeviceId = device ? device.deviceId : 'default'
}
// console.log(device)
this.audio.setSinkId(deviceId).catch(err => {
this.audio.setSinkId(mediaDeviceId).catch(err => {
console.log(err)
this.setMediaDeviceId('default')
})
},
async handleMediaListChange() {
let mediaDeviceId = this.setting.player.mediaDeviceId
const devices = await navigator.mediaDevices.enumerateDevices()
let device = devices.find(device => device.deviceId === mediaDeviceId)
if (device) return
// console.log(device)
this.setMediaDeviceId('default')
console.log(this.setting.player.isMediaDeviceRemovedStopPlay, this.isPlay)
if (this.setting.player.isMediaDeviceRemovedStopPlay && this.isPlay) this.togglePlay()
},
handlePlayDetailAction({ type, data }) {
switch (type) {
case 'prev':
+2 -2
View File
@@ -38,8 +38,8 @@
"play_task_bar": "任务栏播放进度条",
"play_mediaDevice_title": "选择声音输出的媒体设备",
"play_mediaDevice": "音频输出",
"play_mediaDevice_refresh_btn_title": "刷新音频设备列表",
"play_mediaDevice_refresh_btn": "刷新",
"play_mediaDevice_remove_stop_play": "所选音频输出设备被移除时是否暂停播放",
"play_mediaDevice_remove_stop_play_title": "所选的声音输出设备被移除时是否暂停播放歌曲",
"search": "搜索设置",
"search_hot_title": "是否显示热门搜索",
+2 -2
View File
@@ -37,8 +37,8 @@
"play_task_bar": "任務欄播放進度條",
"play_mediaDevice_title": "選擇聲音輸出的媒體設備",
"play_mediaDevice": "音頻輸出",
"play_mediaDevice_refresh_btn_title": "刷新音頻設備列表",
"play_mediaDevice_refresh_btn": "刷新",
"play_mediaDevice_remove_stop_play": "所選音頻輸出設備被移除時是否暫停播放",
"play_mediaDevice_remove_stop_play_title": "所選的聲音輸出設備被移除時是否暫停播放歌曲",
"search": "搜索設置",
"search_hot_title": "是否顯示熱門搜索",
"search_hot": "熱門搜索",
+2 -2
View File
@@ -38,8 +38,8 @@
"play_task_bar": "Taskbar play progress bar",
"play_mediaDevice_title": "Select a media device for audio output",
"play_mediaDevice": "Audio output",
"play_mediaDevice_refresh_btn_title": "Refresh audio device list",
"play_mediaDevice_refresh_btn": "Refresh",
"play_mediaDevice_remove_stop_play": "Whether to pause playback when the selected audio output device is removed",
"play_mediaDevice_remove_stop_play_title": "Whether to pause the song when the selected sound output device is removed",
"search": "Search",
"search_hot_title": "Select whether to show popular searches",
+11 -5
View File
@@ -36,26 +36,32 @@ const actions = {
urlRequest = music[musicInfo.source].getMusicUrl(musicInfo, type)
return urlRequest.promise.then(result => {
commit('setUrl', { musicInfo, url: result.url, type })
}).finally(() => {
urlRequest = null
}).catch(err => {
urlRequest = null
return Promise.reject(err)
})
},
getPic({ commit, state }, musicInfo) {
if (picRequest && picRequest.cancelHttp) picRequest.cancelHttp()
picRequest = music[musicInfo.source].getPic(musicInfo)
return picRequest.promise.then(url => {
commit('getPic', { musicInfo, url })
}).finally(() => {
picRequest = null
commit('getPic', { musicInfo, url })
}).catch(err => {
picRequest = null
return Promise.reject(err)
})
},
getLrc({ commit, state }, musicInfo) {
if (lrcRequest && lrcRequest.cancelHttp) lrcRequest.cancelHttp()
lrcRequest = music[musicInfo.source].getLyric(musicInfo)
return lrcRequest.promise.then(lrc => {
commit('setLrc', { musicInfo, lrc })
}).finally(() => {
lrcRequest = null
commit('setLrc', { musicInfo, lrc })
}).catch(err => {
lrcRequest = null
return Promise.reject(err)
})
},
}
+2 -1
View File
@@ -184,7 +184,7 @@ export const objectDeepMerge = (target, source) => {
* @param {*} setting
*/
export const updateSetting = (setting, version) => {
const defaultVersion = '1.0.23'
const defaultVersion = '1.0.24'
if (!version) {
if (setting) {
version = setting.version
@@ -198,6 +198,7 @@ export const updateSetting = (setting, version) => {
isShowTaskProgess: true,
volume: 1,
mediaDeviceId: 'default',
isMediaDeviceRemovedStopPlay: false,
},
list: {
isShowAlbumName: true,
+1
View File
@@ -1,6 +1,7 @@
export const requestMsg = {
fail: '请求异常😮,可以多试几次,若还是不行就换一首吧。。。',
unachievable: '哦No😱...接口无法访问了!',
timeout: '请求超时',
// unachievable: '哦No😱...接口无法访问了!已帮你切换到临时接口,重试下看能不能播放吧~',
notConnectNetwork: '无法连接到服务器',
cancelRequest: '取消http请求',
+28 -37
View File
@@ -46,44 +46,32 @@ const defaultHeaders = {
* @param {*} options
*/
const buildHttpPromose = (url, options) => {
let requestObj
let cancelFn
let isCancelled = false
let p = new Promise((resolve, reject) => {
cancelFn = reject
let obj = {
isCancelled: false,
}
obj.promise = new Promise((resolve, reject) => {
obj.cancelFn = reject
debugRequest && console.log(`\n---send request------${url}------------`)
fetchData(url, options.method, options, (err, resp, body) => {
// options.isShowProgress && window.api.hideProgress()
debugRequest && console.log(`\n---response------${url}------------`)
debugRequest && console.log(body)
requestObj = null
cancelFn = null
if (err) {
// console.log('出错', err.code)
if (err.code === 'ETIMEDOUT' || err.code == 'ESOCKETTIMEDOUT') {
const { promise, cancelHttp } = httpFetch(url, options)
obj.cancelHttp = cancelHttp
promise.then(resp => resolve(resp)).catch(err => reject(err))
return
}
return reject(err)
}
obj.requestObj = null
obj.cancelFn = null
if (err) return reject(err)
resolve(resp)
}).then(ro => {
requestObj = ro
if (isCancelled) obj.cancelHttp()
obj.requestObj = ro
if (obj.isCancelled) obj.cancelHttp()
})
})
const obj = {
promise: p,
cancelHttp() {
if (!requestObj) return isCancelled = true
cancelFn(new Error(requestMsg.cancelRequest))
cancelHttp(requestObj)
requestObj = null
cancelFn = null
p = null
},
obj.cancelHttp = () => {
if (!obj.requestObj) return obj.isCancelled = true
obj.cancelFn(new Error(requestMsg.cancelRequest))
cancelHttp(obj.requestObj)
obj.requestObj = null
obj.cancelFn = null
obj.promise = obj.cancelHttp = null
}
return obj
}
@@ -96,18 +84,20 @@ const buildHttpPromose = (url, options) => {
export const httpFetch = (url, options = { method: 'get' }) => {
const requestObj = buildHttpPromose(url, options)
requestObj.promise = requestObj.promise.catch(err => {
if (err.code === 'ETIMEDOUT' || err.code == 'ESOCKETTIMEDOUT') {
const { promise, cancelHttp } = httpFetch(url, options)
requestObj.cancelHttp()
requestObj.cancelHttp = cancelHttp
return promise
}
// console.log('出错', err)
if (err.message === 'socket hang up') {
// window.globalObj.apiSource = 'temp'
return Promise.reject(new Error(requestMsg.unachievable))
}
if (err.code === 'ENOTFOUND') return Promise.reject(new Error(requestMsg.notConnectNetwork))
return Promise.reject(err)
switch (err.code) {
case 'ETIMEDOUT':
case 'ESOCKETTIMEDOUT':
return Promise.reject(new Error(requestMsg.timeout))
case 'ENOTFOUND':
return Promise.reject(new Error(requestMsg.notConnectNetwork))
default:
return Promise.reject(err)
}
})
return requestObj
}
@@ -117,6 +107,7 @@ export const httpFetch = (url, options = { method: 'get' }) => {
* @param {*} index
*/
export const cancelHttp = requestObj => {
console.log(requestObj)
if (!requestObj) return
console.log('cancel:', requestObj.href)
requestObj.abort()
+12 -16
View File
@@ -60,14 +60,14 @@ div.scroll(:class="$style.setting")
h3 {{$t('view.setting.play_task_bar')}}
div
material-checkbox(id="setting_player_showTaskProgess" v-model="current_setting.player.isShowTaskProgess" :label="$t('view.setting.is_enable')")
dd(:title="$t('view.setting.play_mediaDevice_remove_stop_play_title')")
h3 {{$t('view.setting.play_mediaDevice_remove_stop_play')}}
div
material-checkbox(id="setting_player_isMediaDeviceRemovedStopPlay" v-model="current_setting.player.isMediaDeviceRemovedStopPlay" :label="$t('view.setting.is_enable')")
dd(:title="$t('view.setting.play_mediaDevice_title')")
h3 {{$t('view.setting.play_mediaDevice')}}
div
material-selection(:list="mediaDevices" :class="$style.gapLeft" v-model="current_setting.player.mediaDeviceId" item-key="deviceId" item-name="label")
material-btn(min :title="$t('view.setting.play_mediaDevice_refresh_btn_title')" :class="[$style.btnMediaDeviceRefresh, $style.gapLeft]" @click="getMediaDevice")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 512 512' space='preserve')
use(xlink:href='#icon-refresh')
span {{$t('view.setting.play_mediaDevice_refresh_btn')}}
dt {{$t('view.setting.search')}}
dd(:title="$t('view.setting.search_hot_title')")
@@ -318,6 +318,7 @@ export default {
isShowTaskProgess: true,
volume: 1,
mediaDeviceId: 'default',
isMediaDeviceRemovedStopPlay: false,
},
list: {
isShowAlbumName: true,
@@ -381,6 +382,9 @@ export default {
'setting.isAgreePact'(n) {
this.current_setting.isAgreePact = n
},
'setting.player.mediaDeviceId'(n) {
this.current_setting.player.mediaDeviceId = n
},
'current_setting.player.isShowTaskProgess'(n) {
if (n) return
this.$nextTick(() => {
@@ -392,8 +396,12 @@ export default {
},
},
mounted() {
navigator.mediaDevices.addEventListener('devicechange', this.getMediaDevice)
this.init()
},
beforeDestroy() {
navigator.mediaDevices.removeEventListener('devicechange', this.getMediaDevice)
},
methods: {
...mapMutations(['setSetting', 'setSettingVersion', 'setVersionModalVisible']),
...mapMutations('list', ['setList']),
@@ -615,8 +623,6 @@ export default {
async getMediaDevice() {
const devices = await navigator.mediaDevices.enumerateDevices()
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)
},
@@ -760,16 +766,6 @@ export default {
})
}
}
.btn-media-device-refresh {
height: 28px;
line-height: 28px;
padding: 0px 15px;
svg {
width: 1em;
vertical-align: middle;
margin-right: 5px;
}
}
.save-path {
font-size: 12px;