mirror of
https://github.com/antebudimir/feishin.git
synced 2026-01-01 10:23:33 +00:00
169 lines
4.6 KiB
TypeScript
169 lines
4.6 KiB
TypeScript
|
|
import { ipcMain } from 'electron';
|
||
|
|
import Player from 'mpris-service';
|
||
|
|
import { QueueSong, RelatedArtist } from '../../../renderer/api/types';
|
||
|
|
import { getMainWindow } from '../../main';
|
||
|
|
import { PlayerRepeat, PlayerShuffle, PlayerStatus } from '/@/renderer/types';
|
||
|
|
|
||
|
|
const mprisPlayer = Player({
|
||
|
|
identity: 'Feishin',
|
||
|
|
maximumRate: 1.0,
|
||
|
|
minimumRate: 1.0,
|
||
|
|
name: 'Feishin',
|
||
|
|
rate: 1.0,
|
||
|
|
supportedInterfaces: ['player'],
|
||
|
|
supportedMimeTypes: ['audio/mpeg', 'application/ogg'],
|
||
|
|
supportedUriSchemes: ['file'],
|
||
|
|
});
|
||
|
|
|
||
|
|
mprisPlayer.on('quit', () => {
|
||
|
|
process.exit();
|
||
|
|
});
|
||
|
|
|
||
|
|
mprisPlayer.on('stop', () => {
|
||
|
|
getMainWindow()?.webContents.send('renderer-player-stop');
|
||
|
|
mprisPlayer.playbackStatus = 'Paused';
|
||
|
|
});
|
||
|
|
|
||
|
|
mprisPlayer.on('pause', () => {
|
||
|
|
getMainWindow()?.webContents.send('renderer-player-pause');
|
||
|
|
mprisPlayer.playbackStatus = 'Paused';
|
||
|
|
});
|
||
|
|
|
||
|
|
mprisPlayer.on('play', () => {
|
||
|
|
getMainWindow()?.webContents.send('renderer-player-play');
|
||
|
|
mprisPlayer.playbackStatus = 'Playing';
|
||
|
|
});
|
||
|
|
|
||
|
|
mprisPlayer.on('playpause', () => {
|
||
|
|
getMainWindow()?.webContents.send('renderer-player-play-pause');
|
||
|
|
if (mprisPlayer.playbackStatus !== 'Playing') {
|
||
|
|
mprisPlayer.playbackStatus = 'Playing';
|
||
|
|
} else {
|
||
|
|
mprisPlayer.playbackStatus = 'Paused';
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
mprisPlayer.on('next', () => {
|
||
|
|
getMainWindow()?.webContents.send('renderer-player-next');
|
||
|
|
|
||
|
|
if (mprisPlayer.playbackStatus !== 'Playing') {
|
||
|
|
mprisPlayer.playbackStatus = 'Playing';
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
mprisPlayer.on('previous', () => {
|
||
|
|
getMainWindow()?.webContents.send('renderer-player-previous');
|
||
|
|
|
||
|
|
if (mprisPlayer.playbackStatus !== 'Playing') {
|
||
|
|
mprisPlayer.playbackStatus = Player.PLAYBACK_STATUS_PLAYING;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
mprisPlayer.on('volume', (event: any) => {
|
||
|
|
getMainWindow()?.webContents.send('mpris-request-volume', {
|
||
|
|
volume: event,
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
mprisPlayer.on('shuffle', (event: boolean) => {
|
||
|
|
getMainWindow()?.webContents.send('mpris-request-toggle-shuffle', { shuffle: event });
|
||
|
|
mprisPlayer.shuffle = event;
|
||
|
|
});
|
||
|
|
|
||
|
|
mprisPlayer.on('loopStatus', (event: string) => {
|
||
|
|
getMainWindow()?.webContents.send('mpris-request-toggle-repeat', { repeat: event });
|
||
|
|
mprisPlayer.loopStatus = event;
|
||
|
|
});
|
||
|
|
|
||
|
|
mprisPlayer.on('position', (event: any) => {
|
||
|
|
getMainWindow()?.webContents.send('mpris-request-position', {
|
||
|
|
position: event.position / 1e6,
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
mprisPlayer.on('seek', (event: number) => {
|
||
|
|
getMainWindow()?.webContents.send('mpris-request-seek', {
|
||
|
|
offset: event / 1e6,
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
ipcMain.on('mpris-update-position', (_event, arg) => {
|
||
|
|
mprisPlayer.getPosition = () => arg * 1e6;
|
||
|
|
});
|
||
|
|
|
||
|
|
ipcMain.on('mpris-update-seek', (_event, arg) => {
|
||
|
|
mprisPlayer.seeked(arg * 1e6);
|
||
|
|
});
|
||
|
|
|
||
|
|
ipcMain.on('mpris-update-volume', (_event, arg) => {
|
||
|
|
mprisPlayer.volume = Number(arg);
|
||
|
|
});
|
||
|
|
|
||
|
|
ipcMain.on('mpris-update-repeat', (_event, arg) => {
|
||
|
|
mprisPlayer.loopStatus = arg;
|
||
|
|
});
|
||
|
|
|
||
|
|
ipcMain.on('mpris-update-shuffle', (_event, arg) => {
|
||
|
|
mprisPlayer.shuffle = arg;
|
||
|
|
});
|
||
|
|
|
||
|
|
ipcMain.on(
|
||
|
|
'mpris-update-song',
|
||
|
|
(
|
||
|
|
_event,
|
||
|
|
args: {
|
||
|
|
currentTime: number;
|
||
|
|
repeat: PlayerRepeat;
|
||
|
|
shuffle: PlayerShuffle;
|
||
|
|
song: QueueSong;
|
||
|
|
status: PlayerStatus;
|
||
|
|
},
|
||
|
|
) => {
|
||
|
|
const { song, status, repeat, shuffle } = args || {};
|
||
|
|
|
||
|
|
try {
|
||
|
|
mprisPlayer.playbackStatus = status;
|
||
|
|
|
||
|
|
if (repeat) {
|
||
|
|
mprisPlayer.loopStatus =
|
||
|
|
repeat === 'all' ? 'Playlist' : repeat === 'one' ? 'Track' : 'None';
|
||
|
|
}
|
||
|
|
|
||
|
|
if (shuffle) {
|
||
|
|
mprisPlayer.shuffle = shuffle;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!song) return;
|
||
|
|
|
||
|
|
const upsizedImageUrl = song.imageUrl
|
||
|
|
? song.imageUrl
|
||
|
|
?.replace(/&size=\d+/, '&size=300')
|
||
|
|
.replace(/\?width=\d+/, '?width=300')
|
||
|
|
.replace(/&height=\d+/, '&height=300')
|
||
|
|
: null;
|
||
|
|
|
||
|
|
mprisPlayer.metadata = {
|
||
|
|
'mpris:artUrl': upsizedImageUrl,
|
||
|
|
'mpris:length': song.duration ? Math.round((song.duration || 0) * 1e6) : null,
|
||
|
|
'mpris:trackid': song?.id
|
||
|
|
? mprisPlayer.objectPath(`track/${song.id?.replace('-', '')}`)
|
||
|
|
: '',
|
||
|
|
'xesam:album': song.album || null,
|
||
|
|
'xesam:albumArtist': song.albumArtists?.length ? song.albumArtists[0].name : null,
|
||
|
|
'xesam:artist':
|
||
|
|
song.artists?.length !== 0
|
||
|
|
? song.artists?.map((artist: RelatedArtist) => artist.name)
|
||
|
|
: null,
|
||
|
|
'xesam:discNumber': song.discNumber ? song.discNumber : null,
|
||
|
|
'xesam:genre': song.genres?.length ? song.genres.map((genre: any) => genre.name) : null,
|
||
|
|
'xesam:title': song.name || null,
|
||
|
|
'xesam:trackNumber': song.trackNumber ? song.trackNumber : null,
|
||
|
|
'xesam:useCount':
|
||
|
|
song.playCount !== null && song.playCount !== undefined ? song.playCount : null,
|
||
|
|
};
|
||
|
|
} catch (err) {
|
||
|
|
console.log(err);
|
||
|
|
}
|
||
|
|
},
|
||
|
|
);
|