mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
update video osd
This commit is contained in:
parent
e9b1b4ad5f
commit
0444d44461
6 changed files with 128 additions and 222 deletions
|
@ -88,6 +88,7 @@
|
|||
var currentRuntimeTicks = 0;
|
||||
var lastUpdateTime = 0;
|
||||
var isEnabled;
|
||||
var currentItem;
|
||||
|
||||
var nowPlayingVolumeSlider = view.querySelector('.osdVolumeSlider');
|
||||
var nowPlayingVolumeSliderContainer = view.querySelector('.osdVolumeSliderContainer');
|
||||
|
@ -98,8 +99,6 @@
|
|||
var nowPlayingDurationText = view.querySelector('.osdDurationText');
|
||||
var endsAtText = view.querySelector('.endsAtText');
|
||||
|
||||
var scenePicker = view.querySelector('.scenePicker');
|
||||
var isScenePickerRendered;
|
||||
var btnRewind = view.querySelector('.btnRewind');
|
||||
var btnFastForward = view.querySelector('.btnFastForward');
|
||||
|
||||
|
@ -115,10 +114,8 @@
|
|||
|
||||
function updateNowPlayingInfo(state) {
|
||||
|
||||
scenePicker.innerHTML = '';
|
||||
isScenePickerRendered = false;
|
||||
|
||||
var item = state.NowPlayingItem;
|
||||
currentItem = item;
|
||||
|
||||
setPoster(item);
|
||||
|
||||
|
@ -380,10 +377,10 @@
|
|||
|
||||
function updateFullscreenIcon() {
|
||||
if (playbackManager.isFullscreen(currentPlayer)) {
|
||||
view.querySelector('.btnFullscreen').setAttribute('title', globalize.translate('core#ExitFullscreen'));
|
||||
view.querySelector('.btnFullscreen').setAttribute('title', globalize.translate('ExitFullscreen'));
|
||||
view.querySelector('.btnFullscreen i').innerHTML = '';
|
||||
} else {
|
||||
view.querySelector('.btnFullscreen').setAttribute('title', globalize.translate('core#Fullscreen'));
|
||||
view.querySelector('.btnFullscreen').setAttribute('title', globalize.translate('Fullscreen'));
|
||||
view.querySelector('.btnFullscreen i').innerHTML = '';
|
||||
}
|
||||
}
|
||||
|
@ -712,10 +709,10 @@
|
|||
}
|
||||
|
||||
if (isMuted) {
|
||||
view.querySelector('.buttonMute').setAttribute('title', globalize.translate('core#Unmute'));
|
||||
view.querySelector('.buttonMute').setAttribute('title', globalize.translate('Unmute'));
|
||||
view.querySelector('.buttonMute i').innerHTML = '';
|
||||
} else {
|
||||
view.querySelector('.buttonMute').setAttribute('title', globalize.translate('core#Mute'));
|
||||
view.querySelector('.buttonMute').setAttribute('title', globalize.translate('Mute'));
|
||||
view.querySelector('.buttonMute i').innerHTML = '';
|
||||
}
|
||||
|
||||
|
@ -955,7 +952,6 @@
|
|||
|
||||
nowPlayingPositionSlider.addEventListener('change', function () {
|
||||
|
||||
stopScenePickerTimer();
|
||||
if (currentPlayer) {
|
||||
|
||||
var newPercent = parseFloat(this.value);
|
||||
|
@ -964,7 +960,65 @@
|
|||
}
|
||||
});
|
||||
|
||||
nowPlayingPositionSlider.getBubbleText = function (value) {
|
||||
function getImgUrl(item, chapter, index, maxWidth, apiClient) {
|
||||
|
||||
if (chapter.ImageTag) {
|
||||
|
||||
return apiClient.getScaledImageUrl(item.Id, {
|
||||
maxWidth: maxWidth,
|
||||
tag: chapter.ImageTag,
|
||||
type: "Chapter",
|
||||
index: index
|
||||
});
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function getChapterBubbleHtml(apiClient, item, chapters, positionTicks) {
|
||||
|
||||
var chapter;
|
||||
var index = -1;
|
||||
|
||||
for (var i = 0, length = chapters.length; i < length; i++) {
|
||||
|
||||
var currentChapter = chapters[i];
|
||||
|
||||
if (positionTicks >= currentChapter.StartPositionTicks) {
|
||||
chapter = currentChapter;
|
||||
index = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (!chapter) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var src = getImgUrl(item, chapter, index, 400, apiClient);
|
||||
|
||||
if (src) {
|
||||
|
||||
var html = '<div class="chapterThumbContainer">';
|
||||
html += '<img class="chapterThumb" src="' + src + '" />';
|
||||
|
||||
html += '<div class="chapterThumbTextContainer">';
|
||||
html += '<div class="chapterThumbText chapterThumbText-dim">';
|
||||
html += chapter.Name;
|
||||
html += '</div>';
|
||||
html += '<h1 class="chapterThumbText">';
|
||||
html += datetime.getDisplayRunningTime(positionTicks);
|
||||
html += '</h1>';
|
||||
html += '</div>';
|
||||
|
||||
html += '</div>';
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
nowPlayingPositionSlider.getBubbleHtml = function (value) {
|
||||
|
||||
if (!currentRuntimeTicks) {
|
||||
return '--:--';
|
||||
|
@ -974,7 +1028,16 @@
|
|||
ticks /= 100;
|
||||
ticks *= value;
|
||||
|
||||
return datetime.getDisplayRunningTime(ticks);
|
||||
var item = currentItem;
|
||||
if (item && item.Chapters && item.Chapters[0].ImageTag) {
|
||||
var html = getChapterBubbleHtml(connectionManager.getApiClient(item.ServerId), item, item.Chapters, ticks);
|
||||
|
||||
if (html) {
|
||||
return html;
|
||||
}
|
||||
}
|
||||
|
||||
return '<h1 class="sliderBubbleText">' + datetime.getDisplayRunningTime(ticks) + '</h1>';
|
||||
};
|
||||
|
||||
view.querySelector('.btnPreviousTrack').addEventListener('click', function () {
|
||||
|
@ -1005,112 +1068,6 @@
|
|||
view.querySelector('.btnAudio').addEventListener('click', showAudioTrackSelection);
|
||||
view.querySelector('.btnSubtitles').addEventListener('click', showSubtitleTrackSelection);
|
||||
|
||||
function getChapterHtml(item, chapter, index, maxWidth, apiClient) {
|
||||
|
||||
var html = '';
|
||||
|
||||
var src = getImgUrl(item, chapter, index, maxWidth, apiClient);
|
||||
|
||||
if (src) {
|
||||
|
||||
var pct = currentRuntimeTicks ? (chapter.StartPositionTicks / currentRuntimeTicks) : 0;
|
||||
pct *= 100;
|
||||
chapterPcts[index] = pct;
|
||||
|
||||
html += '<img data-index="' + index + '" class="chapterThumb" src="' + src + '" />';
|
||||
}
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
function getImgUrl(item, chapter, index, maxWidth, apiClient) {
|
||||
|
||||
if (chapter.ImageTag) {
|
||||
|
||||
return apiClient.getScaledImageUrl(item.Id, {
|
||||
maxWidth: maxWidth,
|
||||
tag: chapter.ImageTag,
|
||||
type: "Chapter",
|
||||
index: index
|
||||
});
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function renderScenePicker(progressPct) {
|
||||
|
||||
chapterPcts = [];
|
||||
var item = playbackManager.currentItem(currentPlayer);
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
|
||||
var chapters = item.Chapters || [];
|
||||
|
||||
var currentIndex = -1;
|
||||
|
||||
var apiClient = connectionManager.getApiClient(item.ServerId);
|
||||
|
||||
scenePicker.innerHTML = chapters.map(function (chapter) {
|
||||
currentIndex++;
|
||||
return getChapterHtml(item, chapter, currentIndex, 400, apiClient);
|
||||
}).join('');
|
||||
|
||||
imageLoader.lazyChildren(scenePicker);
|
||||
fadeIn(scenePicker, progressPct);
|
||||
}
|
||||
|
||||
var hideScenePickerTimeout;
|
||||
var chapterPcts = [];
|
||||
|
||||
function showScenePicker() {
|
||||
|
||||
var progressPct = nowPlayingPositionSlider.value;
|
||||
|
||||
if (!isScenePickerRendered) {
|
||||
isScenePickerRendered = true;
|
||||
renderScenePicker();
|
||||
} else {
|
||||
fadeIn(scenePicker, progressPct);
|
||||
}
|
||||
|
||||
if (hideScenePickerTimeout) {
|
||||
clearTimeout(hideScenePickerTimeout);
|
||||
}
|
||||
hideScenePickerTimeout = setTimeout(hideScenePicker, 1600);
|
||||
}
|
||||
|
||||
function hideScenePicker() {
|
||||
fadeOut(scenePicker);
|
||||
}
|
||||
|
||||
var showScenePickerTimeout;
|
||||
|
||||
function startScenePickerTimer() {
|
||||
if (!showScenePickerTimeout) {
|
||||
showScenePickerTimeout = setTimeout(showScenePicker, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function stopScenePickerTimer() {
|
||||
if (showScenePickerTimeout) {
|
||||
clearTimeout(showScenePickerTimeout);
|
||||
showScenePickerTimeout = null;
|
||||
}
|
||||
}
|
||||
|
||||
dom.addEventListener(nowPlayingPositionSlider, 'input', function () {
|
||||
|
||||
if (scenePicker.classList.contains('hide')) {
|
||||
startScenePickerTimer();
|
||||
} else {
|
||||
showScenePicker();
|
||||
}
|
||||
}, {
|
||||
passive: true
|
||||
});
|
||||
|
||||
function onViewHideStopPlayback() {
|
||||
|
||||
if (playbackManager.isPlayingVideo()) {
|
||||
|
@ -1129,67 +1086,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
function fadeIn(elem, pct) {
|
||||
|
||||
if (!elem.classList.contains('hide')) {
|
||||
selectChapterThumb(elem, pct);
|
||||
return;
|
||||
}
|
||||
|
||||
elem.classList.remove('hide');
|
||||
|
||||
var keyframes = [
|
||||
{ opacity: '0', offset: 0 },
|
||||
{ opacity: '1', offset: 1 }
|
||||
];
|
||||
var timing = { duration: 300, iterations: 1 };
|
||||
elem.animate(keyframes, timing).onfinish = function () {
|
||||
selectChapterThumb(elem, pct);
|
||||
};
|
||||
}
|
||||
|
||||
function selectChapterThumb(elem, pct) {
|
||||
var index = -1;
|
||||
for (var i = 0, length = chapterPcts.length; i < length; i++) {
|
||||
|
||||
if (pct >= chapterPcts[i]) {
|
||||
index = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (index === -1) {
|
||||
index = 0;
|
||||
}
|
||||
|
||||
var selected = elem.querySelector('.selectedChapterThumb');
|
||||
var newSelected = elem.querySelector('.chapterThumb[data-index="' + index + '"]');
|
||||
|
||||
if (selected !== newSelected) {
|
||||
if (selected) {
|
||||
selected.classList.remove('selectedChapterThumb');
|
||||
}
|
||||
|
||||
newSelected.classList.add('selectedChapterThumb');
|
||||
scrollHelper.toCenter(elem, newSelected, true);
|
||||
}
|
||||
}
|
||||
|
||||
function fadeOut(elem) {
|
||||
|
||||
if (elem.classList.contains('hide')) {
|
||||
return;
|
||||
}
|
||||
|
||||
var keyframes = [
|
||||
{ opacity: '1', offset: 0 },
|
||||
{ opacity: '0', offset: 1 }
|
||||
];
|
||||
var timing = { duration: 300, iterations: 1 };
|
||||
elem.animate(keyframes, timing).onfinish = function () {
|
||||
elem.classList.add('hide');
|
||||
};
|
||||
}
|
||||
|
||||
function enableStopOnBack(enabled) {
|
||||
|
||||
view.removeEventListener('viewbeforehide', onViewHideStopPlayback);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue