Chromecast in html5

0

Nesecito help me so that an app can send streaming with chromecast, in the browser works well when compiling with cordova I do not see the chromecast button.

/*!
 * MediaElement.js
 * http://www.mediaelementjs.com/
 *
 * Wrapper that mimics native HTML5 MediaElement (audio and video)
 * using a variety of technologies (pure JavaScript, Flash, iframe)
 *
 * Copyright 2010-2017, John Dyer (http://j.hn/)
 * License: MIT
 *
 */(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
'use strict';

var _player = _dereq_(2);

var _player2 = _interopRequireDefault(_player);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

mejs.i18n.en['mejs.chromecast-legend'] = 'Casting to:';

Object.assign(mejs.MepDefaults, {
	castTitle: null,

	castAppID: null,

	castPolicy: 'origin',

	castEnableTracks: false,

	castIsLive: false

});

Object.assign(MediaElementPlayer.prototype, {
	buildchromecast: function buildchromecast(player, controls, layers, media) {

		var t = this,
		    button = document.createElement('div'),
		    castTitle = mejs.Utils.isString(t.options.castTitle) ? t.options.castTitle : 'Chromecast';

		player.chromecastLayer = document.createElement('div');
		player.chromecastLayer.className = t.options.classPrefix + 'chromecast-layer ' + t.options.classPrefix + 'layer';
		player.chromecastLayer.innerHTML = '<div class="' + t.options.classPrefix + 'chromecast-info"></div>';
		player.chromecastLayer.style.display = 'none';

		layers.insertBefore(player.chromecastLayer, layers.firstChild);

		button.className = t.options.classPrefix + 'button ' + t.options.classPrefix + 'chromecast-button';
		button.innerHTML = '<button type="button" is="google-cast-button" aria-controls="' + t.id + '" title="' + castTitle + '" aria-label="' + castTitle + '" tabindex="0"></button>';
		button.style.display = 'none';

		t.addControlElement(button, 'chromecast');
		t.castButton = button;

		player.chromecastLayer.innerHTML = '<div class="' + t.options.classPrefix + 'chromecast-container">' + ('<span class="' + t.options.classPrefix + 'chromecast-icon"></span>') + ('<span class="' + t.options.classPrefix + 'chromecast-info">' + mejs.i18n.t('mejs.chromecast-legend') + ' <span class="device"></span></span>') + '</div>';

		if (media.originalNode.getAttribute('poster')) {
			player.chromecastLayer.innerHTML += '<img src="' + media.originalNode.getAttribute('poster') + '" width="100%" height="100%">';
			player.chromecastLayer.querySelector('img').addEventListener('click', function () {
				if (player.options.clickToPlayPause) {
					var _button = t.container.querySelector('.' + t.options.classPrefix + 'overlay-button'),
					    pressed = _button.getAttribute('aria-pressed');

					if (player.paused) {
						player.play();
					} else {
						player.pause();
					}

					_button.setAttribute('aria-pressed', !!pressed);
					player.container.focus();
				}
			});
		}

		window.__onGCastApiAvailable = function (isAvailable) {
			var mediaType = mejs.Utils.getTypeFromFile(media.originalNode.src).toLowerCase(),
			    canPlay = mediaType && ['application/x-mpegurl', 'application/vnd.apple.mpegurl', 'application/dash+xml', 'video/mp4', 'audio/mp3', 'audio/mp4'].indexOf(mediaType) > -1;

			if (isAvailable && canPlay) {
				t._initializeCastPlayer();
			}
		};

		if (window.cast) {
			var _button2 = t.controls.querySelector('.' + t.options.classPrefix + 'chromecast-button>button');
			if (_button2 && _button2.style.display !== 'none') {
				t.controls.querySelector('.' + t.options.classPrefix + 'chromecast-button').style.display = '';
			}
			t._initializeCastPlayer();
			return;
		}
		mejs.Utils.loadScript('https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');
	},
	cleanchromecast: function cleanchromecast(player) {
		if (window.cast) {
			var session = cast.framework.CastContext.getInstance().getCurrentSession();
			if (session) {
				session.endSession(true);
			}
		}

		if (player.castButton) {
			player.castButton.remove();
		}

		if (player.chromecastLayer) {
			player.chromecastLayer.remove();
		}
	},
	_initializeCastPlayer: function _initializeCastPlayer() {
		var t = this;

		var origin = void 0;

		switch (this.options.castPolicy) {
			case 'tab':
				origin = 'TAB_AND_ORIGIN_SCOPED';
				break;
			case 'page':
				origin = 'PAGE_SCOPED';
				break;
			default:
				origin = 'ORIGIN_SCOPED';
				break;
		}

		var context = cast.framework.CastContext.getInstance(),
		    session = context.getCurrentSession();
		context.setOptions({
			receiverApplicationId: t.options.castAppID || chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,
			autoJoinPolicy: chrome.cast.AutoJoinPolicy[origin]
		});
		context.addEventListener(cast.framework.CastContextEventType.CAST_STATE_CHANGED, t._checkCastButtonStatus.bind(t));

		t.remotePlayer = new cast.framework.RemotePlayer();
		t.remotePlayerController = new cast.framework.RemotePlayerController(t.remotePlayer);
		t.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, t._switchToCastPlayer.bind(this));

		if (session) {
			var state = context.getCastState(),
			    button = t.controls.querySelector('.' + t.options.classPrefix + 'chromecast-button');

			if (button && state === cast.framework.CastState.NO_DEVICES_AVAILABLE) {
				button.style.display = 'none';
			} else if (button) {
				if (t.chromecastLayer) {
					t.chromecastLayer.style.display = state === cast.framework.CastState.CONNECTED ? '' : 'none';
				}
				button.style.display = '';
			}
			t._switchToCastPlayer();
		}
	},
	_checkCastButtonStatus: function _checkCastButtonStatus(e) {
		var t = this,
		    button = t.controls.querySelector('.' + t.options.classPrefix + 'chromecast-button');

		if (button && e.castState === cast.framework.CastState.NO_DEVICES_AVAILABLE) {
			button.style.display = 'none';
		} else if (button) {
			if (t.chromecastLayer) {
				t.chromecastLayer.style.display = e.castState === cast.framework.CastState.CONNECTED ? '' : 'none';
			}
			button.style.display = '';
		}

		setTimeout(function () {
			t.setPlayerSize(t.width, t.height);
			t.setControlsSize();
		}, 0);
	},
	_switchToCastPlayer: function _switchToCastPlayer() {
		var t = this;

		if (t.proxy) {
			t.proxy.pause();
		}
		if (cast && cast.framework) {
			var context = cast.framework.CastContext.getInstance();
			context.addEventListener(cast.framework.CastContextEventType.CAST_STATE_CHANGED, t._checkCastButtonStatus.bind(t));
			if (t.remotePlayer.isConnected) {
				t._setupCastPlayer();
				return;
			}
		}
		t._setDefaultPlayer();
	},
	_setupCastPlayer: function _setupCastPlayer() {
		var t = this,
		    context = cast.framework.CastContext.getInstance(),
		    castSession = context.getCurrentSession(),
		    deviceInfo = t.layers.querySelector('.' + t.options.classPrefix + 'chromecast-info');

		if (t.loadedChromecast === true) {
			return;
		}

		t.loadedChromecast = true;

		t.proxy = new _player2.default(t.remotePlayer, t.remotePlayerController, t.media, t.options);

		if (deviceInfo) deviceInfo.querySelector('.device').innerText = castSession.getCastDevice().friendlyName;
		if (t.chromecastLayer) {
			t.chromecastLayer.style.display = '';
		}

		if (t.options.castEnableTracks === true) {
			(function () {
				var captions = t.captionsButton !== undefined ? t.captionsButton.querySelectorAll('input[type=radio]') : null;

				if (captions !== null) {
					var _loop = function _loop(i, total) {
						captions[i].addEventListener('click', function () {
							var trackId = parseInt(captions[i].id.replace(/^.*?track_(\d+)_.*$/, "$1")),
							    setTracks = captions[i].value === 'none' ? [] : [trackId],
							    tracksInfo = new chrome.cast.media.EditTracksInfoRequest(setTracks);

							castSession.getMediaSession().editTracksInfo(tracksInfo, function () {}, function (e) {
								console.error(e);
							});
						});
					};

					for (var i = 0, total = captions.length; i < total; i++) {
						_loop(i, total);
					}
				}
			})();
		}

		t.media.addEventListener('loadedmetadata', function () {
			if (['SESSION_ENDING', 'SESSION_ENDED', 'NO_SESSION'].indexOf(castSession.getSessionState()) === -1 && t.proxy instanceof DefaultPlayer) {
				t.proxy.pause();
				t.proxy = new _player2.default(t.remotePlayer, t.remotePlayerController, t.media, t.options);
			}
		});

		t.media.addEventListener('timeupdate', function () {
			t.currentMediaTime = t.getCurrentTime();
		});
	}
});

},{"2":2}],2:[function(_dereq_,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
	value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var ChromecastPlayer = function () {
	function ChromecastPlayer(player, controller, media, options) {
		_classCallCheck(this, ChromecastPlayer);

		var t = this;
		t.player = player;
		t.controller = controller;
		t.media = media;
		t.endedMedia = false;
		t.enableTracks = options.castEnableTracks;
		t.isLive = options.castIsLive;

		t.controller.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, function () {
			if (t.paused) {
				t.pause();
			} else {
				t.play();
			}
			t.endedMedia = false;
		});
		t.controller.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, function () {
			t.setMuted(t.player.isMuted);
			t.volume = 0;
		});
		t.controller.addEventListener(cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED, function () {
			var event = mejs.Utils.createEvent('loadedmetadata', t.media);
			t.media.dispatchEvent(event);
		});
		t.controller.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, function () {
			t.volume = t.player.volumeLevel;
			var event = mejs.Utils.createEvent('volumechange', t.media);
			t.media.dispatchEvent(event);
		});
		t.controller.addEventListener(cast.framework.RemotePlayerEventType.DURATION_CHANGED, function () {
			var event = mejs.Utils.createEvent('timeupdate', t.media);
			t.media.dispatchEvent(event);
		});
		t.controller.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED, function () {
			var event = mejs.Utils.createEvent('timeupdate', t.media);
			t.media.dispatchEvent(event);

			if (!t.isLive && t.getCurrentTime() >= t.getDuration()) {
				t.endedMedia = true;
				setTimeout(function () {
					var event = mejs.Utils.createEvent('ended', t.media);
					t.media.dispatchEvent(event);
				}, 50);
			}
		});
		t.controller.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, function () {
			t.setMuted(t.player.isMuted);
		});

		t.load();
		return t;
	}

	_createClass(ChromecastPlayer, [{
		key: 'getSrc',
		value: function getSrc() {
			return this.media.originalNode.src;
		}
	}, {
		key: 'setSrc',
		value: function setSrc(value) {
			this.media.originalNode.src = typeof value === 'string' ? value : value[0].src;
			this.load();
		}
	}, {
		key: 'setCurrentTime',
		value: function setCurrentTime(value) {
			this.player.currentTime = value;
			this.controller.seek();
			var event = mejs.Utils.createEvent('timeupdate', this.media);
			this.media.dispatchEvent(event);
		}
	}, {
		key: 'getCurrentTime',
		value: function getCurrentTime() {
			return this.player.currentTime;
		}
	}, {
		key: 'getDuration',
		value: function getDuration() {
			return this.player.duration;
		}
	}, {
		key: 'setVolume',
		value: function setVolume(value) {
			this.player.volumeLevel = value;
			this.controller.setVolumeLevel();
			var event = mejs.Utils.createEvent('volumechange', this.media);
			this.media.dispatchEvent(event);
		}
	}, {
		key: 'getVolume',
		value: function getVolume() {
			return this.player.volumeLevel;
		}
	}, {
		key: 'play',
		value: function play() {
			if (this.player.isPaused) {
				this.controller.playOrPause();
				var event = mejs.Utils.createEvent('play', this.media);
				this.media.dispatchEvent(event);
			}
		}
	}, {
		key: 'pause',
		value: function pause() {
			if (!this.player.isPaused) {
				this.controller.playOrPause();
				var event = mejs.Utils.createEvent('pause', this.media);
				this.media.dispatchEvent(event);
			}
		}
	}, {
		key: 'load',
		value: function load() {
			var t = this,
			    url = this.media.originalNode.src,
			    type = mejs.Utils.getTypeFromFile(url),
			    mediaInfo = new chrome.cast.media.MediaInfo(url, type),
			    castSession = cast.framework.CastContext.getInstance().getCurrentSession();

			if (url === window.location.href || !castSession) {
				return;
			}

			if (t.enableTracks === true) {
				var tracks = [],
				    children = t.media.originalNode.children;

				var counter = 1;

				for (var i = 0, total = children.length; i < total; i++) {
					var child = children[i],
					    tag = child.tagName.toLowerCase();

					if (tag === 'track' && (child.getAttribute('kind') === 'subtitles' || child.getAttribute('kind') === 'captions')) {
						var el = new chrome.cast.media.Track(counter, chrome.cast.media.TrackType.TEXT);
						el.trackContentId = mejs.Utils.absolutizeUrl(child.getAttribute('src'));
						el.trackContentType = 'text/vtt';
						el.subtype = chrome.cast.media.TextTrackType.SUBTITLES;
						el.name = child.getAttribute('label');
						el.language = child.getAttribute('srclang');
						el.customData = null;
						tracks.push(el);
						counter++;
					}
				}
				mediaInfo.textTrackStyle = new chrome.cast.media.TextTrackStyle();
				mediaInfo.tracks = tracks;
			}

			mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();
			mediaInfo.streamType = t.isLive ? chrome.cast.media.StreamType.LIVE : chrome.cast.media.StreamType.BUFFERED;
			mediaInfo.customData = null;
			mediaInfo.duration = null;
			mediaInfo.currentTime = t.isLive ? Infinity : 0;

			if (t.media.originalNode.getAttribute('data-cast-title')) {
				mediaInfo.metadata.title = t.media.originalNode.getAttribute('data-cast-title');
			}

			if (t.media.originalNode.getAttribute('data-cast-description')) {
				mediaInfo.metadata.subtitle = t.media.originalNode.getAttribute('data-cast-description');
			}

			if (t.media.originalNode.getAttribute('poster') || t.media.originalNode.getAttribute('data-cast-poster')) {
				var poster = t.media.originalNode.getAttribute('poster') || t.media.originalNode.getAttribute('data-cast-poster');
				mediaInfo.metadata.images = [{ 'url': mejs.Utils.absolutizeUrl(poster) }];
			}

			var request = new chrome.cast.media.LoadRequest(mediaInfo);

			castSession.loadMedia(request).then(function () {
				var currentTime = t.media.originalNode.currentTime;
				t.setCurrentTime(currentTime);
				t.play();

				var event = mejs.Utils.createEvent('play', t.media);
				t.media.dispatchEvent(event);
			}, function (error) {
				t._getErrorMessage(error);
			});
		}
	}, {
		key: 'setMuted',
		value: function setMuted(value) {
			var _this = this;

			if (value === true && !this.player.isMuted) {
				this.controller.muteOrUnmute();
			} else if (value === false && this.player.isMuted) {
				this.controller.muteOrUnmute();
			}
			setTimeout(function () {
				var event = mejs.Utils.createEvent('volumechange', _this.media);
				_this.media.dispatchEvent(event);
			}, 50);
		}
	}, {
		key: 'canPlayType',
		value: function canPlayType(type) {
			return ~['application/x-mpegurl', 'vnd.apple.mpegurl', 'application/dash+xml', 'video/mp4'].indexOf(type);
		}
	}, {
		key: '_getErrorMessage',
		value: function _getErrorMessage(error) {

			var description = error.description ? ' : ' + error.description : '.';

			var message = void 0;

			switch (error.code) {
				case chrome.cast.ErrorCode.API_NOT_INITIALIZED:
					message = 'The API is not initialized' + description;
					break;
				case chrome.cast.ErrorCode.CANCEL:
					message = 'The operation was canceled by the user' + description;
					break;
				case chrome.cast.ErrorCode.CHANNEL_ERROR:
					message = 'A channel to the receiver is not available' + description;
					break;
				case chrome.cast.ErrorCode.EXTENSION_MISSING:
					message = 'The Cast extension is not available' + description;
					break;
				case chrome.cast.ErrorCode.INVALID_PARAMETER:
					message = 'The parameters to the operation were not valid' + description;
					break;
				case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:
					message = 'No receiver was compatible with the session request' + description;
					break;
				case chrome.cast.ErrorCode.SESSION_ERROR:
					message = 'A session could not be created, or a session was invalid' + description;
					break;
				case chrome.cast.ErrorCode.TIMEOUT:
					message = 'The operation timed out' + description;
					break;
				default:
					message = 'Unknown error: ' + error;
					break;
			}

			console.error(message);
		}
	}, {
		key: 'paused',
		get: function get() {
			return this.player.isPaused;
		}
	}, {
		key: 'muted',
		set: function set(value) {
			this.setMuted(value);
		},
		get: function get() {
			return this.player.isMuted;
		}
	}, {
		key: 'ended',
		get: function get() {
			return this.endedMedia;
		}
	}, {
		key: 'readyState',
		get: function get() {
			return this.media.originalNode.readyState;
		}
	}, {
		key: 'currentTime',
		set: function set(value) {
			this.setCurrentTime(value);
		},
		get: function get() {
			return this.getCurrentTime();
		}
	}, {
		key: 'duration',
		get: function get() {
			return this.getDuration();
		}
	}, {
		key: 'volume',
		set: function set(value) {
			this.setVolume(value);
		},
		get: function get() {
			return this.getVolume();
		}
	}, {
		key: 'src',
		set: function set(src) {
			this.setSrc(src);
		},
		get: function get() {
			return this.getSrc();
		}
	}]);

	return ChromecastPlayer;
}();

