mirror of
https://github.com/Mastermindzh/tidal-hifi.git
synced 2025-08-06 04:46:49 +02:00
- More Discord options:
- Added the ability to hide the current song from the discord activity and display a custom text instead - Added the ability to customize the text that is shown when no song is playing - Discord now reacts to pausing/unpausing events - Refactored media info updates so it only updates the required info, fixes #342, #306 - Added 5.9.0 logs/versions/migrations
This commit is contained in:
@@ -22,50 +22,69 @@ const observer = () => {
|
||||
rpc.setActivity(getActivity());
|
||||
}
|
||||
};
|
||||
const getActivity = (): Presence | undefined => {
|
||||
const presence: Presence | undefined = {
|
||||
largeImageKey: "tidal-hifi-icon",
|
||||
largeImageText: `TIDAL Hi-Fi ${app.getVersion()}`,
|
||||
instance: false,
|
||||
};
|
||||
|
||||
const defaultPresence = {
|
||||
largeImageKey: "tidal-hifi-icon",
|
||||
largeImageText: `TIDAL Hi-Fi ${app.getVersion()}`,
|
||||
instance: false,
|
||||
};
|
||||
|
||||
const getActivity = (): Presence => {
|
||||
const presence: Presence = { ...defaultPresence };
|
||||
|
||||
if (mediaInfo.status === MediaStatus.paused) {
|
||||
presence.details = settingsStore.get<string, string>(settings.discord.idleText) ?? "Browsing Tidal";
|
||||
presence.details =
|
||||
settingsStore.get<string, string>(settings.discord.idleText) ?? "Browsing Tidal";
|
||||
} else {
|
||||
const showSong = settingsStore.get<string, boolean>(settings.discord.showSong) ?? false;
|
||||
if (showSong) {
|
||||
const includeTimestamps =
|
||||
settingsStore.get<string, boolean>(settings.discord.includeTimestamps) ?? true;
|
||||
|
||||
if (includeTimestamps) {
|
||||
const currentSeconds = timeToSeconds(mediaInfo.current.split(":"));
|
||||
const durationSeconds = timeToSeconds(mediaInfo.duration.split(":"));
|
||||
const date = new Date();
|
||||
const now = (date.getTime() / 1000) | 0;
|
||||
const remaining = date.setSeconds(date.getSeconds() + (durationSeconds - currentSeconds));
|
||||
presence.startTimestamp = now;
|
||||
presence.endTimestamp = remaining;
|
||||
}
|
||||
|
||||
const detailsPrefix = settingsStore.get<string, string>(settings.discord.detailsPrefix) ?? "Listening to ";
|
||||
const buttonText = settingsStore.get<string, string>(settings.discord.buttonText) ?? "Play on TIDAL";
|
||||
|
||||
if (mediaInfo.url) {
|
||||
presence.details = `${detailsPrefix}${mediaInfo.title}`;
|
||||
presence.state = mediaInfo.artists ? mediaInfo.artists : "unknown artist(s)";
|
||||
presence.largeImageKey = mediaInfo.image;
|
||||
if (mediaInfo.album) {
|
||||
presence.largeImageText = mediaInfo.album;
|
||||
}
|
||||
presence.buttons = [{ label: buttonText, url: mediaInfo.url }];
|
||||
} else {
|
||||
presence.details = `Watching ${mediaInfo.title}`;
|
||||
presence.state = mediaInfo.artists;
|
||||
}
|
||||
const { includeTimestamps, detailsPrefix, buttonText } = getFromStore();
|
||||
includeTimeStamps(includeTimestamps);
|
||||
setPresenceFromMediaInfo(detailsPrefix, buttonText);
|
||||
} else {
|
||||
presence.details = settingsStore.get<string, string>(settings.discord.listeningText) ?? "Listening Tidal";
|
||||
presence.details =
|
||||
settingsStore.get<string, string>(settings.discord.usingText) ?? "Playing media on TIDAL";
|
||||
}
|
||||
}
|
||||
return presence;
|
||||
|
||||
function getFromStore() {
|
||||
const includeTimestamps =
|
||||
settingsStore.get<string, boolean>(settings.discord.includeTimestamps) ?? true;
|
||||
const detailsPrefix =
|
||||
settingsStore.get<string, string>(settings.discord.detailsPrefix) ?? "Listening to ";
|
||||
const buttonText =
|
||||
settingsStore.get<string, string>(settings.discord.buttonText) ?? "Play on TIDAL";
|
||||
|
||||
return { includeTimestamps, detailsPrefix, buttonText };
|
||||
}
|
||||
|
||||
function setPresenceFromMediaInfo(detailsPrefix: any, buttonText: any) {
|
||||
if (mediaInfo.url) {
|
||||
presence.details = `${detailsPrefix}${mediaInfo.title}`;
|
||||
presence.state = mediaInfo.artists ? mediaInfo.artists : "unknown artist(s)";
|
||||
presence.largeImageKey = mediaInfo.image;
|
||||
if (mediaInfo.album) {
|
||||
presence.largeImageText = mediaInfo.album;
|
||||
}
|
||||
presence.buttons = [{ label: buttonText, url: mediaInfo.url }];
|
||||
} else {
|
||||
presence.details = `Watching ${mediaInfo.title}`;
|
||||
presence.state = mediaInfo.artists;
|
||||
}
|
||||
}
|
||||
|
||||
function includeTimeStamps(includeTimestamps: any) {
|
||||
if (includeTimestamps) {
|
||||
const currentSeconds = timeToSeconds(mediaInfo.current.split(":"));
|
||||
const durationSeconds = timeToSeconds(mediaInfo.duration.split(":"));
|
||||
const date = new Date();
|
||||
const now = (date.getTime() / 1000) | 0;
|
||||
const remaining = date.setSeconds(date.getSeconds() + (durationSeconds - currentSeconds));
|
||||
presence.startTimestamp = now;
|
||||
presence.endTimestamp = remaining;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -5,6 +5,25 @@ import path from "path";
|
||||
import { settings } from "../constants/settings";
|
||||
|
||||
let settingsWindow: BrowserWindow;
|
||||
/**
|
||||
* Build a migration step for several settings.
|
||||
* All settings will be checked and set to the default if non-existent.
|
||||
* @param version
|
||||
* @param migrationStore
|
||||
* @param options
|
||||
*/
|
||||
const buildMigration = (
|
||||
version: string,
|
||||
migrationStore: { get: (str: string) => string; set: (str: string, val: unknown) => void },
|
||||
options: Array<{ key: string; value: unknown }>
|
||||
) => {
|
||||
console.log(`running migrations for ${version}`);
|
||||
options.forEach(({ key, value }) => {
|
||||
const valueToSet = migrationStore.get(key) ?? value;
|
||||
console.log(` - setting ${key} to ${value}`);
|
||||
migrationStore.set(key, valueToSet);
|
||||
});
|
||||
};
|
||||
|
||||
export const settingsStore = new Store({
|
||||
defaults: {
|
||||
@@ -19,12 +38,12 @@ export const settingsStore = new Store({
|
||||
enableCustomHotkeys: false,
|
||||
enableDiscord: false,
|
||||
discord: {
|
||||
showSong: false,
|
||||
showSong: true,
|
||||
idleText: "Browsing Tidal",
|
||||
listeningText: "Listening Tidal",
|
||||
usingText: "Playing media on TIDAL",
|
||||
includeTimestamps: true,
|
||||
detailsPrefix: "Listening to ",
|
||||
buttonText: "Play on Tidal",
|
||||
includeTimestamps: true,
|
||||
},
|
||||
ListenBrainz: {
|
||||
enabled: false,
|
||||
@@ -72,6 +91,16 @@ export const settingsStore = new Store({
|
||||
migrationStore.get(settings.discord.includeTimestamps) ?? true
|
||||
);
|
||||
},
|
||||
"5.9.0": (migrationStore) => {
|
||||
buildMigration("5.9.0", migrationStore, [
|
||||
{ key: settings.discord.showSong, value: "true" },
|
||||
{ key: settings.discord.idleText, value: "Browsing Tidal" },
|
||||
{
|
||||
key: settings.discord.usingText,
|
||||
value: "Playing media on TIDAL",
|
||||
},
|
||||
]);
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user