Files
Melo/src/renderer/core/useApp/usePlayer/useMediaSessionInfo.ts
T
2022-10-29 11:36:35 +08:00

124 lines
4.1 KiB
TypeScript

import { onBeforeUnmount } from '@common/utils/vueTools'
import { getDuration, getPlaybackRate, getCurrentTime } from '@renderer/plugins/player'
import { musicInfo } from '@renderer/store/player/state'
import { playProgress } from '@renderer/store/player/playProgress'
import { playNext, playPrev, stop } from '@renderer/core/player'
// import { } from ''
export default () => {
const updateMediaSessionInfo = () => {
const mediaMetadata: MediaMetadata = {
title: musicInfo.name,
artist: musicInfo.singer,
album: musicInfo.album,
artwork: [],
}
if (musicInfo.pic) mediaMetadata.artwork = [{ src: musicInfo.pic }]
// @ts-expect-error
navigator.mediaSession.metadata = new window.MediaMetadata(mediaMetadata)
}
const updatePositionState = (state: {
duration?: number
position?: number
playbackRate?: number
} = {}) => {
navigator.mediaSession.setPositionState({
duration: state.duration ?? getDuration(),
playbackRate: state.playbackRate ?? getPlaybackRate(),
position: state.position ?? getCurrentTime(),
})
}
const setProgress = (time: number) => {
window.app_event.setProgress(time)
}
const setStop = () => {
stop()
}
const handlePlay = () => {
navigator.mediaSession.playbackState = 'playing'
}
const handlePause = () => {
navigator.mediaSession.playbackState = 'paused'
}
const handleStop = () => {
navigator.mediaSession.playbackState = 'none'
}
const handleSetPlayInfo = () => {
updateMediaSessionInfo()
updatePositionState({
position: playProgress.nowPlayTime,
duration: playProgress.maxPlayTime,
})
handlePause()
}
// const registerMediaSessionHandler = () => {
// navigator.mediaSession.setActionHandler('play', () => {
// if (this.isPlay || !this.playMusicInfo) return
// console.log('play')
// this.startPlay()
// })
// navigator.mediaSession.setActionHandler('pause', () => {
// if (!this.isPlay || !this.playMusicInfo) return
// console.log('pause')
// this.stopPlay()
// })
navigator.mediaSession.setActionHandler('stop', () => {
console.log('stop')
setStop()
})
navigator.mediaSession.setActionHandler('seekbackward', details => {
console.log('seekbackward')
const seekOffset = details.seekOffset == null ? 5 : details.seekOffset
setProgress(Math.max(getCurrentTime() - seekOffset, 0))
})
navigator.mediaSession.setActionHandler('seekforward', details => {
console.log('seekforward')
const seekOffset = details.seekOffset == null ? 5 : details.seekOffset
setProgress(Math.min(getCurrentTime() + seekOffset, getDuration()))
})
navigator.mediaSession.setActionHandler('seekto', details => {
console.log('seekto', details.seekTime)
if (details.seekTime == null) return
let time = Math.min(details.seekTime, getDuration())
time = Math.max(time, 0)
setProgress(time)
})
navigator.mediaSession.setActionHandler('previoustrack', () => {
console.log('previoustrack')
void playPrev()
})
navigator.mediaSession.setActionHandler('nexttrack', () => {
console.log('nexttrack')
void playNext()
})
// navigator.mediaSession.setActionHandler('skipad', () => {
// console.log('')
// })
// }
window.app_event.on('playerLoadeddata', updatePositionState)
window.app_event.on('playerCanplay', updatePositionState)
window.app_event.on('play', handlePlay)
window.app_event.on('pause', handlePause)
window.app_event.on('stop', handleStop)
window.app_event.on('error', handlePause)
window.app_event.on('musicToggled', handleSetPlayInfo)
window.app_event.on('picUpdated', updateMediaSessionInfo)
onBeforeUnmount(() => {
window.app_event.off('playerLoadeddata', updatePositionState)
window.app_event.off('playerCanplay', updatePositionState)
window.app_event.off('play', handlePlay)
window.app_event.off('pause', handlePause)
window.app_event.off('stop', handleStop)
window.app_event.off('error', handlePause)
window.app_event.off('musicToggled', handleSetPlayInfo)
window.app_event.off('picUpdated', updateMediaSessionInfo)
})
}