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

use a class and imports for the book player

This commit is contained in:
dkanada 2020-05-22 10:39:21 +09:00
parent 09e051bfab
commit 5b2837f137
3 changed files with 53 additions and 42 deletions

View file

@ -98,6 +98,7 @@
"src/components/playback/mediasession.js", "src/components/playback/mediasession.js",
"src/components/sanatizefilename.js", "src/components/sanatizefilename.js",
"src/components/scrollManager.js", "src/components/scrollManager.js",
"src/components/bookPlayer/plugin.js",
"src/scripts/dfnshelper.js", "src/scripts/dfnshelper.js",
"src/scripts/dom.js", "src/scripts/dom.js",
"src/scripts/filesystem.js", "src/scripts/filesystem.js",

View file

@ -1,35 +1,44 @@
define(['connectionManager', 'dom', 'loading', 'playbackManager', 'keyboardnavigation', 'dialogHelper', 'apphost', 'css!./style', 'material-icons', 'paper-icon-button-light'], function (connectionManager, dom, loading, playbackManager, keyboardnavigation, dialogHelper, appHost) { import connectionManager from 'connectionManager';
'use strict'; import dom from 'dom';
import loading from 'loading';
import playbackManager from 'playbackManager';
import keyboardnavigation from 'keyboardnavigation';
import dialogHelper from 'dialogHelper';
import appHost from 'apphost';
import 'css!./style';
import 'material-icons';
import 'paper-icon-button-light';
function BookPlayer() { /* eslint-disable indent */
let self = this; export class BookPlayer {
constructor() {
this.name = 'Book Player';
this.type = 'mediaplayer';
this.id = 'bookplayer';
this.priority = 1;
}
self.name = 'Book Player'; play(options) {
self.type = 'mediaplayer';
self.id = 'bookplayer';
self.priority = 1;
self.play = function (options) {
loading.show(); loading.show();
let elem = createMediaElement(); let elem = this.createMediaElement();
return setCurrentSrc(elem, options); return this.setCurrentSrc(elem, options);
}; }
self.stop = function () { stop() {
let elem = self._mediaElement; let elem = this._mediaElement;
let rendition = self._rendition; let rendition = this._rendition;
if (elem && rendition) { if (elem && rendition) {
rendition.destroy(); rendition.destroy();
elem.remove(); elem.remove();
self._mediaElement = null; this._mediaElement = null;
}
} }
};
function onWindowKeyUp(e) { onWindowKeyUp(e) {
let key = keyboardnavigation.getKeyName(e); let key = keyboardnavigation.getKeyName(e);
let rendition = self._rendition; let rendition = this._rendition;
let book = rendition.book; let book = rendition.book;
switch (key) { switch (key) {
@ -44,19 +53,19 @@ define(['connectionManager', 'dom', 'loading', 'playbackManager', 'keyboardnavig
book.package.metadata.direction === 'rtl' ? rendition.next() : rendition.prev(); book.package.metadata.direction === 'rtl' ? rendition.next() : rendition.prev();
break; break;
case 'Escape': case 'Escape':
dialogHelper.close(self._mediaElement); dialogHelper.close(this._mediaElement);
if (self._tocElement) { if (this._tocElement) {
dialogHelper.close(self._tocElement); dialogHelper.close(this._tocElement);
} }
break; break;
} }
} }
function onDialogClosed() { onDialogClosed() {
self.stop(); this.stop();
} }
function replaceLinks(contents, f) { replaceLinks(contents, f) {
let links = contents.querySelectorAll('a[href]'); let links = contents.querySelectorAll('a[href]');
links.forEach((link) => { links.forEach((link) => {
@ -69,8 +78,8 @@ define(['connectionManager', 'dom', 'loading', 'playbackManager', 'keyboardnavig
}); });
} }
function createMediaElement() { createMediaElement() {
let elem = self._mediaElement; let elem = this._mediaElement;
if (elem) { if (elem) {
return elem; return elem;
@ -104,7 +113,7 @@ define(['connectionManager', 'dom', 'loading', 'playbackManager', 'keyboardnavig
}); });
elem.querySelector('.btnBookplayerToc').addEventListener('click', function () { elem.querySelector('.btnBookplayerToc').addEventListener('click', function () {
let rendition = self._rendition; let rendition = this._rendition;
if (rendition) { if (rendition) {
let tocElement = dialogHelper.createDialog({ let tocElement = dialogHelper.createDialog({
size: 'small', size: 'small',
@ -131,13 +140,13 @@ define(['connectionManager', 'dom', 'loading', 'playbackManager', 'keyboardnavig
dialogHelper.close(tocElement); dialogHelper.close(tocElement);
}); });
replaceLinks(tocElement, (href) => { this.replaceLinks(tocElement, (href) => {
let relative = rendition.book.path.relative(href); let relative = rendition.book.path.relative(href);
rendition.display(relative); rendition.display(relative);
dialogHelper.close(tocElement); dialogHelper.close(tocElement);
}); });
self._tocElement = tocElement; this._tocElement = tocElement;
dialogHelper.open(tocElement); dialogHelper.open(tocElement);
} }
@ -145,18 +154,19 @@ define(['connectionManager', 'dom', 'loading', 'playbackManager', 'keyboardnavig
dialogHelper.open(elem); dialogHelper.open(elem);
elem.addEventListener('close', onDialogClosed); elem.addEventListener('close', this.onDialogClosed.bind(this));
} }
self._mediaElement = elem; this._mediaElement = elem;
return elem; return elem;
} }
function setCurrentSrc(elem, options) { setCurrentSrc(elem, options) {
let serverId = options.items[0].ServerId; let serverId = options.items[0].ServerId;
let apiClient = connectionManager.getApiClient(serverId); let apiClient = connectionManager.getApiClient(serverId);
const self = this;
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['epubjs'], function (epubjs) { require(['epubjs'], function (epubjs) {
let downloadHref = apiClient.getItemDownloadUrl(options.items[0].Id); let downloadHref = apiClient.getItemDownloadUrl(options.items[0].Id);
@ -168,9 +178,9 @@ define(['connectionManager', 'dom', 'loading', 'playbackManager', 'keyboardnavig
self._rendition = rendition; self._rendition = rendition;
return rendition.display().then(function () { return rendition.display().then(function () {
document.addEventListener('keyup', onWindowKeyUp); document.addEventListener('keyup', self.onWindowKeyUp.bind(self));
// FIXME: I don't really get why document keyup event is not triggered when epub is in focus // FIXME: I don't really get why document keyup event is not triggered when epub is in focus
self._rendition.on('keyup', onWindowKeyUp); self._rendition.on('keyup', self.onWindowKeyUp.bind(self));
loading.hide(); loading.hide();
@ -182,11 +192,11 @@ define(['connectionManager', 'dom', 'loading', 'playbackManager', 'keyboardnavig
}); });
}); });
} }
}
BookPlayer.prototype.canPlayMediaType = function (mediaType) { canPlayMediaType(mediaType) {
return (mediaType || '').toLowerCase() === 'book'; return (mediaType || '').toLowerCase() === 'book';
}; }
}
return BookPlayer; /* eslint-enable indent */
}); export default BookPlayer;

View file

@ -58,7 +58,7 @@ define(['events', 'globalize'], function (events, globalize) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require([pluginSpec], (pluginFactory) => { require([pluginSpec], (pluginFactory) => {
var plugin = new pluginFactory(); var plugin = pluginFactory.default ? new pluginFactory.default() : new pluginFactory();
// See if it's already installed // See if it's already installed
var existing = instance.pluginsList.filter(function (p) { var existing = instance.pluginsList.filter(function (p) {