exports.default = ChromecastPlayer;


window.ChromecastPlayer = ChromecastPlayer;

},{}]},{},[1,2]);
.mejs__chromecast-button > button,
.mejs-chromecast-button > button {
    --disconnected-color: #fff;
    background: none;
    display: inline-block;
}
.mejs__chromecast-container,
.mejs-chromecast-container {
    background: #000;
    color: #fff;
    font-size: 10px;
    left: 0;
    padding: 5px;
    position: absolute;
    top: 0;
    z-index: 1;
}

.mejs__chromecast-layer > img,
.mejs-chromecast-layer > img {
    left: 0;
    position: absolute;
    top: 0;
    z-index: 0;
}

.mejs__chromecast-icon,
.mejs-chromecast-icon {
    background: url('chromecast.svg') no-repeat 0 0;
    display: inline-block;
    height: 14px;
    margin-right: 5px;
    width: 17px;
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>MediaElement.js 3.0 - Chromecast Plugin</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
    <link rel="icon" href="favicon.ico" type="image/x-icon">

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/mediaelement/4.2.6/mediaelementplayer.css">
    <link rel="stylesheet" href="../dist/chromecast/chromecast.css">
    <link rel="stylesheet" href="demo.css">
</head>
<body>
    <div id="container">

        <h1>Chromecast</h1>

        <div class="media-wrapper">
            <video id="player1" width="750" height="421" controls preload="none">
                <source src="https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/mp4/BigBuckBunny.mp4" type="video/mp4">
            </video>
        </div>

       
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/mediaelement/4.2.6/mediaelement-and-player.min.js"></script>
    <script src="../dist/chromecast/chromecast.js"></script>
    <script>
	    var mediaElements = document.querySelectorAll('video, audio');

	    for (var i = 0, total = mediaElements.length; i < total; i++) {

		    var features = ['playpause', 'current', 'progress', 'duration', 'volume', 'chromecast', 'fullscreen'];

		    new MediaElementPlayer(mediaElements[i], {
			    // This is needed to make Jump Forward to work correctly
			    pluginPath: 'https://cdnjs.cloudflare.com/ajax/libs/mediaelement/4.2.6/',
			    shimScriptAccess: 'always',
			    autoRewind: false,
			    features: features,
		    });
	    }
    </script>
</body>
</html>
    
asked by Johnny Steven 31.03.2018 в 05:05
source

0 answers