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

Merge branch 'master' into fix-subtitle-line-spacing

This commit is contained in:
Dmitry Lyzo 2020-08-06 20:11:47 +03:00 committed by GitHub
commit f712d9c238
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
191 changed files with 6658 additions and 8080 deletions

View file

@ -2,6 +2,7 @@ import connectionManager from 'connectionManager';
import loading from 'loading';
import keyboardnavigation from 'keyboardnavigation';
import dialogHelper from 'dialogHelper';
import dom from 'dom';
import events from 'events';
import 'css!./style';
import 'material-icons';
@ -93,23 +94,22 @@ export class BookPlayer {
onWindowKeyUp(e) {
let key = keyboardnavigation.getKeyName(e);
let rendition = this._rendition;
// TODO: depending on the event this can be the document or the rendition itself
let rendition = this._rendition || this;
let book = rendition.book;
if (this._loaded === false) return;
switch (key) {
case 'l':
case 'ArrowRight':
case 'Right':
if (this._loaded) {
book.package.metadata.direction === 'rtl' ? rendition.prev() : rendition.next();
}
book.package.metadata.direction === 'rtl' ? rendition.prev() : rendition.next();
break;
case 'j':
case 'ArrowLeft':
case 'Left':
if (this._loaded) {
book.package.metadata.direction === 'rtl' ? rendition.next() : rendition.prev();
}
book.package.metadata.direction === 'rtl' ? rendition.next() : rendition.prev();
break;
case 'Escape':
if (this._tocElement) {
@ -123,6 +123,25 @@ export class BookPlayer {
}
}
onTouchStart(e) {
// TODO: depending on the event this can be the document or the rendition itself
let rendition = this._rendition || this;
let book = rendition.book;
// check that the event is from the book or the document
if (!book || this._loaded === false) return;
// epubjs stores pages off the screen or something for preloading
// get the modulus of the touch event to account for the increased width
if (!e.touches || e.touches.length === 0) return;
let touch = e.touches[0].clientX % dom.getWindowSize().innerWidth;
if (touch < dom.getWindowSize().innerWidth / 2) {
book.package.metadata.direction === 'rtl' ? rendition.next() : rendition.prev();
} else {
book.package.metadata.direction === 'rtl' ? rendition.prev() : rendition.next();
}
}
onDialogClosed() {
this.stop();
}
@ -139,8 +158,11 @@ export class BookPlayer {
this.bindMediaElementEvents();
document.addEventListener('keyup', this.onWindowKeyUp);
document.addEventListener('touchstart', this.onTouchStart);
// FIXME: I don't really get why document keyup event is not triggered when epub is in focus
this._rendition.on('keyup', this.onWindowKeyUp);
this._rendition.on('touchstart', this.onTouchStart);
}
unbindMediaElementEvents() {
@ -155,9 +177,13 @@ export class BookPlayer {
if (this._mediaElement) {
this.unbindMediaElementEvents();
}
document.removeEventListener('keyup', this.onWindowKeyUp);
document.removeEventListener('touchstart', this.onTouchStart);
if (this._rendition) {
this._rendition.off('keyup', this.onWindowKeyUp);
this._rendition.off('touchstart', this.onTouchStart);
}
}
@ -169,13 +195,11 @@ export class BookPlayer {
createMediaElement() {
let elem = this._mediaElement;
if (elem) {
return elem;
}
elem = document.getElementById('bookPlayer');
if (!elem) {
elem = dialogHelper.createDialog({
exitAnimationDuration: 400,
@ -185,6 +209,7 @@ export class BookPlayer {
exitAnimation: 'fadeout',
removeOnClose: true
});
elem.id = 'bookPlayer';
let html = '';
@ -222,7 +247,7 @@ export class BookPlayer {
return new Promise((resolve, reject) => {
import('epubjs').then(({default: epubjs}) => {
let downloadHref = apiClient.getItemDownloadUrl(item.Id);
let book = epubjs.default(downloadHref, {openAs: 'epub'});
let book = epubjs(downloadHref, {openAs: 'epub'});
let rendition = book.renderTo(elem, {width: '100%', height: '97%'});
this._currentSrc = downloadHref;
@ -230,6 +255,7 @@ export class BookPlayer {
let cancellationToken = {
shouldCancel: false
};
this._cancellationToken = cancellationToken;
return rendition.display().then(() => {
@ -253,7 +279,6 @@ export class BookPlayer {
epubElem.style.display = 'block';
rendition.on('relocated', (locations) => {
this._progress = book.locations.percentageFromCfi(locations.start.cfi);
events.trigger(this, 'timeupdate');
});
@ -262,7 +287,7 @@ export class BookPlayer {
return resolve();
});
}, () => {
console.error('Failed to display epub');
console.error('failed to display epub');
return reject();
});
});

View file

@ -1,6 +1,8 @@
define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', 'globalize', 'events', 'require', 'castSenderApiLoader'], function (appSettings, userSettings, playbackManager, connectionManager, globalize, events, require, castSenderApiLoader) {
'use strict';
playbackManager = playbackManager.default || playbackManager;
// Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js
var currentResolve;
var currentReject;
@ -54,7 +56,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
// production version registered with google
// replace this value if you want to test changes on another instance
var applicationStable = 'F007D354';
var applicationNightly = '6F511C87';
var applicationUnstable = '6F511C87';
var messageNamespace = 'urn:x-cast:com.connectsdk';
@ -99,8 +101,8 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
}
var applicationID = applicationStable;
if (userSettings.chromecastVersion() === 'nightly') {
applicationID = applicationNightly;
if (userSettings.chromecastVersion() === 'unstable') {
applicationID = applicationUnstable;
}
// request session
@ -363,7 +365,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
}
return new Promise(function (resolve, reject) {
require(['chromecastHelper'], function (chromecastHelper) {
require(['./chromecastHelper'], function (chromecastHelper) {
chromecastHelper.getServerAddress(apiClient).then(function (serverAddress) {
message.serverAddress = serverAddress;
player.sendMessageInternal(message).then(resolve, reject);
@ -575,7 +577,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
this.isLocalPlayer = false;
this.lastPlayerData = {};
castSenderApiLoader.load().then(initializeChromecast.bind(this));
new castSenderApiLoader.default().load().then(initializeChromecast.bind(this));
}
ChromecastPlayer.prototype.tryPair = function (target) {

View file

@ -1674,7 +1674,7 @@ function tryRemoveElement(elem) {
setAspectRatio(val) {
const mediaElement = this.#mediaElement;
if (mediaElement) {
if ('auto' === val) {
if (val === 'auto') {
mediaElement.style.removeProperty('object-fit');
} else {
mediaElement.style['object-fit'] = val;

View file

@ -1,6 +1,8 @@
define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'], function (playbackManager, events, serverNotifications, connectionManager) {
'use strict';
playbackManager = playbackManager.default || playbackManager;
function getActivePlayerId() {
var info = playbackManager.getPlayerInfo();
return info ? info.id : null;