mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
update osd
This commit is contained in:
parent
7c5dabe06d
commit
7d8f6339a2
3 changed files with 170 additions and 86 deletions
|
@ -1,12 +1,23 @@
|
||||||
define(['dom', 'fullscreenManager'], function (dom, fullscreenManager) {
|
define(['dom', 'fullscreenManager'], function (dom, fullscreenManager) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
dom.addEventListener(window, 'dblclick', function () {
|
function isTargetValid(target) {
|
||||||
|
|
||||||
if (fullscreenManager.isFullScreen()) {
|
if (dom.parentWithTag(target, ['BUTTON', 'INPUT', 'TEXTAREA'])) {
|
||||||
fullscreenManager.exitFullscreen();
|
return false;
|
||||||
} else {
|
}
|
||||||
fullscreenManager.requestFullscreen();
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
dom.addEventListener(window, 'dblclick', function (e) {
|
||||||
|
|
||||||
|
if (isTargetValid(e.target)) {
|
||||||
|
if (fullscreenManager.isFullScreen()) {
|
||||||
|
fullscreenManager.exitFullscreen();
|
||||||
|
} else {
|
||||||
|
fullscreenManager.requestFullscreen();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}, {
|
}, {
|
||||||
|
|
|
@ -135,76 +135,74 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan
|
||||||
|
|
||||||
function setCurrentSrc(elem, options) {
|
function setCurrentSrc(elem, options) {
|
||||||
|
|
||||||
return new Promise(function (resolve, reject) {
|
//if (!elem) {
|
||||||
|
// currentSrc = null;
|
||||||
|
// resolve();
|
||||||
|
// return;
|
||||||
|
//}
|
||||||
|
|
||||||
//if (!elem) {
|
//if (!options) {
|
||||||
// currentSrc = null;
|
// currentSrc = null;
|
||||||
// resolve();
|
// elem.src = null;
|
||||||
// return;
|
// elem.src = "";
|
||||||
//}
|
|
||||||
|
|
||||||
//if (!options) {
|
// // When the browser regains focus it may start auto-playing the last video
|
||||||
// currentSrc = null;
|
// //if ($.browser.safari) {
|
||||||
// elem.src = null;
|
// // elem.src = 'files/dummy.mp4';
|
||||||
// elem.src = "";
|
// // elem.play();
|
||||||
|
// //}
|
||||||
|
|
||||||
// // When the browser regains focus it may start auto-playing the last video
|
// resolve();
|
||||||
// //if ($.browser.safari) {
|
// return;
|
||||||
// // elem.src = 'files/dummy.mp4';
|
//}
|
||||||
// // elem.play();
|
|
||||||
// //}
|
|
||||||
|
|
||||||
// resolve();
|
var val = options.url;
|
||||||
// return;
|
|
||||||
//}
|
|
||||||
|
|
||||||
var val = options.url;
|
console.log('playing url: ' + val);
|
||||||
|
|
||||||
console.log('playing url: ' + val);
|
//if (AppInfo.isNativeApp && $.browser.safari) {
|
||||||
|
// val = val.replace('file://', '');
|
||||||
|
//}
|
||||||
|
|
||||||
//if (AppInfo.isNativeApp && $.browser.safari) {
|
// Convert to seconds
|
||||||
// val = val.replace('file://', '');
|
var seconds = (options.playerStartPositionTicks || 0) / 10000000;
|
||||||
//}
|
if (seconds) {
|
||||||
|
val += '#t=' + seconds;
|
||||||
|
}
|
||||||
|
|
||||||
// Convert to seconds
|
destroyHlsPlayer();
|
||||||
var seconds = (options.playerStartPositionTicks || 0) / 10000000;
|
|
||||||
if (seconds) {
|
var tracks = getMediaStreamTextTracks(options.mediaSource);
|
||||||
val += '#t=' + seconds;
|
|
||||||
|
var currentTrackIndex = -1;
|
||||||
|
for (var i = 0, length = tracks.length; i < length; i++) {
|
||||||
|
if (tracks[i].Index === options.mediaSource.DefaultSubtitleStreamIndex) {
|
||||||
|
currentTrackIndex = tracks[i].Index;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
subtitleTrackIndexToSetOnPlaying = currentTrackIndex;
|
||||||
|
|
||||||
var playNow = false;
|
currentPlayOptions = options;
|
||||||
|
|
||||||
destroyHlsPlayer();
|
elem.crossOrigin = getCrossOriginValue(options.mediaSource);
|
||||||
|
|
||||||
var tracks = getMediaStreamTextTracks(options.mediaSource);
|
if (enableHlsPlayer(val, options.item, options.mediaSource)) {
|
||||||
|
|
||||||
var currentTrackIndex = -1;
|
setTracks(elem, tracks, options.mediaSource, options.item.ServerId);
|
||||||
for (var i = 0, length = tracks.length; i < length; i++) {
|
|
||||||
if (tracks[i].Index === options.mediaSource.DefaultSubtitleStreamIndex) {
|
|
||||||
currentTrackIndex = tracks[i].Index;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
subtitleTrackIndexToSetOnPlaying = currentTrackIndex;
|
|
||||||
|
|
||||||
currentPlayOptions = options;
|
return new Promise(function (resolve, reject) {
|
||||||
|
|
||||||
elem.crossOrigin = getCrossOriginValue(options.mediaSource);
|
|
||||||
|
|
||||||
if (enableHlsPlayer(val, options.item, options.mediaSource)) {
|
|
||||||
|
|
||||||
setTracks(elem, tracks, options.mediaSource, options.item.ServerId);
|
|
||||||
|
|
||||||
requireHlsPlayer(function () {
|
requireHlsPlayer(function () {
|
||||||
var hls = new Hls({
|
var hls = new Hls({
|
||||||
manifestLoadingTimeOut: 20000,
|
manifestLoadingTimeOut: 20000
|
||||||
//appendErrorMaxRetry: 6,
|
//appendErrorMaxRetry: 6,
|
||||||
//debug: true
|
//debug: true
|
||||||
});
|
});
|
||||||
hls.loadSource(val);
|
hls.loadSource(val);
|
||||||
hls.attachMedia(elem);
|
hls.attachMedia(elem);
|
||||||
hls.on(Hls.Events.MANIFEST_PARSED, function () {
|
hls.on(Hls.Events.MANIFEST_PARSED, function () {
|
||||||
playAndResolve(elem, resolve, reject);
|
playWithPromise(elem).then(resolve, reject);
|
||||||
});
|
});
|
||||||
|
|
||||||
hls.on(Hls.Events.ERROR, function (event, data) {
|
hls.on(Hls.Events.ERROR, function (event, data) {
|
||||||
|
@ -231,45 +229,46 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan
|
||||||
});
|
});
|
||||||
|
|
||||||
hlsPlayer = hls;
|
hlsPlayer = hls;
|
||||||
|
|
||||||
|
// This is needed in setCurrentTrackElement
|
||||||
|
currentSrc = val;
|
||||||
|
|
||||||
|
setCurrentTrackElement(currentTrackIndex);
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
elem.autoplay = true;
|
elem.autoplay = true;
|
||||||
var mimeType = options.mimeType;
|
var mimeType = options.mimeType;
|
||||||
|
|
||||||
// Opera TV guidelines suggest using source elements, so let's do that if we have a valid mimeType
|
// Opera TV guidelines suggest using source elements, so let's do that if we have a valid mimeType
|
||||||
if (mimeType && browser.operaTv) {
|
if (mimeType && browser.operaTv) {
|
||||||
|
|
||||||
if (browser.chrome && mimeType === 'video/x-matroska') {
|
if (browser.chrome && mimeType === 'video/x-matroska') {
|
||||||
mimeType = 'video/webm';
|
mimeType = 'video/webm';
|
||||||
}
|
|
||||||
|
|
||||||
// Need to do this or we won't be able to restart a new stream
|
|
||||||
if (elem.currentSrc) {
|
|
||||||
elem.src = '';
|
|
||||||
elem.removeAttribute('src');
|
|
||||||
}
|
|
||||||
|
|
||||||
elem.innerHTML = '<source src="' + val + '" type="' + mimeType + '">' + getTracksHtml(tracks, options.mediaSource, options.item.ServerId);
|
|
||||||
} else {
|
|
||||||
applySrc(elem, val);
|
|
||||||
setTracks(elem, tracks, options.mediaSource, options.item.ServerId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Need to do this or we won't be able to restart a new stream
|
||||||
|
if (elem.currentSrc) {
|
||||||
|
elem.src = '';
|
||||||
|
elem.removeAttribute('src');
|
||||||
|
}
|
||||||
|
|
||||||
|
elem.innerHTML = '<source src="' + val + '" type="' + mimeType + '">' + getTracksHtml(tracks, options.mediaSource, options.item.ServerId);
|
||||||
|
|
||||||
elem.addEventListener('loadedmetadata', onLoadedMetadata);
|
elem.addEventListener('loadedmetadata', onLoadedMetadata);
|
||||||
playNow = true;
|
} else {
|
||||||
|
applySrc(elem, val);
|
||||||
|
setTracks(elem, tracks, options.mediaSource, options.item.ServerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is needed in setCurrentTrackElement
|
// This is needed in setCurrentTrackElement
|
||||||
currentSrc = val;
|
currentSrc = val;
|
||||||
|
|
||||||
setCurrentTrackElement(currentTrackIndex);
|
setCurrentTrackElement(currentTrackIndex);
|
||||||
|
return playWithPromise(elem);
|
||||||
if (playNow) {
|
}
|
||||||
playAndResolve(elem, resolve, reject);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function applySrc(elem, src) {
|
function applySrc(elem, src) {
|
||||||
|
@ -290,13 +289,26 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function playAndResolve(elem, resolve, reject) {
|
function playWithPromise(elem) {
|
||||||
var promise = elem.play();
|
|
||||||
if (promise && promise.then) {
|
try {
|
||||||
// Chrome now returns a promise
|
var promise = elem.play();
|
||||||
promise.then(resolve, reject);
|
if (promise && promise.then) {
|
||||||
} else {
|
// Chrome now returns a promise
|
||||||
resolve();
|
return promise.catch(function (e) {
|
||||||
|
|
||||||
|
if ((e.name || '').toLowerCase() === 'notallowederror') {
|
||||||
|
// swallow this error because the user can still click the play button on the video element
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
return Promise.reject();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.log('error calling video.play: ' + err);
|
||||||
|
return Promise.reject();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -661,7 +673,12 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan
|
||||||
mediaElem.removeEventListener('loadedmetadata', onLoadedMetadata);
|
mediaElem.removeEventListener('loadedmetadata', onLoadedMetadata);
|
||||||
|
|
||||||
if (!hlsPlayer) {
|
if (!hlsPlayer) {
|
||||||
mediaElem.play();
|
|
||||||
|
try {
|
||||||
|
mediaElem.play();
|
||||||
|
} catch (err) {
|
||||||
|
console.log('error calling mediaElement.play: ' + err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -414,13 +414,15 @@
|
||||||
view.querySelector('.btnCast').classList.remove('hide');
|
view.querySelector('.btnCast').classList.remove('hide');
|
||||||
}
|
}
|
||||||
|
|
||||||
view.querySelector('.btnCast').addEventListener('click', function() {
|
view.querySelector('.btnCast').addEventListener('click', function () {
|
||||||
var btn = this;
|
var btn = this;
|
||||||
require(['playerSelectionMenu'], function (playerSelectionMenu) {
|
require(['playerSelectionMenu'], function (playerSelectionMenu) {
|
||||||
playerSelectionMenu.show(btn);
|
playerSelectionMenu.show(btn);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
view.querySelector('.btnSettings').addEventListener('click', onSettingsButtonClick);
|
||||||
|
|
||||||
function onPlayerChange() {
|
function onPlayerChange() {
|
||||||
|
|
||||||
var player = playbackManager.getCurrentPlayer();
|
var player = playbackManager.getCurrentPlayer();
|
||||||
|
@ -740,6 +742,60 @@
|
||||||
elem.innerHTML = html;
|
elem.innerHTML = html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onSettingsButtonClick(e) {
|
||||||
|
|
||||||
|
var btn = this;
|
||||||
|
require(['qualityoptions', 'actionsheet'], function (qualityoptions, actionsheet) {
|
||||||
|
|
||||||
|
//var currentSrc = self.getCurrentSrc(self.currentMediaRenderer).toLowerCase();
|
||||||
|
//var isStatic = currentSrc.indexOf('static=true') != -1;
|
||||||
|
|
||||||
|
var videoStream = lastPlayerState.MediaSource.MediaStreams.filter(function (stream) {
|
||||||
|
return stream.Type == "Video";
|
||||||
|
})[0];
|
||||||
|
var videoWidth = videoStream ? videoStream.Width : null;
|
||||||
|
|
||||||
|
var options = qualityoptions.getVideoQualityOptions(lastPlayerState.MaxStreamingBitrate, videoWidth);
|
||||||
|
|
||||||
|
//if (isStatic) {
|
||||||
|
// options[0].name = "Direct";
|
||||||
|
//}
|
||||||
|
|
||||||
|
var menuItems = options.map(function (o) {
|
||||||
|
|
||||||
|
var opt = {
|
||||||
|
name: o.name,
|
||||||
|
id: o.bitrate
|
||||||
|
};
|
||||||
|
|
||||||
|
if (o.selected) {
|
||||||
|
opt.selected = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return opt;
|
||||||
|
});
|
||||||
|
|
||||||
|
var selectedId = options.filter(function (o) {
|
||||||
|
return o.selected;
|
||||||
|
});
|
||||||
|
selectedId = selectedId.length ? selectedId[0].bitrate : null;
|
||||||
|
actionsheet.show({
|
||||||
|
items: menuItems,
|
||||||
|
// history.back() will cause the video player to stop
|
||||||
|
enableHistory: false,
|
||||||
|
positionTo: btn,
|
||||||
|
callback: function (id) {
|
||||||
|
|
||||||
|
var bitrate = parseInt(id);
|
||||||
|
if (bitrate != selectedId) {
|
||||||
|
//self.onQualityOptionSelected(bitrate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function showAudioTrackSelection() {
|
function showAudioTrackSelection() {
|
||||||
|
|
||||||
var player = currentPlayer;
|
var player = currentPlayer;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue