[SPIP] ~spip v3.2.0-->v3.2.1
[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 isVideo = mediaElement.originalNode !== null && mediaElement.originalNode.tagName.toLowerCase() === 'video';
52
53 var duration = 0,
54 currentTime = 0,
55 bufferedTime = 0,
56 volume = 1,
57 muted = false,
58 paused = true,
59 ended = false,
60 scPlayer = null,
61 scIframe = null;
62
63 sc.options = options;
64 sc.id = mediaElement.id + '_' + options.prefix;
65 sc.mediaElement = mediaElement;
66
67 var props = mejs.html5media.properties,
68 assignGettersSetters = function assignGettersSetters(propName) {
69 var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
70
71 sc['get' + capName] = function () {
72 if (scPlayer !== null) {
73 var value = null;
74
75 switch (propName) {
76 case 'currentTime':
77 return currentTime;
78 case 'duration':
79 return duration;
80 case 'volume':
81 return volume;
82 case 'paused':
83 return paused;
84 case 'ended':
85 return ended;
86 case 'muted':
87 return muted;
88 case 'buffered':
89 return {
90 start: function start() {
91 return 0;
92 },
93 end: function end() {
94 return bufferedTime * duration;
95 },
96 length: 1
97 };
98 case 'src':
99 return scIframe ? scIframe.src : '';
100 case 'readyState':
101 return readyState;
102 }
103 return value;
104 } else {
105 return null;
106 }
107 };
108
109 sc['set' + capName] = function (value) {
110 if (scPlayer !== null) {
111 switch (propName) {
112 case 'src':
113 var url = typeof value === 'string' ? value : value[0].src;
114 scPlayer.load(url);
115 if (autoplay) {
116 scPlayer.play();
117 }
118 break;
119 case 'currentTime':
120 scPlayer.seekTo(value * 1000);
121 break;
122 case 'muted':
123 if (value) {
124 scPlayer.setVolume(0);
125 } else {
126 scPlayer.setVolume(1);
127 }
128 setTimeout(function () {
129 var event = mejs.Utils.createEvent('volumechange', sc);
130 mediaElement.dispatchEvent(event);
131 }, 50);
132 break;
133 case 'volume':
134 scPlayer.setVolume(value);
135 setTimeout(function () {
136 var event = mejs.Utils.createEvent('volumechange', sc);
137 mediaElement.dispatchEvent(event);
138 }, 50);
139 break;
140 case 'readyState':
141 var event = mejs.Utils.createEvent('canplay', sc);
142 mediaElement.dispatchEvent(event);
143 break;
144
145 default:
146
147 break;
148 }
149 } else {
150 apiStack.push({ type: 'set', propName: propName, value: value });
151 }
152 };
153 };
154
155 for (var i = 0, total = props.length; i < total; i++) {
156 assignGettersSetters(props[i]);
157 }
158
159 var methods = mejs.html5media.methods,
160 assignMethods = function assignMethods(methodName) {
161 sc[methodName] = function () {
162 if (scPlayer !== null) {
163 switch (methodName) {
164 case 'play':
165 return scPlayer.play();
166 case 'pause':
167 return scPlayer.pause();
168 case 'load':
169 return null;
170 }
171 } else {
172 apiStack.push({ type: 'call', methodName: methodName });
173 }
174 };
175 };
176
177 for (var _i = 0, _total = methods.length; _i < _total; _i++) {
178 assignMethods(methods[_i]);
179 }
180
181 window['__ready__' + sc.id] = function (_scPlayer) {
182
183 mediaElement.scPlayer = scPlayer = _scPlayer;
184
185 if (autoplay) {
186 scPlayer.play();
187 }
188
189 if (apiStack.length) {
190 for (var _i2 = 0, _total2 = apiStack.length; _i2 < _total2; _i2++) {
191
192 var stackItem = apiStack[_i2];
193
194 if (stackItem.type === 'set') {
195 var propName = stackItem.propName,
196 capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
197
198 sc['set' + capName](stackItem.value);
199 } else if (stackItem.type === 'call') {
200 sc[stackItem.methodName]();
201 }
202 }
203 }
204
205 scPlayer.bind(SC.Widget.Events.PLAY_PROGRESS, function () {
206 paused = false;
207 ended = false;
208 scPlayer.getPosition(function (_currentTime) {
209 currentTime = _currentTime / 1000;
210 var event = mejs.Utils.createEvent('timeupdate', sc);
211 mediaElement.dispatchEvent(event);
212 });
213 });
214 scPlayer.bind(SC.Widget.Events.PAUSE, function () {
215 paused = true;
216 var event = mejs.Utils.createEvent('pause', sc);
217 mediaElement.dispatchEvent(event);
218 });
219 scPlayer.bind(SC.Widget.Events.PLAY, function () {
220 paused = false;
221 ended = false;
222 var event = mejs.Utils.createEvent('play', sc);
223 mediaElement.dispatchEvent(event);
224 });
225 scPlayer.bind(SC.Widget.Events.FINISHED, function () {
226 paused = false;
227 ended = true;
228 var event = mejs.Utils.createEvent('ended', sc);
229 mediaElement.dispatchEvent(event);
230 });
231 scPlayer.bind(SC.Widget.Events.READY, function () {
232 scPlayer.getDuration(function (_duration) {
233 duration = _duration / 1000;
234 var event = mejs.Utils.createEvent('loadedmetadata', sc);
235 mediaElement.dispatchEvent(event);
236 });
237 });
238 scPlayer.bind(SC.Widget.Events.LOAD_PROGRESS, function () {
239 scPlayer.getDuration(function (loadProgress) {
240 if (duration > 0) {
241 bufferedTime = duration * loadProgress;
242 var event = mejs.Utils.createEvent('progress', sc);
243 mediaElement.dispatchEvent(event);
244 }
245 });
246 scPlayer.getDuration(function (_duration) {
247 duration = _duration;
248
249 var event = mejs.Utils.createEvent('loadedmetadata', sc);
250 mediaElement.dispatchEvent(event);
251 });
252 });
253
254 var initEvents = ['rendererready', 'loadeddata', 'loadedmetadata', 'canplay'];
255 for (var _i3 = 0, _total3 = initEvents.length; _i3 < _total3; _i3++) {
256 var event = mejs.Utils.createEvent(initEvents[_i3], sc);
257 mediaElement.dispatchEvent(event);
258 }
259 };
260
261 scIframe = document.createElement('iframe');
262 scIframe.id = sc.id;
263 scIframe.width = isVideo ? '100%' : 1;
264 scIframe.height = isVideo ? '100%' : 1;
265 scIframe.frameBorder = 0;
266 scIframe.style.visibility = isVideo ? 'visible' : 'hidden';
267 scIframe.src = mediaFiles[0].src;
268 scIframe.scrolling = 'no';
269
270 mediaElement.appendChild(scIframe);
271 mediaElement.originalNode.style.display = 'none';
272
273 var scSettings = {
274 iframe: scIframe,
275 id: sc.id
276 };
277
278 SoundCloudApi.load(scSettings);
279
280 sc.setSize = function () {};
281 sc.hide = function () {
282 sc.pause();
283 if (scIframe) {
284 scIframe.style.display = 'none';
285 }
286 };
287 sc.show = function () {
288 if (scIframe) {
289 scIframe.style.display = '';
290 }
291 };
292 sc.destroy = function () {
293 scPlayer.destroy();
294 };
295
296 return sc;
297 }
298 };
299
300 mejs.Utils.typeChecks.push(function (url) {
301 return (/\/\/(w\.)?soundcloud.com/i.test(url) ? 'video/x-soundcloud' : null
302 );
303 });
304
305 mejs.Renderers.add(SoundCloudIframeRenderer);
306
307 },{}]},{},[1]);