mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-12 10:39:57 +00:00
Add basic image support to media sender (closes #183)
This commit is contained in:
@@ -45,7 +45,7 @@ export async function initMenus() {
|
|||||||
|
|
||||||
// <video>/<audio> "Cast..." context menu item
|
// <video>/<audio> "Cast..." context menu item
|
||||||
menuIdMediaCast = browser.menus.create({
|
menuIdMediaCast = browser.menus.create({
|
||||||
contexts: [ "audio", "video" ]
|
contexts: [ "audio", "video", "image" ]
|
||||||
, title: _("contextCast")
|
, title: _("contextCast")
|
||||||
, visible: opts.mediaEnabled
|
, visible: opts.mediaEnabled
|
||||||
, targetUrlPatterns: opts.localMediaEnabled
|
, targetUrlPatterns: opts.localMediaEnabled
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ let backgroundPort: MessagePort;
|
|||||||
let currentSession: cast.Session;
|
let currentSession: cast.Session;
|
||||||
let currentMedia: cast.media.Media;
|
let currentMedia: cast.media.Media;
|
||||||
|
|
||||||
let mediaElement: HTMLMediaElement;
|
let targetElement: HTMLElement;
|
||||||
|
|
||||||
|
|
||||||
function getSession(opts: InitOptions): Promise<cast.Session> {
|
function getSession(opts: InitOptions): Promise<cast.Session> {
|
||||||
@@ -147,18 +147,18 @@ function getMedia(opts: InitOptions): Promise<cast.media.Media> {
|
|||||||
mediaInfo.tracks.push(castTrack);
|
mediaInfo.tracks.push(castTrack);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mediaElement) {
|
if (targetElement instanceof HTMLMediaElement) {
|
||||||
if (mediaElement instanceof HTMLVideoElement) {
|
if (targetElement instanceof HTMLVideoElement) {
|
||||||
if (mediaElement.poster) {
|
if (targetElement.poster) {
|
||||||
mediaInfo.metadata.images = [
|
mediaInfo.metadata.images = [
|
||||||
new cast.Image(mediaElement.poster)
|
new cast.Image(targetElement.poster)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mediaElement.textTracks.length) {
|
if (targetElement.textTracks.length) {
|
||||||
const tracks = Array.from(mediaElement.textTracks);
|
const tracks = Array.from(targetElement.textTracks);
|
||||||
const trackElements = mediaElement.querySelectorAll("track");
|
const trackElements = targetElement.querySelectorAll("track");
|
||||||
|
|
||||||
tracks.forEach((track, index) => {
|
tracks.forEach((track, index) => {
|
||||||
const trackElement = trackElements[index];
|
const trackElement = trackElements[index];
|
||||||
@@ -218,7 +218,7 @@ function getMedia(opts: InitOptions): Promise<cast.media.Media> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const loadRequest = new cast.media.LoadRequest(mediaInfo);
|
const loadRequest = new cast.media.LoadRequest(mediaInfo);
|
||||||
loadRequest.autoplay = false;
|
loadRequest.autoplay = true;
|
||||||
loadRequest.activeTrackIds = activeTrackIds;
|
loadRequest.activeTrackIds = activeTrackIds;
|
||||||
|
|
||||||
currentSession.loadMedia(loadRequest, resolve, reject);
|
currentSession.loadMedia(loadRequest, resolve, reject);
|
||||||
@@ -228,7 +228,7 @@ function getMedia(opts: InitOptions): Promise<cast.media.Media> {
|
|||||||
|
|
||||||
let ignoreMediaEvents = false;
|
let ignoreMediaEvents = false;
|
||||||
|
|
||||||
async function registerMediaElementListeners() {
|
async function registerMediaElementListeners(mediaElement: HTMLMediaElement) {
|
||||||
function checkIgnore(ev: Event) {
|
function checkIgnore(ev: Event) {
|
||||||
if (ignoreMediaEvents) {
|
if (ignoreMediaEvents) {
|
||||||
ignoreMediaEvents = false;
|
ignoreMediaEvents = false;
|
||||||
@@ -349,32 +349,34 @@ export async function init(opts: InitOptions) {
|
|||||||
cast.logMessage("Local media casting not enabled");
|
cast.logMessage("Local media casting not enabled");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!opts.targetElementId) {
|
||||||
if (opts.targetElementId) {
|
cast.logMessage("Target element ID not found");
|
||||||
mediaElement = browser.menus.getTargetElement(
|
return;
|
||||||
opts.targetElementId) as HTMLMediaElement;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
targetElement = browser.menus.getTargetElement(
|
||||||
|
opts.targetElementId) as HTMLMediaElement;
|
||||||
|
|
||||||
currentSession = await getSession(opts);
|
currentSession = await getSession(opts);
|
||||||
currentMedia = await getMedia(opts);
|
currentMedia = await getMedia(opts);
|
||||||
|
|
||||||
if (opts.targetElementId) {
|
if (targetElement instanceof HTMLMediaElement) {
|
||||||
registerMediaElementListeners();
|
registerMediaElementListeners(targetElement);
|
||||||
|
|
||||||
if (options.get("mediaOverlayEnabled")) {
|
if (options.get("mediaOverlayEnabled")) {
|
||||||
// TODO: Un-hide overlay here
|
// TODO: Un-hide overlay here
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener("beforeunload", async () => {
|
|
||||||
backgroundPort.postMessage({
|
|
||||||
subject: "bridge:mediaServer/stop"
|
|
||||||
});
|
|
||||||
|
|
||||||
if (await options.get("mediaStopOnUnload")) {
|
|
||||||
currentSession.stop();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window.addEventListener("beforeunload", async () => {
|
||||||
|
backgroundPort.postMessage({
|
||||||
|
subject: "bridge:mediaServer/stop"
|
||||||
|
});
|
||||||
|
|
||||||
|
if (await options.get("mediaStopOnUnload")) {
|
||||||
|
currentSession.stop();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user