From af93b7484e0eaba07cadf7dbfd075b4c604813a2 Mon Sep 17 00:00:00 2001 From: josselinonduty Date: Wed, 14 May 2025 16:49:24 +0900 Subject: [PATCH] add discord rich presence support (opt-in with arg.) --- build/main.js | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++- package.json | 1 + 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/build/main.js b/build/main.js index 2f616b1..ddfc552 100644 --- a/build/main.js +++ b/build/main.js @@ -93,6 +93,11 @@ var external_electron_mpris_default = __webpack_require__.n( external_electron_mpris_namespaceObject ); + const external_rich_presence_builder_namespaceObject = require("@josselinonduty/rich-presence-builder"); + var external_rich_presence_builder_default = __webpack_require__.n( + external_rich_presence_builder_namespaceObject + ); + var rpcConnection, rpcData, rpcStartedAt, rpcPausedAt; function isPlatform(platform) { switch (platform) { case PLATFORM.WINDOWS: @@ -1229,6 +1234,86 @@ this.mprisPlayer.on("loopStatus", this.setRepeatMode.bind(this)); this.mprisPlayer.on("raise", () => this.app.getWindow().show()); } + updateDiscordRichPresence(track, data) { + if (!process.argv.some((arg) => arg === "--enable-discord-rpc")) return; + + try { + if (track && data) { + const duration = data?.trackInfo?.song?.DURATION; + if (!duration) return; + + rpcStartedAt = Date.now(); + rpcPausedAt = null; + rpcData = { + type: 2, + smallImage: { + image: "play", + text: "Playing", + }, + largeImage: track.coverUrl, + description: track.title, + state: + track.title === track.album + ? `${track.artist}` + : `${track.artist} - ${track.album}`, + startTimestamp: rpcStartedAt, + button: { + label: "Listen on Deezer", + url: `https://deezer.com/track/${data.trackInfo.song.SNG_ID}`, + }, + }; + + rpcConnection = new external_rich_presence_builder_namespaceObject({ + clientID: "1244016234203185183", + }) + .setType(rpcData.type) + .setSmallImage(rpcData.smallImage.image, rpcData.smallImage.text) + .setLargeImage(rpcData.largeImage) + .setDescription(rpcData.description) + .setState(rpcData.state) + .setStartTimestamp(rpcData.startTimestamp) + .addButton(rpcData.button.label, rpcData.button.url); + rpcConnection.go().catch(); + } else { + if (!rpcConnection) return; + + if (this.player.state === "playing") { + if (rpcPausedAt) { + const elapsed = rpcPausedAt - rpcStartedAt; + rpcStartedAt = Date.now() - elapsed; + rpcData.startTimestamp = rpcStartedAt; + } + rpcPausedAt = undefined; + rpcData.smallImage = { + image: "play", + text: "Playing", + }; + } else { + rpcData.startTimestamp = undefined; + rpcPausedAt = Date.now(); + rpcData.smallImage = { + image: "pause", + text: "Paused", + }; + } + + rpcConnection = new external_rich_presence_builder_namespaceObject({ + clientID: "1244016234203185183", + }) + .setType(rpcData.type) + .setSmallImage(rpcData.smallImage.image, rpcData.smallImage.text) + .setLargeImage(rpcData.largeImage) + .setDescription(rpcData.description) + .setState(rpcData.state) + .addButton(rpcData.button.label, rpcData.button.url); + + if (rpcData.startTimestamp) + rpcConnection.setStartTimestamp(rpcData.startTimestamp); + + rpcConnection.go().catch(); + } + } catch (e) {} + } play() { this.ipc.send("channel-player-media-control", MediaPlayerControl.Play); } @@ -1269,6 +1354,7 @@ ? `https://deezer.com/track/${data.trackInfo.song.SNG_ID}` : undefined, }); + this.updateDiscordRichPresence(track, data); } setPlayerInfo(player, data) { (this.player = Object.assign(this.player, player)), @@ -1276,7 +1362,8 @@ (this.mprisPlayer.playbackStatus = this.player.state === "playing" ? external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PLAYING - : external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PAUSED); + : external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PAUSED), + this.updateDiscordRichPresence(); } getTrackInfo() { return this.track; diff --git a/package.json b/package.json index 2182f77..0268f62 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dependencies": { "@electron/remote": "2.1.2", "@jellybrick/mpris-service": "2.1.5", + "@josselinonduty/rich-presence-builder": "0.1.2", "electron-log": "^5.1.2", "electron-settings": "4.0.4", "electron-updater": "^6.3.9", -- 2.43.0