2014-04-04 16:38:36 +02:00
|
|
|
/*global chrome*/
|
2016-07-22 18:27:33 +02:00
|
|
|
/*jslint browser: true, nomen: true */
|
2016-06-22 12:53:16 +02:00
|
|
|
var castModule = (function () {
|
2014-04-04 16:38:36 +02:00
|
|
|
'use strict';
|
2017-03-08 13:23:42 +01:00
|
|
|
var launchBtn, disabledBtn, stopBtn, session, videoLink;
|
2014-04-04 16:38:36 +02:00
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
function receiverListener(e) {
|
|
|
|
return (e === chrome.cast.ReceiverAvailability.AVAILABLE);
|
2014-04-04 23:57:41 +02:00
|
|
|
}
|
2014-04-04 16:38:36 +02:00
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
function onMediaDiscovered() {
|
|
|
|
if (launchBtn) {
|
|
|
|
stopBtn.classList.remove('cast_hidden');
|
|
|
|
launchBtn.classList.add('cast_hidden');
|
|
|
|
}
|
|
|
|
}
|
2016-06-22 12:50:11 +02:00
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
function onStopCast() {
|
|
|
|
stopBtn.classList.add('cast_hidden');
|
|
|
|
launchBtn.classList.remove('cast_hidden');
|
2016-06-22 12:50:11 +02:00
|
|
|
}
|
|
|
|
|
2016-06-22 12:56:02 +02:00
|
|
|
function onStopCastError(e) {
|
|
|
|
onStopCast();
|
|
|
|
throw e.description;
|
|
|
|
}
|
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
function updateListener() {
|
|
|
|
if (session.status !== chrome.cast.SessionStatus.CONNECTED) {
|
|
|
|
onStopCast();
|
|
|
|
}
|
2014-04-04 23:57:41 +02:00
|
|
|
}
|
2014-04-04 16:38:36 +02:00
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
function sessionListener(e) {
|
|
|
|
session = e;
|
|
|
|
session.addMediaListener(onMediaDiscovered.bind(this, 'addMediaListener'));
|
|
|
|
session.addUpdateListener(updateListener.bind(this));
|
|
|
|
if (session.media.length !== 0) {
|
|
|
|
onMediaDiscovered('onRequestSessionSuccess', session.media[0]);
|
|
|
|
}
|
|
|
|
}
|
2014-04-04 16:38:36 +02:00
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
function stopCast() {
|
2016-06-22 12:56:02 +02:00
|
|
|
session.stop(onStopCast, onStopCastError);
|
2016-06-22 12:53:16 +02:00
|
|
|
}
|
2014-04-04 16:38:36 +02:00
|
|
|
|
2016-06-22 12:58:54 +02:00
|
|
|
function onMediaError(e) {
|
2016-06-22 12:53:16 +02:00
|
|
|
stopCast();
|
2016-06-22 12:58:54 +02:00
|
|
|
throw e.description;
|
2016-06-22 12:53:16 +02:00
|
|
|
}
|
2014-04-04 16:38:36 +02:00
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
function onRequestSessionSuccess(e) {
|
|
|
|
session = e;
|
2017-03-08 13:23:42 +01:00
|
|
|
var videoURL = videoLink.dataset.video, mediaInfo = new chrome.cast.media.MediaInfo(videoURL, 'video/' + videoLink.dataset.ext), request = new chrome.cast.media.LoadRequest(mediaInfo);
|
2016-06-22 12:53:16 +02:00
|
|
|
session.loadMedia(request, onMediaDiscovered.bind(this, 'loadMedia'), onMediaError);
|
|
|
|
}
|
2014-04-04 16:38:36 +02:00
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
function onLaunchError(e) {
|
|
|
|
throw e.description;
|
|
|
|
}
|
2014-04-04 16:38:36 +02:00
|
|
|
|
2017-03-08 13:23:42 +01:00
|
|
|
function launchCast(event) {
|
|
|
|
videoLink = event.target || event.srcElement;
|
2016-06-22 12:53:16 +02:00
|
|
|
chrome.cast.requestSession(onRequestSessionSuccess, onLaunchError);
|
2014-04-04 16:38:36 +02:00
|
|
|
}
|
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
function onInitSuccess() {
|
2017-03-08 13:23:42 +01:00
|
|
|
launchBtn = document.getElementsByClassName('cast_btn_launch');
|
|
|
|
disabledBtn = document.getElementsByClassName('cast_disabled');
|
|
|
|
stopBtn = document.getElementsByClassName('cast_btn_stop');
|
|
|
|
if (launchBtn.length > 0) {
|
|
|
|
var i;
|
|
|
|
for (i = 0; i < launchBtn.length; i++) {
|
|
|
|
disabledBtn[i].classList.add('cast_hidden');
|
|
|
|
launchBtn[i].classList.remove('cast_hidden');
|
|
|
|
launchBtn[i].addEventListener('click', launchCast, false);
|
|
|
|
stopBtn[i].addEventListener('click', stopCast, false);
|
|
|
|
}
|
2016-06-22 12:53:16 +02:00
|
|
|
}
|
|
|
|
}
|
2014-04-04 23:57:41 +02:00
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
function onError(e) {
|
|
|
|
throw e.code;
|
|
|
|
}
|
2014-04-04 23:57:41 +02:00
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
function initializeCastApi() {
|
|
|
|
var sessionRequest = new chrome.cast.SessionRequest(chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID), apiConfig = new chrome.cast.ApiConfig(sessionRequest, sessionListener, receiverListener, chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED);
|
|
|
|
chrome.cast.initialize(apiConfig, onInitSuccess, onError);
|
2014-04-04 16:38:36 +02:00
|
|
|
}
|
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
function loadCastApi(loaded, errorInfo) {
|
|
|
|
if (loaded) {
|
|
|
|
initializeCastApi();
|
|
|
|
} else {
|
|
|
|
throw errorInfo;
|
|
|
|
}
|
2016-06-22 12:32:57 +02:00
|
|
|
}
|
|
|
|
|
2016-06-22 12:53:16 +02:00
|
|
|
return {
|
|
|
|
init: function () {
|
2017-03-08 13:23:42 +01:00
|
|
|
var intro = document.getElementsByClassName('download_intro'), i;
|
|
|
|
for (i = 0; i < intro.length; i++) {
|
|
|
|
intro[i].insertAdjacentHTML('beforeend', '<img class="cast_disabled cast_icon" id="cast_disabled'+i+'" src="img/ic_media_route_disabled_holo_light.png" alt="" title="Google Cast is not supported on this browser." /> <img class="cast_btn_launch cast_btn cast_hidden cast_icon" id="cast_btn_launch'+i+'" src="img/ic_media_route_off_holo_light.png" title="Cast to ChromeCast" alt="Google Cast™" /> <img src="img/ic_media_route_on_holo_light.png" alt="Casting to ChromeCast…" title="Stop casting" id="cast_btn_stop'+i+'" class="cast_btn_stop cast_btn cast_hidden cast_icon" />');
|
2016-06-22 12:53:16 +02:00
|
|
|
}
|
2017-03-08 13:23:42 +01:00
|
|
|
window.__onGCastApiAvailable = loadCastApi;
|
2016-06-22 12:53:16 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
}());
|
|
|
|
|
|
|
|
window.addEventListener('load', castModule.init, false);
|