mirror of
https://github.com/jellyfin/jellyfin-web.git
synced 2024-11-18 03:18:19 -07:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
a84e40f79e
@ -229,16 +229,17 @@
|
|||||||
clearInterval(this.timer);
|
clearInterval(this.timer);
|
||||||
};
|
};
|
||||||
|
|
||||||
function getMaxVideoAudioChannels() {
|
function getCodecLimits() {
|
||||||
return 6;
|
return {
|
||||||
}
|
|
||||||
|
|
||||||
function getMaxAudioChannels() {
|
maxVideoAudioChannels: 6,
|
||||||
return 2;
|
maxAudioChannels: 2,
|
||||||
}
|
maxVideoLevel: 41,
|
||||||
|
maxWidth: 1920,
|
||||||
|
maxHeight: 1080,
|
||||||
|
maxSampleRate: 44100
|
||||||
|
|
||||||
function getMaxVideoLevel() {
|
};
|
||||||
return 41;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function canDirectStream(mediaType, mediaSource, maxBitrate) {
|
function canDirectStream(mediaType, mediaSource, maxBitrate) {
|
||||||
@ -248,6 +249,8 @@
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var codecLimits = getCodecLimits();
|
||||||
|
|
||||||
if (mediaType == "Audio") {
|
if (mediaType == "Audio") {
|
||||||
|
|
||||||
return ['mp3', 'aac'].indexOf(mediaSource.Container || '') != -1;
|
return ['mp3', 'aac'].indexOf(mediaSource.Container || '') != -1;
|
||||||
@ -268,15 +271,15 @@
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!videoStream.Level || videoStream.Level > getMaxVideoLevel()) {
|
if (!videoStream.Level || videoStream.Level > codecLimits.maxVideoLevel) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!videoStream.Width || videoStream.Width > 1920) {
|
if (!videoStream.Width || videoStream.Width > codecLimits.maxWidth) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!videoStream.Height || videoStream.Height > 1080) {
|
if (!videoStream.Height || videoStream.Height > codecLimits.maxHeight) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,12 +300,18 @@
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var maxChannels = isVideo ? getMaxVideoAudioChannels() : getMaxAudioChannels();
|
var codecLimits = getCodecLimits();
|
||||||
|
|
||||||
|
var maxChannels = isVideo ? codecLimits.maxVideoAudioChannels : codecLimits.maxAudioChannels;
|
||||||
|
|
||||||
if (!audioStream.Channels || audioStream.Channels > maxChannels) {
|
if (!audioStream.Channels || audioStream.Channels > maxChannels) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!audioStream.SampleRate || audioStream.SampleRate > codecLimits.maxSampleRate) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -542,11 +551,13 @@
|
|||||||
|
|
||||||
var url;
|
var url;
|
||||||
|
|
||||||
|
var codecLimits = getCodecLimits();
|
||||||
|
|
||||||
if (item.MediaType == 'Audio') {
|
if (item.MediaType == 'Audio') {
|
||||||
|
|
||||||
url = ApiClient.serverAddress() + '/mediabrowser/audio/' + item.Id + '/stream.' + mediaSourceInfo.streamContainer + '?';
|
url = ApiClient.serverAddress() + '/mediabrowser/audio/' + item.Id + '/stream.' + mediaSourceInfo.streamContainer + '?';
|
||||||
url += '&static=' + mediaSourceInfo.isStatic.toString();
|
url += '&static=' + mediaSourceInfo.isStatic.toString();
|
||||||
url += '&maxaudiochannels=' + getMaxAudioChannels();
|
url += '&maxaudiochannels=' + codecLimits.maxAudioChannels;
|
||||||
|
|
||||||
if (startTimeTicks) {
|
if (startTimeTicks) {
|
||||||
url += '&startTimeTicks=' + startTimeTicks.toString();
|
url += '&startTimeTicks=' + startTimeTicks.toString();
|
||||||
@ -556,7 +567,7 @@
|
|||||||
url += '&audiobitrate=' + Math.min(maxBitrate, 320000).toString();
|
url += '&audiobitrate=' + Math.min(maxBitrate, 320000).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
url += '&audiosamplerate=44100';
|
url += '&audiosamplerate=' + codecLimits.maxSampleRate;
|
||||||
url += '&mediasourceid=' + mediaSourceInfo.mediaSource.Id;
|
url += '&mediasourceid=' + mediaSourceInfo.mediaSource.Id;
|
||||||
|
|
||||||
return url;
|
return url;
|
||||||
@ -566,7 +577,7 @@
|
|||||||
|
|
||||||
url = ApiClient.serverAddress() + '/mediabrowser/videos/' + item.Id + '/stream.' + mediaSourceInfo.streamContainer + '?';
|
url = ApiClient.serverAddress() + '/mediabrowser/videos/' + item.Id + '/stream.' + mediaSourceInfo.streamContainer + '?';
|
||||||
url += 'static=' + mediaSourceInfo.isStatic.toString();
|
url += 'static=' + mediaSourceInfo.isStatic.toString();
|
||||||
url += '&maxaudiochannels=' + getMaxVideoAudioChannels();
|
url += '&maxaudiochannels=' + codecLimits.maxVideoAudioChannels;
|
||||||
|
|
||||||
if (startTimeTicks) {
|
if (startTimeTicks) {
|
||||||
url += '&startTimeTicks=' + startTimeTicks.toString();
|
url += '&startTimeTicks=' + startTimeTicks.toString();
|
||||||
@ -580,15 +591,15 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
url += '&profile=high';
|
url += '&profile=high';
|
||||||
url += '&level=' + getMaxVideoLevel();
|
url += '&level=' + codecLimits.maxVideoLevel;
|
||||||
|
|
||||||
url += '&maxwidth=1920';
|
url += '&maxwidth=' + codecLimits.maxWidth;
|
||||||
url += '&maxheight=1080';
|
url += '&maxheight=' + codecLimits.maxHeight;
|
||||||
|
|
||||||
url += '&videoCodec=h264';
|
url += '&videoCodec=h264';
|
||||||
url += '&audioCodec=aac';
|
url += '&audioCodec=aac';
|
||||||
|
|
||||||
url += '&audiosamplerate=44100';
|
url += '&audiosamplerate=' + codecLimits.maxSampleRate;
|
||||||
url += '&mediasourceid=' + mediaSourceInfo.mediaSource.Id;
|
url += '&mediasourceid=' + mediaSourceInfo.mediaSource.Id;
|
||||||
|
|
||||||
return url;
|
return url;
|
||||||
|
@ -22,7 +22,6 @@
|
|||||||
var fullscreenExited = false;
|
var fullscreenExited = false;
|
||||||
var idleState = true;
|
var idleState = true;
|
||||||
var remoteFullscreen = false;
|
var remoteFullscreen = false;
|
||||||
var videoMenuVisible = false;
|
|
||||||
|
|
||||||
self.initVideoPlayer = function () {
|
self.initVideoPlayer = function () {
|
||||||
video = playVideo(item, mediaSource, startPosition, user);
|
video = playVideo(item, mediaSource, startPosition, user);
|
||||||
@ -263,7 +262,7 @@
|
|||||||
video.removeClass("cursor-active").addClass("cursor-inactive");
|
video.removeClass("cursor-active").addClass("cursor-inactive");
|
||||||
videoControls.removeClass("active").addClass("inactive");
|
videoControls.removeClass("active").addClass("inactive");
|
||||||
}, 4000);
|
}, 4000);
|
||||||
};
|
}
|
||||||
|
|
||||||
function requestFullScreen(element) {
|
function requestFullScreen(element) {
|
||||||
|
|
||||||
@ -276,7 +275,7 @@
|
|||||||
enterFullScreen();
|
enterFullScreen();
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
}
|
||||||
|
|
||||||
function changeHandler(event) {
|
function changeHandler(event) {
|
||||||
|
|
||||||
@ -284,7 +283,7 @@
|
|||||||
fullscreenExited = self.isFullScreen() == false;
|
fullscreenExited = self.isFullScreen() == false;
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
}
|
||||||
|
|
||||||
function enterFullScreen() {
|
function enterFullScreen() {
|
||||||
|
|
||||||
@ -294,7 +293,7 @@
|
|||||||
|
|
||||||
remoteFullscreen = true;
|
remoteFullscreen = true;
|
||||||
|
|
||||||
};
|
}
|
||||||
|
|
||||||
function exitFullScreenToWindow() {
|
function exitFullScreenToWindow() {
|
||||||
|
|
||||||
@ -304,7 +303,7 @@
|
|||||||
|
|
||||||
remoteFullscreen = false;
|
remoteFullscreen = false;
|
||||||
|
|
||||||
};
|
}
|
||||||
|
|
||||||
function toggleFlyout(flyout, button) {
|
function toggleFlyout(flyout, button) {
|
||||||
|
|
||||||
@ -334,14 +333,14 @@
|
|||||||
|
|
||||||
hideFlyout(flyout);
|
hideFlyout(flyout);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
function hideFlyout(flyout) {
|
function hideFlyout(flyout) {
|
||||||
|
|
||||||
flyout.slideUp().empty();
|
flyout.slideUp().empty();
|
||||||
|
|
||||||
$(document.body).off("mousedown.hidesearchhints");
|
$(document.body).off("mousedown.hidesearchhints");
|
||||||
};
|
}
|
||||||
|
|
||||||
function getChaptersFlyoutHtml() {
|
function getChaptersFlyoutHtml() {
|
||||||
|
|
||||||
@ -400,7 +399,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
return html;
|
return html;
|
||||||
};
|
}
|
||||||
|
|
||||||
function getAudioTracksHtml() {
|
function getAudioTracksHtml() {
|
||||||
|
|
||||||
@ -468,7 +467,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
return html;
|
return html;
|
||||||
};
|
}
|
||||||
|
|
||||||
function getSubtitleTracksHtml() {
|
function getSubtitleTracksHtml() {
|
||||||
|
|
||||||
@ -541,7 +540,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
return html;
|
return html;
|
||||||
};
|
}
|
||||||
|
|
||||||
function getQualityFlyoutHtml() {
|
function getQualityFlyoutHtml() {
|
||||||
|
|
||||||
@ -582,7 +581,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
return html;
|
return html;
|
||||||
};
|
}
|
||||||
|
|
||||||
function getInitialSubtitleStreamIndex(mediaStreams, user) {
|
function getInitialSubtitleStreamIndex(mediaStreams, user) {
|
||||||
|
|
||||||
@ -621,7 +620,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
};
|
}
|
||||||
|
|
||||||
function getInitialAudioStreamIndex(mediaStreams, user) {
|
function getInitialAudioStreamIndex(mediaStreams, user) {
|
||||||
|
|
||||||
@ -651,7 +650,7 @@
|
|||||||
|
|
||||||
// Just use the first audio stream
|
// Just use the first audio stream
|
||||||
return audioStreams[0];
|
return audioStreams[0];
|
||||||
};
|
}
|
||||||
|
|
||||||
function getVideoQualityOptions(mediaStreams) {
|
function getVideoQualityOptions(mediaStreams) {
|
||||||
|
|
||||||
@ -729,7 +728,7 @@
|
|||||||
options[selectedIndex].selected = true;
|
options[selectedIndex].selected = true;
|
||||||
|
|
||||||
return options;
|
return options;
|
||||||
};
|
}
|
||||||
|
|
||||||
function playVideo(item, mediaSource, startPosition, user) {
|
function playVideo(item, mediaSource, startPosition, user) {
|
||||||
|
|
||||||
@ -922,7 +921,7 @@
|
|||||||
}, 300);
|
}, 300);
|
||||||
|
|
||||||
// Pause stop timer
|
// Pause stop timer
|
||||||
this.pauseStop = setTimeout(function () {
|
self.pauseStop = setTimeout(function () {
|
||||||
self.stop();
|
self.stop();
|
||||||
}, 5 * 60 * 1000); // 5 minutes
|
}, 5 * 60 * 1000); // 5 minutes
|
||||||
|
|
||||||
@ -936,8 +935,7 @@
|
|||||||
}, 300);
|
}, 300);
|
||||||
|
|
||||||
// Remove pause setop timer
|
// Remove pause setop timer
|
||||||
window.clearTimeout(this.pauseStop);
|
self.clearPauseStop();
|
||||||
delete this.pauseStop;
|
|
||||||
|
|
||||||
}).on("timeupdate", function () {
|
}).on("timeupdate", function () {
|
||||||
|
|
||||||
@ -948,6 +946,8 @@
|
|||||||
|
|
||||||
}).on("error", function () {
|
}).on("error", function () {
|
||||||
|
|
||||||
|
self.clearPauseStop();
|
||||||
|
|
||||||
$("html").css("cursor", "default");
|
$("html").css("cursor", "default");
|
||||||
$(".ui-loader").hide();
|
$(".ui-loader").hide();
|
||||||
self.resetEnhancements();
|
self.resetEnhancements();
|
||||||
@ -1038,6 +1038,6 @@
|
|||||||
currentMediaSource = mediaSource;
|
currentMediaSource = mediaSource;
|
||||||
|
|
||||||
return videoElement[0];
|
return videoElement[0];
|
||||||
};
|
}
|
||||||
};
|
};
|
||||||
})();
|
})();
|
@ -60,8 +60,19 @@
|
|||||||
return Math.floor(10000000 * (mediaElement || currentMediaElement).currentTime) + self.startTimeTicksOffset;
|
return Math.floor(10000000 * (mediaElement || currentMediaElement).currentTime) + self.startTimeTicksOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
self.clearPauseStop = function() {
|
||||||
|
|
||||||
|
if (self.pauseStop) {
|
||||||
|
console.log('clearing pause stop timer');
|
||||||
|
window.clearTimeout(self.pauseStop);
|
||||||
|
self.pauseStop = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
self.onPlaybackStopped = function () {
|
self.onPlaybackStopped = function () {
|
||||||
|
|
||||||
|
self.clearPauseStop();
|
||||||
|
|
||||||
$(this).off('ended.playbackstopped');
|
$(this).off('ended.playbackstopped');
|
||||||
|
|
||||||
self.currentTimeElement.empty();
|
self.currentTimeElement.empty();
|
||||||
@ -1159,7 +1170,7 @@
|
|||||||
|
|
||||||
var getItemFields = "MediaSources,Chapters";
|
var getItemFields = "MediaSources,Chapters";
|
||||||
|
|
||||||
self.getCurrentTargetInfo = function() {
|
self.getCurrentTargetInfo = function () {
|
||||||
return self.getTargets()[0];
|
return self.getTargets()[0];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user