mirror of
https://github.com/aunetx/deezer-linux.git
synced 2025-07-23 13:45:05 +02:00
Feat: migrate to internal dependency (@deezer-community/discord-rpc); small improvements (#126)
* feat: migrate to internal dependency (@deezer-community/discord-rpc); add small improvements * chore(patch): change package name in old comment * chore(patch): bump discord-rpc dependency version to 1.0.4 (license change+exact version)
This commit is contained in:
parent
e9da7c98ff
commit
7b10a66fc8
@ -1,117 +1,193 @@
|
|||||||
From af93b7484e0eaba07cadf7dbfd075b4c604813a2 Mon Sep 17 00:00:00 2001
|
From 4108067eb498fd58f913b2830c44ea2b3e23247b Mon Sep 17 00:00:00 2001
|
||||||
From: josselinonduty <contact@josselinonduty.fr>
|
From: josselinonduty <contact@josselinonduty.fr>
|
||||||
Date: Wed, 14 May 2025 16:49:24 +0900
|
Date: Thu, 29 May 2025 00:32:47 +0900
|
||||||
Subject: [PATCH] add discord rich presence support (opt-in with arg.)
|
Subject: [PATCH] add discord rich presence support (w/ opt-in arg.)
|
||||||
|
|
||||||
---
|
---
|
||||||
build/main.js | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++-
|
build/main.js | 165 +++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||||
package.json | 1 +
|
package.json | 2 +
|
||||||
2 files changed, 89 insertions(+), 1 deletion(-)
|
2 files changed, 166 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
diff --git a/build/main.js b/build/main.js
|
diff --git a/build/main.js b/build/main.js
|
||||||
index 2f616b1..ddfc552 100644
|
index 0155907..9ce2145 100644
|
||||||
--- a/build/main.js
|
--- a/build/main.js
|
||||||
+++ b/build/main.js
|
+++ b/build/main.js
|
||||||
@@ -93,6 +93,11 @@
|
@@ -93,6 +93,13 @@
|
||||||
var external_electron_mpris_default = __webpack_require__.n(
|
var external_electron_mpris_default = __webpack_require__.n(
|
||||||
external_electron_mpris_namespaceObject
|
external_electron_mpris_namespaceObject
|
||||||
);
|
);
|
||||||
+ const external_rich_presence_builder_namespaceObject = require("@josselinonduty/rich-presence-builder");
|
+ const external_discord_rpc_namespaceObject = require("@deezer-community/discord-rpc");
|
||||||
+ var external_rich_presence_builder_default = __webpack_require__.n(
|
+ var external_discord_rpc_default = __webpack_require__.n(
|
||||||
+ external_rich_presence_builder_namespaceObject
|
+ external_discord_rpc_namespaceObject
|
||||||
+ );
|
+ );
|
||||||
+ var rpcConnection, rpcData, rpcStartedAt, rpcPausedAt;
|
+ /** @type {import("@deezer-community/discord-rpc").Client} */
|
||||||
|
+ var rpcClient;
|
||||||
|
+ var rpcData, rpcStartedAt, rpcPausedAt;
|
||||||
function isPlatform(platform) {
|
function isPlatform(platform) {
|
||||||
switch (platform) {
|
switch (platform) {
|
||||||
case PLATFORM.WINDOWS:
|
case PLATFORM.WINDOWS:
|
||||||
@@ -1229,6 +1234,86 @@
|
@@ -1229,6 +1236,160 @@
|
||||||
this.mprisPlayer.on("loopStatus", this.setRepeatMode.bind(this));
|
this.mprisPlayer.on("loopStatus", this.setRepeatMode.bind(this));
|
||||||
this.mprisPlayer.on("raise", () => this.app.getWindow().show());
|
this.mprisPlayer.on("raise", () => this.app.getWindow().show());
|
||||||
}
|
}
|
||||||
+ updateDiscordRichPresence(track, data) {
|
+ updateDiscordRichPresence(track, data) {
|
||||||
+ if (!process.argv.some((arg) => arg === "--enable-discord-rpc")) return;
|
+ if (!process.argv.some((arg) => arg === "--enable-discord-rpc")) return;
|
||||||
+
|
+
|
||||||
+ try {
|
+ if (!rpcClient) {
|
||||||
+ if (track && data) {
|
+ rpcClient = new external_discord_rpc_namespaceObject.Client({
|
||||||
+ const duration = data?.trackInfo?.song?.DURATION;
|
+ clientId: "1244016234203185183",
|
||||||
+ if (!duration) return;
|
+ transport: "ipc",
|
||||||
+
|
+ });
|
||||||
+ rpcStartedAt = Date.now();
|
+ rpcClient.on("ready", () => {
|
||||||
+ rpcPausedAt = null;
|
+ external_electron_log_default().info(
|
||||||
+ rpcData = {
|
+ "[Discord] Rich presence client is ready."
|
||||||
+ type: 2,
|
+ );
|
||||||
+ smallImage: {
|
+ });
|
||||||
+ image: "play",
|
+ rpcClient.on("close", () => {
|
||||||
+ text: "Playing",
|
+ external_electron_log_default().info(
|
||||||
+ },
|
+ "[Discord] Rich presence client disconnected."
|
||||||
+ largeImage: track.coverUrl,
|
+ );
|
||||||
+ description: track.title,
|
+ });
|
||||||
+ state:
|
+ rpcClient
|
||||||
+ track.title === track.album
|
+ .login()
|
||||||
+ ? `${track.artist}`
|
+ .then(() => {
|
||||||
+ : `${track.artist} - ${track.album}`,
|
+ external_electron_log_default().info(
|
||||||
+ startTimestamp: rpcStartedAt,
|
+ "[Discord] Rich presence client logged in successfully."
|
||||||
+ 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)
|
+ .catch((err) => {
|
||||||
+ .setSmallImage(rpcData.smallImage.image, rpcData.smallImage.text)
|
+ external_electron_log_default().error(
|
||||||
+ .setLargeImage(rpcData.largeImage)
|
+ `[Discord] Rich presence client login error: ${err}`
|
||||||
+ .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") {
|
+ rpcClient = null;
|
||||||
+ 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({
|
+ if (track && data) {
|
||||||
+ clientID: "1244016234203185183",
|
+ const duration = data?.trackInfo?.song?.DURATION;
|
||||||
|
+ if (!duration) return;
|
||||||
|
+
|
||||||
|
+ external_electron_log_default().debug(
|
||||||
|
+ "[Discord] Updating rich presence with track information."
|
||||||
|
+ );
|
||||||
|
+ rpcStartedAt = Date.now();
|
||||||
|
+ rpcPausedAt = null;
|
||||||
|
+ rpcData = {
|
||||||
|
+ type: external_discord_rpc_namespaceObject.ActivityType.Listening,
|
||||||
|
+ smallImage: {
|
||||||
|
+ image: "play",
|
||||||
|
+ text: "Playing",
|
||||||
|
+ },
|
||||||
|
+ largeImage: track.coverUrl,
|
||||||
|
+ description: track.title,
|
||||||
|
+ state:
|
||||||
|
+ track.title === track.album
|
||||||
|
+ ? `${track.artist}`
|
||||||
|
+ : `${track.artist} - ${track.album}`,
|
||||||
|
+ startTimestamp: rpcStartedAt,
|
||||||
|
+ endTimestamp: rpcStartedAt + duration * 1e3,
|
||||||
|
+ duration: duration * 1e3,
|
||||||
|
+ button: {
|
||||||
|
+ label: "Listen on Deezer",
|
||||||
|
+ url: `https://deezer.com/track/${data.trackInfo.song.SNG_ID}`,
|
||||||
|
+ },
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ rpcClient
|
||||||
|
+ ?.setActivity({
|
||||||
|
+ state: rpcData.state,
|
||||||
|
+ type: rpcData.type,
|
||||||
|
+ details: rpcData.description,
|
||||||
|
+ assets: {
|
||||||
|
+ large_image: rpcData.largeImage,
|
||||||
|
+ small_image: rpcData.smallImage.image,
|
||||||
|
+ small_text: rpcData.smallImage.text,
|
||||||
|
+ },
|
||||||
|
+ timestamps: {
|
||||||
|
+ start: rpcData.startTimestamp,
|
||||||
|
+ end: rpcData.endTimestamp,
|
||||||
|
+ },
|
||||||
|
+ buttons: [
|
||||||
|
+ {
|
||||||
|
+ label: rpcData.button.label,
|
||||||
|
+ url: rpcData.button.url,
|
||||||
|
+ },
|
||||||
|
+ ],
|
||||||
+ })
|
+ })
|
||||||
+ .setType(rpcData.type)
|
+ .then(() => {
|
||||||
+ .setSmallImage(rpcData.smallImage.image, rpcData.smallImage.text)
|
+ external_electron_log_default().debug(
|
||||||
+ .setLargeImage(rpcData.largeImage)
|
+ "[Discord] Rich presence updated successfully."
|
||||||
+ .setDescription(rpcData.description)
|
+ );
|
||||||
+ .setState(rpcData.state)
|
+ })
|
||||||
+ .addButton(rpcData.button.label, rpcData.button.url);
|
+ .catch((err) => {
|
||||||
+
|
+ external_electron_log_default().error(
|
||||||
+ if (rpcData.startTimestamp)
|
+ `[Discord] Error updating rich presence: ${err}`
|
||||||
+ rpcConnection.setStartTimestamp(rpcData.startTimestamp);
|
+ );
|
||||||
+
|
+ });
|
||||||
+ rpcConnection.go().catch();
|
+ } else {
|
||||||
|
+ if (!rpcClient) return;
|
||||||
|
+ if (!rpcData) {
|
||||||
|
+ external_electron_log_default().debug(
|
||||||
|
+ "[Discord] No track data available for rich presence."
|
||||||
|
+ );
|
||||||
|
+ return;
|
||||||
+ }
|
+ }
|
||||||
+ } catch (e) {}
|
+
|
||||||
|
+ if (this.player.state === "playing") {
|
||||||
|
+ if (rpcPausedAt) {
|
||||||
|
+ const elapsed = rpcPausedAt - rpcStartedAt;
|
||||||
|
+ rpcStartedAt = Date.now() - elapsed;
|
||||||
|
+ rpcData.startTimestamp = rpcStartedAt;
|
||||||
|
+ rpcData.endTimestamp = rpcStartedAt + (rpcData.duration || 0);
|
||||||
|
+ }
|
||||||
|
+ rpcPausedAt = undefined;
|
||||||
|
+ rpcData.smallImage = {
|
||||||
|
+ image: "play",
|
||||||
|
+ text: "Playing",
|
||||||
|
+ };
|
||||||
|
+ } else {
|
||||||
|
+ rpcData.startTimestamp = undefined;
|
||||||
|
+ rpcData.endTimestamp = undefined;
|
||||||
|
+ rpcPausedAt = Date.now();
|
||||||
|
+ rpcData.smallImage = {
|
||||||
|
+ image: "pause",
|
||||||
|
+ text: "Paused",
|
||||||
|
+ };
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ rpcClient
|
||||||
|
+ ?.setActivity({
|
||||||
|
+ state: rpcData.state,
|
||||||
|
+ type: rpcData.type,
|
||||||
|
+ details: rpcData.description,
|
||||||
|
+ assets: {
|
||||||
|
+ large_image: rpcData.largeImage,
|
||||||
|
+ small_image: rpcData.smallImage.image,
|
||||||
|
+ small_text: rpcData.smallImage.text,
|
||||||
|
+ },
|
||||||
|
+ timestamps: {
|
||||||
|
+ start: rpcData.startTimestamp,
|
||||||
|
+ end: rpcData.endTimestamp,
|
||||||
|
+ },
|
||||||
|
+ buttons: [
|
||||||
|
+ {
|
||||||
|
+ label: rpcData.button.label,
|
||||||
|
+ url: rpcData.button.url,
|
||||||
|
+ },
|
||||||
|
+ ],
|
||||||
|
+ })
|
||||||
|
+ .catch((err) => {
|
||||||
|
+ external_electron_log_default().error(
|
||||||
|
+ `[Discord] Error updating rich presence: ${err}`
|
||||||
|
+ );
|
||||||
|
+ });
|
||||||
|
+ }
|
||||||
+ }
|
+ }
|
||||||
play() {
|
play() {
|
||||||
this.ipc.send("channel-player-media-control", MediaPlayerControl.Play);
|
this.ipc.send("channel-player-media-control", MediaPlayerControl.Play);
|
||||||
}
|
}
|
||||||
@@ -1269,6 +1354,7 @@
|
@@ -1269,6 +1430,7 @@
|
||||||
? `https://deezer.com/track/${data.trackInfo.song.SNG_ID}`
|
? `https://deezer.com/track/${data.trackInfo.song.SNG_ID}`
|
||||||
: undefined,
|
: undefined,
|
||||||
});
|
});
|
||||||
@ -119,7 +195,7 @@ index 2f616b1..ddfc552 100644
|
|||||||
}
|
}
|
||||||
setPlayerInfo(player, data) {
|
setPlayerInfo(player, data) {
|
||||||
(this.player = Object.assign(this.player, player)),
|
(this.player = Object.assign(this.player, player)),
|
||||||
@@ -1276,7 +1362,8 @@
|
@@ -1276,7 +1438,8 @@
|
||||||
(this.mprisPlayer.playbackStatus =
|
(this.mprisPlayer.playbackStatus =
|
||||||
this.player.state === "playing"
|
this.player.state === "playing"
|
||||||
? external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PLAYING
|
? external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PLAYING
|
||||||
@ -130,17 +206,17 @@ index 2f616b1..ddfc552 100644
|
|||||||
getTrackInfo() {
|
getTrackInfo() {
|
||||||
return this.track;
|
return this.track;
|
||||||
diff --git a/package.json b/package.json
|
diff --git a/package.json b/package.json
|
||||||
index 2182f77..0268f62 100644
|
index 0e91412..50c4a41 100644
|
||||||
--- a/package.json
|
--- a/package.json
|
||||||
+++ b/package.json
|
+++ b/package.json
|
||||||
@@ -14,6 +14,7 @@
|
@@ -12,6 +12,7 @@
|
||||||
|
"author": "Deezer <support@deezer.com>",
|
||||||
|
"main": "build/main.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
+ "@deezer-community/discord-rpc": "1.0.4",
|
||||||
"@electron/remote": "2.1.2",
|
"@electron/remote": "2.1.2",
|
||||||
"@jellybrick/mpris-service": "2.1.5",
|
"@jellybrick/mpris-service": "2.1.5",
|
||||||
+ "@josselinonduty/rich-presence-builder": "0.1.2",
|
|
||||||
"electron-log": "^5.1.2",
|
"electron-log": "^5.1.2",
|
||||||
"electron-settings": "4.0.4",
|
|
||||||
"electron-updater": "^6.3.9",
|
|
||||||
--
|
--
|
||||||
2.43.0
|
2.43.0
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ diff --git a/build/main.js b/build/main.js
|
|||||||
index 22b50ff..99935cb 100644
|
index 22b50ff..99935cb 100644
|
||||||
--- a/build/main.js
|
--- a/build/main.js
|
||||||
+++ b/build/main.js
|
+++ b/build/main.js
|
||||||
@@ -3169,8 +3169,8 @@
|
@@ -3245,8 +3245,8 @@
|
||||||
},
|
},
|
||||||
windowOptions = {
|
windowOptions = {
|
||||||
title: "Deezer Desktop",
|
title: "Deezer Desktop",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user