1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/src/controllers/playback/videoosd.js

1549 lines
58 KiB
JavaScript
Raw Normal View History

2020-05-04 12:44:12 +02:00
define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'mediaInfo', 'focusManager', 'imageLoader', 'scrollHelper', 'events', 'connectionManager', 'browser', 'globalize', 'apphost', 'layoutManager', 'userSettings', 'keyboardnavigation', 'scrollStyles', 'emby-slider', 'paper-icon-button-light', 'css!assets/css/videoosd'], function (playbackManager, dom, inputManager, datetime, itemHelper, mediaInfo, focusManager, imageLoader, scrollHelper, events, connectionManager, browser, globalize, appHost, layoutManager, userSettings, keyboardnavigation) {
'use strict';
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function seriesImageUrl(item, options) {
2020-05-04 12:44:12 +02:00
if ('Episode' !== item.Type) {
2019-02-02 13:51:03 -05:00
return null;
}
2018-10-23 01:05:09 +03:00
2019-02-12 10:01:11 -05:00
options = options || {};
2020-05-04 12:44:12 +02:00
options.type = options.type || 'Primary';
if ('Primary' === options.type && item.SeriesPrimaryImageTag) {
2019-02-02 13:51:03 -05:00
options.tag = item.SeriesPrimaryImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
}
2018-10-23 01:05:09 +03:00
2020-05-04 12:44:12 +02:00
if ('Thumb' === options.type) {
2019-02-02 13:51:03 -05:00
if (item.SeriesThumbImageTag) {
options.tag = item.SeriesThumbImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (item.ParentThumbImageTag) {
options.tag = item.ParentThumbImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
}
}
return null;
2018-10-23 01:05:09 +03:00
}
2019-02-02 13:51:03 -05:00
function imageUrl(item, options) {
options = options || {};
2020-05-04 12:44:12 +02:00
options.type = options.type || 'Primary';
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
if (item.ImageTags && item.ImageTags[options.type]) {
options.tag = item.ImageTags[options.type];
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options);
}
2018-10-23 01:05:09 +03:00
2020-05-04 12:44:12 +02:00
if ('Primary' === options.type && item.AlbumId && item.AlbumPrimaryImageTag) {
2019-02-02 13:51:03 -05:00
options.tag = item.AlbumPrimaryImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
return null;
2019-02-02 10:20:27 -05:00
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
return function (view, params) {
function onVerticalSwipe(e, elem, data) {
var player = currentPlayer;
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (player) {
var deltaY = data.currentDeltaY;
var windowSize = dom.getWindowSize();
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (supportsBrightnessChange && data.clientX < windowSize.innerWidth / 2) {
return void doBrightnessTouch(deltaY, player, windowSize.innerHeight);
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
doVolumeTouch(deltaY, player, windowSize.innerHeight);
}
2018-10-23 01:05:09 +03:00
}
2019-02-02 13:51:03 -05:00
function doBrightnessTouch(deltaY, player, viewHeight) {
var delta = -deltaY / viewHeight * 100;
var newValue = playbackManager.getBrightness(player) + delta;
newValue = Math.min(newValue, 100);
newValue = Math.max(newValue, 0);
playbackManager.setBrightness(newValue, player);
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function doVolumeTouch(deltaY, player, viewHeight) {
var delta = -deltaY / viewHeight * 100;
var newValue = playbackManager.getVolume(player) + delta;
newValue = Math.min(newValue, 100);
newValue = Math.max(newValue, 0);
playbackManager.setVolume(newValue, player);
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function onDoubleClick(e) {
var clientX = e.clientX;
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (null != clientX) {
if (clientX < dom.getWindowSize().innerWidth / 2) {
playbackManager.rewind(currentPlayer);
} else {
playbackManager.fastForward(currentPlayer);
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
e.preventDefault();
e.stopPropagation();
}
2018-10-23 01:05:09 +03:00
}
2019-02-02 13:51:03 -05:00
function getDisplayItem(item) {
2020-05-04 12:44:12 +02:00
if ('TvChannel' === item.Type) {
2019-02-02 13:51:03 -05:00
var apiClient = connectionManager.getApiClient(item.ServerId);
return apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (refreshedItem) {
return {
originalItem: refreshedItem,
displayItem: refreshedItem.CurrentProgram
};
});
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
return Promise.resolve({
originalItem: item
});
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function updateRecordingButton(item) {
2020-05-04 12:44:12 +02:00
if (!item || 'Program' !== item.Type) {
2019-02-02 13:51:03 -05:00
if (recordingButtonManager) {
recordingButtonManager.destroy();
recordingButtonManager = null;
}
2020-05-04 12:44:12 +02:00
return void view.querySelector('.btnRecord').classList.add('hide');
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
connectionManager.getApiClient(item.ServerId).getCurrentUser().then(function (user) {
if (user.Policy.EnableLiveTvManagement) {
2020-05-04 12:44:12 +02:00
require(['recordingButton'], function (RecordingButton) {
2019-02-02 13:51:03 -05:00
if (recordingButtonManager) {
return void recordingButtonManager.refreshItem(item);
}
recordingButtonManager = new RecordingButton({
item: item,
2020-05-04 12:44:12 +02:00
button: view.querySelector('.btnRecord')
2019-02-02 13:51:03 -05:00
});
2020-05-04 12:44:12 +02:00
view.querySelector('.btnRecord').classList.remove('hide');
2019-02-02 13:51:03 -05:00
});
}
});
2018-10-23 01:05:09 +03:00
}
2019-02-02 13:51:03 -05:00
function updateDisplayItem(itemInfo) {
var item = itemInfo.originalItem;
currentItem = item;
var displayItem = itemInfo.displayItem || item;
updateRecordingButton(displayItem);
setPoster(displayItem, item);
var parentName = displayItem.SeriesName || displayItem.Album;
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (displayItem.EpisodeTitle || displayItem.IsSeries) {
parentName = displayItem.Name;
2018-10-23 01:05:09 +03:00
}
2019-02-02 13:51:03 -05:00
setTitle(displayItem, parentName);
var titleElement;
2020-05-04 12:44:12 +02:00
var osdTitle = view.querySelector('.osdTitle');
2019-02-02 13:51:03 -05:00
titleElement = osdTitle;
var displayName = itemHelper.getDisplayName(displayItem, {
2020-05-04 12:44:12 +02:00
includeParentInfo: 'Program' !== displayItem.Type,
includeIndexNumber: 'Program' !== displayItem.Type
2019-02-02 10:20:27 -05:00
});
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
if (!displayName) {
2020-05-14 23:25:22 +02:00
displayName = displayItem.Type;
2019-02-02 13:51:03 -05:00
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
titleElement.innerHTML = displayName;
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
if (displayName) {
2020-05-04 12:44:12 +02:00
titleElement.classList.remove('hide');
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
titleElement.classList.add('hide');
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
var mediaInfoHtml = mediaInfo.getPrimaryMediaInfoHtml(displayItem, {
runtime: false,
subtitles: false,
tomatoes: false,
endsAt: false,
episodeTitle: false,
2020-05-04 12:44:12 +02:00
originalAirDate: 'Program' !== displayItem.Type,
episodeTitleIndexNumber: 'Program' !== displayItem.Type,
2019-02-02 13:51:03 -05:00
programIndicator: false
});
2020-05-04 12:44:12 +02:00
var osdMediaInfo = view.querySelector('.osdMediaInfo');
2019-02-02 13:51:03 -05:00
osdMediaInfo.innerHTML = mediaInfoHtml;
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (mediaInfoHtml) {
2020-05-04 12:44:12 +02:00
osdMediaInfo.classList.remove('hide');
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
osdMediaInfo.classList.add('hide');
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2020-05-04 12:44:12 +02:00
var secondaryMediaInfo = view.querySelector('.osdSecondaryMediaInfo');
2019-02-02 13:51:03 -05:00
var secondaryMediaInfoHtml = mediaInfo.getSecondaryMediaInfoHtml(displayItem, {
startDate: false,
programTime: false
});
secondaryMediaInfo.innerHTML = secondaryMediaInfoHtml;
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (secondaryMediaInfoHtml) {
2020-05-04 12:44:12 +02:00
secondaryMediaInfo.classList.remove('hide');
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
secondaryMediaInfo.classList.add('hide');
2019-02-02 13:51:03 -05:00
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
if (displayName) {
2020-05-04 12:44:12 +02:00
view.querySelector('.osdMainTextContainer').classList.remove('hide');
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
view.querySelector('.osdMainTextContainer').classList.add('hide');
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (enableProgressByTimeOfDay) {
setDisplayTime(startTimeText, displayItem.StartDate);
setDisplayTime(endTimeText, displayItem.EndDate);
2020-05-04 12:44:12 +02:00
startTimeText.classList.remove('hide');
endTimeText.classList.remove('hide');
2019-02-02 13:51:03 -05:00
programStartDateMs = displayItem.StartDate ? datetime.parseISO8601Date(displayItem.StartDate).getTime() : 0;
programEndDateMs = displayItem.EndDate ? datetime.parseISO8601Date(displayItem.EndDate).getTime() : 0;
} else {
2020-05-04 12:44:12 +02:00
startTimeText.classList.add('hide');
endTimeText.classList.add('hide');
startTimeText.innerHTML = '';
endTimeText.innerHTML = '';
2019-02-02 13:51:03 -05:00
programStartDateMs = 0;
programEndDateMs = 0;
}
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function getDisplayTimeWithoutAmPm(date, showSeconds) {
if (showSeconds) {
return datetime.toLocaleTimeString(date, {
2020-05-04 12:44:12 +02:00
hour: 'numeric',
minute: '2-digit',
second: '2-digit'
}).toLowerCase().replace('am', '').replace('pm', '').trim();
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2020-05-04 12:44:12 +02:00
return datetime.getDisplayTime(date).toLowerCase().replace('am', '').replace('pm', '').trim();
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function setDisplayTime(elem, date) {
var html;
if (date) {
date = datetime.parseISO8601Date(date);
html = getDisplayTimeWithoutAmPm(date);
}
2020-05-04 12:44:12 +02:00
elem.innerHTML = html || '';
2018-10-23 01:05:09 +03:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function shouldEnableProgressByTimeOfDay(item) {
2020-05-04 12:44:12 +02:00
return !('TvChannel' !== item.Type || !item.CurrentProgram);
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function updateNowPlayingInfo(player, state) {
var item = state.NowPlayingItem;
2019-02-12 10:01:11 -05:00
currentItem = item;
if (!item) {
2019-02-02 13:51:03 -05:00
setPoster(null);
updateRecordingButton(null);
2020-05-04 12:44:12 +02:00
Emby.Page.setTitle('');
2019-02-02 13:51:03 -05:00
nowPlayingVolumeSlider.disabled = true;
nowPlayingPositionSlider.disabled = true;
btnFastForward.disabled = true;
btnRewind.disabled = true;
2020-05-04 12:44:12 +02:00
view.querySelector('.btnSubtitles').classList.add('hide');
view.querySelector('.btnAudio').classList.add('hide');
view.querySelector('.osdTitle').innerHTML = '';
view.querySelector('.osdMediaInfo').innerHTML = '';
2019-02-12 10:01:11 -05:00
return;
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
enableProgressByTimeOfDay = shouldEnableProgressByTimeOfDay(item);
getDisplayItem(item).then(updateDisplayItem);
nowPlayingVolumeSlider.disabled = false;
nowPlayingPositionSlider.disabled = false;
btnFastForward.disabled = false;
btnRewind.disabled = false;
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
if (playbackManager.subtitleTracks(player).length) {
2020-05-04 12:44:12 +02:00
view.querySelector('.btnSubtitles').classList.remove('hide');
toggleSubtitleSync();
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
view.querySelector('.btnSubtitles').classList.add('hide');
toggleSubtitleSync('forceToHide');
2019-02-02 13:51:03 -05:00
}
if (playbackManager.audioTracks(player).length > 1) {
2020-05-04 12:44:12 +02:00
view.querySelector('.btnAudio').classList.remove('hide');
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
view.querySelector('.btnAudio').classList.add('hide');
2019-02-02 13:51:03 -05:00
}
2018-10-23 01:05:09 +03:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function setTitle(item, parentName) {
Emby.Page.setTitle(parentName || '');
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
var documentTitle = parentName || (item ? item.Name : null);
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (documentTitle) {
document.title = documentTitle;
}
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function setPoster(item, secondaryItem) {
2020-05-04 12:44:12 +02:00
var osdPoster = view.querySelector('.osdPoster');
2019-02-02 13:51:03 -05:00
if (item) {
var imgUrl = seriesImageUrl(item, {
2020-03-11 21:31:04 +01:00
maxWidth: osdPoster.clientWidth * 2,
2020-05-04 12:44:12 +02:00
type: 'Primary'
2019-02-02 13:51:03 -05:00
}) || seriesImageUrl(item, {
2020-03-11 21:31:04 +01:00
maxWidth: osdPoster.clientWidth * 2,
2020-05-04 12:44:12 +02:00
type: 'Thumb'
2019-02-02 13:51:03 -05:00
}) || imageUrl(item, {
2020-03-11 21:31:04 +01:00
maxWidth: osdPoster.clientWidth * 2,
2020-05-04 12:44:12 +02:00
type: 'Primary'
2019-02-02 13:51:03 -05:00
});
if (!imgUrl && secondaryItem && (imgUrl = seriesImageUrl(secondaryItem, {
2020-03-11 21:31:04 +01:00
maxWidth: osdPoster.clientWidth * 2,
2020-05-04 12:44:12 +02:00
type: 'Primary'
2019-02-02 13:51:03 -05:00
}) || seriesImageUrl(secondaryItem, {
2020-03-11 21:31:04 +01:00
maxWidth: osdPoster.clientWidth * 2,
2020-05-04 12:44:12 +02:00
type: 'Thumb'
2019-02-02 13:51:03 -05:00
}) || imageUrl(secondaryItem, {
2020-03-11 21:31:04 +01:00
maxWidth: osdPoster.clientWidth * 2,
2020-05-04 12:44:12 +02:00
type: 'Primary'
2019-02-02 13:51:03 -05:00
})), imgUrl) {
return void (osdPoster.innerHTML = '<img src="' + imgUrl + '" />');
}
}
2019-02-02 10:20:27 -05:00
2020-05-04 12:44:12 +02:00
osdPoster.innerHTML = '';
2019-02-02 13:51:03 -05:00
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function showOsd() {
slideDownToShow(headerElement);
showMainOsdControls();
startOsdHideTimer();
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function hideOsd() {
slideUpToHide(headerElement);
hideMainOsdControls();
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function toggleOsd() {
2020-05-04 12:44:12 +02:00
if ('osd' === currentVisibleMenu) {
2019-02-02 13:51:03 -05:00
hideOsd();
2019-02-12 10:01:11 -05:00
} else if (!currentVisibleMenu) {
2019-04-25 11:50:44 -04:00
showOsd();
2019-02-02 13:51:03 -05:00
}
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function startOsdHideTimer() {
stopOsdHideTimer();
osdHideTimeout = setTimeout(hideOsd, 3e3);
2018-10-23 01:05:09 +03:00
}
2019-02-02 13:51:03 -05:00
function stopOsdHideTimer() {
if (osdHideTimeout) {
clearTimeout(osdHideTimeout);
osdHideTimeout = null;
}
2018-10-23 01:05:09 +03:00
}
2019-02-02 13:51:03 -05:00
function slideDownToShow(elem) {
2020-05-04 12:44:12 +02:00
elem.classList.remove('osdHeader-hidden');
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function slideUpToHide(elem) {
2020-05-04 12:44:12 +02:00
elem.classList.add('osdHeader-hidden');
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function clearHideAnimationEventListeners(elem) {
dom.removeEventListener(elem, transitionEndEventName, onHideAnimationComplete, {
once: true
});
}
function onHideAnimationComplete(e) {
var elem = e.target;
if (elem != osdBottomElement)
return;
2020-05-04 12:44:12 +02:00
elem.classList.add('hide');
2019-02-02 13:51:03 -05:00
dom.removeEventListener(elem, transitionEndEventName, onHideAnimationComplete, {
once: true
});
}
function showMainOsdControls() {
2018-10-23 01:05:09 +03:00
if (!currentVisibleMenu) {
2019-02-02 13:51:03 -05:00
var elem = osdBottomElement;
2020-05-04 12:44:12 +02:00
currentVisibleMenu = 'osd';
2019-02-02 13:51:03 -05:00
clearHideAnimationEventListeners(elem);
2020-05-04 12:44:12 +02:00
elem.classList.remove('hide');
elem.classList.remove('videoOsdBottom-hidden');
2019-02-02 13:51:03 -05:00
if (!layoutManager.mobile) {
setTimeout(function () {
2020-05-04 12:44:12 +02:00
focusManager.focus(elem.querySelector('.btnPause'));
2019-02-02 13:51:03 -05:00
}, 50);
}
toggleSubtitleSync();
2018-10-23 01:05:09 +03:00
}
2019-02-02 13:51:03 -05:00
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function hideMainOsdControls() {
2020-05-04 12:44:12 +02:00
if ('osd' === currentVisibleMenu) {
2019-02-02 13:51:03 -05:00
var elem = osdBottomElement;
clearHideAnimationEventListeners(elem);
2020-05-04 12:44:12 +02:00
elem.classList.add('videoOsdBottom-hidden');
2019-02-02 13:51:03 -05:00
dom.addEventListener(elem, transitionEndEventName, onHideAnimationComplete, {
once: true
});
currentVisibleMenu = null;
2020-05-04 12:44:12 +02:00
toggleSubtitleSync('hide');
// Firefox does not blur by itself
if (document.activeElement) {
document.activeElement.blur();
}
2019-02-02 13:51:03 -05:00
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function onPointerMove(e) {
2020-05-04 12:44:12 +02:00
if ('mouse' === (e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse'))) {
2019-02-02 13:51:03 -05:00
var eventX = e.screenX || 0;
var eventY = e.screenY || 0;
var obj = lastPointerMoveData;
if (!obj) {
2019-02-12 10:01:11 -05:00
lastPointerMoveData = {
2019-02-02 13:51:03 -05:00
x: eventX,
y: eventY
2019-02-12 10:01:11 -05:00
};
return;
2019-02-02 13:51:03 -05:00
}
if (Math.abs(eventX - obj.x) < 10 && Math.abs(eventY - obj.y) < 10) {
return;
}
obj.x = eventX;
obj.y = eventY;
showOsd();
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function onInputCommand(e) {
var player = currentPlayer;
switch (e.detail.command) {
2020-05-04 12:44:12 +02:00
case 'left':
if ('osd' === currentVisibleMenu) {
showOsd();
} else {
if (!currentVisibleMenu) {
e.preventDefault();
playbackManager.rewind(player);
}
2019-02-02 13:51:03 -05:00
}
break;
2019-02-02 13:51:03 -05:00
2020-05-04 12:44:12 +02:00
case 'right':
if ('osd' === currentVisibleMenu) {
showOsd();
} else if (!currentVisibleMenu) {
e.preventDefault();
playbackManager.fastForward(player);
}
2019-02-02 13:51:03 -05:00
break;
2019-02-02 13:51:03 -05:00
2020-05-04 12:44:12 +02:00
case 'pageup':
playbackManager.nextChapter(player);
break;
2019-02-02 13:51:03 -05:00
2020-05-04 12:44:12 +02:00
case 'pagedown':
playbackManager.previousChapter(player);
break;
2019-02-02 13:51:03 -05:00
2020-05-04 12:44:12 +02:00
case 'up':
case 'down':
case 'select':
case 'menu':
case 'info':
case 'play':
case 'playpause':
case 'pause':
case 'fastforward':
case 'rewind':
case 'next':
case 'previous':
showOsd();
break;
2019-02-02 13:51:03 -05:00
2020-05-04 12:44:12 +02:00
case 'record':
onRecordingCommand();
showOsd();
break;
2019-02-02 13:51:03 -05:00
2020-05-04 12:44:12 +02:00
case 'togglestats':
toggleStats();
2019-02-02 13:51:03 -05:00
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function onRecordingCommand() {
2020-05-04 12:44:12 +02:00
var btnRecord = view.querySelector('.btnRecord');
2018-10-23 01:05:09 +03:00
2020-05-04 12:44:12 +02:00
if (!btnRecord.classList.contains('hide')) {
2019-02-02 13:51:03 -05:00
btnRecord.click();
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function updateFullscreenIcon() {
2020-05-04 12:44:12 +02:00
const button = view.querySelector('.btnFullscreen');
const icon = button.querySelector('.material-icons');
2020-05-02 14:02:44 +03:00
2020-05-04 12:44:12 +02:00
icon.classList.remove('fullscreen_exit', 'fullscreen');
2020-05-02 14:02:44 +03:00
2019-02-02 13:51:03 -05:00
if (playbackManager.isFullscreen(currentPlayer)) {
2020-05-04 12:44:12 +02:00
button.setAttribute('title', globalize.translate('ExitFullscreen') + ' (f)');
icon.classList.add('fullscreen_exit');
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
button.setAttribute('title', globalize.translate('Fullscreen') + ' (f)');
icon.classList.add('fullscreen');
2019-02-02 13:51:03 -05:00
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function onPlayerChange() {
bindToPlayer(playbackManager.getCurrentPlayer());
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function onStateChanged(event, state) {
var player = this;
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
if (state.NowPlayingItem) {
isEnabled = true;
updatePlayerStateInternal(event, player, state);
updatePlaylist(player);
enableStopOnBack(true);
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function onPlayPauseStateChanged(e) {
if (isEnabled) {
updatePlayPauseState(this.paused());
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function onVolumeChanged(e) {
if (isEnabled) {
var player = this;
updatePlayerVolumeState(player, player.isMuted(), player.getVolume());
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function onPlaybackStart(e, state) {
2020-05-04 12:44:12 +02:00
console.debug('nowplaying event: ' + e.type);
2019-02-02 13:51:03 -05:00
var player = this;
onStateChanged.call(player, e, state);
resetUpNextDialog();
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function resetUpNextDialog() {
comingUpNextDisplayed = false;
var dlg = currentUpNextDialog;
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
if (dlg) {
dlg.destroy();
currentUpNextDialog = null;
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function onPlaybackStopped(e, state) {
currentRuntimeTicks = null;
resetUpNextDialog();
2020-05-04 12:44:12 +02:00
console.debug('nowplaying event: ' + e.type);
2018-10-23 01:05:09 +03:00
2020-05-04 12:44:12 +02:00
if ('Video' !== state.NextMediaType) {
view.removeEventListener('viewbeforehide', onViewHideStopPlayback);
2019-02-02 13:51:03 -05:00
Emby.Page.back();
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function onMediaStreamsChanged(e) {
var player = this;
var state = playbackManager.getPlayerState(player);
onStateChanged.call(player, {
2020-05-04 12:44:12 +02:00
type: 'init'
2019-02-02 13:51:03 -05:00
}, state);
}
2019-02-02 10:20:27 -05:00
2019-09-12 21:24:16 +02:00
function onBeginFetch() {
2020-05-04 12:44:12 +02:00
document.querySelector('.osdMediaStatus').classList.remove('hide');
2019-09-12 21:24:16 +02:00
}
function onEndFetch() {
2020-05-04 12:44:12 +02:00
document.querySelector('.osdMediaStatus').classList.add('hide');
2019-09-12 21:24:16 +02:00
}
2019-02-02 13:51:03 -05:00
function bindToPlayer(player) {
2019-02-12 10:01:11 -05:00
if (player !== currentPlayer) {
releaseCurrentPlayer();
currentPlayer = player;
if (!player) return;
2019-02-02 13:51:03 -05:00
}
2019-02-12 10:01:11 -05:00
var state = playbackManager.getPlayerState(player);
onStateChanged.call(player, {
2020-05-04 12:44:12 +02:00
type: 'init'
2019-02-12 10:01:11 -05:00
}, state);
2020-05-04 12:44:12 +02:00
events.on(player, 'playbackstart', onPlaybackStart);
events.on(player, 'playbackstop', onPlaybackStopped);
events.on(player, 'volumechange', onVolumeChanged);
events.on(player, 'pause', onPlayPauseStateChanged);
events.on(player, 'unpause', onPlayPauseStateChanged);
events.on(player, 'timeupdate', onTimeUpdate);
events.on(player, 'fullscreenchange', updateFullscreenIcon);
events.on(player, 'mediastreamschange', onMediaStreamsChanged);
events.on(player, 'beginFetch', onBeginFetch);
events.on(player, 'endFetch', onEndFetch);
2019-02-12 10:01:11 -05:00
resetUpNextDialog();
2019-09-12 21:24:16 +02:00
if (player.isFetching) {
onBeginFetch();
}
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function releaseCurrentPlayer() {
destroyStats();
destroySubtitleSync();
2019-02-02 13:51:03 -05:00
resetUpNextDialog();
var player = currentPlayer;
if (player) {
2020-05-04 12:44:12 +02:00
events.off(player, 'playbackstart', onPlaybackStart);
events.off(player, 'playbackstop', onPlaybackStopped);
events.off(player, 'volumechange', onVolumeChanged);
events.off(player, 'pause', onPlayPauseStateChanged);
events.off(player, 'unpause', onPlayPauseStateChanged);
events.off(player, 'timeupdate', onTimeUpdate);
events.off(player, 'fullscreenchange', updateFullscreenIcon);
events.off(player, 'mediastreamschange', onMediaStreamsChanged);
2019-02-02 13:51:03 -05:00
currentPlayer = null;
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function onTimeUpdate(e) {
2020-03-22 19:30:02 +03:00
// Test for 'currentItem' is required for Firefox since its player spams 'timeupdate' events even being at breakpoint
if (isEnabled && currentItem) {
2019-02-02 13:51:03 -05:00
var now = new Date().getTime();
if (!(now - lastUpdateTime < 700)) {
lastUpdateTime = now;
var player = this;
currentRuntimeTicks = playbackManager.duration(player);
var currentTime = playbackManager.currentTime(player);
updateTimeDisplay(currentTime, currentRuntimeTicks, playbackManager.playbackStartTime(player), playbackManager.getBufferedRanges(player));
var item = currentItem;
refreshProgramInfoIfNeeded(player, item);
showComingUpNextIfNeeded(player, item, currentTime, currentRuntimeTicks);
}
}
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function showComingUpNextIfNeeded(player, currentItem, currentTimeTicks, runtimeTicks) {
2020-05-04 12:44:12 +02:00
if (runtimeTicks && currentTimeTicks && !comingUpNextDisplayed && !currentVisibleMenu && 'Episode' === currentItem.Type && userSettings.enableNextVideoInfoOverlay()) {
2019-02-02 13:51:03 -05:00
var showAtSecondsLeft = runtimeTicks >= 3e10 ? 40 : runtimeTicks >= 24e9 ? 35 : 30;
var showAtTicks = runtimeTicks - 1e3 * showAtSecondsLeft * 1e4;
var timeRemainingTicks = runtimeTicks - currentTimeTicks;
if (currentTimeTicks >= showAtTicks && runtimeTicks >= 6e9 && timeRemainingTicks >= 2e8) {
showComingUpNext(player);
}
}
2018-10-23 01:05:09 +03:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function onUpNextHidden() {
2020-05-04 12:44:12 +02:00
if ('upnext' === currentVisibleMenu) {
2019-02-02 13:51:03 -05:00
currentVisibleMenu = null;
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function showComingUpNext(player) {
2020-05-04 12:44:12 +02:00
require(['upNextDialog'], function (UpNextDialog) {
2019-02-02 13:51:03 -05:00
if (!(currentVisibleMenu || currentUpNextDialog)) {
2020-05-04 12:44:12 +02:00
currentVisibleMenu = 'upnext';
2019-02-02 13:51:03 -05:00
comingUpNextDisplayed = true;
playbackManager.nextItem(player).then(function (nextItem) {
currentUpNextDialog = new UpNextDialog({
2020-05-04 12:44:12 +02:00
parent: view.querySelector('.upNextContainer'),
2019-02-02 13:51:03 -05:00
player: player,
nextItem: nextItem
});
2020-05-04 12:44:12 +02:00
events.on(currentUpNextDialog, 'hide', onUpNextHidden);
2019-02-02 13:51:03 -05:00
}, onUpNextHidden);
}
2019-02-02 10:20:27 -05:00
});
2018-10-23 01:05:09 +03:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function refreshProgramInfoIfNeeded(player, item) {
2020-05-04 12:44:12 +02:00
if ('TvChannel' === item.Type) {
2019-02-02 13:51:03 -05:00
var program = item.CurrentProgram;
if (program && program.EndDate) {
try {
var endDate = datetime.parseISO8601Date(program.EndDate);
if (new Date().getTime() >= endDate.getTime()) {
2020-05-04 12:44:12 +02:00
console.debug('program info needs to be refreshed');
2019-02-02 13:51:03 -05:00
var state = playbackManager.getPlayerState(player);
onStateChanged.call(player, {
2020-05-04 12:44:12 +02:00
type: 'init'
2019-02-02 13:51:03 -05:00
}, state);
}
} catch (e) {
2020-05-04 12:44:12 +02:00
console.error('error parsing date: ' + program.EndDate);
2019-02-02 13:51:03 -05:00
}
}
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function updatePlayPauseState(isPaused) {
2020-05-04 12:44:12 +02:00
const btnPlayPause = view.querySelector('.btnPause');
const btnPlayPauseIcon = btnPlayPause.querySelector('.material-icons');
2020-05-02 14:02:44 +03:00
2020-05-04 12:44:12 +02:00
btnPlayPauseIcon.classList.remove('play_arrow', 'pause');
2020-05-02 14:02:44 +03:00
if (isPaused) {
2020-05-04 12:44:12 +02:00
btnPlayPauseIcon.classList.add('play_arrow');
btnPlayPause.setAttribute('title', globalize.translate('ButtonPlay') + ' (k)');
} else {
2020-05-04 12:44:12 +02:00
btnPlayPauseIcon.classList.add('pause');
btnPlayPause.setAttribute('title', globalize.translate('ButtonPause') + ' (k)');
}
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function updatePlayerStateInternal(event, player, state) {
var playState = state.PlayState || {};
updatePlayPauseState(playState.IsPaused);
var supportedCommands = playbackManager.getSupportedCommands(player);
currentPlayerSupportedCommands = supportedCommands;
2020-05-04 12:44:12 +02:00
supportsBrightnessChange = -1 !== supportedCommands.indexOf('SetBrightness');
2019-02-02 13:51:03 -05:00
updatePlayerVolumeState(player, playState.IsMuted, playState.VolumeLevel);
if (nowPlayingPositionSlider && !nowPlayingPositionSlider.dragging) {
nowPlayingPositionSlider.disabled = !playState.CanSeek;
2018-10-23 01:05:09 +03:00
}
2019-02-02 13:51:03 -05:00
btnFastForward.disabled = !playState.CanSeek;
btnRewind.disabled = !playState.CanSeek;
var nowPlayingItem = state.NowPlayingItem || {};
playbackStartTimeTicks = playState.PlaybackStartTimeTicks;
updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks, playState.PlaybackStartTimeTicks, playState.BufferedRanges || []);
updateNowPlayingInfo(player, state);
2018-10-23 01:05:09 +03:00
2020-05-04 12:44:12 +02:00
if (state.MediaSource && state.MediaSource.SupportsTranscoding && -1 !== supportedCommands.indexOf('SetMaxStreamingBitrate')) {
view.querySelector('.btnVideoOsdSettings').classList.remove('hide');
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
view.querySelector('.btnVideoOsdSettings').classList.add('hide');
2019-02-02 13:51:03 -05:00
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
var isProgressClear = state.MediaSource && null == state.MediaSource.RunTimeTicks;
nowPlayingPositionSlider.setIsClear(isProgressClear);
2018-10-23 01:05:09 +03:00
if (nowPlayingItem.RunTimeTicks) {
2019-11-13 00:30:33 +03:00
nowPlayingPositionSlider.setKeyboardSteps(userSettings.skipBackLength() * 1000000 / nowPlayingItem.RunTimeTicks,
userSettings.skipForwardLength() * 1000000 / nowPlayingItem.RunTimeTicks);
}
2020-05-04 12:44:12 +02:00
if (-1 === supportedCommands.indexOf('ToggleFullscreen') || player.isLocalPlayer && layoutManager.tv && playbackManager.isFullscreen(player)) {
view.querySelector('.btnFullscreen').classList.add('hide');
2018-10-23 01:05:09 +03:00
} else {
2020-05-04 12:44:12 +02:00
view.querySelector('.btnFullscreen').classList.remove('hide');
2018-10-23 01:05:09 +03:00
}
2020-05-04 12:44:12 +02:00
if (-1 === supportedCommands.indexOf('PictureInPicture')) {
view.querySelector('.btnPip').classList.add('hide');
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
view.querySelector('.btnPip').classList.remove('hide');
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2020-05-04 12:44:12 +02:00
if (-1 === supportedCommands.indexOf('AirPlay')) {
view.querySelector('.btnAirPlay').classList.add('hide');
2020-01-10 11:31:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
view.querySelector('.btnAirPlay').classList.remove('hide');
2020-01-10 11:31:03 -05:00
}
2019-02-02 13:51:03 -05:00
updateFullscreenIcon();
2018-10-23 01:05:09 +03:00
}
2019-02-02 13:51:03 -05:00
function getDisplayPercentByTimeOfDay(programStartDateMs, programRuntimeMs, currentTimeMs) {
return (currentTimeMs - programStartDateMs) / programRuntimeMs * 100;
2018-10-23 01:05:09 +03:00
}
2019-02-02 13:51:03 -05:00
function updateTimeDisplay(positionTicks, runtimeTicks, playbackStartTimeTicks, bufferedRanges) {
if (enableProgressByTimeOfDay) {
if (nowPlayingPositionSlider && !nowPlayingPositionSlider.dragging) {
if (programStartDateMs && programEndDateMs) {
var currentTimeMs = (playbackStartTimeTicks + (positionTicks || 0)) / 1e4;
var programRuntimeMs = programEndDateMs - programStartDateMs;
if (nowPlayingPositionSlider.value = getDisplayPercentByTimeOfDay(programStartDateMs, programRuntimeMs, currentTimeMs), bufferedRanges.length) {
var rangeStart = getDisplayPercentByTimeOfDay(programStartDateMs, programRuntimeMs, (playbackStartTimeTicks + (bufferedRanges[0].start || 0)) / 1e4);
var rangeEnd = getDisplayPercentByTimeOfDay(programStartDateMs, programRuntimeMs, (playbackStartTimeTicks + (bufferedRanges[0].end || 0)) / 1e4);
nowPlayingPositionSlider.setBufferedRanges([{
start: rangeStart,
end: rangeEnd
}]);
} else {
nowPlayingPositionSlider.setBufferedRanges([]);
}
} else {
nowPlayingPositionSlider.value = 0;
nowPlayingPositionSlider.setBufferedRanges([]);
}
}
2020-05-04 12:44:12 +02:00
nowPlayingPositionText.innerHTML = '';
nowPlayingDurationText.innerHTML = '';
2019-02-02 13:51:03 -05:00
} else {
if (nowPlayingPositionSlider && !nowPlayingPositionSlider.dragging) {
if (runtimeTicks) {
var pct = positionTicks / runtimeTicks;
pct *= 100;
nowPlayingPositionSlider.value = pct;
} else {
nowPlayingPositionSlider.value = 0;
}
2020-05-04 12:44:12 +02:00
if (runtimeTicks && null != positionTicks && currentRuntimeTicks && !enableProgressByTimeOfDay && currentItem.RunTimeTicks && 'Recording' !== currentItem.Type) {
endsAtText.innerHTML = '&nbsp;&nbsp;-&nbsp;&nbsp;' + mediaInfo.getEndsAtFromPosition(runtimeTicks, positionTicks, true);
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
endsAtText.innerHTML = '';
2019-02-02 13:51:03 -05:00
}
}
if (nowPlayingPositionSlider) {
nowPlayingPositionSlider.setBufferedRanges(bufferedRanges, runtimeTicks, positionTicks);
}
updateTimeText(nowPlayingPositionText, positionTicks);
updateTimeText(nowPlayingDurationText, runtimeTicks, true);
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function updatePlayerVolumeState(player, isMuted, volumeLevel) {
var supportedCommands = currentPlayerSupportedCommands;
var showMuteButton = true;
var showVolumeSlider = true;
2018-10-23 01:05:09 +03:00
2020-05-04 12:44:12 +02:00
if (-1 === supportedCommands.indexOf('Mute')) {
2019-02-02 13:51:03 -05:00
showMuteButton = false;
}
2020-05-04 12:44:12 +02:00
if (-1 === supportedCommands.indexOf('SetVolume')) {
2019-02-02 13:51:03 -05:00
showVolumeSlider = false;
}
2019-02-02 10:20:27 -05:00
2020-05-04 12:44:12 +02:00
if (player.isLocalPlayer && appHost.supports('physicalvolumecontrol')) {
2019-02-02 13:51:03 -05:00
showMuteButton = false;
showVolumeSlider = false;
}
2019-02-02 10:20:27 -05:00
2020-05-04 12:44:12 +02:00
const buttonMute = view.querySelector('.buttonMute');
const buttonMuteIcon = buttonMute.querySelector('.material-icons');
2020-05-02 14:02:44 +03:00
2020-05-04 12:44:12 +02:00
buttonMuteIcon.classList.remove('volume_off', 'volume_up');
2020-05-02 14:02:44 +03:00
2019-02-02 13:51:03 -05:00
if (isMuted) {
2020-05-04 12:44:12 +02:00
buttonMute.setAttribute('title', globalize.translate('Unmute') + ' (m)');
buttonMuteIcon.classList.add('volume_off');
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
buttonMute.setAttribute('title', globalize.translate('Mute') + ' (m)');
buttonMuteIcon.classList.add('volume_up');
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (showMuteButton) {
2020-05-04 12:44:12 +02:00
buttonMute.classList.remove('hide');
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
buttonMute.classList.add('hide');
2019-02-02 13:51:03 -05:00
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
if (nowPlayingVolumeSlider) {
if (showVolumeSlider) {
2020-05-04 12:44:12 +02:00
nowPlayingVolumeSliderContainer.classList.remove('hide');
2019-02-02 13:51:03 -05:00
} else {
2020-05-04 12:44:12 +02:00
nowPlayingVolumeSliderContainer.classList.add('hide');
2019-02-02 13:51:03 -05:00
}
if (!nowPlayingVolumeSlider.dragging) {
nowPlayingVolumeSlider.value = volumeLevel || 0;
}
}
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function updatePlaylist(player) {
2020-05-04 12:44:12 +02:00
var btnPreviousTrack = view.querySelector('.btnPreviousTrack');
var btnNextTrack = view.querySelector('.btnNextTrack');
btnPreviousTrack.classList.remove('hide');
btnNextTrack.classList.remove('hide');
2019-02-02 13:51:03 -05:00
btnNextTrack.disabled = false;
btnPreviousTrack.disabled = false;
2018-10-23 01:05:09 +03:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function updateTimeText(elem, ticks, divider) {
if (null == ticks) {
2020-05-04 12:44:12 +02:00
elem.innerHTML = '';
2019-02-12 10:01:11 -05:00
return;
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
var html = datetime.getDisplayRunningTime(ticks);
if (divider) {
2020-05-04 12:44:12 +02:00
html = '&nbsp;/&nbsp;' + html;
2019-02-02 13:51:03 -05:00
}
elem.innerHTML = html;
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function onSettingsButtonClick(e) {
var btn = this;
2020-05-04 12:44:12 +02:00
require(['playerSettingsMenu'], function (playerSettingsMenu) {
2019-02-02 13:51:03 -05:00
var player = currentPlayer;
if (player) {
// show subtitle offset feature only if player and media support it
2019-10-03 02:36:33 +09:00
var showSubOffset = playbackManager.supportSubtitleOffset(player) &&
playbackManager.canHandleOffsetOnCurrentSubtitle(player);
2019-02-02 13:51:03 -05:00
playerSettingsMenu.show({
2020-05-04 12:44:12 +02:00
mediaType: 'Video',
2019-02-02 13:51:03 -05:00
player: player,
positionTo: btn,
stats: true,
suboffset: showSubOffset,
2019-02-02 13:51:03 -05:00
onOption: onSettingsOption
});
}
2018-10-23 01:05:09 +03:00
});
}
2019-02-02 13:51:03 -05:00
function onSettingsOption(selectedOption) {
2020-05-04 12:44:12 +02:00
if ('stats' === selectedOption) {
2019-02-02 13:51:03 -05:00
toggleStats();
2020-05-04 12:44:12 +02:00
} else if ('suboffset' === selectedOption) {
var player = currentPlayer;
if (player) {
playbackManager.enableShowingSubtitleOffset(player);
toggleSubtitleSync();
}
2019-02-02 13:51:03 -05:00
}
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
function toggleStats() {
2020-05-04 12:44:12 +02:00
require(['playerStats'], function (PlayerStats) {
2019-02-02 13:51:03 -05:00
var player = currentPlayer;
if (player) {
if (statsOverlay) {
statsOverlay.toggle();
} else {
statsOverlay = new PlayerStats({
player: player
});
}
}
});
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function destroyStats() {
if (statsOverlay) {
statsOverlay.destroy();
statsOverlay = null;
}
2018-10-23 01:05:09 +03:00
}
2019-02-02 13:51:03 -05:00
function showAudioTrackSelection() {
var player = currentPlayer;
var audioTracks = playbackManager.audioTracks(player);
var currentIndex = playbackManager.getAudioStreamIndex(player);
var menuItems = audioTracks.map(function (stream) {
var opt = {
name: stream.DisplayTitle,
id: stream.Index
};
if (stream.Index === currentIndex) {
opt.selected = true;
}
return opt;
});
var positionTo = this;
2020-05-04 12:44:12 +02:00
require(['actionsheet'], function (actionsheet) {
2019-02-02 13:51:03 -05:00
actionsheet.show({
items: menuItems,
2020-05-04 12:44:12 +02:00
title: globalize.translate('Audio'),
2019-02-02 13:51:03 -05:00
positionTo: positionTo
}).then(function (id) {
var index = parseInt(id);
if (index !== currentIndex) {
playbackManager.setAudioStreamIndex(index, player);
}
});
});
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function showSubtitleTrackSelection() {
var player = currentPlayer;
var streams = playbackManager.subtitleTracks(player);
var currentIndex = playbackManager.getSubtitleStreamIndex(player);
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (null == currentIndex) {
currentIndex = -1;
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
streams.unshift({
Index: -1,
2020-05-04 12:44:12 +02:00
DisplayTitle: globalize.translate('Off')
2019-02-02 13:51:03 -05:00
});
var menuItems = streams.map(function (stream) {
var opt = {
name: stream.DisplayTitle,
id: stream.Index
};
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (stream.Index === currentIndex) {
opt.selected = true;
}
2018-10-23 01:05:09 +03:00
2019-02-02 13:51:03 -05:00
return opt;
});
var positionTo = this;
2020-05-04 12:44:12 +02:00
require(['actionsheet'], function (actionsheet) {
2019-02-02 13:51:03 -05:00
actionsheet.show({
2020-05-04 12:44:12 +02:00
title: globalize.translate('Subtitles'),
2019-02-02 13:51:03 -05:00
items: menuItems,
positionTo: positionTo
}).then(function (id) {
var index = parseInt(id);
if (index !== currentIndex) {
playbackManager.setSubtitleStreamIndex(index, player);
}
2019-10-03 02:36:33 +09:00
toggleSubtitleSync();
2019-02-02 13:51:03 -05:00
});
});
}
2019-02-02 10:20:27 -05:00
function toggleSubtitleSync(action) {
2020-05-04 12:44:12 +02:00
require(['subtitleSync'], function (SubtitleSync) {
var player = currentPlayer;
if (subtitleSyncOverlay) {
subtitleSyncOverlay.toggle(action);
} else if (player) {
subtitleSyncOverlay = new SubtitleSync(player);
}
});
}
function destroySubtitleSync() {
if (subtitleSyncOverlay) {
subtitleSyncOverlay.destroy();
subtitleSyncOverlay = null;
}
}
/**
* Clicked element.
* To skip 'click' handling on Firefox/Edge.
*/
var clickedElement;
2019-02-02 13:51:03 -05:00
function onWindowKeyDown(e) {
clickedElement = e.srcElement;
var key = keyboardnavigation.getKeyName(e);
if (!currentVisibleMenu && 32 === e.keyCode) {
2019-02-02 13:51:03 -05:00
playbackManager.playPause(currentPlayer);
2019-11-18 17:31:09 +03:00
showOsd();
return;
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2020-02-05 15:20:48 +03:00
if (layoutManager.tv && keyboardnavigation.isNavigationKey(key)) {
2019-11-18 17:31:09 +03:00
showOsd();
return;
}
switch (key) {
2020-05-04 12:44:12 +02:00
case 'Enter':
2020-01-17 12:09:27 +03:00
showOsd();
break;
2020-05-04 12:44:12 +02:00
case 'Escape':
case 'Back':
2020-01-17 12:09:27 +03:00
// Ignore key when some dialog is opened
2020-05-04 12:44:12 +02:00
if (currentVisibleMenu === 'osd' && !document.querySelector('.dialogContainer')) {
2020-01-17 12:09:27 +03:00
hideOsd();
e.stopPropagation();
}
break;
2020-05-04 12:44:12 +02:00
case 'k':
playbackManager.playPause(currentPlayer);
showOsd();
break;
case 'ArrowUp':
case 'Up':
playbackManager.volumeUp(currentPlayer);
break;
case 'ArrowDown':
case 'Down':
playbackManager.volumeDown(currentPlayer);
break;
2020-05-04 12:44:12 +02:00
case 'l':
case 'ArrowRight':
case 'Right':
playbackManager.fastForward(currentPlayer);
showOsd();
break;
2020-05-04 12:44:12 +02:00
case 'j':
case 'ArrowLeft':
case 'Left':
playbackManager.rewind(currentPlayer);
showOsd();
break;
2020-05-04 12:44:12 +02:00
case 'f':
if (!e.ctrlKey && !e.metaKey) {
playbackManager.toggleFullscreen(currentPlayer);
showOsd();
}
break;
2020-05-04 12:44:12 +02:00
case 'm':
playbackManager.toggleMute(currentPlayer);
showOsd();
break;
case 'p':
case 'P':
if (e.shiftKey) {
playbackManager.previousTrack(currentPlayer);
}
break;
case 'n':
case 'N':
if (e.shiftKey) {
playbackManager.nextTrack(currentPlayer);
}
break;
2020-05-04 12:44:12 +02:00
case 'NavigationLeft':
case 'GamepadDPadLeft':
case 'GamepadLeftThumbstickLeft':
2020-01-24 16:44:45 +03:00
// Ignores gamepad events that are always triggered, even when not focused.
if (document.hasFocus()) { /* eslint-disable-line compat/compat */
playbackManager.rewind(currentPlayer);
showOsd();
}
break;
2020-05-04 12:44:12 +02:00
case 'NavigationRight':
case 'GamepadDPadRight':
case 'GamepadLeftThumbstickRight':
2020-01-24 16:44:45 +03:00
// Ignores gamepad events that are always triggered, even when not focused.
if (document.hasFocus()) { /* eslint-disable-line compat/compat */
playbackManager.fastForward(currentPlayer);
showOsd();
}
2020-05-04 18:13:34 +02:00
break;
case 'Home':
playbackManager.seekPercent(0, currentPlayer);
break;
case 'End':
playbackManager.seekPercent(100, currentPlayer);
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
2020-05-04 18:09:10 +02:00
var percent = parseInt(key, 10) * 10;
playbackManager.seekPercent(percent, currentPlayer);
break;
2019-02-02 13:51:03 -05:00
}
}
2019-02-02 10:20:27 -05:00
function onWindowMouseDown(e) {
clickedElement = e.srcElement;
}
function onWindowTouchStart(e) {
clickedElement = e.srcElement;
}
2019-02-02 13:51:03 -05:00
function getImgUrl(item, chapter, index, maxWidth, apiClient) {
if (chapter.ImageTag) {
return apiClient.getScaledImageUrl(item.Id, {
maxWidth: maxWidth,
tag: chapter.ImageTag,
2020-05-04 12:44:12 +02:00
type: 'Chapter',
2019-02-02 13:51:03 -05:00
index: index
});
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
return null;
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function getChapterBubbleHtml(apiClient, item, chapters, positionTicks) {
var chapter;
var index = -1;
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
for (var i = 0, length = chapters.length; i < length; i++) {
var currentChapter = chapters[i];
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (positionTicks >= currentChapter.StartPositionTicks) {
chapter = currentChapter;
index = i;
}
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (!chapter) {
return null;
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
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;
2020-05-04 12:44:12 +02:00
html += '</div>';
2019-02-02 13:51:03 -05:00
html += '<h2 class="chapterThumbText">';
html += datetime.getDisplayRunningTime(positionTicks);
2020-05-04 12:44:12 +02:00
html += '</h2>';
html += '</div>';
return html + '</div>';
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
return null;
}
2019-02-02 10:20:27 -05:00
var playPauseClickTimeout;
2019-02-02 13:51:03 -05:00
function onViewHideStopPlayback() {
if (playbackManager.isPlayingVideo()) {
require(['shell'], function (shell) {
shell.disableFullscreen();
});
2019-02-02 10:20:27 -05:00
clearTimeout(playPauseClickTimeout);
2019-02-02 13:51:03 -05:00
var player = currentPlayer;
2020-05-04 12:44:12 +02:00
view.removeEventListener('viewbeforehide', onViewHideStopPlayback);
2019-02-02 13:51:03 -05:00
releaseCurrentPlayer();
playbackManager.stop(player);
}
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
function enableStopOnBack(enabled) {
2020-05-04 12:44:12 +02:00
view.removeEventListener('viewbeforehide', onViewHideStopPlayback);
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (enabled && playbackManager.isPlayingVideo(currentPlayer)) {
2020-05-04 12:44:12 +02:00
view.addEventListener('viewbeforehide', onViewHideStopPlayback);
2019-02-02 13:51:03 -05:00
}
2018-10-23 01:05:09 +03:00
}
2019-02-02 10:20:27 -05:00
require(['shell'], function (shell) {
2019-02-02 13:51:03 -05:00
shell.enableFullscreen();
});
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
var currentPlayer;
var comingUpNextDisplayed;
var currentUpNextDialog;
var isEnabled;
var currentItem;
var recordingButtonManager;
var enableProgressByTimeOfDay;
var supportsBrightnessChange;
var currentVisibleMenu;
var statsOverlay;
var osdHideTimeout;
var lastPointerMoveData;
var self = this;
var currentPlayerSupportedCommands = [];
var currentRuntimeTicks = 0;
var lastUpdateTime = 0;
var programStartDateMs = 0;
var programEndDateMs = 0;
var playbackStartTimeTicks = 0;
var subtitleSyncOverlay;
2020-05-04 12:44:12 +02:00
var nowPlayingVolumeSlider = view.querySelector('.osdVolumeSlider');
var nowPlayingVolumeSliderContainer = view.querySelector('.osdVolumeSliderContainer');
var nowPlayingPositionSlider = view.querySelector('.osdPositionSlider');
var nowPlayingPositionText = view.querySelector('.osdPositionText');
var nowPlayingDurationText = view.querySelector('.osdDurationText');
var startTimeText = view.querySelector('.startTimeText');
var endTimeText = view.querySelector('.endTimeText');
var endsAtText = view.querySelector('.endsAtText');
var btnRewind = view.querySelector('.btnRewind');
var btnFastForward = view.querySelector('.btnFastForward');
2019-02-02 13:51:03 -05:00
var transitionEndEventName = dom.whichTransitionEvent();
2020-05-04 12:44:12 +02:00
var headerElement = document.querySelector('.skinHeader');
var osdBottomElement = document.querySelector('.videoOsdBottom-maincontrols');
if (layoutManager.tv) {
2020-05-04 12:44:12 +02:00
nowPlayingPositionSlider.classList.add('focusable');
nowPlayingPositionSlider.enableKeyboardDragging();
}
2020-05-04 12:44:12 +02:00
view.addEventListener('viewbeforeshow', function (e) {
headerElement.classList.add('osdHeader');
Emby.Page.setTransparency('full');
2019-02-02 13:51:03 -05:00
});
2020-05-04 12:44:12 +02:00
view.addEventListener('viewshow', function (e) {
2019-05-05 12:09:55 -04:00
try {
2020-05-04 12:44:12 +02:00
events.on(playbackManager, 'playerchange', onPlayerChange);
2019-05-05 12:09:55 -04:00
bindToPlayer(playbackManager.getCurrentPlayer());
2020-05-04 12:44:12 +02:00
dom.addEventListener(document, window.PointerEvent ? 'pointermove' : 'mousemove', onPointerMove, {
2019-05-05 12:09:55 -04:00
passive: true
});
showOsd();
inputManager.on(window, onInputCommand);
2020-05-04 12:44:12 +02:00
dom.addEventListener(window, 'keydown', onWindowKeyDown, {
2020-01-17 12:09:27 +03:00
capture: true
2019-05-05 12:09:55 -04:00
});
2020-05-04 12:44:12 +02:00
dom.addEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, {
passive: true
});
2020-05-04 12:44:12 +02:00
dom.addEventListener(window, 'touchstart', onWindowTouchStart, {
passive: true
});
} catch (e) {
2019-05-05 12:09:55 -04:00
require(['appRouter'], function(appRouter) {
2020-06-26 16:59:21 +02:00
appRouter.goHome();
2019-05-05 12:09:55 -04:00
});
}
2019-02-02 13:51:03 -05:00
});
2020-05-04 12:44:12 +02:00
view.addEventListener('viewbeforehide', function () {
2019-02-02 13:51:03 -05:00
if (statsOverlay) {
statsOverlay.enabled(false);
}
2020-05-04 12:44:12 +02:00
dom.removeEventListener(window, 'keydown', onWindowKeyDown, {
2020-01-17 12:09:27 +03:00
capture: true
2019-02-02 13:51:03 -05:00
});
2020-05-04 12:44:12 +02:00
dom.removeEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, {
passive: true
});
2020-05-04 12:44:12 +02:00
dom.removeEventListener(window, 'touchstart', onWindowTouchStart, {
passive: true
});
2019-02-02 13:51:03 -05:00
stopOsdHideTimer();
2020-05-04 12:44:12 +02:00
headerElement.classList.remove('osdHeader');
headerElement.classList.remove('osdHeader-hidden');
dom.removeEventListener(document, window.PointerEvent ? 'pointermove' : 'mousemove', onPointerMove, {
2019-02-02 13:51:03 -05:00
passive: true
});
inputManager.off(window, onInputCommand);
2020-05-04 12:44:12 +02:00
events.off(playbackManager, 'playerchange', onPlayerChange);
2019-02-02 13:51:03 -05:00
releaseCurrentPlayer();
});
2020-05-04 12:44:12 +02:00
view.querySelector('.btnFullscreen').addEventListener('click', function () {
2019-02-02 13:51:03 -05:00
playbackManager.toggleFullscreen(currentPlayer);
});
2020-05-04 12:44:12 +02:00
view.querySelector('.btnPip').addEventListener('click', function () {
2019-02-02 13:51:03 -05:00
playbackManager.togglePictureInPicture(currentPlayer);
});
2020-05-04 12:44:12 +02:00
view.querySelector('.btnAirPlay').addEventListener('click', function () {
2020-01-10 11:31:03 -05:00
playbackManager.toggleAirPlay(currentPlayer);
});
2020-05-04 12:44:12 +02:00
view.querySelector('.btnVideoOsdSettings').addEventListener('click', onSettingsButtonClick);
view.addEventListener('viewhide', function () {
headerElement.classList.remove('hide');
2019-02-02 13:51:03 -05:00
});
2020-05-04 12:44:12 +02:00
view.addEventListener('viewdestroy', function () {
2019-02-02 13:51:03 -05:00
if (self.touchHelper) {
self.touchHelper.destroy();
self.touchHelper = null;
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (recordingButtonManager) {
recordingButtonManager.destroy();
recordingButtonManager = null;
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
destroyStats();
destroySubtitleSync();
2019-02-02 13:51:03 -05:00
});
var lastPointerDown = 0;
2020-05-04 12:44:12 +02:00
dom.addEventListener(view, window.PointerEvent ? 'pointerdown' : 'click', function (e) {
if (dom.parentWithClass(e.target, ['videoOsdBottom', 'upNextContainer'])) {
2019-02-02 13:51:03 -05:00
return void showOsd();
}
2019-02-02 10:20:27 -05:00
2020-05-04 12:44:12 +02:00
var pointerType = e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse');
2019-02-02 13:51:03 -05:00
var now = new Date().getTime();
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
switch (pointerType) {
2020-05-04 12:44:12 +02:00
case 'touch':
if (now - lastPointerDown > 300) {
lastPointerDown = now;
toggleOsd();
}
2019-02-02 10:20:27 -05:00
break;
2019-02-02 10:20:27 -05:00
2020-05-04 12:44:12 +02:00
case 'mouse':
if (!e.button) {
if (playPauseClickTimeout) {
clearTimeout(playPauseClickTimeout);
playPauseClickTimeout = 0;
} else {
playPauseClickTimeout = setTimeout(function() {
playbackManager.playPause(currentPlayer);
showOsd();
playPauseClickTimeout = 0;
}, 300);
}
}
2019-02-02 10:20:27 -05:00
break;
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
default:
playbackManager.playPause(currentPlayer);
showOsd();
2019-02-02 13:51:03 -05:00
}
}, {
passive: true
});
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (browser.touch) {
2020-05-04 12:44:12 +02:00
dom.addEventListener(view, 'dblclick', onDoubleClick, {});
2019-04-25 11:50:44 -04:00
} else {
var options = { passive: true };
2020-05-04 12:44:12 +02:00
dom.addEventListener(view, 'dblclick', function () {
playbackManager.toggleFullscreen(currentPlayer);
}, options);
2019-02-02 10:20:27 -05:00
}
2020-02-19 11:10:12 +03:00
function setVolume() {
playbackManager.setVolume(this.value, currentPlayer);
2020-02-19 11:10:12 +03:00
}
2020-05-04 12:44:12 +02:00
view.querySelector('.buttonMute').addEventListener('click', function () {
2020-02-19 11:10:12 +03:00
playbackManager.toggleMute(currentPlayer);
});
2020-05-04 12:44:12 +02:00
nowPlayingVolumeSlider.addEventListener('change', setVolume);
nowPlayingVolumeSlider.addEventListener('mousemove', setVolume);
nowPlayingVolumeSlider.addEventListener('touchmove', setVolume);
2020-05-04 12:44:12 +02:00
nowPlayingPositionSlider.addEventListener('change', function () {
2019-02-02 13:51:03 -05:00
var player = currentPlayer;
if (player) {
var newPercent = parseFloat(this.value);
if (enableProgressByTimeOfDay) {
var seekAirTimeTicks = newPercent / 100 * (programEndDateMs - programStartDateMs) * 1e4;
seekAirTimeTicks += 1e4 * programStartDateMs;
seekAirTimeTicks -= playbackStartTimeTicks;
playbackManager.seek(seekAirTimeTicks, player);
} else {
playbackManager.seekPercent(newPercent, player);
}
}
});
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
nowPlayingPositionSlider.getBubbleHtml = function (value) {
2019-02-12 10:01:11 -05:00
showOsd();
if (enableProgressByTimeOfDay) {
2019-02-02 13:51:03 -05:00
if (programStartDateMs && programEndDateMs) {
var ms = programEndDateMs - programStartDateMs;
ms /= 100;
ms *= value;
ms += programStartDateMs;
2020-05-04 12:44:12 +02:00
return '<h1 class="sliderBubbleText">' + getDisplayTimeWithoutAmPm(new Date(parseInt(ms)), true) + '</h1>';
2019-02-02 13:51:03 -05:00
}
2020-05-04 12:44:12 +02:00
return '--:--';
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (!currentRuntimeTicks) {
2020-05-04 12:44:12 +02:00
return '--:--';
2019-02-02 13:51:03 -05:00
}
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
var ticks = currentRuntimeTicks;
ticks /= 100;
ticks *= value;
var item = currentItem;
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (item && item.Chapters && item.Chapters.length && item.Chapters[0].ImageTag) {
var html = getChapterBubbleHtml(connectionManager.getApiClient(item.ServerId), item, item.Chapters, ticks);
2019-02-02 10:20:27 -05:00
2019-02-02 13:51:03 -05:00
if (html) {
return html;
}
}
2019-02-02 10:20:27 -05:00
2020-05-04 12:44:12 +02:00
return '<h1 class="sliderBubbleText">' + datetime.getDisplayRunningTime(ticks) + '</h1>';
2019-02-02 13:51:03 -05:00
};
2019-02-02 10:20:27 -05:00
2020-05-04 12:44:12 +02:00
view.querySelector('.btnPreviousTrack').addEventListener('click', function () {
2019-02-02 13:51:03 -05:00
playbackManager.previousTrack(currentPlayer);
2018-10-23 01:05:09 +03:00
});
2020-05-04 12:44:12 +02:00
view.querySelector('.btnPause').addEventListener('click', function () {
// Ignore 'click' if another element was originally clicked (Firefox/Edge issue)
if (this.contains(clickedElement)) {
playbackManager.playPause(currentPlayer);
}
2019-02-02 13:51:03 -05:00
});
2020-05-04 12:44:12 +02:00
view.querySelector('.btnNextTrack').addEventListener('click', function () {
2019-02-02 13:51:03 -05:00
playbackManager.nextTrack(currentPlayer);
});
2020-05-04 12:44:12 +02:00
btnRewind.addEventListener('click', function () {
2019-02-02 13:51:03 -05:00
playbackManager.rewind(currentPlayer);
});
2020-05-04 12:44:12 +02:00
btnFastForward.addEventListener('click', function () {
2019-02-02 13:51:03 -05:00
playbackManager.fastForward(currentPlayer);
});
2020-05-04 12:44:12 +02:00
view.querySelector('.btnAudio').addEventListener('click', showAudioTrackSelection);
view.querySelector('.btnSubtitles').addEventListener('click', showSubtitleTrackSelection);
2019-02-02 13:51:03 -05:00
if (browser.touch) {
(function () {
2020-05-04 12:44:12 +02:00
require(['touchHelper'], function (TouchHelper) {
2019-02-02 13:51:03 -05:00
self.touchHelper = new TouchHelper(view, {
swipeYThreshold: 30,
triggerOnMove: true,
preventDefaultOnMove: true,
2020-05-04 12:44:12 +02:00
ignoreTagNames: ['BUTTON', 'INPUT', 'TEXTAREA']
2019-02-02 13:51:03 -05:00
});
2020-05-04 12:44:12 +02:00
events.on(self.touchHelper, 'swipeup', onVerticalSwipe);
events.on(self.touchHelper, 'swipedown', onVerticalSwipe);
2019-02-02 13:51:03 -05:00
});
})();
}
};
2019-02-02 10:20:27 -05:00
});