mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-10 04:30:25 +02:00
add debug logs for player actions
This commit is contained in:
@@ -13,6 +13,8 @@ import { useDeleteFavorite } from '/@/renderer/features/shared/mutations/delete-
|
|||||||
import { useSetRating } from '/@/renderer/features/shared/mutations/set-rating-mutation';
|
import { useSetRating } from '/@/renderer/features/shared/mutations/set-rating-mutation';
|
||||||
import { songsQueries } from '/@/renderer/features/songs/api/songs-api';
|
import { songsQueries } from '/@/renderer/features/songs/api/songs-api';
|
||||||
import { AddToQueueType, usePlayerActions } from '/@/renderer/store';
|
import { AddToQueueType, usePlayerActions } from '/@/renderer/store';
|
||||||
|
import { LogCategory, logFn } from '/@/renderer/utils/logger';
|
||||||
|
import { logMsg } from '/@/renderer/utils/logger-message';
|
||||||
import { Checkbox } from '/@/shared/components/checkbox/checkbox';
|
import { Checkbox } from '/@/shared/components/checkbox/checkbox';
|
||||||
import { ConfirmModal } from '/@/shared/components/modal/modal';
|
import { ConfirmModal } from '/@/shared/components/modal/modal';
|
||||||
import { Stack } from '/@/shared/components/stack/stack';
|
import { Stack } from '/@/shared/components/stack/stack';
|
||||||
@@ -205,8 +207,19 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
(data: Song[], type: AddToQueueType) => {
|
(data: Song[], type: AddToQueueType) => {
|
||||||
if (typeof type === 'object' && 'edge' in type && type.edge !== null) {
|
if (typeof type === 'object' && 'edge' in type && type.edge !== null) {
|
||||||
const edge = type.edge === 'top' ? 'top' : 'bottom';
|
const edge = type.edge === 'top' ? 'top' : 'bottom';
|
||||||
|
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].addToQueueByData, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { data: data.length, edge, type, uniqueId: type.uniqueId },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.addToQueueByUniqueId(data, type.uniqueId, edge);
|
storeActions.addToQueueByUniqueId(data, type.uniqueId, edge);
|
||||||
} else {
|
} else {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].addToQueueByType, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { data: data.length, type },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.addToQueueByType(data, type as Play);
|
storeActions.addToQueueByType(data, type as Play);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -253,6 +266,11 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].addToQueueByFetch, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { ids: id, itemType, serverId, type },
|
||||||
|
});
|
||||||
|
|
||||||
const songs = await queryClient.fetchQuery({
|
const songs = await queryClient.fetchQuery({
|
||||||
gcTime: 0,
|
gcTime: 0,
|
||||||
queryFn: () => {
|
queryFn: () => {
|
||||||
@@ -304,6 +322,11 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
let toastId: null | string = null;
|
let toastId: null | string = null;
|
||||||
let fetchId: null | string = null;
|
let fetchId: null | string = null;
|
||||||
|
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].addToQueueByListQuery, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { itemType, query, serverId, type },
|
||||||
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Get total count first
|
// Get total count first
|
||||||
let totalCount = 0;
|
let totalCount = 0;
|
||||||
@@ -372,6 +395,11 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
postProcess: 'sentenceCase',
|
postProcess: 'sentenceCase',
|
||||||
}),
|
}),
|
||||||
onClose: () => {
|
onClose: () => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].cancelledFetch, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { itemType, serverId },
|
||||||
|
});
|
||||||
|
|
||||||
queryClient.cancelQueries({
|
queryClient.cancelQueries({
|
||||||
exact: false,
|
exact: false,
|
||||||
queryKey: getRootQueryKey(itemType, serverId),
|
queryKey: getRootQueryKey(itemType, serverId),
|
||||||
@@ -451,11 +479,20 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const clearQueue = useCallback(() => {
|
const clearQueue = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].clearQueue, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.clearQueue();
|
storeActions.clearQueue();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
const clearSelected = useCallback(
|
const clearSelected = useCallback(
|
||||||
(items: QueueSong[]) => {
|
(items: QueueSong[]) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].clearSelected, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { items },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.clearSelected(items);
|
storeActions.clearSelected(items);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
@@ -463,6 +500,11 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
|
|
||||||
const decreaseVolume = useCallback(
|
const decreaseVolume = useCallback(
|
||||||
(amount: number) => {
|
(amount: number) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].decreaseVolume, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { amount },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.decreaseVolume(amount);
|
storeActions.decreaseVolume(amount);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
@@ -470,21 +512,39 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
|
|
||||||
const increaseVolume = useCallback(
|
const increaseVolume = useCallback(
|
||||||
(amount: number) => {
|
(amount: number) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].increaseVolume, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { amount },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.increaseVolume(amount);
|
storeActions.increaseVolume(amount);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
);
|
);
|
||||||
|
|
||||||
const mediaNext = useCallback(() => {
|
const mediaNext = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].mediaNext, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.mediaNext();
|
storeActions.mediaNext();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
const mediaPause = useCallback(() => {
|
const mediaPause = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].mediaPause, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.mediaPause();
|
storeActions.mediaPause();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
const mediaPlay = useCallback(
|
const mediaPlay = useCallback(
|
||||||
(id?: string) => {
|
(id?: string) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].mediaPlay, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { id },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.mediaPlay(id);
|
storeActions.mediaPlay(id);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
@@ -492,51 +552,95 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
|
|
||||||
const mediaPlayByIndex = useCallback(
|
const mediaPlayByIndex = useCallback(
|
||||||
(index: number) => {
|
(index: number) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].mediaPlayByIndex, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { index },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.mediaPlayByIndex(index);
|
storeActions.mediaPlayByIndex(index);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
);
|
);
|
||||||
|
|
||||||
const mediaPrevious = useCallback(() => {
|
const mediaPrevious = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].mediaPrevious, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.mediaPrevious();
|
storeActions.mediaPrevious();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
const mediaStop = useCallback(() => {
|
const mediaStop = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].mediaStop, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.mediaStop();
|
storeActions.mediaStop();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
const mediaSeekToTimestamp = useCallback(
|
const mediaSeekToTimestamp = useCallback(
|
||||||
(timestamp: number) => {
|
(timestamp: number) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].mediaSeekToTimestamp, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { timestamp },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.mediaSeekToTimestamp(timestamp);
|
storeActions.mediaSeekToTimestamp(timestamp);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
);
|
);
|
||||||
|
|
||||||
const mediaSkipBackward = useCallback(() => {
|
const mediaSkipBackward = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].mediaSkipBackward, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.mediaSkipBackward();
|
storeActions.mediaSkipBackward();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
const mediaSkipForward = useCallback(() => {
|
const mediaSkipForward = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].mediaSkipForward, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.mediaSkipForward();
|
storeActions.mediaSkipForward();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
const setSpeed = useCallback(
|
const setSpeed = useCallback(
|
||||||
(speed: number) => {
|
(speed: number) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].setSpeed, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { speed },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.setSpeed(speed);
|
storeActions.setSpeed(speed);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
);
|
);
|
||||||
|
|
||||||
const mediaToggleMute = useCallback(() => {
|
const mediaToggleMute = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].mediaToggleMute, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.mediaToggleMute();
|
storeActions.mediaToggleMute();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
const mediaTogglePlayPause = useCallback(() => {
|
const mediaTogglePlayPause = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].mediaTogglePlayPause, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.mediaTogglePlayPause();
|
storeActions.mediaTogglePlayPause();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
const moveSelectedTo = useCallback(
|
const moveSelectedTo = useCallback(
|
||||||
(items: QueueSong[], edge: 'bottom' | 'top', uniqueId: string) => {
|
(items: QueueSong[], edge: 'bottom' | 'top', uniqueId: string) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].moveSelectedTo, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { edge, items, uniqueId },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.moveSelectedTo(items, uniqueId, edge);
|
storeActions.moveSelectedTo(items, uniqueId, edge);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
@@ -544,6 +648,11 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
|
|
||||||
const moveSelectedToBottom = useCallback(
|
const moveSelectedToBottom = useCallback(
|
||||||
(items: QueueSong[]) => {
|
(items: QueueSong[]) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].moveSelectedToBottom, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { items },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.moveSelectedToBottom(items);
|
storeActions.moveSelectedToBottom(items);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
@@ -551,6 +660,11 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
|
|
||||||
const moveSelectedToNext = useCallback(
|
const moveSelectedToNext = useCallback(
|
||||||
(items: QueueSong[]) => {
|
(items: QueueSong[]) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].moveSelectedToNext, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { items },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.moveSelectedToNext(items);
|
storeActions.moveSelectedToNext(items);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
@@ -558,6 +672,11 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
|
|
||||||
const moveSelectedToTop = useCallback(
|
const moveSelectedToTop = useCallback(
|
||||||
(items: QueueSong[]) => {
|
(items: QueueSong[]) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].moveSelectedToTop, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { items },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.moveSelectedToTop(items);
|
storeActions.moveSelectedToTop(items);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
@@ -565,6 +684,11 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
|
|
||||||
const setVolume = useCallback(
|
const setVolume = useCallback(
|
||||||
(volume: number) => {
|
(volume: number) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].setVolume, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { volume },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.setVolume(volume);
|
storeActions.setVolume(volume);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
@@ -572,6 +696,11 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
|
|
||||||
const setRepeat = useCallback(
|
const setRepeat = useCallback(
|
||||||
(repeat: PlayerRepeat) => {
|
(repeat: PlayerRepeat) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].setRepeat, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { repeat },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.setRepeat(repeat);
|
storeActions.setRepeat(repeat);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
@@ -579,31 +708,57 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
|
|
||||||
const setShuffle = useCallback(
|
const setShuffle = useCallback(
|
||||||
(shuffle: PlayerShuffle) => {
|
(shuffle: PlayerShuffle) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].setShuffle, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { shuffle },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.setShuffle(shuffle);
|
storeActions.setShuffle(shuffle);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
);
|
);
|
||||||
|
|
||||||
const shuffle = useCallback(() => {
|
const shuffle = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].shuffle, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.shuffle();
|
storeActions.shuffle();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
const shuffleAll = useCallback(() => {
|
const shuffleAll = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].shuffleAll, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.shuffleAll();
|
storeActions.shuffleAll();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
const shuffleSelected = useCallback(
|
const shuffleSelected = useCallback(
|
||||||
(items: QueueSong[]) => {
|
(items: QueueSong[]) => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].shuffleSelected, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
meta: { items },
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.shuffleSelected(items);
|
storeActions.shuffleSelected(items);
|
||||||
},
|
},
|
||||||
[storeActions],
|
[storeActions],
|
||||||
);
|
);
|
||||||
|
|
||||||
const toggleRepeat = useCallback(() => {
|
const toggleRepeat = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].toggleRepeat, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.toggleRepeat();
|
storeActions.toggleRepeat();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
const toggleShuffle = useCallback(() => {
|
const toggleShuffle = useCallback(() => {
|
||||||
|
logFn.debug(logMsg[LogCategory.PLAYER].toggleShuffle, {
|
||||||
|
category: LogCategory.PLAYER,
|
||||||
|
});
|
||||||
|
|
||||||
storeActions.toggleShuffle();
|
storeActions.toggleShuffle();
|
||||||
}, [storeActions]);
|
}, [storeActions]);
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,42 @@ export const logMsg = {
|
|||||||
},
|
},
|
||||||
[LogCategory.API]: {},
|
[LogCategory.API]: {},
|
||||||
[LogCategory.OTHER]: {},
|
[LogCategory.OTHER]: {},
|
||||||
[LogCategory.PLAYER]: {},
|
[LogCategory.PLAYER]: {
|
||||||
|
addToQueueByData: 'Added to queue by data',
|
||||||
|
addToQueueByFetch: 'Added to queue by fetch',
|
||||||
|
addToQueueByListQuery: 'Added to queue by list query',
|
||||||
|
addToQueueByType: 'Added to queue by type',
|
||||||
|
cancelledFetch: 'Cancelled fetch',
|
||||||
|
clearQueue: 'Cleared queue',
|
||||||
|
clearSelected: 'Cleared selected',
|
||||||
|
decreaseVolume: 'Decreased volume',
|
||||||
|
increaseVolume: 'Increased volume',
|
||||||
|
mediaNext: 'Media next',
|
||||||
|
mediaPause: 'Media pause',
|
||||||
|
mediaPlay: 'Media play',
|
||||||
|
mediaPlayByIndex: 'Media play by index',
|
||||||
|
mediaPrevious: 'Media previous',
|
||||||
|
mediaSeekToTimestamp: 'Media seek to timestamp',
|
||||||
|
mediaSkipBackward: 'Media skip backward',
|
||||||
|
mediaSkipForward: 'Media skip forward',
|
||||||
|
mediaStop: 'Media stop',
|
||||||
|
mediaToggleMute: 'Media toggle mute',
|
||||||
|
mediaTogglePlayPause: 'Media toggle play pause',
|
||||||
|
moveSelectedTo: 'Moved selected to',
|
||||||
|
moveSelectedToBottom: 'Moved selected to bottom',
|
||||||
|
moveSelectedToNext: 'Moved selected to next',
|
||||||
|
moveSelectedToTop: 'Moved selected to top',
|
||||||
|
setFavorite: 'Set favorite',
|
||||||
|
setRating: 'Set rating',
|
||||||
|
setRepeat: 'Set repeat',
|
||||||
|
setShuffle: 'Set shuffle',
|
||||||
|
setSpeed: 'Set speed',
|
||||||
|
setVolume: 'Set volume',
|
||||||
|
shuffle: 'Shuffle',
|
||||||
|
shuffleAll: 'Shuffle all',
|
||||||
|
shuffleSelected: 'Shuffle selected',
|
||||||
|
toggleRepeat: 'Toggle repeat',
|
||||||
|
toggleShuffle: 'Toggle shuffle',
|
||||||
|
},
|
||||||
[LogCategory.SYSTEM]: {},
|
[LogCategory.SYSTEM]: {},
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user