mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-08 08:39:59 +00:00
Fix unused locals and better receiver selector available media checking
This commit is contained in:
@@ -25,25 +25,14 @@ export interface UpdateMessageData {
|
||||
|
||||
|
||||
export default class Media {
|
||||
private sessionId: number;
|
||||
private mediaSessionId: number;
|
||||
private referenceId: string;
|
||||
private session: Session;
|
||||
private channel: Channel;
|
||||
private sendMessageCallback: SendMessageCallback;
|
||||
|
||||
constructor (
|
||||
sessionId: number
|
||||
, mediaSessionId: number
|
||||
, referenceId: string
|
||||
, session: Session
|
||||
, sendMessageCallback: SendMessageCallback) {
|
||||
|
||||
this.sessionId = sessionId;
|
||||
this.mediaSessionId = mediaSessionId;
|
||||
this.referenceId = referenceId;
|
||||
this.session = session;
|
||||
this.sendMessageCallback = sendMessageCallback;
|
||||
, private referenceId: string
|
||||
, private session: Session
|
||||
, private sendMessageCallback: SendMessageCallback) {
|
||||
|
||||
this.session.createChannel(MEDIA_NAMESPACE);
|
||||
this.channel = this.session.channelMap.get(MEDIA_NAMESPACE)!;
|
||||
@@ -77,11 +66,6 @@ export default class Media {
|
||||
}
|
||||
|
||||
this.sendMessage("shim:/media/update", messageData);
|
||||
|
||||
// Update ID
|
||||
if (status.mediaSessionId) {
|
||||
this.mediaSessionId = status.mediaSessionId;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
"use strict";
|
||||
|
||||
import uuid from "uuid";
|
||||
|
||||
import { Channel, Client } from "castv2";
|
||||
|
||||
import { Message
|
||||
|
||||
@@ -17,10 +17,7 @@ export default class StatusListener extends EventEmitter {
|
||||
private clientReceiver?: Channel;
|
||||
private clientHeartbeatIntervalId?: NodeJS.Timeout;
|
||||
|
||||
constructor (
|
||||
private host: string
|
||||
, private port: number) {
|
||||
|
||||
constructor (host: string, port: number) {
|
||||
super();
|
||||
|
||||
this.client = new Client();
|
||||
|
||||
@@ -12,11 +12,9 @@ import Session from "./Session";
|
||||
import StatusListener from "./StatusListener";
|
||||
|
||||
import { DecodeTransform
|
||||
, EncodeTransform
|
||||
, ResponseTransform } from "../transforms";
|
||||
, EncodeTransform } from "../transforms";
|
||||
|
||||
import { MediaStatus
|
||||
, ReceiverStatus } from "./castTypes";
|
||||
import { ReceiverStatus } from "./castTypes";
|
||||
|
||||
import { Message } from "./types";
|
||||
|
||||
@@ -146,7 +144,6 @@ async function handleMessage (message: Message) {
|
||||
|
||||
switch (message.subject) {
|
||||
case "bridge:/getInfo": {
|
||||
const extensionVersion = message.data;
|
||||
encodeTransform.write(__applicationVersion);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
import { spawn } from "child_process";
|
||||
import { Readable } from "stream";
|
||||
|
||||
import path from "path";
|
||||
import WebSocket from "ws";
|
||||
|
||||
import { DecodeTransform
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"esModuleInterop": true
|
||||
, "module": "commonjs"
|
||||
, "noImplicitAny": true
|
||||
, "noUnusedLocals": true
|
||||
, "removeComments": true
|
||||
, "resolveJsonModule": true
|
||||
, "target": "es6"
|
||||
|
||||
@@ -4,9 +4,9 @@ import bridge from "../lib/bridge";
|
||||
import loadSender from "../lib/loadSender";
|
||||
import options from "../lib/options";
|
||||
|
||||
import { TypedEventTarget } from "../lib/typedEvents";
|
||||
import { Message } from "../types";
|
||||
|
||||
import { getMediaTypesForPageUrl } from "../lib/utils";
|
||||
import { ReceiverSelectorMediaType } from "./receiverSelector";
|
||||
|
||||
import ReceiverSelectorManager
|
||||
@@ -140,17 +140,15 @@ export default new class ShimManager {
|
||||
}
|
||||
|
||||
case "main:/selectReceiverBegin": {
|
||||
const allMediaTypes =
|
||||
ReceiverSelectorMediaType.App
|
||||
| ReceiverSelectorMediaType.Tab
|
||||
| ReceiverSelectorMediaType.Screen
|
||||
| ReceiverSelectorMediaType.File;
|
||||
const contentTab = await browser.tabs.get(shim.contentTabId);
|
||||
const availableMediaTypes = getMediaTypesForPageUrl(
|
||||
contentTab.url);
|
||||
|
||||
try {
|
||||
const selection = await ReceiverSelectorManager
|
||||
.getSelection(
|
||||
ReceiverSelectorMediaType.App
|
||||
, allMediaTypes);
|
||||
, availableMediaTypes);
|
||||
|
||||
// Handle cancellation
|
||||
if (!selection) {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
"use strict";
|
||||
|
||||
import bridge from "../lib/bridge";
|
||||
import options from "../lib/options";
|
||||
|
||||
import { TypedEventTarget } from "../lib/typedEvents";
|
||||
import { Message, Receiver, ReceiverStatus } from "../types";
|
||||
|
||||
@@ -2,12 +2,10 @@
|
||||
|
||||
import defaultOptions from "../defaultOptions";
|
||||
import loadSender from "../lib/loadSender";
|
||||
import options, { Options } from "../lib/options";
|
||||
import options from "../lib/options";
|
||||
|
||||
import { getChromeUserAgent } from "../lib/userAgents";
|
||||
import { stringify } from "../lib/utils";
|
||||
|
||||
import { Message } from "../types";
|
||||
import { getMediaTypesForPageUrl, stringify } from "../lib/utils";
|
||||
|
||||
import { CAST_FRAMEWORK_LOADER_SCRIPT_URL
|
||||
, CAST_LOADER_SCRIPT_URL } from "../lib/endpoints";
|
||||
@@ -45,7 +43,6 @@ browser.runtime.onInstalled.addListener(async details => {
|
||||
});
|
||||
|
||||
|
||||
|
||||
function initBrowserAction () {
|
||||
browser.browserAction.disable();
|
||||
|
||||
@@ -68,7 +65,10 @@ function initBrowserAction () {
|
||||
* top-level frame.
|
||||
*/
|
||||
browser.browserAction.onClicked.addListener(async tab => {
|
||||
const selection = await ReceiverSelectorManager.getSelection();
|
||||
const selection = await ReceiverSelectorManager.getSelection(
|
||||
ReceiverSelectorMediaType.Tab
|
||||
, getMediaTypesForPageUrl(tab.url)
|
||||
& ~ReceiverSelectorMediaType.App);
|
||||
|
||||
if (selection) {
|
||||
loadSender({
|
||||
@@ -154,17 +154,14 @@ async function initMenus () {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const availableMediaTypes = getMediaTypesForPageUrl(info.pageUrl);
|
||||
|
||||
switch (info.menuItemId) {
|
||||
case menuIdMediaCast: {
|
||||
const allMediaTypes =
|
||||
ReceiverSelectorMediaType.App
|
||||
| ReceiverSelectorMediaType.Tab
|
||||
| ReceiverSelectorMediaType.Screen
|
||||
| ReceiverSelectorMediaType.File;
|
||||
|
||||
const selection = await ReceiverSelectorManager.getSelection(
|
||||
ReceiverSelectorMediaType.App
|
||||
, allMediaTypes);
|
||||
, availableMediaTypes);
|
||||
|
||||
// Selection cancelled
|
||||
if (!selection) {
|
||||
@@ -203,7 +200,9 @@ async function initMenus () {
|
||||
}
|
||||
|
||||
case menuIdMirroringCast: {
|
||||
const selection = await ReceiverSelectorManager.getSelection();
|
||||
const selection = await ReceiverSelectorManager.getSelection(
|
||||
ReceiverSelectorMediaType.Tab
|
||||
, availableMediaTypes & ~ReceiverSelectorMediaType.App);
|
||||
|
||||
loadSender({
|
||||
tabId: tab.id
|
||||
@@ -319,11 +318,9 @@ async function initMenus () {
|
||||
.reverse();
|
||||
|
||||
if (pathSegments.length) {
|
||||
let index = 0;
|
||||
|
||||
for (const pathSegment of pathSegments) {
|
||||
for (let i = 0; i < pathSegments.length; i++) {
|
||||
const partialPath = pathSegments
|
||||
.slice(index)
|
||||
.slice(i)
|
||||
.reverse()
|
||||
.join("/");
|
||||
|
||||
@@ -336,8 +333,6 @@ async function initMenus () {
|
||||
|
||||
whitelistChildMenuPatterns.set(
|
||||
partialPathMenuId, pattern);
|
||||
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ export default class PopupReceiverSelector
|
||||
implements ReceiverSelector {
|
||||
|
||||
private windowId: number;
|
||||
private openerWindowId: number;
|
||||
|
||||
private messagePort: browser.runtime.Port;
|
||||
private messagePortDisconnected: boolean;
|
||||
@@ -102,7 +101,6 @@ export default class PopupReceiverSelector
|
||||
this._isOpen = true;
|
||||
|
||||
this.windowId = popup.id;
|
||||
this.openerWindowId = openerWindow.id;
|
||||
|
||||
// Size/position not set correctly on creation (bug?)
|
||||
await browser.windows.update(this.windowId, {
|
||||
@@ -168,7 +166,6 @@ export default class PopupReceiverSelector
|
||||
|
||||
// Cleanup
|
||||
this.windowId = null;
|
||||
this.openerWindowId = null;
|
||||
this.messagePort = null;
|
||||
this.receivers = null;
|
||||
this.defaultMediaType = null;
|
||||
|
||||
@@ -83,6 +83,29 @@ async function getSelection (
|
||||
});
|
||||
|
||||
|
||||
const opts = await options.getAll();
|
||||
|
||||
// Remove mirroring media types if mirroring is not enabled.
|
||||
if (!opts.mirroringEnabled) {
|
||||
availableMediaTypes &= ~(
|
||||
ReceiverSelectorMediaType.Tab
|
||||
| ReceiverSelectorMediaType.Screen);
|
||||
}
|
||||
|
||||
// Remove file media type if local media is not enabled
|
||||
if (!opts.mediaEnabled || !opts.localMediaEnabled) {
|
||||
availableMediaTypes &= ~ReceiverSelectorMediaType.File;
|
||||
}
|
||||
|
||||
if (!availableMediaTypes || availableMediaTypes
|
||||
=== ReceiverSelectorMediaType.File) {
|
||||
console.error("fx_cast (Debug): No available media types");
|
||||
resolve(null);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Ensure status manager is initialized
|
||||
await StatusManager.init();
|
||||
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
"use strict";
|
||||
|
||||
import { Message } from "../types";
|
||||
|
||||
|
||||
const WEBSOCKET_DAEMON_URL = "ws://localhost:9556";
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
import defaultOptions from "../defaultOptions";
|
||||
|
||||
import { ReceiverSelectorType } from "../background/receiverSelector";
|
||||
import { Message } from "../types";
|
||||
import { TypedEventTarget } from "./typedEvents";
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
"use strict";
|
||||
|
||||
import { ReceiverSelectorMediaType } from "../background/receiverSelector";
|
||||
|
||||
|
||||
export function getNextEllipsis (ellipsis: string): string {
|
||||
/* tslint:disable:curly */
|
||||
if (ellipsis === "") return ".";
|
||||
@@ -29,6 +32,28 @@ export function stringify (
|
||||
return formattedString;
|
||||
}
|
||||
|
||||
export function getMediaTypesForPageUrl (
|
||||
pageUrl: string): ReceiverSelectorMediaType {
|
||||
|
||||
let availableMediaTypes =
|
||||
ReceiverSelectorMediaType.App
|
||||
| ReceiverSelectorMediaType.Tab
|
||||
| ReceiverSelectorMediaType.Screen
|
||||
| ReceiverSelectorMediaType.File;
|
||||
|
||||
/**
|
||||
* Remove "Screen" option when on an insecure origin as
|
||||
* MediaDevices.getDisplayMedia will not exist (and legacy
|
||||
* MediaDevices.getUserMedia mediaSource constraint will
|
||||
* fail).
|
||||
*/
|
||||
if (!pageUrl.startsWith("https://")) {
|
||||
availableMediaTypes &= ~ReceiverSelectorMediaType.Screen;
|
||||
}
|
||||
|
||||
return availableMediaTypes;
|
||||
}
|
||||
|
||||
|
||||
interface WindowCenteredProps {
|
||||
width: number;
|
||||
|
||||
@@ -21,22 +21,6 @@ let session: cast.Session;
|
||||
let wasSessionRequested = false;
|
||||
|
||||
let peerConnection: RTCPeerConnection;
|
||||
let drawWindowIntervalId: number;
|
||||
|
||||
|
||||
let availableMediaTypes =
|
||||
ReceiverSelectorMediaType.Screen
|
||||
| ReceiverSelectorMediaType.Tab;
|
||||
|
||||
/**
|
||||
* Remove "Screen" option when on an insecure origin as
|
||||
* MediaDevices.getDisplayMedia will not exist (and legacy
|
||||
* MediaDevices.getUserMedia mediaSource constraint will
|
||||
* fail).
|
||||
*/
|
||||
if (typeof navigator.mediaDevices.getDisplayMedia === "undefined") {
|
||||
availableMediaTypes &= ~ReceiverSelectorMediaType.Screen;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -124,7 +108,7 @@ async function onRequestSessionSuccess (newSession: cast.Session) {
|
||||
}
|
||||
|
||||
|
||||
drawWindowIntervalId = window.setInterval(drawWindow, 1000 / 30);
|
||||
window.setInterval(drawWindow, 1000 / 30);
|
||||
|
||||
/**
|
||||
* Capture video stream from canvas and feed into the RTC
|
||||
|
||||
@@ -13,8 +13,7 @@ import Media from "../media/classes/Media";
|
||||
import QueueLoadRequest from "../media/classes/QueueLoadRequest";
|
||||
|
||||
import { ErrorCode
|
||||
, SessionStatus
|
||||
, VolumeControlType } from "../enums";
|
||||
, SessionStatus } from "../enums";
|
||||
|
||||
import { RepeatMode } from "../media/enums";
|
||||
|
||||
@@ -22,8 +21,7 @@ import { ListenerObject
|
||||
, onMessage
|
||||
, sendMessageResponse } from "../../eventMessageChannel";
|
||||
|
||||
import { Callbacks
|
||||
, CallbacksMap
|
||||
import { CallbacksMap
|
||||
, ErrorCallback
|
||||
, LoadSuccessCallback
|
||||
, MediaListener
|
||||
@@ -51,7 +49,7 @@ export default class Session {
|
||||
public media: Media[];
|
||||
public namespaces: Array<{ name: "string" }>;
|
||||
public senderApps: SenderApplication[];
|
||||
public status: string;
|
||||
public status: SessionStatus;
|
||||
public statusText: string;
|
||||
public transportId: string;
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import { VolumeControlType } from "../enums";
|
||||
|
||||
// https://developers.google.com/cast/docs/reference/chrome/chrome.cast.Volume
|
||||
export default class Volume {
|
||||
public controlType: string;
|
||||
public controlType: VolumeControlType;
|
||||
public stepInterval: number;
|
||||
|
||||
constructor (
|
||||
|
||||
@@ -1,75 +1,75 @@
|
||||
"use strict";
|
||||
|
||||
export const AutoJoinPolicy = {
|
||||
TAB_AND_ORIGIN_SCOPED: "tab_and_origin_scoped"
|
||||
, ORIGIN_SCOPED: "origin_scoped"
|
||||
, PAGE_SCOPED: "page_scoped"
|
||||
, CUSTOM_CONTROLLER_SCOPED: "custom_controller_scoped"
|
||||
};
|
||||
export enum AutoJoinPolicy {
|
||||
TAB_AND_ORIGIN_SCOPED = "tab_and_origin_scoped"
|
||||
, ORIGIN_SCOPED = "origin_scoped"
|
||||
, PAGE_SCOPED = "page_scoped"
|
||||
, CUSTOM_CONTROLLER_SCOPED = "custom_controller_scoped"
|
||||
}
|
||||
|
||||
export const Capability = {
|
||||
VIDEO_OUT: "video_out"
|
||||
, AUDIO_OUT: "audio_out"
|
||||
, VIDEO_IN: "video_in"
|
||||
, AUDIO_IN: "audio_in"
|
||||
, MULTIZONE_GROUP: "multizone_group"
|
||||
};
|
||||
export enum Capability {
|
||||
VIDEO_OUT = "video_out"
|
||||
, AUDIO_OUT = "audio_out"
|
||||
, VIDEO_IN = "video_in"
|
||||
, AUDIO_IN = "audio_in"
|
||||
, MULTIZONE_GROUP = "multizone_group"
|
||||
}
|
||||
|
||||
export const DefaultActionPolicy = {
|
||||
CREATE_SESSION: "create_session"
|
||||
, CAST_THIS_TAB: "cast_this_tab"
|
||||
};
|
||||
export enum DefaultActionPolicy {
|
||||
CREATE_SESSION = "create_session"
|
||||
, CAST_THIS_TAB = "cast_this_tab"
|
||||
}
|
||||
|
||||
export const DialAppState = {
|
||||
RUNNING: "running"
|
||||
, STOPPED: "stopped"
|
||||
, ERROR: "error"
|
||||
};
|
||||
export enum DialAppState {
|
||||
RUNNING = "running"
|
||||
, STOPPED = "stopped"
|
||||
, ERROR = "error"
|
||||
}
|
||||
|
||||
export const ErrorCode = {
|
||||
CANCEL: "cancel"
|
||||
, TIMEOUT: "timeout"
|
||||
, API_NOT_INITIALIZED: "api_not_initialized"
|
||||
, INVALID_PARAMETER: "invalid_parameter"
|
||||
, EXTENSION_NOT_COMPATIBLE: "extension_not_compatible"
|
||||
, EXTENSION_MISSING: "extension_missing"
|
||||
, RECEIVER_UNAVAILABLE: "receiver_unavailable"
|
||||
, SESSION_ERROR: "session_error"
|
||||
, CHANNEL_ERROR: "channel_error"
|
||||
, LOAD_MEDIA_FAILED: "load_media_failed"
|
||||
};
|
||||
export enum ErrorCode {
|
||||
CANCEL = "cancel"
|
||||
, TIMEOUT = "timeout"
|
||||
, API_NOT_INITIALIZED = "api_not_initialized"
|
||||
, INVALID_PARAMETER = "invalid_parameter"
|
||||
, EXTENSION_NOT_COMPATIBLE = "extension_not_compatible"
|
||||
, EXTENSION_MISSING = "extension_missing"
|
||||
, RECEIVER_UNAVAILABLE = "receiver_unavailable"
|
||||
, SESSION_ERROR = "session_error"
|
||||
, CHANNEL_ERROR = "channel_error"
|
||||
, LOAD_MEDIA_FAILED = "load_media_failed"
|
||||
}
|
||||
|
||||
export const ReceiverAction = {
|
||||
CAST: "cast"
|
||||
, STOP: "stop"
|
||||
};
|
||||
export enum ReceiverAction {
|
||||
CAST = "cast"
|
||||
, STOP = "stop"
|
||||
}
|
||||
|
||||
export const ReceiverAvailability = {
|
||||
AVAILABLE: "available"
|
||||
, UNAVAILABLE: "unavailable"
|
||||
};
|
||||
export enum ReceiverAvailability {
|
||||
AVAILABLE = "available"
|
||||
, UNAVAILABLE = "unavailable"
|
||||
}
|
||||
|
||||
export const ReceiverType = {
|
||||
CAST: "cast"
|
||||
, DIAL: "dial"
|
||||
, HANGOUT: "hangout"
|
||||
, CUSTOM: "custom"
|
||||
};
|
||||
export enum ReceiverType {
|
||||
CAST = "cast"
|
||||
, DIAL = "dial"
|
||||
, HANGOUT = "hangout"
|
||||
, CUSTOM = "custom"
|
||||
}
|
||||
|
||||
export const SenderPlatform = {
|
||||
CHROME: "chrome"
|
||||
, IOS: "ios"
|
||||
, ANDROID: "android"
|
||||
};
|
||||
export enum SenderPlatform {
|
||||
CHROME = "chrome"
|
||||
, IOS = "ios"
|
||||
, ANDROID = "android"
|
||||
}
|
||||
|
||||
export const SessionStatus = {
|
||||
CONNECTED: "connected"
|
||||
, DISCONNECTED: "disconnected"
|
||||
, STOPPED: "stopped"
|
||||
};
|
||||
export enum SessionStatus {
|
||||
CONNECTED = "connected"
|
||||
, DISCONNECTED = "disconnected"
|
||||
, STOPPED = "stopped"
|
||||
}
|
||||
|
||||
export const VolumeControlType = {
|
||||
ATTENUATION: "attenuation"
|
||||
, FIXED: "fixed"
|
||||
, MASTER: "master"
|
||||
};
|
||||
export enum VolumeControlType {
|
||||
ATTENUATION = "attenuation"
|
||||
, FIXED = "fixed"
|
||||
, MASTER = "master"
|
||||
}
|
||||
|
||||
@@ -26,8 +26,6 @@ import { AutoJoinPolicy
|
||||
|
||||
import * as media from "./media";
|
||||
|
||||
|
||||
import { ReceiverSelectorMediaType } from "../../background/receiverSelector";
|
||||
import { Receiver } from "../../types";
|
||||
import { onMessage, sendMessageResponse } from "../eventMessageChannel";
|
||||
|
||||
|
||||
@@ -25,8 +25,7 @@ import { ErrorCode } from "../../enums";
|
||||
|
||||
import { onMessage, sendMessageResponse } from "../../../eventMessageChannel";
|
||||
|
||||
import { Callbacks
|
||||
, CallbacksMap
|
||||
import { CallbacksMap
|
||||
, ErrorCallback
|
||||
, SuccessCallback
|
||||
, UpdateListener } from "../../../types";
|
||||
|
||||
@@ -1,93 +1,93 @@
|
||||
"use strict";
|
||||
|
||||
export const IdleReason = {
|
||||
CANCELLED: "CANCELLED"
|
||||
, INTERRUPTED: "INTERRUPTED"
|
||||
, FINISHED: "FINISHED"
|
||||
, ERROR: "ERROR"
|
||||
};
|
||||
export enum IdleReason {
|
||||
CANCELLED = "CANCELLED"
|
||||
, INTERRUPTED = "INTERRUPTED"
|
||||
, FINISHED = "FINISHED"
|
||||
, ERROR = "ERROR"
|
||||
}
|
||||
|
||||
export const MediaCommand = {
|
||||
PAUSE: "pause"
|
||||
, SEEK: "seek"
|
||||
, STREAM_VOLUME: "stream_volume"
|
||||
, STREAM_MUTE: "stream_mute"
|
||||
};
|
||||
export enum MediaCommand {
|
||||
PAUSE = "pause"
|
||||
, SEEK = "seek"
|
||||
, STREAM_VOLUME = "stream_volume"
|
||||
, STREAM_MUTE = "stream_mute"
|
||||
}
|
||||
|
||||
export const MetadataType = {
|
||||
GENERIC: 0
|
||||
, MOVIE: 1
|
||||
, TV_SHOW: 2
|
||||
, MUSIC_TRACK: 3
|
||||
, PHOTO: 4
|
||||
};
|
||||
export enum MetadataType {
|
||||
GENERIC
|
||||
, MOVIE
|
||||
, TV_SHOW
|
||||
, MUSIC_TRACK
|
||||
, PHOTO
|
||||
}
|
||||
|
||||
export const PlayerState = {
|
||||
IDLE: "IDLE"
|
||||
, PLAYING: "PLAYING"
|
||||
, PAUSED: "PAUSED"
|
||||
, BUFFERING: "BUFFERING"
|
||||
};
|
||||
export enum PlayerState {
|
||||
IDLE = "IDLE"
|
||||
, PLAYING = "PLAYING"
|
||||
, PAUSED = "PAUSED"
|
||||
, BUFFERING = "BUFFERING"
|
||||
}
|
||||
|
||||
export const RepeatMode = {
|
||||
OFF: "REPEAT_OFF"
|
||||
, ALL: "REPEAT_ALL"
|
||||
, SINGLE: "REPEAT_SINGLE"
|
||||
, ALL_AND_SHUFFLE: "REPEAT_ALL_AND_SHUFFLE"
|
||||
};
|
||||
export enum RepeatMode {
|
||||
OFF = "REPEAT_OFF"
|
||||
, ALL = "REPEAT_ALL"
|
||||
, SINGLE = "REPEAT_SINGLE"
|
||||
, ALL_AND_SHUFFLE = "REPEAT_ALL_AND_SHUFFLE"
|
||||
}
|
||||
|
||||
export const ResumeState = {
|
||||
PLAYBACK_START: "PLAYBACK_START"
|
||||
, PLAYBACK_PAUSE: "PLAYBACK_PAUSE"
|
||||
};
|
||||
export enum ResumeState {
|
||||
PLAYBACK_START = "PLAYBACK_START"
|
||||
, PLAYBACK_PAUSE = "PLAYBACK_PAUSE"
|
||||
}
|
||||
|
||||
export const StreamType = {
|
||||
BUFFERED: "BUFFERED"
|
||||
, LIVE: "LIVE"
|
||||
, OTHER: "OTHER"
|
||||
};
|
||||
export enum StreamType {
|
||||
BUFFERED = "BUFFERED"
|
||||
, LIVE = "LIVE"
|
||||
, OTHER = "OTHER"
|
||||
}
|
||||
|
||||
export const TextTrackEdgeType = {
|
||||
NONE: "NONE"
|
||||
, OUTLINE: "OUTLINE"
|
||||
, DROP_SHADOW: "DROP_SHADOW"
|
||||
, RAISED: "RAISED"
|
||||
, DEPRESSED: "DEPRESSED"
|
||||
};
|
||||
export enum TextTrackEdgeType {
|
||||
NONE = "NONE"
|
||||
, OUTLINE = "OUTLINE"
|
||||
, DROP_SHADOW = "DROP_SHADOW"
|
||||
, RAISED = "RAISED"
|
||||
, DEPRESSED = "DEPRESSED"
|
||||
}
|
||||
|
||||
export const TextTrackFontGenericFamily = {
|
||||
SANS_SERIF: "SANS_SERIF"
|
||||
, MONOSPACED_SANS_SERIF: "MONOSPACED_SANS_SERIF"
|
||||
, SERIF: "SERIF"
|
||||
, MONOSPACED_SERIF: "MONOSPACED_SERIF"
|
||||
, CASUAL: "CASUAL"
|
||||
, CURSIVE: "CURSIVE"
|
||||
, SMALL_CAPITALS: "SMALL_CAPITALS"
|
||||
};
|
||||
export enum TextTrackFontGenericFamily {
|
||||
SANS_SERIF = "SANS_SERIF"
|
||||
, MONOSPACED_SANS_SERIF = "MONOSPACED_SANS_SERIF"
|
||||
, SERIF = "SERIF"
|
||||
, MONOSPACED_SERIF = "MONOSPACED_SERIF"
|
||||
, CASUAL = "CASUAL"
|
||||
, CURSIVE = "CURSIVE"
|
||||
, SMALL_CAPITALS = "SMALL_CAPITALS"
|
||||
}
|
||||
|
||||
export const TextTrackFontStyle = {
|
||||
NORMAL: "NORMAL"
|
||||
, BOLD: "BOLD"
|
||||
, BOLD_ITALIC: "BOLD_ITALIC"
|
||||
, ITALIC: "ITALIC"
|
||||
};
|
||||
export enum TextTrackFontStyle {
|
||||
NORMAL = "NORMAL"
|
||||
, BOLD = "BOLD"
|
||||
, BOLD_ITALIC = "BOLD_ITALIC"
|
||||
, ITALIC = "ITALIC"
|
||||
}
|
||||
|
||||
export const TextTrackType = {
|
||||
SUBTITLES: "SUBTITLES"
|
||||
, CAPTIONS: "CAPTIONS"
|
||||
, DESCRIPTIONS: "DESCRIPTIONS"
|
||||
, CHAPTERS: "CHAPTERS"
|
||||
, METADATA: "METADATA"
|
||||
};
|
||||
export enum TextTrackType {
|
||||
SUBTITLES = "SUBTITLES"
|
||||
, CAPTIONS = "CAPTIONS"
|
||||
, DESCRIPTIONS = "DESCRIPTIONS"
|
||||
, CHAPTERS = "CHAPTERS"
|
||||
, METADATA = "METADATA"
|
||||
}
|
||||
|
||||
export const TextTrackWindowType = {
|
||||
NONE: "NONE"
|
||||
, NORMAL: "NORMAL"
|
||||
, ROUNDED_CORNERS: "ROUNDED_CORNERS"
|
||||
};
|
||||
export enum TextTrackWindowType {
|
||||
NONE = "NONE"
|
||||
, NORMAL = "NORMAL"
|
||||
, ROUNDED_CORNERS = "ROUNDED_CORNERS"
|
||||
}
|
||||
|
||||
export const TrackType = {
|
||||
TEXT: "TEXT"
|
||||
, AUDIO: "AUDIO"
|
||||
, VIDEO: "VIDEO"
|
||||
};
|
||||
export enum TrackType {
|
||||
TEXT = "TEXT"
|
||||
, AUDIO = "AUDIO"
|
||||
, VIDEO = "VIDEO"
|
||||
}
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
"use strict";
|
||||
|
||||
import * as cast from "../../cast";
|
||||
|
||||
import CastOptions from "./CastOptions";
|
||||
import CastSession from "./CastSession";
|
||||
import CastStateEventData from "./CastStateEventData";
|
||||
import SessionStateEventData from "./SessionStateEventData";
|
||||
|
||||
|
||||
export default class CastContext extends EventTarget {
|
||||
|
||||
@@ -2,12 +2,7 @@
|
||||
|
||||
import * as cast from "../../cast";
|
||||
|
||||
import ActiveInputStateEventData from "./ActiveInputStateEventData";
|
||||
import ApplicationMetadata from "./ApplicationMetadata";
|
||||
import ApplicationMetadataEventData from "./ApplicationMetadataEventData";
|
||||
import ApplicationStatusEventData from "./ApplicationStatusEventData";
|
||||
import MediaSessionEventData from "./MediaSessionEventData";
|
||||
import VolumeEventData from "./VolumeEventData";
|
||||
|
||||
|
||||
type MessageListener = (namespace: string, message: string) => void;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
"use strict";
|
||||
|
||||
import RemotePlayer from "./RemotePlayer";
|
||||
import RemotePlayerChangedEvent from "./RemotePlayerChangedEvent";
|
||||
|
||||
|
||||
export default class RemotePlayerController extends EventTarget {
|
||||
|
||||
@@ -1,64 +1,64 @@
|
||||
"use strict";
|
||||
|
||||
export const ActiveInputState = {
|
||||
ACTIVE_INPUT_STATE_UNKNOWN: -1
|
||||
, ACTIVE_INPUT_STATE_NO: 0
|
||||
, ACTIVE_INPUT_YES: 1
|
||||
};
|
||||
export enum ActiveInputState {
|
||||
ACTIVE_INPUT_STATE_UNKNOWN = -1
|
||||
, ACTIVE_INPUT_STATE_NO = 0
|
||||
, ACTIVE_INPUT_YES = 1
|
||||
}
|
||||
|
||||
export const CastContextEventType = {
|
||||
CAST_STATE_CHANGED: "caststatechanged"
|
||||
, SESSION_STATE_CHANGED: "sessionstatechanged"
|
||||
};
|
||||
export enum CastContextEventType {
|
||||
CAST_STATE_CHANGED = "caststatechanged"
|
||||
, SESSION_STATE_CHANGED = "sessionstatechanged"
|
||||
}
|
||||
|
||||
export const CastState = {
|
||||
NO_DEVICES_AVAILABLE: "NO_DEVICES_AVAILABLE"
|
||||
, NOT_CONNECTED: "NOT_CONNECTED"
|
||||
, CONNECTING: "CONNECTING"
|
||||
, CONNECTED: "CONNECTED"
|
||||
};
|
||||
export enum CastState {
|
||||
NO_DEVICES_AVAILABLE = "NO_DEVICES_AVAILABLE"
|
||||
, NOT_CONNECTED = "NOT_CONNECTED"
|
||||
, CONNECTING = "CONNECTING"
|
||||
, CONNECTED = "CONNECTED"
|
||||
}
|
||||
|
||||
export const LoggerLevel = {
|
||||
DEBUG: 0
|
||||
, INFO: 800
|
||||
, WARNING: 900
|
||||
, ERROR: 1000
|
||||
, NONE: 1500
|
||||
};
|
||||
export enum LoggerLevel {
|
||||
DEBUG = 0
|
||||
, INFO = 800
|
||||
, WARNING = 900
|
||||
, ERROR = 1000
|
||||
, NONE = 1500
|
||||
}
|
||||
|
||||
export const RemotePlayerEventType = {
|
||||
ANY_CHANGE: "anyChanged"
|
||||
, IS_CONNECTED_CHANGE: "isConnectedChanged"
|
||||
, IS_MEDIA_LOADED_CHANGED: "isMediaLoadedChanged"
|
||||
, DURATION_CHANGED: "durationChanged"
|
||||
, CURRENT_TIME_CHANGED: "currentTimeChanged"
|
||||
, IS_PAUSED_CHANGED: "isPausedChanged"
|
||||
, VOLUME_LEVEL_CHANGED: "volumeLevelChanged"
|
||||
, CAN_CONTROL_VOLUME_CHANGED: "canControlVolumeChanged"
|
||||
, IS_MUTED_CHANGED: "isMutedChanged"
|
||||
, CAN_PAUSE_CHANGED: "canPauseChanged"
|
||||
, CAN_SEEK_CHANGED: "canSeekChanged"
|
||||
, DISPLAY_NAME_CHANGED: "displayNameChanged"
|
||||
, STATUS_TEXT_CHANGED: "statusTextChanged"
|
||||
, MEDIA_INFO_CHANGED: "mediaInfoChanged"
|
||||
, IMAGE_URL_CHANGED: "imageUrlChanged"
|
||||
, PLAYER_STATE_CHANGED: "playerStateChanged"
|
||||
};
|
||||
export enum RemotePlayerEventType {
|
||||
ANY_CHANGE = "anyChanged"
|
||||
, IS_CONNECTED_CHANGE = "isConnectedChanged"
|
||||
, IS_MEDIA_LOADED_CHANGED = "isMediaLoadedChanged"
|
||||
, DURATION_CHANGED = "durationChanged"
|
||||
, CURRENT_TIME_CHANGED = "currentTimeChanged"
|
||||
, IS_PAUSED_CHANGED = "isPausedChanged"
|
||||
, VOLUME_LEVEL_CHANGED = "volumeLevelChanged"
|
||||
, CAN_CONTROL_VOLUME_CHANGED = "canControlVolumeChanged"
|
||||
, IS_MUTED_CHANGED = "isMutedChanged"
|
||||
, CAN_PAUSE_CHANGED = "canPauseChanged"
|
||||
, CAN_SEEK_CHANGED = "canSeekChanged"
|
||||
, DISPLAY_NAME_CHANGED = "displayNameChanged"
|
||||
, STATUS_TEXT_CHANGED = "statusTextChanged"
|
||||
, MEDIA_INFO_CHANGED = "mediaInfoChanged"
|
||||
, IMAGE_URL_CHANGED = "imageUrlChanged"
|
||||
, PLAYER_STATE_CHANGED = "playerStateChanged"
|
||||
}
|
||||
|
||||
export const SessionEventType = {
|
||||
APPLICATION_STATUS_CHANGED: "applicationstatuschanged"
|
||||
, APPLICATION_METADATA_CHANGED: "applicationmetadatachanged"
|
||||
, ACTIVE_INPUT_STATE_CHANGED: "activeinputstatechanged"
|
||||
, VOLUME_CHANGED: "volumechanged"
|
||||
, MEDIA_SESSION: "mediasession"
|
||||
};
|
||||
export enum SessionEventType {
|
||||
APPLICATION_STATUS_CHANGED = "applicationstatuschanged"
|
||||
, APPLICATION_METADATA_CHANGED = "applicationmetadatachanged"
|
||||
, ACTIVE_INPUT_STATE_CHANGED = "activeinputstatechanged"
|
||||
, VOLUME_CHANGED = "volumechanged"
|
||||
, MEDIA_SESSION = "mediasession"
|
||||
}
|
||||
|
||||
export const SessionState = {
|
||||
NO_SESSION: "NO_SESSION"
|
||||
, SESSION_STARTING: "SESSION_STARTING"
|
||||
, SESSION_STARTED: "SESSION_STARTED"
|
||||
, SESSION_START_FAILED: "SESSION_START_FAILED"
|
||||
, SESSION_ENDING: "SESSION_ENDING"
|
||||
, SESSION_ENDED: "SESSION_ENDED"
|
||||
, SESSION_RESUMED: "SESSION_RESUMED"
|
||||
};
|
||||
export enum SessionState {
|
||||
NO_SESSION = "NO_SESSION"
|
||||
, SESSION_STARTING = "SESSION_STARTING"
|
||||
, SESSION_STARTED = "SESSION_STARTED"
|
||||
, SESSION_START_FAILED = "SESSION_START_FAILED"
|
||||
, SESSION_ENDING = "SESSION_ENDING"
|
||||
, SESSION_ENDED = "SESSION_ENDED"
|
||||
, SESSION_RESUMED = "SESSION_RESUMED"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
"use strict";
|
||||
|
||||
import * as cast from "../cast";
|
||||
|
||||
import ActiveInputStateEventData from "./classes/ActiveInputStateEventData";
|
||||
import ApplicationMetadata from "./classes/ApplicationMetadata";
|
||||
@@ -28,8 +27,6 @@ import { ActiveInputState
|
||||
|
||||
import GoogleCastLauncher from "./GoogleCastLauncher";
|
||||
|
||||
import { onMessage } from "../eventMessageChannel";
|
||||
|
||||
|
||||
export default {
|
||||
// Enums
|
||||
|
||||
@@ -4,55 +4,12 @@
|
||||
import React, { Component } from "react";
|
||||
import semver from "semver";
|
||||
|
||||
import { getNextEllipsis
|
||||
, getWindowCenteredProps } from "../../lib/utils";
|
||||
|
||||
import { BridgeInfo } from "../../lib/bridge";
|
||||
import { getNextEllipsis } from "../../lib/utils";
|
||||
|
||||
|
||||
const _ = browser.i18n.getMessage;
|
||||
|
||||
const ENDPOINT_URL = "https://api.github.com/repos/hensm/fx_cast/releases/latest";
|
||||
|
||||
|
||||
async function downloadApp (info: any, platform: string) {
|
||||
const download = browser.downloads.download({
|
||||
filename: info[platform].name
|
||||
, url: info[platform].url
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
interface BridgeDownloadsProps {
|
||||
info: any;
|
||||
}
|
||||
|
||||
const BridgeDownloads = (props: BridgeDownloadsProps) => (
|
||||
<div className="bridge-downloads">
|
||||
<button className="bridge-downloads__download
|
||||
bridge-downloads__win"
|
||||
disabled
|
||||
onClick={ () => downloadApp(props.info, "win") }>
|
||||
Windows
|
||||
</button>
|
||||
<button className="bridge-downloads__download
|
||||
bridge-downloads__mac"
|
||||
onClick={ () => downloadApp(props.info, "mac") }>
|
||||
macOS
|
||||
</button>
|
||||
|
||||
<div className="bridge-downloads__linux">
|
||||
<button className="bridge-downloads__download"
|
||||
onClick={ () => downloadApp(props.info, "deb") }>
|
||||
Linux (deb)
|
||||
</button>
|
||||
<button className="bridge-downloads__download"
|
||||
onClick={ () => downloadApp(props.info, "rpm") }>
|
||||
Linux (rpm)
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
|
||||
interface BridgeStatsProps {
|
||||
info: BridgeInfo;
|
||||
@@ -236,7 +193,7 @@ export default class Bridge extends Component<BridgeProps, BridgeState> {
|
||||
}));
|
||||
}, 500);
|
||||
|
||||
fetch(ENDPOINT_URL)
|
||||
fetch("https://api.github.com/repos/hensm/fx_cast/releases/latest")
|
||||
.then(res => {
|
||||
window.clearTimeout(timeout);
|
||||
return res.json();
|
||||
|
||||
@@ -400,19 +400,6 @@ class OptionsApp extends Component<{}, OptionsAppState> {
|
||||
private getWhitelistItemPatternError (info: string): string {
|
||||
return _("optionsUserAgentWhitelistInvalidMatchPattern", info);
|
||||
}
|
||||
|
||||
private async updateBridgeInfo () {
|
||||
this.setState({
|
||||
bridgeLoading: true
|
||||
});
|
||||
|
||||
const bridgeInfo = await bridge.getInfo();
|
||||
|
||||
this.setState({
|
||||
bridgeInfo
|
||||
, bridgeLoading: false
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user