cfd16ad06ed189ce469b859ccdec25258b9029d8
[lhc/web/www.git] / www / plugins-dist / medias / lib / mejs / renderers / soundcloud.js
1 /*!
2 * MediaElement.js
3 * http://www.mediaelementjs.com/
4 *
5 * Wrapper that mimics native HTML5 MediaElement (audio and video)
6 * using a variety of technologies (pure JavaScript, Flash, iframe)
7 *
8 * Copyright 2010-2017, John Dyer (http://j.hn/)
9 * License: MIT
10 *
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){
12 'use strict';
13
14 var SoundCloudApi = {
15
16 promise: null,
17
18 load: function load(settings) {
19
20 if (typeof SC !== 'undefined') {
21 SoundCloudApi._createPlayer(settings);
22 } else {
23 SoundCloudApi.promise = SoundCloudApi.promise || mejs.Utils.loadScript('https://w.soundcloud.com/player/api.js');
24 SoundCloudApi.promise.then(function () {
25 SoundCloudApi._createPlayer(settings);
26 });
27 }
28 },
29
30 _createPlayer: function _createPlayer(settings) {
31 var player = SC.Widget(settings.iframe);
32 window['__ready__' + settings.id](player);
33 }
34 };
35
36 var SoundCloudIframeRenderer = {
37 name: 'soundcloud_iframe',
38 options: {
39 prefix: 'soundcloud_iframe'
40 },
41
42 canPlayType: function canPlayType(type) {
43 return ~['video/soundcloud', 'video/x-soundcloud'].indexOf(type.toLowerCase());
44 },
45
46 create: function create(mediaElement, options, mediaFiles) {
47 var sc = {},
48 apiStack = [],
49 readyState = 4,
50 autoplay = mediaElement.originalNode.autoplay;
51
52 var duration = 0,
53 currentTime = 0,
54 bufferedTime = 0,
55 volume = 1,
56 muted = false,
57 paused = true,
58 ended = false,
59 scPlayer = null,
60 scIframe = null;
61
62 sc.options = options;
63 sc.id = mediaElement.id + '_' + options.prefix;
64 sc.mediaElement = mediaElement;
65
66 var props = mejs.html5media.properties,
67 assignGettersSetters = function assignGettersSetters(propName) {
68 var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
69
70 sc['get' + capName] = function () {
71 if (scPlayer !== null) {
72 var value = null;
73
74 switch (propName) {
75 case 'currentTime':
76 return currentTime;
77 case 'duration':
78 return duration;
79 case 'volume':
80 return volume;
81 case 'paused':
82 return paused;
83 case 'ended':
84 return ended;
85 case 'muted':
86 return muted;
87 case 'buffered':
88 return {
89 start: function start() {
90 return 0;
91 },
92 end: function end() {
93 return bufferedTime * duration;
94 },
95 length: 1
96 };
97 case 'src':
98 return scIframe ? scIframe.src : '';
99 case 'readyState':
100 return readyState;
101 }
102 return value;
103 } else {
104 return null;
105 }
106 };
107
108 sc['set' + capName] = function (value) {
109 if (scPlayer !== null) {
110 switch (propName) {
111 case 'src':
112 var url = typeof value === 'string' ? value : value[0].src;
113 scPlayer.load(url);
114 if (autoplay) {
115 scPlayer.play();
116 }
117 break;
118 case 'currentTime':
119 scPlayer.seekTo(value * 1000);
120 break;
121 case 'muted':
122 if (value) {
123 scPlayer.setVolume(0);
124 } else {
125 scPlayer.setVolume(1);
126 }
127 setTimeout(function () {
128 var event = mejs.Utils.createEvent('volumechange', sc);
129 mediaElement.dispatchEvent(event);
130 }, 50);
131 break;
132 case 'volume':
133 scPlayer.setVolume(value);
134 setTimeout(function () {
135 var event = mejs.Utils.createEvent('volumechange', sc);
136 mediaElement.dispatchEvent(event);
137 }, 50);
138 break;
139 case 'readyState':
140 var event = mejs.Utils.createEvent('canplay', sc);
141 mediaElement.dispatchEvent(event);
142 break;
143
144 default:
145
146 break;
147 }
148 } else {
149 apiStack.push({ type: 'set', propName: propName, value: value });
150 }
151 };
152 };
153
154 for (var i = 0, total = props.length; i < total; i++) {
155 assignGettersSetters(props[i]);
156 }
157
158 var methods = mejs.html5media.methods,
159 assignMethods = function assignMethods(methodName) {
160 sc[methodName] = function () {
161 if (scPlayer !== null) {
162 switch (methodName) {
163 case 'play':
164 return scPlayer.play();
165 case 'pause':
166 return scPlayer.pause();
167 case 'load':
168 return null;
169 }
170 } else {
171 apiStack.push({ type: 'call', methodName: methodName });
172 }
173 };
174 };
175
176 for (var _i = 0, _total = methods.length; _i < _total; _i++) {
177 assignMethods(methods[_i]);
178 }
179
180 window['__ready__' + sc.id] = function (_scPlayer) {
181
182 mediaElement.scPlayer = scPlayer = _scPlayer;
183
184 if (autoplay) {
185 scPlayer.play();
186 }
187
188 if (apiStack.length) {
189 for (var _i2 = 0, _total2 = apiStack.length; _i2 < _total2; _i2++) {
190
191 var stackItem = apiStack[_i2];
192
193 if (stackItem.type === 'set') {
194 var propName = stackItem.propName,
195 capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
196
197 sc['set' + capName](stackItem.value);
198 } else if (stackItem.type === 'call') {
199 sc[stackItem.methodName]();
200 }
201 }
202 }
203
204 scPlayer.bind(SC.Widget.Events.PLAY_PROGRESS, function () {
205 paused = false;
206 ended = false;
207 scPlayer.getPosition(function (_currentTime) {
208 currentTime = _currentTime / 1000;
209 var event = mejs.Utils.createEvent('timeupdate', sc);
210 mediaElement.dispatchEvent(event);
211 });
212 });
213 scPlayer.bind(SC.Widget.Events.PAUSE, function () {
214 paused = true;
215 var event = mejs.Utils.createEvent('pause', sc);
216 mediaElement.dispatchEvent(event);
217 });
218 scPlayer.bind(SC.Widget.Events.PLAY, function () {
219 paused = false;
220 ended = false;
221 var event = mejs.Utils.createEvent('play', sc);
222 mediaElement.dispatchEvent(event);
223 });
224 scPlayer.bind(SC.Widget.Events.FINISHED, function () {
225 paused = false;
226 ended = true;
227 var event = mejs.Utils.createEvent('ended', sc);
228 mediaElement.dispatchEvent(event);
229 });
230 scPlayer.bind(SC.Widget.Events.READY, function () {
231 scPlayer.getDuration(function (_duration) {
232 duration = _duration / 1000;
233 var event = mejs.Utils.createEvent('loadedmetadata', sc);
234 mediaElement.dispatchEvent(event);
235 });
236 });
237 scPlayer.bind(SC.Widget.Events.LOAD_PROGRESS, function () {
238 scPlayer.getDuration(function (loadProgress) {
239 if (duration > 0) {
240 bufferedTime = duration * loadProgress;
241 var event = mejs.Utils.createEvent('progress', sc);
242 mediaElement.dispatchEvent(event);
243 }
244 });
245 scPlayer.getDuration(function (_duration) {
246 duration = _duration;
247
248 var event = mejs.Utils.createEvent('loadedmetadata', sc);
249 mediaElement.dispatchEvent(event);
250 });
251 });
252
253 var initEvents = ['rendererready', 'loadeddata', 'loadedmetadata', 'canplay'];
254 for (var _i3 = 0, _total3 = initEvents.length; _i3 < _total3; _i3++) {
255 var event = mejs.Utils.createEvent(initEvents[_i3], sc);
256 mediaElement.dispatchEvent(event);
257 }
258 };
259
260 scIframe = document.createElement('iframe');
261 scIframe.id = sc.id;
262 scIframe.width = 10;
263 scIframe.height = 10;
264 scIframe.frameBorder = 0;
265 scIframe.style.visibility = 'hidden';
266 scIframe.src = mediaFiles[0].src;
267 scIframe.scrolling = 'no';
268
269 mediaElement.appendChild(scIframe);
270 mediaElement.originalNode.style.display = 'none';
271
272 var scSettings = {
273 iframe: scIframe,
274 id: sc.id
275 };
276
277 SoundCloudApi.load(scSettings);
278
279 sc.setSize = function () {};
280 sc.hide = function () {
281 sc.pause();
282 if (scIframe) {
283 scIframe.style.display = 'none';
284 }
285 };
286 sc.show = function () {
287 if (scIframe) {
288 scIframe.style.display = '';
289 }
290 };
291 sc.destroy = function () {
292 scPlayer.destroy();
293 };
294
295 return sc;
296 }
297 };
298
299 mejs.Utils.typeChecks.push(function (url) {
300 return (/\/\/(w\.)?soundcloud.com/i.test(url) ? 'video/x-soundcloud' : null
301 );
302 });
303
304 mejs.Renderers.add(SoundCloudIframeRenderer);
305
306 },{}]},{},[1]);