111 lines
2.8 KiB
JavaScript
111 lines
2.8 KiB
JavaScript
import * as mpd from "./lib/mpd.js";
|
|
import * as html from "./lib/html.js";
|
|
import * as ui from "./lib/ui.js";
|
|
import * as format from "./lib/format.js";
|
|
|
|
import Search from "./lib/search.js";
|
|
|
|
let node, search;
|
|
|
|
function nonempty(x) { return x.length > 0; }
|
|
|
|
function buildHeader(filter) {
|
|
filter = filter || {};
|
|
let header = node.querySelector("header");
|
|
html.clear(header);
|
|
|
|
search.reset();
|
|
header.appendChild(search.getNode());
|
|
|
|
let artist = filter["AlbumArtist"];
|
|
if (artist) {
|
|
let artistFilter = {"AlbumArtist":artist};
|
|
let button = html.button({icon:"artist"}, artist, header);
|
|
button.addEventListener("click", e => listAlbums(artistFilter));
|
|
|
|
let album = filter["Album"];
|
|
if (album) {
|
|
html.node("span", {}, format.SEPARATOR, header);
|
|
let albumFilter = Object.assign({}, artistFilter, {"Album":album});
|
|
let button = html.button({icon:"album"}, album, header);
|
|
button.addEventListener("click", e => listSongs(albumFilter));
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
function buildAlbum(album, filter, parent) {
|
|
let childFilter = Object.assign({}, filter, {"Album": album});
|
|
let node = ui.group(ui.CTX_LIBRARY, album, childFilter, parent);
|
|
node.addEventListener("click", e => listSongs(childFilter));
|
|
node.dataset.name = album;
|
|
return node;
|
|
}
|
|
|
|
function buildArtist(artist, filter, parent) {
|
|
let childFilter = Object.assign({}, filter, {"AlbumArtist": artist});
|
|
let node = ui.group(ui.CTX_LIBRARY, artist, childFilter, parent);
|
|
node.addEventListener("click", e => listAlbums(childFilter));
|
|
node.dataset.name = artist;
|
|
return node;
|
|
}
|
|
|
|
function buildSongs(songs, filter) {
|
|
let ul = node.querySelector("ul");
|
|
html.clear(ul);
|
|
|
|
songs.map(song => {
|
|
let node = ui.song(ui.CTX_LIBRARY, song, ul);
|
|
node.dataset.name = song["Title"];
|
|
});
|
|
}
|
|
|
|
function buildAlbums(albums, filter) {
|
|
let ul = node.querySelector("ul");
|
|
html.clear(ul);
|
|
|
|
albums.filter(nonempty).map(album => buildAlbum(album, filter, ul));
|
|
}
|
|
|
|
function buildArtists(artists, filter) {
|
|
let ul = node.querySelector("ul");
|
|
html.clear(ul);
|
|
|
|
artists.filter(nonempty).map(artist => buildArtist(artist, filter, ul));
|
|
}
|
|
|
|
async function listSongs(filter) {
|
|
let songs = await mpd.listSongs(filter);
|
|
buildSongs(songs, filter);
|
|
buildHeader(filter);
|
|
}
|
|
|
|
async function listAlbums(filter) {
|
|
let albums = await mpd.listTags("Album", filter);
|
|
buildAlbums(albums, filter);
|
|
buildHeader(filter);
|
|
}
|
|
|
|
async function listArtists(filter) {
|
|
let artists = await mpd.listTags("AlbumArtist", filter);
|
|
buildArtists(artists, filter);
|
|
buildHeader(filter);
|
|
}
|
|
|
|
function onSearch(e) {
|
|
Array.from(node.querySelectorAll("[data-name]")).forEach(node => {
|
|
let name = node.dataset.name;
|
|
node.style.display = (search.match(name) ? "" : "none");
|
|
});
|
|
}
|
|
|
|
export async function activate() {
|
|
listArtists();
|
|
}
|
|
|
|
export function init(n) {
|
|
node = n;
|
|
|
|
search = new Search(node.querySelector(".search"));
|
|
search.addEventListener("input", onSearch);
|
|
}
|