Migration of htmlAudioPlayer to ES6 module

This commit is contained in:
Cameron 2020-08-03 20:57:54 +01:00
parent 0ef8f3d038
commit 36f389e8f9
2 changed files with 173 additions and 170 deletions

View file

@ -155,6 +155,7 @@
"src/components/refreshdialog/refreshdialog.js", "src/components/refreshdialog/refreshdialog.js",
"src/components/sanatizefilename.js", "src/components/sanatizefilename.js",
"src/components/scrollManager.js", "src/components/scrollManager.js",
"src/plugins/htmlAudioPlayer/plugin.js",
"src/plugins/htmlVideoPlayer/plugin.js", "src/plugins/htmlVideoPlayer/plugin.js",
"src/components/search/searchfields.js", "src/components/search/searchfields.js",
"src/components/search/searchresults.js", "src/components/search/searchresults.js",

View file

@ -1,91 +1,94 @@
define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelper'], function (events, browser, require, appHost, appSettings, htmlMediaHelper) { import events from 'events';
'use strict'; import browser from 'browser';
import appHost from 'apphost';
import * as htmlMediaHelper from 'htmlMediaHelper';
function getDefaultProfile() { function getDefaultProfile() {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['browserdeviceprofile'], function (profileBuilder) { import('browserdeviceprofile').then(({default: profileBuilder}) => {
resolve(profileBuilder({})); resolve(profileBuilder({}));
});
}); });
});
}
let fadeTimeout;
function fade(instance, elem, startingVolume) {
instance._isFadingOut = true;
// Need to record the starting volume on each pass rather than querying elem.volume
// This is due to iOS safari not allowing volume changes and always returning the system volume value
const newVolume = Math.max(0, startingVolume - 0.15);
console.debug('fading volume to ' + newVolume);
elem.volume = newVolume;
if (newVolume <= 0) {
instance._isFadingOut = false;
return Promise.resolve();
} }
var fadeTimeout; return new Promise(function (resolve, reject) {
function fade(instance, elem, startingVolume) { cancelFadeTimeout();
instance._isFadingOut = true; fadeTimeout = setTimeout(function () {
fade(instance, elem, newVolume).then(resolve, reject);
}, 100);
});
}
// Need to record the starting volume on each pass rather than querying elem.volume function cancelFadeTimeout() {
// This is due to iOS safari not allowing volume changes and always returning the system volume value const timeout = fadeTimeout;
var newVolume = Math.max(0, startingVolume - 0.15); if (timeout) {
console.debug('fading volume to ' + newVolume); clearTimeout(timeout);
elem.volume = newVolume; fadeTimeout = null;
}
}
if (newVolume <= 0) { function supportsFade() {
instance._isFadingOut = false; if (browser.tv) {
return Promise.resolve(); // Not working on tizen.
} // We could possibly enable on other tv's, but all smart tv browsers tend to be pretty primitive
return false;
}
return new Promise(function (resolve, reject) { return true;
cancelFadeTimeout(); }
fadeTimeout = setTimeout(function () {
fade(instance, elem, newVolume).then(resolve, reject); function requireHlsPlayer(callback) {
}, 100); import('hlsjs').then(({default: hls}) => {
window.Hls = hls;
callback();
});
}
function enableHlsPlayer(url, item, mediaSource, mediaType) {
if (!htmlMediaHelper.enableHlsJsPlayer(mediaSource.RunTimeTicks, mediaType)) {
return Promise.reject();
}
if (url.indexOf('.m3u8') !== -1) {
return Promise.resolve();
}
// issue head request to get content type
return new Promise(function (resolve, reject) {
import('fetchHelper').then(({default: fetchHelper}) => {
fetchHelper.ajax({
url: url,
type: 'HEAD'
}).then(function (response) {
const contentType = (response.headers.get('Content-Type') || '').toLowerCase();
if (contentType === 'application/x-mpegurl') {
resolve();
} else {
reject();
}
}, reject);
}); });
} });
}
function cancelFadeTimeout() { class HtmlAudioPlayer {
var timeout = fadeTimeout; constructor() {
if (timeout) { const self = this;
clearTimeout(timeout);
fadeTimeout = null;
}
}
function supportsFade() {
if (browser.tv) {
// Not working on tizen.
// We could possibly enable on other tv's, but all smart tv browsers tend to be pretty primitive
return false;
}
return true;
}
function requireHlsPlayer(callback) {
require(['hlsjs'], function (hls) {
window.Hls = hls;
callback();
});
}
function enableHlsPlayer(url, item, mediaSource, mediaType) {
if (!htmlMediaHelper.enableHlsJsPlayer(mediaSource.RunTimeTicks, mediaType)) {
return Promise.reject();
}
if (url.indexOf('.m3u8') !== -1) {
return Promise.resolve();
}
// issue head request to get content type
return new Promise(function (resolve, reject) {
require(['fetchHelper'], function (fetchHelper) {
fetchHelper.ajax({
url: url,
type: 'HEAD'
}).then(function (response) {
var contentType = (response.headers.get('Content-Type') || '').toLowerCase();
if (contentType === 'application/x-mpegurl') {
resolve();
} else {
reject();
}
}, reject);
});
});
}
function HtmlAudioPlayer() {
var self = this;
self.name = 'Html Audio Player'; self.name = 'Html Audio Player';
self.type = 'mediaplayer'; self.type = 'mediaplayer';
@ -99,7 +102,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
self._timeUpdated = false; self._timeUpdated = false;
self._currentTime = null; self._currentTime = null;
var elem = createMediaElement(); const elem = createMediaElement();
return setCurrentSrc(elem, options); return setCurrentSrc(elem, options);
}; };
@ -109,11 +112,11 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
unBindEvents(elem); unBindEvents(elem);
bindEvents(elem); bindEvents(elem);
var val = options.url; let val = options.url;
console.debug('playing url: ' + val); console.debug('playing url: ' + val);
// Convert to seconds // Convert to seconds
var seconds = (options.playerStartPositionTicks || 0) / 10000000; const seconds = (options.playerStartPositionTicks || 0) / 10000000;
if (seconds) { if (seconds) {
val += '#t=' + seconds; val += '#t=' + seconds;
} }
@ -122,7 +125,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
self._currentPlayOptions = options; self._currentPlayOptions = options;
var crossOrigin = htmlMediaHelper.getCrossOriginValue(options.mediaSource); const crossOrigin = htmlMediaHelper.getCrossOriginValue(options.mediaSource);
if (crossOrigin) { if (crossOrigin) {
elem.crossOrigin = crossOrigin; elem.crossOrigin = crossOrigin;
} }
@ -130,9 +133,9 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
return enableHlsPlayer(val, options.item, options.mediaSource, 'Audio').then(function () { return enableHlsPlayer(val, options.item, options.mediaSource, 'Audio').then(function () {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
requireHlsPlayer(function () { requireHlsPlayer(function () {
var hls = new Hls({ const hls = new Hls({
manifestLoadingTimeOut: 20000, manifestLoadingTimeOut: 20000,
xhrSetup: function(xhr, url) { xhrSetup: function (xhr, url) {
xhr.withCredentials = true; xhr.withCredentials = true;
} }
}); });
@ -183,8 +186,8 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
self.stop = function (destroyPlayer) { self.stop = function (destroyPlayer) {
cancelFadeTimeout(); cancelFadeTimeout();
var elem = self._mediaElement; const elem = self._mediaElement;
var src = self._currentSrc; const src = self._currentSrc;
if (elem && src) { if (elem && src) {
if (!destroyPlayer || !supportsFade()) { if (!destroyPlayer || !supportsFade()) {
@ -198,7 +201,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
return Promise.resolve(); return Promise.resolve();
} }
var originalVolume = elem.volume; const originalVolume = elem.volume;
return fade(self, elem, elem.volume).then(function () { return fade(self, elem, elem.volume).then(function () {
elem.pause(); elem.pause();
@ -219,7 +222,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
}; };
function createMediaElement() { function createMediaElement() {
var elem = self._mediaElement; let elem = self._mediaElement;
if (elem) { if (elem) {
return elem; return elem;
@ -248,7 +251,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
function onTimeUpdate() { function onTimeUpdate() {
// Get the player position + the transcoding offset // Get the player position + the transcoding offset
var time = this.currentTime; const time = this.currentTime;
// Don't trigger events after user stop // Don't trigger events after user stop
if (!self._isFadingOut) { if (!self._isFadingOut) {
@ -287,11 +290,11 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
} }
function onError() { function onError() {
var errorCode = this.error ? (this.error.code || 0) : 0; const errorCode = this.error ? (this.error.code || 0) : 0;
var errorMessage = this.error ? (this.error.message || '') : ''; const errorMessage = this.error ? (this.error.message || '') : '';
console.error('media element error: ' + errorCode.toString() + ' ' + errorMessage); console.error('media element error: ' + errorCode.toString() + ' ' + errorMessage);
var type; let type;
switch (errorCode) { switch (errorCode) {
case 1: case 1:
@ -325,59 +328,59 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
} }
} }
HtmlAudioPlayer.prototype.currentSrc = function () { currentSrc() {
return this._currentSrc; return this._currentSrc;
}; }
HtmlAudioPlayer.prototype.canPlayMediaType = function (mediaType) { canPlayMediaType(mediaType) {
return (mediaType || '').toLowerCase() === 'audio'; return (mediaType || '').toLowerCase() === 'audio';
}; }
HtmlAudioPlayer.prototype.getDeviceProfile = function (item) { getDeviceProfile(item) {
if (appHost.getDeviceProfile) { if (appHost.getDeviceProfile) {
return appHost.getDeviceProfile(item); return appHost.getDeviceProfile(item);
} }
return getDefaultProfile(); return getDefaultProfile();
}; }
// Save this for when playback stops, because querying the time at that point might return 0 // Save this for when playback stops, because querying the time at that point might return 0
HtmlAudioPlayer.prototype.currentTime = function (val) { currentTime(val) {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
if (val != null) { if (val != null) {
mediaElement.currentTime = val / 1000; mediaElement.currentTime = val / 1000;
return; return;
} }
var currentTime = this._currentTime; const currentTime = this._currentTime;
if (currentTime) { if (currentTime) {
return currentTime * 1000; return currentTime * 1000;
} }
return (mediaElement.currentTime || 0) * 1000; return (mediaElement.currentTime || 0) * 1000;
} }
}; }
HtmlAudioPlayer.prototype.duration = function (val) { duration(val) {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
var duration = mediaElement.duration; const duration = mediaElement.duration;
if (htmlMediaHelper.isValidDuration(duration)) { if (htmlMediaHelper.isValidDuration(duration)) {
return duration * 1000; return duration * 1000;
} }
} }
return null; return null;
}; }
HtmlAudioPlayer.prototype.seekable = function () { seekable() {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
var seekable = mediaElement.seekable; const seekable = mediaElement.seekable;
if (seekable && seekable.length) { if (seekable && seekable.length) {
var start = seekable.start(0); let start = seekable.start(0);
var end = seekable.end(0); let end = seekable.end(0);
if (!htmlMediaHelper.isValidDuration(start)) { if (!htmlMediaHelper.isValidDuration(start)) {
start = 0; start = 0;
@ -391,124 +394,123 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
return false; return false;
} }
}; }
HtmlAudioPlayer.prototype.getBufferedRanges = function () { getBufferedRanges() {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
return htmlMediaHelper.getBufferedRanges(this, mediaElement); return htmlMediaHelper.getBufferedRanges(this, mediaElement);
} }
return []; return [];
}; }
HtmlAudioPlayer.prototype.pause = function () { pause() {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
mediaElement.pause(); mediaElement.pause();
} }
}; }
// This is a retry after error // This is a retry after error
HtmlAudioPlayer.prototype.resume = function () { resume() {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
mediaElement.play(); mediaElement.play();
} }
}; }
HtmlAudioPlayer.prototype.unpause = function () { unpause() {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
mediaElement.play(); mediaElement.play();
} }
}; }
HtmlAudioPlayer.prototype.paused = function () { paused() {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
return mediaElement.paused; return mediaElement.paused;
} }
return false; return false;
}; }
HtmlAudioPlayer.prototype.setPlaybackRate = function (value) { setPlaybackRate(value) {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
mediaElement.playbackRate = value; mediaElement.playbackRate = value;
} }
}; }
HtmlAudioPlayer.prototype.getPlaybackRate = function () { getPlaybackRate() {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
return mediaElement.playbackRate; return mediaElement.playbackRate;
} }
return null; return null;
}; }
HtmlAudioPlayer.prototype.setVolume = function (val) { setVolume(val) {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
mediaElement.volume = val / 100; mediaElement.volume = val / 100;
} }
}; }
HtmlAudioPlayer.prototype.getVolume = function () { getVolume() {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
return Math.min(Math.round(mediaElement.volume * 100), 100); return Math.min(Math.round(mediaElement.volume * 100), 100);
} }
}; }
HtmlAudioPlayer.prototype.volumeUp = function () { volumeUp() {
this.setVolume(Math.min(this.getVolume() + 2, 100)); this.setVolume(Math.min(this.getVolume() + 2, 100));
}; }
HtmlAudioPlayer.prototype.volumeDown = function () { volumeDown() {
this.setVolume(Math.max(this.getVolume() - 2, 0)); this.setVolume(Math.max(this.getVolume() - 2, 0));
}; }
HtmlAudioPlayer.prototype.setMute = function (mute) { setMute(mute) {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
mediaElement.muted = mute; mediaElement.muted = mute;
} }
}; }
HtmlAudioPlayer.prototype.isMuted = function () { isMuted() {
var mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
if (mediaElement) { if (mediaElement) {
return mediaElement.muted; return mediaElement.muted;
} }
return false; return false;
};
HtmlAudioPlayer.prototype.destroy = function () {
};
var supportedFeatures;
function getSupportedFeatures() {
var list = [];
var audio = document.createElement('audio');
if (typeof audio.playbackRate === 'number') {
list.push('PlaybackRate');
}
return list;
} }
HtmlAudioPlayer.prototype.supports = function (feature) { destroy() {
}
supports(feature) {
if (!supportedFeatures) { if (!supportedFeatures) {
supportedFeatures = getSupportedFeatures(); supportedFeatures = getSupportedFeatures();
} }
return supportedFeatures.indexOf(feature) !== -1; return supportedFeatures.indexOf(feature) !== -1;
}; }
}
return HtmlAudioPlayer; let supportedFeatures;
});
function getSupportedFeatures() {
const list = [];
const audio = document.createElement('audio');
if (typeof audio.playbackRate === 'number') {
list.push('PlaybackRate');
}
return list;
}
export default HtmlAudioPlayer;