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:
parent
09e051bfab
commit
5b2837f137
3 changed files with 53 additions and 42 deletions
|
@ -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",
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue