aboutsummaryrefslogtreecommitdiffstats
path: root/deckit/modules
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-11-09 19:08:51 +0100
committerDanilo M. <danix@danix.xyz>2026-11-09 19:08:51 +0100
commit15e384bc1d97c84df0545555bf4c298702c9eacb (patch)
treef386400b398ebf55f9c3f2d060642e9b01255a95 /deckit/modules
parent4632e6183d38bfd239f066d7e9698f3d118a3f77 (diff)
downloaddeck-it-15e384bc1d97c84df0545555bf4c298702c9eacb.tar.gz
deck-it-15e384bc1d97c84df0545555bf4c298702c9eacb.zip
feat: card headers, music art/seek, clearer build card
Diffstat (limited to 'deckit/modules')
-rw-r--r--deckit/modules/music.py19
-rw-r--r--deckit/modules/sbbuilder.py2
2 files changed, 17 insertions, 4 deletions
diff --git a/deckit/modules/music.py b/deckit/modules/music.py
index af13688..f0baacb 100644
--- a/deckit/modules/music.py
+++ b/deckit/modules/music.py
@@ -2,7 +2,7 @@
import subprocess
-from ..module import Module
+from ..module import Module, ModuleError
SEP = "\x1f"
@@ -29,6 +29,7 @@ def _popen(cmd):
def make(cfg: dict) -> Module:
run = cfg.get("run", _run)
+ popen = cfg.get("popen", _popen)
def state():
fmt = SEP.join(["{{status}}", "{{title}}", "{{artist}}", "{{album}}", "{{mpris:length}}",
@@ -40,10 +41,22 @@ def make(cfg: dict) -> Module:
if not out:
return {"status": "Stopped", "volume": volume}
status, title, artist, album, length, pos, art, name = (out.split(SEP) + [""] * 8)[:8]
- art_src = art if art.startswith(("http://", "https://")) else None
+ if art.startswith(("http://", "https://")):
+ art_src = art
+ elif art.startswith("file://"):
+ art_src = "/api/art?v=" + str(abs(hash(art)))
+ else:
+ art_src = None
return {"status": status, "title": title, "artist": artist, "album": album,
"length": int(length or 0) / 1e6, "position": int(pos or 0) / 1e6,
"art": art_src, "player": name.split(".")[0], "volume": volume}
- actions = {name: (lambda cmd: (lambda body: _popen(cmd)))(cmd) for name, cmd in BASE_ACTIONS.items()}
+ def seek(body):
+ pos = body.get("position")
+ if not isinstance(pos, (int, float)) or pos < 0:
+ raise ModuleError("position must be a number")
+ popen(["playerctl", "position", str(round(float(pos), 1))])
+
+ actions = {name: (lambda cmd: (lambda body: popen(cmd)))(cmd) for name, cmd in BASE_ACTIONS.items()}
+ actions["seek"] = seek
return Module(name="music", title="Music", state=state, actions=actions)
diff --git a/deckit/modules/sbbuilder.py b/deckit/modules/sbbuilder.py
index 3a48a1d..41f3a14 100644
--- a/deckit/modules/sbbuilder.py
+++ b/deckit/modules/sbbuilder.py
@@ -33,4 +33,4 @@ def make(cfg: dict) -> Module:
return {"offline": True}
return {"offline": False, "jobs": data.get("jobs", [])}
- return Module(name="sbbuilder", title="Builds", state=state)
+ return Module(name="sbbuilder", title="Build VM", state=state)