Files
R3ap3r 3178b8f4f7 Aurora SpotiRip desktop and web app
- Spotify playlist, library, album and artist browsing with in-app playback
- Song, playlist and album downloads via spotdl with YouTube and Bandcamp fallbacks
- Electron desktop app (castLabs Widevine) with a permanent sidebar layout
- Linux and Windows packaging scripts
2026-09-25 23:20:57 -05:00

72 lines
2.4 KiB
TypeScript

export type SpotiRipSettings = {
filenameTemplate: string;
folderTemplate: string;
multiDiscMode: "disc-prefix" | "offset" | "track-only";
mp3Bitrate: 128 | 192 | 256 | 320;
embedArtwork: boolean;
autoSelectMatches: boolean;
smartDedup: boolean;
};
export const DEFAULT_SPOTIRIP_SETTINGS: SpotiRipSettings = {
filenameTemplate: "{artist} - {title}",
folderTemplate: "{album_artist}/{year} - {album}",
multiDiscMode: "disc-prefix",
mp3Bitrate: 192,
embedArtwork: true,
autoSelectMatches: true,
smartDedup: true,
};
const STORAGE_KEY = "aurora-spotirip-settings-v1";
export function loadSpotiRipSettings(): SpotiRipSettings {
if (typeof window === "undefined") return DEFAULT_SPOTIRIP_SETTINGS;
try {
const stored = window.localStorage.getItem(STORAGE_KEY);
if (!stored) return DEFAULT_SPOTIRIP_SETTINGS;
const parsed = JSON.parse(stored) as Partial<SpotiRipSettings>;
return {
filenameTemplate:
typeof parsed.filenameTemplate === "string" && parsed.filenameTemplate.trim()
? parsed.filenameTemplate
: DEFAULT_SPOTIRIP_SETTINGS.filenameTemplate,
folderTemplate:
typeof parsed.folderTemplate === "string" && parsed.folderTemplate.trim()
? parsed.folderTemplate
: DEFAULT_SPOTIRIP_SETTINGS.folderTemplate,
multiDiscMode:
parsed.multiDiscMode === "disc-prefix" ||
parsed.multiDiscMode === "offset" ||
parsed.multiDiscMode === "track-only"
? parsed.multiDiscMode
: DEFAULT_SPOTIRIP_SETTINGS.multiDiscMode,
mp3Bitrate:
parsed.mp3Bitrate === 128 ||
parsed.mp3Bitrate === 192 ||
parsed.mp3Bitrate === 256 ||
parsed.mp3Bitrate === 320
? parsed.mp3Bitrate
: DEFAULT_SPOTIRIP_SETTINGS.mp3Bitrate,
embedArtwork:
typeof parsed.embedArtwork === "boolean"
? parsed.embedArtwork
: DEFAULT_SPOTIRIP_SETTINGS.embedArtwork,
autoSelectMatches:
typeof parsed.autoSelectMatches === "boolean"
? parsed.autoSelectMatches
: DEFAULT_SPOTIRIP_SETTINGS.autoSelectMatches,
smartDedup:
typeof parsed.smartDedup === "boolean"
? parsed.smartDedup
: DEFAULT_SPOTIRIP_SETTINGS.smartDedup,
};
} catch {
return DEFAULT_SPOTIRIP_SETTINGS;
}
}
export function saveSpotiRipSettings(settings: SpotiRipSettings) {
window.localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
}