From a808839d950d6f4ad50763d7255a7edbbd32e516 Mon Sep 17 00:00:00 2001 From: josselinonduty Date: Mon, 21 Apr 2025 01:43:50 +0900 Subject: [PATCH] fix: add better management of MPRIS --- build/main.js | 65 +++++++++++++++++++++++++++++++++++++++++++-------- package.json | 1 + 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/build/main.js b/build/main.js index e03556c..1878712 100644 --- a/build/main.js +++ b/build/main.js @@ -89,6 +89,10 @@ external_semver_default = __webpack_require__.n( external_semver_namespaceObject ); + const external_electron_mpris_namespaceObject = require("@jellybrick/mpris-service"); + var external_electron_mpris_default = __webpack_require__.n( + external_electron_mpris_namespaceObject + ); function isPlatform(platform) { switch (platform) { case PLATFORM.WINDOWS: @@ -1187,8 +1191,9 @@ }; }; let MediaService = class extends external_events_namespaceObject.EventEmitter { - constructor(ipc, user) { + constructor(ipc, user, app) { super(), + (this.app = app), (this.smtc = null), (this.track = {}), (this.player = {}), @@ -1196,6 +1201,11 @@ (this.debounceOptions = { leading: !0, maxWait: 500 }), (this.ipc = ipc), (this.user = user), + (this.mprisPlayer = new external_electron_mpris_namespaceObject({ + name: "deezer", + identity: "Deezer", + supportedInterfaces: ["player"], + })), isPlatform(PLATFORM.LINUX) && (this.user.addListener(UserEvents.LoggedIn, () => { this.start(); @@ -1203,6 +1213,21 @@ this.user.addListener(UserEvents.LoggedOut, () => { this.stop(); })); + this.initMprisPlayerControls(); + } + initMprisPlayerControls() { + // Events => ['raise', 'quit', 'next', 'previous', 'pause', 'playpause', 'stop', 'play', 'seek', 'position', 'open', 'volume', 'loopStatus', 'shuffle']; + this.mprisPlayer.on("play", this.play.bind(this)); + this.mprisPlayer.on("pause", this.pause.bind(this)); + this.mprisPlayer.on("playpause", () => + this.player.state === "playing" ? this.pause() : this.play() + ); + this.mprisPlayer.on("stop", this.stop.bind(this)); + this.mprisPlayer.on("next", this.next.bind(this)); + this.mprisPlayer.on("previous", this.prev.bind(this)); + this.mprisPlayer.on("shuffle", this.setSuffle.bind(this)); + this.mprisPlayer.on("loopStatus", this.setRepeatMode.bind(this)); + this.mprisPlayer.on("raise", () => this.app.getWindow().show()); } play() { this.ipc.send("channel-player-media-control", MediaPlayerControl.Play); @@ -1230,11 +1255,22 @@ } setTrackInfo(track) { (this.track = Object.assign(this.track, track)), - this.emit(MediaEvents.TrackUpdated, this.track); + this.emit(MediaEvents.TrackUpdated, this.track), + (this.mprisPlayer.metadata = { + "mpris:trackid": this.mprisPlayer.objectPath("track/0"), + "mpris:artUrl": track.coverUrl, + "xesam:title": track.title, + "xesam:album": track.album, + "xesam:artist": [track.artist], + }); } setPlayerInfo(player) { (this.player = Object.assign(this.player, player)), - this.emit(MediaEvents.PlayerUpdated, this.player); + this.emit(MediaEvents.PlayerUpdated, this.player), + (this.mprisPlayer.playbackStatus = + this.player.state === "playing" + ? external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PLAYING + : external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PAUSED); } getTrackInfo() { return this.track; @@ -1294,7 +1330,11 @@ 1, (0, external_inversify_namespaceObject.inject)(SERVICE_USER) ), - MediaService_metadata("design:paramtypes", [Object, Object]), + MediaService_param( + 2, + (0, external_inversify_namespaceObject.inject)(SERVICE_APPLICATION) + ), + MediaService_metadata("design:paramtypes", [Object, Object, Object]), ], MediaService ); @@ -2732,15 +2772,16 @@ const PlayerIpc_ipc = main_di.get(SERVICE_IPC), media = main_di.get(SERVICE_MEDIA), powerSave = main_di.get(SERVICE_POWER_SAVE); - PlayerIpc_ipc.on( - "channel-player-state-update", - external_lodash_debounce_default()((event, state) => { - media.setPlayerInfo({ state }), + var powerSaveTimeoutId; + PlayerIpc_ipc.on("channel-player-state-update", (event, state) => { + media.setPlayerInfo({ state }), + clearTimeout(powerSaveTimeoutId), + (powerSaveTimeoutId = setTimeout(() => { state === MediaPlayerState.Playing ? powerSave.start() : powerSave.stop(); - }, 3e3) - ), + }, 3e3)); + }), PlayerIpc_ipc.on( "channel-player-track-update", (event, track, player) => { @@ -2827,6 +2868,10 @@ "autoplay-policy", "no-user-gesture-required" ), + external_electron_namespaceObject.app.commandLine.appendSwitch( + "disable-features", + "HardwareMediaKeyHandling" + ), external_electron_namespaceObject.app.on( "second-instance", (event, argv) => { diff --git a/package.json b/package.json index cec017c..2182f77 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "main": "build/main.js", "dependencies": { "@electron/remote": "2.1.2", + "@jellybrick/mpris-service": "2.1.5", "electron-log": "^5.1.2", "electron-settings": "4.0.4", "electron-updater": "^6.3.9", -- 2.43.0