Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality.
131 lines
2.7 KiB
JavaScript
131 lines
2.7 KiB
JavaScript
"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();
|