119 lines
No EOL
4 KiB
JavaScript
119 lines
No EOL
4 KiB
JavaScript
const {app} = require('electron'),
|
|
Player = require('mpris-service'),
|
|
{initAnalytics} = require('../utils');
|
|
initAnalytics();
|
|
|
|
// Remember to use playerctl when debugging this.
|
|
// I'm just putting this here as I keep forgetting the command.
|
|
|
|
module.exports = {
|
|
connect: function () {
|
|
if (process.platform !== "linux") {
|
|
app.mpris = {active: false}
|
|
return;
|
|
}
|
|
console.log('[MPRIS][connect] Initializing Connection.')
|
|
|
|
try {
|
|
app.mpris = Player({
|
|
name: 'AppleMusic',
|
|
identity: 'Apple Music',
|
|
supportedUriSchemes: [],
|
|
supportedMimeTypes: [],
|
|
supportedInterfaces: ['player']
|
|
});
|
|
app.mpris = Object.assign(app.mpris, { active: false, canQuit: true, canControl: true, canPause: true, canPlay: true, canGoNext: true })
|
|
} catch (err) {
|
|
app.mpris.active = false
|
|
console.error(`[MPRIS][connect] ${err}`)
|
|
return
|
|
}
|
|
|
|
let pos_atr = {durationInMillis: 0};
|
|
app.mpris.getPosition = function () {
|
|
const durationInMicro = pos_atr.durationInMillis * 1000;
|
|
const percentage = parseFloat(0) || 0;
|
|
return durationInMicro * percentage;
|
|
}
|
|
|
|
app.mpris.active = true
|
|
|
|
this.clearActivity()
|
|
this.stateHandler()
|
|
},
|
|
|
|
stateHandler: function () {
|
|
app.mpris.on('playpause', async () => {
|
|
app.win.webContents.executeJavaScript('MusicKitInterop.pausePlay()').catch(err => console.error(err))
|
|
});
|
|
|
|
app.mpris.on('play', async () => {
|
|
app.win.webContents.executeJavaScript('MusicKitInterop.pausePlay()').catch(err => console.error(err))
|
|
});
|
|
|
|
app.mpris.on('pause', async () => {
|
|
app.win.webContents.executeJavaScript('MusicKitInterop.pausePlay()').catch(err => console.error(err))
|
|
});
|
|
|
|
app.mpris.on('next', async () => {
|
|
app.win.webContents.executeJavaScript('MusicKitInterop.nextTrack()').catch(err => console.error(err))
|
|
});
|
|
|
|
app.mpris.on('previous', async () => {
|
|
app.win.webContents.executeJavaScript('MusicKitInterop.previousTrack()').catch(err => console.error(err))
|
|
});
|
|
},
|
|
|
|
updateActivity: function (attributes) {
|
|
if (!app.mpris.active) return;
|
|
|
|
console.verbose('[MPRIS][updateActivity] Updating Song Activity.')
|
|
|
|
const MetaData = {
|
|
'mpris:trackid': app.mpris.objectPath(`track/${attributes.playParams.id.replace(/[.]+/g, "")}`),
|
|
'mpris:length': attributes.durationInMillis * 1000, // In microseconds
|
|
'mpris:artUrl': (attributes.artwork.url.replace('/{w}x{h}bb', '/512x512bb')).replace('/2000x2000bb', '/35x35bb'),
|
|
'xesam:title': `${attributes.name}`,
|
|
'xesam:album': `${attributes.albumName}`,
|
|
'xesam:artist': [`${attributes.artistName}`,],
|
|
'xesam:genre': attributes.genreNames
|
|
}
|
|
|
|
if (app.mpris.metadata["mpris:trackid"] === MetaData["mpris:trackid"]) {
|
|
return
|
|
}
|
|
|
|
app.mpris.metadata = MetaData
|
|
},
|
|
|
|
updateState: function (attributes) {
|
|
if (!app.mpris.active) return;
|
|
|
|
console.verbose('[MPRIS][updateState] Updating Song Playback State.')
|
|
|
|
function setPlaybackIfNeeded(status) {
|
|
if (app.mpris.playbackStatus === status) {
|
|
return
|
|
}
|
|
app.mpris.playbackStatus = status;
|
|
}
|
|
|
|
switch (attributes.status) {
|
|
case true: // Playing
|
|
setPlaybackIfNeeded('Playing');
|
|
break;
|
|
case false: // Paused
|
|
setPlaybackIfNeeded('Paused');
|
|
break;
|
|
default: // Stopped
|
|
setPlaybackIfNeeded('Stopped');
|
|
break;
|
|
}
|
|
},
|
|
|
|
clearActivity: function () {
|
|
if (!app.mpris.active) return;
|
|
app.mpris.metadata = {'mpris:trackid': '/org/mpris/MediaPlayer2/TrackList/NoTrack'}
|
|
app.mpris.playbackStatus = 'Stopped';
|
|
},
|
|
} |