kv-music/js/discord-rpc.js
2026-02-10 11:19:20 +01:00

87 lines
2.9 KiB
JavaScript

import { getTrackTitle, getTrackArtists } from './utils.js';
export function initializeDiscordRPC(player) {
console.log('[DiscordRPC] Initializing...');
const EXTENSION_ID = 'js.neutralino.discordrpc';
function sendUpdate(track, isPaused = false) {
if (!track) return;
let coverUrl = 'monochrome';
if (track.album?.cover) {
const coverId = track.album.cover.replace(/-/g, '/');
coverUrl = `https://resources.tidal.com/images/${coverId}/320x320.jpg`;
}
const data = {
details: getTrackTitle(track),
state: getTrackArtists(track),
largeImageKey: coverUrl,
largeImageText: track.album?.title || 'Monochrome',
smallImageKey: isPaused ? 'pause' : 'play',
smallImageText: isPaused ? 'Paused' : 'Playing',
instance: false,
};
if (!isPaused && track.duration) {
const now = Date.now();
const elapsed = player.audio.currentTime * 1000;
data.startTimestamp = Math.floor((now - elapsed) / 1000);
}
console.log('[DiscordRPC] Dispatching to', EXTENSION_ID, data);
Neutralino.events.broadcast('discord:update', data).catch((e) => console.error('Broadcast failed', e));
Neutralino.extensions
.dispatch(EXTENSION_ID, 'discord:update', data)
.catch((e) => console.error('Dispatch failed', e));
}
// Heartbeat & Debug Ping
setInterval(() => {
if (player.currentTrack) {
sendUpdate(player.currentTrack, player.audio.paused);
} else {
const idlingData = {
details: 'Idling',
state: 'Monochrome',
largeImageKey: 'monochrome',
largeImageText: 'Monochrome',
smallImageKey: 'pause',
smallImageText: 'Paused',
};
Neutralino.events.broadcast('discord:update', idlingData).catch(() => {});
Neutralino.extensions.dispatch(EXTENSION_ID, 'discord:update', idlingData).catch(() => {});
}
}, 5000);
player.audio.addEventListener('play', () => {
sendUpdate(player.currentTrack);
});
player.audio.addEventListener('pause', () => {
sendUpdate(player.currentTrack, true);
});
player.audio.addEventListener('loadedmetadata', () => {
if (!player.audio.paused) {
sendUpdate(player.currentTrack);
}
});
// Send initial status
if (player.currentTrack) {
sendUpdate(player.currentTrack, player.audio.paused);
} else {
Neutralino.events
.broadcast('discord:update', {
details: 'Idling',
state: 'Monochrome',
largeImageKey: 'monochrome',
largeImageText: 'Monochrome',
smallImageKey: 'pause',
smallImageText: 'Paused',
})
.catch(() => {});
}
}