diff --git a/js/store.js b/js/store.js new file mode 100644 index 0000000..713fd29 --- /dev/null +++ b/js/store.js @@ -0,0 +1,130 @@ +"use strict"; + +const Store = { + KEY: "aumusic-v1", + likes: new Set(), + playlists: [], + history: [], + volume: 0.85, + shuffle: false, + repeat: 0, + + load() { + try { + const raw = localStorage.getItem(this.KEY); + if (!raw) return; + const d = JSON.parse(raw); + this.likes = new Set(d.likes || []); + this.playlists = d.playlists || []; + this.history = d.history || []; + this.volume = d.volume != null ? d.volume : 0.85; + this.shuffle = !!d.shuffle; + this.repeat = d.repeat || 0; + } catch (e) {} + }, + + save() { + try { + localStorage.setItem(this.KEY, JSON.stringify({ + likes: Array.from(this.likes), + playlists: this.playlists, + history: this.history, + volume: this.volume, + shuffle: this.shuffle, + repeat: this.repeat + })); + } catch (e) {} + }, + + isLiked(id) { + return this.likes.has(id); + }, + + toggleLike(id) { + if (this.likes.has(id)) { + this.likes.delete(id); + return false; + } + this.likes.add(id); + return true; + }, + + likedSongs() { + return Array.from(this.likes).map(D.song); + }, + + pushHistory(id) { + this.history = [id, ...this.history.filter((x) => x !== id)].slice(0, 40); + this.save(); + }, + + recentSongs() { + const out = []; + this.history.forEach((id) => { + const s = D.song(id); + if (s) out.push(s); + }); + return out; + }, + + createPlaylist(name, color) { + const pl = { + id: "pl" + Date.now() + Math.floor(Math.random() * 999), + name: name || "New Playlist", + color: color || "#fa233b", + items: [], + createdAt: Date.now() + }; + this.playlists.unshift(pl); + this.save(); + return pl; + }, + + deletePlaylist(id) { + this.playlists = this.playlists.filter((p) => p.id !== id); + this.save(); + }, + + renamePlaylist(id, name) { + const p = this.playlists.find((x) => x.id === id); + if (p) { + p.name = name || p.name; + this.save(); + } + return p; + }, + + addToPlaylist(pid, songId) { + const p = this.playlists.find((x) => x.id === pid); + if (p && !p.items.includes(songId)) { + p.items.push(songId); + this.save(); + return true; + } + return false; + }, + + removeFromPlaylist(pid, songId) { + const p = this.playlists.find((x) => x.id === pid); + if (p) { + p.items = p.items.filter((i) => i !== songId); + this.save(); + } + }, + + clearPlaylist(pid) { + const p = this.playlists.find((x) => x.id === pid); + if (p) { + p.items = []; + this.save(); + } + }, + + playlistSongs(pid) { + const p = this.playlists.find((x) => x.id === pid); + if (!p) return []; + return p.items.map(D.song).filter(Boolean); + } +}; + +Store.load();