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

Merge remote-tracking branch 'upstream/master' into unstable

This commit is contained in:
Ian Walton 2021-04-14 20:50:07 -04:00
commit e9d3d6bd36
184 changed files with 14969 additions and 9940 deletions

View file

@ -21,19 +21,19 @@ jobs:
- task: Cache@2
displayName: 'Cache node_modules'
inputs:
key: 'yarn | yarn.lock'
key: 'npm | package-lock.json'
path: 'node_modules'
- script: 'yarn install --frozen-lockfile'
- script: 'npm ci --no-audit'
displayName: 'Install Dependencies'
env:
SKIP_PREPARE: 'true'
- script: 'yarn build:development'
- script: 'npm run build:development'
displayName: 'Build Development'
condition: eq(variables['BuildConfiguration'], 'development')
- script: 'yarn build:production'
- script: 'npm run build:production'
displayName: 'Build Production'
condition: eq(variables['BuildConfiguration'], 'production')

View file

@ -99,10 +99,6 @@ module.exports = {
'Windows': 'readonly'
},
rules: {
// TODO: Fix warnings and remove these rules
'no-redeclare': ['warn'],
'no-useless-escape': ['warn'],
'no-unused-vars': ['warn']
},
settings: {
polyfills: [

View file

@ -5,3 +5,9 @@ updates:
schedule:
interval: monthly
open-pull-requests-limit: 10
- package-ecosystem: github-actions
directory: '/'
schedule:
interval: monthly
open-pull-requests-limit: 10

View file

@ -15,24 +15,32 @@ jobs:
- name: Check out Git repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v1
- name: Setup node environment
uses: actions/setup-node@v2.1.5
with:
node-version: 12
check-latest: true
- name: Cache dependencies
uses: actions/cache@v2
- name: Get npm cache directory path
id: npm-cache-dir-path
run: echo "::set-output name=dir::$(npm config get cache)"
- name: Cache node_modules
uses: actions/cache@v2.1.4
id: npm-cache
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
path: ${{ steps.npm-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-
- name: Install Node.js dependencies
run: yarn install --frozen-lockfile
run: npm ci --no-audit
env:
SKIP_PREPARE: true
- name: Run eslint
run: yarn lint
run: npm run lint
run-stylelint-css:
name: Run stylelint (css)
@ -42,27 +50,35 @@ jobs:
- name: Check out Git repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v1
- name: Setup node environment
uses: actions/setup-node@v2.1.5
with:
node-version: 12
check-latest: true
- name: Get npm cache directory path
id: npm-cache-dir-path
run: echo "::set-output name=dir::$(npm config get cache)"
- name: Cache node_modules
uses: actions/cache@v2.1.4
id: npm-cache
with:
path: ${{ steps.npm-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-
- name: Set up stylelint matcher
uses: xt0rted/stylelint-problem-matcher@v1
- name: Cache dependencies
uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
- name: Install Node.js dependencies
run: yarn install --frozen-lockfile
run: npm ci --no-audit
env:
SKIP_PREPARE: true
- name: Run stylelint
run: yarn stylelint:css
run: npm run stylelint:css
run-stylelint-scss:
name: Run stylelint (scss)
@ -72,24 +88,32 @@ jobs:
- name: Check out Git repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v1
- name: Setup node environment
uses: actions/setup-node@v2.1.5
with:
node-version: 12
check-latest: true
- name: Get npm cache directory path
id: npm-cache-dir-path
run: echo "::set-output name=dir::$(npm config get cache)"
- name: Cache node_modules
uses: actions/cache@v2.1.4
id: npm-cache
with:
path: ${{ steps.npm-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-
- name: Set up stylelint matcher
uses: xt0rted/stylelint-problem-matcher@v1
- name: Cache dependencies
uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
- name: Install Node.js dependencies
run: yarn install --frozen-lockfile
run: npm ci --no-audit
env:
SKIP_PREPARE: true
- name: Run stylelint
run: yarn stylelint:scss
run: npm run stylelint:scss

1
.npmrc Normal file
View file

@ -0,0 +1 @@
fund=false

View file

@ -44,6 +44,7 @@
- [Orry Verducci](https://github.com/orryverducci)
- [Camc314](https://github.com/camc314)
- [danieladov](https://github.com/danieladov)
- [Stephane Senart](https://github.com/ssenart)
# Emby Contributors

View file

@ -42,7 +42,7 @@ Jellyfin Web is the frontend used for most of the clients available for end user
### Dependencies
- [Node.js](https://nodejs.org/en/download)
- [Yarn 1.22.5](https://classic.yarnpkg.com/en/docs/install)
- npm (included in Node.js)
### Getting Started
@ -56,17 +56,17 @@ Jellyfin Web is the frontend used for most of the clients available for end user
2. Install build dependencies in the project directory.
```sh
yarn install
npm install
```
3. Run the web client with webpack for local development.
```sh
yarn serve
npm start
```
4. Build the client with sourcemaps available.
```sh
yarn build:development
npm run build:development
```

2
debian/rules vendored
View file

@ -11,7 +11,7 @@ override_dh_auto_test:
override_dh_clistrip:
override_dh_auto_build:
npx yarn install
npm ci --no-audit --unsafe-perm
mv $(CURDIR)/dist $(CURDIR)/web
override_dh_auto_clean:

View file

@ -12,12 +12,9 @@ ENV IS_DOCKER=YES
# Prepare CentOS environment
RUN yum update -y \
&& yum install -y epel-release \
&& yum install -y @buildsys-build rpmdevtools git yum-plugins-core nodejs-yarn autoconf automake glibc-devel
# Install recent NodeJS and Yarn
RUN curl -fSsLo /etc/yum.repos.d/yarn.repo https://dl.yarnpkg.com/rpm/yarn.repo \
&& rpm -i https://rpm.nodesource.com/pub_10.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm \
&& yum install -y yarn
&& yum install -y @buildsys-build rpmdevtools git yum-plugins-core autoconf automake glibc-devel gcc-c++ make \
&& curl -fsSL https://rpm.nodesource.com/setup_12.x | bash - \
&& yum install -y nodejs
# Link to build script
RUN ln -sf ${SOURCE_DIR}/deployment/build.centos /build.sh

View file

@ -12,10 +12,10 @@ ENV IS_DOCKER=YES
# Prepare Debian build environment
RUN apt-get update \
&& apt-get install -y debhelper mmv npm git
&& apt-get install -y debhelper mmv git curl \
&& curl -fsSL https://deb.nodesource.com/setup_12.x | bash - \
&& apt-get install -y nodejs
# Prepare Yarn
RUN npm install -g yarn
# Link to build script
RUN ln -sf ${SOURCE_DIR}/deployment/build.debian /build.sh

View file

@ -8,4 +8,4 @@ RUN apk add autoconf g++ make libpng-dev gifsicle alpine-sdk automake libtool ma
WORKDIR ${SOURCE_DIR}
COPY . .
RUN yarn install && mv dist ${ARTIFACT_DIR}
RUN npm ci --no-audit --unsafe-perm && mv dist ${ARTIFACT_DIR}

View file

@ -1,4 +1,4 @@
FROM fedora:31
FROM fedora:33
# Docker build arguments
ARG SOURCE_DIR=/jellyfin
@ -11,7 +11,7 @@ ENV IS_DOCKER=YES
# Prepare Fedora environment
RUN dnf update -y \
&& dnf install -y @buildsys-build rpmdevtools git dnf-plugins-core nodejs-yarn autoconf automake glibc-devel
&& dnf install -y @buildsys-build rpmdevtools git dnf-plugins-core nodejs autoconf automake glibc-devel
# Link to build script
RUN ln -sf ${SOURCE_DIR}/deployment/build.fedora /build.sh

View file

@ -11,10 +11,9 @@ ENV IS_DOCKER=YES
# Prepare Debian build environment
RUN apt-get update \
&& apt-get install -y mmv npm git
# Prepare Yarn
RUN npm install -g yarn
&& apt-get install -y mmv curl git \
&& curl -fsSL https://deb.nodesource.com/setup_12.x | bash - \
&& apt-get install -y nodejs
# Link to build script
RUN ln -sf ${SOURCE_DIR}/deployment/build.portable /build.sh

View file

@ -6,7 +6,7 @@ set -o xtrace
# move to source directory
pushd ${SOURCE_DIR}
cp -a yarn.lock /tmp/yarn.lock
cp -a package-lock.json /tmp/package-lock.json
# modify changelog to unstable configuration if IS_UNSTABLE
if [[ ${IS_UNSTABLE} == 'yes' ]]; then
@ -36,6 +36,6 @@ if [[ ${IS_DOCKER} == YES ]]; then
fi
rm -f fedora/jellyfin*.tar.gz
cp -a /tmp/yarn.lock yarn.lock
cp -a /tmp/package-lock.json package-lock.json
popd

View file

@ -6,7 +6,7 @@ set -o xtrace
# move to source directory
pushd ${SOURCE_DIR}
cp -a yarn.lock /tmp/yarn.lock
cp -a package-lock.json /tmp/package-lock.json
# modify changelog to unstable configuration if IS_UNSTABLE
if [[ ${IS_UNSTABLE} == 'yes' ]]; then
@ -30,7 +30,7 @@ dpkg-buildpackage -us -uc --pre-clean --post-clean
mkdir -p ${ARTIFACT_DIR}
mv ../jellyfin*.{deb,dsc,tar.gz,buildinfo,changes} ${ARTIFACT_DIR}
cp -a /tmp/yarn.lock yarn.lock
cp -a /tmp/package-lock.json package-lock.json
if [[ ${IS_DOCKER} == YES ]]; then
chown -Rc $(stat -c %u:%g ${ARTIFACT_DIR}) ${ARTIFACT_DIR}

View file

@ -6,7 +6,7 @@ set -o xtrace
# move to source directory
pushd ${SOURCE_DIR}
cp -a yarn.lock /tmp/yarn.lock
cp -a package-lock.json /tmp/package-lock.json
# modify changelog to unstable configuration if IS_UNSTABLE
if [[ ${IS_UNSTABLE} == 'yes' ]]; then
@ -36,6 +36,6 @@ if [[ ${IS_DOCKER} == YES ]]; then
fi
rm -f fedora/jellyfin*.tar.gz
cp -a /tmp/yarn.lock yarn.lock
cp -a /tmp/package-lock.json package-lock.json
popd

View file

@ -14,7 +14,7 @@ else
fi
# build archives
npx yarn install
npm ci --no-audit --unsafe-perm
mv dist jellyfin-web_${version}
tar -czf jellyfin-web_${version}_portable.tar.gz jellyfin-web_${version}
rm -rf dist

View file

@ -9,14 +9,6 @@ URL: https://jellyfin.org
# Jellyfin Server tarball created by `make -f .copr/Makefile srpm`, real URL ends with `v%%{version}.tar.gz`
Source0: jellyfin-web-%{version}.tar.gz
%if 0%{?centos}
BuildRequires: yarn
%else
BuildRequires: nodejs-yarn
%endif
# sadly the yarn RPM at https://dl.yarnpkg.com/rpm/ uses git but doesn't Requires: it
# ditto for Fedora's yarn RPM
BuildRequires: git
BuildArch: noarch
%if 0%{?fedora} >= 33
BuildRequires: nodejs
@ -35,7 +27,8 @@ Jellyfin is a free software media system that puts you in control of managing an
%build
%install
yarn install
chown root:root -R .
npm ci --no-audit --unsafe-perm
%{__mkdir} -p %{buildroot}%{_datadir}
mv dist %{buildroot}%{_datadir}/jellyfin-web
%{__install} -D -m 0644 LICENSE %{buildroot}%{_datadir}/licenses/jellyfin/LICENSE

14135
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -18,7 +18,7 @@
"babel-plugin-dynamic-import-polyfill": "^1.0.0",
"clean-webpack-plugin": "^3.0.0",
"confusing-browser-globals": "^1.0.10",
"copy-webpack-plugin": "^7.0.0",
"copy-webpack-plugin": "^8.1.0",
"css-loader": "^5.1.0",
"cssnano": "^4.1.10",
"eslint": "^7.21.0",
@ -29,7 +29,7 @@
"expose-loader": "^2.0.0",
"file-loader": "^6.2.0",
"html-loader": "^1.1.0",
"html-webpack-plugin": "^5.2.0",
"html-webpack-plugin": "^5.3.1",
"postcss-loader": "^3.0.0",
"postcss-preset-env": "^6.7.0",
"sass": "^1.32.8",
@ -42,7 +42,7 @@
"stylelint-order": "^4.1.0",
"stylelint-scss": "^3.19.0",
"webpack": "^5.24.2",
"webpack-cli": "^4.5.0",
"webpack-cli": "^4.6.0",
"webpack-dev-server": "^3.11.2",
"webpack-merge": "^4.2.2",
"workbox-webpack-plugin": "^6.1.1",
@ -52,7 +52,7 @@
"@fontsource/noto-sans": "^4.2.1",
"@fontsource/noto-sans-hk": "^4.2.1",
"@fontsource/noto-sans-jp": "^4.2.1",
"@fontsource/noto-sans-kr": "^4.2.1",
"@fontsource/noto-sans-kr": "^4.2.2",
"@fontsource/noto-sans-sc": "^4.2.1",
"blurhash": "^1.1.3",
"classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz",
@ -64,7 +64,7 @@
"headroom.js": "^0.12.0",
"hls.js": "^0.14.17",
"intersection-observer": "^0.12.0",
"jellyfin-apiclient": "^1.6.0",
"jellyfin-apiclient": "^1.7.0",
"jquery": "^3.5.1",
"jstree": "^3.3.11",
"libarchive.js": "^1.3.0",
@ -76,7 +76,7 @@
"resize-observer-polyfill": "^1.5.1",
"screenfull": "^5.1.0",
"sortablejs": "^1.13.0",
"swiper": "^6.4.15",
"swiper": "^6.5.0",
"webcomponents.js": "^0.7.24",
"whatwg-fetch": "^3.6.2",
"workbox-core": "^5.1.4",
@ -99,14 +99,17 @@
"Firefox ESR"
],
"scripts": {
"start": "yarn serve",
"start": "npm run serve",
"serve": "webpack serve --config webpack.dev.js",
"prepare": "node ./scripts/prepare.js",
"build:development": "webpack --config webpack.dev.js",
"build:production": "webpack --config webpack.prod.js",
"lint": "eslint \"src/\"",
"stylelint": "yarn stylelint:css && yarn stylelint:scss",
"stylelint": "npm run stylelint:css && npm run stylelint:scss",
"stylelint:css": "stylelint \"src/**/*.css\"",
"stylelint:scss": "stylelint --config=\".stylelintrc.scss.json\" \"src/**/*.scss\""
},
"engines": {
"yarn": "YARN NO LONGER USED - use npm instead."
}
}

View file

@ -54,7 +54,7 @@ import alert from './alert';
return html;
}
function renderList(elem, apiClient, result, startIndex, limit) {
function renderList(elem, apiClient, result) {
elem.innerHTML = result.Items.map(function (i) {
return getEntryHtml(i, apiClient);
}).join('');
@ -97,11 +97,11 @@ import alert from './alert';
}
instance.items = result.Items;
renderList(elem, apiClient, result, startIndex, limit);
renderList(elem, apiClient, result);
});
}
function onActivityLogUpdate(e, apiClient, data) {
function onActivityLogUpdate(e, apiClient) {
const options = this.options;
if (options && options.serverId === apiClient.serverId()) {

View file

@ -1,6 +1,6 @@
import './appFooter.scss';
function render(options) {
function render() {
const elem = document.createElement('div');
elem.classList.add('appfooter');
@ -10,10 +10,10 @@ function render(options) {
}
class appFooter {
constructor(options) {
constructor() {
const self = this;
self.element = render(options);
self.element = render();
self.add = function (elem) {
self.element.appendChild(elem);
};
@ -33,4 +33,4 @@ class appFooter {
}
}
export default new appFooter({});
export default new appFooter();

View file

@ -427,12 +427,12 @@ class AppRouter {
if (data.status === 403) {
if (data.errorCode === 'ParentalControl') {
const isCurrentAllowed = this.currentRouteInfo ? (this.currentRouteInfo.route.anonymous || this.currentRouteInfo.route.startup) : true;
const isCurrentAllowed = appRouter.currentRouteInfo ? (appRouter.currentRouteInfo.route.anonymous || appRouter.currentRouteInfo.route.startup) : true;
// Bounce to the login screen, but not if a password entry fails, obviously
if (!isCurrentAllowed) {
this.showForcedLogoutMessage(globalize.translate('AccessRestrictedTryAgainLater'));
this.showLocalLogin(apiClient.serverId());
appRouter.showForcedLogoutMessage(globalize.translate('AccessRestrictedTryAgainLater'));
appRouter.showLocalLogin(apiClient.serverId());
}
}
}
@ -446,7 +446,7 @@ class AppRouter {
normalizeImageOptions(options) {
let setQuality;
if (options.maxWidth || options.width || options.maxHeight || options.height) {
if (options.maxWidth || options.width || options.maxHeight || options.height || options.fillWidth || options.fillHeight) {
setQuality = true;
}

View file

@ -7,7 +7,7 @@ import ServerConnections from '../ServerConnections';
/* eslint-disable indent */
function enableAnimation(elem) {
function enableAnimation() {
if (browser.slow) {
return false;
}
@ -47,7 +47,7 @@ import ServerConnections from '../ServerConnections';
backdropImage.classList.add('backdropImageFadeIn');
parent.appendChild(backdropImage);
if (!enableAnimation(backdropImage)) {
if (!enableAnimation()) {
if (existingBackdropImage && existingBackdropImage.parentNode) {
existingBackdropImage.parentNode.removeChild(existingBackdropImage);
}

View file

@ -498,7 +498,7 @@ import ServerConnections from '../ServerConnections';
let imgUrl = null;
let imgTag = null;
let coverImage = false;
let uiAspect = null;
const uiAspect = getDesiredAspect(shape);
let imgType = null;
let itemId = null;
@ -543,12 +543,9 @@ import ServerConnections from '../ServerConnections';
forceName = true;
}
if (primaryImageAspectRatio) {
uiAspect = getDesiredAspect(shape);
if (uiAspect) {
if (primaryImageAspectRatio && uiAspect) {
coverImage = (Math.abs(primaryImageAspectRatio - uiAspect) / uiAspect) <= 0.2;
}
}
} else if (item.SeriesPrimaryImageTag) {
imgType = 'Primary';
imgTag = item.SeriesPrimaryImageTag;
@ -563,12 +560,9 @@ import ServerConnections from '../ServerConnections';
forceName = true;
}
if (primaryImageAspectRatio) {
uiAspect = getDesiredAspect(shape);
if (uiAspect) {
if (primaryImageAspectRatio && uiAspect) {
coverImage = (Math.abs(primaryImageAspectRatio - uiAspect) / uiAspect) <= 0.2;
}
}
} else if (item.ParentPrimaryImageTag) {
imgType = 'Primary';
imgTag = item.ParentPrimaryImageTag;
@ -579,12 +573,9 @@ import ServerConnections from '../ServerConnections';
itemId = item.AlbumId;
height = width && primaryImageAspectRatio ? Math.round(width / primaryImageAspectRatio) : null;
if (primaryImageAspectRatio) {
uiAspect = getDesiredAspect(shape);
if (uiAspect) {
if (primaryImageAspectRatio && uiAspect) {
coverImage = (Math.abs(primaryImageAspectRatio - uiAspect) / uiAspect) <= 0.2;
}
}
} else if (item.Type === 'Season' && item.ImageTags && item.ImageTags.Thumb) {
imgType = 'Thumb';
imgTag = item.ImageTags.Thumb;
@ -613,10 +604,15 @@ import ServerConnections from '../ServerConnections';
}
if (imgTag && imgType) {
// TODO: This place is a mess. Could do with a good spring cleaning.
if (!height && width && uiAspect) {
height = width / uiAspect;
}
imgUrl = apiClient.getScaledImageUrl(itemId, {
type: imgType,
maxHeight: height,
maxWidth: width,
fillHeight: height,
fillWidth: width,
quality: 96,
tag: imgTag
});
}

View file

@ -48,7 +48,7 @@ import '../../assets/css/scrollstyles.scss';
const activeElement = document.activeElement;
let removeScrollLockOnClose = false;
function onHashChange(e) {
function onHashChange() {
const isBack = self.originalUrl === window.location.href;
if (isBack || !isOpened(dlg)) {
@ -200,7 +200,7 @@ import '../../assets/css/scrollstyles.scss';
dlg.dialogContainer = dialogContainer;
document.body.appendChild(dialogContainer);
return new Promise((resolve, reject) => {
return new Promise((resolve) => {
new DialogHashHandler(dlg, `dlg${new Date().getTime()}`, resolve);
});
}

View file

@ -210,7 +210,7 @@ function loadDynamicFilters(context, options) {
}
class FilterMenu {
show(options) {
return new Promise( (resolve, reject) => {
return new Promise( (resolve) => {
const dialogOptions = {
removeOnClose: true,
scrollY: false

View file

@ -8,7 +8,7 @@ import scrollManager from './scrollManager';
scopes.push(elem);
}
function popScope(elem) {
function popScope() {
if (scopes.length) {
scopes.length -= 1;
}

View file

@ -1057,7 +1057,7 @@ function Guide(options) {
}
}
function onSeriesTimerCreated(e, apiClient, data) {
function onSeriesTimerCreated() {
}
function onTimerCancelled(e, apiClient, data) {
@ -1116,7 +1116,7 @@ function Guide(options) {
programGrid.classList.add('noRubberBanding');
}
dom.addEventListener(programGrid, 'scroll', function (e) {
dom.addEventListener(programGrid, 'scroll', function () {
onProgramGridScroll(guideContext, this, timeslotHeaders);
}, {
passive: true

View file

@ -219,7 +219,7 @@ import template from './homeScreenSettings.template.html';
context.querySelector('.selectTVHomeScreen').value = userSettings.get('tvhome') || '';
}
function getPerLibrarySettingsHtml(item, user, userSettings, apiClient) {
function getPerLibrarySettingsHtml(item, user, userSettings) {
let html = '';
let isChecked;
@ -275,12 +275,12 @@ import template from './homeScreenSettings.template.html';
return html;
}
function renderPerLibrarySettings(context, user, userViews, userSettings, apiClient) {
function renderPerLibrarySettings(context, user, userViews) {
const elem = context.querySelector('.perLibrarySettings');
let html = '';
for (let i = 0, length = userViews.length; i < length; i++) {
html += getPerLibrarySettingsHtml(userViews[i], user, userSettings, apiClient);
html += getPerLibrarySettingsHtml(userViews[i], user);
}
elem.innerHTML = html;
@ -297,7 +297,7 @@ import template from './homeScreenSettings.template.html';
Promise.all([promise1, promise2]).then(responses => {
renderViewOrder(context, user, responses[0]);
renderPerLibrarySettings(context, user, responses[0].Items, userSettings, apiClient);
renderPerLibrarySettings(context, user, responses[0].Items);
renderViews(context, user, responses[1]);

View file

@ -133,24 +133,22 @@ import ServerConnections from '../ServerConnections';
function loadSection(page, apiClient, user, userSettings, userViews, allSections, index) {
const section = allSections[index];
const userId = user.Id;
const elem = page.querySelector('.section' + index);
if (section === 'latestmedia') {
loadRecentlyAdded(elem, apiClient, user, userViews);
} else if (section === 'librarytiles' || section === 'smalllibrarytiles' || section === 'smalllibrarytiles-automobile' || section === 'librarytiles-automobile') {
loadLibraryTiles(elem, apiClient, user, userSettings, 'smallBackdrop', userViews, allSections);
loadLibraryTiles(elem, apiClient, user, userSettings, 'smallBackdrop', userViews);
} else if (section === 'librarybuttons') {
loadlibraryButtons(elem, apiClient, user, userSettings, userViews);
} else if (section === 'resume') {
loadResumeVideo(elem, apiClient, userId);
loadResumeVideo(elem, apiClient);
} else if (section === 'resumeaudio') {
loadResumeAudio(elem, apiClient, userId);
loadResumeAudio(elem, apiClient);
} else if (section === 'activerecordings') {
loadLatestLiveTvRecordings(elem, true, apiClient, userId);
loadLatestLiveTvRecordings(elem, true, apiClient);
} else if (section === 'nextup') {
loadNextUp(elem, apiClient, userId);
loadNextUp(elem, apiClient);
} else if (section === 'onnow' || section === 'livetv') {
return loadOnNow(elem, apiClient, user);
} else {
@ -335,7 +333,7 @@ import ServerConnections from '../ServerConnections';
}
}
export function loadLibraryTiles(elem, apiClient, user, userSettings, shape, userViews, allSections) {
export function loadLibraryTiles(elem, apiClient, user, userSettings, shape, userViews) {
let html = '';
if (userViews.length) {
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + globalize.translate('HeaderMyMedia') + '</h2>';
@ -415,7 +413,7 @@ import ServerConnections from '../ServerConnections';
});
}
function loadResumeVideo(elem, apiClient, userId) {
function loadResumeVideo(elem, apiClient) {
let html = '';
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + globalize.translate('HeaderContinueWatching') + '</h2>';
@ -488,7 +486,7 @@ import ServerConnections from '../ServerConnections';
});
}
function loadResumeAudio(elem, apiClient, userId) {
function loadResumeAudio(elem, apiClient) {
let html = '';
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + globalize.translate('HeaderContinueListening') + '</h2>';
@ -665,7 +663,8 @@ import ServerConnections from '../ServerConnections';
UserId: apiClient.getCurrentUserId(),
ImageTypeLimit: 1,
EnableImageTypes: 'Primary,Backdrop,Banner,Thumb',
EnableTotalRecordCount: false
EnableTotalRecordCount: false,
DisableFirstEpisode: true
});
};
}
@ -688,7 +687,7 @@ import ServerConnections from '../ServerConnections';
});
}
function loadNextUp(elem, apiClient, userId) {
function loadNextUp(elem, apiClient) {
let html = '';
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
@ -766,7 +765,7 @@ import ServerConnections from '../ServerConnections';
};
}
function loadLatestLiveTvRecordings(elem, activeRecordingsOnly, apiClient, userId) {
function loadLatestLiveTvRecordings(elem, activeRecordingsOnly, apiClient) {
const title = activeRecordingsOnly ?
globalize.translate('HeaderActiveRecordings') :
globalize.translate('HeaderLatestRecordings');

View file

@ -359,7 +359,7 @@ import toast from './toast/toast';
itemId: itemId,
serverId: serverId,
title: item.Name,
filename: item.Path.replace(/^.*[\\\/]/, '')
filename: item.Path.replace(/^.*[\\/]/, '')
}]);
getResolveFunction(getResolveFunction(resolve, id), id)();
});

View file

@ -2,7 +2,7 @@ import { playbackManager } from './playback/playbackmanager';
import serverNotifications from '../scripts/serverNotifications';
import { Events } from 'jellyfin-apiclient';
function onUserDataChanged(e, apiClient, userData) {
function onUserDataChanged() {
const instance = this;
const eventsToMonitor = getEventsToMonitor(instance);
@ -25,7 +25,7 @@ function getEventsToMonitor(instance) {
return [];
}
function onTimerCreated(e, apiClient, data) {
function onTimerCreated() {
const instance = this;
if (getEventsToMonitor(instance).indexOf('timers') !== -1) {
@ -34,7 +34,7 @@ function onTimerCreated(e, apiClient, data) {
}
}
function onSeriesTimerCreated(e, apiClient, data) {
function onSeriesTimerCreated() {
const instance = this;
if (getEventsToMonitor(instance).indexOf('seriestimers') !== -1) {
instance.notifyRefreshNeeded();
@ -42,7 +42,7 @@ function onSeriesTimerCreated(e, apiClient, data) {
}
}
function onTimerCancelled(e, apiClient, data) {
function onTimerCancelled() {
const instance = this;
if (getEventsToMonitor(instance).indexOf('timers') !== -1) {
@ -51,7 +51,7 @@ function onTimerCancelled(e, apiClient, data) {
}
}
function onSeriesTimerCancelled(e, apiClient, data) {
function onSeriesTimerCancelled() {
const instance = this;
if (getEventsToMonitor(instance).indexOf('seriestimers') !== -1) {
instance.notifyRefreshNeeded();

View file

@ -76,12 +76,13 @@ import ServerConnections from '../ServerConnections';
return '';
}
function getImageUrl(item, width) {
function getImageUrl(item, size) {
const apiClient = ServerConnections.getApiClient(item.ServerId);
let itemId;
const options = {
maxWidth: width,
fillWidth: size,
fillHeight: size,
type: 'Primary'
};
@ -105,10 +106,11 @@ import ServerConnections from '../ServerConnections';
return null;
}
function getChannelImageUrl(item, width) {
function getChannelImageUrl(item, size) {
const apiClient = ServerConnections.getApiClient(item.ServerId);
const options = {
maxWidth: width,
fillWidth: size,
fillHeight: size,
type: 'Primary'
};
@ -163,10 +165,6 @@ import ServerConnections from '../ServerConnections';
return html;
}
function getId(item) {
return item.Id;
}
export function getListViewHtml(options) {
const items = options.items;
@ -183,7 +181,6 @@ import ServerConnections from '../ServerConnections';
let outerHtml = '';
const enableContentWrapper = options.enableOverview && !layoutManager.tv;
const containerAlbumArtistIds = (options.containerAlbumArtists || []).map(getId);
for (let i = 0, length = items.length; i < length; i++) {
const item = items[i];

View file

@ -47,7 +47,7 @@ import '../elements/emby-button/emby-button';
return true;
}
function configureSwipeTabs(view, tabsElem, getTabContainersFn) {
function configureSwipeTabs(view, tabsElem) {
if (!browser.touch) {
return;
}
@ -142,7 +142,7 @@ import '../elements/emby-button/emby-button';
tabsElem = tabsContainerElem.querySelector('[is="emby-tabs"]');
configureSwipeTabs(view, tabsElem, getTabContainersFn);
configureSwipeTabs(view, tabsElem);
tabsElem.addEventListener('beforetabchange', function (e) {
const tabContainers = getTabContainersFn();

View file

@ -490,9 +490,7 @@ import '../../elements/emby-button/emby-button';
})[0];
}
export function getMediaInfoStats(item, options) {
options = options || {};
export function getMediaInfoStats(item) {
const list = [];
const mediaSource = (item.MediaSources || [])[0] || {};

View file

@ -31,7 +31,7 @@ import template from './metadataEditor.template.html';
return currentContext.classList.contains('dialog');
}
function closeDialog(isSubmitted) {
function closeDialog() {
if (isDialog()) {
dialogHelper.close(currentContext);
}
@ -42,7 +42,7 @@ import template from './metadataEditor.template.html';
toast(globalize.translate('MessageItemSaved'));
loading.hide();
closeDialog(true);
closeDialog();
}
const apiClient = getApiClient();
@ -298,7 +298,7 @@ import template from './metadataEditor.template.html';
}
}
function init(context, apiClient) {
function init(context) {
context.querySelector('.externalIds').addEventListener('click', function (e) {
const btnOpenExternalId = dom.parentWithClass(e.target, 'btnOpenExternalId');
if (btnOpenExternalId) {
@ -319,7 +319,7 @@ import template from './metadataEditor.template.html';
bindAll(context.querySelectorAll('.btnCancel'), 'click', function (event) {
event.preventDefault();
closeDialog(false);
closeDialog();
});
context.querySelector('.btnMore').addEventListener('click', function (e) {
@ -328,7 +328,7 @@ import template from './metadataEditor.template.html';
});
});
context.querySelector('.btnHeaderSave').addEventListener('click', function (e) {
context.querySelector('.btnHeaderSave').addEventListener('click', function () {
context.querySelector('.btnSave').click();
});
@ -347,7 +347,7 @@ import template from './metadataEditor.template.html';
form.removeEventListener('submit', onSubmit);
form.addEventListener('submit', onSubmit);
context.querySelector('#btnAddPerson').addEventListener('click', function (event, data) {
context.querySelector('#btnAddPerson').addEventListener('click', function () {
editPerson(context, {}, -1);
});
@ -1026,7 +1026,7 @@ import template from './metadataEditor.template.html';
});
}
function show(itemId, serverId, resolve, reject) {
function show(itemId, serverId, resolve) {
loading.show();
const dialogOptions = {
@ -1066,20 +1066,20 @@ import template from './metadataEditor.template.html';
currentContext = dlg;
init(dlg, ServerConnections.getApiClient(serverId));
init(dlg);
reload(dlg, itemId, serverId);
}
export default {
show: function (itemId, serverId) {
return new Promise(function (resolve, reject) {
return show(itemId, serverId, resolve, reject);
return new Promise(function (resolve) {
return show(itemId, serverId, resolve);
});
},
embed: function (elem, itemId, serverId) {
return new Promise(function (resolve, reject) {
return new Promise(function () {
loading.show();
elem.innerHTML = globalize.translateHtml(template, 'core');
@ -1091,7 +1091,7 @@ import template from './metadataEditor.template.html';
currentContext = elem;
init(elem, ServerConnections.getApiClient(serverId));
init(elem);
reload(elem, itemId, serverId);
focusManager.autoFocus(elem);

View file

@ -63,7 +63,7 @@ import template from './personEditor.template.html';
}
});
dlg.querySelector('.selectPersonType').addEventListener('change', function (e) {
dlg.querySelector('.selectPersonType').addEventListener('change', function () {
if (this.value === 'Actor') {
dlg.querySelector('.fldRole').classList.remove('hide');
} else {
@ -71,7 +71,7 @@ import template from './personEditor.template.html';
}
});
dlg.querySelector('.btnCancel').addEventListener('click', function (e) {
dlg.querySelector('.btnCancel').addEventListener('click', function () {
dialogHelper.close(dlg);
});

View file

@ -84,7 +84,7 @@ import confirm from '../confirm/confirm';
}
}
function onSelectionChange(e) {
function onSelectionChange() {
updateItemSelection(this, this.checked);
}
@ -440,13 +440,13 @@ import confirm from '../confirm/confirm';
deltaY = 100;
}
if (deltaX >= 5 || deltaY >= 5) {
onMouseOut(e);
onMouseOut();
}
}
}
function onTouchEnd(e) {
onMouseOut(e);
function onTouchEnd() {
onMouseOut();
}
function onMouseDown(e) {
@ -459,7 +459,7 @@ import confirm from '../confirm/confirm';
touchStartTimeout = setTimeout(onTouchStartTimerFired, 550);
}
function onMouseOut(e) {
function onMouseOut() {
if (touchStartTimeout) {
clearTimeout(touchStartTimeout);
touchStartTimeout = null;

View file

@ -41,7 +41,7 @@ function resetRegistration() {
resetRegistration();
function showPersistentNotification(title, options, timeoutMs) {
function showPersistentNotification(title, options) {
serviceWorkerRegistration.showNotification(title, options);
}
@ -77,7 +77,7 @@ function showNotification(options, timeoutMs, apiClient) {
resetRegistration();
if (serviceWorkerRegistration) {
showPersistentNotification(title, options, timeoutMs);
showPersistentNotification(title, options);
return;
}
@ -219,7 +219,7 @@ Events.on(serverNotifications, 'PackageInstalling', function (e, apiClient, data
showPackageInstallNotification(apiClient, data, 'progress');
});
Events.on(serverNotifications, 'ServerShuttingDown', function (e, apiClient, data) {
Events.on(serverNotifications, 'ServerShuttingDown', function (e, apiClient) {
const serverId = apiClient.serverInfo().Id;
const notification = {
tag: 'restart' + serverId,
@ -228,7 +228,7 @@ Events.on(serverNotifications, 'ServerShuttingDown', function (e, apiClient, dat
showNotification(notification, 0, apiClient);
});
Events.on(serverNotifications, 'ServerRestarting', function (e, apiClient, data) {
Events.on(serverNotifications, 'ServerRestarting', function (e, apiClient) {
const serverId = apiClient.serverInfo().Id;
const notification = {
tag: 'restart' + serverId,

View file

@ -648,7 +648,7 @@ import { appRouter } from '../appRouter';
}
}
function onPlayPauseStateChanged(e) {
function onPlayPauseStateChanged() {
if (!isEnabled) {
return;
}
@ -682,7 +682,7 @@ import { appRouter } from '../appRouter';
updatePlayerStateInternal(event, state, player);
}
function onTimeUpdate(e) {
function onTimeUpdate() {
if (!isEnabled) {
return;
}
@ -718,7 +718,7 @@ import { appRouter } from '../appRouter';
}
}
function onVolumeChanged(e) {
function onVolumeChanged() {
if (!isEnabled) {
return;
}

View file

@ -127,7 +127,7 @@ function releaseCurrentPlayer() {
}
}
function onBrightnessChanged(e) {
function onBrightnessChanged() {
const player = this;
ensureOsdElement();

View file

@ -156,7 +156,7 @@ function backdropImageUrl(apiClient, item, options) {
options.type = options.type || 'Backdrop';
// If not resizing, get the original image
if (!options.maxWidth && !options.width && !options.maxHeight && !options.height) {
if (!options.maxWidth && !options.width && !options.maxHeight && !options.height && !options.fillWidth && !options.fillHeight) {
options.quality = 100;
}
@ -208,7 +208,7 @@ function getMimeType(type, container) {
}
function getParam(name, url) {
name = name.replace(/[\[]/, '\\\[').replace(/[\]]/, '\\\]');
name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]');
const regexS = '[\\?&]' + name + '=([^&#]*)';
const regex = new RegExp(regexS, 'i');
@ -270,7 +270,7 @@ function getIntros(firstItem, apiClient, options) {
return apiClient.getIntros(firstItem.Id).then(function (result) {
return result;
}, function (err) {
}, function () {
return Promise.resolve({
Items: []
});
@ -619,7 +619,7 @@ function supportsDirectPlay(apiClient, item, mediaSource) {
return isHostReachable(mediaSource, apiClient);
}
} else if (mediaSource.Protocol === 'File') {
return new Promise(function (resolve, reject) {
return new Promise(function (resolve) {
// Determine if the file can be accessed directly
import('../../scripts/filesystem').then((filesystem) => {
const method = isFolderRip ?
@ -1711,7 +1711,7 @@ class PlaybackManager {
});
}
function changeStreamToUrl(apiClient, player, playSessionId, streamInfo, newPositionTicks) {
function changeStreamToUrl(apiClient, player, playSessionId, streamInfo) {
const playerData = getPlayerData(player);
playerData.isChangingStream = true;
@ -2037,7 +2037,7 @@ class PlaybackManager {
// Only used internally
self.getCurrentTicks = getCurrentTicks;
function playOther(items, options, user) {
function playOther(items, options) {
const playStartIndex = options.startIndex || 0;
const player = getPlayer(items[playStartIndex], options);
@ -2048,7 +2048,7 @@ class PlaybackManager {
return player.play(options);
}
function playWithIntros(items, options, user) {
function playWithIntros(items, options) {
let playStartIndex = options.startIndex || 0;
let firstItem = items[playStartIndex];
@ -2065,7 +2065,7 @@ class PlaybackManager {
}
if (firstItem.MediaType === 'Photo' || firstItem.MediaType === 'Book') {
return playOther(items, options, user);
return playOther(items, options);
}
const apiClient = ServerConnections.getApiClient(firstItem.ServerId);
@ -3038,27 +3038,27 @@ class PlaybackManager {
}
}
function onPlaybackTimeUpdate(e) {
function onPlaybackTimeUpdate() {
const player = this;
sendProgressUpdate(player, 'timeupdate');
}
function onPlaybackPause(e) {
function onPlaybackPause() {
const player = this;
sendProgressUpdate(player, 'pause');
}
function onPlaybackUnpause(e) {
function onPlaybackUnpause() {
const player = this;
sendProgressUpdate(player, 'unpause');
}
function onPlaybackVolumeChange(e) {
function onPlaybackVolumeChange() {
const player = this;
sendProgressUpdate(player, 'volumechange');
}
function onRepeatModeChange(e) {
function onRepeatModeChange() {
const player = this;
sendProgressUpdate(player, 'repeatmodechange');
}
@ -3068,17 +3068,17 @@ class PlaybackManager {
sendProgressUpdate(player, 'shufflequeuemodechange');
}
function onPlaylistItemMove(e) {
function onPlaylistItemMove() {
const player = this;
sendProgressUpdate(player, 'playlistitemmove', true);
}
function onPlaylistItemRemove(e) {
function onPlaylistItemRemove() {
const player = this;
sendProgressUpdate(player, 'playlistitemremove', true);
}
function onPlaylistItemAdd(e) {
function onPlaylistItemAdd() {
const player = this;
sendProgressUpdate(player, 'playlistitemadd', true);
}

View file

@ -14,7 +14,7 @@ function onOrientationChangeError(err) {
console.error('error locking orientation: ' + err);
}
Events.on(playbackManager, 'playbackstart', function (e, player, state) {
Events.on(playbackManager, 'playbackstart', function (e, player) {
const isLocalVideo = player.isLocalPlayer && !player.isExternalPlayer && playbackManager.isPlayingVideo(player);
if (isLocalVideo && layoutManager.mobile) {

View file

@ -301,15 +301,15 @@ Events.on(appSettings, 'change', function (e, name) {
}
});
Events.on(playbackManager, 'pairing', function (e) {
Events.on(playbackManager, 'pairing', function () {
loading.show();
});
Events.on(playbackManager, 'paired', function (e) {
Events.on(playbackManager, 'paired', function () {
loading.hide();
});
Events.on(playbackManager, 'pairerror', function (e) {
Events.on(playbackManager, 'pairerror', function () {
loading.hide();
});

View file

@ -114,7 +114,7 @@ class PlayQueueManager {
return this._currentPlaylistItemId;
}
setPlaylistState(playlistItemId, playlistIndex) {
setPlaylistState(playlistItemId) {
this._currentPlaylistItemId = playlistItemId;
}

View file

@ -118,7 +118,7 @@ function releaseCurrentPlayer() {
}
}
function onVolumeChanged(e) {
function onVolumeChanged() {
const player = this;
ensureOsdElement();

View file

@ -196,7 +196,7 @@ import ServerConnections from '../ServerConnections';
}
}
function getMediaSourceStats(session, player, displayPlayMethod) {
function getMediaSourceStats(session, player) {
const sessionStats = [];
const mediaSource = playbackManager.currentMediaSource(player) || {};

View file

@ -5,7 +5,7 @@ import '../../elements/emby-button/emby-button';
import './recordingfields.scss';
import ServerConnections from '../ServerConnections';
function onRecordingButtonClick(e) {
function onRecordingButtonClick() {
const item = this.item;
if (item) {

View file

@ -28,7 +28,7 @@ function deleteTimer(apiClient, timerId) {
});
}
function renderTimer(context, item, apiClient) {
function renderTimer(context, item) {
context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60;
context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60;
@ -79,13 +79,13 @@ function reload(context, id) {
const apiClient = ServerConnections.getApiClient(currentServerId);
apiClient.getLiveTvTimer(id).then(function (result) {
renderTimer(context, result, apiClient);
renderTimer(context, result);
loading.hide();
});
}
function showEditor(itemId, serverId, options) {
return new Promise(function (resolve, reject) {
return new Promise(function (resolve) {
recordingDeleted = false;
currentServerId = serverId;
loading.show();

View file

@ -14,7 +14,7 @@ import template from './recordingfields.template.html';
/*eslint prefer-const: "error"*/
function loadData(parent, program, apiClient) {
function loadData(parent, program) {
if (program.IsSeries) {
parent.querySelector('.recordSeriesContainer').classList.remove('hide');
} else {
@ -55,7 +55,7 @@ function fetchData(instance) {
instance.TimerId = program.TimerId;
instance.Status = program.Status;
instance.SeriesTimerId = program.SeriesTimerId;
loadData(options.parent, program, apiClient);
loadData(options.parent, program);
});
}
@ -119,7 +119,7 @@ class RecordingEditor {
embed() {
const self = this;
return new Promise(function (resolve, reject) {
return new Promise(function (resolve) {
const options = self.options;
const context = options.parent;
context.innerHTML = globalize.translateHtml(template, 'core');
@ -156,7 +156,7 @@ class RecordingEditor {
}
}
function onManageRecordingClick(e) {
function onManageRecordingClick() {
const options = this.options;
if (!this.TimerId || this.Status === 'Cancelled') {
return;
@ -172,7 +172,7 @@ function onManageRecordingClick(e) {
});
}
function onManageSeriesRecordingClick(e) {
function onManageSeriesRecordingClick() {
const options = this.options;
if (!this.SeriesTimerId) {

View file

@ -155,7 +155,7 @@ class RefreshDialog {
centerFocus(dlg.querySelector('.formDialogContent'), false, true);
}
return new Promise(function (resolve, reject) {
return new Promise(function (resolve) {
if (layoutManager.tv) {
centerFocus(dlg.querySelector('.formDialogContent'), false, false);
}

View file

@ -24,7 +24,7 @@ import { appRouter } from '../appRouter';
let showMuteButton = true;
let showVolumeSlider = true;
function showAudioMenu(context, player, button, item) {
function showAudioMenu(context, player, button) {
const currentIndex = playbackManager.getAudioStreamIndex(player);
const streams = playbackManager.audioTracks(player);
const menuItems = streams.map(function (s) {
@ -51,7 +51,7 @@ function showAudioMenu(context, player, button, item) {
});
}
function showSubtitleMenu(context, player, button, item) {
function showSubtitleMenu(context, player, button) {
const currentIndex = playbackManager.getSubtitleStreamIndex(player);
const streams = playbackManager.subtitleTracks(player);
const menuItems = streams.map(function (s) {
@ -572,7 +572,7 @@ export default function () {
}
}
function onPlaylistUpdate(e) {
function onPlaylistUpdate() {
loadPlaylist(dlg, this);
}
@ -603,7 +603,7 @@ export default function () {
}
}
function onPlayPauseStateChanged(e) {
function onPlayPauseStateChanged() {
updatePlayPauseState(this.paused(), true);
}
@ -613,7 +613,7 @@ export default function () {
onPlaylistUpdate();
}
function onTimeUpdate(e) {
function onTimeUpdate() {
const now = new Date().getTime();
if (!(now - lastUpdateTime < 700)) {
@ -624,7 +624,7 @@ export default function () {
}
}
function onVolumeChanged(e) {
function onVolumeChanged() {
const player = this;
updatePlayerVolumeState(dlg, player.isMuted(), player.getVolume());
}
@ -727,12 +727,12 @@ export default function () {
});
context.querySelector('.btnAudioTracks').addEventListener('click', function (e) {
if (currentPlayer && lastPlayerState && lastPlayerState.NowPlayingItem) {
showAudioMenu(context, currentPlayer, e.target, lastPlayerState.NowPlayingItem);
showAudioMenu(context, currentPlayer, e.target);
}
});
context.querySelector('.btnSubtitles').addEventListener('click', function (e) {
if (currentPlayer && lastPlayerState && lastPlayerState.NowPlayingItem) {
showSubtitleMenu(context, currentPlayer, e.target, lastPlayerState.NowPlayingItem);
showSubtitleMenu(context, currentPlayer, e.target);
}
});
context.querySelector('.btnStop').addEventListener('click', function () {
@ -922,13 +922,13 @@ export default function () {
}
}
function onDialogClosed(e) {
function onDialogClosed() {
releaseCurrentPlayer();
Events.off(playbackManager, 'playerchange', onPlayerChange);
lastPlayerState = null;
}
function onShow(context, tab) {
function onShow(context) {
bindToPlayer(context, playbackManager.getCurrentPlayer());
}
@ -946,7 +946,7 @@ export default function () {
};
self.onShow = function () {
onShow(dlg, window.location.hash);
onShow(dlg);
};
self.destroy = function () {

View file

@ -1,12 +1,12 @@
// TODO: Check if needed and move to external dependency
// From https://github.com/parshap/node-sanitize-filename
const illegalRe = /[\/\?<>\\:\*\|":]/g;
const illegalRe = /[/?<>\\:*|":]/g;
// eslint-disable-next-line no-control-regex
const controlRe = /[\x00-\x1f\x80-\x9f]/g;
const reservedRe = /^\.+$/;
const windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i;
const windowsTrailingRe = /[\. ]+$/;
const windowsTrailingRe = /[. ]+$/;
function isHighSurrogate(codePoint) {
return codePoint >= 0xd800 && codePoint <= 0xdbff;

View file

@ -61,7 +61,7 @@ import template from './searchfields.template.html';
triggerSearch(searchFieldsInstance, value);
}
function embed(elem, instance, options) {
function embed(elem, instance) {
let html = globalize.translateHtml(template, 'core');
if (browser.tizen || browser.orsay) {
@ -89,7 +89,7 @@ import template from './searchfields.template.html';
class SearchFields {
constructor(options) {
this.options = options;
embed(options.element, this, options);
embed(options.element, this);
}
focus() {
this.options.element.querySelector('.searchfields-txtSearch').focus();

View file

@ -585,7 +585,7 @@ import template from './searchresults.template.html';
return originalString.replace(reg, strWith);
}
function embed(elem, instance, options) {
function embed(elem, instance) {
let workingTemplate = template;
if (!enableScrollX()) {
workingTemplate = replaceAll(workingTemplate, 'data-horizontal="true"', 'data-horizontal="false"');
@ -603,7 +603,7 @@ import template from './searchresults.template.html';
class SearchResults {
constructor(options) {
this.options = options;
embed(options.element, this, options);
embed(options.element, this);
}
search(value) {
const apiClient = ServerConnections.getApiClient(this.options.serverId);

View file

@ -71,7 +71,7 @@ function getBackdropImageUrl(item, options, apiClient) {
options.type = options.type || 'Backdrop';
// If not resizing, get the original image
if (!options.maxWidth && !options.width && !options.maxHeight && !options.height) {
if (!options.maxWidth && !options.width && !options.maxHeight && !options.height && !options.fillWidth && !options.fillHeight) {
options.quality = 100;
}
@ -210,7 +210,7 @@ export default function (options) {
dialog.innerHTML = html;
if (options.interactive && !layoutManager.tv) {
dialog.querySelector('.btnSlideshowExit').addEventListener('click', function (e) {
dialog.querySelector('.btnSlideshowExit').addEventListener('click', function () {
dialogHelper.close(dialog);
});
@ -381,10 +381,9 @@ export default function (options) {
/**
* Renders the HTML markup of a slide for an item or a slide.
* @param {Object} item - The item used to render the slide.
* @param {number} index - The index of the item in the Swiper instance.
* @returns {string} The HTML markup of the slide.
*/
function getSwiperSlideHtml(item, index) {
function getSwiperSlideHtml(item) {
if (currentOptions.slides) {
return getSwiperSlideHtmlFromSlide(item);
} else {

View file

@ -108,7 +108,7 @@ function initEditor(page) {
});
}
function showEditor(options, resolve, reject) {
function showEditor(options, resolve) {
options = options || {};
currentItemId = options.itemId;
currentServerId = options.serverId;
@ -161,9 +161,9 @@ function showEditor(options, resolve, reject) {
}
export function show(options) {
return new Promise(function (resolve, reject) {
return new Promise(function (resolve) {
hasChanges = false;
showEditor(options, resolve, reject);
showEditor(options, resolve);
});
}

View file

@ -130,7 +130,7 @@ class Manager {
/**
* Called when the player changes.
*/
onPlayerChange(newPlayer, newTarget, oldPlayer) {
onPlayerChange(newPlayer) {
this.bindToPlayer(newPlayer);
}
@ -228,9 +228,8 @@ class Manager {
/**
* Handles a playback command from the server.
* @param {Object} cmd The playback command.
* @param {Object} apiClient The ApiClient.
*/
processCommand(cmd, apiClient) {
processCommand(cmd) {
if (cmd === null) return;
if (typeof cmd.When === 'string') {
@ -277,9 +276,8 @@ class Manager {
/**
* Handles a group state change.
* @param {Object} update The group state update.
* @param {Object} apiClient The ApiClient.
*/
processStateChange(update, apiClient) {
processStateChange(update) {
if (update === null || update.State === null || update.Reason === null) return;
if (!this.isSyncPlayEnabled()) {

View file

@ -158,6 +158,7 @@ class GenericPlayer {
* Sets the playback rate, if supported.
* @param {number} value The playback rate.
*/
// eslint-disable-next-line no-unused-vars
setPlaybackRate(value) {
// Do nothing.
}
@ -196,6 +197,7 @@ class GenericPlayer {
* Seeks the player to the specified position.
* @param {number} positionTicks The new position.
*/
// eslint-disable-next-line no-unused-vars
localSeek(positionTicks) {
}
@ -211,6 +213,7 @@ class GenericPlayer {
* Sends a command to the player.
* @param {Object} command The command.
*/
// eslint-disable-next-line no-unused-vars
localSendCommand(command) {
}
@ -219,6 +222,7 @@ class GenericPlayer {
* Starts playback.
* @param {Object} options Playback data.
*/
// eslint-disable-next-line no-unused-vars
localPlay(options) {
}
@ -227,6 +231,7 @@ class GenericPlayer {
* Sets playing item from playlist.
* @param {string} playlistItemId The item to play.
*/
// eslint-disable-next-line no-unused-vars
localSetCurrentPlaylistItem(playlistItemId) {
}
@ -235,6 +240,7 @@ class GenericPlayer {
* Removes items from playlist.
* @param {Array} playlistItemIds The items to remove.
*/
// eslint-disable-next-line no-unused-vars
localRemoveFromPlaylist(playlistItemIds) {
}
@ -244,6 +250,7 @@ class GenericPlayer {
* @param {string} playlistItemId The item to move.
* @param {number} newIndex The new position.
*/
// eslint-disable-next-line no-unused-vars
localMovePlaylistItem(playlistItemId, newIndex) {
}
@ -252,6 +259,7 @@ class GenericPlayer {
* Queues in the playlist.
* @param {Object} options Queue data.
*/
// eslint-disable-next-line no-unused-vars
localQueue(options) {
}
@ -260,6 +268,7 @@ class GenericPlayer {
* Queues after the playing item in the playlist.
* @param {Object} options Queue data.
*/
// eslint-disable-next-line no-unused-vars
localQueueNext(options) {
}
@ -282,6 +291,7 @@ class GenericPlayer {
* Sets repeat mode.
* @param {string} value The repeat mode.
*/
// eslint-disable-next-line no-unused-vars
localSetRepeatMode(value) {
}
@ -290,6 +300,7 @@ class GenericPlayer {
* Sets shuffle mode.
* @param {string} value The shuffle mode.
*/
// eslint-disable-next-line no-unused-vars
localSetQueueShuffleMode(value) {
}

View file

@ -135,7 +135,7 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
/**
* Overrides PlaybackManager's seek method.
*/
seekRequest(positionTicks, player) {
seekRequest(positionTicks) {
const controller = syncPlayManager.getController();
controller.seek(positionTicks);
}
@ -148,19 +148,19 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
const controller = syncPlayManager.getController();
const playerWrapper = syncPlayManager.getPlayerWrapper();
const defaultAction = (_command, _player) => {
const defaultAction = (_command) => {
playerWrapper.localSendCommand(_command);
};
const ignoreCallback = (_command, _player) => {
const ignoreCallback = () => {
// Do nothing.
};
const SetRepeatModeCallback = (_command, _player) => {
const SetRepeatModeCallback = (_command) => {
controller.setRepeatMode(_command.Arguments.RepeatMode);
};
const SetShuffleQueueCallback = (_command, _player) => {
const SetShuffleQueueCallback = (_command) => {
controller.setShuffleMode(_command.Arguments.ShuffleMode);
};
@ -176,7 +176,7 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
if (typeof commandHandler === 'function') {
commandHandler(command, player);
} else {
defaultAction(command, player);
defaultAction(command);
}
}
@ -242,7 +242,7 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
/**
* Overrides PlaybackManager's setCurrentPlaylistItem method.
*/
setCurrentPlaylistItemRequest(playlistItemId, player) {
setCurrentPlaylistItemRequest(playlistItemId) {
const controller = syncPlayManager.getController();
controller.setCurrentPlaylistItem(playlistItemId);
}
@ -250,7 +250,7 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
/**
* Overrides PlaybackManager's removeFromPlaylist method.
*/
removeFromPlaylistRequest(playlistItemIds, player) {
removeFromPlaylistRequest(playlistItemIds) {
const controller = syncPlayManager.getController();
controller.removeFromPlaylist(playlistItemIds);
}
@ -258,7 +258,7 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
/**
* Overrides PlaybackManager's movePlaylistItem method.
*/
movePlaylistItemRequest(playlistItemId, newIndex, player) {
movePlaylistItemRequest(playlistItemId, newIndex) {
const controller = syncPlayManager.getController();
controller.movePlaylistItem(playlistItemId, newIndex);
}
@ -266,7 +266,7 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
/**
* Overrides PlaybackManager's queue method.
*/
queueRequest(options, player) {
queueRequest(options) {
const controller = syncPlayManager.getController();
controller.queue(options);
}
@ -274,7 +274,7 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
/**
* Overrides PlaybackManager's queueNext method.
*/
queueNextRequest(options, player) {
queueNextRequest(options) {
const controller = syncPlayManager.getController();
controller.queueNext(options);
}
@ -282,7 +282,7 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
/**
* Overrides PlaybackManager's nextTrack method.
*/
nextTrackRequest(player) {
nextTrackRequest() {
const controller = syncPlayManager.getController();
controller.nextItem();
}
@ -290,7 +290,7 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
/**
* Overrides PlaybackManager's previousTrack method.
*/
previousTrackRequest(player) {
previousTrackRequest() {
const controller = syncPlayManager.getController();
controller.previousItem();
}
@ -298,7 +298,7 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
/**
* Overrides PlaybackManager's setRepeatMode method.
*/
setRepeatModeRequest(mode, player) {
setRepeatModeRequest(mode) {
const controller = syncPlayManager.getController();
controller.setRepeatMode(mode);
}
@ -306,7 +306,7 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
/**
* Overrides PlaybackManager's setQueueShuffleMode method.
*/
setQueueShuffleModeRequest(mode, player) {
setQueueShuffleModeRequest(mode) {
const controller = syncPlayManager.getController();
controller.setShuffleMode(mode);
}
@ -314,7 +314,7 @@ class NoActivePlayer extends SyncPlay.Players.GenericPlayer {
/**
* Overrides PlaybackManager's toggleQueueShuffleMode method.
*/
toggleQueueShuffleModeRequest(player) {
toggleQueueShuffleModeRequest() {
const controller = syncPlayManager.getController();
controller.toggleShuffleMode();
}

View file

@ -21,14 +21,14 @@ class QueueManager {
/**
* Placeholder for original PlayQueueManager method.
*/
setPlaylist(items) {
setPlaylist() {
// Do nothing.
}
/**
* Placeholder for original PlayQueueManager method.
*/
queue(items) {
queue() {
// Do nothing.
}
@ -49,14 +49,14 @@ class QueueManager {
/**
* Placeholder for original PlayQueueManager method.
*/
clearPlaylist(clearCurrentItem = false) {
clearPlaylist() {
// Do nothing.
}
/**
* Placeholder for original PlayQueueManager method.
*/
queueNext(items) {
queueNext() {
// Do nothing.
}
@ -90,28 +90,28 @@ class QueueManager {
/**
* Placeholder for original PlayQueueManager method.
*/
setPlaylistState(playlistItemId, playlistIndex) {
setPlaylistState() {
// Do nothing.
}
/**
* Placeholder for original PlayQueueManager method.
*/
setPlaylistIndex(playlistIndex) {
setPlaylistIndex() {
// Do nothing.
}
/**
* Placeholder for original PlayQueueManager method.
*/
removeFromPlaylist(playlistItemIds) {
removeFromPlaylist() {
// Do nothing.
}
/**
* Placeholder for original PlayQueueManager method.
*/
movePlaylistItem(playlistItemId, newIndex) {
movePlaylistItem() {
// Do nothing.
return {
result: 'noop'
@ -128,7 +128,7 @@ class QueueManager {
/**
* Placeholder for original PlayQueueManager method.
*/
setRepeatMode(value) {
setRepeatMode() {
// Do nothing.
}
@ -142,7 +142,7 @@ class QueueManager {
/**
* Placeholder for original PlayQueueManager method.
*/
setShuffleMode(value) {
setShuffleMode() {
// Do nothing.
}

View file

@ -4,7 +4,7 @@ import layoutManager from '../layoutManager';
import '../../elements/emby-tabs/emby-tabs';
import { appRouter } from '../appRouter';
function onViewDestroy(e) {
function onViewDestroy() {
const tabControllers = this.tabControllers;
if (tabControllers) {
@ -78,7 +78,7 @@ class TabbedView {
view.addEventListener('viewbeforehide', this.onPause.bind(this));
view.addEventListener('viewbeforeshow', function (e) {
view.addEventListener('viewbeforeshow', function () {
mainTabsManager.setTabs(view, currentTabIndex, self.getTabs, getTabContainers, onBeforeTabChange, onTabChange, false);
});
@ -89,7 +89,7 @@ class TabbedView {
view.addEventListener('viewdestroy', onViewDestroy.bind(this));
}
onResume(options) {
onResume() {
this.setTitle();
backdrop.clearBackdrop();

View file

@ -11,7 +11,6 @@ import './formdialog.scss';
import '../elements/emby-button/emby-button';
import '../elements/emby-itemscontainer/emby-itemscontainer';
import './cardbuilder/card.scss';
import ServerConnections from './ServerConnections';
const enableFocusTransform = !browser.slow && !browser.edge;
@ -106,7 +105,7 @@ function renderDevices(view, devices) {
}
}
function discoverDevices(view, apiClient) {
function discoverDevices(view) {
loading.show();
view.querySelector('.loadingContent').classList.remove('hide');
return ApiClient.getJSON(ApiClient.getUrl('LiveTv/Tuners/Discvover', {
@ -120,7 +119,7 @@ function discoverDevices(view, apiClient) {
}
function tunerPicker() {
this.show = function (options) {
this.show = function () {
const dialogOptions = {
removeOnClose: true,
scrollY: false
@ -163,8 +162,7 @@ function tunerPicker() {
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
}
const apiClient = ServerConnections.getApiClient(options.serverId);
discoverDevices(dlg, apiClient);
discoverDevices(dlg);
if (layoutManager.tv) {
scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false);

View file

@ -149,7 +149,7 @@ export default function (page, providerId, options) {
}),
data: JSON.stringify(info),
contentType: 'application/json'
}).then(function (result) {
}).then(function () {
loading.hide();
if (options.showConfirmation) {
@ -190,7 +190,7 @@ export default function (page, providerId, options) {
}
loading.hide();
}, function (result) {
}, function () {
Dashboard.alert({
message: globalize.translate('ErrorGettingTvLineups')
});

View file

@ -88,7 +88,7 @@ export default function (page, providerId, options) {
}),
data: JSON.stringify(info),
contentType: 'application/json'
}).then(function (result) {
}).then(function () {
loading.hide();
if (options.showConfirmation !== false) {

View file

@ -119,7 +119,7 @@ import Dashboard from '../scripts/clientUtils';
function parseHtml(html, hasScript) {
if (hasScript) {
html = replaceAll(html, '\x3c!--<script', '<script');
html = replaceAll(html, '<\/script>--\x3e', '<\/script>');
html = replaceAll(html, '</script>--\x3e', '</script>');
}
const wrapper = document.createElement('div');

View file

@ -218,17 +218,17 @@ import confirm from '../../components/confirm/confirm';
});
}
function renderInfo(view, sessions, forceUpdate) {
function renderInfo(view, sessions) {
sessions = filterSessions(sessions);
renderActiveConnections(view, sessions);
loading.hide();
}
function pollForInfo(view, apiClient, forceUpdate) {
function pollForInfo(view, apiClient) {
apiClient.getSessions({
ActiveWithinSeconds: 960
}).then(function (sessions) {
renderInfo(view, sessions, forceUpdate);
renderInfo(view, sessions);
});
apiClient.getScheduledTasks().then(function (tasks) {
renderRunningTasks(view, tasks);
@ -730,7 +730,7 @@ import confirm from '../../components/confirm/confirm';
});
}
};
export default function (view, params) {
export default function (view) {
function onRestartRequired(evt, apiClient) {
console.debug('onRestartRequired not implemented', evt, apiClient);
}
@ -745,14 +745,14 @@ import confirm from '../../components/confirm/confirm';
function onPackageInstalling(evt, apiClient) {
if (apiClient.serverId() === serverId) {
pollForInfo(view, apiClient, true);
pollForInfo(view, apiClient);
reloadSystemInfo(view, apiClient);
}
}
function onPackageInstallationCompleted(evt, apiClient) {
if (apiClient.serverId() === serverId) {
pollForInfo(view, apiClient, true);
pollForInfo(view, apiClient);
reloadSystemInfo(view, apiClient);
}
}

View file

@ -48,7 +48,7 @@ import Dashboard from '../../../scripts/clientUtils';
return false;
}
export default function (view, params) {
export default function (view) {
view.querySelector('form').addEventListener('submit', onSubmit);
view.addEventListener('viewshow', loadData);
}

View file

@ -149,7 +149,7 @@ import confirm from '../../../components/confirm/confirm';
}
const canEdit = ApiClient.isMinServerVersion('3.4.1.31');
export default function (view, params) {
export default function (view) {
view.querySelector('.devicesList').addEventListener('click', function (e) {
const btnDeviceMenu = dom.parentWithClass(e.target, 'btnDeviceMenu');

View file

@ -48,13 +48,13 @@ import alert from '../../components/alert';
loading.hide();
}
function onSaveEncodingPathFailure(response) {
function onSaveEncodingPathFailure() {
loading.hide();
alert(globalize.translate('FFmpegSavePathNotFound'));
}
function updateEncoder(form) {
return ApiClient.getSystemInfo().then(function (systemInfo) {
return ApiClient.getSystemInfo().then(function () {
return ApiClient.ajax({
url: ApiClient.getUrl('System/MediaEncoder/Path'),
type: 'POST',

View file

@ -19,7 +19,6 @@ import alert from '../../components/alert';
$('#selectLocalizationLanguage', page).html(languageOptions.map(function (language) {
return '<option value="' + language.Value + '">' + language.Name + '</option>';
})).val(config.UICulture);
currentLanguage = config.UICulture;
loading.hide();
}
@ -34,16 +33,11 @@ import alert from '../../components/alert';
config.CachePath = form.querySelector('#txtCachePath').value;
config.MetadataPath = $('#txtMetadataPath', form).val();
config.MetadataNetworkPath = $('#txtMetadataNetworkPath', form).val();
let requiresReload = config.UICulture !== currentLanguage;
ApiClient.updateServerConfiguration(config).then(function() {
ApiClient.getNamedConfiguration(brandingConfigKey).then(function(brandingConfig) {
brandingConfig.LoginDisclaimer = form.querySelector('#txtLoginDisclaimer').value;
brandingConfig.CustomCss = form.querySelector('#txtCustomCss').value;
if (currentBrandingOptions && brandingConfig.CustomCss !== currentBrandingOptions.CustomCss) {
requiresReload = true;
}
ApiClient.updateNamedConfiguration(brandingConfigKey, brandingConfig).then(function () {
Dashboard.processServerConfigurationUpdateResult();
});
@ -56,10 +50,8 @@ import alert from '../../components/alert';
return false;
}
let currentBrandingOptions;
let currentLanguage;
const brandingConfigKey = 'branding';
export default function (view, params) {
export default function (view) {
$('#btnSelectCachePath', view).on('click.selectDirectory', function () {
import('../../components/directorybrowser/directorybrowser').then(({default: directoryBrowser}) => {
const picker = new directoryBrowser();
@ -110,7 +102,6 @@ import alert from '../../components/alert';
loadPage(view, responses[0], responses[1], responses[2]);
});
ApiClient.getNamedConfiguration(brandingConfigKey).then(function (config) {
currentBrandingOptions = config;
view.querySelector('#txtLoginDisclaimer').value = config.LoginDisclaimer || '';
view.querySelector('#txtCustomCss').value = config.CustomCss || '';
});

View file

@ -23,7 +23,7 @@ import Dashboard from '../../scripts/clientUtils';
}];
}
export default function(view, params) {
export default function(view) {
function loadData() {
ApiClient.getServerConfiguration().then(function(config) {
view.querySelector('.chkFolderView').checked = config.EnableFolderView;

View file

@ -6,7 +6,7 @@ import '../../assets/css/flexstyles.scss';
/* eslint-disable indent */
export default function(view, params) {
export default function(view) {
view.addEventListener('viewbeforeshow', function() {
loading.show();
const apiClient = ApiClient;

View file

@ -31,13 +31,13 @@ import alert from '../../components/alert';
config.EnableExtraThumbsDuplication = form.querySelector('#chkEnableExtraThumbs').checked;
ApiClient.updateNamedConfiguration(metadataKey, config).then(function () {
Dashboard.processServerConfigurationUpdateResult();
showConfirmMessage(config);
showConfirmMessage();
});
});
return false;
}
function showConfirmMessage(config) {
function showConfirmMessage() {
const msg = [];
msg.push(globalize.translate('MetadataSettingChangeHelp'));
alert({

View file

@ -131,7 +131,7 @@ import alert from '../../components/alert';
}
}
export default function (view, params) {
export default function (view) {
function loadPage(page, config) {
page.querySelector('#txtPortNumber').value = config.HttpServerPortNumber;
page.querySelector('#txtPublicPort').value = config.PublicPort;
@ -198,7 +198,7 @@ import alert from '../../components/alert';
});
});
view.querySelector('.dashboardHostingForm').addEventListener('submit', onSubmit);
view.addEventListener('viewshow', function (e) {
view.addEventListener('viewshow', function () {
loading.show();
ApiClient.getNamedConfiguration('network').then(function (config) {
loadPage(view, config);

View file

@ -91,7 +91,7 @@ function save(page) {
}).map(function (c) {
return c.getAttribute('data-itemid');
});
ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function (r) {
ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function () {
Dashboard.processServerConfigurationUpdateResult();
Dashboard.navigate('notificationsettings.html');
});

View file

@ -54,7 +54,7 @@ function reload(page) {
});
}
export default function (view, params) {
export default function (view) {
view.addEventListener('viewshow', function () {
reload(view);
});

View file

@ -19,7 +19,7 @@ function reloadList(page) {
noneElement: page.querySelector('#none'),
repositories: repositories
});
}).catch(error => {
}).catch(() => {
console.error('error loading repositories');
page.querySelector('#none').classList.remove('hide');
loading.hide();
@ -33,9 +33,9 @@ function saveList(page) {
url: ApiClient.getUrl('Repositories'),
data: JSON.stringify(repositories),
contentType: 'application/json'
}).then(response => {
}).then(() => {
reloadList(page);
}).catch(error => {
}).catch(() => {
console.error('error saving repositories');
loading.hide();
});
@ -90,7 +90,7 @@ function getTabs() {
}];
}
export default function(view, params) {
export default function(view) {
view.addEventListener('viewshow', function () {
libraryMenu.setTabs('plugins', 2, getTabs);
reloadList(this);

View file

@ -207,7 +207,7 @@ import confirm from '../../../components/confirm/confirm';
return trigger;
}
};
export default function (view, params) {
export default function (view) {
function onSubmit(e) {
loading.show();
const id = getParameterByName('id');

View file

@ -123,7 +123,7 @@ import '../../../elements/emby-button/emby-button';
$(elem).parents('.listItem')[0].setAttribute('data-status', state);
}
export default function(view, params) {
export default function(view) {
function updateTasks(tasks) {
for (let i = 0; i < tasks.length; i++) {
const task = tasks[i];

View file

@ -108,7 +108,7 @@ import toast from '../../../components/toast/toast';
loading.hide();
}
function onSaveComplete(page, user) {
function onSaveComplete() {
Dashboard.navigate('userprofiles.html');
loading.hide();
toast(globalize.translate('SettingsSaved'));
@ -146,7 +146,7 @@ import toast from '../../../components/toast/toast';
}
ApiClient.updateUser(user).then(function () {
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
onSaveComplete(page, user);
onSaveComplete();
});
});
}

View file

@ -91,7 +91,7 @@ import toast from '../../../components/toast/toast';
loading.hide();
}
function onSaveComplete(page) {
function onSaveComplete() {
loading.hide();
toast(globalize.translate('SettingsSaved'));
}
@ -118,7 +118,7 @@ import toast from '../../../components/toast/toast';
user.Policy.BlockedChannels = null;
user.Policy.BlockedMediaFolders = null;
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
onSaveComplete(page);
onSaveComplete();
});
}

View file

@ -89,7 +89,7 @@ import toast from '../../../components/toast/toast';
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
Dashboard.navigate('useredit.html?userId=' + user.Id);
});
}, function (response) {
}, function () {
toast(globalize.translate('ErrorDefault'));
loading.hide();
});

View file

@ -161,7 +161,7 @@ import toast from '../../../components/toast/toast';
});
}
function onSaveComplete(page) {
function onSaveComplete() {
loading.hide();
toast(globalize.translate('SettingsSaved'));
}
@ -176,7 +176,7 @@ import toast from '../../../components/toast/toast';
user.Policy.AccessSchedules = getSchedulesFromPage(page);
user.Policy.BlockedTags = getBlockedTagsFromPage(page);
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
onSaveComplete(page);
onSaveComplete();
});
}

View file

@ -82,7 +82,7 @@ import cardBuilder from '../../../components/cardbuilder/cardBuilder';
});
}
function getUserHtml(user, addConnectIndicator) {
function getUserHtml(user) {
let html = '';
let cssClass = 'card squareCard scalableCard squareCard-scalable';
@ -146,14 +146,14 @@ import cardBuilder from '../../../components/cardbuilder/cardBuilder';
return '';
}
function getUserSectionHtml(users, addConnectIndicator) {
function getUserSectionHtml(users) {
return users.map(function (u__q) {
return getUserHtml(u__q, addConnectIndicator);
return getUserHtml(u__q);
}).join('');
}
function renderUsers(page, users) {
page.querySelector('.localUsers').innerHTML = getUserSectionHtml(users, true);
page.querySelector('.localUsers').innerHTML = getUserSectionHtml(users);
}
function loadData(page) {

View file

@ -14,7 +14,7 @@ function reload(context, itemId) {
}
}
export default function (view, params) {
export default function (view) {
view.addEventListener('viewshow', function () {
reload(this, MetadataEditor.getCurrentItemId());
});

View file

@ -1795,7 +1795,7 @@ function renderMusicVideos(page, item, user) {
}).then(function (result) {
if (result.Items.length) {
page.querySelector('#musicVideosCollapsible').classList.remove('hide');
const musicVideosContent = page.querySelector('.musicVideosContent');
const musicVideosContent = page.querySelector('#musicVideosContent');
musicVideosContent.innerHTML = getVideosHtml(result.Items);
imageLoader.lazyChildren(musicVideosContent);
} else {

View file

@ -817,7 +817,7 @@ class ItemsView {
itemsContainer: self.itemsContainer
});
});
view.addEventListener('viewhide', function (e) {
view.addEventListener('viewhide', function () {
const itemsContainer = self.itemsContainer;
if (itemsContainer) {

View file

@ -104,7 +104,7 @@ export default function (view, params, tabContent) {
});
}
function reloadItems(context, save) {
function reloadItems(context) {
loading.show();
isLoading = true;
const query = getQuery();

View file

@ -64,7 +64,7 @@ function renderRecordingFolders(context, promise) {
});
}
function onMoreClick(e) {
function onMoreClick() {
const type = this.getAttribute('data-type');
const serverId = ApiClient.serverId();

View file

@ -246,7 +246,7 @@ function addProvider(button) {
});
}
function addDevice(button) {
function addDevice() {
Dashboard.navigate('livetvtuner.html');
}
@ -296,7 +296,7 @@ function onDevicesListClick(e) {
$(document).on('pageinit', '#liveTvStatusPage', function () {
const page = this;
$('.btnAddDevice', page).on('click', function () {
addDevice(this);
addDevice();
});
$('.formAddDevice', page).on('submit', function () {
submitAddDeviceForm(page);

View file

@ -91,7 +91,7 @@ function submitForm(page) {
url: ApiClient.getUrl('LiveTv/TunerHosts'),
data: JSON.stringify(info),
contentType: 'application/json'
}).then(function (result) {
}).then(function () {
Dashboard.processServerConfigurationUpdateResult();
Dashboard.navigate('livetvstatus.html');
}, function () {

View file

@ -155,7 +155,7 @@ import Dashboard from '../../scripts/clientUtils';
return html;
}
function loadSuggestions(page, userId, parentId) {
function loadSuggestions(page, userId) {
const screenWidth = dom.getWindowSize().innerWidth;
const url = ApiClient.getUrl('Movies/Recommendations', {
userId: userId,
@ -222,7 +222,7 @@ import Dashboard from '../../scripts/clientUtils';
const userId = ApiClient.getCurrentUserId();
loadResume(tabContent, userId, parentId);
loadLatest(tabContent, userId, parentId);
loadSuggestions(tabContent, userId, parentId);
loadSuggestions(tabContent, userId);
}
function getTabs() {
@ -389,7 +389,7 @@ import Dashboard from '../../scripts/clientUtils';
const tabControllers = [];
let renderedTabs = [];
view.addEventListener('viewshow', function (e) {
view.addEventListener('viewshow', function () {
initTabs();
if (!view.getAttribute('data-title')) {
const parentId = params.topParentId;

View file

@ -24,7 +24,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer';
function shuffle() {
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) {
getQuery();
playbackManager.shuffle(item, null);
playbackManager.shuffle(item);
});
}
@ -84,7 +84,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer';
itemsContainer.innerHTML = '';
};
const reloadItems = (page) => {
const reloadItems = () => {
loading.show();
isLoading = true;
const query = getQuery();
@ -97,7 +97,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer';
if (userSettings.libraryPageSize() > 0) {
query.StartIndex += query.Limit;
}
reloadItems(tabContent);
reloadItems();
}
function onPreviousPageClick() {
@ -108,11 +108,11 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer';
if (userSettings.libraryPageSize() > 0) {
query.StartIndex = Math.max(0, query.StartIndex - query.Limit);
}
reloadItems(tabContent);
reloadItems();
}
window.scrollTo(0, 0);
updateFilterControls(page);
updateFilterControls();
let html;
const pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
@ -185,7 +185,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer';
});
};
const updateFilterControls = (tabContent) => {
const updateFilterControls = () => {
const query = getQuery();
if (this.alphaPicker) {
@ -212,7 +212,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer';
});
Events.on(filterDialog, 'filterchange', function () {
getQuery().StartIndex = 0;
reloadItems(tabContent);
reloadItems();
});
filterDialog.show();
@ -232,7 +232,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer';
const query = getQuery();
query.NameStartsWith = newValue;
query.StartIndex = 0;
reloadItems(tabContent);
reloadItems();
});
this.alphaPicker = new AlphaPicker({
@ -274,7 +274,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer';
}],
callback: function () {
getQuery().StartIndex = 0;
reloadItems(tabContent);
reloadItems();
},
query: getQuery(),
button: e.target
@ -292,7 +292,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer';
libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle);
getQuery().StartIndex = 0;
onViewStyleChange();
reloadItems(tabContent);
reloadItems();
});
tabContent.querySelector('.btnPlayAll').addEventListener('click', playAll);
@ -303,8 +303,8 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer';
onViewStyleChange();
this.renderTab = function () {
reloadItems(tabContent);
updateFilterControls(tabContent);
reloadItems();
updateFilterControls();
};
this.destroy = function () {};

View file

@ -373,7 +373,7 @@ import Dashboard from '../../scripts/clientUtils';
const tabControllers = [];
const renderedTabs = [];
view.addEventListener('viewshow', function (e) {
view.addEventListener('viewshow', function () {
initTabs();
if (!view.getAttribute('data-title')) {
const parentId = params.topParentId;
@ -391,10 +391,10 @@ import Dashboard from '../../scripts/clientUtils';
inputManager.on(window, onInputCommand);
});
view.addEventListener('viewbeforehide', function (e) {
view.addEventListener('viewbeforehide', function () {
inputManager.off(window, onInputCommand);
});
view.addEventListener('viewdestroy', function (e) {
view.addEventListener('viewdestroy', function () {
tabControllers.forEach(function (t) {
if (t.destroy) {
t.destroy();

View file

@ -2,17 +2,17 @@ import remotecontrolFactory from '../../../components/remotecontrol/remotecontro
import libraryMenu from '../../../scripts/libraryMenu';
import '../../../elements/emby-button/emby-button';
export default function (view, params) {
export default function (view) {
const remoteControl = new remotecontrolFactory();
remoteControl.init(view, view.querySelector('.remoteControlContent'));
view.addEventListener('viewshow', function (e) {
view.addEventListener('viewshow', function () {
libraryMenu.setTransparentMenu(true);
if (remoteControl) {
remoteControl.onShow();
}
});
view.addEventListener('viewbeforehide', function (e) {
view.addEventListener('viewbeforehide', function () {
libraryMenu.setTransparentMenu(false);
if (remoteControl) {

View file

@ -28,7 +28,7 @@ import { appRouter } from '../../../components/appRouter';
return document.querySelector('.dialogContainer .dialog.opened');
}
export default function (view, params) {
export default function (view) {
function getDisplayItem(item) {
if (item.Type === 'TvChannel') {
const apiClient = ServerConnections.getApiClient(item.ServerId);
@ -426,18 +426,18 @@ import { appRouter } from '../../../components/appRouter';
if (state.NowPlayingItem) {
isEnabled = true;
updatePlayerStateInternal(event, player, state);
updatePlaylist(player);
updatePlaylist();
enableStopOnBack(true);
}
}
function onPlayPauseStateChanged(e) {
function onPlayPauseStateChanged() {
if (isEnabled) {
updatePlayPauseState(this.paused());
}
}
function onVolumeChanged(e) {
function onVolumeChanged() {
if (isEnabled) {
const player = this;
updatePlayerVolumeState(player, player.isMuted(), player.getVolume());
@ -472,7 +472,7 @@ import { appRouter } from '../../../components/appRouter';
}
}
function onMediaStreamsChanged(e) {
function onMediaStreamsChanged() {
const player = this;
const state = playbackManager.getPlayerState(player);
onStateChanged.call(player, {
@ -534,7 +534,7 @@ import { appRouter } from '../../../components/appRouter';
}
}
function onTimeUpdate(e) {
function onTimeUpdate() {
// Test for 'currentItem' is required for Firefox since its player spams 'timeupdate' events even being at breakpoint
if (isEnabled && currentItem) {
const now = new Date().getTime();
@ -794,7 +794,7 @@ import { appRouter } from '../../../components/appRouter';
}
}
function updatePlaylist(player) {
function updatePlaylist() {
const btnPreviousTrack = view.querySelector('.btnPreviousTrack');
const btnNextTrack = view.querySelector('.btnNextTrack');
btnPreviousTrack.classList.remove('hide');
@ -818,7 +818,7 @@ import { appRouter } from '../../../components/appRouter';
elem.innerHTML = html;
}
function onSettingsButtonClick(e) {
function onSettingsButtonClick() {
const btn = this;
import('../../../components/playback/playersettingsmenu').then((playerSettingsMenu) => {
@ -1261,11 +1261,11 @@ import { appRouter } from '../../../components/appRouter';
nowPlayingPositionSlider.classList.add('focusable');
}
view.addEventListener('viewbeforeshow', function (e) {
view.addEventListener('viewbeforeshow', function () {
headerElement.classList.add('osdHeader');
appRouter.setTransparency('full');
});
view.addEventListener('viewshow', function (e) {
view.addEventListener('viewshow', function () {
try {
Events.on(playbackManager, 'playerchange', onPlayerChange);
bindToPlayer(playbackManager.getCurrentPlayer());

View file

@ -49,7 +49,7 @@ import ServerConnections from '../../../components/ServerConnections';
});
}
export default function(view, params) {
export default function(view) {
view.querySelector('.addServerForm').addEventListener('submit', onServerSubmit);
view.querySelector('.btnCancel').addEventListener('click', goBack);
@ -64,7 +64,7 @@ import ServerConnections from '../../../components/ServerConnections';
}
function goBack() {
import('../../../components/appRouter').then(({default: appRouter}) => {
import('../../../components/appRouter').then(({appRouter}) => {
appRouter.back();
});
}

View file

@ -36,7 +36,7 @@ import Dashboard from '../../../scripts/clientUtils';
}
}
export default function (view, params) {
export default function (view) {
function onSubmit(e) {
ApiClient.ajax({
type: 'POST',

Some files were not shown because too many files have changed in this diff Show more