aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/static/platform.js
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/static/platform.js')
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/platform.js30
1 files changed, 30 insertions, 0 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/platform.js b/packages/meshbay-hub/src/meshbay_hub/static/platform.js
index c131495..28817c7 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/platform.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/platform.js
@@ -204,6 +204,16 @@ export const folder = {
async forget() { return bridge && bridge.folder ? bridge.folder.forget() : false; },
};
+/**
+ * Music is playing: the shell keeps what playback needs awake (on a phone, the
+ * page itself with the screen off). A no-op in a browser.
+ */
+export const playback = {
+ keepAlive(on) {
+ if (bridge && bridge.playback) bridge.playback.keepAlive(on).catch(() => {});
+ },
+};
+
/** Pick a directory to add as a group root. Returns { path, name } or null. */
export const rootPicker = {
available: Boolean(bridge && bridge.rootPicker),
@@ -450,6 +460,17 @@ export const cast = {
if (!bridge || !bridge.cast || !bridge.cast.subtitle) return null;
return bridge.cast.subtitle(sub);
},
+ // A whole file for the receiver — a photo already scaled to the television,
+ // a music track — as `{ bytes, type, cover?: { bytes, type }, title?,
+ // artist?, album? }`; answers `{ url }` to load. Absent from an older
+ // shell, so callers check `canSendFiles`.
+ get canSendFiles() {
+ return Boolean(bridge && bridge.cast && bridge.cast.file);
+ },
+ async file(f) {
+ if (!this.canSendFiles) return null;
+ return bridge.cast.file(f);
+ },
async finish() {
if (!bridge || !bridge.cast) return false;
return bridge.cast.finish();
@@ -510,6 +531,15 @@ export const cast = {
if (!this.canControl) return null;
return bridge.cast.chromecastPlay();
},
+ // Seeking inside a file the receiver plays (a track); a film seeks by
+ // restarting the relay instead.
+ get canSeek() {
+ return Boolean(bridge && bridge.cast && bridge.cast.chromecastSeek);
+ },
+ async chromecastSeek(seconds) {
+ if (!this.canSeek) return null;
+ return bridge.cast.chromecastSeek(seconds);
+ },
};
/**