mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
First separation commit.
Added LICENSE, README.md, CONTRIBUTORS.md
This commit is contained in:
parent
09513af31b
commit
4678528d00
657 changed files with 422 additions and 0 deletions
218
src/bower_components/emby-webcomponents/htmlaudioplayer/plugin.js
vendored
Normal file
218
src/bower_components/emby-webcomponents/htmlaudioplayer/plugin.js
vendored
Normal file
|
@ -0,0 +1,218 @@
|
|||
define(["events", "browser", "require", "apphost", "appSettings", "htmlMediaHelper"], function(events, browser, require, appHost, appSettings, htmlMediaHelper) {
|
||||
"use strict";
|
||||
|
||||
function getDefaultProfile() {
|
||||
return new Promise(function(resolve, reject) {
|
||||
require(["browserdeviceprofile"], function(profileBuilder) {
|
||||
resolve(profileBuilder({}))
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function fade(instance, elem, startingVolume) {
|
||||
instance._isFadingOut = !0;
|
||||
var newVolume = Math.max(0, startingVolume - .15);
|
||||
return console.log("fading volume to " + newVolume), elem.volume = newVolume, newVolume <= 0 ? (instance._isFadingOut = !1, Promise.resolve()) : new Promise(function(resolve, reject) {
|
||||
cancelFadeTimeout(), fadeTimeout = setTimeout(function() {
|
||||
fade(instance, elem, newVolume).then(resolve, reject)
|
||||
}, 100)
|
||||
})
|
||||
}
|
||||
|
||||
function cancelFadeTimeout() {
|
||||
var timeout = fadeTimeout;
|
||||
timeout && (clearTimeout(timeout), fadeTimeout = null)
|
||||
}
|
||||
|
||||
function supportsFade() {
|
||||
return !browser.tv
|
||||
}
|
||||
|
||||
function requireHlsPlayer(callback) {
|
||||
require(["hlsjs"], function(hls) {
|
||||
window.Hls = hls, callback()
|
||||
})
|
||||
}
|
||||
|
||||
function enableHlsPlayer(url, item, mediaSource, mediaType) {
|
||||
return htmlMediaHelper.enableHlsJsPlayer(mediaSource.RunTimeTicks, mediaType) ? -1 !== url.indexOf(".m3u8") ? Promise.resolve() : new Promise(function(resolve, reject) {
|
||||
require(["fetchHelper"], function(fetchHelper) {
|
||||
fetchHelper.ajax({
|
||||
url: url,
|
||||
type: "HEAD"
|
||||
}).then(function(response) {
|
||||
"application/x-mpegurl" === (response.headers.get("Content-Type") || "").toLowerCase() ? resolve() : reject()
|
||||
}, reject)
|
||||
})
|
||||
}) : Promise.reject()
|
||||
}
|
||||
|
||||
function HtmlAudioPlayer() {
|
||||
function setCurrentSrc(elem, options) {
|
||||
elem.removeEventListener("error", onError), unBindEvents(elem), bindEvents(elem);
|
||||
var val = options.url;
|
||||
console.log("playing url: " + val);
|
||||
var seconds = (options.playerStartPositionTicks || 0) / 1e7;
|
||||
seconds && (val += "#t=" + seconds), htmlMediaHelper.destroyHlsPlayer(self), self._currentPlayOptions = options;
|
||||
var crossOrigin = htmlMediaHelper.getCrossOriginValue(options.mediaSource);
|
||||
return crossOrigin && (elem.crossOrigin = crossOrigin), enableHlsPlayer(val, options.item, options.mediaSource, "Audio").then(function() {
|
||||
return new Promise(function(resolve, reject) {
|
||||
requireHlsPlayer(function() {
|
||||
var hls = new Hls({
|
||||
manifestLoadingTimeOut: 2e4
|
||||
});
|
||||
hls.loadSource(val), hls.attachMedia(elem), htmlMediaHelper.bindEventsToHlsPlayer(self, hls, elem, onError, resolve, reject), self._hlsPlayer = hls, self._currentSrc = val
|
||||
})
|
||||
})
|
||||
}, function() {
|
||||
return elem.autoplay = !0, htmlMediaHelper.applySrc(elem, val, options).then(function() {
|
||||
return self._currentSrc = val, htmlMediaHelper.playWithPromise(elem, onError)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function bindEvents(elem) {
|
||||
elem.addEventListener("timeupdate", onTimeUpdate), elem.addEventListener("ended", onEnded), elem.addEventListener("volumechange", onVolumeChange), elem.addEventListener("pause", onPause), elem.addEventListener("playing", onPlaying), elem.addEventListener("play", onPlay)
|
||||
}
|
||||
|
||||
function unBindEvents(elem) {
|
||||
elem.removeEventListener("timeupdate", onTimeUpdate), elem.removeEventListener("ended", onEnded), elem.removeEventListener("volumechange", onVolumeChange), elem.removeEventListener("pause", onPause), elem.removeEventListener("playing", onPlaying), elem.removeEventListener("play", onPlay)
|
||||
}
|
||||
|
||||
function createMediaElement() {
|
||||
var elem = self._mediaElement;
|
||||
return elem || (elem = document.querySelector(".mediaPlayerAudio"), elem || (elem = document.createElement("audio"), elem.classList.add("mediaPlayerAudio"), elem.classList.add("hide"), document.body.appendChild(elem)), elem.volume = htmlMediaHelper.getSavedVolume(), self._mediaElement = elem, elem)
|
||||
}
|
||||
|
||||
function onEnded() {
|
||||
htmlMediaHelper.onEndedInternal(self, this, onError)
|
||||
}
|
||||
|
||||
function onTimeUpdate() {
|
||||
var time = this.currentTime;
|
||||
self._isFadingOut || (self._currentTime = time, events.trigger(self, "timeupdate"))
|
||||
}
|
||||
|
||||
function onVolumeChange() {
|
||||
self._isFadingOut || (htmlMediaHelper.saveVolume(this.volume), events.trigger(self, "volumechange"))
|
||||
}
|
||||
|
||||
function onPlaying(e) {
|
||||
self._started || (self._started = !0, this.removeAttribute("controls"), htmlMediaHelper.seekOnPlaybackStart(self, e.target, self._currentPlayOptions.playerStartPositionTicks)), events.trigger(self, "playing")
|
||||
}
|
||||
|
||||
function onPlay(e) {
|
||||
events.trigger(self, "unpause")
|
||||
}
|
||||
|
||||
function onPause() {
|
||||
events.trigger(self, "pause")
|
||||
}
|
||||
|
||||
function onError() {
|
||||
var errorCode = this.error ? this.error.code || 0 : 0,
|
||||
errorMessage = this.error ? this.error.message || "" : "";
|
||||
console.log("Media element error: " + errorCode.toString() + " " + errorMessage);
|
||||
var type;
|
||||
switch (errorCode) {
|
||||
case 1:
|
||||
return;
|
||||
case 2:
|
||||
type = "network";
|
||||
break;
|
||||
case 3:
|
||||
if (self._hlsPlayer) return void htmlMediaHelper.handleHlsJsMediaError(self);
|
||||
type = "mediadecodeerror";
|
||||
break;
|
||||
case 4:
|
||||
type = "medianotsupported";
|
||||
break;
|
||||
default:
|
||||
return
|
||||
}
|
||||
htmlMediaHelper.onErrorInternal(self, type)
|
||||
}
|
||||
var self = this;
|
||||
self.name = "Html Audio Player", self.type = "mediaplayer", self.id = "htmlaudioplayer", self.priority = 1, self.play = function(options) {
|
||||
return self._started = !1, self._timeUpdated = !1, self._currentTime = null, setCurrentSrc(createMediaElement(), options)
|
||||
}, self.stop = function(destroyPlayer) {
|
||||
cancelFadeTimeout();
|
||||
var elem = self._mediaElement,
|
||||
src = self._currentSrc;
|
||||
if (elem && src) {
|
||||
if (!destroyPlayer || !supportsFade()) return elem.pause(), htmlMediaHelper.onEndedInternal(self, elem, onError), destroyPlayer && self.destroy(), Promise.resolve();
|
||||
var originalVolume = elem.volume;
|
||||
return fade(self, elem, elem.volume).then(function() {
|
||||
elem.pause(), elem.volume = originalVolume, htmlMediaHelper.onEndedInternal(self, elem, onError), destroyPlayer && self.destroy()
|
||||
})
|
||||
}
|
||||
return Promise.resolve()
|
||||
}, self.destroy = function() {
|
||||
unBindEvents(self._mediaElement)
|
||||
}
|
||||
}
|
||||
var fadeTimeout;
|
||||
return HtmlAudioPlayer.prototype.currentSrc = function() {
|
||||
return this._currentSrc
|
||||
}, HtmlAudioPlayer.prototype.canPlayMediaType = function(mediaType) {
|
||||
return "audio" === (mediaType || "").toLowerCase()
|
||||
}, HtmlAudioPlayer.prototype.getDeviceProfile = function(item) {
|
||||
return appHost.getDeviceProfile ? appHost.getDeviceProfile(item) : getDefaultProfile()
|
||||
}, HtmlAudioPlayer.prototype.currentTime = function(val) {
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
if (null != val) return void(mediaElement.currentTime = val / 1e3);
|
||||
var currentTime = this._currentTime;
|
||||
return currentTime ? 1e3 * currentTime : 1e3 * (mediaElement.currentTime || 0)
|
||||
}
|
||||
}, HtmlAudioPlayer.prototype.duration = function(val) {
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
var duration = mediaElement.duration;
|
||||
if (htmlMediaHelper.isValidDuration(duration)) return 1e3 * duration
|
||||
}
|
||||
return null
|
||||
}, HtmlAudioPlayer.prototype.seekable = function() {
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
var seekable = mediaElement.seekable;
|
||||
if (seekable && seekable.length) {
|
||||
var start = seekable.start(0),
|
||||
end = seekable.end(0);
|
||||
return htmlMediaHelper.isValidDuration(start) || (start = 0), htmlMediaHelper.isValidDuration(end) || (end = 0), end - start > 0
|
||||
}
|
||||
return !1
|
||||
}
|
||||
}, HtmlAudioPlayer.prototype.getBufferedRanges = function() {
|
||||
var mediaElement = this._mediaElement;
|
||||
return mediaElement ? htmlMediaHelper.getBufferedRanges(this, mediaElement) : []
|
||||
}, HtmlAudioPlayer.prototype.pause = function() {
|
||||
var mediaElement = this._mediaElement;
|
||||
mediaElement && mediaElement.pause()
|
||||
}, HtmlAudioPlayer.prototype.resume = function() {
|
||||
var mediaElement = this._mediaElement;
|
||||
mediaElement && mediaElement.play()
|
||||
}, HtmlAudioPlayer.prototype.unpause = function() {
|
||||
var mediaElement = this._mediaElement;
|
||||
mediaElement && mediaElement.play()
|
||||
}, HtmlAudioPlayer.prototype.paused = function() {
|
||||
var mediaElement = this._mediaElement;
|
||||
return !!mediaElement && mediaElement.paused
|
||||
}, HtmlAudioPlayer.prototype.setVolume = function(val) {
|
||||
var mediaElement = this._mediaElement;
|
||||
mediaElement && (mediaElement.volume = val / 100)
|
||||
}, HtmlAudioPlayer.prototype.getVolume = function() {
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) return Math.min(Math.round(100 * mediaElement.volume), 100)
|
||||
}, HtmlAudioPlayer.prototype.volumeUp = function() {
|
||||
this.setVolume(Math.min(this.getVolume() + 2, 100))
|
||||
}, HtmlAudioPlayer.prototype.volumeDown = function() {
|
||||
this.setVolume(Math.max(this.getVolume() - 2, 0))
|
||||
}, HtmlAudioPlayer.prototype.setMute = function(mute) {
|
||||
var mediaElement = this._mediaElement;
|
||||
mediaElement && (mediaElement.muted = mute)
|
||||
}, HtmlAudioPlayer.prototype.isMuted = function() {
|
||||
var mediaElement = this._mediaElement;
|
||||
return !!mediaElement && mediaElement.muted
|
||||
}, HtmlAudioPlayer.prototype.destroy = function() {}, HtmlAudioPlayer
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue