From 61f9ff051db39e96e7ce5d69a359a738bb6a4bb0 Mon Sep 17 00:00:00 2001 From: hensm Date: Sun, 17 Apr 2022 12:44:28 +0100 Subject: [PATCH] Fix handling of supportedMediaCommands MEDIA_STATUS bitflag --- ext/src/cast/api/Session.ts | 44 +++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/ext/src/cast/api/Session.ts b/ext/src/cast/api/Session.ts index bcc464b..5820a97 100644 --- a/ext/src/cast/api/Session.ts +++ b/ext/src/cast/api/Session.ts @@ -24,10 +24,26 @@ import { import { Image, Receiver, SenderApplication } from "./dataClasses"; import { SessionStatus } from "./enums"; -import { Media, LoadRequest, QueueLoadRequest, QueueItem } from "./media"; +import { + Media, + LoadRequest, + QueueLoadRequest, + QueueItem, + MediaCommand +} from "./media"; const NS_MEDIA = "urn:x-cast:com.google.cast.media"; +/** supportedMediaCommands bitflag returned in MEDIA_STATUS messages */ +enum _MediaCommand { + PAUSE = 1, + SEEK = 2, + STREAM_VOLUME = 4, + STREAM_MUTE = 8, + QUEUE_NEXT = 64, + QUEUE_PREV = 128 +} + /** * Takes a media object and a media status object and merges * the status with the existing media object, updating it with @@ -40,11 +56,35 @@ function updateMedia(media: Media, status: MediaStatus) { // Copy props for (const prop in status) { - if (prop !== "items" && status.hasOwnProperty(prop)) { + switch (prop) { + case "items": + case "supportedMediaCommands": + continue; + } + + if (status.hasOwnProperty(prop)) { (media as any)[prop] = (status as any)[prop]; } } + // Convert supportedMediaCommands bitflag to string array + const supportedMediaCommands: string[] = []; + if (status.supportedMediaCommands & _MediaCommand.PAUSE) { + supportedMediaCommands.push(MediaCommand.PAUSE); + } else if (status.supportedMediaCommands & _MediaCommand.SEEK) { + supportedMediaCommands.push(MediaCommand.SEEK); + } else if (status.supportedMediaCommands & _MediaCommand.STREAM_VOLUME) { + supportedMediaCommands.push(MediaCommand.STREAM_VOLUME); + } else if (status.supportedMediaCommands & _MediaCommand.STREAM_MUTE) { + supportedMediaCommands.push(MediaCommand.STREAM_MUTE); + } else if (status.supportedMediaCommands & _MediaCommand.QUEUE_NEXT) { + supportedMediaCommands.push("queue_next"); + } else if (status.supportedMediaCommands & _MediaCommand.QUEUE_PREV) { + supportedMediaCommands.push("queue_prev"); + } + + media.supportedMediaCommands = supportedMediaCommands; + // Update queue state if (status.items) { const newItems: QueueItem[] = [];