export interface PlaybackSnapshotSong { filePath: string id?: string type: number name: string isFav?: number artist?: string album?: string duration?: string pixelMapPath?: string lyricContent?: string remote_rel_path?: string webdav_account_id?: string } export interface PlaybackSnapshot { queue: PlaybackSnapshotSong[] currentIndex: number currentSongKey: string currentSongName: string currentArtist?: string isPlaying: boolean positionMs: number durationMs: number cover?: string playType: number playlistContext: string updatedAt: number shouldResumeWhenActivated: boolean } export type PlaybackActivationActionType = 'resume_play' | 'open_player' | 'play_previous' | 'play_next' export interface PendingPlaybackActivation { actionType: PlaybackActivationActionType requestedAt: number } export function resolvePlaybackSnapshotProgressValue(positionMs: number, durationMs: number, maxValue: number): number { if (durationMs <= 0 || maxValue <= 0) { return 0 } const clampedPositionMs = Math.max(0, Math.min(positionMs, durationMs)) return clampedPositionMs / durationMs * maxValue }