3 * http://www.mediaelementjs.com/
5 * Wrapper that mimics native HTML5 MediaElement (audio and video)
6 * using a variety of technologies (pure JavaScript, Flash, iframe)
8 * Copyright 2010-2017, John Dyer (http://j.hn/)
11 */(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
){
18 load
: function load(settings
) {
19 if (typeof Twitch
!== 'undefined') {
20 TwitchApi
.promise
= new Promise(function (resolve
) {
23 TwitchApi
._createPlayer(settings
);
26 TwitchApi
.promise
= TwitchApi
.promise
|| mejs
.Utils
.loadScript('https://player.twitch.tv/js/embed/v1.js');
27 TwitchApi
.promise
.then(function () {
28 TwitchApi
._createPlayer(settings
);
33 _createPlayer
: function _createPlayer(settings
) {
34 var player
= new Twitch
.Player(settings
.id
, settings
);
35 window
['__ready__' + settings
.id
](player
);
38 getTwitchId
: function getTwitchId(url
) {
41 if (url
.indexOf('?') > 0) {
42 twitchId
= TwitchApi
.getTwitchIdFromParam(url
);
43 if (twitchId
=== '') {
44 twitchId
= TwitchApi
.getTwitchIdFromUrl(url
);
47 twitchId
= TwitchApi
.getTwitchIdFromUrl(url
);
53 getTwitchIdFromParam
: function getTwitchIdFromParam(url
) {
54 if (url
=== undefined || url
=== null || !url
.trim().length
) {
58 var parts
= url
.split('?'),
59 parameters
= parts
[1].split('&');
63 for (var i
= 0, total
= parameters
.length
; i
< total
; i
++) {
64 var paramParts
= parameters
[i
].split('=');
65 if (~paramParts
[0].indexOf('channel')) {
66 twitchId
= paramParts
[1];
68 } else if (~paramParts
[0].indexOf('video')) {
69 twitchId
= 'v' + paramParts
[1];
77 getTwitchIdFromUrl
: function getTwitchIdFromUrl(url
) {
78 if (url
=== undefined || url
=== null || !url
.trim().length
) {
82 var parts
= url
.split('?');
84 var id
= url
.substring(url
.lastIndexOf('/') + 1);
85 return (/^\d+$/i.test(id
) ? 'v' + id
: id
89 getTwitchType
: function getTwitchType(id
) {
90 return (/^v\d+/i.test(id
) ? 'video' : 'channel'
95 var TwitchIframeRenderer
= {
96 name
: 'twitch_iframe',
98 prefix
: 'twitch_iframe'
101 canPlayType
: function canPlayType(type
) {
102 return ~['video/twitch', 'video/x-twitch'].indexOf(type
.toLowerCase());
105 create
: function create(mediaElement
, options
, mediaFiles
) {
109 twitchId
= TwitchApi
.getTwitchId(mediaFiles
[0].src
);
111 var twitchPlayer
= null,
114 hasStartedPlaying
= false,
119 twitch
.options
= options
;
120 twitch
.id
= mediaElement
.id
+ '_' + options
.prefix
;
121 twitch
.mediaElement
= mediaElement
;
123 var props
= mejs
.html5media
.properties
,
124 assignGettersSetters
= function assignGettersSetters(propName
) {
125 var capName
= '' + propName
.substring(0, 1).toUpperCase() + propName
.substring(1);
127 twitch
['get' + capName
] = function () {
128 if (twitchPlayer
!== null) {
133 time
= twitchPlayer
.getCurrentTime();
136 duration
= twitchPlayer
.getDuration();
139 volume
= twitchPlayer
.getVolume();
142 paused
= twitchPlayer
.isPaused();
145 ended
= twitchPlayer
.getEnded();
148 return twitchPlayer
.getMuted();
151 start
: function start() {
154 end
: function end() {
160 return TwitchApi
.getTwitchType(twitchId
) === 'channel' ? twitchPlayer
.getChannel() : twitchPlayer
.getVideo();
171 twitch
['set' + capName
] = function (value
) {
172 if (twitchPlayer
!== null) {
175 var url
= typeof value
=== 'string' ? value
: value
[0].src
,
176 videoId
= TwitchApi
.getTwitchId(url
);
178 if (TwitchApi
.getTwitchType(twitchId
) === 'channel') {
179 twitchPlayer
.setChannel(videoId
);
181 twitchPlayer
.setVideo(videoId
);
185 twitchPlayer
.seek(value
);
186 setTimeout(function () {
187 var event
= mejs
.Utils
.createEvent('timeupdate', twitch
);
188 mediaElement
.dispatchEvent(event
);
192 twitchPlayer
.setMuted(value
);
193 setTimeout(function () {
194 var event
= mejs
.Utils
.createEvent('volumechange', twitch
);
195 mediaElement
.dispatchEvent(event
);
200 twitchPlayer
.setVolume(value
);
201 setTimeout(function () {
202 var event
= mejs
.Utils
.createEvent('volumechange', twitch
);
203 mediaElement
.dispatchEvent(event
);
207 var event
= mejs
.Utils
.createEvent('canplay', twitch
);
208 mediaElement
.dispatchEvent(event
);
215 apiStack
.push({ type
: 'set', propName
: propName
, value
: value
});
220 for (var i
= 0, total
= props
.length
; i
< total
; i
++) {
221 assignGettersSetters(props
[i
]);
224 var methods
= mejs
.html5media
.methods
,
225 assignMethods
= function assignMethods(methodName
) {
226 twitch
[methodName
] = function () {
227 if (twitchPlayer
!== null) {
228 switch (methodName
) {
231 return twitchPlayer
.play();
234 return twitchPlayer
.pause();
239 apiStack
.push({ type
: 'call', methodName
: methodName
});
244 for (var _i
= 0, _total
= methods
.length
; _i
< _total
; _i
++) {
245 assignMethods(methods
[_i
]);
248 function sendEvents(events
) {
249 for (var _i2
= 0, _total2
= events
.length
; _i2
< _total2
; _i2
++) {
250 var event
= mejs
.Utils
.createEvent(events
[_i2
], twitch
);
251 mediaElement
.dispatchEvent(event
);
255 window
['__ready__' + twitch
.id
] = function (_twitchPlayer
) {
256 mediaElement
.twitchPlayer
= twitchPlayer
= _twitchPlayer
;
258 if (apiStack
.length
) {
259 for (var _i3
= 0, _total3
= apiStack
.length
; _i3
< _total3
; _i3
++) {
260 var stackItem
= apiStack
[_i3
];
262 if (stackItem
.type
=== 'set') {
263 var propName
= stackItem
.propName
,
264 capName
= '' + propName
.substring(0, 1).toUpperCase() + propName
.substring(1);
266 twitch
['set' + capName
](stackItem
.value
);
267 } else if (stackItem
.type
=== 'call') {
268 twitch
[stackItem
.methodName
]();
273 var twitchIframe
= document
.getElementById(twitch
.id
).firstChild
;
274 twitchIframe
.style
.width
= '100%';
275 twitchIframe
.style
.height
= '100%';
277 var events
= ['mouseover', 'mouseout'],
278 assignEvents
= function assignEvents(e
) {
279 var event
= mejs
.Utils
.createEvent(e
.type
, twitch
);
280 mediaElement
.dispatchEvent(event
);
283 for (var _i4
= 0, _total4
= events
.length
; _i4
< _total4
; _i4
++) {
284 twitchIframe
.addEventListener(events
[_i4
], assignEvents
, false);
289 twitchPlayer
.addEventListener(Twitch
.Player
.READY
, function () {
292 sendEvents(['rendererready', 'loadedmetadata', 'loadeddata', 'canplay']);
294 twitchPlayer
.addEventListener(Twitch
.Player
.PLAY
, function () {
295 if (!hasStartedPlaying
) {
296 hasStartedPlaying
= true;
300 sendEvents(['play', 'playing', 'progress']);
302 timer
= setInterval(function () {
303 twitchPlayer
.getCurrentTime();
304 sendEvents(['timeupdate']);
307 twitchPlayer
.addEventListener(Twitch
.Player
.PAUSE
, function () {
310 if (!twitchPlayer
.getEnded()) {
311 sendEvents(['pause']);
314 twitchPlayer
.addEventListener(Twitch
.Player
.ENDED
, function () {
317 sendEvents(['ended']);
318 clearInterval(timer
);
319 hasStartedPlaying
= false;
324 var height
= mediaElement
.originalNode
.height
,
325 width
= mediaElement
.originalNode
.width
,
326 twitchContainer
= document
.createElement('div'),
327 type
= TwitchApi
.getTwitchType(twitchId
),
333 autoplay
: mediaElement
.originalNode
.autoplay
,
334 muted
: mediaElement
.originalNode
.muted
337 twitchSettings
[type
] = twitchId
;
338 twitchContainer
.id
= twitch
.id
;
339 twitchContainer
.style
.width
= '100%';
340 twitchContainer
.style
.height
= '100%';
342 mediaElement
.originalNode
.parentNode
.insertBefore(twitchContainer
, mediaElement
.originalNode
);
343 mediaElement
.originalNode
.style
.display
= 'none';
344 mediaElement
.originalNode
.autoplay
= false;
346 twitch
.setSize = function (width
, height
) {
347 if (TwitchApi
!== null && !isNaN(width
) && !isNaN(height
)) {
348 twitchContainer
.setAttribute('width', width
);
349 twitchContainer
.setAttribute('height', height
);
352 twitch
.hide = function () {
354 twitchContainer
.style
.display
= 'none';
356 twitch
.show = function () {
357 twitchContainer
.style
.display
= '';
359 twitch
.destroy = function () {};
361 TwitchApi
.load(twitchSettings
);
367 mejs
.Utils
.typeChecks
.push(function (url
) {
368 return (/\/\/(www|player).twitch.tv/i.test(url
) ? 'video/x-twitch' : null
372 mejs
.Renderers
.add(TwitchIframeRenderer
);