mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-09 20:29:36 +02:00
include select settings values in analytics
This commit is contained in:
@@ -9,13 +9,27 @@ dayjs.extend(utc);
|
|||||||
import packageJson from '../../../../../package.json';
|
import packageJson from '../../../../../package.json';
|
||||||
|
|
||||||
import { isAnalyticsDisabled } from '/@/renderer/features/analytics/hooks/use-analytics-disabled';
|
import { isAnalyticsDisabled } from '/@/renderer/features/analytics/hooks/use-analytics-disabled';
|
||||||
import { useAuthStore } from '/@/renderer/store';
|
import {
|
||||||
|
PlayerbarSliderType,
|
||||||
|
SideQueueType,
|
||||||
|
useAuthStore,
|
||||||
|
usePlayerStore,
|
||||||
|
useSettingsStore,
|
||||||
|
} from '/@/renderer/store';
|
||||||
import { LogCategory, logFn } from '/@/renderer/utils/logger';
|
import { LogCategory, logFn } from '/@/renderer/utils/logger';
|
||||||
import { logMsg } from '/@/renderer/utils/logger-message';
|
import { logMsg } from '/@/renderer/utils/logger-message';
|
||||||
import { ServerType } from '/@/shared/types/domain-types';
|
import { LyricSource, ServerType } from '/@/shared/types/domain-types';
|
||||||
import { Platform } from '/@/shared/types/types';
|
import {
|
||||||
|
FontType,
|
||||||
|
Platform,
|
||||||
|
PlayerQueueType,
|
||||||
|
PlayerStyle,
|
||||||
|
PlayerType,
|
||||||
|
} from '/@/shared/types/types';
|
||||||
|
|
||||||
const utils = isElectron() ? window.api.utils : null;
|
const utils = isElectron() ? window.api.utils : null;
|
||||||
|
let appTrackerInFlight = false;
|
||||||
|
let appTrackerLastSentDate: null | string = null;
|
||||||
|
|
||||||
const getVersion = (): AppTrackerProperties['_version'] => {
|
const getVersion = (): AppTrackerProperties['_version'] => {
|
||||||
return packageJson.version;
|
return packageJson.version;
|
||||||
@@ -41,137 +55,153 @@ const getPlatform = (): AppTrackerProperties['_platform'] => {
|
|||||||
return 'unknown';
|
return 'unknown';
|
||||||
};
|
};
|
||||||
|
|
||||||
type AppTrackerProperties = {
|
type AppTrackerProperties = PlayerProperties &
|
||||||
_platform: 'unknown' | Platform;
|
SettingsProperties & {
|
||||||
_version: string;
|
_platform: 'unknown' | Platform;
|
||||||
// player: {
|
_server: 'unknown' | ServerType;
|
||||||
// mediaSession: boolean;
|
_version: string;
|
||||||
// playerQueueType: PlayerQueueType;
|
|
||||||
// playerStyle: PlayerStyle;
|
|
||||||
// playerType: PlayerType;
|
|
||||||
// transcoding: boolean;
|
|
||||||
// webAudio: boolean;
|
|
||||||
// };
|
|
||||||
server: {
|
|
||||||
[ServerType.JELLYFIN]?: boolean;
|
|
||||||
[ServerType.NAVIDROME]?: boolean;
|
|
||||||
[ServerType.SUBSONIC]?: boolean;
|
|
||||||
};
|
};
|
||||||
// settings: {
|
|
||||||
// albumBackground: boolean;
|
type PlayerProperties = {
|
||||||
// albumBackgroundBlur: number;
|
'player.mediaSession': boolean;
|
||||||
// artistBackground: boolean;
|
'player.queueType': PlayerQueueType;
|
||||||
// artistBackgroundBlur: number;
|
'player.style': PlayerStyle;
|
||||||
// customCss: boolean;
|
'player.transcoding': boolean;
|
||||||
// disableAutoUpdate: boolean;
|
'player.type': PlayerType;
|
||||||
// discord: boolean;
|
'player.webAudio': boolean;
|
||||||
// exitToTray: boolean;
|
|
||||||
// fontType: FontType;
|
|
||||||
// globalHotkeys: boolean;
|
|
||||||
// homeFeature: boolean;
|
|
||||||
// language: string;
|
|
||||||
// lastFM: boolean;
|
|
||||||
// lyricsEnableAutoTranslation: boolean;
|
|
||||||
// lyricsEnableNeteaseTranslation: boolean;
|
|
||||||
// lyricsFetch: boolean;
|
|
||||||
// minimizeToTray: boolean;
|
|
||||||
// musicBrainz: boolean;
|
|
||||||
// nativeAspectRatio: boolean;
|
|
||||||
// playerbarSliderType: PlayerbarSliderType;
|
|
||||||
// playerbarWaveformAlign: BarAlign;
|
|
||||||
// playerbarWaveformBarWidth: number;
|
|
||||||
// playerbarWaveformGap: number;
|
|
||||||
// playerbarWaveformRadius: number;
|
|
||||||
// preventSleepOnPlayback: boolean;
|
|
||||||
// releaseChannel: string;
|
|
||||||
// resume: boolean;
|
|
||||||
// scrobbleEnabled: boolean;
|
|
||||||
// sideQueueType: SideQueueType;
|
|
||||||
// skipBackwardSeconds: number;
|
|
||||||
// skipButtons: boolean;
|
|
||||||
// skipForwardSeconds: number;
|
|
||||||
// startMinimized: boolean;
|
|
||||||
// theme: string;
|
|
||||||
// tray: boolean;
|
|
||||||
// windowBarStyle: Platform;
|
|
||||||
// zoomFactor: number;
|
|
||||||
// };
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// const getPlayerProperties = (): AppTrackerProperties['player'] => {
|
type SettingsProperties = {
|
||||||
// const player = usePlayerStore.getState();
|
'settings.albumBackground': boolean;
|
||||||
// const playbackSettings = useSettingsStore.getState().playback;
|
'settings.artistBackground': boolean;
|
||||||
|
'settings.autoDJ': boolean;
|
||||||
|
'settings.autoDJItemCount': number;
|
||||||
|
'settings.autoDJTiming': number;
|
||||||
|
'settings.customCss': boolean;
|
||||||
|
'settings.disableAutoUpdate': boolean;
|
||||||
|
'settings.discord': boolean;
|
||||||
|
'settings.exitToTray': boolean;
|
||||||
|
'settings.followSystemTheme': boolean;
|
||||||
|
'settings.fontType': FontType;
|
||||||
|
'settings.globalHotkeys': boolean;
|
||||||
|
'settings.homeFeature': boolean;
|
||||||
|
'settings.language': string;
|
||||||
|
'settings.lyrics.enableAutoTranslation': boolean;
|
||||||
|
'settings.lyrics.enableNeteaseTranslation': boolean;
|
||||||
|
'settings.lyrics.fetch': boolean;
|
||||||
|
'settings.lyrics.sources.genius': boolean;
|
||||||
|
'settings.lyrics.sources.lrclib': boolean;
|
||||||
|
'settings.lyrics.sources.netease': boolean;
|
||||||
|
'settings.minimizeToTray': boolean;
|
||||||
|
'settings.nativeAspectRatio': boolean;
|
||||||
|
'settings.playerbarSliderType': PlayerbarSliderType;
|
||||||
|
'settings.preventSleepOnPlayback': boolean;
|
||||||
|
'settings.releaseChannel': string;
|
||||||
|
'settings.resume': boolean;
|
||||||
|
'settings.scrobble.enabled': boolean;
|
||||||
|
'settings.scrobble.notify': boolean;
|
||||||
|
'settings.showLyricsInSidebar': boolean;
|
||||||
|
'settings.showVisualizerInSidebar': boolean;
|
||||||
|
'settings.sideQueueType': SideQueueType;
|
||||||
|
'settings.skipButtons': boolean;
|
||||||
|
'settings.startMinimized': boolean;
|
||||||
|
'settings.theme': string;
|
||||||
|
'settings.themeDark': string;
|
||||||
|
'settings.themeLight': string;
|
||||||
|
'settings.tray': boolean;
|
||||||
|
'settings.useThemeAccentColor': boolean;
|
||||||
|
'settings.windowBarStyle': Platform;
|
||||||
|
'settings.zoomFactor': number;
|
||||||
|
};
|
||||||
|
|
||||||
// return {
|
const getPlayerProperties = (): Pick<
|
||||||
// mediaSession: playbackSettings.mediaSession,
|
AppTrackerProperties,
|
||||||
// playerQueueType: player.player.queueType,
|
| 'player.mediaSession'
|
||||||
// playerStyle: player.player.transitionType,
|
| 'player.queueType'
|
||||||
// playerType: playbackSettings.type,
|
| 'player.style'
|
||||||
// transcoding: playbackSettings.transcode.enabled,
|
| 'player.transcoding'
|
||||||
// webAudio: playbackSettings.webAudio,
|
| 'player.type'
|
||||||
// };
|
| 'player.webAudio'
|
||||||
// };
|
> => {
|
||||||
|
const player = usePlayerStore.getState();
|
||||||
|
const playbackSettings = useSettingsStore.getState().playback;
|
||||||
|
|
||||||
// const getSettingsProperties = (): AppTrackerProperties['settings'] => {
|
return {
|
||||||
// const settings = useSettingsStore.getState();
|
'player.mediaSession': playbackSettings.mediaSession,
|
||||||
|
'player.queueType': player.player.queueType,
|
||||||
|
'player.style': player.player.transitionType,
|
||||||
|
'player.transcoding': playbackSettings.transcode.enabled,
|
||||||
|
'player.type': playbackSettings.type,
|
||||||
|
'player.webAudio': playbackSettings.webAudio,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
// return {
|
const getSettingsProperties = (): SettingsProperties => {
|
||||||
// albumBackground: settings.general.albumBackground,
|
const settings = useSettingsStore.getState();
|
||||||
// albumBackgroundBlur: settings.general.albumBackgroundBlur,
|
|
||||||
// artistBackground: settings.general.artistBackground,
|
|
||||||
// artistBackgroundBlur: settings.general.artistBackgroundBlur,
|
|
||||||
// customCss: settings.css.enabled,
|
|
||||||
// disableAutoUpdate: settings.window.disableAutoUpdate,
|
|
||||||
// discord: settings.discord.enabled,
|
|
||||||
// exitToTray: settings.window.exitToTray,
|
|
||||||
// fontType: settings.font.type,
|
|
||||||
// globalHotkeys: settings.hotkeys.globalMediaHotkeys,
|
|
||||||
// homeFeature: settings.general.homeFeature,
|
|
||||||
// language: settings.general.language,
|
|
||||||
// lastFM: settings.general.lastFM,
|
|
||||||
// lyricsEnableAutoTranslation: settings.lyrics.enableAutoTranslation,
|
|
||||||
// lyricsEnableNeteaseTranslation: settings.lyrics.enableNeteaseTranslation,
|
|
||||||
// lyricsFetch: settings.lyrics.fetch,
|
|
||||||
// minimizeToTray: settings.window.minimizeToTray,
|
|
||||||
// musicBrainz: settings.general.musicBrainz,
|
|
||||||
// nativeAspectRatio: settings.general.nativeAspectRatio,
|
|
||||||
// playerbarSliderType: settings.general.playerbarSlider.type as PlayerbarSliderType,
|
|
||||||
// playerbarWaveformAlign: settings.general.playerbarSlider.barAlign as BarAlign,
|
|
||||||
// playerbarWaveformBarWidth: settings.general.playerbarSlider.barWidth,
|
|
||||||
// playerbarWaveformGap: settings.general.playerbarSlider.barGap,
|
|
||||||
// playerbarWaveformRadius: settings.general.playerbarSlider.barRadius,
|
|
||||||
// preventSleepOnPlayback: settings.window.preventSleepOnPlayback,
|
|
||||||
// releaseChannel: settings.window.releaseChannel,
|
|
||||||
// resume: settings.general.resume,
|
|
||||||
// scrobbleEnabled: settings.playback.scrobble.enabled,
|
|
||||||
// sideQueueType: settings.general.sideQueueType,
|
|
||||||
// skipBackwardSeconds: settings.general.skipButtons.skipBackwardSeconds,
|
|
||||||
// skipButtons: settings.general.skipButtons.enabled,
|
|
||||||
// skipForwardSeconds: settings.general.skipButtons.skipForwardSeconds,
|
|
||||||
// startMinimized: settings.window.startMinimized,
|
|
||||||
// theme: settings.general.theme,
|
|
||||||
// tray: settings.window.tray,
|
|
||||||
// windowBarStyle: settings.window.windowBarStyle,
|
|
||||||
// zoomFactor: settings.general.zoomFactor,
|
|
||||||
// };
|
|
||||||
// };
|
|
||||||
|
|
||||||
const getServerProperties = (): AppTrackerProperties['server'] => {
|
return {
|
||||||
|
'settings.albumBackground': settings.general.albumBackground,
|
||||||
|
// 'settings.albumBackgroundBlur': settings.general.albumBackgroundBlur,
|
||||||
|
'settings.artistBackground': settings.general.artistBackground,
|
||||||
|
// 'settings.artistBackgroundBlur': settings.general.artistBackgroundBlur,
|
||||||
|
'settings.autoDJ': settings.autoDJ.enabled,
|
||||||
|
'settings.autoDJItemCount': settings.autoDJ.itemCount,
|
||||||
|
'settings.autoDJTiming': settings.autoDJ.timing,
|
||||||
|
'settings.customCss': settings.css.enabled,
|
||||||
|
'settings.disableAutoUpdate': settings.window.disableAutoUpdate,
|
||||||
|
'settings.discord': settings.discord.enabled,
|
||||||
|
'settings.exitToTray': settings.window.exitToTray,
|
||||||
|
'settings.followSystemTheme': settings.general.followSystemTheme,
|
||||||
|
'settings.fontType': settings.font.type,
|
||||||
|
'settings.globalHotkeys': settings.hotkeys.globalMediaHotkeys,
|
||||||
|
'settings.homeFeature': settings.general.homeFeature,
|
||||||
|
'settings.language': settings.general.language,
|
||||||
|
// 'settings.lastFM': settings.general.lastFM,
|
||||||
|
'settings.lyrics.enableAutoTranslation': settings.lyrics.enableAutoTranslation,
|
||||||
|
'settings.lyrics.enableNeteaseTranslation': settings.lyrics.enableNeteaseTranslation,
|
||||||
|
'settings.lyrics.fetch': settings.lyrics.fetch,
|
||||||
|
'settings.lyrics.sources.genius': settings.lyrics.sources.includes(LyricSource.GENIUS),
|
||||||
|
'settings.lyrics.sources.lrclib': settings.lyrics.sources.includes(LyricSource.LRCLIB),
|
||||||
|
'settings.lyrics.sources.netease': settings.lyrics.sources.includes(LyricSource.NETEASE),
|
||||||
|
'settings.minimizeToTray': settings.window.minimizeToTray,
|
||||||
|
// 'settings.musicBrainz': settings.general.musicBrainz,
|
||||||
|
'settings.nativeAspectRatio': settings.general.nativeAspectRatio,
|
||||||
|
'settings.playerbarSliderType': settings.general.playerbarSlider
|
||||||
|
.type as PlayerbarSliderType,
|
||||||
|
// 'settings.playerbarWaveformAlign': settings.general.playerbarSlider.barAlign as BarAlign,
|
||||||
|
// 'settings.playerbarWaveformBarWidth': settings.general.playerbarSlider.barWidth,
|
||||||
|
// 'settings.playerbarWaveformGap': settings.general.playerbarSlider.barGap,
|
||||||
|
// 'settings.playerbarWaveformRadius': settings.general.playerbarSlider.barRadius,
|
||||||
|
'settings.preventSleepOnPlayback': settings.window.preventSleepOnPlayback,
|
||||||
|
'settings.releaseChannel': settings.window.releaseChannel,
|
||||||
|
'settings.resume': settings.general.resume,
|
||||||
|
'settings.scrobble.enabled': settings.playback.scrobble.enabled,
|
||||||
|
'settings.scrobble.notify': settings.playback.scrobble.notify,
|
||||||
|
'settings.showLyricsInSidebar': settings.general.showLyricsInSidebar,
|
||||||
|
'settings.showVisualizerInSidebar': settings.general.showVisualizerInSidebar,
|
||||||
|
'settings.sideQueueType': settings.general.sideQueueType,
|
||||||
|
// 'settings.skipBackwardSeconds': settings.general.skipButtons.skipBackwardSeconds,
|
||||||
|
'settings.skipButtons': settings.general.skipButtons.enabled,
|
||||||
|
// 'settings.skipForwardSeconds': settings.general.skipButtons.skipForwardSeconds,
|
||||||
|
'settings.startMinimized': settings.window.startMinimized,
|
||||||
|
'settings.theme': settings.general.theme,
|
||||||
|
'settings.themeDark': settings.general.themeDark,
|
||||||
|
'settings.themeLight': settings.general.themeLight,
|
||||||
|
'settings.tray': settings.window.tray,
|
||||||
|
'settings.useThemeAccentColor': settings.general.useThemeAccentColor,
|
||||||
|
'settings.windowBarStyle': settings.window.windowBarStyle,
|
||||||
|
'settings.zoomFactor': settings.general.zoomFactor,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const getServer = (): 'unknown' | ServerType => {
|
||||||
const auth = useAuthStore.getState();
|
const auth = useAuthStore.getState();
|
||||||
const serverList = auth.serverList;
|
const currentServer = auth.currentServer;
|
||||||
|
return currentServer?.type || 'unknown';
|
||||||
const properties: AppTrackerProperties['server'] = {};
|
|
||||||
|
|
||||||
Object.values(serverList).forEach((server) => {
|
|
||||||
properties[server.type] = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
return properties;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const useAppTracker = () => {
|
export const useAppTracker = () => {
|
||||||
const { mutate: trackAppMutation } = useMutation(appTrackerMutation);
|
const { mutate: trackAppMutation } = useMutation(appTrackerMutation);
|
||||||
const isTrackingInProgressRef = useRef(false);
|
|
||||||
const hasRunOnMountRef = useRef(false);
|
const hasRunOnMountRef = useRef(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -182,16 +212,16 @@ export const useAppTracker = () => {
|
|||||||
const getProperties = () => {
|
const getProperties = () => {
|
||||||
const platform = getPlatform();
|
const platform = getPlatform();
|
||||||
const version = getVersion();
|
const version = getVersion();
|
||||||
const serverProperties = getServerProperties();
|
const server = getServer();
|
||||||
// const playerProperties = getPlayerProperties();
|
const playerProperties = getPlayerProperties();
|
||||||
// const settingsProperties = getSettingsProperties();
|
const settingsProperties = getSettingsProperties();
|
||||||
|
|
||||||
const properties: AppTrackerProperties = {
|
const properties: AppTrackerProperties = {
|
||||||
_platform: platform,
|
_platform: platform,
|
||||||
|
_server: server,
|
||||||
_version: version,
|
_version: version,
|
||||||
server: serverProperties,
|
...playerProperties,
|
||||||
// player: playerProperties,
|
...settingsProperties,
|
||||||
// settings: settingsProperties,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return properties;
|
return properties;
|
||||||
@@ -199,26 +229,32 @@ export const useAppTracker = () => {
|
|||||||
|
|
||||||
const checkAndTrack = () => {
|
const checkAndTrack = () => {
|
||||||
// Prevent multiple simultaneous requests
|
// Prevent multiple simultaneous requests
|
||||||
if (isTrackingInProgressRef.current) {
|
if (appTrackerInFlight) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const lastSentDate = localStorage.getItem('analytics_app_tracker_timestamp');
|
const lastSentDate = localStorage.getItem('analytics_app_tracker_timestamp');
|
||||||
|
const lastTrackedDate = appTrackerLastSentDate ?? lastSentDate;
|
||||||
const todayUTC = dayjs.utc().format('YYYY-MM-DD');
|
const todayUTC = dayjs.utc().format('YYYY-MM-DD');
|
||||||
|
|
||||||
// Only send if it's a new day in UTC (ensures once per 24 hours)
|
// Only send if it's a new day in UTC (ensures once per 24 hours)
|
||||||
if (lastSentDate !== todayUTC) {
|
if (lastTrackedDate !== todayUTC) {
|
||||||
isTrackingInProgressRef.current = true;
|
appTrackerInFlight = true;
|
||||||
const properties = getProperties();
|
const properties = getProperties();
|
||||||
|
logFn.info(logMsg[LogCategory.ANALYTICS].appTracked, {
|
||||||
|
category: LogCategory.ANALYTICS,
|
||||||
|
meta: { properties, todayUTC },
|
||||||
|
});
|
||||||
|
|
||||||
trackAppMutation(properties, {
|
trackAppMutation(properties, {
|
||||||
onError: () => {},
|
onError: () => {},
|
||||||
onSettled: () => {
|
onSettled: () => {
|
||||||
isTrackingInProgressRef.current = false;
|
appTrackerInFlight = false;
|
||||||
},
|
},
|
||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
// Only update timestamp on success to ensure we only send once per 24 hours
|
// Only update timestamp on success to ensure we only send once per 24 hours
|
||||||
const utcDate = dayjs.utc().format('YYYY-MM-DD');
|
const utcDate = dayjs.utc().format('YYYY-MM-DD');
|
||||||
|
appTrackerLastSentDate = utcDate;
|
||||||
localStorage.setItem('analytics_app_tracker_timestamp', utcDate);
|
localStorage.setItem('analytics_app_tracker_timestamp', utcDate);
|
||||||
|
|
||||||
logFn.debug(logMsg[LogCategory.ANALYTICS].appTracked, {
|
logFn.debug(logMsg[LogCategory.ANALYTICS].appTracked, {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { LogCategory } from '/@/renderer/utils/logger';
|
|||||||
|
|
||||||
export const logMsg = {
|
export const logMsg = {
|
||||||
[LogCategory.ANALYTICS]: {
|
[LogCategory.ANALYTICS]: {
|
||||||
appTracked: 'App tracked',
|
appTracked: 'Analytics sent',
|
||||||
pageViewTracked: 'Page view tracked',
|
pageViewTracked: 'Page view tracked',
|
||||||
},
|
},
|
||||||
[LogCategory.API]: {},
|
[LogCategory.API]: {},
|
||||||
|
|||||||
Reference in New Issue
Block a user