feat: mpris support (#1279)

* feat: mpris support

* fix: 修复网页版无法播放

* fix: 修复在 Player.js 里 ipcRenderer 为空时引发的错误

* docs: update README

* docs: update README

Co-authored-by: memorydream <34763046+memorydream@users.noreply.github.com>
This commit is contained in:
CNawalol 2022-01-30 00:37:12 +08:00 committed by GitHub
parent 5a5fb1f191
commit d15b58d805
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 235 additions and 8 deletions

62
src/electron/mpris.js Normal file
View file

@ -0,0 +1,62 @@
import { ipcMain, app } from 'electron';
export function createMpris(window) {
const Player = require('mpris-service');
const renderer = window.webContents;
const player = Player({
name: 'yesplaymusic',
identity: 'YesPlayMusic',
});
player.on('next', () => renderer.send('next'));
player.on('previous', () => renderer.send('previous'));
player.on('playpause', () => renderer.send('play'));
player.on('play', () => renderer.send('play'));
player.on('pause', () => renderer.send('play'));
player.on('quit', () => app.exit());
player.on('position', args =>
renderer.send('setPosition', args.position / 1000 / 1000)
);
player.on('loopStatus', () => renderer.send('repeat'));
player.on('shuffle', () => renderer.send('shuffle'));
ipcMain.on('player', (e, { playing }) => {
player.playbackStatus = playing
? Player.PLAYBACK_STATUS_PLAYING
: Player.PLAYBACK_STATUS_PAUSED;
});
ipcMain.on('metadata', (e, metadata) => {
player.metadata = {
'mpris:trackid': player.objectPath('track/' + metadata.trackId),
'mpris:artUrl': metadata.artwork[0].src,
'mpris:length': metadata.length * 1000 * 1000,
'xesam:title': metadata.title,
'xesam:album': metadata.album,
'xesam:artist': metadata.artist.split(','),
};
});
ipcMain.on('playerCurrentTrackTime', (e, position) => {
player.getPosition = () => position * 1000 * 1000;
});
ipcMain.on('switchRepeatMode', (e, mode) => {
switch (mode) {
case 'off':
player.loopStatus = Player.LOOP_STATUS_NONE;
break;
case 'one':
player.loopStatus = Player.LOOP_STATUS_TRACK;
break;
case 'on':
player.loopStatus = Player.LOOP_STATUS_PLAYLIST;
break;
}
});
ipcMain.on('switchShuffle', (e, shuffle) => {
player.shuffle = shuffle;
});
}