mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 10:31:47 +00:00
feat(discord): add option to display artist/title in status (#3692)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: JellyBrick <shlee1503@naver.com>
This commit is contained in:
@ -444,7 +444,15 @@
|
|||||||
"hide-duration-left": "Hide duration left",
|
"hide-duration-left": "Hide duration left",
|
||||||
"hide-github-button": "Hide GitHub link Button",
|
"hide-github-button": "Hide GitHub link Button",
|
||||||
"play-on-youtube-music": "Play on YouTube Music",
|
"play-on-youtube-music": "Play on YouTube Music",
|
||||||
"set-inactivity-timeout": "Set inactivity timeout"
|
"set-inactivity-timeout": "Set inactivity timeout",
|
||||||
|
"set-status-display-type": {
|
||||||
|
"label": "Status text",
|
||||||
|
"submenu": {
|
||||||
|
"youtube-music": "Listening to YouTube Music",
|
||||||
|
"artist": "Listening to {artist}",
|
||||||
|
"title": "Listening to {song title}"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"name": "Discord Rich Presence",
|
"name": "Discord Rich Presence",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
|
|||||||
@ -23,3 +23,13 @@ export enum TimerKey {
|
|||||||
UpdateTimeout = 'updateTimeout', // Timer for throttled activity updates
|
UpdateTimeout = 'updateTimeout', // Timer for throttled activity updates
|
||||||
DiscordConnectRetry = 'discordConnectRetry', // Timer for Discord connection retries
|
DiscordConnectRetry = 'discordConnectRetry', // Timer for Discord connection retries
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An enum for Discord's activity.status_display_type field, governing which field of the activity should be used after
|
||||||
|
* "Listening to..." in the user's Discord status.
|
||||||
|
*/
|
||||||
|
export const DiscordStatusDisplayType = {
|
||||||
|
YOUTUBE_MUSIC: 0,
|
||||||
|
ARTIST: 1,
|
||||||
|
TITLE: 2,
|
||||||
|
} as const;
|
||||||
|
|||||||
@ -98,8 +98,9 @@ export class DiscordService {
|
|||||||
|
|
||||||
const activityInfo: SetActivity = {
|
const activityInfo: SetActivity = {
|
||||||
type: ActivityType.Listening,
|
type: ActivityType.Listening,
|
||||||
|
statusDisplayType: config.statusDisplayType,
|
||||||
details: truncateString(songInfo.title, 128), // Song title
|
details: truncateString(songInfo.title, 128), // Song title
|
||||||
detailsUrl: songInfo.url,
|
detailsUrl: songInfo.url ?? undefined,
|
||||||
state: truncateString(songInfo.artist, 128), // Artist name
|
state: truncateString(songInfo.artist, 128), // Artist name
|
||||||
stateUrl: songInfo.artistUrl,
|
stateUrl: songInfo.artistUrl,
|
||||||
largeImageKey: songInfo.imageSrc ?? undefined,
|
largeImageKey: songInfo.imageSrc ?? undefined,
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import { createPlugin } from '@/utils';
|
|||||||
import { backend } from './main';
|
import { backend } from './main';
|
||||||
import { onMenu } from './menu';
|
import { onMenu } from './menu';
|
||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
|
import { DiscordStatusDisplayType } from './constants';
|
||||||
|
|
||||||
export type DiscordPluginConfig = {
|
export type DiscordPluginConfig = {
|
||||||
enabled: boolean;
|
enabled: boolean;
|
||||||
@ -33,6 +34,10 @@ export type DiscordPluginConfig = {
|
|||||||
* Hide the "duration left" in the rich presence
|
* Hide the "duration left" in the rich presence
|
||||||
*/
|
*/
|
||||||
hideDurationLeft: boolean;
|
hideDurationLeft: boolean;
|
||||||
|
/**
|
||||||
|
* Controls which field is displayed in the Discord status text
|
||||||
|
*/
|
||||||
|
statusDisplayType: (typeof DiscordStatusDisplayType)[keyof typeof DiscordStatusDisplayType];
|
||||||
};
|
};
|
||||||
|
|
||||||
export default createPlugin({
|
export default createPlugin({
|
||||||
@ -47,6 +52,7 @@ export default createPlugin({
|
|||||||
playOnYouTubeMusic: true,
|
playOnYouTubeMusic: true,
|
||||||
hideGitHubButton: false,
|
hideGitHubButton: false,
|
||||||
hideDurationLeft: false,
|
hideDurationLeft: false,
|
||||||
|
statusDisplayType: DiscordStatusDisplayType.ARTIST,
|
||||||
} as DiscordPluginConfig,
|
} as DiscordPluginConfig,
|
||||||
menu: onMenu,
|
menu: onMenu,
|
||||||
backend,
|
backend,
|
||||||
|
|||||||
@ -12,11 +12,18 @@ import type { MenuContext } from '@/types/contexts';
|
|||||||
import type { DiscordPluginConfig } from './index';
|
import type { DiscordPluginConfig } from './index';
|
||||||
|
|
||||||
import type { MenuTemplate } from '@/menu';
|
import type { MenuTemplate } from '@/menu';
|
||||||
|
import { DiscordStatusDisplayType } from './constants';
|
||||||
|
|
||||||
const registerRefreshOnce = singleton((refreshMenu: () => void) => {
|
const registerRefreshOnce = singleton((refreshMenu: () => void) => {
|
||||||
discordService?.registerRefreshCallback(refreshMenu);
|
discordService?.registerRefreshCallback(refreshMenu);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const DiscordStatusDisplayTypeLabels = {
|
||||||
|
[DiscordStatusDisplayType.YOUTUBE_MUSIC]: "plugins.discord.menu.set-status-display-type.submenu.youtube-music",
|
||||||
|
[DiscordStatusDisplayType.ARTIST]: "plugins.discord.menu.set-status-display-type.submenu.artist",
|
||||||
|
[DiscordStatusDisplayType.TITLE]: "plugins.discord.menu.set-status-display-type.submenu.title",
|
||||||
|
}
|
||||||
|
|
||||||
export const onMenu = async ({
|
export const onMenu = async ({
|
||||||
window,
|
window,
|
||||||
getConfig,
|
getConfig,
|
||||||
@ -92,6 +99,19 @@ export const onMenu = async ({
|
|||||||
label: t('plugins.discord.menu.set-inactivity-timeout'),
|
label: t('plugins.discord.menu.set-inactivity-timeout'),
|
||||||
click: () => setInactivityTimeout(window, config),
|
click: () => setInactivityTimeout(window, config),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: t('plugins.discord.menu.set-status-display-type.label'),
|
||||||
|
submenu: Object.values(DiscordStatusDisplayType).map((statusDisplayType) => ({
|
||||||
|
label: t(DiscordStatusDisplayTypeLabels[statusDisplayType]),
|
||||||
|
type: 'radio',
|
||||||
|
checked: config.statusDisplayType == statusDisplayType,
|
||||||
|
click() {
|
||||||
|
setConfig({
|
||||||
|
statusDisplayType
|
||||||
|
});
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
},
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user