mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-21 22:15:40 +00:00
4b1dd3c29f
Findings 5-8 of the dedup audit: - F5 byte formatters: appUpdaterHelpers.fmtBytes + ZipDownloadOverlay .formatMB route through the existing formatBytes; a new formatMb (always-MB) backs playlistDetailHelpers.formatSize, AlbumHeader and the 4 inline DeviceSyncPreSyncModal expressions. SongInfoModal.format Size is intentionally left — it uses decimal (1e6) divisors, not 1024. - F6 sanitizeHtml: extracted to utils/sanitizeHtml.ts; AlbumHeader, ComposerDetail and the (now-empty, deleted) artistDetailHelpers use it directly. nowPlayingHelpers keeps its own export but now delegates to the shared sanitiser and only adds its trailing-link strip on top. - F7 album duration: BecauseYouLikeRail's formatAlbumDuration drops in favour of the shared formatHumanHoursMinutes. Behaviour note: total minutes now floor instead of round (<=1 min display difference, matches every other caller). - F8 clock time: extracted to utils/format/formatClockTime.ts; PlaybackDelayModal + QueueHeader use it (toLocaleTimeString and Intl.DateTimeFormat produced identical output). Behaviour preserved except the two explicitly noted divergences (F7 round->floor; F5 appUpdater/Zip now show GB above 1 GB instead of a large MB number).
49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
import { IS_LINUX, IS_MACOS, IS_WINDOWS } from '../platform';
|
|
|
|
export const SKIP_KEY = 'psysonic_skipped_update_version';
|
|
|
|
// Semver comparison: returns true if `a` is newer than `b`
|
|
export function isNewer(a: string, b: string): boolean {
|
|
const pa = a.replace(/^[^0-9]*/, '').split('.').map(Number);
|
|
const pb = b.replace(/^[^0-9]*/, '').split('.').map(Number);
|
|
for (let i = 0; i < 3; i++) {
|
|
if ((pa[i] ?? 0) > (pb[i] ?? 0)) return true;
|
|
if ((pa[i] ?? 0) < (pb[i] ?? 0)) return false;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
export interface GithubAsset {
|
|
name: string;
|
|
browser_download_url: string;
|
|
size: number;
|
|
}
|
|
|
|
export interface ReleaseData {
|
|
version: string;
|
|
tag: string;
|
|
body: string;
|
|
assets: GithubAsset[];
|
|
}
|
|
|
|
export type DlState = 'idle' | 'downloading' | 'done' | 'error';
|
|
|
|
export function pickAsset(assets: GithubAsset[]): GithubAsset | undefined {
|
|
if (IS_WINDOWS) {
|
|
return assets.find(a => a.name.endsWith('-setup.exe'))
|
|
?? assets.find(a => a.name.endsWith('.exe'));
|
|
}
|
|
if (IS_MACOS) {
|
|
// Prefer Apple Silicon, fall back to Intel
|
|
return assets.find(a => a.name.endsWith('.dmg') && a.name.includes('aarch64'))
|
|
?? assets.find(a => a.name.endsWith('.dmg'));
|
|
}
|
|
if (IS_LINUX) {
|
|
// AppImage > deb > rpm
|
|
return assets.find(a => a.name.endsWith('.AppImage'))
|
|
?? assets.find(a => a.name.endsWith('.deb'))
|
|
?? assets.find(a => a.name.endsWith('.rpm'));
|
|
}
|
|
return undefined;
|
|
}
|