orchard/oldshit/resources/functions/media/mpris.js
2021-12-04 00:04:04 -06:00

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';
},
}