Merge branch 'dev' into v1
This commit is contained in:
@@ -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':
|
||||
|
||||
@@ -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": "是否显示热门搜索",
|
||||
|
||||
@@ -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": "熱門搜索",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
})
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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,6 +1,7 @@
|
||||
export const requestMsg = {
|
||||
fail: '请求异常😮,可以多试几次,若还是不行就换一首吧。。。',
|
||||
unachievable: '哦No😱...接口无法访问了!',
|
||||
timeout: '请求超时',
|
||||
// unachievable: '哦No😱...接口无法访问了!已帮你切换到临时接口,重试下看能不能播放吧~',
|
||||
notConnectNetwork: '无法连接到服务器',
|
||||
cancelRequest: '取消http请求',
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user