lbry-desktop/ui/component/viewers/videoViewer/internal/chromecast.js

60 lines
1.7 KiB
JavaScript
Raw Normal View History

// @flow
let gTitle = '';
let gChannelTitle = '';
/**
* Wrapper for @silvermine/videojs-chromecast to consolidate all things related
* to chromecast.
*/
export default class Chromecast {
/**
* Actions that need to happen after initializing 'videojs'
*/
static initialize(player: any) {
// --- Start plugin ---
player.chromecast();
// --- Init cast framework ---
const CHROMECAST_API_SCRIPT_ID = 'chromecastApi';
const existingChromecastScript = document.getElementById(CHROMECAST_API_SCRIPT_ID);
if (!existingChromecastScript) {
const script = document.createElement('script');
script.src = 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1';
script.id = CHROMECAST_API_SCRIPT_ID;
// $FlowFixMe
document.body.appendChild(script);
}
}
/**
* A React-to-vjs interface to pass the new content and channel titles to the
* chromecast plugin. Inline functions cannot be used in the `chromecast`
* property in `videoJsOptions` due to stale closure, since we no longer
* dispose the player when the src changes.
*
* We need this info from React because are unable to derive them from the
* `src` argument of `requestTitleFn | requestSubtitleFn`.
*
* @param title
* @param channelTitle
*/
static updateTitles(title: ?string, channelTitle: ?string) {
gTitle = title;
gChannelTitle = channelTitle;
}
/**
* Returns the required 'chromecast' options to be appended to the videojs
* options object.
*/
static getOptions() {
return {
chromecast: {
requestTitleFn: (src: ?string) => gTitle || '',
requestSubtitleFn: (src: ?string) => gChannelTitle || '',
},
};
}
}