mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-10 01:29:58 +00:00
Splits some background script functionality into separate modules: - Receiver selector handling is moved to ./SelectorManager. - Status bridge handling is moved to ./StatusManager. - Menu creation and updates are handled in ./createMenus. - Shim creation is handled in ./createShim. TypedEventTarget allows EventTarget-derived classes to export typed events. Options type definition is moved to ./lib/options, module assumes more responsibility for update handling and provides a "changed" event. Private cast._requestSession method allows bypassing receiver selector.
82 lines
2.3 KiB
TypeScript
82 lines
2.3 KiB
TypeScript
"use strict";
|
|
|
|
import cast, { ensureInit } from "../shim/export";
|
|
import options from "./options";
|
|
|
|
import { Receiver } from "../types";
|
|
|
|
|
|
function getMediaSession (
|
|
receiver?: Receiver): Promise<cast.Session> {
|
|
|
|
return new Promise(async (resolve, reject) => {
|
|
await ensureInit();
|
|
|
|
/**
|
|
* If a receiver is available, call requestSession. If a
|
|
* specific receiver was specified, bypass receiver selector
|
|
* and create session directly.
|
|
*/
|
|
function receiverListener (availability: string) {
|
|
if (availability === cast.ReceiverAvailability.AVAILABLE) {
|
|
if (receiver) {
|
|
cast._requestSession(receiver, resolve, reject);
|
|
} else {
|
|
cast.requestSession(resolve, reject);
|
|
}
|
|
}
|
|
}
|
|
|
|
const sessionRequest = new cast.SessionRequest(
|
|
cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID);
|
|
|
|
const apiConfig = new cast.ApiConfig(
|
|
sessionRequest
|
|
, null // sessionListener
|
|
, receiverListener); // receiverListener
|
|
|
|
cast.initialize(apiConfig);
|
|
});
|
|
}
|
|
|
|
function loadMediaUrl (
|
|
mediaUrl: string
|
|
, receiver: Receiver): Promise<cast.Session> {
|
|
|
|
return new Promise(async (resolve, reject) => {
|
|
|
|
const isLocalMedia = mediaUrl.startsWith("file://");
|
|
const isLocalMediaEnabled = await options.get("localMediaEnabled");
|
|
|
|
if (isLocalMedia && !isLocalMediaEnabled) {
|
|
console.error("fx_cast (Debug): Local media casting not enabled");
|
|
return;
|
|
}
|
|
|
|
|
|
const mediaUrlObject = new URL(mediaUrl);
|
|
const mediaInfo = new cast.media.MediaInfo(mediaUrlObject.href, null);
|
|
|
|
mediaInfo.metadata = new cast.media.GenericMediaMetadata();
|
|
mediaInfo.metadata.metadataType = cast.media.MetadataType.GENERIC;
|
|
mediaInfo.metadata.title = mediaUrlObject.pathname;
|
|
|
|
|
|
const mediaSession = await getMediaSession(receiver);
|
|
|
|
const loadRequest = new cast.media.LoadRequest(mediaInfo);
|
|
loadRequest.autoplay = false;
|
|
|
|
mediaSession.loadMedia(loadRequest
|
|
, null // successCallback
|
|
, () => { reject(); }); // errorCallback
|
|
});
|
|
}
|
|
|
|
|
|
export default {
|
|
getMediaSession
|
|
, loadMediaUrl
|
|
};
|
|
|