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); function sendClear() { Neutralino.events.broadcast('discord:clear', {}).catch(() => { }); } 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(() => { }); } }