volume
This commit is contained in:
parent
ba4b7fdc3c
commit
82d1d1a78a
7 changed files with 62 additions and 16 deletions
13
app/app.css
13
app/app.css
|
@ -135,7 +135,11 @@ nav ul li.active {
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
#player .art {
|
#player .art {
|
||||||
margin-right: var(--icon-spacing);
|
height: 96px;
|
||||||
|
}
|
||||||
|
#player .art img,
|
||||||
|
#player .art .icon {
|
||||||
|
width: 96px;
|
||||||
}
|
}
|
||||||
#player h2 {
|
#player h2 {
|
||||||
font-size: 125%;
|
font-size: 125%;
|
||||||
|
@ -159,6 +163,10 @@ nav ul li.active {
|
||||||
width: 32px;
|
width: 32px;
|
||||||
margin: 8px;
|
margin: 8px;
|
||||||
}
|
}
|
||||||
|
#player .controls [type=range] {
|
||||||
|
width: 144px;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
#player .misc {
|
#player .misc {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
@ -617,6 +625,9 @@ nav ul li.active {
|
||||||
transform: rotate(360deg);
|
transform: rotate(360deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#settings {
|
||||||
|
font-size: var(--font-size-large);
|
||||||
|
}
|
||||||
#settings dl {
|
#settings dl {
|
||||||
margin: 8px;
|
margin: 8px;
|
||||||
display: grid;
|
display: grid;
|
||||||
|
|
|
@ -3,5 +3,4 @@
|
||||||
.icon, img {
|
.icon, img {
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -6,7 +6,11 @@
|
||||||
&:not([data-flags~=random]) .random, &:not([data-flags~=repeat]) .repeat { opacity: 0.5; }
|
&:not([data-flags~=random]) .random, &:not([data-flags~=repeat]) .repeat { opacity: 0.5; }
|
||||||
|
|
||||||
.art {
|
.art {
|
||||||
margin-right: var(--icon-spacing);
|
@size: 96px;
|
||||||
|
height: @size;
|
||||||
|
img, .icon {
|
||||||
|
width: @size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
|
@ -22,11 +26,18 @@
|
||||||
.title, .subtitle { .long-line; }
|
.title, .subtitle { .long-line; }
|
||||||
|
|
||||||
.controls {
|
.controls {
|
||||||
|
@icon-margin: 8px;
|
||||||
|
@icon-size: 32px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
.icon {
|
.icon {
|
||||||
width: 32px;
|
width: @icon-size;
|
||||||
margin: 8px;
|
margin: @icon-margin;
|
||||||
|
}
|
||||||
|
|
||||||
|
[type=range] {
|
||||||
|
width: 3 * (@icon-size + 2*@icon-margin);
|
||||||
|
margin: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,5 +48,4 @@
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
.icon { width: 32px; }
|
.icon { width: 32px; }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
#settings {
|
#settings {
|
||||||
|
font-size: var(--font-size-large);
|
||||||
|
|
||||||
dl {
|
dl {
|
||||||
margin: 8px;
|
margin: 8px;
|
||||||
display: grid;
|
display: grid;
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
<button class="pause" data-icon="pause"></button>
|
<button class="pause" data-icon="pause"></button>
|
||||||
<button class="next" data-icon="fast-forward"></button>
|
<button class="next" data-icon="fast-forward"></button>
|
||||||
<div>
|
<div>
|
||||||
<span class="elapsed"></span>/<span class="duration"></span>
|
<input type="range" step="any" min="0" class="elapsed" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="misc">
|
<div class="misc">
|
||||||
|
@ -54,6 +54,10 @@
|
||||||
</section>
|
</section>
|
||||||
<section id="settings">
|
<section id="settings">
|
||||||
<dl>
|
<dl>
|
||||||
|
<dt>Volume</dt>
|
||||||
|
<dd>
|
||||||
|
<input type="range" name="volume" min="0" max="100" step="1" />
|
||||||
|
</dd>
|
||||||
<dt>Theme</dt>
|
<dt>Theme</dt>
|
||||||
<dd>
|
<dd>
|
||||||
<select name="theme">
|
<select name="theme">
|
||||||
|
|
|
@ -3,6 +3,7 @@ import * as art from "./lib/art.js";
|
||||||
import * as html from "./lib/html.js";
|
import * as html from "./lib/html.js";
|
||||||
import * as format from "./lib/format.js";
|
import * as format from "./lib/format.js";
|
||||||
import * as pubsub from "./lib/pubsub.js";
|
import * as pubsub from "./lib/pubsub.js";
|
||||||
|
import * as settings from "./settings.js";
|
||||||
|
|
||||||
const DELAY = 2000;
|
const DELAY = 2000;
|
||||||
const DOM = {};
|
const DOM = {};
|
||||||
|
@ -12,15 +13,18 @@ let node;
|
||||||
let idleTimeout = null;
|
let idleTimeout = null;
|
||||||
|
|
||||||
function sync(data) {
|
function sync(data) {
|
||||||
DOM.elapsed.textContent = format.time(Number(data["elapsed"] || 0)); // changed time
|
settings.notifyVolume(data["volume"]);
|
||||||
|
|
||||||
|
DOM.elapsed.value = Number(data["elapsed"] || 0); // changed time
|
||||||
|
|
||||||
if (data["file"] != current["file"]) { // changed song
|
if (data["file"] != current["file"]) { // changed song
|
||||||
if (data["file"]) { // playing at all?
|
if (data["file"]) { // playing at all?
|
||||||
DOM.duration.textContent = format.time(Number(data["duration"] || 0));
|
DOM.elapsed.disabled = false;
|
||||||
|
DOM.elapsed.max = Number(data["duration"]);
|
||||||
DOM.title.textContent = data["Title"] || data["file"].split("/").pop();
|
DOM.title.textContent = data["Title"] || data["file"].split("/").pop();
|
||||||
DOM.subtitle.textContent = format.subtitle(data);
|
DOM.subtitle.textContent = format.subtitle(data);
|
||||||
} else {
|
} else {
|
||||||
DOM.duration.textContent = "";
|
DOM.elapsed.disabled = true;
|
||||||
DOM.title.textContent = "";
|
DOM.title.textContent = "";
|
||||||
DOM.subtitle.textContent = "";
|
DOM.subtitle.textContent = "";
|
||||||
}
|
}
|
||||||
|
@ -29,11 +33,13 @@ function sync(data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data["Artist"] != current["Artist"] || data["Album"] != current["Album"]) { // changed album (art)
|
if (data["Artist"] != current["Artist"] || data["Album"] != current["Album"]) { // changed album (art)
|
||||||
DOM.art.innerHTML = "";
|
html.clear(DOM.art);
|
||||||
art.get(data["Artist"], data["Album"], data["file"]).then(src => {
|
art.get(data["Artist"], data["Album"], data["file"]).then(src => {
|
||||||
if (!src) { return; }
|
if (src) {
|
||||||
let image = html.node("img", {src});
|
html.node("img", {src}, "", DOM.art);
|
||||||
DOM.art.appendChild(image);
|
} else {
|
||||||
|
html.icon("music", DOM.art);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,6 +88,7 @@ export function init(n) {
|
||||||
|
|
||||||
DOM.random.addEventListener("click", e => command(`random ${current["random"] == "1" ? "0" : "1"}`));
|
DOM.random.addEventListener("click", e => command(`random ${current["random"] == "1" ? "0" : "1"}`));
|
||||||
DOM.repeat.addEventListener("click", e => command(`repeat ${current["repeat"] == "1" ? "0" : "1"}`));
|
DOM.repeat.addEventListener("click", e => command(`repeat ${current["repeat"] == "1" ? "0" : "1"}`));
|
||||||
|
DOM.elapsed.addEventListener("input", e => command(`seekcur ${e.target.value}`));
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import * as mpd from "./lib/mpd.js";
|
||||||
|
|
||||||
let node;
|
let node;
|
||||||
let inputs = {};
|
let inputs = {};
|
||||||
const prefix = "cyp";
|
const prefix = "cyp";
|
||||||
|
@ -33,6 +35,14 @@ function setColor(color) {
|
||||||
document.documentElement.dataset.color = color;
|
document.documentElement.dataset.color = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function setVolume(volume) {
|
||||||
|
mpd.command(`setvol ${volume}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function notifyVolume(volume) {
|
||||||
|
inputs.volume.value = volume;
|
||||||
|
}
|
||||||
|
|
||||||
export async function activate() {}
|
export async function activate() {}
|
||||||
|
|
||||||
export function init(n) {
|
export function init(n) {
|
||||||
|
@ -40,6 +50,7 @@ export function init(n) {
|
||||||
|
|
||||||
inputs.theme = n.querySelector("[name=theme]");
|
inputs.theme = n.querySelector("[name=theme]");
|
||||||
inputs.color = Array.from(n.querySelectorAll("[name=color]"));
|
inputs.color = Array.from(n.querySelectorAll("[name=color]"));
|
||||||
|
inputs.volume = n.querySelector("[name=volume]");
|
||||||
|
|
||||||
load();
|
load();
|
||||||
|
|
||||||
|
@ -47,4 +58,6 @@ export function init(n) {
|
||||||
inputs.color.forEach(input => {
|
inputs.color.forEach(input => {
|
||||||
input.addEventListener("click", e => setColor(e.target.value));
|
input.addEventListener("click", e => setColor(e.target.value));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
inputs.volume.addEventListener("input", e => setVolume(e.target.valueAsNumber));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue