jellyfish-web/src/bower_components/emby-webcomponents/browserdeviceprofile.js

384 lines
20 KiB
JavaScript
Raw Normal View History

2018-10-23 01:05:09 +03:00
define(["browser"], function(browser) {
"use strict";
function canPlayH264(videoTestElement) {
return !(!videoTestElement.canPlayType || !videoTestElement.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, ""))
}
function canPlayH265(videoTestElement, options) {
if (browser.tizen || browser.orsay || browser.xboxOne || browser.web0s || options.supportsHevc) return !0;
var userAgent = navigator.userAgent.toLowerCase();
if (browser.chromecast) {
if (-1 !== userAgent.indexOf("aarch64")) return !0
}
return !!(browser.iOS && (browser.iOSVersion || 0) >= 11) || !(!videoTestElement.canPlayType || !videoTestElement.canPlayType('video/hevc; codecs="hevc, aac"').replace(/no/, ""))
}
function supportsTextTracks() {
return !(!browser.tizen && !browser.orsay) || (null == _supportsTextTracks && (_supportsTextTracks = null != document.createElement("video").textTracks), _supportsTextTracks)
}
function canPlayHls(src) {
return null == _canPlayHls && (_canPlayHls = canPlayNativeHls() || canPlayHlsWithMSE()), _canPlayHls
}
function canPlayNativeHls() {
if (browser.tizen || browser.orsay) return !0;
var media = document.createElement("video");
return !(!media.canPlayType("application/x-mpegURL").replace(/no/, "") && !media.canPlayType("application/vnd.apple.mpegURL").replace(/no/, ""))
}
function canPlayHlsWithMSE() {
return null != window.MediaSource
}
function canPlayAudioFormat(format) {
var typeString;
if ("flac" === format) {
if (browser.tizen || browser.orsay || browser.web0s) return !0;
if (browser.edgeUwp) return !0
} else if ("wma" === format) {
if (browser.tizen || browser.orsay) return !0;
if (browser.edgeUwp) return !0
} else {
if ("opus" === format) return typeString = 'audio/ogg; codecs="opus"', !!document.createElement("audio").canPlayType(typeString).replace(/no/, "");
if ("mp2" === format) return !1
}
if ("webma" === format) typeString = "audio/webm";
else if ("mp2" === format) typeString = "audio/mpeg";
else if ("ogg" === format || "oga" === format) {
if (browser.chrome) return !1;
typeString = "audio/" + format
} else typeString = "audio/" + format;
return !!document.createElement("audio").canPlayType(typeString).replace(/no/, "")
}
function testCanPlayMkv(videoTestElement) {
if (browser.tizen || browser.orsay || browser.web0s) return !0;
if (videoTestElement.canPlayType("video/x-matroska").replace(/no/, "") || videoTestElement.canPlayType("video/mkv").replace(/no/, "")) return !0;
var userAgent = navigator.userAgent.toLowerCase();
return browser.chrome ? !browser.operaTv && (-1 === userAgent.indexOf("vivaldi") && -1 === userAgent.indexOf("opera")) : !!browser.edgeUwp
}
function testCanPlayTs() {
return browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp
}
function supportsMpeg2Video() {
return browser.orsay || browser.tizen || browser.edgeUwp || browser.web0s
}
function supportsVc1() {
return browser.orsay || browser.tizen || browser.edgeUwp || browser.web0s
}
function getDirectPlayProfileForVideoContainer(container, videoAudioCodecs, videoTestElement, options) {
var supported = !1,
profileContainer = container,
videoCodecs = [];
switch (container) {
case "asf":
supported = browser.tizen || browser.orsay || browser.edgeUwp, videoAudioCodecs = [];
break;
case "avi":
supported = browser.tizen || browser.orsay || browser.edgeUwp;
break;
case "mpg":
case "mpeg":
supported = browser.edgeUwp || browser.tizen || browser.orsay;
break;
case "flv":
supported = browser.tizen || browser.orsay;
break;
case "3gp":
case "mts":
case "trp":
case "vob":
case "vro":
supported = browser.tizen || browser.orsay;
break;
case "mov":
supported = browser.tizen || browser.orsay || browser.chrome || browser.edgeUwp, videoCodecs.push("h264");
break;
case "m2ts":
supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp, videoCodecs.push("h264"), supportsVc1() && videoCodecs.push("vc1"), supportsMpeg2Video() && videoCodecs.push("mpeg2video");
break;
case "wmv":
supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp, videoAudioCodecs = [];
break;
case "ts":
supported = testCanPlayTs(), videoCodecs.push("h264"), canPlayH265(videoTestElement, options) && (videoCodecs.push("h265"), videoCodecs.push("hevc")), supportsVc1() && videoCodecs.push("vc1"), supportsMpeg2Video() && videoCodecs.push("mpeg2video"), profileContainer = "ts,mpegts"
}
return supported ? {
Container: profileContainer,
Type: "Video",
VideoCodec: videoCodecs.join(","),
AudioCodec: videoAudioCodecs.join(",")
} : null
}
function getGlobalMaxVideoBitrate() {
var userAgent = navigator.userAgent.toLowerCase();
if (browser.chromecast) {
return -1 !== userAgent.indexOf("aarch64") ? null : self.screen && self.screen.width >= 3800 ? null : 3e7
}
var isTizenFhd = !1;
if (browser.tizen) try {
isTizenFhd = !webapis.productinfo.isUdPanelSupported(), console.log("isTizenFhd = " + isTizenFhd)
} catch (error) {
console.log("isUdPanelSupported() error code = " + error.code)
}
return browser.ps4 ? 8e6 : browser.xboxOne ? 12e6 : browser.edgeUwp ? null : browser.tizen && isTizenFhd ? 2e7 : null
}
function supportsAc3(videoTestElement) {
return !!(browser.edgeUwp || browser.tizen || browser.orsay || browser.web0s) || videoTestElement.canPlayType('audio/mp4; codecs="ac-3"').replace(/no/, "") && !browser.osx && !browser.iOS
}
function supportsEac3(videoTestElement) {
return !!(browser.tizen || browser.orsay || browser.web0s) || videoTestElement.canPlayType('audio/mp4; codecs="ec-3"').replace(/no/, "")
}
var _supportsTextTracks, _canPlayHls;
return function(options) {
options = options || {};
var physicalAudioChannels = options.audioChannels || (browser.tv || browser.ps4 || browser.xboxOne ? 6 : 2),
videoTestElement = document.createElement("video"),
canPlayVp8 = videoTestElement.canPlayType('video/webm; codecs="vp8"').replace(/no/, ""),
canPlayVp9 = videoTestElement.canPlayType('video/webm; codecs="vp9"').replace(/no/, ""),
webmAudioCodecs = ["vorbis"],
canPlayMkv = testCanPlayMkv(videoTestElement),
profile = {};
profile.MaxStreamingBitrate = 12e7, profile.MaxStaticBitrate = 1e8, profile.MusicStreamingTranscodingBitrate = Math.min(12e7, 192e3), profile.DirectPlayProfiles = [];
var videoAudioCodecs = [],
hlsVideoAudioCodecs = [],
supportsMp3VideoAudio = videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.69"').replace(/no/, "") || videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.6B"').replace(/no/, ""),
supportsMp2VideoAudio = browser.edgeUwp || browser.tizen || browser.orsay || browser.web0s,
maxVideoWidth = browser.xboxOne && self.screen ? self.screen.width : null;
options.maxVideoWidth && (maxVideoWidth = options.maxVideoWidth);
var canPlayAacVideoAudio = videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.2"').replace(/no/, "");
if (canPlayAacVideoAudio && browser.chromecast && physicalAudioChannels <= 2 && videoAudioCodecs.push("aac"), supportsAc3(videoTestElement)) {
videoAudioCodecs.push("ac3");
var eAc3 = supportsEac3(videoTestElement);
eAc3 && videoAudioCodecs.push("eac3");
(!browser.edge || !browser.touch || browser.edgeUwp) && (hlsVideoAudioCodecs.push("ac3"), eAc3 && hlsVideoAudioCodecs.push("eac3"))
}
canPlayAacVideoAudio && browser.chromecast && -1 === videoAudioCodecs.indexOf("aac") && videoAudioCodecs.push("aac"), supportsMp3VideoAudio && (videoAudioCodecs.push("mp3"), browser.ps4 || physicalAudioChannels <= 2 && hlsVideoAudioCodecs.push("mp3")), canPlayAacVideoAudio && (-1 === videoAudioCodecs.indexOf("aac") && videoAudioCodecs.push("aac"), hlsVideoAudioCodecs.push("aac")), supportsMp3VideoAudio && (browser.ps4 || -1 === hlsVideoAudioCodecs.indexOf("mp3") && hlsVideoAudioCodecs.push("mp3")), supportsMp2VideoAudio && videoAudioCodecs.push("mp2");
var supportsDts = browser.tizen || browser.orsay || browser.web0s || options.supportsDts;
if (self.tizen && self.tizen.systeminfo) {
var v = tizen.systeminfo.getCapability("http://tizen.org/feature/platform.version");
v && parseFloat(v) >= parseFloat("4.0") && (supportsDts = !1)
}
supportsDts && (videoAudioCodecs.push("dca"), videoAudioCodecs.push("dts")), (browser.tizen || browser.orsay || browser.web0s) && (videoAudioCodecs.push("pcm_s16le"), videoAudioCodecs.push("pcm_s24le")), options.supportsTrueHd && videoAudioCodecs.push("truehd"), (browser.tizen || browser.orsay) && videoAudioCodecs.push("aac_latm"), canPlayAudioFormat("opus") && (videoAudioCodecs.push("opus"), hlsVideoAudioCodecs.push("opus"), webmAudioCodecs.push("opus")), canPlayAudioFormat("flac") && videoAudioCodecs.push("flac"), videoAudioCodecs = videoAudioCodecs.filter(function(c) {
return -1 === (options.disableVideoAudioCodecs || []).indexOf(c)
}), hlsVideoAudioCodecs = hlsVideoAudioCodecs.filter(function(c) {
return -1 === (options.disableHlsVideoAudioCodecs || []).indexOf(c)
});
var mp4VideoCodecs = [],
hlsVideoCodecs = [];
canPlayH264(videoTestElement) && (mp4VideoCodecs.push("h264"), hlsVideoCodecs.push("h264")), canPlayH265(videoTestElement, options) && (mp4VideoCodecs.push("h265"), mp4VideoCodecs.push("hevc"), (browser.tizen || browser.web0s) && (hlsVideoCodecs.push("h265"), hlsVideoCodecs.push("hevc"))), supportsMpeg2Video() && mp4VideoCodecs.push("mpeg2video"), supportsVc1() && mp4VideoCodecs.push("vc1"), (browser.tizen || browser.orsay) && mp4VideoCodecs.push("msmpeg4v2"), canPlayVp8 && mp4VideoCodecs.push("vp8"), canPlayVp9 && mp4VideoCodecs.push("vp9"), (canPlayVp8 || browser.tizen || browser.orsay) && videoAudioCodecs.push("vorbis"), mp4VideoCodecs.length && profile.DirectPlayProfiles.push({
Container: "mp4,m4v",
Type: "Video",
VideoCodec: mp4VideoCodecs.join(","),
AudioCodec: videoAudioCodecs.join(",")
}), canPlayMkv && mp4VideoCodecs.length && profile.DirectPlayProfiles.push({
Container: "mkv",
Type: "Video",
VideoCodec: mp4VideoCodecs.join(","),
AudioCodec: videoAudioCodecs.join(",")
}), ["m2ts", "wmv", "ts", "asf", "avi", "mpg", "mpeg", "flv", "3gp", "mts", "trp", "vob", "vro", "mov"].map(function(container) {
return getDirectPlayProfileForVideoContainer(container, videoAudioCodecs, videoTestElement, options)
}).filter(function(i) {
return null != i
}).forEach(function(i) {
profile.DirectPlayProfiles.push(i)
}), ["opus", "mp3", "mp2", "aac", "flac", "alac", "webma", "wma", "wav", "ogg", "oga"].filter(canPlayAudioFormat).forEach(function(audioFormat) {
"mp2" === audioFormat ? profile.DirectPlayProfiles.push({
Container: "mp2,mp3",
Type: "Audio",
AudioCodec: audioFormat
}) : "mp3" === audioFormat ? profile.DirectPlayProfiles.push({
Container: audioFormat,
Type: "Audio",
AudioCodec: audioFormat
}) : profile.DirectPlayProfiles.push({
Container: "webma" === audioFormat ? "webma,webm" : audioFormat,
Type: "Audio"
}), "aac" !== audioFormat && "alac" !== audioFormat || profile.DirectPlayProfiles.push({
Container: "m4a",
AudioCodec: audioFormat,
Type: "Audio"
})
}), canPlayVp8 && profile.DirectPlayProfiles.push({
Container: "webm",
Type: "Video",
AudioCodec: webmAudioCodecs.join(","),
VideoCodec: "VP8"
}), canPlayVp9 && profile.DirectPlayProfiles.push({
Container: "webm",
Type: "Video",
AudioCodec: webmAudioCodecs.join(","),
VideoCodec: "VP9"
}), profile.TranscodingProfiles = [];
var hlsBreakOnNonKeyFrames = !(!(browser.iOS || browser.osx || browser.edge) && canPlayNativeHls());
canPlayHls() && !1 !== browser.enableHlsAudio && profile.TranscodingProfiles.push({
Container: !canPlayNativeHls() || browser.edge || browser.android ? "ts" : "aac",
Type: "Audio",
AudioCodec: "aac",
Context: "Streaming",
Protocol: "hls",
MaxAudioChannels: physicalAudioChannels.toString(),
MinSegments: browser.iOS || browser.osx ? "2" : "1",
BreakOnNonKeyFrames: hlsBreakOnNonKeyFrames
}), ["aac", "mp3", "opus", "wav"].filter(canPlayAudioFormat).forEach(function(audioFormat) {
profile.TranscodingProfiles.push({
Container: audioFormat,
Type: "Audio",
AudioCodec: audioFormat,
Context: "Streaming",
Protocol: "http",
MaxAudioChannels: physicalAudioChannels.toString()
})
}), ["opus", "mp3", "aac", "wav"].filter(canPlayAudioFormat).forEach(function(audioFormat) {
profile.TranscodingProfiles.push({
Container: audioFormat,
Type: "Audio",
AudioCodec: audioFormat,
Context: "Static",
Protocol: "http",
MaxAudioChannels: physicalAudioChannels.toString()
})
}), !canPlayMkv || browser.tizen || browser.orsay || !1 === options.enableMkvProgressive || profile.TranscodingProfiles.push({
Container: "mkv",
Type: "Video",
AudioCodec: videoAudioCodecs.join(","),
VideoCodec: mp4VideoCodecs.join(","),
Context: "Streaming",
MaxAudioChannels: physicalAudioChannels.toString(),
CopyTimestamps: !0
}), canPlayMkv && profile.TranscodingProfiles.push({
Container: "mkv",
Type: "Video",
AudioCodec: videoAudioCodecs.join(","),
VideoCodec: mp4VideoCodecs.join(","),
Context: "Static",
MaxAudioChannels: physicalAudioChannels.toString(),
CopyTimestamps: !0
}), canPlayHls() && !1 !== options.enableHls && profile.TranscodingProfiles.push({
Container: "ts",
Type: "Video",
AudioCodec: hlsVideoAudioCodecs.join(","),
VideoCodec: hlsVideoCodecs.join(","),
Context: "Streaming",
Protocol: "hls",
MaxAudioChannels: physicalAudioChannels.toString(),
MinSegments: browser.iOS || browser.osx ? "2" : "1",
BreakOnNonKeyFrames: hlsBreakOnNonKeyFrames
}), canPlayVp8 && profile.TranscodingProfiles.push({
Container: "webm",
Type: "Video",
AudioCodec: "vorbis",
VideoCodec: "vpx",
Context: "Streaming",
Protocol: "http",
MaxAudioChannels: physicalAudioChannels.toString()
}), profile.TranscodingProfiles.push({
Container: "mp4",
Type: "Video",
AudioCodec: videoAudioCodecs.join(","),
VideoCodec: "h264",
Context: "Static",
Protocol: "http"
}), profile.ContainerProfiles = [], profile.CodecProfiles = [];
var supportsSecondaryAudio = browser.tizen || browser.orsay || videoTestElement.audioTracks,
aacCodecProfileConditions = [];
videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.5"').replace(/no/, "") || aacCodecProfileConditions.push({
Condition: "NotEquals",
Property: "AudioProfile",
Value: "HE-AAC"
}), supportsSecondaryAudio || aacCodecProfileConditions.push({
Condition: "Equals",
Property: "IsSecondaryAudio",
Value: "false",
IsRequired: "false"
}), browser.chromecast && aacCodecProfileConditions.push({
Condition: "LessThanEqual",
Property: "AudioChannels",
Value: "2",
IsRequired: !0
}), aacCodecProfileConditions.length && profile.CodecProfiles.push({
Type: "VideoAudio",
Codec: "aac",
Conditions: aacCodecProfileConditions
}), supportsSecondaryAudio || profile.CodecProfiles.push({
Type: "VideoAudio",
Conditions: [{
Condition: "Equals",
Property: "IsSecondaryAudio",
Value: "false",
IsRequired: "false"
}]
});
var maxH264Level = browser.chromecast ? 42 : 51,
h264Profiles = "high|main|baseline|constrained baseline";
maxH264Level >= 51 && browser.chrome && !browser.osx && (h264Profiles += "|high 10"), profile.CodecProfiles.push({
Type: "Video",
Codec: "h264",
Conditions: [{
Condition: "NotEquals",
Property: "IsAnamorphic",
Value: "true",
IsRequired: !1
}, {
Condition: "EqualsAny",
Property: "VideoProfile",
Value: h264Profiles
}, {
Condition: "LessThanEqual",
Property: "VideoLevel",
Value: maxH264Level.toString()
}]
}), browser.edgeUwp || browser.tizen || browser.orsay || browser.web0s, maxVideoWidth && profile.CodecProfiles[profile.CodecProfiles.length - 1].Conditions.push({
Condition: "LessThanEqual",
Property: "Width",
Value: maxVideoWidth.toString(),
IsRequired: !1
});
var globalMaxVideoBitrate = (getGlobalMaxVideoBitrate() || "").toString(),
h264MaxVideoBitrate = globalMaxVideoBitrate;
h264MaxVideoBitrate && profile.CodecProfiles[profile.CodecProfiles.length - 1].Conditions.push({
Condition: "LessThanEqual",
Property: "VideoBitrate",
Value: h264MaxVideoBitrate,
IsRequired: !0
});
var globalVideoConditions = [];
return globalMaxVideoBitrate && globalVideoConditions.push({
Condition: "LessThanEqual",
Property: "VideoBitrate",
Value: globalMaxVideoBitrate
}), maxVideoWidth && globalVideoConditions.push({
Condition: "LessThanEqual",
Property: "Width",
Value: maxVideoWidth.toString(),
IsRequired: !1
}), globalVideoConditions.length && profile.CodecProfiles.push({
Type: "Video",
Conditions: globalVideoConditions
}), browser.chromecast && profile.CodecProfiles.push({
Type: "Audio",
Codec: "flac",
Conditions: [{
Condition: "LessThanEqual",
Property: "AudioSampleRate",
Value: "96000"
}]
}), profile.SubtitleProfiles = [], supportsTextTracks() && profile.SubtitleProfiles.push({
Format: "vtt",
Method: "External"
}), profile.ResponseProfiles = [], profile.ResponseProfiles.push({
Type: "Video",
Container: "m4v",
MimeType: "video/mp4"
}), profile
}
});