cyp/app/js/player.js

88 lines
2.4 KiB
JavaScript
Raw Normal View History

2019-03-22 22:35:04 +08:00
import * as mpd from "./lib/mpd.js";
import * as art from "./lib/art.js";
import * as html from "./lib/html.js";
import * as format from "./lib/format.js";
import * as pubsub from "./lib/pubsub.js";
2019-03-21 17:32:58 +08:00
const DELAY = 2000;
const DOM = {};
let current = {};
let node;
let idleTimeout = null;
2019-03-22 22:35:04 +08:00
function sync(data) {
DOM.elapsed.textContent = format.time(Number(data["elapsed"] || 0)); // changed time
2019-03-21 17:32:58 +08:00
if (data["file"] != current["file"]) { // changed song
2019-03-30 19:57:01 +08:00
if (data["file"]) { // playing at all?
DOM.duration.textContent = format.time(Number(data["duration"] || 0));
DOM.title.textContent = data["Title"] || data["file"].split("/").pop();
DOM["artist-album"].textContent = format.artistAlbum(data["Artist"], data["Album"]);
} else {
DOM.duration.textContent = "";
DOM.title.textContent = "";
DOM["artist-album"].textContent = "";
}
2019-03-22 22:35:04 +08:00
pubsub.publish("song-change", null, data);
2019-03-21 17:32:58 +08:00
}
if (data["Artist"] != current["Artist"] || data["Album"] != current["Album"]) { // changed album (art)
DOM.art.innerHTML = "";
art.get(data["Artist"], data["Album"], data["file"]).then(src => {
if (!src) { return; }
2019-03-22 22:35:04 +08:00
let image = html.node("img", {src});
2019-03-21 17:32:58 +08:00
DOM.art.appendChild(image);
});
}
2019-03-22 22:35:04 +08:00
let flags = [];
if (data["random"] == "1") { flags.push("random"); }
if (data["repeat"] == "1") { flags.push("repeat"); }
node.dataset.flags = flags.join(" ");
2019-03-21 17:32:58 +08:00
node.dataset.state = data["state"];
current = data;
}
function idle() {
2019-03-22 22:35:04 +08:00
idleTimeout = setTimeout(update, DELAY);
2019-03-21 17:32:58 +08:00
}
function clearIdle() {
idleTimeout && clearTimeout(idleTimeout);
idleTimeout = null;
}
async function command(cmd) {
clearIdle();
let data = await mpd.commandAndStatus(cmd);
2019-03-22 22:35:04 +08:00
sync(data);
idle();
}
export async function update() {
clearIdle();
let data = await mpd.status();
sync(data);
2019-03-21 17:32:58 +08:00
idle();
}
2019-03-22 22:35:04 +08:00
export function init(n) {
node = n;
2019-03-21 17:32:58 +08:00
let all = node.querySelectorAll("[class]");
Array.from(all).forEach(node => DOM[node.className] = node);
DOM.play.addEventListener("click", e => command("play"));
DOM.pause.addEventListener("click", e => command("pause 1"));
DOM.prev.addEventListener("click", e => command("previous"));
DOM.next.addEventListener("click", e => command("next"));
DOM.random.addEventListener("click", e => command(`random ${current["random"] == "1" ? "0" : "1"}`));
DOM.repeat.addEventListener("click", e => command(`repeat ${current["repeat"] == "1" ? "0" : "1"}`));
2019-03-22 22:35:04 +08:00
update();
2019-03-21 17:32:58 +08:00
}