- 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
72 lines
2.4 KiB
TypeScript
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));
|
|
}
|