From ea9e79f4d35446d527c49ae9059e240896037980 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 16 Feb 2020 12:17:13 +0900 Subject: [PATCH 001/120] add basic web client configuration --- .gitignore | 584 +--------------------------- src/components/apphost.js | 8 +- src/config.example.json | 3 + src/scripts/settings/webSettings.js | 30 ++ src/scripts/site.js | 1 + 5 files changed, 47 insertions(+), 579 deletions(-) create mode 100644 src/config.example.json create mode 100644 src/scripts/settings/webSettings.js diff --git a/.gitignore b/.gitignore index 2e12adf220..2bb5bc64d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,578 +1,10 @@ +# config +config.json -# Created by https://www.gitignore.io/api/node,rider,macos,linux,windows,visualstudio,visualstudiocode -# Edit at https://www.gitignore.io/?templates=node,rider,macos,linux,windows,visualstudio,visualstudiocode +# npm +dist +node_modules -### Linux ### -*~ - -# temporary files which can be created if a process still has a handle open of a deleted file -.fuse_hidden* - -# KDE directory preferences -.directory - -# Linux trash folder which might appear on any partition or disk -.Trash-* - -# .nfs files are created when an open file is removed but is still being accessed -.nfs* - -### macOS ### -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Dependency lockfile -package-lock.json - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -### Rider ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/modules.xml -# .idea/*.iml -# .idea/modules - -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format -*.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -### VisualStudioCode Patch ### -# Ignore all local history of files -.history - -### Windows ### -# Windows thumbnail cache files -Thumbs.db -ehthumbs.db -ehthumbs_vista.db - -# Dump file -*.stackdump - -# Folder config file -[Dd]esktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msix -*.msm -*.msp - -# Windows shortcuts -*.lnk - -### VisualStudio ### -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ -# ASP.NET Core default setup: bower directory is configured as wwwroot/lib/ and bower restore is true -**/wwwroot/lib/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- Backup*.rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# JetBrains Rider -.idea/ -*.sln.iml - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# End of https://www.gitignore.io/api/node,rider,macos,linux,windows,visualstudio,visualstudiocode - -# dist for webpack output -dist \ No newline at end of file +# ide +.idea +.vscode diff --git a/src/components/apphost.js b/src/components/apphost.js index 2a0b7b19e9..5058148ae6 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -1,4 +1,4 @@ -define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSettings, browser, events, htmlMediaHelper) { +define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], function (appSettings, browser, events, htmlMediaHelper, webSettings) { "use strict"; function getBaseProfileOptions(item) { @@ -276,10 +276,12 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet features.push("otherapppromotions"); features.push("displaymode"); features.push("targetblank"); - // allows users to connect to more than one server - //features.push("multiserver"); features.push("screensaver"); + if (webSettings.getMultiserver()) { + features.push("multiserver") + } + if (!browser.orsay && !browser.tizen && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || supportsCue())) { features.push("subtitleappearancesettings"); } diff --git a/src/config.example.json b/src/config.example.json new file mode 100644 index 0000000000..1e79270943 --- /dev/null +++ b/src/config.example.json @@ -0,0 +1,3 @@ +{ + "multiserver": true +} diff --git a/src/scripts/settings/webSettings.js b/src/scripts/settings/webSettings.js new file mode 100644 index 0000000000..e5bafb0b9d --- /dev/null +++ b/src/scripts/settings/webSettings.js @@ -0,0 +1,30 @@ +define(['appStorage', 'events'], function (appStorage, events) { + 'use strict'; + + function readConfig(path, callback) { + var file = new XMLHttpRequest(); + file.overrideMimeType("application/json"); + file.open("GET", path, true); + file.onreadystatechange = function() { + if (file.readyState === 4 && file.status == "200") { + callback(file.responseText); + } + } + + file.send(null); + } + + var data = {}; + + function WebSettings() { + readConfig("/config.json", function(text) { + data = JSON.parse(text); + }); + } + + WebSettings.prototype.getMultiserver = function () { + return data.multiserver !== false; + }; + + return new WebSettings(); +}); diff --git a/src/scripts/site.js b/src/scripts/site.js index f26e6b68ba..e1ea480f5d 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -809,6 +809,7 @@ var AppInfo = {}; define("appSettings", [scriptsPath + "/settings/appSettings"], returnFirstDependency); define("userSettings", [scriptsPath + "/settings/userSettings"], returnFirstDependency); + define("webSettings", [scriptsPath + "/settings/webSettings"], returnFirstDependency); define("chromecastHelper", [componentsPath + "/chromecast/chromecasthelpers"], returnFirstDependency); define("mediaSession", [componentsPath + "/playback/mediasession"], returnFirstDependency); From ed1b35f50fcf7bb2746842ab0cb566d2e230b9f0 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 16 Feb 2020 22:11:36 +0900 Subject: [PATCH 002/120] update some strings and use fetch for the global config --- src/components/apphost.js | 2 +- .../displaysettings.template.html | 2 +- src/components/skinManager.js | 4 ++-- .../subtitlesettings/subtitlesettings.js | 13 ++--------- .../subtitlesettings.template.html | 11 +++++---- src/scripts/settings/appSettings.js | 16 ++++++------- src/scripts/settings/webSettings.js | 23 ++++--------------- src/strings/en-us.json | 16 ++++++------- 8 files changed, 34 insertions(+), 53 deletions(-) diff --git a/src/components/apphost.js b/src/components/apphost.js index 5058148ae6..0a9b9d638c 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -278,7 +278,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], f features.push("targetblank"); features.push("screensaver"); - if (webSettings.getMultiserver()) { + if (webSettings.getMultiServer()) { features.push("multiserver") } diff --git a/src/components/displaysettings/displaysettings.template.html b/src/components/displaysettings/displaysettings.template.html index 16bbf0dd8a..4ef8c8b1ca 100644 --- a/src/components/displaysettings/displaysettings.template.html +++ b/src/components/displaysettings/displaysettings.template.html @@ -63,7 +63,7 @@
+
@@ -34,7 +34,6 @@
-

${HeaderSubtitleAppearance}

@@ -61,6 +60,7 @@
+
+
+
+
+ ${PreferEmbeddedEpisodeInfosOverFileNames} + +
${PreferEmbeddedEpisodeInfosOverFileNamesHelp}
+
+ + +
+ +
+
${ClientSettings}
+
+
+

${HeaderAdmin}

diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 62e8fa3f8f..f08de6b462 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -147,6 +147,7 @@ "ChannelNumber": "Channel number", "Channels": "Channels", "CinemaModeConfigurationHelp": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.", + "ClientSettings": "Client Settings", "Collections": "Collections", "ColorPrimaries": "Color primaries", "ColorSpace": "Color space", From 69a3c7cd538d5b35fef35b914f453e34e84ff20c Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 19 Mar 2020 14:37:48 -0400 Subject: [PATCH 012/120] Add FIXME to revisit show/hide button logic for tv providers --- src/components/tvproviders/schedulesdirect.js | 18 ++++++++++-------- src/components/tvproviders/xmltv.js | 16 ++++++++++------ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/components/tvproviders/schedulesdirect.js b/src/components/tvproviders/schedulesdirect.js index 5283cd2313..4a6f3d297f 100644 --- a/src/components/tvproviders/schedulesdirect.js +++ b/src/components/tvproviders/schedulesdirect.js @@ -264,18 +264,20 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em self.init = function () { options = options || {}; - // Show cancel button by default - if (options.showCancelButton !== false) { - page.querySelector(".btnCancel").classList.remove("hide"); - } else { + // Only hide the button if explicitly set to false; default to showing if undefined or null + // FIXME: rename this option to clarify logic + if (options.showCancelButton === false) { page.querySelector(".btnCancel").classList.add("hide"); + } else { + page.querySelector(".btnCancel").classList.remove("hide"); } - // Show submit button by default - if (options.showSubmitButton !== false) { - page.querySelector(".btnSubmitListings").classList.remove("hide"); - } else { + // Only hide the button if explicitly set to false; default to showing if undefined or null + // FIXME: rename this option to clarify logic + if (options.showSubmitButton === false) { page.querySelector(".btnSubmitListings").classList.add("hide"); + } else { + page.querySelector(".btnSubmitListings").classList.remove("hide"); } $(".formLogin", page).on("submit", function () { diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js index a86a1e1099..0ba164fe25 100644 --- a/src/components/tvproviders/xmltv.js +++ b/src/components/tvproviders/xmltv.js @@ -163,16 +163,20 @@ define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "pa self.init = function () { options = options || {}; - if (false !== options.showCancelButton) { - page.querySelector(".btnCancel").classList.remove("hide"); - } else { + // Only hide the button if explicitly set to false; default to showing if undefined or null + // FIXME: rename this option to clarify logic + if (options.showCancelButton === false) { page.querySelector(".btnCancel").classList.add("hide"); + } else { + page.querySelector(".btnCancel").classList.remove("hide"); } - if (false !== options.showSubmitButton) { - page.querySelector(".btnSubmitListings").classList.remove("hide"); - } else { + // Only hide the button if explicitly set to false; default to showing if undefined or null + // FIXME: rename this option to clarify logic + if (options.showSubmitButton === false) { page.querySelector(".btnSubmitListings").classList.add("hide"); + } else { + page.querySelector(".btnSubmitListings").classList.remove("hide"); } $("form", page).on("submit", function () { From e8bc839d0babd2c1a63e3eb4ff253ce43c948a9c Mon Sep 17 00:00:00 2001 From: dkanada Date: Fri, 20 Mar 2020 17:49:32 +0900 Subject: [PATCH 013/120] update methods for native shell --- src/components/shell.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/components/shell.js b/src/components/shell.js index f82f5eea3c..4f1aa0c8de 100644 --- a/src/components/shell.js +++ b/src/components/shell.js @@ -10,12 +10,6 @@ define([], function () { } }, - canExec: false, - exec: function (options) { - // options.path - // options.arguments - return Promise.reject(); - }, enableFullscreen: function () { if (window.NativeShell) { window.NativeShell.enableFullscreen(); From cb97baa61ab9a6c797a995e6010ffa12974f3b96 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 21 Mar 2020 18:14:08 +0100 Subject: [PATCH 014/120] Move prompt, confirm and sendcastapi to one module each --- src/components/castSenderApi.js | 34 +++++++++ src/components/confirm/confirm.js | 93 ++++++++++++++++--------- src/components/confirm/nativeconfirm.js | 27 ------- src/components/prompt/nativeprompt.js | 28 -------- src/components/prompt/prompt.js | 50 +++++++++---- src/scripts/site.js | 51 +------------- 6 files changed, 131 insertions(+), 152 deletions(-) create mode 100644 src/components/castSenderApi.js delete mode 100644 src/components/confirm/nativeconfirm.js delete mode 100644 src/components/prompt/nativeprompt.js diff --git a/src/components/castSenderApi.js b/src/components/castSenderApi.js new file mode 100644 index 0000000000..a1e7bd8755 --- /dev/null +++ b/src/components/castSenderApi.js @@ -0,0 +1,34 @@ +define([], function() { + 'use strict'; + + if (window.appMode === "cordova" || window.appMode === "android") { + return { + load: function () { + window.chrome = window.chrome || {}; + return Promise.resolve(); + } + }; + } else { + var ccLoaded = false; + return { + load: function () { + if (ccLoaded) { + return Promise.resolve(); + } + + return new Promise(function (resolve, reject) { + var fileref = document.createElement("script"); + fileref.setAttribute("type", "text/javascript"); + + fileref.onload = function () { + ccLoaded = true; + resolve(); + }; + + fileref.setAttribute("src", "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"); + document.querySelector("head").appendChild(fileref); + }); + } + }; + } +}); diff --git a/src/components/confirm/confirm.js b/src/components/confirm/confirm.js index f104350c87..fa9a156679 100644 --- a/src/components/confirm/confirm.js +++ b/src/components/confirm/confirm.js @@ -1,40 +1,65 @@ -define(['dialog', 'globalize'], function (dialog, globalize) { +define(["browser", "dialog", "globalize"], function(browser, dialog, globalize) { 'use strict'; - return function (text, title) { + function replaceAll(str, find, replace) { + return str.split(find).join(replace); + } - var options; - if (typeof text === 'string') { - options = { - title: title, - text: text - }; - } else { - options = text; - } - - var items = []; - - items.push({ - name: options.cancelText || globalize.translate('ButtonCancel'), - id: 'cancel', - type: 'cancel' - }); - - items.push({ - name: options.confirmText || globalize.translate('ButtonOk'), - id: 'ok', - type: options.primary === 'delete' ? 'delete' : 'submit' - }); - - options.buttons = items; - - return dialog(options).then(function (result) { - if (result === 'ok') { - return Promise.resolve(); + if (browser.tv && window.confirm) { + // Use the native confirm dialog + return function (options) { + if (typeof options === 'string') { + options = { + title: '', + text: options + }; } - return Promise.reject(); - }); - }; + var text = replaceAll(options.text || '', '
', '\n'); + var result = confirm(text); + + if (result) { + return Promise.resolve(); + } else { + return Promise.reject(); + } + }; + } else { + // Use our own dialog + return function (text, title) { + var options; + if (typeof text === 'string') { + options = { + title: title, + text: text + }; + } else { + options = text; + } + + var items = []; + + items.push({ + name: options.cancelText || globalize.translate('ButtonCancel'), + id: 'cancel', + type: 'cancel' + }); + + items.push({ + name: options.confirmText || globalize.translate('ButtonOk'), + id: 'ok', + type: options.primary === 'delete' ? 'delete' : 'submit' + }); + + options.buttons = items; + + return dialog(options).then(function (result) { + if (result === 'ok') { + return Promise.resolve(); + } + + return Promise.reject(); + }); + }; + } }); diff --git a/src/components/confirm/nativeconfirm.js b/src/components/confirm/nativeconfirm.js deleted file mode 100644 index 7d72bc5eaf..0000000000 --- a/src/components/confirm/nativeconfirm.js +++ /dev/null @@ -1,27 +0,0 @@ -define([], function () { - 'use strict'; - - function replaceAll(str, find, replace) { - - return str.split(find).join(replace); - } - - return function (options) { - - if (typeof options === 'string') { - options = { - title: '', - text: options - }; - } - - var text = replaceAll(options.text || '', '
', '\n'); - var result = confirm(text); - - if (result) { - return Promise.resolve(); - } else { - return Promise.reject(); - } - }; -}); diff --git a/src/components/prompt/nativeprompt.js b/src/components/prompt/nativeprompt.js deleted file mode 100644 index ba7f1a9a49..0000000000 --- a/src/components/prompt/nativeprompt.js +++ /dev/null @@ -1,28 +0,0 @@ -define([], function () { - 'use strict'; - - function replaceAll(str, find, replace) { - - return str.split(find).join(replace); - } - - return function (options) { - - if (typeof options === 'string') { - options = { - label: '', - text: options - }; - } - - var label = replaceAll(options.label || '', '
', '\n'); - - var result = prompt(label, options.text || ''); - - if (result) { - return Promise.resolve(result); - } else { - return Promise.reject(result); - } - }; -}); diff --git a/src/components/prompt/prompt.js b/src/components/prompt/prompt.js index 8f4f839eaa..32fadb811c 100644 --- a/src/components/prompt/prompt.js +++ b/src/components/prompt/prompt.js @@ -1,6 +1,10 @@ -define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function (dialogHelper, layoutManager, scrollHelper, globalize, dom, require) { +define(["browser", 'dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function(browser, dialogHelper, layoutManager, scrollHelper, globalize, dom, require) { 'use strict'; + function replaceAll(str, find, replace) { + return str.split(find).join(replace); + } + function setInputProperties(dlg, options) { var txtInput = dlg.querySelector('#txtInput'); @@ -13,7 +17,6 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 're } function showDialog(options, template) { - var dialogOptions = { removeOnClose: true, scrollY: false @@ -71,7 +74,6 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 're dlg.style.minWidth = (Math.min(400, dom.getWindowSize().innerWidth - 50)) + 'px'; return dialogHelper.open(dlg).then(function () { - if (layoutManager.tv) { scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); } @@ -86,19 +88,37 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 're }); } - return function (options) { + if ((browser.tv || browser.xboxOne) && window.confirm) { + return function (options) { + if (typeof options === 'string') { + options = { + label: '', + text: options + }; + } - return new Promise(function (resolve, reject) { - require(['text!./prompt.template.html'], function (template) { + var label = replaceAll(options.label || '', '
', '\n'); + var result = prompt(label, options.text || ''); - if (typeof options === 'string') { - options = { - title: '', - text: options - }; - } - showDialog(options, template).then(resolve, reject); + if (result) { + return Promise.resolve(result); + } else { + return Promise.reject(result); + } + }; + } else { + return function (options) { + return new Promise(function (resolve, reject) { + require(['text!./prompt.template.html'], function (template) { + if (typeof options === 'string') { + options = { + title: '', + text: options + }; + } + showDialog(options, template).then(resolve, reject); + }); }); - }); - }; + }; + } }); diff --git a/src/scripts/site.js b/src/scripts/site.js index 0ab8e9a1f0..6739e3cd59 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -355,39 +355,6 @@ var AppInfo = {}; return headroom; } - function getCastSenderApiLoader() { - var ccLoaded = false; - return { - load: function () { - if (ccLoaded) { - return Promise.resolve(); - } - - return new Promise(function (resolve, reject) { - var fileref = document.createElement("script"); - fileref.setAttribute("type", "text/javascript"); - - fileref.onload = function () { - ccLoaded = true; - resolve(); - }; - - fileref.setAttribute("src", "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"); - document.querySelector("head").appendChild(fileref); - }); - } - }; - } - - function getDummyCastSenderApiLoader() { - return { - load: function () { - window.chrome = window.chrome || {}; - return Promise.resolve(); - } - }; - } - function createSharedAppFooter(appFooter) { return new appFooter({}); } @@ -439,28 +406,16 @@ var AppInfo = {}; defineResizeObserver(); define("dialog", [componentsPath + "/dialog/dialog"], returnFirstDependency); - if (preferNativeAlerts && window.confirm) { - define("confirm", [componentsPath + "/confirm/nativeconfirm"], returnFirstDependency); - } else { - define("confirm", [componentsPath + "/confirm/confirm"], returnFirstDependency); - } + define("confirm", [componentsPath + "/confirm/confirm"], returnFirstDependency); - if ((preferNativeAlerts || browser.xboxOne) && window.confirm) { - define("prompt", [componentsPath + "/prompt/nativeprompt"], returnFirstDependency); - } else { - define("prompt", [componentsPath + "/prompt/prompt"], returnFirstDependency); - } + define("prompt", [componentsPath + "/prompt/prompt"], returnFirstDependency); define("loading", [componentsPath + "/loading/loading"], returnFirstDependency); define("multi-download", [componentsPath + "/multidownload"], returnFirstDependency); define("fileDownloader", [componentsPath + "/filedownloader"], returnFirstDependency); define("localassetmanager", [bowerPath + "/apiclient/localassetmanager"], returnFirstDependency); - if ("cordova" === self.appMode || "android" === self.appMode) { - define("castSenderApiLoader", [], getDummyCastSenderApiLoader); - } else { - define("castSenderApiLoader", [], getCastSenderApiLoader); - } + define("castSenderApiLoader", [componentsPath + "castSenderApi"], returnFirstDependency); define("transfermanager", [bowerPath + "/apiclient/sync/transfermanager"], returnFirstDependency); define("filerepository", [bowerPath + "/apiclient/sync/filerepository"], returnFirstDependency); From de88967dbd036868dc97cbacf9311b3b9837d576 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 21 Mar 2020 18:27:30 +0100 Subject: [PATCH 015/120] Remove superfluous variable --- src/components/prompt/prompt.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/prompt/prompt.js b/src/components/prompt/prompt.js index 32fadb811c..41d40c4a48 100644 --- a/src/components/prompt/prompt.js +++ b/src/components/prompt/prompt.js @@ -78,10 +78,8 @@ define(["browser", 'dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); } - var value = submitValue; - - if (value) { - return value; + if (submitValue) { + return submitValue; } else { return Promise.reject(); } From 705c3fbcf0d4b83a8f82115957e45d81761ac0d6 Mon Sep 17 00:00:00 2001 From: amirmasoud Date: Sat, 21 Mar 2020 18:47:01 +0000 Subject: [PATCH 016/120] Translated using Weblate (Persian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fa/ --- src/strings/fa.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/fa.json b/src/strings/fa.json index 7b7393c6b9..d4b60fe7c6 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -139,5 +139,8 @@ "AllLanguages": "تمام زبان ها", "AllLibraries": "تمام کتابخانه ها", "AllowHWTranscodingHelp": "اگر فعال شود, اجازه میدهید تبدیل ( کم و زیاد کردن کیفیت ) درلحظه و توسط کارت دریافت سیگنال صورت گیرد. این کمک میکند به اینکه سرور جلیفین کمتر عمل تبدیل را انجام دهد.", - "AllowOnTheFlySubtitleExtraction": "اجازه میدهد در لحظه زیرنویس بازشود" + "AllowOnTheFlySubtitleExtraction": "اجازه میدهد در لحظه زیرنویس بازشود", + "Add": "افزودن", + "Actor": "بازیگر", + "AccessRestrictedTryAgainLater": "دسترسی در حال حاضر محدود شده است. لطفا دوباره تلاش کنید." } From 856069f25d232cb421c9d69b1b817c2946bc8e69 Mon Sep 17 00:00:00 2001 From: Vogete Date: Sat, 21 Mar 2020 11:26:46 +0000 Subject: [PATCH 017/120] Translated using Weblate (Hungarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/ --- src/strings/hu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/hu.json b/src/strings/hu.json index a6c2a14da2..7ade41afff 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1213,7 +1213,7 @@ "Screenshots": "Képernyőképek", "SearchForCollectionInternetMetadata": "Keresés az interneten artwork és metaadat után", "Series": "Sorozatok", - "SeriesCancelled": "A sorozat törölt.", + "SeriesCancelled": "Sorozat törölve.", "SeriesRecordingScheduled": "A sorozatfelvétel ütemezett.", "SeriesSettings": "Sorozat beállítások", "ServerRestartNeededAfterPluginInstall": "A bővítmény telepítése után újra kell indítani a Jellyfin Szerver-t.", From b65bd915ee51864cfc6bcd53a2f82a9168f78b7f Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Sun, 22 Mar 2020 01:07:04 -0400 Subject: [PATCH 018/120] Simplify show/hide button logic for tv providers --- src/components/tvproviders/schedulesdirect.js | 18 +++++------------- src/components/tvproviders/xmltv.js | 18 +++++------------- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/src/components/tvproviders/schedulesdirect.js b/src/components/tvproviders/schedulesdirect.js index 4a6f3d297f..cf11e5736d 100644 --- a/src/components/tvproviders/schedulesdirect.js +++ b/src/components/tvproviders/schedulesdirect.js @@ -264,21 +264,13 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em self.init = function () { options = options || {}; - // Only hide the button if explicitly set to false; default to showing if undefined or null + // Only hide the buttons if explicitly set to false; default to showing if undefined or null // FIXME: rename this option to clarify logic - if (options.showCancelButton === false) { - page.querySelector(".btnCancel").classList.add("hide"); - } else { - page.querySelector(".btnCancel").classList.remove("hide"); - } + var hideCancelButton = options.showCancelButton === false; + page.querySelector(".btnCancel").classList.toggle("hide", hideCancelButton); - // Only hide the button if explicitly set to false; default to showing if undefined or null - // FIXME: rename this option to clarify logic - if (options.showSubmitButton === false) { - page.querySelector(".btnSubmitListings").classList.add("hide"); - } else { - page.querySelector(".btnSubmitListings").classList.remove("hide"); - } + var hideSubmitButton = options.showSubmitButton === false; + page.querySelector(".btnSubmitListings").classList.toggle("hide", hideSubmitButton); $(".formLogin", page).on("submit", function () { submitLoginForm(); diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js index 0ba164fe25..7e7d381f09 100644 --- a/src/components/tvproviders/xmltv.js +++ b/src/components/tvproviders/xmltv.js @@ -163,21 +163,13 @@ define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "pa self.init = function () { options = options || {}; - // Only hide the button if explicitly set to false; default to showing if undefined or null + // Only hide the buttons if explicitly set to false; default to showing if undefined or null // FIXME: rename this option to clarify logic - if (options.showCancelButton === false) { - page.querySelector(".btnCancel").classList.add("hide"); - } else { - page.querySelector(".btnCancel").classList.remove("hide"); - } + var hideCancelButton = options.showCancelButton === false; + page.querySelector(".btnCancel").classList.toggle("hide", hideCancelButton); - // Only hide the button if explicitly set to false; default to showing if undefined or null - // FIXME: rename this option to clarify logic - if (options.showSubmitButton === false) { - page.querySelector(".btnSubmitListings").classList.add("hide"); - } else { - page.querySelector(".btnSubmitListings").classList.remove("hide"); - } + var hideSubmitButton = options.showSubmitButton === false; + page.querySelector(".btnSubmitListings").classList.toggle("hide", hideSubmitButton); $("form", page).on("submit", function () { submitListingsForm(); From a704f41515fb5d11b96d63a6f873899ac911b874 Mon Sep 17 00:00:00 2001 From: Nyanmisaka <799610810@qq.com> Date: Sun, 22 Mar 2020 04:09:34 +0000 Subject: [PATCH 019/120] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 547f55dc3a..b0c9a59694 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -537,8 +537,8 @@ "LabelDisplayName": "显示名称:", "LabelDisplayOrder": "显示顺序:", "LabelDisplaySpecialsWithinSeasons": "显示季中所播出的特集", - "LabelDownMixAudioScale": "缩混音频增强:", - "LabelDownMixAudioScaleHelp": "缩混音频增强。值为A将保留原来的音量。", + "LabelDownMixAudioScale": "降混音频增强:", + "LabelDownMixAudioScaleHelp": "降混音时增强音频。值为 1 时将保留原始音量。", "LabelDownloadLanguages": "下载语言:", "LabelDropImageHere": "拖拽或点击选择图像于此处。", "LabelDroppedFrames": "丢弃的帧:", From 99d7138a083ed92993eb07af3ab27d5bfb486fb6 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sun, 22 Mar 2020 14:00:04 +0300 Subject: [PATCH 020/120] Fix XviD playback on Tizen --- src/scripts/browserdeviceprofile.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/scripts/browserdeviceprofile.js b/src/scripts/browserdeviceprofile.js index b45bdc59bf..85d3e1500b 100644 --- a/src/scripts/browserdeviceprofile.js +++ b/src/scripts/browserdeviceprofile.js @@ -214,6 +214,14 @@ define(['browser'], function (browser) { break; case 'avi': supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + // New Samsung TV don't support XviD/DivX + if (browser.tizen) { + videoCodecs.push('h264'); + if (canPlayH265(videoTestElement, options)) { + videoCodecs.push('h265'); + videoCodecs.push('hevc'); + } + } break; case 'mpg': case 'mpeg': From 603472cfb69516cb83270c4dfece64aa455edb92 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sun, 22 Mar 2020 15:04:51 +0300 Subject: [PATCH 021/120] Add comment --- src/scripts/browserdeviceprofile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/scripts/browserdeviceprofile.js b/src/scripts/browserdeviceprofile.js index 85d3e1500b..7acad63c14 100644 --- a/src/scripts/browserdeviceprofile.js +++ b/src/scripts/browserdeviceprofile.js @@ -215,6 +215,7 @@ define(['browser'], function (browser) { case 'avi': supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; // New Samsung TV don't support XviD/DivX + // Explicitly add supported codecs to make other codecs be transcoded if (browser.tizen) { videoCodecs.push('h264'); if (canPlayH265(videoTestElement, options)) { From 58dd6eb4918847783218b162ab3df285c68f373d Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sun, 22 Mar 2020 19:30:02 +0300 Subject: [PATCH 022/120] Add test for current item --- src/controllers/playback/videoosd.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/controllers/playback/videoosd.js b/src/controllers/playback/videoosd.js index 24d779f245..b6af14dd6a 100644 --- a/src/controllers/playback/videoosd.js +++ b/src/controllers/playback/videoosd.js @@ -665,7 +665,8 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function onTimeUpdate(e) { - if (isEnabled) { + // Test for 'currentItem' is required for Firefox since its player spams 'timeupdate' events even being at breakpoint + if (isEnabled && currentItem) { var now = new Date().getTime(); if (!(now - lastUpdateTime < 700)) { From c49e60e2d9d181ae3e51cfd3e0c8221ab6a89dc0 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 22 Mar 2020 17:42:32 +0100 Subject: [PATCH 023/120] Hide some header buttons on mobile --- src/scripts/librarymenu.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index 001c75787d..5e6562ee42 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -73,7 +73,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } if (user && user.localUser) { - if (headerHomeButton) { + if (headerHomeButton && !layoutManager.mobile) { headerHomeButton.classList.remove("hide"); } @@ -788,7 +788,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " var headerCastButton; var headerSearchButton; var headerAudioPlayerButton; - var enableLibraryNavDrawer = !layoutManager.tv; + var enableLibraryNavDrawer = layoutManager.desktop; var skinHeader = document.querySelector(".skinHeader"); var requiresUserRefresh = true; var lastOpenTime = new Date().getTime(); @@ -863,6 +863,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " pageClassOn("pageshow", "page", function (e) { var page = this; var isDashboardPage = page.classList.contains("type-interior"); + var isHomePage = page.classList.contains("homePage"); var isLibraryPage = !isDashboardPage && page.classList.contains("libraryPage"); var apiClient = getCurrentApiClient(); @@ -874,7 +875,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " refreshDashboardInfoInDrawer(apiClient); } else { if (mainDrawerButton) { - if (enableLibraryNavDrawer) { + if (enableLibraryNavDrawer || isHomePage) { mainDrawerButton.classList.remove("hide"); } else { mainDrawerButton.classList.add("hide"); From 1c0728ada6e24f29b96b8399d3c61fbabf5961be Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 22 Mar 2020 17:56:03 +0100 Subject: [PATCH 024/120] Use small logo on mobile --- src/assets/css/librarybrowser.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index 4c2cf95817..0bf65d83a7 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -128,6 +128,10 @@ margin-top: 0; } +.layout-mobile .pageTitleWithDefaultLogo { + background-image: url(../img/icon-transparent.png); +} + .headerLeft, .skinHeader { display: -webkit-box; From d6ab058661b70258a2a1629cbe91a96542b3519f Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sun, 22 Mar 2020 20:18:27 +0300 Subject: [PATCH 025/120] Add Tizen version check --- src/scripts/browser.js | 3 +++ src/scripts/browserdeviceprofile.js | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/scripts/browser.js b/src/scripts/browser.js index 791ac7411b..f9e1942320 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -271,6 +271,9 @@ define([], function () { if (!browser.tizen) { browser.orsay = userAgent.toLowerCase().indexOf('smarthub') !== -1; + } else { + var v = (navigator.appVersion).match(/Tizen (\d+).(\d+)/); + browser.tizenVersion = parseInt(v[1]); } if (browser.edgeUwp) { diff --git a/src/scripts/browserdeviceprofile.js b/src/scripts/browserdeviceprofile.js index 7acad63c14..337463987c 100644 --- a/src/scripts/browserdeviceprofile.js +++ b/src/scripts/browserdeviceprofile.js @@ -216,7 +216,7 @@ define(['browser'], function (browser) { supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; // New Samsung TV don't support XviD/DivX // Explicitly add supported codecs to make other codecs be transcoded - if (browser.tizen) { + if (browser.tizenVersion >= 4) { videoCodecs.push('h264'); if (canPlayH265(videoTestElement, options)) { videoCodecs.push('h265'); From 0cb54feb539ef4e7e7192b1fc92fdb5de24b4815 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Mon, 20 Jan 2020 20:47:54 +0100 Subject: [PATCH 026/120] Remove libjass --- src/bundle.js | 7 --- src/components/htmlvideoplayer/plugin.js | 80 +----------------------- src/scripts/site.js | 1 - 3 files changed, 1 insertion(+), 87 deletions(-) diff --git a/src/bundle.js b/src/bundle.js index c5c5e1bcaf..ba5f74b163 100644 --- a/src/bundle.js +++ b/src/bundle.js @@ -84,13 +84,6 @@ _define("webcomponents", function() { return webcomponents; }); -// libjass -var libjass = require("libjass"); -require("libjass/libjass.css"); -_define("libjass", function() { - return libjass; -}); - // libass-wasm var libass_wasm = require("libass-wasm"); _define("JavascriptSubtitlesOctopus", function() { diff --git a/src/components/htmlvideoplayer/plugin.js b/src/components/htmlvideoplayer/plugin.js index d19187c9ed..995df6607b 100644 --- a/src/components/htmlvideoplayer/plugin.js +++ b/src/components/htmlvideoplayer/plugin.js @@ -80,7 +80,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (track) { var format = (track.Codec || '').toLowerCase(); if (format === 'ssa' || format === 'ass') { - // libjass is needed here return false; } } @@ -1047,7 +1046,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa lastCustomTrackMs = 0; } - function renderWithSubtitlesOctopus(videoElement, track, item) { + function renderSsaAss(videoElement, track, item) { var attachments = self._currentPlayOptions.mediaSource.MediaAttachments || []; var options = { video: videoElement, @@ -1066,82 +1065,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }); } - function renderWithLibjass(videoElement, track, item) { - - var rendererSettings = {}; - - if (browser.ps4) { - // Text outlines are not rendering very well - rendererSettings.enableSvg = false; - } else if (browser.edge || browser.msie) { - // svg not rendering at all - rendererSettings.enableSvg = false; - } - - // probably safer to just disable everywhere - rendererSettings.enableSvg = false; - - require(['libjass', 'ResizeObserver'], function (libjass, ResizeObserver) { - - libjass.ASS.fromUrl(getTextTrackUrl(track, item)).then(function (ass) { - - var clock = new libjass.renderers.ManualClock(); - currentClock = clock; - - // Create a DefaultRenderer using the video element and the ASS object - var renderer = new libjass.renderers.WebRenderer(ass, clock, videoElement.parentNode, rendererSettings); - - currentAssRenderer = renderer; - - renderer.addEventListener("ready", function () { - try { - renderer.resize(videoElement.offsetWidth, videoElement.offsetHeight, 0, 0); - - if (!self._resizeObserver) { - self._resizeObserver = new ResizeObserver(onVideoResize, {}); - self._resizeObserver.observe(videoElement); - } - //clock.pause(); - } catch (ex) { - //alert(ex); - } - }); - }, function () { - htmlMediaHelper.onErrorInternal(self, 'mediadecodeerror'); - }); - }); - } - - function renderSsaAss(videoElement, track, item) { - if (supportsCanvas() && supportsWebWorkers()) { - console.debug('rendering subtitles with SubtitlesOctopus'); - renderWithSubtitlesOctopus(videoElement, track, item); - } else { - console.debug('rendering subtitles with libjass'); - renderWithLibjass(videoElement, track, item); - } - } - - function onVideoResize() { - if (browser.iOS) { - // the new sizes will be delayed for about 500ms with wkwebview - setTimeout(resetVideoRendererSize, 500); - } else { - resetVideoRendererSize(); - } - } - - function resetVideoRendererSize() { - var renderer = currentAssRenderer; - if (renderer) { - var videoElement = self._mediaElement; - var width = videoElement.offsetWidth; - var height = videoElement.offsetHeight; - console.debug('videoElement resized: ' + width + 'x' + height); - renderer.resize(width, height, 0, 0); - } - } - function requiresCustomSubtitlesElement() { // after a system update, ps4 isn't showing anything when creating a track element dynamically @@ -1231,7 +1154,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (!itemHelper.isLocalItem(item) || track.IsExternal) { var format = (track.Codec || '').toLowerCase(); if (format === 'ssa' || format === 'ass') { - // libjass is needed here renderSsaAss(videoElement, track, item); return; } diff --git a/src/scripts/site.js b/src/scripts/site.js index 6739e3cd59..dc5f973198 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -690,7 +690,6 @@ var AppInfo = {}; "swiper", "queryString", "sortable", - "libjass", "webcomponents", "material-icons", "jellyfin-noto", From 087d44567e0b28a65131a6cd6a602d91c84e20cc Mon Sep 17 00:00:00 2001 From: adrian gustavo martinez Date: Sun, 22 Mar 2020 11:27:02 +0000 Subject: [PATCH 027/120] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 2b99b91242..64f7a0fd7e 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -68,7 +68,7 @@ "AllowMediaConversion": "Permitir conversión de medios", "AllowMediaConversionHelp": "Permitir o denegar acceso a la opción de convertir medios.", "AllowOnTheFlySubtitleExtraction": "Permitir extracción de subtítulos al vuelo", - "AllowOnTheFlySubtitleExtractionHelp": "Los subtítulos incrustados pueden ser extraídos de videos y entregados a apps de Jellyfin en texto plano para ayudar a prevenir la transcodificación de video. En algunos sistemas esto puede llevar un largo tiempo y causar demoras en la reproducción durante el proceso de extracción. Desactivar esta opción para quemar los subtítulos incrustados en la transcodificación de video cuando no son soportados nativamente por el dispositivo cliente.", + "AllowOnTheFlySubtitleExtractionHelp": "Los subtítulos incrustados pueden extraerse de los videos y entregarse a los reproductores en texto plano para ayudar a evitar la transcodificación de video. En algunos sistemas, esto puede tardar mucho tiempo y provocar que la reproducción de video se detenga durante el proceso de extracción. Deshabilite esta opción para que los subtítulos incrustados se graben con transcodificación de video cuando no estén soportados de forma nativa por el dispositivo cliente.", "AllowRemoteAccess": "Permitir conexiones remotas a este Servidor Jellyfin.", "AllowRemoteAccessHelp": "Si no está tildado, todas las conexiones remotas serán bloqueadas.", "AlwaysPlaySubtitles": "Siempre reproducir subtítulos", @@ -81,7 +81,7 @@ "AutoBasedOnLanguageSetting": "Auto (basado en configuración de idioma)", "AutomaticallyConvertNewContent": "Convertir contenido nuevo automáticamente", "Backdrop": "Fondo", - "AllowHWTranscodingHelp": "Si se activa, se permitirá al sintonizador transcodificar streams al vuelo. Esto podría ayudar a reducir la transcodificación requerida por el servidor Jellyfin.", + "AllowHWTranscodingHelp": "Permite que el sintonizador transcodifique las transmisiones sobre la marcha. Esto puede ayudar a reducir la transcodificación requerida por el servidor.", "AllowedRemoteAddressesHelp": "Lista separada por comas de direcciones IP o IP/máscara-de-red para redes a las que se les permitirá conectarse de forma remota. Si se deja vacía, todas las direcciones remotas serán permitidas.", "AlwaysPlaySubtitlesHelp": "Los subtítulos que concuerden con la preferencia de idioma se cargarán independientemente del idioma del audio.", "AndroidUnlockRestoreHelp": "Para recuperar tu compra anterior, por favor asegurate que iniciaste sesión en el dispositivo con la misma cuenta de Google (o Amazon) que hizo la compra originalmente. Asegurate de que la tienda de aplicaciones esté habilitada y no posea control parental alguno, y que tiene una conexión a Internet activa. Solo tendrás que hacer esto una sola vez para recuperar tu compra anterior.", @@ -102,12 +102,12 @@ "BirthPlaceValue": "Lugar de nacimiento: {0}", "Blacklist": "Lista negra", "BobAndWeaveWithHelp": "Bob and weave (mayor calidad, pero más lento)", - "BookLibraryHelp": "Libros de audio y de texto son soportados. Revise la {0}guía de nombrado de libros de Jellyfin{1}.", + "BookLibraryHelp": "Los libros de texto y audio libros son soportados. Revise la {0}Guía para Nomenclatura de Libros{1}.", "Box": "Caja", "BoxRear": "Caja (lado opuesto)", "Browse": "Explorar", "BrowsePluginCatalogMessage": "Explore nuestro catálogo de complementos para ver los complementos disponibles.", - "BurnSubtitlesHelp": "Determine si el servidor debería incrustar los subtítulos cuando convierte los videos dependiendo del formato de subtítulo. Evitar incrustar subtitulos mejorará el rendimiento del servidor. Seleccione Auto para incrustar formatos basados en imagen (por ejemplo, VOBSUB, PGS, SUB/IDX, etc.), como así también ciertos subtítulos ASS/SSA", + "BurnSubtitlesHelp": "Determina si el servidor debe grabar subtítulos al convertir videos dependiendo del formato de los subtítulos. Evitar la grabación de subtítulos mejorará el rendimiento del servidor. Seleccione Auto para grabar formatos basados en imágenes (VOBSUB, PGS, SUB/IDX, etc.) y ciertos subtítulos ASS/SSA.", "ButtonAccept": "Aceptar", "ButtonAdd": "Agregar", "ButtonAddMediaLibrary": "Agregar biblioteca de medios", @@ -308,7 +308,7 @@ "DeviceLastUsedByUserName": "Usado ultima vez por {0}", "DirectPlayError": "Error en la reproducción directa", "DirectPlaying": "Reproducción directa", - "DirectStreamHelp1": "El medio es compatible con el dispositivo respecto a la resolución y el tipo de medio (H.264, AC3, etc.), pero esta en un contenedor incompatible (.mkv, .avi, .wmv, etc.). El video va a ser re-empaquetado en el momento que sea transmitido al dispositivo.", + "DirectStreamHelp1": "El medio es compatible con el dispositivo en cuanto a la resolución y tipo de medio (H.264, AC3, etc.), pero está en un contenedor de archivo incompatible (mkv, avi, wmv, etc.). El video sera reempaquetado en el acto antes de transmitirlo al dispositivo.", "DirectStreamHelp2": "Transmitir directamente un archivo usa muy poco procesamiento, esto sin perdida en la calidad de video.", "DirectStreaming": "Transmisión en directo", "Director": "Director", @@ -321,7 +321,7 @@ "DisplayInMyMedia": "Mostrar en pantalla principal", "DisplayInOtherHomeScreenSections": "Mostrar en las secciones de la pantalla principal, como últimos medios y continuar viendo", "DisplayMissingEpisodesWithinSeasons": "Mostrar episodios faltantes entre temporadas", - "DisplayMissingEpisodesWithinSeasonsHelp": "Esto debe ser habilitado en las bibilotecas de TV, en la configuracion del servidor de Jellyfin.", + "DisplayMissingEpisodesWithinSeasonsHelp": "Esto también debe estar habilitado para las bibliotecas de TV en la configuración del servidor.", "DisplayModeHelp": "Selecciona el tipo de pantalla en el cual estas usando Jellyfin.", "DoNotRecord": "No grabar", "Down": "Abajo", @@ -345,7 +345,7 @@ "EnableBackdropsHelp": "Si esta habilitado, los fondos van a ser mostrados en segundo plano de algunas paginas mientras estas en la biblioteca.", "EnableCinemaMode": "Habilitar modo Cine", "EnableColorCodedBackgrounds": "Habilitar colores en el fondo del codigo", - "AuthProviderHelp": "Selecciona un Proveedor de Autenticación para autenticar la contraseña de este usuario", + "AuthProviderHelp": "Seleccione un proveedor de autenticación que se utilizará para autenticar la contraseña de este usuario.", "CriticRating": "Calificación de la crítica", "DefaultSubtitlesHelp": "Los subtítulos se cargan en base a los indicadores por defecto y los indicadores forzados en los metadatos embebidos. Las preferencias de idioma son consideradas cuando existe más de una opción.", "Dislike": "No me gusta", @@ -411,5 +411,13 @@ "HeaderFavoriteEpisodes": "Episodios favoritos", "HeaderFavoriteArtists": "Artistas favoritos", "HeaderFavoriteAlbums": "Álbumes favoritos", - "Shows": "Series" + "Shows": "Series", + "CopyStreamURLError": "Hubo un error copiando la URL.", + "CopyStreamURLSuccess": "URL copiada con éxito.", + "CopyStreamURL": "Copiar la URL de la transmisión", + "ButtonSplit": "Dividir", + "ButtonAddImage": "Agregar imagen", + "AskAdminToCreateLibrary": "Pregunte al administrador para crear una biblioteca.", + "AllowFfmpegThrottlingHelp": "Cuando una transcodificación o conversión avanza demasiado con respecto a la posición actual de la reproducción, se pausara el proceso para consumir menos recursos. esto es mas útil cuando no se hacen búsquedas de tiempo a menudo. Desactive esta opción si experimenta problemas en la reproducción.", + "AllowFfmpegThrottling": "Transcodificación Throttle" } From 7aae3fd95c25823822c571cbcfd9f6061407e94b Mon Sep 17 00:00:00 2001 From: adrian gustavo martinez Date: Sun, 22 Mar 2020 11:55:42 +0000 Subject: [PATCH 028/120] Translated using Weblate (Spanish (Mexico)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_MX/ --- src/strings/es-mx.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/es-mx.json b/src/strings/es-mx.json index 57a1c9aa25..2968bbcdd4 100644 --- a/src/strings/es-mx.json +++ b/src/strings/es-mx.json @@ -195,7 +195,7 @@ "Download": "Descargar", "DownloadsValue": "{0} descargas", "DrmChannelsNotImported": "Los canales con DRM no serán importados.", - "DropShadow": "Mostrar sombra", + "DropShadow": "Sombra Paralela", "EasyPasswordHelp": "Su código PIN fácil se utiliza para el acceso sin conexión en los clientes compatibles y también puede utilizarse para acceder fácilmente cuando se está en la misma red.", "Edit": "Editar", "EditImages": "Editar imágenes", From 94a2a8749bdfe5b9fa2ba9c82b25218309648e4f Mon Sep 17 00:00:00 2001 From: Louis Hermier Date: Sun, 22 Mar 2020 12:00:27 +0000 Subject: [PATCH 029/120] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 4a52756ec4..4c726c8245 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1100,7 +1100,7 @@ "PlayAllFromHere": "Tout lire à partir d'ici", "PlayCount": "Nombre de lectures", "PlayFromBeginning": "Lire depuis le début", - "PlayNext": "Lire le suivant", + "PlayNext": "Lire ensuite", "PlayNextEpisodeAutomatically": "Lancer l'épisode suivant automatiquement", "Played": "Lu", "Playlists": "Listes de lecture", From f896ac93de380437265e8fe12a9cabeb870751de Mon Sep 17 00:00:00 2001 From: Luke Foust Date: Sun, 22 Mar 2020 13:08:10 -0700 Subject: [PATCH 030/120] support types in external ids --- src/components/itemidentifier/itemidentifier.js | 9 +++++---- src/components/metadataeditor/metadataeditor.js | 7 ++++++- src/strings/en-us.json | 11 +++++++++++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js index 6f28de0b3b..2a779618f2 100644 --- a/src/components/itemidentifier/itemidentifier.js +++ b/src/components/itemidentifier/itemidentifier.js @@ -296,8 +296,6 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", var html = ""; - var providerIds = item.ProviderIds || {}; - for (var i = 0, length = idList.length; i < length; i++) { var idInfo = idList[i]; @@ -306,9 +304,12 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", html += '
'; - var idLabel = globalize.translate("LabelDynamicExternalId").replace("{0}", idInfo.Name); + var fullName = idInfo.Name; + if (idInfo.Type) { + fullName = idInfo.Name + " " + globalize.translate(idInfo.Type); + } - var value = providerIds[idInfo.Key] || ""; + var idLabel = globalize.translate("LabelDynamicExternalId").replace("{0}", fullName); html += ''; diff --git a/src/components/metadataeditor/metadataeditor.js b/src/components/metadataeditor/metadataeditor.js index e8736258fa..84b60b32a3 100644 --- a/src/components/metadataeditor/metadataeditor.js +++ b/src/components/metadataeditor/metadataeditor.js @@ -465,7 +465,12 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi var id = "txt1" + idInfo.Key; var formatString = idInfo.UrlFormatString || ''; - var labelText = globalize.translate('LabelDynamicExternalId').replace('{0}', idInfo.Name); + var fullName = idInfo.Name; + if (idInfo.Type) { + fullName = idInfo.Name + " " + globalize.translate(idInfo.Type); + } + + var labelText = globalize.translate("LabelDynamicExternalId").replace("{0}", fullName); html += '
'; html += '
'; diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 62e8fa3f8f..d8953e871a 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -11,6 +11,8 @@ "AdditionalNotificationServices": "Browse the plugin catalog to install additional notification services.", "AirDate": "Air date", "Aired": "Aired", + "Album": "Album", + "AlbumArtist": "Album Artist", "Albums": "Albums", "Alerts": "Alerts", "All": "All", @@ -35,6 +37,7 @@ "Anytime": "Anytime", "AroundTime": "Around {0}", "Art": "Art", + "Artist": "Artist", "Artists": "Artists", "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", @@ -55,6 +58,7 @@ "BookLibraryHelp": "Audio and text books are supported. Review the {0}book naming guide{1}.", "Books": "Books", "Box": "Box", + "BoxSet": "Box Set", "BoxRear": "Box (rear)", "Browse": "Browse", "BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins.", @@ -234,6 +238,7 @@ "EnableThemeVideosHelp": "Play theme videos in the background while browsing the library.", "Ended": "Ended", "EndsAtValue": "Ends at {0}", + "Episode": "Episode", "Episodes": "Episodes", "ErrorAddingListingsToSchedulesDirect": "There was an error adding the lineup to your Schedules Direct account. Schedules Direct only allows a limited number of lineups per account. You may need to log into the Schedules Direct website and remove others listings from your account before proceeding.", "ErrorAddingMediaPathToVirtualFolder": "There was an error adding the media path. Please ensure the path is valid and the Jellyfin Server process has access to that location.", @@ -1017,6 +1022,7 @@ "MoveLeft": "Move left", "MoveRight": "Move right", "MovieLibraryHelp": "Review the {0}movie naming guide{1}.", + "Movie": "Movie", "Movies": "Movies", "MusicAlbum": "Music Album", "MusicArtist": "Music Artist", @@ -1203,6 +1209,7 @@ "OptionWeekends": "Weekends", "OptionWeekly": "Weekly", "OriginalAirDateValue": "Original air date: {0}", + "OtherArtist": "Other Artist", "Overview": "Overview", "PackageInstallCancelled": "{0} installation cancelled.", "PackageInstallCompleted": "{0} installation completed.", @@ -1216,6 +1223,7 @@ "PasswordSaved": "Password saved.", "People": "People", "PerfectMatch": "Perfect match", + "Person": "Person", "Photos": "Photos", "PictureInPicture": "Picture in picture", "PinCodeResetComplete": "The pin code has been reset.", @@ -1267,6 +1275,7 @@ "RefreshMetadata": "Refresh metadata", "RefreshQueued": "Refresh queued.", "ReleaseDate": "Release date", + "ReleaseGroup": "Release Group", "RememberMe": "Remember me", "RemoveFromCollection": "Remove from collection", "RemoveFromPlaylist": "Remove from playlist", @@ -1297,6 +1306,7 @@ "SearchForMissingMetadata": "Search for missing metadata", "SearchForSubtitles": "Search for Subtitles", "SearchResults": "Search Results", + "Season": "Season", "SelectAdminUsername": "Please select a username for the admin account.", "SendMessage": "Send message", "Series": "Series", @@ -1412,6 +1422,7 @@ "TitleHardwareAcceleration": "Hardware Acceleration", "TitleHostingSettings": "Hosting Settings", "TitlePlayback": "Playback", + "Track": "Track", "TrackCount": "{0} tracks", "Trailers": "Trailers", "Transcoding": "Transcoding", From c96db195761cee16e602d0afc94f994da1a517eb Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Mon, 23 Mar 2020 10:56:23 +0100 Subject: [PATCH 031/120] Remove libjass from yarn dependencies --- package.json | 1 - yarn.lock | 161 +++++++++------------------------------------------ 2 files changed, 27 insertions(+), 135 deletions(-) diff --git a/package.json b/package.json index 6d07f9a6fa..9d26a02319 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,6 @@ "jquery": "^3.4.1", "jstree": "^3.3.7", "libass-wasm": "https://github.com/jellyfin/JavascriptSubtitlesOctopus", - "libjass": "^0.11.0", "material-design-icons-iconfont": "^5.0.1", "native-promise-only": "^0.8.0-a", "page": "^1.11.5", diff --git a/yarn.lock b/yarn.lock index 8dee672565..02766a1edc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3072,7 +3072,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@3.X, debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: +debug@3.X, debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -3183,11 +3183,6 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -3302,11 +3297,6 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@2.X: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -4551,13 +4541,6 @@ fs-extra@3.0.1: jsonfile "^3.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-mkdirp-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" @@ -5532,7 +5515,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5556,13 +5539,6 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -5744,7 +5720,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@^1.3.4, ini@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -6530,11 +6506,6 @@ levn@^0.3.0, levn@~0.3.0: version "3.0.2" resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#7f331237026db75af2441717a4132d2398e96735" -libjass@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/libjass/-/libjass-0.11.0.tgz#bff1f464a2428c3bddfb68e4503b2d52afe3d6e6" - integrity sha1-v/H0ZKJCjDvd+2jkUDstUq/j1uY= - liftoff@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" @@ -7257,21 +7228,6 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -7406,15 +7362,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.2.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.3.tgz#a041ad1d04a871b0ebb666f40baaf1fb47867117" - integrity sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -7499,22 +7446,6 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - node-releases@^1.1.50: version "1.1.52" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" @@ -7552,14 +7483,6 @@ node-sass@^4.13.1, node-sass@^4.8.3: dependencies: abbrev "1" -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -7613,13 +7536,6 @@ now-and-later@^2.0.0: dependencies: once "^1.3.2" -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - npm-conf@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" @@ -7628,20 +7544,6 @@ npm-conf@^1.1.0: config-chain "^1.1.11" pify "^3.0.0" -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -7649,7 +7551,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -7916,7 +7818,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.4: +osenv@0: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -9304,6 +9206,15 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" +query-string@^6.11.1: + version "6.11.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.11.1.tgz#ab021f275d463ce1b61e88f0ce6988b3e8fe7c2c" + integrity sha512-1ZvJOUl8ifkkBxu2ByVM/8GijMIPx+cef7u3yroO3Ogm4DOdZcF5dcrWTIlSHe3Pg/mtlt6/eFjObDfJureZZA== + dependencies: + decode-uri-component "^0.2.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -9369,16 +9280,6 @@ raw-body@^2.3.2: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - read-file-stdin@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/read-file-stdin/-/read-file-stdin-0.2.1.tgz#25eccff3a153b6809afacb23ee15387db9e0ee61" @@ -9853,7 +9754,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -9952,7 +9853,7 @@ sass-graph@^2.2.4: scss-tokenizer "^0.2.3" yargs "^7.0.0" -sax@^1.2.4, sax@~1.2.4: +sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -10485,6 +10386,11 @@ specificity@^0.4.1: resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -10640,6 +10546,11 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -10801,11 +10712,6 @@ strip-json-comments@^3.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - strip-outer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" @@ -11115,19 +11021,6 @@ tar@^2.0.0: fstream "^1.0.12" inherits "2" -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -12275,7 +12168,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== From f6cb372610b7b201b36982fb922d0dd7521b611c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20F=C3=A4th?= Date: Mon, 23 Mar 2020 16:49:00 +0100 Subject: [PATCH 032/120] Fix cast sender api path --- src/scripts/site.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/site.js b/src/scripts/site.js index 6739e3cd59..b9be7351aa 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -415,7 +415,7 @@ var AppInfo = {}; define("fileDownloader", [componentsPath + "/filedownloader"], returnFirstDependency); define("localassetmanager", [bowerPath + "/apiclient/localassetmanager"], returnFirstDependency); - define("castSenderApiLoader", [componentsPath + "castSenderApi"], returnFirstDependency); + define("castSenderApiLoader", [componentsPath + "/castSenderApi"], returnFirstDependency); define("transfermanager", [bowerPath + "/apiclient/sync/transfermanager"], returnFirstDependency); define("filerepository", [bowerPath + "/apiclient/sync/filerepository"], returnFirstDependency); From 7f10a81a1621e1bb28f32b4846fbc669bbb36cf6 Mon Sep 17 00:00:00 2001 From: Louis Hermier Date: Mon, 23 Mar 2020 16:53:31 +0000 Subject: [PATCH 033/120] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 4c726c8245..fd85828c17 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1470,5 +1470,7 @@ "AllowFfmpegThrottlingHelp": "Quand le transcodage ou le remultiplexage est suffisamment loin de la position de lecture, le processus se mettra en pause afin d’économiser des ressources. Plus utile lors d’une lecture continue. À désactiver en cas de problèmes de lecture.", "AllowFfmpegThrottling": "Adapter la Vitesse du Transcodage", "NoCreatedLibraries": "Il semblerait que vous n'ayez créé aucune librairie. {0}Voulez-vous en créer une maintenant ?{1}", - "PlaybackErrorNoCompatibleStream": "Problème de profil client, le serveur n’a pas pu envoyer un format média compatible." + "PlaybackErrorNoCompatibleStream": "Problème de profil client, le serveur n’a pas pu envoyer un format média compatible.", + "PreferEmbeddedEpisodeInfosOverFileNames": "Préférer les informations intégrées aux noms de fichiers", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Utilise les informations des métadonnées intégrées, si disponible." } From bb475fd24ad69821d55a359d21bd76c66d7d00ee Mon Sep 17 00:00:00 2001 From: Adam Bokor Date: Mon, 23 Mar 2020 17:52:01 +0000 Subject: [PATCH 034/120] Translated using Weblate (Hungarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/ --- src/strings/hu.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/hu.json b/src/strings/hu.json index 7ade41afff..0f0b0aee68 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1474,5 +1474,7 @@ "DeviceAccessHelp": "Ez csak azokra az eszközökre alkalmazható, amelyek egyedileg vannak azonosítva és nem gátolják meg a böngészőből való elérést. A felhasználói eszközök kiszűrése meg fogja akadályozni az új eszközök használatát addig, amíg itt nem engedélyezed őket.", "PlaybackErrorNoCompatibleStream": "Hiba történt a kliens felmérése közben és a szerver nem küld kompatibilis formátumot az eszközre.", "AllowFfmpegThrottlingHelp": "Ha az átkódolás vagy remux eléggé előtöltődött a jelenlegi lejátszási pozícióhoz képest, ez megállítja a folyamatot, hogy kevesebb erőforrást vegyen igénybe. Ez akkor hasznos, ha ritkán ugrálsz előre a lejátszott videókban. Kapcsold ki, ha lejátszási problémákba ütközöl.", - "AllowFfmpegThrottling": "Átkódolás visszafogása" + "AllowFfmpegThrottling": "Átkódolás visszafogása", + "PreferEmbeddedEpisodeInfosOverFileNames": "Inkább a beágyazott epizódokra vonatkozó információkat részesítse előnyben a fájlnevekkel szemben", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Ez a beágyazott metaadatok epizódinformációit használja, ha rendelkezésre állnak." } From 2bda5f0277be6a1df2ed69cd315231ad8d5281f9 Mon Sep 17 00:00:00 2001 From: Riccardo Zanotto Date: Mon, 23 Mar 2020 18:53:57 +0000 Subject: [PATCH 035/120] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/it.json b/src/strings/it.json index 5b213e1bce..4dd7b3d190 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -581,7 +581,7 @@ "LabelForgotPasswordUsernameHelp": "Inserisci il tuo nome utente, se te lo ricordi.", "LabelFormat": "Formato:", "LabelFriendlyName": "Nome Condiviso:", - "LabelServerNameHelp": "Questo nome è usato per identificare il server e verrà usato di default come nome del pc.", + "LabelServerNameHelp": "Questo nome è usato per identificare il server e avrà come default il nome del pc.", "LabelGroupMoviesIntoCollections": "Raggruppa i film nelle collezioni", "LabelGroupMoviesIntoCollectionsHelp": "Quando si visualizzano le liste di film, quelli appartenenti ad una collezione saranno visualizzati come un elemento raggruppato.", "LabelH264Crf": "CRF di codifica H264:", From c882c264a30bc83a04bdf0761db09831d55bf2b8 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Tue, 24 Mar 2020 10:03:51 +0300 Subject: [PATCH 036/120] Fix view restoring --- src/components/appRouter.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/appRouter.js b/src/components/appRouter.js index efb58a089f..62bfb3cf40 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -511,9 +511,16 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM return baseRoute; } + var popstateOccurred = false; + window.addEventListener('popstate', function () { + popstateOccurred = true; + }); + function getHandler(route) { return function (ctx, next) { + ctx.isBack = popstateOccurred; handleRoute(ctx, next, route); + popstateOccurred = false; }; } From 34a5578679ddaa717e4185a27de48bb3b74bfe43 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Fri, 28 Feb 2020 14:36:42 +0100 Subject: [PATCH 037/120] Run postcss for webpack bundle --- postcss.config.js | 2 +- src/scripts/site.js | 1 - yarn.lock | 23 +++++++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/postcss.config.js b/postcss.config.js index 23159fd295..bd6e644892 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,4 +1,4 @@ -const postcssPresetEnv = require('postcss-preset-env'); +const postcssPresetEnv = require('postcss-preset-env') const cssnano = require('cssnano'); const config = () => ({ diff --git a/src/scripts/site.js b/src/scripts/site.js index 4e208dbe0f..155e28b94e 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -677,7 +677,6 @@ var AppInfo = {}; }, bundles: { bundle: [ - "document-register-element", "fetch", "flvjs", "jstree", diff --git a/yarn.lock b/yarn.lock index 02766a1edc..d260ee6e3f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -730,6 +730,11 @@ resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + "@gulp-sourcemaps/identity-map@1.X": version "1.0.2" resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz#1e6fe5d8027b1f285dc0d31762f566bccd73d5a9" @@ -8952,6 +8957,15 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: indexes-of "^1.0.1" uniq "^1.0.1" +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" @@ -9020,6 +9034,15 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + postcss@^5.0.0, postcss@^5.0.18: version "5.2.18" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" From 0a0fe15b263707817cd092d9c8369587992e4275 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 1 Mar 2020 08:40:57 +0100 Subject: [PATCH 038/120] Enable ES6 support for all tools --- .eslintrc.yml | 6 ++++++ gulpfile.js | 2 +- package.json | 9 ++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 4bc22fc1d4..377716d53c 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -3,6 +3,12 @@ env: browser: true amd: true +parserOptions: + ecmaVersion: 6 + sourceType: module + ecmaFeatures: + impliedStrict: true + globals: # New browser globals DataView: readonly diff --git a/gulpfile.js b/gulpfile.js index ca6cf36dd2..a0337db1c9 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -18,7 +18,7 @@ const stream = require('webpack-stream'); const inject = require('gulp-inject'); const postcss = require('gulp-postcss'); const sass = require('gulp-sass'); - + sass.compiler = require('node-sass') diff --git a/package.json b/package.json index 9d26a02319..2de78b821c 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "devDependencies": { "@babel/core": "^7.8.6", "@babel/polyfill": "^7.8.7", + "@babel/plugin-transform-modules-amd": "^7.8.3", "@babel/preset-env": "^7.8.6", "autoprefixer": "^9.7.4", "babel-loader": "^8.0.6", @@ -69,9 +70,11 @@ "whatwg-fetch": "^3.0.0" }, "babel": { - "presets": [ - "@babel/preset-env" - ] + "presets": ["@babel/preset-env"], + "overrides": [{ + "test": ["src/components/cardbuilder/cardBuilder.js"], + "plugins": ["@babel/plugin-transform-modules-amd"] + }] }, "browserslist": [ "last 2 Firefox versions", From 8891be539e1a36ac6230abdf8ccdc3f8b964d277 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 19 Mar 2020 21:15:38 +0100 Subject: [PATCH 039/120] Convert CardBuilder to ES6 --- src/components/cardbuilder/cardBuilder.js | 47 ++++++++++++----------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 7f562f1fd0..8f626ab211 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1,10 +1,23 @@ -define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusManager', 'indicators', 'globalize', 'layoutManager', 'apphost', 'dom', 'browser', 'playbackManager', 'itemShortcuts', 'scripts/imagehelper', 'css!./card', 'paper-icon-button-light', 'programStyles'], - function (datetime, imageLoader, connectionManager, itemHelper, focusManager, indicators, globalize, layoutManager, appHost, dom, browser, playbackManager, itemShortcuts, imageHelper) { - 'use strict'; +import datetime from 'datetime'; +import imageLoader from 'imageLoader'; +import connectionManager from 'connectionManager'; +import itemHelper from 'itemHelper'; +import focusManager from 'focusManager'; +import indicators from 'indicators'; +import globalize from 'globalize'; +import layoutManager from 'layoutManager'; +import dom from 'dom'; +import browser from 'browser'; +import playbackManager from 'playbackManager'; +import itemShortcuts from 'itemShortcuts'; +import imageHelper from 'scripts/imagehelper'; +import 'css!./card'; +import 'paper-icon-button-light'; +import 'programStyles'; var enableFocusTransform = !browser.slow && !browser.edge; - function getCardsHtml(items, options) { + export function getCardsHtml(items, options) { if (arguments.length === 1) { options = arguments[0]; items = options.items; @@ -1171,7 +1184,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } } - function getDefaultBackgroundClass(str) { + export function getDefaultBackgroundClass(str) { return 'defaultCardBackground defaultCardBackground' + getDefaultColorIndex(str); } @@ -1504,7 +1517,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana return html; } - function getDefaultText(item, options) { + export function getDefaultText(item, options) { if (item.CollectionType) { return '' } @@ -1533,7 +1546,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana return '
' + defaultName + '
'; } - function buildCards(items, options) { + export function buildCards(items, options) { // Abort if the container has been disposed if (!document.body.contains(options.itemsContainer)) { @@ -1678,7 +1691,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } } - function onUserDataChanged(userData, scope) { + export function onUserDataChanged(userData, scope) { var cards = (scope || document.body).querySelectorAll('.card-withuserdata[data-id="' + userData.ItemId + '"]'); @@ -1687,7 +1700,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } } - function onTimerCreated(programId, newTimerId, itemsContainer) { + export function onTimerCreated(programId, newTimerId, itemsContainer) { var cells = itemsContainer.querySelectorAll('.card[data-id="' + programId + '"]'); @@ -1702,7 +1715,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } } - function onTimerCancelled(id, itemsContainer) { + export function onTimerCancelled(id, itemsContainer) { var cells = itemsContainer.querySelectorAll('.card[data-timerid="' + id + '"]'); @@ -1716,7 +1729,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } } - function onSeriesTimerCancelled(id, itemsContainer) { + export function onSeriesTimerCancelled(id, itemsContainer) { var cells = itemsContainer.querySelectorAll('.card[data-seriestimerid="' + id + '"]'); @@ -1729,15 +1742,3 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana cell.removeAttribute('data-seriestimerid'); } } - - return { - getCardsHtml: getCardsHtml, - getDefaultBackgroundClass: getDefaultBackgroundClass, - getDefaultText: getDefaultText, - buildCards: buildCards, - onUserDataChanged: onUserDataChanged, - onTimerCreated: onTimerCreated, - onTimerCancelled: onTimerCancelled, - onSeriesTimerCancelled: onSeriesTimerCancelled - }; - }); From bbbef042bf227ebd48159304b0c07c55b3238bca Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 19 Mar 2020 21:16:40 +0100 Subject: [PATCH 040/120] Add JSDoc comments --- postcss.config.js | 2 +- src/components/cardbuilder/cardBuilder.js | 252 +++++++++++++++++----- src/scripts/site.js | 1 + 3 files changed, 195 insertions(+), 60 deletions(-) diff --git a/postcss.config.js b/postcss.config.js index bd6e644892..23159fd295 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,4 +1,4 @@ -const postcssPresetEnv = require('postcss-preset-env') +const postcssPresetEnv = require('postcss-preset-env'); const cssnano = require('cssnano'); const config = () => ({ diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 8f626ab211..edf3d0d606 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1,3 +1,7 @@ +/** + * Card builder module. + * @module cardBuilder + */ import datetime from 'datetime'; import imageLoader from 'imageLoader'; import connectionManager from 'connectionManager'; @@ -17,6 +21,12 @@ import 'programStyles'; var enableFocusTransform = !browser.slow && !browser.edge; + /** + * Generate the HTML markup for cards of a set of items. + * @param items - The items to generate cards for. + * @param options - The options of the cards. + * @returns {string} The HTML markup for cards. + */ export function getCardsHtml(items, options) { if (arguments.length === 1) { options = arguments[0]; @@ -26,6 +36,13 @@ import 'programStyles'; return buildCardsHtmlInternal(items, options); } + /** + * Computes the number of posters per row. + * @param {string} shape - Shape of the cards. + * @param {number} screenWidth - Width of the screen. + * @param {boolean} isOrientationLandscape - Flag for the orientation of the screen. + * @returns {number} Number of cards per row of an itemsContainer. + */ function getPostersPerRow(shape, screenWidth, isOrientationLandscape) { switch (shape) { case 'portrait': @@ -230,6 +247,11 @@ import 'programStyles'; } } + /** + * Checks if the window is resizable. + * @param {number} windowWidth - Width of the client's screen. + * @returns {boolean} - Result of the check. + */ function isResizable(windowWidth) { var screen = window.screen; if (screen) { @@ -243,15 +265,24 @@ import 'programStyles'; return false; } + /** + * Gets the width of a card's image according to the shape and amount of cards per row. + * @param {string} shape - Shape of the card. + * @param {number} screenWidth - Width of the screen. + * @param {boolean} isOrientationLandscape - Flag for the orientation of the screen. + * @returns {number} Width of the image for a card. + */ function getImageWidth(shape, screenWidth, isOrientationLandscape) { var imagesPerRow = getPostersPerRow(shape, screenWidth, isOrientationLandscape); - var shapeWidth = Math.round(screenWidth / imagesPerRow) * 2; - - return shapeWidth; + return Math.round(screenWidth / imagesPerRow) * 2; } + /** + * Normalizes the options of a card. + * @param {Object} items - A set of items. + * @param {Object} options - Options for handling the items. + */ function setCardData(items, options) { - options.shape = options.shape || "auto"; var primaryImageAspectRatio = imageLoader.getPrimaryImageAspectRatio(items); @@ -308,8 +339,13 @@ import 'programStyles'; } } + /** + * Generates the internal HTML markup for cards. + * @param {Object} items - Items for which to generate the markup. + * @param {Object} options - Options for generating the markup. + * @returns {string} The internal HTML markup of the cards. + */ function buildCardsHtmlInternal(items, options) { - var isVertical; if (options.shape === 'autoVertical') { @@ -438,8 +474,12 @@ import 'programStyles'; return html; } + /** + * Computes the Aspect Ratio for a card given its shape. + * @param {string} shape - Shape for which to get the aspect ratio. + * @returns {null|number} Ratio of the shape. + */ function getDesiredAspect(shape) { - if (shape) { shape = shape.toLowerCase(); if (shape.indexOf('portrait') !== -1) { @@ -458,8 +498,21 @@ import 'programStyles'; return null; } - function getCardImageUrl(item, apiClient, options, shape) { + /** + * @typedef {Object} CardImageUrl + * @property {string} imgUrl - URL of the image. + * @property {boolean} forceName - Force the name to be visible. + * @property {boolean} coverImage - Acts as a cover image. + */ + /** Get the URL of the Card's image. + * @param {Object} item - Item for which to generate a card. + * @param {Object} apiClient - API Client object. + * @param {Object} options - Options of the card to generate. + * @param {string} shape - Shape of the desired image. + * @returns {CardImageUrl} Object representing the URL of the card's image. + */ + function getCardImageUrl(item, apiClient, options, shape) { var imageItem = item.ProgramInfo || item; item = imageItem; @@ -676,12 +729,23 @@ import 'programStyles'; }; } + /** + * Generates a random integer in a range. + * @param {number} min - Minimum of the range. + * @param {number} max - Maximum of the range. + * @returns {number} Randomly generated number. + */ function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } - var numRandomColors = 5; + /** + * Generates an index used to select the default color of a Card based on a string. + * @param {string} str - String to use for generating the index. + * @returns {number} Index of the color. + */ function getDefaultColorIndex(str) { + var numRandomColors = 5; if (str) { var charIndex = Math.floor(str.length / 2); @@ -698,8 +762,18 @@ import 'programStyles'; } } + /** + * Generates the HTML markup for a card's text. + * @param {Array} lines - Array containing the text lines. + * @param {string} cssClass - Base CSS class to use for the lines. + * @param {boolean} forceLines - Flag to force the rendering of all lines. + * @param {boolean} isOuterFooter - Flag to mark the text lines as outer footer. + * @param {string} cardLayout - DEPRECATED + * @param {boolean} addRightMargin - Flag to add a right margin to the text. + * @param {number} maxLines - Maximum number of lines to render. + * @returns {string} HTML markup fo the card's text. + */ function getCardTextLines(lines, cssClass, forceLines, isOuterFooter, cardLayout, addRightMargin, maxLines) { - var html = ''; var valid = 0; @@ -746,12 +820,23 @@ import 'programStyles'; return html; } + /** + * Determines if the item is Live TV. + * @param {Object} item - Item to use. + * @returns {boolean} Flag showing if the item is Live TV. + */ function isUsingLiveTvNaming(item) { return item.Type === 'Program' || item.Type === 'Timer' || item.Type === 'Recording'; } + /** + * Returns the air time text for the item based on the given times. + * @param {object} item - Item used to generate the air time text. + * @param {string} showAirDateTime - ISO8601 date for the start of the show. + * @param {string} showAirEndTime - ISO8601 date for the end of the show. + * @returns {string} The air time text for the item base on the given dates. + */ function getAirTimeText(item, showAirDateTime, showAirEndTime) { - var airTimeText = ''; if (item.StartDate) { @@ -776,8 +861,22 @@ import 'programStyles'; return airTimeText; } + /** + * Generates the HTML markup for the card's footer text. + * @param {Object} item - Item used to generate the footer text. + * @param {Object} apiClient - API Client instance. + * @param {Object} options - Options used to generate the footer text. + * @param {string} showTitle - Title of the show. + * @param {boolean} forceName - Flag to force showing the name of the item. + * @param {boolean} overlayText - Flag to show overlay text. + * @param {CardImageUrl} imgUrl - Object representing the card's image URL. + * @param {string} footerClass - CSS class of the footer. + * @param {string} progressHtml - HTML markup of the progress bar. + * @param {string} logoUrl - URL of the logo for the item. + * @param {boolean} isOuterFooter - Flag to mark the text as outer footer. + * @returns {string} HTML markup of the card's footer text. + */ function getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerClass, progressHtml, logoUrl, isOuterFooter) { - var html = ''; if (logoUrl) { @@ -1040,8 +1139,14 @@ import 'programStyles'; return html; } + /** + * Generates the HTML markup for the action button. + * @param {Object} item - Item used to generate the action button. + * @param {string} text - Text of the action button. + * @param {string} serverId - ID of the server. + * @returns {string} HTML markup of the action button. + */ function getTextActionButton(item, text, serverId) { - if (!text) { text = itemHelper.getDisplayName(item); } @@ -1057,10 +1162,14 @@ import 'programStyles'; return html; } + /** + * Generates HTML markup for the item count indicator. + * @param {Object} options - Options used to generate the item count. + * @param {Object} item - Item used to generate the item count. + * @returns {string} HTML markup for the item count indicator. + */ function getItemCountsHtml(options, item) { - var counts = []; - var childText; if (item.Type === 'Playlist') { @@ -1148,48 +1257,36 @@ import 'programStyles'; return counts.join(', '); } - function getProgramIndicators(item) { - - item = item.ProgramInfo || item; - - var html = ''; - - if (item.IsLive) { - html += '
' + globalize.translate('Live') + '
'; - } - - if (item.IsPremiere) { - html += '
' + globalize.translate('Premiere') + '
'; - } else if (item.IsSeries && !item.IsRepeat) { - html += '
' + globalize.translate('AttributeNew') + '
'; - } - //else if (item.IsRepeat) { - // html += '
' + globalize.translate('Repeat') + '
'; - //} - - if (html) { - html = '
' + html; - html += '
'; - } - - return html; - } - var refreshIndicatorLoaded; - function requireRefreshIndicator() { + /** + * Imports the refresh indicator element. + */ + function requireRefreshIndicator() { if (!refreshIndicatorLoaded) { refreshIndicatorLoaded = true; require(['emby-itemrefreshindicator']); } } + /** + * Returns the default background class for a card based on a string. + * @param {string} str - Text used to generate the background class. + * @returns {string} CSS classes for default card backgrounds. + */ export function getDefaultBackgroundClass(str) { return 'defaultCardBackground defaultCardBackground' + getDefaultColorIndex(str); } + /** + * Builds the HTML markup for an individual card. + * @param {number} index - Index of the card + * @param {object} item - Item used to generate the card. + * @param {object} apiClient - API Client instance. + * @param {object} options - Options used to generate the card. + * @returns {string} HTML markup for the generated card. + */ function buildCard(index, item, apiClient, options) { - var action = options.action || 'link'; if (action === 'play' && item.IsFolder) { @@ -1424,10 +1521,6 @@ import 'programStyles'; cardImageContainerOpen += '
' + indicatorsHtml + '
'; } - //if (item.Type === 'Program' || item.Type === 'Timer') { - // cardImageContainerOpen += getProgramIndicators(item); - //} - if (!imgUrl) { cardImageContainerOpen += getDefaultText(item, options); } @@ -1480,8 +1573,13 @@ import 'programStyles'; return '<' + tagName + ' data-index="' + index + '"' + timerAttributes + actionAttribute + ' data-isfolder="' + (item.IsFolder || false) + '" data-serverid="' + (item.ServerId || options.serverId) + '" data-id="' + (item.Id || item.ItemId) + '" data-type="' + item.Type + '"' + mediaTypeData + collectionTypeData + channelIdData + positionTicksData + collectionIdData + playlistIdData + contextData + parentIdData + ' data-prefix="' + prefix + '" class="' + className + '">' + cardImageContainerOpen + innerCardFooter + cardImageContainerClose + overlayButtons + additionalCardContent + cardScalableClose + outerCardFooter + cardBoxClose + ''; } + /** + * Generates HTML markup for the card overlay. + * @param {object} item - Item used to generate the card overlay. + * @param {string} action - Action assigned to the overlay. + * @returns {string} HTML markup of the card overlay. + */ function getHoverMenuHtml(item, action) { - var html = ''; html += '
'; @@ -1517,6 +1615,12 @@ import 'programStyles'; return html; } + /** + * Generates the text or icon used on default card backgrounds. + * @param {object} item - Item used to generate the card overlay. + * @param {object} options - Options used to generate the card overlay. + * @returns {string} HTML markup of the card overlay. + */ export function getDefaultText(item, options) { if (item.CollectionType) { return '' @@ -1546,8 +1650,12 @@ import 'programStyles'; return '
' + defaultName + '
'; } + /** + * Builds a set of cards and inserts it into the page;. + * @param {Array} items - Array of items used to build cards. + * @param {options} options - Options of the cards to build. + */ export function buildCards(items, options) { - // Abort if the container has been disposed if (!document.body.contains(options.itemsContainer)) { return; @@ -1588,8 +1696,13 @@ import 'programStyles'; } } + /** + * Ensures the indicators for a card exist and creates them if they don't. + * @param {string} card - HTML Markup of the card. + * @param {string} indicatorsElem - HTML markup of the indicators. + * @returns {string} - HTML markup of the indicators. + */ function ensureIndicators(card, indicatorsElem) { - if (indicatorsElem) { return indicatorsElem; } @@ -1607,8 +1720,12 @@ import 'programStyles'; return indicatorsElem; } + /** + * Adds user data to the card such as progress indicators, played status, etc. + * @param {string} card - HTML markup of the card. + * @param {Object} userData - User data to apply to the card. + */ function updateUserData(card, userData) { - var type = card.getAttribute('data-type'); var enableCountIndicator = type === 'Series' || type === 'BoxSet' || type === 'Season'; var indicatorsElem = null; @@ -1691,8 +1808,12 @@ import 'programStyles'; } } + /** + * Handles when user data has changed. + * @param {Object} userData - User data to apply to the card. + * @param {HTMLElement} scope - DOM Element to use as a scope when selecting cards. + */ export function onUserDataChanged(userData, scope) { - var cards = (scope || document.body).querySelectorAll('.card-withuserdata[data-id="' + userData.ItemId + '"]'); for (var i = 0, length = cards.length; i < length; i++) { @@ -1700,8 +1821,13 @@ import 'programStyles'; } } + /** + * Handles when a timer was created. + * @param {string} programId - ID of the program. + * @param {string} newTimerId - ID of the new timer. + * @param {HTMLElement} itemsContainer - DOM Element of the items container. + */ export function onTimerCreated(programId, newTimerId, itemsContainer) { - var cells = itemsContainer.querySelectorAll('.card[data-id="' + programId + '"]'); for (var i = 0, length = cells.length; i < length; i++) { @@ -1715,9 +1841,13 @@ import 'programStyles'; } } - export function onTimerCancelled(id, itemsContainer) { - - var cells = itemsContainer.querySelectorAll('.card[data-timerid="' + id + '"]'); + /** + * Handles when a timer is cancelled. + * @param {string} timerId - ID of the cancelled timer. + * @param {HTMLElement} itemsContainer - DOM Element of the items container. + */ + export function onTimerCancelled(timerId, itemsContainer) { + var cells = itemsContainer.querySelectorAll('.card[data-timerid="' + timerId + '"]'); for (var i = 0, length = cells.length; i < length; i++) { var cell = cells[i]; @@ -1729,9 +1859,13 @@ import 'programStyles'; } } - export function onSeriesTimerCancelled(id, itemsContainer) { - - var cells = itemsContainer.querySelectorAll('.card[data-seriestimerid="' + id + '"]'); + /** + * Handles when a series timer is cancelled. + * @param {string} canceledTimerId - ID of the cancelled timer. + * @param {HTMLElement} itemsContainer - DOM Element of the items container. + */ + export function onSeriesTimerCancelled(canceledTimerId, itemsContainer) { + var cells = itemsContainer.querySelectorAll('.card[data-seriestimerid="' + canceledTimerId + '"]'); for (var i = 0, length = cells.length; i < length; i++) { var cell = cells[i]; diff --git a/src/scripts/site.js b/src/scripts/site.js index 155e28b94e..4e208dbe0f 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -677,6 +677,7 @@ var AppInfo = {}; }, bundles: { bundle: [ + "document-register-element", "fetch", "flvjs", "jstree", From 55d1657b50b63560dc49ed48b38ef4d60620bd79 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 19 Mar 2020 22:33:41 +0100 Subject: [PATCH 041/120] Migrate var in CardBuilder to let and const --- src/components/cardbuilder/cardBuilder.js | 318 +++++++++++----------- 1 file changed, 155 insertions(+), 163 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index edf3d0d606..24e4035050 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1,3 +1,4 @@ +/* eslint-disable indent */ /** * Card builder module. * @module cardBuilder @@ -19,7 +20,7 @@ import 'css!./card'; import 'paper-icon-button-light'; import 'programStyles'; - var enableFocusTransform = !browser.slow && !browser.edge; + const enableFocusTransform = !browser.slow && !browser.edge; /** * Generate the HTML markup for cards of a set of items. @@ -253,9 +254,9 @@ import 'programStyles'; * @returns {boolean} - Result of the check. */ function isResizable(windowWidth) { - var screen = window.screen; + const screen = window.screen; if (screen) { - var screenWidth = screen.availWidth; + const screenWidth = screen.availWidth; if ((screenWidth - windowWidth) > 20) { return true; @@ -273,7 +274,7 @@ import 'programStyles'; * @returns {number} Width of the image for a card. */ function getImageWidth(shape, screenWidth, isOrientationLandscape) { - var imagesPerRow = getPostersPerRow(shape, screenWidth, isOrientationLandscape); + const imagesPerRow = getPostersPerRow(shape, screenWidth, isOrientationLandscape); return Math.round(screenWidth / imagesPerRow) * 2; } @@ -285,11 +286,11 @@ import 'programStyles'; function setCardData(items, options) { options.shape = options.shape || "auto"; - var primaryImageAspectRatio = imageLoader.getPrimaryImageAspectRatio(items); + const primaryImageAspectRatio = imageLoader.getPrimaryImageAspectRatio(items); - if (options.shape === 'auto' || options.shape === 'autohome' || options.shape === 'autooverflow' || options.shape === 'autoVertical') { + if (['auto', 'autohome', 'autooverflow', 'autoVertical'].includes(options.shape)) { - var requestedShape = options.shape; + const requestedShape = options.shape; options.shape = null; if (primaryImageAspectRatio) { @@ -327,11 +328,11 @@ import 'programStyles'; } if (!options.width) { - var screenWidth = dom.getWindowSize().innerWidth; - var screenHeight = dom.getWindowSize().innerHeight; + let screenWidth = dom.getWindowSize().innerWidth; + const screenHeight = dom.getWindowSize().innerHeight; if (isResizable(screenWidth)) { - var roundScreenTo = 100; + const roundScreenTo = 100; screenWidth = Math.floor(screenWidth / roundScreenTo) * roundScreenTo; } @@ -346,7 +347,7 @@ import 'programStyles'; * @returns {string} The internal HTML markup of the cards. */ function buildCardsHtmlInternal(items, options) { - var isVertical; + let isVertical = false; if (options.shape === 'autoVertical') { isVertical = true; @@ -354,24 +355,21 @@ import 'programStyles'; setCardData(items, options); - var html = ''; - var itemsInRow = 0; + let html = ''; + let itemsInRow = 0; - var currentIndexValue; - var hasOpenRow; - var hasOpenSection; + let currentIndexValue; + let hasOpenRow; + let hasOpenSection; - var sectionTitleTagName = options.sectionTitleTagName || 'div'; - var apiClient; - var lastServerId; + let sectionTitleTagName = options.sectionTitleTagName || 'div'; + let apiClient; + let lastServerId; - var i; - var length; + for (let i = 0; i < items.length; i++) { - for (i = 0, length = items.length; i < length; i++) { - - var item = items[i]; - var serverId = item.ServerId || options.serverId; + let item = items[i]; + let serverId = item.ServerId || options.serverId; if (serverId !== lastServerId) { lastServerId = serverId; @@ -379,14 +377,14 @@ import 'programStyles'; } if (options.indexBy) { - var newIndexValue = ''; + let newIndexValue = ''; if (options.indexBy === 'PremiereDate') { if (item.PremiereDate) { try { newIndexValue = datetime.toLocaleDateString(datetime.parseISO8601Date(item.PremiereDate), { weekday: 'long', month: 'long', day: 'numeric' }); - } catch (err) { - console.error('error parsing timestamp for premiere date'); + } catch (error) { + console.error('error parsing timestamp for premiere date', error); } } } else if (options.indexBy === 'ProductionYear') { @@ -461,15 +459,15 @@ import 'programStyles'; } } - var cardFooterHtml = ''; - for (i = 0, length = (options.lines || 0); i < length; i++) { + /*let cardFooterHtml = ''; + for (let i = 0; i < (options.lines || 0); i++) { if (i === 0) { cardFooterHtml += '
 
'; } else { cardFooterHtml += '
 
'; } - } + }*/ return html; } @@ -513,16 +511,15 @@ import 'programStyles'; * @returns {CardImageUrl} Object representing the URL of the card's image. */ function getCardImageUrl(item, apiClient, options, shape) { - var imageItem = item.ProgramInfo || item; - item = imageItem; + item = item.ProgramInfo || item; - var width = options.width; - var height = null; - var primaryImageAspectRatio = item.PrimaryImageAspectRatio; - var forceName = false; - var imgUrl = null; - var coverImage = false; - var uiAspect = null; + const width = options.width; + let height = null; + const primaryImageAspectRatio = item.PrimaryImageAspectRatio; + let forceName = false; + let imgUrl = null; + let coverImage = false; + let uiAspect = null; if (options.preferThumb && item.ImageTags && item.ImageTags.Thumb) { @@ -745,16 +742,16 @@ import 'programStyles'; * @returns {number} Index of the color. */ function getDefaultColorIndex(str) { - var numRandomColors = 5; + const numRandomColors = 5; if (str) { - var charIndex = Math.floor(str.length / 2); - var character = String(str.substr(charIndex, 1).charCodeAt()); - var sum = 0; - for (var i = 0; i < character.length; i++) { + const charIndex = Math.floor(str.length / 2); + const character = String(str.substr(charIndex, 1).charCodeAt()); + let sum = 0; + for (let i = 0; i < character.length; i++) { sum += parseInt(character.charAt(i)); } - var index = String(sum).substr(-1); + let index = String(sum).substr(-1); return (index % numRandomColors) + 1; } else { @@ -774,16 +771,14 @@ import 'programStyles'; * @returns {string} HTML markup fo the card's text. */ function getCardTextLines(lines, cssClass, forceLines, isOuterFooter, cardLayout, addRightMargin, maxLines) { - var html = ''; + let html = ''; - var valid = 0; - var i; - var length; + let valid = 0; - for (i = 0, length = lines.length; i < length; i++) { + for (let i = 0; i < lines.length; i++) { - var currentCssClass = cssClass; - var text = lines[i]; + let currentCssClass = cssClass; + let text = lines[i]; if (valid > 0 && isOuterFooter) { currentCssClass += ' cardText-secondary'; @@ -809,9 +804,9 @@ import 'programStyles'; if (forceLines) { - length = maxLines || Math.min(lines.length, maxLines || lines.length); + let linesLength = maxLines || Math.min(lines.length, maxLines || lines.length); - while (valid < length) { + while (valid < linesLength) { html += "
 
"; valid++; } @@ -837,11 +832,12 @@ import 'programStyles'; * @returns {string} The air time text for the item base on the given dates. */ function getAirTimeText(item, showAirDateTime, showAirEndTime) { - var airTimeText = ''; + let airTimeText = ''; + if (item.StartDate) { try { - var date = datetime.parseISO8601Date(item.StartDate); + let date = datetime.parseISO8601Date(item.StartDate); if (showAirDateTime) { airTimeText += datetime.toLocaleDateString(date, { weekday: 'short', month: 'short', day: 'numeric' }) + ' '; @@ -877,13 +873,13 @@ import 'programStyles'; * @returns {string} HTML markup of the card's footer text. */ function getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerClass, progressHtml, logoUrl, isOuterFooter) { - var html = ''; + let html = ''; if (logoUrl) { html += ''; } - var showOtherText = isOuterFooter ? !overlayText : overlayText; + const showOtherText = isOuterFooter ? !overlayText : overlayText; if (isOuterFooter && options.cardLayout && layoutManager.mobile) { @@ -892,12 +888,12 @@ import 'programStyles'; } } - var cssClass = options.centerText ? "cardText cardTextCentered" : "cardText"; - var serverId = item.ServerId || options.serverId; + const cssClass = options.centerText ? "cardText cardTextCentered" : "cardText"; + const serverId = item.ServerId || options.serverId; - var lines = []; - var parentTitleUnderneath = item.Type === 'MusicAlbum' || item.Type === 'Audio' || item.Type === 'MusicVideo'; - var titleAdded; + let lines = []; + const parentTitleUnderneath = item.Type === 'MusicAlbum' || item.Type === 'Audio' || item.Type === 'MusicVideo'; + let titleAdded; if (showOtherText) { if ((options.showParentTitle || options.showParentTitleOrTitle) && !parentTitleUnderneath) { @@ -926,7 +922,7 @@ import 'programStyles'; } } else { - var parentTitle = item.SeriesName || item.Series || item.Album || item.AlbumArtist || ""; + const parentTitle = item.SeriesName || item.Series || item.Album || item.AlbumArtist || ""; if (parentTitle || showTitle) { lines.push(parentTitle); @@ -936,14 +932,14 @@ import 'programStyles'; } } - var showMediaTitle = (showTitle && !titleAdded) || (options.showParentTitleOrTitle && !lines.length); + let showMediaTitle = (showTitle && !titleAdded) || (options.showParentTitleOrTitle && !lines.length); if (!showMediaTitle && !titleAdded && (showTitle || forceName)) { showMediaTitle = true; } if (showMediaTitle) { - var name = options.showTitle === 'auto' && !item.IsFolder && item.MediaType === 'Photo' ? '' : itemHelper.getDisplayName(item, { + const name = options.showTitle === 'auto' && !item.IsFolder && item.MediaType === 'Photo' ? '' : itemHelper.getDisplayName(item, { includeParentInfo: options.includeParentInfoInTitle }); @@ -970,22 +966,18 @@ import 'programStyles'; } if (options.showItemCounts) { - - var itemCountHtml = getItemCountsHtml(options, item); - - lines.push(itemCountHtml); + lines.push(getItemCountsHtml(options, item)); } if (options.textLines) { - var additionalLines = options.textLines(item); - for (var i = 0, length = additionalLines.length; i < length; i++) { + const additionalLines = options.textLines(item); + for (let i = 0; i < additionalLines.length; i++) { lines.push(additionalLines[i]); } } if (options.showSongCount) { - - var songLine = ''; + let songLine = ''; if (item.SongCount) { songLine = item.SongCount === 1 ? @@ -1023,7 +1015,7 @@ import 'programStyles'; } else { if (item.EndDate && item.ProductionYear) { - var endYear = datetime.parseISO8601Date(item.EndDate).getFullYear(); + const endYear = datetime.parseISO8601Date(item.EndDate).getFullYear(); lines.push(item.ProductionYear + ((endYear === item.ProductionYear) ? '' : (' - ' + endYear))); } else { lines.push(item.ProductionYear || ''); @@ -1118,7 +1110,7 @@ import 'programStyles'; lines = []; } - var addRightTextMargin = isOuterFooter && options.cardLayout && !options.centerText && options.cardFooterAside !== 'none' && layoutManager.mobile; + const addRightTextMargin = isOuterFooter && options.cardLayout && !options.centerText && options.cardFooterAside !== 'none' && layoutManager.mobile; html += getCardTextLines(lines, cssClass, !options.overlayText, isOuterFooter, options.cardLayout, addRightTextMargin, options.lines); @@ -1155,7 +1147,7 @@ import 'programStyles'; return text; } - var html = ''; @@ -1169,8 +1161,8 @@ import 'programStyles'; * @returns {string} HTML markup for the item count indicator. */ function getItemCountsHtml(options, item) { - var counts = []; - var childText; + let counts = []; + let childText; if (item.Type === 'Playlist') { @@ -1178,7 +1170,7 @@ import 'programStyles'; if (item.RunTimeTicks) { - var minutes = item.RunTimeTicks / 600000000; + let minutes = item.RunTimeTicks / 600000000; minutes = minutes || 1; @@ -1257,7 +1249,7 @@ import 'programStyles'; return counts.join(', '); } - var refreshIndicatorLoaded; + let refreshIndicatorLoaded; /** * Imports the refresh indicator element. @@ -1287,7 +1279,7 @@ import 'programStyles'; * @returns {string} HTML markup for the generated card. */ function buildCard(index, item, apiClient, options) { - var action = options.action || 'link'; + let action = options.action || 'link'; if (action === 'play' && item.IsFolder) { // If this hard-coding is ever removed make sure to test nested photo albums @@ -1296,13 +1288,13 @@ import 'programStyles'; action = 'play'; } - var shape = options.shape; + let shape = options.shape; if (shape === 'mixed') { shape = null; - var primaryImageAspectRatio = item.PrimaryImageAspectRatio; + const primaryImageAspectRatio = item.PrimaryImageAspectRatio; if (primaryImageAspectRatio) { @@ -1320,7 +1312,7 @@ import 'programStyles'; // TODO move card creation code to Card component - var className = 'card'; + let className = 'card'; if (shape) { className += ' ' + shape + 'Card'; @@ -1346,16 +1338,16 @@ import 'programStyles'; } } - var imgInfo = getCardImageUrl(item, apiClient, options, shape); - var imgUrl = imgInfo.imgUrl; + const imgInfo = getCardImageUrl(item, apiClient, options, shape); + const imgUrl = imgInfo.imgUrl; - var forceName = imgInfo.forceName; + const forceName = imgInfo.forceName; - var showTitle = options.showTitle === 'auto' ? true : (options.showTitle || item.Type === 'PhotoAlbum' || item.Type === 'Folder'); - var overlayText = options.overlayText; + const showTitle = options.showTitle === 'auto' ? true : (options.showTitle || item.Type === 'PhotoAlbum' || item.Type === 'Folder'); + const overlayText = options.overlayText; - var cardImageContainerClass = 'cardImageContainer'; - var coveredImage = options.coverImage || imgInfo.coverImage; + let cardImageContainerClass = 'cardImageContainer'; + const coveredImage = options.coverImage || imgInfo.coverImage; if (coveredImage) { cardImageContainerClass += ' coveredImage'; @@ -1369,17 +1361,17 @@ import 'programStyles'; cardImageContainerClass += ' ' + getDefaultBackgroundClass(item.Name); } - var cardBoxClass = options.cardLayout ? 'cardBox visualCardBox' : 'cardBox'; + let cardBoxClass = options.cardLayout ? 'cardBox visualCardBox' : 'cardBox'; - var footerCssClass; - var progressHtml = indicators.getProgressBarHtml(item); + let footerCssClass; + let progressHtml = indicators.getProgressBarHtml(item); - var innerCardFooter = ''; + let innerCardFooter = ''; - var footerOverlayed = false; + let footerOverlayed = false; - var logoUrl; - var logoHeight = 40; + let logoUrl; + const logoHeight = 40; if (options.showChannelLogo && item.ChannelPrimaryImageTag) { logoUrl = apiClient.getScaledImageUrl(item.ChannelId, { @@ -1410,12 +1402,12 @@ import 'programStyles'; progressHtml = ''; } - var mediaSourceCount = item.MediaSourceCount || 1; + const mediaSourceCount = item.MediaSourceCount || 1; if (mediaSourceCount > 1) { innerCardFooter += '
' + mediaSourceCount + '
'; } - var outerCardFooter = ''; + let outerCardFooter = ''; if (!overlayText && !footerOverlayed) { footerCssClass = options.cardLayout ? 'cardFooter' : 'cardFooter cardFooter-transparent'; @@ -1434,15 +1426,15 @@ import 'programStyles'; cardBoxClass += ' cardBox-bottompadded'; } - var overlayButtons = ''; + let overlayButtons = ''; if (layoutManager.mobile) { - var overlayPlayButton = options.overlayPlayButton; + let overlayPlayButton = options.overlayPlayButton; if (overlayPlayButton == null && !options.overlayMoreButton && !options.overlayInfoButton && !options.cardLayout) { overlayPlayButton = item.MediaType === 'Video'; } - var btnCssClass = 'cardOverlayButton cardOverlayButton-br itemAction'; + const btnCssClass = 'cardOverlayButton cardOverlayButton-br itemAction'; if (options.centerPlayButton) { overlayButtons += ''; @@ -1462,12 +1454,12 @@ import 'programStyles'; } // cardBox can be it's own separate element if an outer footer is ever needed - var cardImageContainerOpen; - var cardImageContainerClose = ''; - var cardBoxClose = ''; - var cardScalableClose = ''; + let cardImageContainerOpen; + let cardImageContainerClose = ''; + let cardBoxClose = ''; + let cardScalableClose = ''; - var cardContentClass = 'cardContent'; + let cardContentClass = 'cardContent'; if (!options.cardLayout) { cardContentClass += ' cardContent-shadow'; } @@ -1485,13 +1477,13 @@ import 'programStyles'; cardImageContainerClose = ''; } - var cardScalableClass = 'cardScalable'; + let cardScalableClass = 'cardScalable'; cardImageContainerOpen = '
' + cardImageContainerOpen; cardBoxClose = '
'; cardScalableClose = '
'; - var indicatorsHtml = ''; + let indicatorsHtml = ''; if (options.missingIndicator !== false) { indicatorsHtml += indicators.getMissingIndicator(item); @@ -1512,7 +1504,7 @@ import 'programStyles'; } if (item.Type === 'CollectionFolder' || item.CollectionType) { - var refreshClass = item.RefreshProgress ? '' : ' class="hide"'; + const refreshClass = item.RefreshProgress ? '' : ' class="hide"'; indicatorsHtml += '
'; requireRefreshIndicator(); } @@ -1525,16 +1517,16 @@ import 'programStyles'; cardImageContainerOpen += getDefaultText(item, options); } - var tagName = (layoutManager.tv) && !overlayButtons ? 'button' : 'div'; + const tagName = (layoutManager.tv) && !overlayButtons ? 'button' : 'div'; - var nameWithPrefix = (item.SortName || item.Name || ''); - var prefix = nameWithPrefix.substring(0, Math.min(3, nameWithPrefix.length)); + const nameWithPrefix = (item.SortName || item.Name || ''); + let prefix = nameWithPrefix.substring(0, Math.min(3, nameWithPrefix.length)); if (prefix) { prefix = prefix.toUpperCase(); } - var timerAttributes = ''; + let timerAttributes = ''; if (item.TimerId) { timerAttributes += ' data-timerid="' + item.TimerId + '"'; } @@ -1542,7 +1534,7 @@ import 'programStyles'; timerAttributes += ' data-seriestimerid="' + item.SeriesTimerId + '"'; } - var actionAttribute; + let actionAttribute; if (tagName === 'button') { className += " itemAction"; @@ -1555,16 +1547,16 @@ import 'programStyles'; className += ' card-withuserdata'; } - var positionTicksData = item.UserData && item.UserData.PlaybackPositionTicks ? (' data-positionticks="' + item.UserData.PlaybackPositionTicks + '"') : ''; - var collectionIdData = options.collectionId ? (' data-collectionid="' + options.collectionId + '"') : ''; - var playlistIdData = options.playlistId ? (' data-playlistid="' + options.playlistId + '"') : ''; - var mediaTypeData = item.MediaType ? (' data-mediatype="' + item.MediaType + '"') : ''; - var collectionTypeData = item.CollectionType ? (' data-collectiontype="' + item.CollectionType + '"') : ''; - var channelIdData = item.ChannelId ? (' data-channelid="' + item.ChannelId + '"') : ''; - var contextData = options.context ? (' data-context="' + options.context + '"') : ''; - var parentIdData = options.parentId ? (' data-parentid="' + options.parentId + '"') : ''; + const positionTicksData = item.UserData && item.UserData.PlaybackPositionTicks ? (' data-positionticks="' + item.UserData.PlaybackPositionTicks + '"') : ''; + const collectionIdData = options.collectionId ? (' data-collectionid="' + options.collectionId + '"') : ''; + const playlistIdData = options.playlistId ? (' data-playlistid="' + options.playlistId + '"') : ''; + const mediaTypeData = item.MediaType ? (' data-mediatype="' + item.MediaType + '"') : ''; + const collectionTypeData = item.CollectionType ? (' data-collectiontype="' + item.CollectionType + '"') : ''; + const channelIdData = item.ChannelId ? (' data-channelid="' + item.ChannelId + '"') : ''; + const contextData = options.context ? (' data-context="' + options.context + '"') : ''; + const parentIdData = options.parentId ? (' data-parentid="' + options.parentId + '"') : ''; - var additionalCardContent = ''; + let additionalCardContent = ''; if (layoutManager.desktop) { additionalCardContent += getHoverMenuHtml(item, action); @@ -1580,11 +1572,11 @@ import 'programStyles'; * @returns {string} HTML markup of the card overlay. */ function getHoverMenuHtml(item, action) { - var html = ''; + let html = ''; html += '
'; - var btnCssClass = 'cardOverlayButton cardOverlayButton-hover itemAction paper-icon-button-light'; + const btnCssClass = 'cardOverlayButton cardOverlayButton-hover itemAction paper-icon-button-light'; if (playbackManager.canPlay(item)) { html += ''; @@ -1592,7 +1584,7 @@ import 'programStyles'; html += '
'; - var userData = item.UserData || {}; + const userData = item.UserData || {}; if (itemHelper.canMarkPlayed(item)) { require(['emby-playstatebutton']); @@ -1601,7 +1593,7 @@ import 'programStyles'; if (itemHelper.canRate(item)) { - var likes = userData.Likes == null ? '' : userData.Likes; + const likes = userData.Likes == null ? '' : userData.Likes; require(['emby-ratingbutton']); html += ''; @@ -1623,7 +1615,7 @@ import 'programStyles'; */ export function getDefaultText(item, options) { if (item.CollectionType) { - return '' + return ''; } switch (item.Type) { @@ -1646,7 +1638,7 @@ import 'programStyles'; return '' + options.defaultCardImageIcon + ''; } - var defaultName = isUsingLiveTvNaming(item) ? item.Name : itemHelper.getDisplayName(item); + const defaultName = isUsingLiveTvNaming(item) ? item.Name : itemHelper.getDisplayName(item); return '
' + defaultName + '
'; } @@ -1670,7 +1662,7 @@ import 'programStyles'; } } - var html = buildCardsHtmlInternal(items, options); + const html = buildCardsHtmlInternal(items, options); if (html) { @@ -1698,9 +1690,9 @@ import 'programStyles'; /** * Ensures the indicators for a card exist and creates them if they don't. - * @param {string} card - HTML Markup of the card. - * @param {string} indicatorsElem - HTML markup of the indicators. - * @returns {string} - HTML markup of the indicators. + * @param {HTMLDivElement} card - HTML Markup of the card. + * @param {HTMLDivElement} indicatorsElem - HTML markup of the indicators. + * @returns {HTMLDivElement} - HTML markup of the indicators. */ function ensureIndicators(card, indicatorsElem) { if (indicatorsElem) { @@ -1711,7 +1703,7 @@ import 'programStyles'; if (!indicatorsElem) { - var cardImageContainer = card.querySelector('.cardImageContainer'); + const cardImageContainer = card.querySelector('.cardImageContainer'); indicatorsElem = document.createElement('div'); indicatorsElem.classList.add('cardIndicators'); cardImageContainer.appendChild(indicatorsElem); @@ -1722,16 +1714,16 @@ import 'programStyles'; /** * Adds user data to the card such as progress indicators, played status, etc. - * @param {string} card - HTML markup of the card. + * @param {HTMLDivElement} card - HTML markup of the card. * @param {Object} userData - User data to apply to the card. */ function updateUserData(card, userData) { - var type = card.getAttribute('data-type'); - var enableCountIndicator = type === 'Series' || type === 'BoxSet' || type === 'Season'; - var indicatorsElem = null; - var playedIndicator = null; - var countIndicator = null; - var itemProgressBar = null; + const type = card.getAttribute('data-type'); + const enableCountIndicator = type === 'Series' || type === 'BoxSet' || type === 'Season'; + let indicatorsElem = null; + let playedIndicator = null; + let countIndicator = null; + let itemProgressBar = null; if (userData.Played) { @@ -1774,7 +1766,7 @@ import 'programStyles'; } } - var progressHtml = indicators.getProgressBarHtml({ + const progressHtml = indicators.getProgressBarHtml({ Type: type, UserData: userData, MediaType: 'Video' @@ -1788,11 +1780,11 @@ import 'programStyles'; itemProgressBar = document.createElement('div'); itemProgressBar.classList.add('itemProgressBar'); - var innerCardFooter = card.querySelector('.innerCardFooter'); + let innerCardFooter = card.querySelector('.innerCardFooter'); if (!innerCardFooter) { innerCardFooter = document.createElement('div'); innerCardFooter.classList.add('innerCardFooter'); - var cardImageContainer = card.querySelector('.cardImageContainer'); + const cardImageContainer = card.querySelector('.cardImageContainer'); cardImageContainer.appendChild(innerCardFooter); } innerCardFooter.appendChild(itemProgressBar); @@ -1814,9 +1806,9 @@ import 'programStyles'; * @param {HTMLElement} scope - DOM Element to use as a scope when selecting cards. */ export function onUserDataChanged(userData, scope) { - var cards = (scope || document.body).querySelectorAll('.card-withuserdata[data-id="' + userData.ItemId + '"]'); + const cards = (scope || document.body).querySelectorAll('.card-withuserdata[data-id="' + userData.ItemId + '"]'); - for (var i = 0, length = cards.length; i < length; i++) { + for (let i = 0, length = cards.length; i < length; i++) { updateUserData(cards[i], userData); } } @@ -1828,13 +1820,13 @@ import 'programStyles'; * @param {HTMLElement} itemsContainer - DOM Element of the items container. */ export function onTimerCreated(programId, newTimerId, itemsContainer) { - var cells = itemsContainer.querySelectorAll('.card[data-id="' + programId + '"]'); + const cells = itemsContainer.querySelectorAll('.card[data-id="' + programId + '"]'); - for (var i = 0, length = cells.length; i < length; i++) { - var cell = cells[i]; - var icon = cell.querySelector('.timerIndicator'); + for (let i = 0, length = cells.length; i < length; i++) { + let cell = cells[i]; + const icon = cell.querySelector('.timerIndicator'); if (!icon) { - var indicatorsElem = ensureIndicators(cell); + const indicatorsElem = ensureIndicators(cell); indicatorsElem.insertAdjacentHTML('beforeend', ''); } cell.setAttribute('data-timerid', newTimerId); @@ -1847,11 +1839,11 @@ import 'programStyles'; * @param {HTMLElement} itemsContainer - DOM Element of the items container. */ export function onTimerCancelled(timerId, itemsContainer) { - var cells = itemsContainer.querySelectorAll('.card[data-timerid="' + timerId + '"]'); + const cells = itemsContainer.querySelectorAll('.card[data-timerid="' + timerId + '"]'); - for (var i = 0, length = cells.length; i < length; i++) { - var cell = cells[i]; - var icon = cell.querySelector('.timerIndicator'); + for (let i = 0; i < cells.length; i++) { + let cell = cells[i]; + let icon = cell.querySelector('.timerIndicator'); if (icon) { icon.parentNode.removeChild(icon); } @@ -1865,11 +1857,11 @@ import 'programStyles'; * @param {HTMLElement} itemsContainer - DOM Element of the items container. */ export function onSeriesTimerCancelled(canceledTimerId, itemsContainer) { - var cells = itemsContainer.querySelectorAll('.card[data-seriestimerid="' + canceledTimerId + '"]'); + const cells = itemsContainer.querySelectorAll('.card[data-seriestimerid="' + canceledTimerId + '"]'); - for (var i = 0, length = cells.length; i < length; i++) { - var cell = cells[i]; - var icon = cell.querySelector('.timerIndicator'); + for (let i = 0; i < cells.length; i++) { + let cell = cells[i]; + let icon = cell.querySelector('.timerIndicator'); if (icon) { icon.parentNode.removeChild(icon); } From fb63fc4cce4e4ebcda857bfd7f0a07549210d9da Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 19 Mar 2020 22:38:55 +0100 Subject: [PATCH 042/120] Update yarn.lock --- yarn.lock | 150 +++++++++++++++++++++++++++--------------------------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/yarn.lock b/yarn.lock index d260ee6e3f..0ec0ea3155 100644 --- a/yarn.lock +++ b/yarn.lock @@ -730,11 +730,6 @@ resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" - integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== - "@gulp-sourcemaps/identity-map@1.X": version "1.0.2" resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz#1e6fe5d8027b1f285dc0d31762f566bccd73d5a9" @@ -828,9 +823,9 @@ integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= "@types/node@*": - version "13.9.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.1.tgz#96f606f8cd67fb018847d9b61e93997dabdefc72" - integrity sha512-E6M6N0blf/jiZx8Q3nb0vNaswQeEyn0XlupO+xN6DtJ6r6IT4nXrTry7zhIfYvFCl3/8Cu6WIysmUBKiqV0bqQ== + version "13.9.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.2.tgz#ace1880c03594cc3e80206d96847157d8e7fa349" + integrity sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1924,13 +1919,14 @@ browserslist@^1.1.3: electron-to-chromium "^1.2.7" browserslist@^4.0.0, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.8.5, browserslist@^4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.9.1.tgz#01ffb9ca31a1aef7678128fc6a2253316aa7287c" - integrity sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw== + version "4.10.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" + integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== dependencies: - caniuse-lite "^1.0.30001030" - electron-to-chromium "^1.3.363" - node-releases "^1.1.50" + caniuse-lite "^1.0.30001035" + electron-to-chromium "^1.3.378" + node-releases "^1.1.52" + pkg-up "^3.1.0" bs-recipes@1.3.4: version "1.3.4" @@ -2169,7 +2165,7 @@ caniuse-db@^1.0.30000639: resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001035.tgz#3a182cab9d556a4a02d945f1f739e81c18e73bfa" integrity sha512-kLUON4XN3tq5Nwl7ZICDw+7/vMynSpRMVYDRkzLL31lgnpa6M2YXYdjst3h+xbzjMgdcveRTnRGE1h/1IcKK6A== -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001030: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001035: version "1.0.30001035" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e" integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ== @@ -3541,10 +3537,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.363: - version "1.3.376" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.376.tgz#7cb7b5205564a06c8f8ecfbe832cbd47a1224bb1" - integrity sha512-cv/PYVz5szeMz192ngilmezyPNFkUjuynuL2vNdiqIrio440nfTDdc0JJU0TS2KHLSVCs9gBbt4CFqM+HcBnjw== +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.378: + version "1.3.379" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.379.tgz#81dc5e82a3e72bbb830d93e15bc35eda2bbc910e" + integrity sha512-NK9DBBYEBb5f9D7zXI0hiE941gq3wkBeQmXs1ingigA/jnTg5mhwY2Z5egwA+ZI8OLGKCx0h1Cl8/xeuIBuLlg== elliptic@^6.0.0: version "6.5.2" @@ -4570,9 +4566,9 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.11" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" - integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + version "1.2.12" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" + integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== dependencies: bindings "^1.5.0" nan "^2.12.1" @@ -5666,9 +5662,9 @@ imurmurhash@^0.1.4: integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= in-publish@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" - integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= + version "2.0.1" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" + integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== indent-string@^2.1.0: version "2.1.0" @@ -6360,11 +6356,11 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + version "2.1.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" + integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== dependencies: - minimist "^1.2.0" + minimist "^1.2.5" jsonfile@^3.0.0: version "3.0.1" @@ -6509,7 +6505,7 @@ levn@^0.3.0, levn@~0.3.0: "libass-wasm@https://github.com/jellyfin/JavascriptSubtitlesOctopus": version "3.0.2" - resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#7f331237026db75af2441717a4132d2398e96735" + resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#99626d3ee5eb6bd695d7c908c5e6f910213b0e71" liftoff@^3.1.0: version "3.1.0" @@ -7077,9 +7073,9 @@ meow@^5.0.0: yargs-parser "^10.0.0" meow@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-6.0.1.tgz#f9b3f912c9aa039142cebcf74315129f4cd1ce1c" - integrity sha512-kxGTFgT/b7/oSRSQsJ0qsT5IMU+bgZ1eAdSA3kIV7onkW0QWo/hL5RbGlMfvBjHJKPE1LaPX0kdecYFiqYWjUw== + version "6.1.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.0.tgz#4ff4641818d3502afcddc631f94cb6971a581cb3" + integrity sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg== dependencies: "@types/minimist" "^1.2.0" camelcase-keys "^6.1.1" @@ -7091,7 +7087,7 @@ meow@^6.0.1: redent "^3.0.0" trim-newlines "^3.0.0" type-fest "^0.8.1" - yargs-parser "^16.1.0" + yargs-parser "^18.1.1" merge-descriptors@1.0.1: version "1.0.1" @@ -7218,17 +7214,12 @@ minimist-options@^4.0.1: arrify "^1.0.1" is-plain-obj "^1.1.0" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - minimist@1.1.x: version "1.1.3" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -7263,11 +7254,11 @@ mixin-deep@^1.2.0: is-extendable "^1.0.1" "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" + integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== dependencies: - minimist "0.0.8" + minimist "^1.2.5" move-concurrently@^1.0.1: version "1.0.1" @@ -7451,7 +7442,27 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" +<<<<<<< HEAD node-releases@^1.1.50: +======= +node-pre-gyp@*: + version "0.14.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" + integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4.4.2" + +node-releases@^1.1.52: +>>>>>>> Update yarn.lock version "1.1.52" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== @@ -8249,6 +8260,13 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + plugin-error@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" @@ -8647,9 +8665,9 @@ postcss-modules-local-by-default@^3.0.2: postcss-value-parser "^4.0.0" postcss-modules-scope@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba" - integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== dependencies: postcss "^7.0.6" postcss-selector-parser "^6.0.0" @@ -8957,15 +8975,6 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== - dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" @@ -9034,15 +9043,6 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" - integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - postcss@^5.0.0, postcss@^5.0.18: version "5.2.18" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" @@ -9453,9 +9453,9 @@ regenerator-runtime@^0.13.4: integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== regenerator-transform@^0.14.2: - version "0.14.3" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.3.tgz#54aebff2ef58c0ae61e695ad1b9a9d65995fff78" - integrity sha512-zXHNKJspmONxBViAb3ZUmFoFPnTBs3zFhCEZJiwp/gkNzxVbTqNJVjYKx6Qk1tQ1P4XLf4TbH9+KBB7wGoAaUw== + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== dependencies: "@babel/runtime" "^7.8.4" private "^0.1.8" @@ -11073,9 +11073,9 @@ terser-webpack-plugin@^1.4.3: worker-farm "^1.7.0" terser@^4.0.0, terser@^4.1.2: - version "4.6.6" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.6.tgz#da2382e6cafbdf86205e82fb9a115bd664d54863" - integrity sha512-4lYPyeNmstjIIESr/ysHg2vUPRGf2tzF9z2yYwnowXVuVzLEamPN1Gfrz7f8I9uEPuHcbFlW4PLIAsJoxXyJ1g== + version "4.6.7" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" + integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -12226,10 +12226,10 @@ yargs-parser@^13.1.0: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" - integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== +yargs-parser@^18.1.1: + version "18.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.1.tgz#bf7407b915427fc760fcbbccc6c82b4f0ffcbd37" + integrity sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" From 1cfd2538be53e4134050b04fbcef9d3e28928b94 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 19 Mar 2020 23:01:21 +0100 Subject: [PATCH 043/120] Remove dead code from CardBuilder --- src/components/cardbuilder/cardBuilder.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 24e4035050..3bcc83ce62 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -459,16 +459,6 @@ import 'programStyles'; } } - /*let cardFooterHtml = ''; - for (let i = 0; i < (options.lines || 0); i++) { - - if (i === 0) { - cardFooterHtml += '
 
'; - } else { - cardFooterHtml += '
 
'; - } - }*/ - return html; } From 759b3fc106d7f332530452f14c7e771901c347ae Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 21 Mar 2020 03:30:21 +0900 Subject: [PATCH 044/120] minor string changes --- src/components/cardbuilder/cardBuilder.js | 66 ++++++++++++----------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 3bcc83ce62..3eac8a8b8a 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1,8 +1,10 @@ /* eslint-disable indent */ + /** * Card builder module. * @module cardBuilder */ + import datetime from 'datetime'; import imageLoader from 'imageLoader'; import connectionManager from 'connectionManager'; @@ -23,10 +25,10 @@ import 'programStyles'; const enableFocusTransform = !browser.slow && !browser.edge; /** - * Generate the HTML markup for cards of a set of items. - * @param items - The items to generate cards for. + * Generate the HTML markup for cards for a set of items. + * @param items - The items used to generate cards. * @param options - The options of the cards. - * @returns {string} The HTML markup for cards. + * @returns {string} The HTML markup for the cards. */ export function getCardsHtml(items, options) { if (arguments.length === 1) { @@ -42,7 +44,7 @@ import 'programStyles'; * @param {string} shape - Shape of the cards. * @param {number} screenWidth - Width of the screen. * @param {boolean} isOrientationLandscape - Flag for the orientation of the screen. - * @returns {number} Number of cards per row of an itemsContainer. + * @returns {number} Number of cards per row for an itemsContainer. */ function getPostersPerRow(shape, screenWidth, isOrientationLandscape) { switch (shape) { @@ -250,7 +252,7 @@ import 'programStyles'; /** * Checks if the window is resizable. - * @param {number} windowWidth - Width of the client's screen. + * @param {number} windowWidth - Width of the device's screen. * @returns {boolean} - Result of the check. */ function isResizable(windowWidth) { @@ -279,7 +281,7 @@ import 'programStyles'; } /** - * Normalizes the options of a card. + * Normalizes the options for a card. * @param {Object} items - A set of items. * @param {Object} options - Options for handling the items. */ @@ -463,7 +465,7 @@ import 'programStyles'; } /** - * Computes the Aspect Ratio for a card given its shape. + * Computes the aspect ratio for a card given its shape. * @param {string} shape - Shape for which to get the aspect ratio. * @returns {null|number} Ratio of the shape. */ @@ -489,14 +491,14 @@ import 'programStyles'; /** * @typedef {Object} CardImageUrl * @property {string} imgUrl - URL of the image. - * @property {boolean} forceName - Force the name to be visible. + * @property {boolean} forceName - Flag to force the name to be visible. * @property {boolean} coverImage - Acts as a cover image. */ - /** Get the URL of the Card's image. + /** Get the URL of the card's image. * @param {Object} item - Item for which to generate a card. - * @param {Object} apiClient - API Client object. - * @param {Object} options - Options of the card to generate. + * @param {Object} apiClient - API client object. + * @param {Object} options - Options of the card. * @param {string} shape - Shape of the desired image. * @returns {CardImageUrl} Object representing the URL of the card's image. */ @@ -717,7 +719,7 @@ import 'programStyles'; } /** - * Generates a random integer in a range. + * Generates a random integer in a given range. * @param {number} min - Minimum of the range. * @param {number} max - Maximum of the range. * @returns {number} Randomly generated number. @@ -727,7 +729,7 @@ import 'programStyles'; } /** - * Generates an index used to select the default color of a Card based on a string. + * Generates an index used to select the default color of a card based on a string. * @param {string} str - String to use for generating the index. * @returns {number} Index of the color. */ @@ -758,7 +760,7 @@ import 'programStyles'; * @param {string} cardLayout - DEPRECATED * @param {boolean} addRightMargin - Flag to add a right margin to the text. * @param {number} maxLines - Maximum number of lines to render. - * @returns {string} HTML markup fo the card's text. + * @returns {string} HTML markup for the card's text. */ function getCardTextLines(lines, cssClass, forceLines, isOuterFooter, cardLayout, addRightMargin, maxLines) { let html = ''; @@ -806,9 +808,9 @@ import 'programStyles'; } /** - * Determines if the item is Live TV. - * @param {Object} item - Item to use. - * @returns {boolean} Flag showing if the item is Live TV. + * Determines if the item is live TV. + * @param {Object} item - Item to use for the check. + * @returns {boolean} Flag showing if the item is live TV. */ function isUsingLiveTvNaming(item) { return item.Type === 'Program' || item.Type === 'Timer' || item.Type === 'Recording'; @@ -819,7 +821,7 @@ import 'programStyles'; * @param {object} item - Item used to generate the air time text. * @param {string} showAirDateTime - ISO8601 date for the start of the show. * @param {string} showAirEndTime - ISO8601 date for the end of the show. - * @returns {string} The air time text for the item base on the given dates. + * @returns {string} The air time text for the item based on the given dates. */ function getAirTimeText(item, showAirDateTime, showAirEndTime) { let airTimeText = ''; @@ -850,7 +852,7 @@ import 'programStyles'; /** * Generates the HTML markup for the card's footer text. * @param {Object} item - Item used to generate the footer text. - * @param {Object} apiClient - API Client instance. + * @param {Object} apiClient - API client instance. * @param {Object} options - Options used to generate the footer text. * @param {string} showTitle - Title of the show. * @param {boolean} forceName - Flag to force showing the name of the item. @@ -1264,7 +1266,7 @@ import 'programStyles'; * Builds the HTML markup for an individual card. * @param {number} index - Index of the card * @param {object} item - Item used to generate the card. - * @param {object} apiClient - API Client instance. + * @param {object} apiClient - API client instance. * @param {object} options - Options used to generate the card. * @returns {string} HTML markup for the generated card. */ @@ -1598,7 +1600,7 @@ import 'programStyles'; } /** - * Generates the text or icon used on default card backgrounds. + * Generates the text or icon used for default card backgrounds. * @param {object} item - Item used to generate the card overlay. * @param {object} options - Options used to generate the card overlay. * @returns {string} HTML markup of the card overlay. @@ -1633,7 +1635,7 @@ import 'programStyles'; } /** - * Builds a set of cards and inserts it into the page;. + * Builds a set of cards and inserts it into the page. * @param {Array} items - Array of items used to build cards. * @param {options} options - Options of the cards to build. */ @@ -1679,8 +1681,8 @@ import 'programStyles'; } /** - * Ensures the indicators for a card exist and creates them if they don't. - * @param {HTMLDivElement} card - HTML Markup of the card. + * Ensures the indicators for a card exist and creates them if they don't exist. + * @param {HTMLDivElement} card - HTML markup of the card. * @param {HTMLDivElement} indicatorsElem - HTML markup of the indicators. * @returns {HTMLDivElement} - HTML markup of the indicators. */ @@ -1703,7 +1705,7 @@ import 'programStyles'; } /** - * Adds user data to the card such as progress indicators, played status, etc. + * Adds user data to the card such as progress indicators and played status. * @param {HTMLDivElement} card - HTML markup of the card. * @param {Object} userData - User data to apply to the card. */ @@ -1793,7 +1795,7 @@ import 'programStyles'; /** * Handles when user data has changed. * @param {Object} userData - User data to apply to the card. - * @param {HTMLElement} scope - DOM Element to use as a scope when selecting cards. + * @param {HTMLElement} scope - DOM element to use as a scope when selecting cards. */ export function onUserDataChanged(userData, scope) { const cards = (scope || document.body).querySelectorAll('.card-withuserdata[data-id="' + userData.ItemId + '"]'); @@ -1804,10 +1806,10 @@ import 'programStyles'; } /** - * Handles when a timer was created. + * Handles when a timer has been created. * @param {string} programId - ID of the program. * @param {string} newTimerId - ID of the new timer. - * @param {HTMLElement} itemsContainer - DOM Element of the items container. + * @param {HTMLElement} itemsContainer - DOM element of the itemsContainer. */ export function onTimerCreated(programId, newTimerId, itemsContainer) { const cells = itemsContainer.querySelectorAll('.card[data-id="' + programId + '"]'); @@ -1824,9 +1826,9 @@ import 'programStyles'; } /** - * Handles when a timer is cancelled. + * Handles when a timer has been cancelled. * @param {string} timerId - ID of the cancelled timer. - * @param {HTMLElement} itemsContainer - DOM Element of the items container. + * @param {HTMLElement} itemsContainer - DOM element of the items container. */ export function onTimerCancelled(timerId, itemsContainer) { const cells = itemsContainer.querySelectorAll('.card[data-timerid="' + timerId + '"]'); @@ -1842,9 +1844,9 @@ import 'programStyles'; } /** - * Handles when a series timer is cancelled. + * Handles when a series timer has been cancelled. * @param {string} canceledTimerId - ID of the cancelled timer. - * @param {HTMLElement} itemsContainer - DOM Element of the items container. + * @param {HTMLElement} itemsContainer - DOM element of the items container. */ export function onSeriesTimerCancelled(canceledTimerId, itemsContainer) { const cells = itemsContainer.querySelectorAll('.card[data-seriestimerid="' + canceledTimerId + '"]'); From feeacf12a2ed7197e5d1f17f70e56dfe64f15305 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 22 Mar 2020 17:12:34 +0100 Subject: [PATCH 045/120] Implement suggestions --- src/components/cardbuilder/cardBuilder.js | 47 ++++++++++------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 3eac8a8b8a..1f87a341c0 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1,8 +1,8 @@ /* eslint-disable indent */ /** - * Card builder module. - * @module cardBuilder + * Module for building cards from item data. + * @module components/cardBuilder/cardBuilder */ import datetime from 'datetime'; @@ -488,19 +488,12 @@ import 'programStyles'; return null; } - /** - * @typedef {Object} CardImageUrl - * @property {string} imgUrl - URL of the image. - * @property {boolean} forceName - Flag to force the name to be visible. - * @property {boolean} coverImage - Acts as a cover image. - */ - - /** Get the URL of the card's image. + /** Get the URL of the Card's image. * @param {Object} item - Item for which to generate a card. * @param {Object} apiClient - API client object. * @param {Object} options - Options of the card. * @param {string} shape - Shape of the desired image. - * @returns {CardImageUrl} Object representing the URL of the card's image. + * @returns {Object} Object representing the URL of the card's image. */ function getCardImageUrl(item, apiClient, options, shape) { item = item.ProgramInfo || item; @@ -854,15 +847,15 @@ import 'programStyles'; * @param {Object} item - Item used to generate the footer text. * @param {Object} apiClient - API client instance. * @param {Object} options - Options used to generate the footer text. - * @param {string} showTitle - Title of the show. + * @param {string} showTitle - Flag to show the title in the footer. * @param {boolean} forceName - Flag to force showing the name of the item. * @param {boolean} overlayText - Flag to show overlay text. - * @param {CardImageUrl} imgUrl - Object representing the card's image URL. - * @param {string} footerClass - CSS class of the footer. - * @param {string} progressHtml - HTML markup of the progress bar. + * @param {Object} imgUrl - Object representing the card's image URL. + * @param {string} footerClass - CSS classes of the footer element. + * @param {string} progressHtml - HTML markup of the progress bar element. * @param {string} logoUrl - URL of the logo for the item. * @param {boolean} isOuterFooter - Flag to mark the text as outer footer. - * @returns {string} HTML markup of the card's footer text. + * @returns {string} HTML markup of the card's footer text element. */ function getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerClass, progressHtml, logoUrl, isOuterFooter) { let html = ''; @@ -1635,8 +1628,8 @@ import 'programStyles'; } /** - * Builds a set of cards and inserts it into the page. - * @param {Array} items - Array of items used to build cards. + * Builds a set of cards and inserts them into the page;. + * @param {Array} items - Array of items used to build the cards. * @param {options} options - Options of the cards to build. */ export function buildCards(items, options) { @@ -1682,9 +1675,9 @@ import 'programStyles'; /** * Ensures the indicators for a card exist and creates them if they don't exist. - * @param {HTMLDivElement} card - HTML markup of the card. - * @param {HTMLDivElement} indicatorsElem - HTML markup of the indicators. - * @returns {HTMLDivElement} - HTML markup of the indicators. + * @param {HTMLDivElement} card - DOM element of the card. + * @param {HTMLDivElement} indicatorsElem - DOM element of the indicators. + * @returns {HTMLDivElement} - DOM element of the indicators. */ function ensureIndicators(card, indicatorsElem) { if (indicatorsElem) { @@ -1706,7 +1699,7 @@ import 'programStyles'; /** * Adds user data to the card such as progress indicators and played status. - * @param {HTMLDivElement} card - HTML markup of the card. + * @param {HTMLDivElement} card - DOM element of the card. * @param {Object} userData - User data to apply to the card. */ function updateUserData(card, userData) { @@ -1828,7 +1821,7 @@ import 'programStyles'; /** * Handles when a timer has been cancelled. * @param {string} timerId - ID of the cancelled timer. - * @param {HTMLElement} itemsContainer - DOM element of the items container. + * @param {HTMLElement} itemsContainer - DOM element of the itemsContainer. */ export function onTimerCancelled(timerId, itemsContainer) { const cells = itemsContainer.querySelectorAll('.card[data-timerid="' + timerId + '"]'); @@ -1845,11 +1838,11 @@ import 'programStyles'; /** * Handles when a series timer has been cancelled. - * @param {string} canceledTimerId - ID of the cancelled timer. - * @param {HTMLElement} itemsContainer - DOM element of the items container. + * @param {string} cancelledTimerId - ID of the cancelled timer. + * @param {HTMLElement} itemsContainer - DOM element of the itemsContainer. */ - export function onSeriesTimerCancelled(canceledTimerId, itemsContainer) { - const cells = itemsContainer.querySelectorAll('.card[data-seriestimerid="' + canceledTimerId + '"]'); + export function onSeriesTimerCancelled(cancelledTimerId, itemsContainer) { + const cells = itemsContainer.querySelectorAll('.card[data-seriestimerid="' + cancelledTimerId + '"]'); for (let i = 0; i < cells.length; i++) { let cell = cells[i]; From 7bb7270b6137acb009c636c2c93c975e29312ffb Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 22 Mar 2020 18:00:03 +0100 Subject: [PATCH 046/120] Fix rebase issues --- src/components/cardbuilder/cardBuilder.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 1f87a341c0..9d86bc9d7c 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -488,7 +488,7 @@ import 'programStyles'; return null; } - /** Get the URL of the Card's image. + /** Get the URL of the card's image. * @param {Object} item - Item for which to generate a card. * @param {Object} apiClient - API client object. * @param {Object} options - Options of the card. @@ -1628,7 +1628,7 @@ import 'programStyles'; } /** - * Builds a set of cards and inserts them into the page;. + * Builds a set of cards and inserts them into the page. * @param {Array} items - Array of items used to build the cards. * @param {options} options - Options of the cards to build. */ From 032cc9aa85d347f4b8f06b65c5fbd14c6803327e Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Mon, 23 Mar 2020 17:11:35 +0100 Subject: [PATCH 047/120] Update yarn.lock --- webpack.common.js | 12 +- yarn.lock | 667 +++++++++++++++++++++++----------------------- 2 files changed, 342 insertions(+), 337 deletions(-) diff --git a/webpack.common.js b/webpack.common.js index 6b357102c0..c87ccdbc0d 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -6,12 +6,12 @@ const CopyPlugin = require("copy-webpack-plugin"); const Assets = [ "alameda/alameda.js", "native-promise-only/npo.js", - "libass-wasm/dist/subtitles-octopus-worker.js", - "libass-wasm/dist/subtitles-octopus-worker.data", - "libass-wasm/dist/subtitles-octopus-worker.wasm", - "libass-wasm/dist/subtitles-octopus-worker-legacy.js", - "libass-wasm/dist/subtitles-octopus-worker-legacy.data", - "libass-wasm/dist/subtitles-octopus-worker-legacy.js.mem" + "libass-wasm/dist/js/subtitles-octopus-worker.js", + "libass-wasm/dist/js/subtitles-octopus-worker.data", + "libass-wasm/dist/js/subtitles-octopus-worker.wasm", + "libass-wasm/dist/js/subtitles-octopus-worker-legacy.js", + "libass-wasm/dist/js/subtitles-octopus-worker-legacy.data", + "libass-wasm/dist/js/subtitles-octopus-worker-legacy.js.mem" ]; module.exports = { diff --git a/yarn.lock b/yarn.lock index 0ec0ea3155..8b7697cef4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,42 +9,43 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/compat-data@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.6.tgz#7eeaa0dfa17e50c7d9c0832515eee09b56f04e35" - integrity sha512-CurCIKPTkS25Mb8mz267vU95vy+TyUpnctEX2lV33xWNmHAfjruztgiPBbXZRh3xZZy1CYvGx6XfxyTVS+sk7Q== +"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" + integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== dependencies: - browserslist "^4.8.5" + browserslist "^4.9.1" invariant "^2.2.4" semver "^5.5.0" "@babel/core@>=7.2.2", "@babel/core@^7.8.6": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.7.tgz#b69017d221ccdeb203145ae9da269d72cf102f3b" - integrity sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.7" - "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.7" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" "@babel/template" "^7.8.6" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.7" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" - json5 "^2.1.0" + json5 "^2.1.2" lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.8.6", "@babel/generator@^7.8.7": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.8.tgz#cdcd58caab730834cee9eeadb729e833b625da3e" - integrity sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg== +"@babel/generator@^7.9.0": + version "7.9.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.3.tgz#7c8b2956c6f68b3ab732bd16305916fbba521d94" + integrity sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ== dependencies: - "@babel/types" "^7.8.7" + "@babel/types" "^7.9.0" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -64,15 +65,6 @@ "@babel/helper-explode-assignable-expression" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-call-delegate@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz#28a279c2e6c622a6233da548127f980751324cab" - integrity sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ== - dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.7" - "@babel/helper-compilation-targets@^7.8.7": version "7.8.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" @@ -147,17 +139,17 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-transforms@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz#6a13b5eecadc35692047073a64e42977b97654a4" - integrity sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg== +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-simple-access" "^7.8.3" "@babel/helper-split-export-declaration" "^7.8.3" "@babel/template" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/types" "^7.9.0" lodash "^4.17.13" "@babel/helper-optimise-call-expression@^7.8.3": @@ -167,7 +159,7 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== @@ -215,6 +207,11 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-validator-identifier@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" + integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== + "@babel/helper-wrap-function@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" @@ -225,28 +222,28 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" - integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== +"@babel/helpers@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" + integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== dependencies: "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" "@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== dependencies: + "@babel/helper-validator-identifier" "^7.9.0" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.8.6", "@babel/parser@^7.8.7": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.8.tgz#4c3b7ce36db37e0629be1f0d50a571d2f86f6cd4" - integrity sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA== +"@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.3.tgz#043a5fc2ad8b7ea9facddc4e802a1f0f25da7255" + integrity sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A== "@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.8.3" @@ -281,10 +278,18 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-object-rest-spread@^7.8.3": +"@babel/plugin-proposal-numeric-separator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" - integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" + integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" + integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" @@ -297,15 +302,15 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" - integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== +"@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-unicode-property-regex@^7.8.3": +"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": version "7.8.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== @@ -341,6 +346,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" + integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" @@ -400,10 +412,10 @@ "@babel/helper-plugin-utils" "^7.8.3" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.6.tgz#77534447a477cbe5995ae4aee3e39fbc8090c46d" - integrity sha512-k9r8qRay/R6v5aWZkrEclEhKO6mc1CCQr2dLsVHBmOQiMpN6I2bpjX3vgnldUWeEI1GHVNByULVxZ4BdP4Hmdg== +"@babel/plugin-transform-classes@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" + integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== dependencies: "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-define-map" "^7.8.3" @@ -428,7 +440,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-dotall-regex@^7.8.3": +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== @@ -451,10 +463,10 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-for-of@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.6.tgz#a051bd1b402c61af97a27ff51b468321c7c2a085" - integrity sha512-M0pw4/1/KI5WAxPsdcUL/w2LJ7o89YHN3yLkzNjg7Yl15GlVGgzHyCU+FMeAxevHGsLVmUqbirlUIKTafPmzdw== +"@babel/plugin-transform-for-of@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -480,41 +492,41 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-modules-amd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" - integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== +"@babel/plugin-transform-modules-amd@^7.8.3", "@babel/plugin-transform-modules-amd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" + integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" - integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== +"@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" + integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-simple-access" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" - integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== +"@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" + integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== dependencies: "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-umd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" - integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": @@ -540,11 +552,10 @@ "@babel/helper-replace-supers" "^7.8.3" "@babel/plugin-transform-parameters@^7.8.7": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.8.tgz#0381de466c85d5404565243660c4496459525daf" - integrity sha512-hC4Ld/Ulpf1psQciWWwdnUspQoQco2bMzSrwU6TmzRlvoYQe4rQFy9vnCZDTlVeCQj0JPfL+1RX0V8hCJvkgBA== + version "7.9.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a" + integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg== dependencies: - "@babel/helper-call-delegate" "^7.8.7" "@babel/helper-get-function-arity" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -623,11 +634,11 @@ regenerator-runtime "^0.13.4" "@babel/preset-env@^7.8.6": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.7.tgz#1fc7d89c7f75d2d70c2b6768de6c2e049b3cb9db" - integrity sha512-BYftCVOdAYJk5ASsznKAUl53EMhfBbr8CJ1X+AJLfGPscQkwJFiaV/Wn9DPH/7fzm2v6iRYJKYHSqyynTGw0nw== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" + integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== dependencies: - "@babel/compat-data" "^7.8.6" + "@babel/compat-data" "^7.9.0" "@babel/helper-compilation-targets" "^7.8.7" "@babel/helper-module-imports" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -635,14 +646,16 @@ "@babel/plugin-proposal-dynamic-import" "^7.8.3" "@babel/plugin-proposal-json-strings" "^7.8.3" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.0" "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-json-strings" "^7.8.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" @@ -651,20 +664,20 @@ "@babel/plugin-transform-async-to-generator" "^7.8.3" "@babel/plugin-transform-block-scoped-functions" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.8.6" + "@babel/plugin-transform-classes" "^7.9.0" "@babel/plugin-transform-computed-properties" "^7.8.3" "@babel/plugin-transform-destructuring" "^7.8.3" "@babel/plugin-transform-dotall-regex" "^7.8.3" "@babel/plugin-transform-duplicate-keys" "^7.8.3" "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.8.6" + "@babel/plugin-transform-for-of" "^7.9.0" "@babel/plugin-transform-function-name" "^7.8.3" "@babel/plugin-transform-literals" "^7.8.3" "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.8.3" - "@babel/plugin-transform-modules-commonjs" "^7.8.3" - "@babel/plugin-transform-modules-systemjs" "^7.8.3" - "@babel/plugin-transform-modules-umd" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.0" + "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-umd" "^7.9.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" "@babel/plugin-transform-new-target" "^7.8.3" "@babel/plugin-transform-object-super" "^7.8.3" @@ -678,17 +691,29 @@ "@babel/plugin-transform-template-literals" "^7.8.3" "@babel/plugin-transform-typeof-symbol" "^7.8.4" "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/types" "^7.8.7" - browserslist "^4.8.5" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.0" + browserslist "^4.9.1" core-js-compat "^3.6.2" invariant "^2.2.2" levenary "^1.1.1" semver "^5.5.0" +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.7.tgz#8fefce9802db54881ba59f90bb28719b4996324d" - integrity sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg== + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" + integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== dependencies: regenerator-runtime "^0.13.4" @@ -701,27 +726,27 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4", "@babel/traverse@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.6.tgz#acfe0c64e1cd991b3e32eae813a6eb564954b5ff" - integrity sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A== +"@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" + integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.6" + "@babel/generator" "^7.9.0" "@babel/helper-function-name" "^7.8.3" "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.7.tgz#1fc9729e1acbb2337d5b6977a63979b4819f5d1d" - integrity sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw== +"@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" + integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== dependencies: - esutils "^2.0.2" + "@babel/helper-validator-identifier" "^7.9.0" lodash "^4.17.13" to-fast-properties "^2.0.0" @@ -823,9 +848,9 @@ integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= "@types/node@*": - version "13.9.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.2.tgz#ace1880c03594cc3e80206d96847157d8e7fa349" - integrity sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg== + version "13.9.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.3.tgz#6356df2647de9eac569f9a52eda3480fa9e70b4d" + integrity sha512-01s+ac4qerwd6RHD+mVbOEsraDHSgUaefQlEdBbUolnQFjKwCr7luvAlEwW1RFojh67u0z4OUTjPn9LEl4zIkA== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -881,18 +906,18 @@ "@types/vfile-message" "*" "@types/webpack-sources@*": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.6.tgz#3d21dfc2ec0ad0c77758e79362426a9ba7d7cbcb" - integrity sha512-FtAWR7wR5ocJ9+nP137DV81tveD/ZgB1sadnJ/axUGM3BUVfRPx8oQNMtv3JNfTeHx3VP7cXiyfR/jmtEsVHsQ== + version "0.1.7" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.7.tgz#0a330a9456113410c74a5d64180af0cbca007141" + integrity sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw== dependencies: "@types/node" "*" "@types/source-list-map" "*" source-map "^0.6.1" "@types/webpack@^4.4.31": - version "4.41.7" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.7.tgz#22be27dbd4362b01c3954ca9b021dbc9328d9511" - integrity sha512-OQG9viYwO0V1NaNV7d0n79V+n6mjOV30CwgFPIfTzwmk8DHbt+C4f2aBGdCYbo3yFyYD6sjXfqqOjwkl1j+ulA== + version "4.41.8" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.8.tgz#d2244f5f612ee30230a5c8c4ae678bce90d27277" + integrity sha512-mh4litLHTlDG84TGCFv1pZldndI34vkrW9Mks++Zx4KET7DRMoCXUvLbTISiuF4++fMgNnhV9cc1nCXJQyBYbQ== dependencies: "@types/anymatch" "*" "@types/node" "*" @@ -901,150 +926,149 @@ "@types/webpack-sources" "*" source-map "^0.6.0" -"@webassemblyjs/ast@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" -"@webassemblyjs/floating-point-hex-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== -"@webassemblyjs/helper-api-error@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== -"@webassemblyjs/helper-buffer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== -"@webassemblyjs/helper-code-frame@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== dependencies: - "@webassemblyjs/wast-printer" "1.8.5" + "@webassemblyjs/wast-printer" "1.9.0" -"@webassemblyjs/helper-fsm@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== -"@webassemblyjs/helper-module-context@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== dependencies: - "@webassemblyjs/ast" "1.8.5" - mamacro "^0.0.3" + "@webassemblyjs/ast" "1.9.0" -"@webassemblyjs/helper-wasm-bytecode@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== -"@webassemblyjs/helper-wasm-section@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" -"@webassemblyjs/ieee754@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== -"@webassemblyjs/wasm-edit@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" -"@webassemblyjs/wasm-gen@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" -"@webassemblyjs/wasm-opt@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" -"@webassemblyjs/wasm-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" -"@webassemblyjs/wast-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -1495,17 +1519,17 @@ atob@^2.1.2: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.0.0, autoprefixer@^9.6.1, autoprefixer@^9.7.4: - version "9.7.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" - integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== + version "9.7.5" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.5.tgz#8df10b9ff9b5814a8d411a5cfbab9c793c392376" + integrity sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg== dependencies: - browserslist "^4.8.3" - caniuse-lite "^1.0.30001020" + browserslist "^4.11.0" + caniuse-lite "^1.0.30001036" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.26" - postcss-value-parser "^4.0.2" + postcss "^7.0.27" + postcss-value-parser "^4.0.3" aws-sign2@~0.7.0: version "0.7.0" @@ -1526,14 +1550,15 @@ axios@0.19.0: is-buffer "^2.0.2" babel-loader@^8.0.6: - version "8.0.6" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" - integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== dependencies: - find-cache-dir "^2.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" pify "^4.0.1" + schema-utils "^2.6.5" babel-plugin-dynamic-import-node@^2.3.0: version "2.3.0" @@ -1918,13 +1943,13 @@ browserslist@^1.1.3: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" -browserslist@^4.0.0, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.8.5, browserslist@^4.9.1: - version "4.10.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" - integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== +browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.9.1: + version "4.11.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.0.tgz#aef4357b10a8abda00f97aac7cd587b2082ba1ad" + integrity sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A== dependencies: caniuse-lite "^1.0.30001035" - electron-to-chromium "^1.3.378" + electron-to-chromium "^1.3.380" node-releases "^1.1.52" pkg-up "^3.1.0" @@ -2014,9 +2039,9 @@ bytes@3.1.0: integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== cacache@^12.0.2, cacache@^12.0.3: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: bluebird "^3.5.5" chownr "^1.1.1" @@ -2161,14 +2186,14 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000639: - version "1.0.30001035" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001035.tgz#3a182cab9d556a4a02d945f1f739e81c18e73bfa" - integrity sha512-kLUON4XN3tq5Nwl7ZICDw+7/vMynSpRMVYDRkzLL31lgnpa6M2YXYdjst3h+xbzjMgdcveRTnRGE1h/1IcKK6A== + version "1.0.30001036" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001036.tgz#8761fb6cd423ef2d3f8d96a21d898932252dc477" + integrity sha512-plRkihXQyiDaFUXC7x/jAIXXTKiiaWvfAagsruh/vmstnRQ+a2a95HyENxiTr5WrkPSvmFUIvsRUalVFyeh2/w== -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001035: - version "1.0.30001035" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e" - integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001036: + version "1.0.30001036" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001036.tgz#930ea5272010d8bf190d859159d757c0b398caf0" + integrity sha512-jU8CIFIj2oR7r4W+5AKcsvWNVIb6Q6OZE3UsrXrZBHFtreT4YgTeOJtTucp+zSedEpTi3L5wASSP0LYIE3if6w== caseless@~0.12.0: version "0.12.0" @@ -3537,10 +3562,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.378: - version "1.3.379" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.379.tgz#81dc5e82a3e72bbb830d93e15bc35eda2bbc910e" - integrity sha512-NK9DBBYEBb5f9D7zXI0hiE941gq3wkBeQmXs1ingigA/jnTg5mhwY2Z5egwA+ZI8OLGKCx0h1Cl8/xeuIBuLlg== +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.380: + version "1.3.382" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.382.tgz#cad02da655c33f7a3d6ca7525bd35c17e90f3a8f" + integrity sha512-gJfxOcgnBlXhfnUUObsq3n3ReU8CT6S8je97HndYRkKsNZMJJ38zO/pI5aqO7L3Myfq+E3pqPyKK/ynyLEQfBA== elliptic@^6.0.0: version "6.5.2" @@ -3703,9 +3728,9 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" @@ -3870,11 +3895,11 @@ esprima@^4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48" - integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe" + integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q== dependencies: - estraverse "^4.0.0" + estraverse "^5.0.0" esrecurse@^4.1.0: version "4.2.1" @@ -3883,11 +3908,16 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.0, estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" + integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -4346,7 +4376,7 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: +find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== @@ -4714,9 +4744,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@^5.0.0, glob-parent@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" @@ -6355,7 +6385,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0: +json5@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== @@ -6504,8 +6534,8 @@ levn@^0.3.0, levn@~0.3.0: type-check "~0.3.2" "libass-wasm@https://github.com/jellyfin/JavascriptSubtitlesOctopus": - version "3.0.2" - resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#99626d3ee5eb6bd695d7c908c5e6f910213b0e71" + version "4.0.0" + resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#1d12af0b04fb2337570b57d706dd97db2f904b9d" liftoff@^3.1.0: version "3.1.0" @@ -6581,7 +6611,7 @@ loader-utils@^0.2.16: json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== @@ -6907,11 +6937,6 @@ make-iterator@^1.0.0: dependencies: kind-of "^6.0.2" -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - map-age-cleaner@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -7253,10 +7278,10 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" - integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: + version "0.5.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" + integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== dependencies: minimist "^1.2.5" @@ -7442,27 +7467,7 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -<<<<<<< HEAD -node-releases@^1.1.50: -======= -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - node-releases@^1.1.52: ->>>>>>> Update yarn.lock version "1.1.52" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== @@ -8222,9 +8227,9 @@ performance-now@^2.1.0: integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" - integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" @@ -9898,7 +9903,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.4: +schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.4, schema-utils@^2.6.5: version "2.6.5" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== @@ -12001,14 +12006,14 @@ webpack-stream@^5.2.1: webpack "^4.26.1" webpack@^4.26.1, webpack@^4.41.5: - version "4.42.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" - integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== + version "4.42.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.1.tgz#ae707baf091f5ca3ef9c38b884287cfe8f1983ef" + integrity sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" acorn "^6.2.1" ajv "^6.10.2" ajv-keywords "^3.4.1" @@ -12020,7 +12025,7 @@ webpack@^4.26.1, webpack@^4.41.5: loader-utils "^1.2.3" memory-fs "^0.4.1" micromatch "^3.1.10" - mkdirp "^0.5.1" + mkdirp "^0.5.3" neo-async "^2.6.1" node-libs-browser "^2.2.1" schema-utils "^1.0.0" @@ -12197,9 +12202,9 @@ yallist@^3.0.2: integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yaml@^1.7.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.8.2.tgz#a29c03f578faafd57dcb27055f9a5d569cb0c3d9" - integrity sha512-omakb0d7FjMo3R1D2EbTKVIk6dAVLRxFXdLZMEUToeAvuqgG/YuHMuQOZ5fgk+vQ8cx+cnGKwyg+8g8PNT0xQg== + version "1.8.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.8.3.tgz#2f420fca58b68ce3a332d0ca64be1d191dd3f87a" + integrity sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw== dependencies: "@babel/runtime" "^7.8.7" From 82aa8a3f28383ce7286d9fa66b7d2293e1835cc4 Mon Sep 17 00:00:00 2001 From: lldsolitude Date: Tue, 24 Mar 2020 08:42:04 +0000 Subject: [PATCH 048/120] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index b0c9a59694..ec6591fe25 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1474,5 +1474,8 @@ "AskAdminToCreateLibrary": "请联系管理员以创建一个新的资料库。", "PlaybackErrorNoCompatibleStream": "客户端配置文件存在问题,服务器未发送兼容的媒体格式。", "AllowFfmpegThrottlingHelp": "当转码或再封装的进度大幅超过当前播放位置时,暂停该进程,以使其消耗更少的资源。在观看时不经常调整播放进度的情况下,这将非常有用。如果遇到播放问题,请关闭此功能。", - "AllowFfmpegThrottling": "限制转码速度" + "AllowFfmpegThrottling": "限制转码速度", + "PreferEmbeddedEpisodeInfosOverFileNames": "优先使用内置的剧集信息而不是文件名", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "这将在内置元数据含剧集信息时使用内置信息。", + "ClientSettings": "客户端设置" } From dba5fd9ac92798ab389d7fd7a6ad6400f3e24616 Mon Sep 17 00:00:00 2001 From: Casper Talvio Date: Tue, 24 Mar 2020 12:56:20 +0000 Subject: [PATCH 049/120] Translated using Weblate (Finnish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/ --- src/strings/fi.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/strings/fi.json b/src/strings/fi.json index 11d497fd19..b3515ae4a8 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -257,7 +257,7 @@ "DownloadsValue": "{0} latausta", "DrmChannelsNotImported": "Kanavia joissa on tekijänoikeusesto-ohjelmia, ei ladata.", "DropShadow": "Tiputa varjo", - "EasyPasswordHelp": "Sinun helppoa PIN-koodia käytetään offline-käytössä tuetuissa Jellyfin-sovelluksissa, ja voidaan myös nopeuttaa verkkoon kirjautumista.", + "EasyPasswordHelp": "Sinun helppoa PIN-koodia käytetään offline-käytössä tuetuissa Jellyfin-sovelluksissa, ja voi myös nopeuttaa lan yhteyden kautta kirjautumista.", "Edit": "Muokkaa", "EditImages": "Muokkaa kuvia", "EditMetadata": "Muokkaa metadataa", @@ -310,5 +310,10 @@ "Depressed": "Painettu", "CopyStreamURLError": "Verkko-osoitteen kopioinnissa tapahtui virhe.", "ButtonSplit": "jaa", - "AskAdminToCreateLibrary": "Pyydä järjestelmän ylläpitäjää luomaan kirjasto." + "AskAdminToCreateLibrary": "Pyydä järjestelmän ylläpitäjää luomaan kirjasto.", + "EnableStreamLooping": "Auto-toista suoralähetykset", + "EnableNextVideoInfoOverlayHelp": "Videon lopussa, näytä soittolistassa seuraavaksi toistettavan videon tiedot.", + "ClientSettings": "Pääte-asetukset", + "AllowFfmpegThrottlingHelp": "Kun uudelleenkoodaus tai remux ehtii tarpeeksi toiston edelle, keskeytä laskenta jotta laskentaresursseja kuluu vähemmän. Tämä on hyödyllistä jos katselet hyppimättä eri kohtiin. Älä käytä jos toiston kanssa ilmenee ongelmia.", + "AllowFfmpegThrottling": "Rajoita uudelleenkoodaus" } From 02ce5f6d6c581fe95526c29b848e1785d2c6e27f Mon Sep 17 00:00:00 2001 From: Nyanmisaka <799610810@qq.com> Date: Tue, 24 Mar 2020 15:00:17 +0000 Subject: [PATCH 050/120] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index ec6591fe25..f752606b33 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1348,7 +1348,7 @@ "HeaderFavoriteArtists": "最爱的艺术家", "HeaderKeepRecording": "继续录制", "HeaderKeepSeries": "保持系列", - "HeaderMusicQuality": "音质", + "HeaderMusicQuality": "音频质量", "HeaderNextEpisodePlayingInValue": "下一集在 {0} 后播放", "HeaderNextVideoPlayingInValue": "下一部影片在 {0} 后播放", "HeaderPlayOn": "播放在", From 9115a4e1fa626407dc0fbb5a10574e7f6cd0af8c Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 22 Mar 2020 19:33:10 +0100 Subject: [PATCH 051/120] Clean up the settings menu on mobile --- src/assets/css/librarybrowser.css | 6 +++++- src/controllers/user/menu.js | 8 +++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index 0bf65d83a7..13265e40d1 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -21,7 +21,7 @@ } .libraryPage { - padding-top: 7em !important; + padding-top: 7em; } .itemDetailPage { @@ -1119,3 +1119,7 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards { .itemsViewSettingsContainer > .button-flat { margin: 0; } + +.layout-mobile #myPreferencesMenuPage { + padding-top: 3.75em; +} diff --git a/src/controllers/user/menu.js b/src/controllers/user/menu.js index b1e2b7b519..e7d816fb6f 100644 --- a/src/controllers/user/menu.js +++ b/src/controllers/user/menu.js @@ -1,4 +1,4 @@ -define(["apphost", "connectionManager", "listViewStyle", "emby-button"], function(appHost, connectionManager) { +define(["apphost", "connectionManager", "layoutManager", "listViewStyle", "emby-button"], function(appHost, connectionManager, layoutManager) { "use strict"; return function(view, params) { @@ -43,6 +43,12 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio page.querySelector(".adminSection").classList.add("hide"); } + if (layoutManager.mobile) { + page.querySelector(".headerUsername").classList.add("hide"); + page.querySelector(".adminSection").classList.add("hide"); + page.querySelector(".userSection").classList.add("hide"); + } + ApiClient.getUser(userId).then(function(user) { page.querySelector(".headerUsername").innerHTML = user.Name; if (!user.Policy.IsAdministrator) { From 3b9ca3c1a398e5a0dffc8c6763e4c27b817cc13d Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 22 Mar 2020 21:09:10 +0100 Subject: [PATCH 052/120] Add Settings entry to the navigation drawer --- src/scripts/librarymenu.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index 5e6562ee42..11c89b01da 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -243,15 +243,20 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " html += 'wifi' + globalize.translate("ButtonSelectServer") + ""; } + html += '' + globalize.translate("ButtonSettings") + ""; html += '' + globalize.translate("ButtonSignOut") + ""; html += "
"; } // add buttons to navigation drawer navDrawerScrollContainer.innerHTML = html; - // bind logout button click to method - var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout"); + var btnSettings = navDrawerScrollContainer.querySelector(".btnSettings"); + if (btnSettings) { + btnSettings.addEventListener("click", onSettingsClick); + } + + var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout"); if (btnLogout) { btnLogout.addEventListener("click", onLogoutClick); } @@ -598,6 +603,10 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } } + function onSettingsClick() { + Dashboard.navigate("mypreferencesmenu.html"); + } + function onLogoutClick() { Dashboard.logout(); } From cccbf24f099464dfc654a0f323f57b7cbec54274 Mon Sep 17 00:00:00 2001 From: Mathis Date: Tue, 24 Mar 2020 21:48:49 +0000 Subject: [PATCH 053/120] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/strings/de.json b/src/strings/de.json index 60fd625ea3..5a449d8e55 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1,5 +1,5 @@ { - "Absolute": "Gesamt", + "Absolute": "Absolut", "AccessRestrictedTryAgainLater": "Der Zugriff ist derzeit eingeschränkt. Bitte versuche es später erneut.", "Actor": "Darsteller(in)", "Add": "Hinzufügen", @@ -1493,5 +1493,6 @@ "NoCreatedLibraries": "Sieht so aus als hättest du bis jetzt keine Bibliothek erstellt. {0}Möchtest du jetzt eine Bibliothek erstellen?{1}", "AllowFfmpegThrottling": "Transkodierung drosseln", "PlaybackErrorNoCompatibleStream": "Es gab ein Problem bei der Erkennung des Wiedergabeprofils des Clients und der Server sendet kein kompatibles Format.", - "AllowFfmpegThrottlingHelp": "Wenn eine Transkodierung oder ein Remux weit genug über die aktuelle Abspielposition fortgeschritten ist, pausiere sie sodass weniger Ressourcen verbraucht werden. Dies ist am nützlichsten, wenn wenig geskippt wird. Bei Wiedergabeproblemen sollte diese Option deaktiviert werden." + "AllowFfmpegThrottlingHelp": "Wenn eine Transkodierung oder ein Remux weit genug über die aktuelle Abspielposition fortgeschritten ist, pausiere sie sodass weniger Ressourcen verbraucht werden. Dies ist am nützlichsten, wenn wenig geskippt wird. Bei Wiedergabeproblemen sollte diese Option deaktiviert werden.", + "ClientSettings": "Client Einstellungen" } From 2fec0e40823bdbf6c4d064b359baa7dcd0bd7795 Mon Sep 17 00:00:00 2001 From: Mathis Date: Tue, 24 Mar 2020 21:49:55 +0000 Subject: [PATCH 054/120] Translated using Weblate (German (Swiss)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/gsw/ --- src/strings/gsw.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/gsw.json b/src/strings/gsw.json index 7d0162e852..a154e4fc8e 100644 --- a/src/strings/gsw.json +++ b/src/strings/gsw.json @@ -164,5 +164,8 @@ "Songs": "Lieder", "Sync": "Synchronisation", "ValueSpecialEpisodeName": "Extra - {0}", - "VersionNumber": "Version {0}" + "VersionNumber": "Version {0}", + "Absolute": "Absolut", + "Actor": "Schauspiler", + "AccessRestrictedTryAgainLater": "Zuegriff isch momentan beschränkt. Probier bitte später nomau. " } From 580bf9fd23a136de3038ac509c35f3772764e8cf Mon Sep 17 00:00:00 2001 From: Ken Ying-Kai Liao Date: Wed, 25 Mar 2020 06:37:34 +0000 Subject: [PATCH 055/120] Translated using Weblate (Chinese (Traditional)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/ --- src/strings/zh-tw.json | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index 756a759068..626583fa0b 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -328,7 +328,7 @@ "Art": "圖像", "Artists": "演出者", "AsManyAsPossible": "越多越好", - "Ascending": "由少到多", + "Ascending": "遞增", "AspectRatio": "長寬比", "AttributeNew": "新增", "Audio": "音訊", @@ -552,7 +552,7 @@ "EncoderPresetHelp": "速度越慢則會得到更好的壓縮編碼效率。", "HDPrograms": "HD節目", "HandledByProxy": "由反向代理處理", - "HardwareAccelerationWarning": "啟動硬體加速可能在某些環境下導致系統不穩定。請確認你的作業系統和影片驅動程式是最新的。如果你在開啟此項後播放影片產生困難,那麼你需要將此選項設回”自動“。", + "HardwareAccelerationWarning": "啟動硬體加速可能在某些環境下導致系統不穩定。請確認你的作業系統和影片驅動程式是最新的。如果你在開啟此項後播放影片產生困難,那麼你需要將此選項設回”無“。", "HeaderAccessSchedule": "存取時程", "HeaderAccessScheduleHelp": "建立一個存取時程以限制可存取的時段。", "HeaderActiveDevices": "運行中裝置", @@ -1493,7 +1493,7 @@ "RecordingPathChangeMessage": "更改錄製資料夾不會將現有錄製從舊位置遷移到新的,您需要手動移動它們。", "RestartPleaseWaitMessage": "Jellyfin 伺服器將重新啟動,這將花費幾分鐘時間。", "LabelEmbedAlbumArtDidl": "於 Didl 中嵌入專輯封面", - "LabelEnableAutomaticPortMapHelp": "自動嘗試映射公共連接埠到 UPnP 本地連接埠。這可能無法用於某些路由器。", + "LabelEnableAutomaticPortMapHelp": "自動嘗試映射公共連接埠到 UPnP 本地連接埠。這可能無法用於某些路由器。需重新啓動伺服器。", "LabelEmbedAlbumArtDidlHelp": "有些裝置使用這個方式來取得專輯封面,啟用這個選項可能導致其他設備播放失敗。", "SettingsWarning": "更改這些值可能會導致不穩定或連線故障。如果您遇到任何問題,建議將它們重新更改為預設值。", "LabelEnableSingleImageInDidlLimitHelp": "若在 Didl 中嵌入多個圖片,某些裝置可能無法正常顯示。", @@ -1641,5 +1641,10 @@ "LabelPlayerDimensions": "播放器尺寸:", "LabelDroppedFrames": "丟棄的幀:", "LabelCorruptedFrames": "損壞的幀:", - "ButtonSplit": "拆分" + "ButtonSplit": "分割", + "AskAdminToCreateLibrary": "如要建立資料庫,請求管理員", + "NoCreatedLibraries": "看來您還未創任何媒體庫。{0}立刻創一個新的嗎?{1}", + "ClientSettings": "用戶設定", + "AllowFfmpegThrottlingHelp": "當轉檔或重組進度大量超前目前播放進度時,將暫停轉檔節省消耗的資源。在不常跳播的時候最有效。如果遇到播放問題,請關閉此功能。", + "AllowFfmpegThrottling": "限制轉檔" } From 3ed9be897e727d983d82c9b89976c90dcf99bd54 Mon Sep 17 00:00:00 2001 From: Ken Ying-Kai Liao Date: Wed, 25 Mar 2020 06:53:03 +0000 Subject: [PATCH 056/120] Translated using Weblate (Chinese (Traditional)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/ --- src/strings/zh-tw.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index 626583fa0b..d527b5a5bf 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -1637,7 +1637,7 @@ "LabelVideoResolution": "視頻解析度:", "LabelStreamType": "串流類型:", "EnableFastImageFadeInHelp": "為已加載的圖片啓用更快的淡入動畫", - "EnableFastImageFadeIn": "快速圖片淡入", + "EnableFastImageFadeIn": "圖片快速淡入效果", "LabelPlayerDimensions": "播放器尺寸:", "LabelDroppedFrames": "丟棄的幀:", "LabelCorruptedFrames": "損壞的幀:", From ca0914819a74d64c39d01dea8208b44a1ee270b6 Mon Sep 17 00:00:00 2001 From: The Iiseppi Date: Wed, 25 Mar 2020 08:32:09 +0000 Subject: [PATCH 057/120] Translated using Weblate (Finnish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/ --- src/strings/fi.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/fi.json b/src/strings/fi.json index b3515ae4a8..b61724e2fe 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -315,5 +315,10 @@ "EnableNextVideoInfoOverlayHelp": "Videon lopussa, näytä soittolistassa seuraavaksi toistettavan videon tiedot.", "ClientSettings": "Pääte-asetukset", "AllowFfmpegThrottlingHelp": "Kun uudelleenkoodaus tai remux ehtii tarpeeksi toiston edelle, keskeytä laskenta jotta laskentaresursseja kuluu vähemmän. Tämä on hyödyllistä jos katselet hyppimättä eri kohtiin. Älä käytä jos toiston kanssa ilmenee ongelmia.", - "AllowFfmpegThrottling": "Rajoita uudelleenkoodaus" + "AllowFfmpegThrottling": "Rajoita uudelleenkoodaus", + "ErrorDeletingItem": "Tiedostoa poistaessa Jellyfin Palvelimelta ilmeni virhe. Varmista, että Jellyfin Palvelimella on kirjoitusoikeudet mediakansioon ja kokeile uudestaan.", + "ErrorAddingXmlTvFile": "XMLTV-tiedostoa käyttäessä tapahtui virhe. Varmista, että tiedosto on olemassa ja kokeile uudestaan.", + "ErrorAddingTunerDevice": "Viritintä lisätessä ilmeni ongelma. Varmista, että se on kytketty oikein ja kokeile uudestaan.", + "EnableThemeVideosHelp": "Soita tunnusvideoita taustalla, selatessasi kirjastoa.", + "EnableThemeVideos": "Teeman videot" } From 308000bc97913d53ba6e7ef87d8d25f2c0200b46 Mon Sep 17 00:00:00 2001 From: Ric Li Date: Wed, 25 Mar 2020 08:28:53 +0000 Subject: [PATCH 058/120] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index f752606b33..a37f839039 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -705,7 +705,7 @@ "LabelPublicHttpPortHelp": "映射到本地 HTTP 端口的公开端口号。", "LabelPublicHttpsPort": "公开 HTTPS 端口号:", "LabelPublicHttpsPortHelp": "映射到本地 HTTPS 端口的公开端口号。", - "LabelReadHowYouCanContribute": "学习如何构建。", + "LabelReadHowYouCanContribute": "了解如何做出贡献。", "LabelReasonForTranscoding": "转码原因:", "LabelRecord": "录制:", "LabelRecordingPath": "默认录制路径:", From 1c54bdee51d52ba3f358e66e5ff82522d2765c7a Mon Sep 17 00:00:00 2001 From: Ken Ying-Kai Liao Date: Wed, 25 Mar 2020 06:53:18 +0000 Subject: [PATCH 059/120] Translated using Weblate (Chinese (Traditional)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/ --- src/strings/zh-tw.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index d527b5a5bf..ffc0228af2 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -1636,15 +1636,18 @@ "LaunchWebAppOnStartupHelp": "伺服器啓動時在默認游覽器中打開網頁端。使用重啓伺服器功能時此項不生效。", "LabelVideoResolution": "視頻解析度:", "LabelStreamType": "串流類型:", - "EnableFastImageFadeInHelp": "為已加載的圖片啓用更快的淡入動畫", + "EnableFastImageFadeInHelp": "對已載入的圖片啟用更快的淡入動畫", "EnableFastImageFadeIn": "圖片快速淡入效果", "LabelPlayerDimensions": "播放器尺寸:", "LabelDroppedFrames": "丟棄的幀:", "LabelCorruptedFrames": "損壞的幀:", "ButtonSplit": "分割", - "AskAdminToCreateLibrary": "如要建立資料庫,請求管理員", + "AskAdminToCreateLibrary": "如要建立資料庫,請求管理員。", "NoCreatedLibraries": "看來您還未創任何媒體庫。{0}立刻創一個新的嗎?{1}", "ClientSettings": "用戶設定", "AllowFfmpegThrottlingHelp": "當轉檔或重組進度大量超前目前播放進度時,將暫停轉檔節省消耗的資源。在不常跳播的時候最有效。如果遇到播放問題,請關閉此功能。", - "AllowFfmpegThrottling": "限制轉檔" + "AllowFfmpegThrottling": "限制轉檔", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "這將會使用內建劇集資料。", + "PlaybackErrorNoCompatibleStream": "用戶端偵測出了問題,伺服器也未傳送相容的媒體格式。", + "PreferEmbeddedEpisodeInfosOverFileNames": "優先使用內建劇集資訊而不是檔案名稱" } From d7c32dcde924d9a3afb3790103f401be3b25ad73 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 12 Mar 2020 12:34:50 +0300 Subject: [PATCH 060/120] Fix radiobutton focus marker --- src/elements/emby-radio/emby-radio.css | 105 ++++++++++++++----------- src/elements/emby-radio/emby-radio.js | 20 ++++- src/themes/purplehaze/theme.css | 9 +++ 3 files changed, 87 insertions(+), 47 deletions(-) diff --git a/src/elements/emby-radio/emby-radio.css b/src/elements/emby-radio/emby-radio.css index 6db3c39e4d..34af657b9c 100644 --- a/src/elements/emby-radio/emby-radio.css +++ b/src/elements/emby-radio/emby-radio.css @@ -4,7 +4,6 @@ display: inline-block; box-sizing: border-box; margin: 0; - padding-left: 24px; } .radio-label-block { @@ -31,67 +30,81 @@ border: none; } -.mdl-radio__outer-circle { - position: absolute; - top: 4px; - left: 0; - display: inline-block; - box-sizing: border-box; - width: 16px; - height: 16px; - margin: 0; - cursor: pointer; - border: 2px solid currentcolor; +.mdl-radio__circles { + position: relative; + margin-right: 0.54em; + width: 1.08em; + height: 1.08em; border-radius: 50%; - z-index: 2; + cursor: pointer; } -.mdl-radio__button:checked + .mdl-radio__label + .mdl-radio__outer-circle { - border: 2px solid #00a4dc; +.mdl-radio__circles svg { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + z-index: 1; } -.mdl-radio__button:disabled + .mdl-radio__label + .mdl-radio__outer-circle { - border: 2px solid rgba(0, 0, 0, 0.26); +.mdl-radio__button:disabled + .mdl-radio__circles { cursor: auto; } +.mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__outer-circle { + color: #00a4dc; +} + +.mdl-radio__button:disabled + .mdl-radio__circles .mdl-radio__outer-circle { + color: rgba(0, 0, 0, 0.26); +} + .mdl-radio__inner-circle { - position: absolute; - z-index: 1; - margin: 0; - top: 8px; - left: 4px; - box-sizing: border-box; - width: 8px; - height: 8px; - cursor: pointer; - transition-duration: 0.28s; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 0.2s; transition-property: -webkit-transform; transition-property: transform; transition-property: transform, -webkit-transform; - -webkit-transform: scale3d(0, 0, 0); - transform: scale3d(0, 0, 0); + -webkit-transform: scale(0); + transform: scale(0); + transform-origin: 50% 50%; +} + +.mdl-radio__button:checked + .mdl-radio__circles .mdl-radio__inner-circle { + -webkit-transform: scale(1); + transform: scale(1); +} + +.mdl-radio__button:disabled + .mdl-radio__circles .mdl-radio__inner-circle { + color: rgba(0, 0, 0, 0.26); +} + +.mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__inner-circle { + color: #00a4dc; +} + +.mdl-radio__focus-circle { + position: absolute; + top: 0; + left: 0; + box-sizing: border-box; + width: 100%; + height: 100%; + margin: 0; border-radius: 50%; background: #00a4dc; + opacity: 0.26; + transition-duration: 0.2s; + transition-property: -webkit-transform; + transition-property: transform; + transition-property: transform, -webkit-transform; + -webkit-transform: scale(0); + transform: scale(0); } -.mdl-radio__button:checked + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); -} - -.mdl-radio__button:disabled + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle { - background: rgba(0, 0, 0, 0.26); - cursor: auto; -} - -.mdl-radio__button:focus + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle { - box-shadow: 0 0 0 10px rgba(255, 255, 255, 0.76); -} - -.mdl-radio__button:checked:focus + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle { - box-shadow: 0 0 0 10px rgba(0, 164, 220, 0.26); +.mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__focus-circle { + -webkit-transform: scale(1.75); + transform: scale(1.75); } .mdl-radio__label { diff --git a/src/elements/emby-radio/emby-radio.js b/src/elements/emby-radio/emby-radio.js index 000c656822..86c08678e1 100644 --- a/src/elements/emby-radio/emby-radio.js +++ b/src/elements/emby-radio/emby-radio.js @@ -43,7 +43,25 @@ define(['css!./emby-radio', 'registerElement'], function () { labelTextElement.classList.add('radioButtonLabel'); labelTextElement.classList.add('mdl-radio__label'); - labelElement.insertAdjacentHTML('beforeend', ''); + var html = ''; + + html += '
'; + + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + + html += '
'; + + html += '
'; + + this.insertAdjacentHTML('afterend', html); this.addEventListener('keydown', onKeyDown); }; diff --git a/src/themes/purplehaze/theme.css b/src/themes/purplehaze/theme.css index 9c13841422..a31b5a924f 100644 --- a/src/themes/purplehaze/theme.css +++ b/src/themes/purplehaze/theme.css @@ -438,6 +438,15 @@ a[data-role=button] { color: #f8f8fe; } +.mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__outer-circle, +.mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__inner-circle { + color: #ff77f1; +} + +.mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__focus-circle { + background: #00a4dc; +} + .emby-tab-button { color: #999; } From a41bd6de56a09baaa27fec396ed5b3a546af11af Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 12 Mar 2020 12:35:13 +0300 Subject: [PATCH 061/120] Fix checkbox border on TV --- src/elements/emby-checkbox/emby-checkbox.css | 2 +- src/themes/purplehaze/theme.css | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/elements/emby-checkbox/emby-checkbox.css b/src/elements/emby-checkbox/emby-checkbox.css index 42a9207560..b33a216140 100644 --- a/src/elements/emby-checkbox/emby-checkbox.css +++ b/src/elements/emby-checkbox/emby-checkbox.css @@ -55,7 +55,7 @@ height: 1.83em; margin: 0; overflow: hidden; - border: 2px solid currentcolor; + border: 0.14em solid currentcolor; border-radius: 0.14em; z-index: 2; display: flex; diff --git a/src/themes/purplehaze/theme.css b/src/themes/purplehaze/theme.css index a31b5a924f..d65071afa4 100644 --- a/src/themes/purplehaze/theme.css +++ b/src/themes/purplehaze/theme.css @@ -382,7 +382,7 @@ a[data-role=button] { .emby-checkbox:checked + span + .checkboxOutline { background-color: #030322; - border: 2px solid rgb(72, 195, 200); + border: 0.14em solid rgb(72, 195, 200); } .emby-checkbox:checked + span + .checkboxOutline > .checkboxIcon-checked { @@ -394,7 +394,7 @@ a[data-role=button] { } .emby-checkbox:focus:not(:checked) + span + .checkboxOutline { - border: 2px solid #ff77f1; + border: 0.14em solid #ff77f1; } .itemProgressBarForeground { From 17d1dc355940ae0069782cba5d9cc539119ed38c Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 12 Mar 2020 18:49:38 +0300 Subject: [PATCH 062/120] Fix tiny cropping in Firefox --- src/elements/emby-radio/emby-radio.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/elements/emby-radio/emby-radio.css b/src/elements/emby-radio/emby-radio.css index 34af657b9c..0b17a82ed4 100644 --- a/src/elements/emby-radio/emby-radio.css +++ b/src/elements/emby-radio/emby-radio.css @@ -46,6 +46,7 @@ top: 0; left: 0; z-index: 1; + overflow: visible; } .mdl-radio__button:disabled + .mdl-radio__circles { From a2ccaa29c3b6b4115d573fe086551ca9587cf7fc Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 12 Mar 2020 20:45:27 +0300 Subject: [PATCH 063/120] Turn off radiobutton focus on Mobile --- src/elements/emby-radio/emby-radio.css | 6 +++--- src/elements/emby-radio/emby-radio.js | 10 ++++++++-- src/themes/purplehaze/theme.css | 6 +++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/elements/emby-radio/emby-radio.css b/src/elements/emby-radio/emby-radio.css index 0b17a82ed4..f8671ce265 100644 --- a/src/elements/emby-radio/emby-radio.css +++ b/src/elements/emby-radio/emby-radio.css @@ -53,7 +53,7 @@ cursor: auto; } -.mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__outer-circle { +.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__outer-circle { color: #00a4dc; } @@ -80,7 +80,7 @@ color: rgba(0, 0, 0, 0.26); } -.mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__inner-circle { +.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__inner-circle { color: #00a4dc; } @@ -103,7 +103,7 @@ transform: scale(0); } -.mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__focus-circle { +.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__focus-circle { -webkit-transform: scale(1.75); transform: scale(1.75); } diff --git a/src/elements/emby-radio/emby-radio.js b/src/elements/emby-radio/emby-radio.js index 86c08678e1..46a3e3826c 100644 --- a/src/elements/emby-radio/emby-radio.js +++ b/src/elements/emby-radio/emby-radio.js @@ -1,4 +1,4 @@ -define(['css!./emby-radio', 'registerElement'], function () { +define(['layoutManager', 'css!./emby-radio', 'registerElement'], function (layoutManager) { 'use strict'; var EmbyRadioPrototype = Object.create(HTMLInputElement.prototype); @@ -23,6 +23,7 @@ define(['css!./emby-radio', 'registerElement'], function () { } EmbyRadioPrototype.attachedCallback = function () { + var showFocus = !layoutManager.mobile; if (this.getAttribute('data-radio') === 'true') { return; @@ -37,6 +38,9 @@ define(['css!./emby-radio', 'registerElement'], function () { labelElement.classList.add('mdl-radio'); labelElement.classList.add('mdl-js-radio'); labelElement.classList.add('mdl-js-ripple-effect'); + if (showFocus) { + labelElement.classList.add('show-focus'); + } var labelTextElement = labelElement.querySelector('span'); @@ -57,7 +61,9 @@ define(['css!./emby-radio', 'registerElement'], function () { html += ''; html += ''; - html += '
'; + if (showFocus) { + html += '
'; + } html += '
'; diff --git a/src/themes/purplehaze/theme.css b/src/themes/purplehaze/theme.css index d65071afa4..45f43abc2f 100644 --- a/src/themes/purplehaze/theme.css +++ b/src/themes/purplehaze/theme.css @@ -438,12 +438,12 @@ a[data-role=button] { color: #f8f8fe; } -.mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__outer-circle, -.mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__inner-circle { +.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__outer-circle, +.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__inner-circle { color: #ff77f1; } -.mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__focus-circle { +.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__focus-circle { background: #00a4dc; } From 9bf5cda44afc5ba2f31b62bd620074a341f556b3 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 12 Mar 2020 20:53:49 +0300 Subject: [PATCH 064/120] Fix lint error --- src/elements/emby-radio/emby-radio.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/elements/emby-radio/emby-radio.css b/src/elements/emby-radio/emby-radio.css index f8671ce265..2d7f584171 100644 --- a/src/elements/emby-radio/emby-radio.css +++ b/src/elements/emby-radio/emby-radio.css @@ -53,14 +53,14 @@ cursor: auto; } -.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__outer-circle { - color: #00a4dc; -} - .mdl-radio__button:disabled + .mdl-radio__circles .mdl-radio__outer-circle { color: rgba(0, 0, 0, 0.26); } +.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__outer-circle { + color: #00a4dc; +} + .mdl-radio__inner-circle { transition-duration: 0.2s; transition-property: -webkit-transform; From 8f1434fa40bb4fa6a0abc392b0911700081e9d8e Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Wed, 25 Mar 2020 21:40:22 +0100 Subject: [PATCH 065/120] Fix Browsersync JavaScript reload error --- gulpfile.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index ca6cf36dd2..33a34889fb 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -18,14 +18,14 @@ const stream = require('webpack-stream'); const inject = require('gulp-inject'); const postcss = require('gulp-postcss'); const sass = require('gulp-sass'); - -sass.compiler = require('node-sass') +sass.compiler = require('node-sass'); +var config; if (mode.production()) { - var config = require('./webpack.prod.js'); + config = require('./webpack.prod.js'); } else { - var config = require('./webpack.dev.js'); + config = require('./webpack.dev.js'); } function serve() { @@ -36,20 +36,20 @@ function serve() { port: 8080 }); - watch(['src/**/*.js', '!src/bundle.js'], javascript); + watch(['src/**/*.js', '!src/bundle.js'], series(javascript, standalone)); watch('src/bundle.js', webpack); watch('src/**/*.css', css); watch(['src/**/*.html', '!src/index.html'], html); watch(['src/**/*.png', 'src/**/*.jpg', 'src/**/*.gif', 'src/**/*.svg'], images); watch(['src/**/*.json', 'src/**/*.ico'], copy); watch('src/index.html', injectBundle); - watch(['src/standalone.js', 'src/scripts/apploader.js'], standalone); } function standalone() { return src(['src/standalone.js', 'src/scripts/apploader.js'], { base: './src/' }) .pipe(concat('scripts/apploader.js')) - .pipe(dest('dist/')); + .pipe(dest('dist/')) + .pipe(browserSync.stream()); } function clean() { @@ -70,7 +70,6 @@ function javascript() { })) .pipe(mode.development(sourcemaps.write('.'))) .pipe(dest('dist/')) - .pipe(browserSync.stream()); } function webpack() { @@ -118,6 +117,6 @@ function injectBundle() { .pipe(browserSync.stream()); } -exports.default = series(clean, parallel(javascript, webpack, css, html, images, copy), injectBundle) -exports.standalone = series(exports.default, standalone) -exports.serve = series(exports.standalone, serve) +exports.default = series(clean, parallel(javascript, webpack, css, html, images, copy), injectBundle); +exports.standalone = series(exports.default, standalone); +exports.serve = series(exports.standalone, serve); From 2a7f7ba7fee1c9d12af9b43084c65b1df5ed236d Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Wed, 25 Mar 2020 22:26:28 +0100 Subject: [PATCH 066/120] Use let instead of var in gulpfile --- gulpfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index 33a34889fb..f42376e24a 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -21,7 +21,7 @@ const sass = require('gulp-sass'); sass.compiler = require('node-sass'); -var config; +let config; if (mode.production()) { config = require('./webpack.prod.js'); } else { From cd1732677db7ab75b9228e030c017f73581ef78c Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 26 Mar 2020 11:15:44 +0300 Subject: [PATCH 067/120] Add browser lazy-sync --- gulpfile.js | 143 +++++++++++++++++++++++++++++++++++++++------------ package.json | 2 + yarn.lock | 72 ++++++++++++++++++++++++-- 3 files changed, 182 insertions(+), 35 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index f42376e24a..0eb5593541 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -18,6 +18,8 @@ const stream = require('webpack-stream'); const inject = require('gulp-inject'); const postcss = require('gulp-postcss'); const sass = require('gulp-sass'); +const gulpif = require('gulp-if'); +const lazypipe = require('lazypipe'); sass.compiler = require('node-sass'); @@ -28,6 +30,30 @@ if (mode.production()) { config = require('./webpack.dev.js'); } +const options = { + javascript: { + query: ['src/**/*.js', '!src/bundle.js', '!src/standalone.js', '!src/scripts/apploader.js'] + }, + apploader: { + query: ['src/standalone.js', 'src/scripts/apploader.js'] + }, + css: { + query: ['src/**/*.css', 'src/**/*.scss'] + }, + html: { + query: ['src/**/*.html', '!src/index.html'] + }, + images: { + query: ['src/**/*.png', 'src/**/*.jpg', 'src/**/*.gif', 'src/**/*.svg'] + }, + copy: { + query: ['src/**/*.json', 'src/**/*.ico'] + }, + injectBundle: { + query: 'src/index.html' + } +}; + function serve() { browserSync.init({ server: { @@ -36,40 +62,89 @@ function serve() { port: 8080 }); - watch(['src/**/*.js', '!src/bundle.js'], series(javascript, standalone)); - watch('src/bundle.js', webpack); - watch('src/**/*.css', css); - watch(['src/**/*.html', '!src/index.html'], html); - watch(['src/**/*.png', 'src/**/*.jpg', 'src/**/*.gif', 'src/**/*.svg'], images); - watch(['src/**/*.json', 'src/**/*.ico'], copy); - watch('src/index.html', injectBundle); -} + let events = ['add', 'change']; -function standalone() { - return src(['src/standalone.js', 'src/scripts/apploader.js'], { base: './src/' }) - .pipe(concat('scripts/apploader.js')) - .pipe(dest('dist/')) - .pipe(browserSync.stream()); + watch(options.javascript.query).on('all', function (event, path) { + if (events.includes(event)) { + javascript(path); + } + }); + + watch(options.apploader.query, apploader(true)); + + watch('src/bundle.js', webpack); + + watch(options.css.query).on('all', function (event, path) { + if (events.includes(event)) { + css(path); + } + }); + + watch(options.html.query).on('all', function (event, path) { + if (events.includes(event)) { + html(path); + } + }); + + watch(options.images.query).on('all', function (event, path) { + if (events.includes(event)) { + images(path); + } + }); + + watch(options.copy.query).on('all', function (event, path) { + if (events.includes(event)) { + copy(path); + } + }); + + watch(options.injectBundle.query, injectBundle); } function clean() { return del(['dist/']); } -function javascript() { - return src(['src/**/*.js', '!src/bundle.js'], { base: './src/' }) - .pipe(mode.development(sourcemaps.init({ loadMaps: true }))) - .pipe(babel({ +let pipelineJavascript = lazypipe() + .pipe(function () { + return mode.development(sourcemaps.init({ loadMaps: true })); + }) + .pipe(function () { + return babel({ presets: [ ['@babel/preset-env'] ] - })) - .pipe(terser({ + }); + }) + .pipe(function () { + return terser({ keep_fnames: true, mangle: false - })) - .pipe(mode.development(sourcemaps.write('.'))) + }); + }) + .pipe(function () { + return mode.development(sourcemaps.write('.')); + }); + +function javascript(query) { + return src(typeof query !== 'function' ? query : options.javascript.query, { base: './src/' }) + .pipe(pipelineJavascript()) .pipe(dest('dist/')) + .pipe(browserSync.stream()); +} + +function apploader(standalone) { + function task() { + return src(options.apploader.query, { base: './src/' }) + .pipe(gulpif(standalone, concat('scripts/apploader.js'))) + .pipe(pipelineJavascript()) + .pipe(dest('dist/')) + .pipe(browserSync.stream()); + }; + + task.displayName = 'apploader'; + + return task; } function webpack() { @@ -78,8 +153,8 @@ function webpack() { .pipe(browserSync.stream()); } -function css() { - return src(['src/**/*.css', 'src/**/*.scss'], { base: './src/' }) +function css(query) { + return src(typeof query !== 'function' ? query : options.css.query, { base: './src/' }) .pipe(mode.development(sourcemaps.init({ loadMaps: true }))) .pipe(sass().on('error', sass.logError)) .pipe(postcss()) @@ -88,28 +163,28 @@ function css() { .pipe(browserSync.stream()); } -function html() { - return src(['src/**/*.html', '!src/index.html'], { base: './src/' }) +function html(query) { + return src(typeof query !== 'function' ? query : options.html.query, { base: './src/' }) .pipe(mode.production(htmlmin({ collapseWhitespace: true }))) .pipe(dest('dist/')) .pipe(browserSync.stream()); } -function images() { - return src(['src/**/*.png', 'src/**/*.jpg', 'src/**/*.gif', 'src/**/*.svg'], { base: './src/' }) +function images(query) { + return src(typeof query !== 'function' ? query : options.images.query, { base: './src/' }) .pipe(mode.production(imagemin())) .pipe(dest('dist/')) .pipe(browserSync.stream()); } -function copy() { - return src(['src/**/*.json', 'src/**/*.ico'], { base: './src/' }) +function copy(query) { + return src(typeof query !== 'function' ? query : options.copy.query, { base: './src/' }) .pipe(dest('dist/')) .pipe(browserSync.stream()); } function injectBundle() { - return src('src/index.html', { base: './src/' }) + return src(options.injectBundle.query, { base: './src/' }) .pipe(inject( src(['src/scripts/apploader.js'], { read: false }, { base: './src/' }), { relative: true } )) @@ -117,6 +192,10 @@ function injectBundle() { .pipe(browserSync.stream()); } -exports.default = series(clean, parallel(javascript, webpack, css, html, images, copy), injectBundle); -exports.standalone = series(exports.default, standalone); +function build(standalone) { + return series(clean, parallel(javascript, apploader(standalone), webpack, css, html, images, copy), injectBundle); +} + +exports.default = build(false); +exports.standalone = build(true); exports.serve = series(exports.standalone, serve); diff --git a/package.json b/package.json index 2de78b821c..58d288b371 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "gulp-cli": "^2.2.0", "gulp-concat": "^2.6.1", "gulp-htmlmin": "^5.0.1", + "gulp-if": "^3.0.0", "gulp-imagemin": "^7.1.0", "gulp-inject": "^5.0.5", "gulp-mode": "^1.0.2", @@ -32,6 +33,7 @@ "gulp-sourcemaps": "^2.6.5", "gulp-terser": "^1.2.0", "html-webpack-plugin": "^3.2.0", + "lazypipe": "^1.0.2", "node-sass": "^4.13.1", "postcss-loader": "^3.0.0", "postcss-preset-env": "^6.7.0", diff --git a/yarn.lock b/yarn.lock index 8b7697cef4..5641ad41a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3517,6 +3517,11 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" @@ -3527,6 +3532,16 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +duplexify@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.1.tgz#7027dc374f157b122a8ae08c2d3ea4d2d953aa61" + integrity sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.0" + each-props@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" @@ -3610,7 +3625,7 @@ encodeurl@~1.0.1, encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -4524,6 +4539,11 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +fork-stream@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70" + integrity sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA= + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -5064,6 +5084,15 @@ gulp-htmlmin@^5.0.1: plugin-error "^1.0.1" through2 "^2.0.3" +gulp-if@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-3.0.0.tgz#6c3e7edc8bafadc34f2ebecb314bf43324ba1e40" + integrity sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw== + dependencies: + gulp-match "^1.1.0" + ternary-stream "^3.0.0" + through2 "^3.0.1" + gulp-imagemin@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/gulp-imagemin/-/gulp-imagemin-7.1.0.tgz#d1810a908fb64b4fbf15a750d303d988443e68cf" @@ -5096,6 +5125,13 @@ gulp-inject@^5.0.5: stream-to-array "^2.3.0" through2 "^3.0.1" +gulp-match@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.1.0.tgz#552b7080fc006ee752c90563f9fec9d61aafdf4f" + integrity sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ== + dependencies: + minimatch "^3.0.3" + gulp-mode@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/gulp-mode/-/gulp-mode-1.0.2.tgz#33c76033491fb71f47f1ebf8c67561ad9da7dfc9" @@ -6480,6 +6516,13 @@ last-run@^1.1.0: default-resolution "^2.0.0" es6-weak-map "^2.0.1" +lazypipe@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lazypipe/-/lazypipe-1.0.2.tgz#b66f64ed7fd8b04869f1f1bcb795dbbaa80e418c" + integrity sha512-CrU+NYdFHW8ElaeXCWz5IbmetiYVYq1fOCmpdAeZ8L+khbv1e7EnshyjlKqkO+pJbVPrsJQnHbVxEiLujG6qhQ== + dependencies: + stream-combiner "*" + lazystream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" @@ -7119,6 +7162,11 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.2.3, merge2@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" @@ -7216,7 +7264,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -10525,6 +10573,14 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-combiner@*: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" + integrity sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg= + dependencies: + duplexer "~0.1.1" + through "~2.3.4" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -11062,6 +11118,16 @@ tempfile@^2.0.0: temp-dir "^1.0.0" uuid "^3.0.1" +ternary-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-3.0.0.tgz#7951930ea9e823924d956f03d516151a2d516253" + integrity sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ== + dependencies: + duplexify "^4.1.1" + fork-stream "^0.0.4" + merge-stream "^2.0.0" + through2 "^3.0.1" + terser-webpack-plugin@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" @@ -11129,7 +11195,7 @@ through2@^3.0.1: dependencies: readable-stream "2 || 3" -through@^2.3.6, through@^2.3.8: +through@^2.3.6, through@^2.3.8, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= From 9f13e2a36c8e0fe18ec97e042615bd5f685736ca Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 26 Mar 2020 17:22:57 +0300 Subject: [PATCH 068/120] Enable subtitle settings on Tizen --- src/components/apphost.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/apphost.js b/src/components/apphost.js index f3e89ed29e..5470803846 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -280,11 +280,11 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet //features.push("multiserver"); features.push("screensaver"); - if (!browser.orsay && !browser.tizen && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || supportsCue())) { + if (!browser.orsay && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || supportsCue())) { features.push("subtitleappearancesettings"); } - if (!browser.orsay && !browser.tizen) { + if (!browser.orsay) { features.push("subtitleburnsettings"); } From fe85c5f96c44a01e03bae7de42ebed251cbf072a Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 26 Mar 2020 20:31:46 +0300 Subject: [PATCH 069/120] Enable subtitle sync slider focus and keyboard dragging --- src/components/subtitlesync/subtitlesync.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/components/subtitlesync/subtitlesync.js b/src/components/subtitlesync/subtitlesync.js index 07ce2cb7ec..23d0d07a04 100644 --- a/src/components/subtitlesync/subtitlesync.js +++ b/src/components/subtitlesync/subtitlesync.js @@ -1,4 +1,4 @@ -define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitlesync'], function (playbackManager, template, css) { +define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', 'css!./subtitlesync'], function (playbackManager, layoutManager, template, css) { "use strict"; var player; @@ -10,6 +10,7 @@ define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitles function init(instance) { var parent = document.createElement('div'); + document.body.appendChild(parent); parent.innerHTML = template; subtitleSyncSlider = parent.querySelector(".subtitleSyncSlider"); @@ -17,6 +18,14 @@ define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitles subtitleSyncCloseButton = parent.querySelector(".subtitleSync-closeButton"); subtitleSyncContainer = parent.querySelector(".subtitleSyncContainer"); + if (layoutManager.tv) { + subtitleSyncSlider.classList.add("focusable"); + // HACK: Delay to give time for registered element attach (Firefox) + setTimeout(function () { + subtitleSyncSlider.enableKeyboardDragging(); + }, 0); + } + subtitleSyncContainer.classList.add("hide"); subtitleSyncTextField.updateOffset = function(offset) { @@ -87,8 +96,6 @@ define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitles SubtitleSync.prototype.toggle("forceToHide"); }); - document.body.appendChild(parent); - instance.element = parent; } From d60bec3834e11671e0a1ba9694cabfa3dbdf6fb2 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 15 Mar 2020 14:15:48 +0100 Subject: [PATCH 070/120] Improve details page informatios and selects --- src/assets/css/librarybrowser.css | 41 ++++++++++++++++++++++++ src/controllers/itemdetailpage.js | 31 ++++++++++-------- src/elements/emby-select/emby-select.css | 2 +- src/elements/emby-select/emby-select.js | 2 +- src/itemdetails.html | 26 ++++++++++----- src/strings/bg-bg.json | 6 ++-- src/strings/cs.json | 6 ++-- src/strings/da.json | 6 ++-- src/strings/de.json | 6 ++-- src/strings/el.json | 6 ++-- src/strings/en-gb.json | 6 ++-- src/strings/en-us.json | 12 +++---- src/strings/es-ar.json | 6 ++-- src/strings/es-mx.json | 6 ++-- src/strings/es.json | 8 ++--- src/strings/fi.json | 3 +- src/strings/fr.json | 8 ++--- src/strings/he.json | 8 ++--- src/strings/hu.json | 6 ++-- src/strings/it.json | 6 ++-- src/strings/ja.json | 6 ++-- src/strings/kk.json | 6 ++-- src/strings/ko.json | 6 ++-- src/strings/lt-lt.json | 6 ++-- src/strings/lv.json | 6 ++-- src/strings/nb.json | 6 ++-- src/strings/nl.json | 6 ++-- src/strings/pl.json | 6 ++-- src/strings/pt-br.json | 6 ++-- src/strings/pt-pt.json | 6 ++-- src/strings/pt.json | 6 ++-- src/strings/ro.json | 6 ++-- src/strings/ru.json | 6 ++-- src/strings/sk.json | 6 ++-- src/strings/sl-si.json | 6 ++-- src/strings/sv.json | 6 ++-- src/strings/tr.json | 8 ++--- src/strings/zh-cn.json | 6 ++-- src/strings/zh-tw.json | 6 ++-- 39 files changed, 152 insertions(+), 165 deletions(-) diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index 13265e40d1..b599ddde33 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -1123,3 +1123,44 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards { .layout-mobile #myPreferencesMenuPage { padding-top: 3.75em; } + +.itemDetailsGroup { + margin-bottom: 1.5em; +} + +.trackSelections { + max-width: 44em; +} + +.detailsGroupItem, +.trackSelections .selectContainer { + display: flex; + max-width: 44em; + margin: 0 0 0.5em !important; +} + +.trackSelections .selectContainer { + margin: 0 0 0.15em !important; +} + +.detailsGroupItem .label, +.trackSelections .selectContainer .selectLabel { + flex-grow: 0; + flex-shrink: 0; + flex-basis: 6.25em; + margin: 0 0.6em 0 0; +} + +.trackSelections .selectContainer .selectLabel { + margin: 0 0.2em 0 0; +} + +.trackSelections .selectContainer .detailTrackSelect { + font-size: inherit; + padding: 0; +} + +.trackSelections .selectContainer .selectArrowContainer .selectArrow { + margin-top: 0; + font-size: 1.4em; +} diff --git a/src/controllers/itemdetailpage.js b/src/controllers/itemdetailpage.js index 82569835ca..3d74ab4327 100644 --- a/src/controllers/itemdetailpage.js +++ b/src/controllers/itemdetailpage.js @@ -718,11 +718,6 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti function renderLinks(linksElem, item) { var html = []; - if (item.DateCreated && itemHelper.enableDateAddedDisplay(item)) { - var dateCreated = datetime.parseISO8601Date(item.DateCreated); - html.push(globalize.translate("AddedOnValue", datetime.toLocaleDateString(dateCreated) + " " + datetime.getDisplayTime(dateCreated))); - } - var links = []; if (!layoutManager.tv && item.HomePageUrl) { @@ -736,7 +731,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } if (links.length) { - html.push(globalize.translate("LinksValue", links.join(", "))); + html.push(links.join(", ")); } linksElem.innerHTML = html.join(", "); @@ -1032,13 +1027,17 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti context: context }) + '">' + p.Name + ""; }).join(", "); - var elem = page.querySelector(".genres"); - elem.innerHTML = globalize.translate(genres.length > 1 ? "GenresValue" : "GenreValue", html); + var genresLabel = page.querySelector(".genresLabel"); + genresLabel.innerHTML = globalize.translate(genres.length > 1 ? "Genres" : "Genre"); + var genresValue = page.querySelector(".genres"); + genresValue.innerHTML = html; + + var genresGroup = page.querySelector(".genresGroup"); if (genres.length) { - elem.classList.remove("hide"); + genresGroup.classList.remove("hide"); } else { - elem.classList.add("hide"); + genresGroup.classList.add("hide"); } } @@ -1056,13 +1055,17 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti context: context }) + '">' + p.Name + ""; }).join(", "); - var elem = page.querySelector(".directors"); - elem.innerHTML = globalize.translate(directors.length > 1 ? "DirectorsValue" : "DirectorValue", html); + var directorsLabel = page.querySelector(".directorsLabel"); + directorsLabel.innerHTML = globalize.translate(directors.length > 1 ? "Directors" : "Director"); + var directorsValue = page.querySelector(".directors"); + directorsValue.innerHTML = html; + + var directorsGroup = page.querySelector(".directorsGroup"); if (directors.length) { - elem.classList.remove("hide"); + directorsGroup.classList.remove("hide"); } else { - elem.classList.add("hide"); + directorsGroup.classList.add("hide"); } } diff --git a/src/elements/emby-select/emby-select.css b/src/elements/emby-select/emby-select.css index 9f07ca3f65..32aec69c46 100644 --- a/src/elements/emby-select/emby-select.css +++ b/src/elements/emby-select/emby-select.css @@ -109,7 +109,7 @@ } .selectArrow { - margin-top: 0.35em; + margin-top: 1.2em; font-size: 1.7em; } diff --git a/src/elements/emby-select/emby-select.js b/src/elements/emby-select/emby-select.js index 02818c6630..c772c0f960 100644 --- a/src/elements/emby-select/emby-select.js +++ b/src/elements/emby-select/emby-select.js @@ -144,7 +144,7 @@ define(['layoutManager', 'browser', 'actionsheet', 'css!./emby-select', 'registe this.parentNode.insertBefore(label, this); if (this.classList.contains('emby-select-withcolor')) { - this.parentNode.insertAdjacentHTML('beforeend', '
0
'); + this.parentNode.insertAdjacentHTML('beforeend', '
0
'); } }; diff --git a/src/itemdetails.html b/src/itemdetails.html index 672d0b65a6..3a1c2748a6 100644 --- a/src/itemdetails.html +++ b/src/itemdetails.html @@ -111,22 +111,32 @@
-
+
-
-
-
-
+
+
+
+
+
+ +
+
+
+
+
+ + +
-
+
-
+
-
+
diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index c2b0bb6922..ca95412f36 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -101,8 +101,7 @@ "Desktop": "Работен плот", "DeviceAccessHelp": "Това се отнася само за устройства, които могат да бъдат различени и няма да попречи на достъп от мрежов четец. Филтрирането на потребителски устройства ще предотврати използването им докато не бъдат одобрени тук.", "Director": "Режисьор", - "DirectorValue": "Режисьор: {0}", - "DirectorsValue": "Режисьори: {0}", + "Directors": "Режисьори", "Disc": "Диск", "Dislike": "Нехаресване", "Display": "Показване", @@ -137,9 +136,8 @@ "FormatValue": "Формат: {0}", "Friday": "Петък", "Fullscreen": "Цял екран", - "GenreValue": "Жанр: {0}", + "Genre": "Жанр", "Genres": "Жанрове", - "GenresValue": "Жанрове: {0}", "GroupVersions": "Групиране на версиите", "GuestStar": "Гостуваща звезда", "Guide": "Справочник", diff --git a/src/strings/cs.json b/src/strings/cs.json index ac3f8dd416..810be262b2 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1276,8 +1276,7 @@ "DetectingDevices": "Hledání zařízení", "DirectPlayError": "Chyba přímého přehrávání", "DirectStreamHelp2": "Přímé streamování souboru používá velmi malý výkon bez ztráty kvality videa.", - "DirectorValue": "Režisér: {0}", - "DirectorsValue": "Režiséři: {0}", + "Directors": "Režiséři", "Disabled": "Vypnuto", "DisplayInMyMedia": "Zobrazit na domovské obrazovce", "DisplayInOtherHomeScreenSections": "Zobrazení v sekcích domovské obrazovky, jako jsou nejnovější média, a pokračování ve sledování", @@ -1297,8 +1296,7 @@ "Filters": "Filtry", "Folders": "Složky", "General": "Hlavní", - "GenreValue": "Žánr: {0}", - "GenresValue": "Žánry: {0}", + "Genre": "Žánr", "GroupBySeries": "Seskupit podle série", "HandledByProxy": "Zpracováno reverzním proxy", "HeaderAddLocalUser": "Přidat místního uživatele", diff --git a/src/strings/da.json b/src/strings/da.json index 9ddba4c8f0..74d7d21b8a 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -1166,8 +1166,7 @@ "DirectStreamHelp1": "Medie filen er kompatibel med enheden i forhold til opløsning og medie type (H.264,AC3, etc.), men er i en ikke kompatibel fil container (mkv, avi, wmv, etc). Videoen vil blive genpakket live før den streames til enheden.", "DirectStreamHelp2": "Direkte Streaming af en fil bruger meget lidt processor kraft uden nogen tab af video kvalitet.", "DirectStreaming": "Direkte streaming", - "DirectorValue": "Instruktør: {0}", - "DirectorsValue": "Instruktører: {0}", + "Directors": "Instruktører", "Disc": "Disk", "Dislike": "Kan ikke lide", "Display": "Visning", @@ -1207,8 +1206,7 @@ "Features": "Funktioner", "Filters": "Filtre", "FormatValue": "Format: {0}", - "GenreValue": "Genre: {0}", - "GenresValue": "Genrer: {0}", + "Genre": "Genre", "GroupBySeries": "Gruppér efter serie", "Guide": "Vejledning", "GuideProviderLogin": "Log Ind", diff --git a/src/strings/de.json b/src/strings/de.json index 5a449d8e55..861c57ef4b 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -175,8 +175,7 @@ "DirectStreamHelp2": "Direktes Streaming von Dateien benötigt sehr wenig Rechenleistung ohne Verlust der Videoqualität.", "DirectStreaming": "Direktes Streaming", "Director": "Regisseur", - "DirectorValue": "Regisseur: {0}", - "DirectorsValue": "Regisseure: {0}", + "Directors": "Regisseure", "Disabled": "Abgeschaltet", "Disc": "Disk", "Disconnect": "Verbindung trennen", @@ -1293,9 +1292,8 @@ "Extras": "Extras", "FolderTypeTvShows": "TV Serien", "FormatValue": "Format: {0}", - "GenreValue": "Genre: {0}", + "Genre": "Genre", "Genres": "Genres", - "GenresValue": "Genres: {0}", "HeaderAdmin": "Admin", "HeaderApp": "App", "HeaderGenres": "Genres", diff --git a/src/strings/el.json b/src/strings/el.json index fb02479421..8e0b77ac17 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -166,8 +166,7 @@ "DirectStreamHelp2": "Η άμεση ροή ενός αρχείου χρησιμοποιεί ελάχιστη ισχύ επεξεργασίας χωρίς απώλεια της ποιότητας του βίντεο.", "DirectStreaming": "Απευθείας Αναμετάδοση", "Director": "Σκηνοθέτης", - "DirectorValue": "Σκηνοθέτης: {0}", - "DirectorsValue": "Σκηνοθέτες: {0}", + "Directors": "Σκηνοθέτες", "Disabled": "Απενεργοποιημένο", "Disc": "Δίσκος", "Disconnect": "Αποσύνδεση", @@ -233,9 +232,8 @@ "Friday": "Παρασκευή", "Fullscreen": "ΠΛΗΡΗΣ ΟΘΟΝΗ", "General": "Γενικά", - "GenreValue": "Είδος: {0}", + "Genre": "Είδος", "Genres": "Είδη", - "GenresValue": "Είδη: {0}", "GroupBySeries": "Ομαδοποίηση κατά σειρά", "GroupVersions": "Ομαδικές εκδόσεις", "GuestStar": "Φιλική Συμμετοχή", diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index 4f4f94f6fa..d5ed1acde5 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -223,8 +223,7 @@ "DirectStreamHelp2": "Direct Streaming a file uses very little processing power without any loss in video quality.", "DirectStreaming": "Direct streaming", "Director": "Director", - "DirectorValue": "Director: {0}", - "DirectorsValue": "Directors: {0}", + "Directors": "Directors", "Disabled": "Disabled", "Disc": "Disc", "Disconnect": "Disconnect", @@ -299,8 +298,7 @@ "Friday": "Friday", "Fullscreen": "Full screen", "General": "General", - "GenreValue": "Genre: {0}", - "GenresValue": "Genres: {0}", + "Genre": "Genre", "GroupBySeries": "Group by series", "GroupVersions": "Group versions", "GuestStar": "Guest star", diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 1afa731186..924f1a188b 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -192,8 +192,7 @@ "DirectStreamHelp2": "Direct Streaming a file uses very little processing power without any loss in video quality.", "DirectStreaming": "Direct streaming", "Director": "Director", - "DirectorValue": "Director: {0}", - "DirectorsValue": "Directors: {0}", + "Directors": "Directors", "Disabled": "Disabled", "Disc": "Disc", "Disconnect": "Disconnect", @@ -272,9 +271,8 @@ "Friday": "Friday", "Fullscreen": "Full screen", "General": "General", - "GenreValue": "Genre: {0}", + "Genre": "Genre", "Genres": "Genres", - "GenresValue": "Genres: {0}", "GroupBySeries": "Group by series", "GroupVersions": "Group versions", "GuestStar": "Guest star", @@ -551,7 +549,7 @@ "LabelAppNameExample": "Example: Sickbeard, Sonarr", "LabelArtists": "Artists:", "LabelArtistsHelp": "Separate multiple using ;", - "LabelAudio": "Audio:", + "LabelAudio": "Audio", "LabelAudioBitDepth": "Audio bit depth:", "LabelAudioBitrate": "Audio bitrate:", "LabelAudioChannels": "Audio channels:", @@ -841,7 +839,7 @@ "LabelSubtitleDownloaders": "Subtitle downloaders:", "LabelSubtitleFormatHelp": "Example: srt", "LabelSubtitlePlaybackMode": "Subtitle mode:", - "LabelSubtitles": "Subtitles:", + "LabelSubtitles": "Subtitles", "LabelSupportedMediaTypes": "Supported Media Types:", "LabelTVHomeScreen": "TV mode home screen:", "LabelTag": "Tag:", @@ -887,7 +885,7 @@ "DashboardServerName": "Server: {0}", "DashboardOperatingSystem": "Operating System: {0}", "DashboardArchitecture": "Architecture: {0}", - "LabelVideo": "Video:", + "LabelVideo": "Video", "LabelVideoBitrate": "Video bitrate:", "LabelVideoCodec": "Video codec:", "LabelVideoResolution": "Video resolution:", diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 64f7a0fd7e..6c7ed6f2d4 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -312,8 +312,7 @@ "DirectStreamHelp2": "Transmitir directamente un archivo usa muy poco procesamiento, esto sin perdida en la calidad de video.", "DirectStreaming": "Transmisión en directo", "Director": "Director", - "DirectorValue": "Director: {0}", - "DirectorsValue": "Directores: {0}", + "Directors": "Directores", "Disabled": "Deshabilitado", "Disc": "Disco", "Disconnect": "Desconectar", @@ -398,8 +397,7 @@ "Friday": "Viernes", "Fullscreen": "Pantalla Completa", "General": "General", - "GenreValue": "Género: {0}", - "GenresValue": "Géneros: {0}", + "Genre": "Género", "GroupBySeries": "Agrupar por Serie", "GroupVersions": "Agrupar versiones", "GuestStar": "Estrella invitada", diff --git a/src/strings/es-mx.json b/src/strings/es-mx.json index 2968bbcdd4..76679b698f 100644 --- a/src/strings/es-mx.json +++ b/src/strings/es-mx.json @@ -179,7 +179,7 @@ "DirectStreamHelp1": "El medio es compatible con el dispositivo en cuanto a la resolución y tipo de medio (H.264, AC3, etc.), pero está en un contenedor de archivo incompatible (mkv, avi, wmv, etc.). El video sera reempaquetado en el acto antes de transmitirlo al dispositivo.", "DirectStreamHelp2": "La Transmisión Directa de un archivo usa muy poco poder de procesamiento sin ninguna perdida en la calidad de video.", "DirectStreaming": "Transmisión Directa", - "DirectorsValue": "Directores: {0}", + "Directors": "Directores", "Disabled": "Desactivado", "Disc": "DIsco", "Disconnect": "Desconectar", @@ -255,9 +255,8 @@ "FormatValue": "Formato: {0}", "Friday": "Viernes", "Fullscreen": "Pantalla Completa", - "GenreValue": "Genero: {0}", + "Genre": "Genero", "Genres": "Géneros", - "GenresValue": "Géneros: {0}", "GroupBySeries": "Agrupar por series", "GroupVersions": "Agrupar versiones", "GuestStar": "Estrella invitada", @@ -1350,7 +1349,6 @@ "ButtonTrailer": "Trailer", "AuthProviderHelp": "Seleccione un proveedor de autenticación que se utilizará para autenticar la contraseña de este usuario.", "Director": "Director", - "DirectorValue": "Director: {0}", "Extras": "Extras", "General": "General", "HeaderAdmin": "Administrador", diff --git a/src/strings/es.json b/src/strings/es.json index 3d56ff56d8..2f3fb2769b 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1248,9 +1248,8 @@ "Descending": "Descendiente", "DirectStreamHelp1": "El tipo de archivo (H.264, AC3, etc.) y la resolución son compatibles con el dispositivo, pero no el contenedor (mkv, avi, wmv, etc.). El vídeo será re-empaquetado al vuelo antes de transmitirlo al dispositivo.", "DirectStreamHelp2": "La transmisión directa del archivo usa muy poco procesamiento sin ninguna pérdida de calidad en el vídeo.", - "Director": "Dirección de", - "DirectorValue": "Dirección de: {0}", - "DirectorsValue": "Directores: {0}", + "Director": "Director", + "Directors": "Directores", "Display": "Mostrar", "DisplayInMyMedia": "Mostrar en la pantalla de inicio", "DisplayInOtherHomeScreenSections": "Mostrar en las secciones de la pantalla de inicio al igual que \"últimos\" y \"continuar viendo\"", @@ -1272,8 +1271,7 @@ "Filters": "Filtros", "Folders": "Carpetas", "General": "General", - "GenreValue": "Género: {0}", - "GenresValue": "Géneros: {0}", + "Genre": "Género", "GroupBySeries": "Agrupar por series", "GuideProviderLogin": "Credenciales", "HeaderAlbumArtists": "Artistas del álbum", diff --git a/src/strings/fi.json b/src/strings/fi.json index b61724e2fe..55c5a1fbcd 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -240,8 +240,7 @@ "DirectStreamHelp2": "Tiedoston suoraan toistaminen käyttää erittäin vähän prosessorin resursseja ilman laadun heikentämistä.", "DirectStreaming": "Suora suoratoisto", "Director": "Ohjaaja", - "DirectorValue": "Ohjaaja: {0}", - "DirectorsValue": "Ohjaajat: {0}", + "Directors": "Ohjaajat", "Disabled": "Pois päältä kytkettynä", "Disc": "Levy", "Disconnect": "Katkaise yhteys", diff --git a/src/strings/fr.json b/src/strings/fr.json index fd85828c17..465eca15f1 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -175,9 +175,8 @@ "DirectStreamHelp1": "Le média est compatible avec l'appareil en ce qui concerne la résolution et le type de média (H.264, AC3, etc), mais se trouve dans un conteneur de fichiers incompatible (mkv, avi, wmv, etc). La vidéo sera rempaquetée à la volée avant d'être diffusée à l'appareil.", "DirectStreamHelp2": "Le streaming en direct d'un fichier utilise très peu de puissance de traitement sans perte de qualité vidéo.", "DirectStreaming": "Streaming direct", - "Director": "Réalisation", - "DirectorValue": "Réalisation : {0}", - "DirectorsValue": "Réalisation : {0}", + "Director": "Réalisateur(trice)", + "Directors": "Réalisateurs", "Disabled": "Désactivé", "Disc": "Disque", "Disconnect": "Déconnecter", @@ -1329,9 +1328,8 @@ "ButtonPause": "Pause", "Collections": "Collections", "Extras": "Extras", - "GenreValue": "Genre: {0}", + "Genre": "Genre", "Genres": "Genres", - "GenresValue": "Genres: {0}", "Guide": "Guide", "GuestStar": "Guest star", "Photos": "Photos", diff --git a/src/strings/he.json b/src/strings/he.json index a334f312b7..381b9bc181 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -59,7 +59,6 @@ "DeleteImageConfirmation": "האם אתה בטוח שברצונך למחוק תמונה זו?", "DeleteMedia": "מחק מדיה", "DeleteUser": "מחק משתמש", - "Director": "מנהל", "Dislike": "לא אוהב", "DoNotRecord": "אל תקליט", "Download": "הורדה", @@ -557,8 +556,8 @@ "DisplayMissingEpisodesWithinSeasons": "הצג פרקים חסרים בתוך העונות", "DisplayInMyMedia": "הצג בעמוד הבית", "Disconnect": "התנתק", - "DirectorsValue": "במאים: {0}", - "DirectorValue": "במאי: {0}", + "Director": "במאי", + "Directors": "במאים", "Descending": "סדר יורד", "Default": "ברירת מחדל", "DeathDateValue": "נפטר: {0}", @@ -667,8 +666,7 @@ "HeaderAddScheduledTaskTrigger": "הוסף טריגר", "HeaderActivity": "פעילות", "Guide": "מדריך", - "GenresValue": "ז'אנרים: {0}", - "GenreValue": "ז'אנר: {0}", + "Genre": "ז'אנר", "General": "כללי", "Fullscreen": "מסך מלא", "FolderTypeUnset": "תוכן מעורבב", diff --git a/src/strings/hu.json b/src/strings/hu.json index 0f0b0aee68..69ce7acedd 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -87,8 +87,7 @@ "DeleteMedia": "Média törlése", "Descending": "Csökkenő", "Director": "Rendező", - "DirectorValue": "Rendező: {0}", - "DirectorsValue": "Rendezők: {0}", + "Directors": "Rendezők", "Dislike": "Nem tettszik", "Display": "Megjelenítés", "DisplayMissingEpisodesWithinSeasons": "Hiányzó évad epizódok megjelenítése", @@ -124,7 +123,6 @@ "Fullscreen": "Teljes képernyő", "General": "Általános", "Genres": "Műfajok", - "GenresValue": "Műfajok: {0}", "HeaderActiveDevices": "Aktív eszközök", "HeaderAddToCollection": "Hozzáadás gyűjteményhez", "HeaderAddToPlaylist": "Hozzáadás lejátszási listához", @@ -575,7 +573,7 @@ "Writer": "Író", "Yesterday": "Tegnap", "FormatValue": "Formátum: {0}", - "GenreValue": "Műfaj: {0}", + "Genre": "Műfaj", "HeaderServerSettings": "Szerver beállítások", "LabelDropImageHere": "Húzz ide egy képet, vagy kattints a böngészéshez.", "LabelDropShadow": "Árnyék:", diff --git a/src/strings/it.json b/src/strings/it.json index 4dd7b3d190..6ba6df0d12 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -165,8 +165,7 @@ "DirectStreamHelp2": "Lo Streaming in Diretta di un file utilizza poco il processore senza alcuna perdita di qualità video.", "DirectStreaming": "Streaming Diretto", "Director": "Regista", - "DirectorValue": "Regista: {0}", - "DirectorsValue": "Registi: {0}", + "Directors": "Registi", "Disabled": "Disabilitato", "Disc": "Disco", "Disconnect": "Disconnetti", @@ -240,9 +239,8 @@ "FormatValue": "Formato: {0}", "Friday": "Venerdì", "Fullscreen": "Schermo Intero", - "GenreValue": "Genere: {0}", + "Genre": "Genere", "Genres": "Generi", - "GenresValue": "Generi: {0}", "GroupBySeries": "Raggruppa per serie", "GroupVersions": "Raggruppa versioni", "GuestStar": "Personaggio famoso", diff --git a/src/strings/ja.json b/src/strings/ja.json index 8450f01f4d..9a881bce0d 100644 --- a/src/strings/ja.json +++ b/src/strings/ja.json @@ -176,8 +176,7 @@ "DirectStreamHelp2": "ファイルのダイレクトストリーミングは、ビデオ品質を損なうことなく、Jellyfin Serverにもほとんど負荷がありません。", "DirectStreaming": "ダイレクトストリーミング", "Director": "ディレクター", - "DirectorValue": "ディレクター: {0}", - "DirectorsValue": "ディレクターズ: {0}", + "Directors": "ディレクターズ", "Disabled": "無効", "Disc": "ディスク", "Disconnect": "切断", @@ -266,9 +265,8 @@ "Friday": "金曜日", "Fullscreen": "フルスクリーン", "General": "全般", - "GenreValue": "ジャンル: {0}", + "Genre": "ジャンル", "Genres": "ジャンル", - "GenresValue": "ジャンル: {0}", "GroupBySeries": "シリーズグループ", "GroupVersions": "グループバージョン", "GuestStar": "ゲストスター", diff --git a/src/strings/kk.json b/src/strings/kk.json index a70b03a69b..665091106d 100644 --- a/src/strings/kk.json +++ b/src/strings/kk.json @@ -188,8 +188,7 @@ "DirectStreamHelp2": "Faıldy tikeleı taratý beıne sapasyn joǵaltpaı óte az esepteý qýatyn paıdalanady.", "DirectStreaming": "Tikeleı tasymaldanýda", "Director": "Rejısór", - "DirectorValue": "Rejısóri: {0}", - "DirectorsValue": "Rejısórler; {0}", + "Directors": "Rejısórler", "Disabled": "Ajyratylǵan", "Disc": "Dıski", "Disconnect": "Ajyratý", @@ -267,9 +266,8 @@ "Friday": "juma", "Fullscreen": "Tolyq ekran", "General": "Jalpy", - "GenreValue": "Janr: {0}", + "Genre": "Janr", "Genres": "Janrlar", - "GenresValue": "Janrlar: {0}", "GroupBySeries": "Telehıkaıalar boıynsha toptastyrý", "GroupVersions": "Nusqalardy toptastyrý", "GuestStar": "Shaqyrylǵan aktór", diff --git a/src/strings/ko.json b/src/strings/ko.json index c7efcc0ea5..b96642d8d1 100644 --- a/src/strings/ko.json +++ b/src/strings/ko.json @@ -880,7 +880,6 @@ "DoNotRecord": "녹화 안 함", "Disconnect": "연결 끊기", "Disabled": "비활성화됨", - "DirectorValue": "감독: {0}", "DirectPlaying": "다이렉트 재생", "DirectStreaming": "다이렉트 스트리밍", "DirectStreamHelp2": "다이렉트 스트리밍은 비디오 퀄리티의 손실없이 매우 적은 처리능력을 사용합니다.", @@ -1145,8 +1144,7 @@ "HardwareAccelerationWarning": "하드웨어 가속을 활성화하면 일부 환경에서 불안정해질 수 있습니다. 운영체제 및 비디오 드라이버가 최신 상태인지 확인하십시오. 이 기능을 활성화한 후 비디오를 재생하는 데 어려움이 있을 경우 설정을 다시 '사용 안 함'으로 변경하십시오.", "GuestStar": "게스트 스타", "GroupBySeries": "시리즈별로 그룹화", - "GenresValue": "장르: {0}", - "GenreValue": "장르: {0}", + "Genre": "장르", "General": "일반", "FileReadCancelled": "파일 읽기 작업이 취소되었습니다.", "FetchingData": "추가 데이터를 가져오는 중", @@ -1284,7 +1282,7 @@ "LabelDiscNumber": "디스크 번호:", "Identify": "식별자", "HeaderMoreLikeThis": "비슷한 작품", - "DirectorsValue": "감독: {0}", + "Directors": "감독", "ButtonSplit": "나누기", "HeaderContainerProfileHelp": "컨테이너 프로파일은 사용자의 디바이스에서 재생 가능한 파일 형식을 나타냅니다. 다이렉트 플레이가 설정된 경우에도 디바이스에서 지원되지 않는 형식이라면 트랜스코딩이 적용됩니다.", "HeaderCodecProfileHelp": "코덱 프로파일은 사용자의 디바이스에서 재생 가능한 코덱을 가리킵니다. 다이렉트 플레이가 설정된 경우에도 디바이스에서 지원되지 않는 코덱이라면 트랜스코딩이 적용됩니다.", diff --git a/src/strings/lt-lt.json b/src/strings/lt-lt.json index fa97fe2d8b..07d1b790af 100644 --- a/src/strings/lt-lt.json +++ b/src/strings/lt-lt.json @@ -624,8 +624,7 @@ "ConfirmEndPlayerSession": "Ar norite išjungti Jellyfin ant {0}?", "Descending": "Mažėjančia tvarka", "DetectingDevices": "Ieškomi įrenginiai", - "DirectorValue": "Režisierius: {0}", - "DirectorsValue": "Režisieriai: {0}", + "Directors": "Režisieriai", "Disabled": "Išjungtas", "Disc": "Diskas", "Disconnect": "Atsijungti", @@ -805,7 +804,7 @@ "ExtraLarge": "Labai didelis", "Fullscreen": "Viso ekrano režimas", "General": "Bendri", - "GenreValue": "Žanras: {0}", + "Genre": "Žanras", "ErrorPleaseSelectLineup": "Pasirinkite TV programą ir bandykite dar kartą. Jei TV programos nerodoma, patikrinkite ar teisingas jūsų vartotojo vardas, slaptažodis ir pašto kodas.", "HeaderRevisionHistory": "Versijų istorija", "HeaderShutdown": "Išjungti", @@ -924,7 +923,6 @@ "ErrorAddingXmlTvFile": "Atidarant XMLTV failą įvyko klaida. Įsitikinkite, ar failas egzistuoja, ir bandykite dar kartą.", "ErrorGettingTvLineups": "Atsisiunčiant TV programas įvyko klaida. Įsitikinkite, kad jūsų informacija teisinga, ir bandykite dar kartą.", "Features": "Medžiagos", - "GenresValue": "Žanrai: {0}", "GroupBySeries": "Grupuoti pagal serialus", "Guide": "Gidas", "GuideProviderLogin": "Prisijungti", diff --git a/src/strings/lv.json b/src/strings/lv.json index 657a2261a5..660ebcd971 100644 --- a/src/strings/lv.json +++ b/src/strings/lv.json @@ -412,9 +412,8 @@ "GuestStar": "Vieszvaigzne", "GroupVersions": "Grupēt versijas", "GroupBySeries": "Grupēt pēc sērijām", - "GenresValue": "Žanri: {0}", "Genres": "Žanri", - "GenreValue": "Žanrs: {0}", + "Genre": "Žanrs", "General": "Vispārīgs", "Fullscreen": "Pilnekrāns", "Friday": "Piektdiena", @@ -464,8 +463,7 @@ "Dislike": "Nepatīk", "Disc": "Disks", "Disabled": "Atspējots", - "DirectorsValue": "Direktori: {0}", - "DirectorValue": "Direktors: {0}", + "Directors": "Direktori", "Director": "Direktors", "DirectStreaming": "Tiešā straumēšana", "DirectPlaying": "Tiešā Atskaņošana", diff --git a/src/strings/nb.json b/src/strings/nb.json index 1b6c1529ac..373cdc8a55 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -1159,7 +1159,6 @@ "MediaInfoStreamTypeVideo": "Video", "OptionDownloadBannerImage": "Banner", "CopyStreamURLSuccess": "URLen ble kopiert.", - "DirectorValue": "Regissør: {0}", "OptionThumb": "Miniatyrbilde", "LabelInternetQuality": "Internettkvalitet:", "SubtitleAppearanceSettingsDisclaimer": "Disse innstillingene vil ikke påvirke grafiske undertekster (PGS, DVD, osv.) eller ASS/SSA-teksting som inkluderer sin egen formatering.", @@ -1267,7 +1266,7 @@ "LabelMatchType": "Matchtype:", "OptionPosterCard": "Plakatkort", "Uniform": "Jevn", - "DirectorsValue": "Regissører: {0}", + "Directors": "Regissører", "Disabled": "Deaktivert", "Disc": "Plate", "Display": "Vis", @@ -1283,8 +1282,7 @@ "FetchingData": "Henter ytterligere data", "Folders": "Mapper", "FormatValue": "Format: {0}", - "GenreValue": "Sjanger: {0}", - "GenresValue": "Sjangre: {0}", + "Genre": "Sjanger", "GroupBySeries": "Grupper etter serie", "GroupVersions": "Grupper etter versjon", "Guide": "Guide", diff --git a/src/strings/nl.json b/src/strings/nl.json index 9ac84a7396..5ca394dc26 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -168,8 +168,7 @@ "DirectStreamHelp2": "Direct streamen van een bestand gebruikt weinig processor kracht zonder verlies van beeldkwaliteit.", "DirectStreaming": "Direct streamen", "Director": "Regiseur", - "DirectorValue": "Regisseur: {0}", - "DirectorsValue": "Regisseurs: {0}", + "Directors": "Regisseurs", "Disabled": "Uitgeschakeld", "Disc": "Disk", "Disconnect": "Loskoppelen", @@ -1269,9 +1268,8 @@ "Desktop": "Bureaublad", "DownloadsValue": "{0} downloads", "Filters": "Filters", - "GenreValue": "Genre: {0}", + "Genre": "Genre", "Genres": "Genres", - "GenresValue": "Genres: {0}", "HeaderAlbums": "Albums", "HeaderCastAndCrew": "Cast & Crew", "HeaderCastCrew": "Cast & Crew", diff --git a/src/strings/pl.json b/src/strings/pl.json index 4097a6cc3f..71a4ba06e9 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -180,8 +180,7 @@ "DirectStreamHelp2": "Transmisja bezpośrednia pliku używa niewiele mocy przetwarzania, bez utraty jakości wideo.", "DirectStreaming": "Transmisja bezpośrednia", "Director": "Reżyser", - "DirectorValue": "Reżyser: {0}", - "DirectorsValue": "Reżyserzy: {0}", + "Directors": "Reżyserzy", "Disabled": "Nieaktywne", "Disc": "Dysk", "Disconnect": "Rozłącz", @@ -258,9 +257,8 @@ "Friday": "Piątek", "Fullscreen": "Pełny ekran", "General": "Ogólne", - "GenreValue": "Gatunek: {0}", + "Genre": "Gatunek", "Genres": "Gatunki", - "GenresValue": "Gatunki: {0}", "GroupBySeries": "Grupuj po serialach", "GroupVersions": "Wersje grup", "GuestStar": "Gość specjalny", diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index dcb24a2fcc..c5b426fead 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -172,8 +172,7 @@ "DirectStreamHelp2": "O streaming direto de um arquivo usa baixo processamento sem perda de qualidade de vídeo.", "DirectStreaming": "Streaming Direto", "Director": "Diretor", - "DirectorValue": "Diretor: {0}", - "DirectorsValue": "Diretores: {0}", + "Directors": "Diretores", "Disabled": "Desativado", "Disc": "Disco", "Disconnect": "Desconectar", @@ -248,9 +247,8 @@ "Friday": "Sexta-feira", "Fullscreen": "Tela cheia", "General": "Geral", - "GenreValue": "Gênero: {0}", + "Genre": "Gênero", "Genres": "Gêneros", - "GenresValue": "Gêneros: {0}", "GroupBySeries": "Agrupar por séries", "GroupVersions": "Agrupar versões", "GuestStar": "Convidado especial", diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index c8e20fd063..f80bc1f5aa 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -873,8 +873,7 @@ "GuestStar": "Estrela convidada", "GroupVersions": "Agrupar versões", "GroupBySeries": "Agrupar por série", - "GenresValue": "Géneros: {0}", - "GenreValue": "Género: {0}", + "Genre": "Género", "General": "Geral", "FormatValue": "Formato: {0}", "FolderTypeUnset": "Conteúdo Misto", @@ -1077,8 +1076,7 @@ "News": "Notícias", "Programs": "Programas", "HeaderMovies": "Filmes", - "DirectorsValue": "Realização: {0}", - "DirectorValue": "Realizador: {0}", + "Directors": "Realização", "ButtonOff": "Desligado", "ButtonAddImage": "Adicionar Imagem", "LabelOriginalTitle": "Título original:", diff --git a/src/strings/pt.json b/src/strings/pt.json index ecd6ccb079..a7cd41299d 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -906,8 +906,7 @@ "Disconnect": "Desligar", "Disc": "Disco", "Disabled": "Desactivado", - "DirectorsValue": "Realização: {0}", - "DirectorValue": "Realizador: {0}", + "Directors": "Realização", "Director": "Realizador", "DirectStreaming": "Reprodução directa", "DirectStreamHelp2": "A reprodução directa de um ficheiro requer pouco processamento e não implica perda de qualidade num vídeo.", @@ -1186,12 +1185,11 @@ "GuestStar": "Estrela convidada", "GroupVersions": "Agrupar versões", "GroupBySeries": "Agrupar por série", - "GenresValue": "Géneros: {0}", "ErrorAddingListingsToSchedulesDirect": "Ocorreu um erro ao adicionar o alinhamento à sua conta Schedules Direct. As contas Schedules Direct permitem apenas um número limitado de alinhamentos. Poderá ser necessário iniciar sessão na sua conta e remover outras listagens antes de prosseguir.", "Ended": "Terminado", "DefaultMetadataLangaugeDescription": "Estes são os valores por omissão que podem ser individualizados para cada uma das bibliotecas.", "Genres": "Géneros", - "GenreValue": "Género: {0}", + "Genre": "Género", "General": "Geral", "Fullscreen": "Ecrã inteiro", "Friday": "Sexta", diff --git a/src/strings/ro.json b/src/strings/ro.json index 34907d09f1..a5b938e7ee 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -382,8 +382,7 @@ "ConfirmDeletion": "Confirmă ștergerea", "DeleteDeviceConfirmation": "Sigur doriți să ștergeți acest dispozitiv? Acesta va reapărea data viitoare când un utilizator se conectează cu acesta.", "DeleteUser": "Șterge utilizator", - "DirectorValue": "Regizor: {0}", - "DirectorsValue": "Regizori: {0}", + "Directors": "Regizori", "Disabled": "Dezactivat", "Disconnect": "Deconectare", "Dislike": "Neplăcut", @@ -545,8 +544,7 @@ "EveryNDays": "La fiecare {0} zile", "Extras": "Extra", "Genres": "Genuri", - "GenreValue": "Gen: {0}", - "GenresValue": "Genuri: {0}", + "Genre": "Gen", "Guide": "Ghid", "HeaderCancelRecording": "Anulați înregistrarea", "HeaderCancelSeries": "Anulați seriile", diff --git a/src/strings/ru.json b/src/strings/ru.json index b84651ed58..4986855da5 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -181,8 +181,7 @@ "DirectStreamHelp2": "При прямой трансляции файла расходуется очень мало вычислительной мощности без потери качества видео.", "DirectStreaming": "Транслируется напрямую", "Director": "Режиссёр", - "DirectorValue": "Режиссёр: {0}", - "DirectorsValue": "Режиссёры: {0}", + "Directors": "Режиссёры", "Disabled": "Отключено", "Disc": "Диск", "Disconnect": "Разъединиться", @@ -260,9 +259,8 @@ "Friday": "пятница", "Fullscreen": "Полный экран", "General": "Общие", - "GenreValue": "Жанр: {0}", + "Genre": "Жанр", "Genres": "Жанры", - "GenresValue": "Жанры: {0}", "GroupBySeries": "Группирование по сериалам", "GroupVersions": "Сгруппировать версии", "GuestStar": "Пригл. актёр", diff --git a/src/strings/sk.json b/src/strings/sk.json index edbc343fae..2727fe01d1 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -123,8 +123,7 @@ "DetectingDevices": "Hľadám zariadenia", "DeviceAccessHelp": "Táto možnosť sa vzťahuje iba na zariadenia, ktoré môžu byť jedinečne identifikované a nezabráni prístup cez prehliadač. Filtrovaním prístupu používateľských zariadení zabraňuje užívateľom použiť nové zariadenie, pokiaľ neboli tu schválené.", "Director": "Režisér", - "DirectorValue": "Réžia: {0}", - "DirectorsValue": "Režiséri: {0}", + "Directors": "Režiséri", "Disc": "Disk", "Disconnect": "Odpojiť", "Dislike": "Nepáči sa mi to", @@ -165,9 +164,8 @@ "Friday": "Piatok", "Fullscreen": "Celá obrazovka", "General": "Všeobecné", - "GenreValue": "Žáner: {0}", + "Genre": "Žáner", "Genres": "Žánre", - "GenresValue": "Žánre: {0}", "GroupBySeries": "Zoskupiť podľa série", "GuestStar": "Hosťujúca hviezda", "Guide": "Sprievodca", diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index 83be4ddd92..9b74efe3a7 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -271,8 +271,7 @@ "Down": "Dol", "Dislike": "Ni mi všeč", "Disabled": "Onemogočen", - "DirectorsValue": "Režiserji: {0}", - "DirectorValue": "Režiser: {0}", + "Directors": "Režiserji", "Director": "Režiser", "DetectingDevices": "Zaznavanje naprav", "Desktop": "Namizje", @@ -462,8 +461,7 @@ "GuestStar": "Gostujoči igralec", "GroupVersions": "Združi različice", "GroupBySeries": "Združi bo serijah", - "GenresValue": "Zvrsti: {0}", - "GenreValue": "Zvrst: {0}", + "Genre": "Zvrst", "General": "Splošno", "Fullscreen": "Celoten zaslon", "Friday": "Petek", diff --git a/src/strings/sv.json b/src/strings/sv.json index 17bb11b57b..2dd5ec2dc2 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -163,8 +163,7 @@ "DirectStreamHelp2": "Direktströmning av en fil använder väldigt lite resurser av CPU'n utan att bildkvaliten försämras.", "DirectStreaming": "Direktströmning", "Director": "Regissör", - "DirectorValue": "Regi: {0}", - "DirectorsValue": "Regi: {0}", + "Directors": "Regi", "Disabled": "Inaktiverad", "Disc": "Skiva", "Disconnect": "Koppla bort", @@ -235,7 +234,6 @@ "Friday": "Fredag", "Fullscreen": "Fullskärm", "Genres": "Genrer", - "GenresValue": "Genrer: {0}", "GroupBySeries": "Gruppera efter serie", "GroupVersions": "Gruppera versioner", "GuestStar": "Gästmedverkande", @@ -1273,7 +1271,7 @@ "HeaderApp": "Applikation", "HeaderAdmin": "Administratör", "Guide": "Guide", - "GenreValue": "Genre: {0}", + "Genre": "Genre", "General": "Allmänt", "FastForward": "Snabbspola", "Extras": "Extramaterial", diff --git a/src/strings/tr.json b/src/strings/tr.json index e1ac24da6d..7d2afd756f 100644 --- a/src/strings/tr.json +++ b/src/strings/tr.json @@ -314,9 +314,8 @@ "ColorPrimaries": "Renk primerleri", "DirectStreamHelp2": "Doğrudan Akış, video kalitesinde herhangi bir kayıp olmadan çok az işlem gücü kullanır.", "DirectStreaming": "Doğrudan akış", - "Director": "yönetmen", - "DirectorValue": "Yönetmen: {0}", - "DirectorsValue": "Yöneticiler: {0}", + "Director": "Yönetmen", + "Directors": "Yöneticiler", "Disabled": "Deaktif", "DisplayModeHelp": "Jellyfin’i çalıştırdığınız ekran türünü seçin.", "DoNotRecord": "Kaydetme", @@ -521,8 +520,7 @@ "GuestStar": "Konuk sanatçı", "GroupVersions": "Grup versiyonları", "GroupBySeries": "Seriye göre gruplandır", - "GenresValue": "Türler: {0}", - "GenreValue": "Tür: {0}", + "Genre": "Tür", "General": "Genel", "Fullscreen": "Tam ekran", "FormatValue": "Biçim: {0}", diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index a37f839039..271be38b5f 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1310,16 +1310,14 @@ "BoxRear": "盒子(背面)", "ChannelNumber": "频道号码", "ColorSpace": "色彩空间", - "DirectorValue": "导演:{0}", - "DirectorsValue": "导演:{0}", + "Directors": "导演", "ColorTransfer": "色彩转换", "ConfirmDeleteItem": "这将同时在磁盘和媒体库中删除这个项目。确认删除?", "ConfirmDeleteItems": "这将同时在磁盘和媒体库中删除这些项目。确认删除?", "ConfirmEndPlayerSession": "确认要关闭位于{0}的Jellyfin吗?", "ValueSeconds": "{0}秒", "Features": "功能", - "GenreValue": "风格:{0}", - "GenresValue": "风格:{0}", + "Genre": "风格", "Guide": "指南", "HeaderCancelRecording": "取消录制", "HeaderFavoriteMovies": "最爱的电影", diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index ffc0228af2..59ab7fcdda 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -453,8 +453,7 @@ "DirectStreamHelp2": "直接串流檔案會占用非常少的處理效能並且影片的品質不會有任何損失。", "DirectStreaming": "直接串流", "Director": "導演", - "DirectorValue": "導演: {0}", - "DirectorsValue": "導演: {0}", + "Directors": "導演", "Disabled": "已停用", "Disc": "光碟", "Disconnect": "斷開連結", @@ -539,9 +538,8 @@ "FreeAppsFeatureDescription": "享受免費的Jellyfin應用程式。", "Fullscreen": "全螢幕", "General": "一般", - "GenreValue": "類型 : {0}", + "Genre": "類型", "Genres": "風格", - "GenresValue": "類型 : {0}", "GroupBySeries": "按系列分組", "GroupVersions": "按版本分組", "GuestStar": "特邀明星", From 4643c83ab14637fea8c4df0ed5dd251e3f451ee1 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 26 Mar 2020 20:48:09 +0100 Subject: [PATCH 071/120] Update some details page translations for the new layout --- src/strings/bg-bg.json | 4 ++-- src/strings/cs.json | 6 +++--- src/strings/da.json | 6 +++--- src/strings/de.json | 6 +++--- src/strings/el.json | 6 +++--- src/strings/en-gb.json | 6 +++--- src/strings/es-mx.json | 6 +++--- src/strings/es.json | 6 +++--- src/strings/fr.json | 6 +++--- src/strings/hu.json | 6 +++--- src/strings/it.json | 6 +++--- src/strings/ja.json | 6 +++--- src/strings/kk.json | 6 +++--- src/strings/ko.json | 6 +++--- src/strings/lt-lt.json | 2 +- src/strings/lv.json | 6 +++--- src/strings/nb.json | 6 +++--- src/strings/nl.json | 6 +++--- src/strings/pl.json | 6 +++--- src/strings/pt-br.json | 6 +++--- src/strings/pt-pt.json | 6 +++--- src/strings/pt.json | 2 +- src/strings/ro.json | 6 +++--- src/strings/ru.json | 6 +++--- src/strings/sk.json | 6 +++--- src/strings/sl-si.json | 4 ++-- src/strings/sv.json | 6 +++--- src/strings/tr.json | 2 +- src/strings/zh-cn.json | 6 +++--- src/strings/zh-tw.json | 6 +++--- 30 files changed, 82 insertions(+), 82 deletions(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index ca95412f36..e6aaa30fb1 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -433,7 +433,7 @@ "LabelStatus": "Състояние:", "LabelStopWhenPossible": "Спирай, когато е възможно:", "LabelSubtitlePlaybackMode": "Режим на субтитрите:", - "LabelSubtitles": "Субтитри:", + "LabelSubtitles": "Субтитри", "LabelSupportedMediaTypes": "Поддържани типове медия:", "LabelTag": "Етикет:", "LabelTextColor": "Цвят на текста:", @@ -810,7 +810,7 @@ "MediaInfoLayout": "Подредба", "MusicVideo": "Музикален клип", "MediaInfoStreamTypeVideo": "Видео", - "LabelVideo": "Видео:", + "LabelVideo": "Видео", "HeaderVideoTypes": "Видове видеа", "HeaderVideoType": "Вид на видеото", "EnableExternalVideoPlayers": "Външни възпроизводители", diff --git a/src/strings/cs.json b/src/strings/cs.json index 810be262b2..bf74c4ad2d 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -461,7 +461,7 @@ "LabelArtist": "Umělec", "LabelArtists": "Umělci:", "LabelArtistsHelp": "Odděl pomocí ;", - "LabelAudio": "Zvuk:", + "LabelAudio": "Zvuk", "LabelAudioLanguagePreference": "Preferovaný jazyk zvuku:", "LabelBindToLocalNetworkAddress": "Vázat na místní síťovou adresu:", "LabelBindToLocalNetworkAddressHelp": "Volitelné. Přepsat lokální IP adresu vazanou na http server. Pokud je ponecháno prázdné, server se sváže ke všem dostupným adresám (aplikace bude dostupná na všech síťových zařízení, které server nabízí). Změna této hodnoty vyžaduje restartování Jellyfin Serveru.", @@ -709,7 +709,7 @@ "LabelStopping": "Zastavování", "LabelSubtitleFormatHelp": "Příklad: srt", "LabelSubtitlePlaybackMode": "Mód titulků:", - "LabelSubtitles": "Titulky:", + "LabelSubtitles": "Titulky", "LabelSupportedMediaTypes": "Podporované typy médií:", "LabelTagline": "Slogan:", "LabelTextBackgroundColor": "Barva pozadí textu:", @@ -1393,7 +1393,7 @@ "LabelUrl": "URL:", "LabelUserAgent": "User agent:", "LabelUserRemoteClientBitrateLimitHelp": "Přepíše výchozí globální hodnotu nastavenou v nastavení přehrávání serveru.", - "LabelVideo": "Video:", + "LabelVideo": "Video", "LabelVideoCodec": "Video kodek:", "LeaveBlankToNotSetAPassword": "Můžete ponechat prázdné pro nastavení bez hesla.", "LetterButtonAbbreviation": "A", diff --git a/src/strings/da.json b/src/strings/da.json index 74d7d21b8a..22ddc52200 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -1268,7 +1268,7 @@ "Label3DFormat": "3D format:", "LabelAlbum": "Album:", "LabelArtist": "Kunstner", - "LabelAudio": "Lyd:", + "LabelAudio": "Lyd", "LabelBitrateMbps": "Bitrate (Mbps):", "LabelBlockContentWithTags": "Blokér filer med mærkerne:", "LabelBurnSubtitles": "Brænd undertekster:", @@ -1313,7 +1313,7 @@ "LabelSortOrder": "Sorteringsorden:", "LabelSoundEffects": "Lydeffekter:", "LabelStatus": "Status:", - "LabelSubtitles": "Undertekster:", + "LabelSubtitles": "Undertekster", "LabelSyncNoTargetsHelp": "Det ser ud til at du ikke har nogen apps der understøtter offline hentning.", "LabelTVHomeScreen": "TV modus hjemmeskærm:", "LabelTag": "Mærke:", @@ -1327,7 +1327,7 @@ "LabelUrl": "Link:", "LabelVersion": "Version:", "LabelVersionNumber": "Version {0}", - "LabelVideo": "Video:", + "LabelVideo": "Video", "LabelVideoCodec": "Video codec:", "LabelWindowBackgroundColor": "Tekst baggrundsfarve:", "LabelXDlnaCap": "X-DLNA begrænsning:", diff --git a/src/strings/de.json b/src/strings/de.json index 861c57ef4b..97cb1f959e 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -758,7 +758,7 @@ "LabelSubtitleDownloaders": "Untertitel Downloader:", "LabelSubtitleFormatHelp": "Beispiel: srt", "LabelSubtitlePlaybackMode": "Untertitelmodus:", - "LabelSubtitles": "Untertitel:", + "LabelSubtitles": "Untertitel", "LabelSupportedMediaTypes": "Unterstüzte Medientypen:", "LabelTVHomeScreen": "TV-Mode Startseite:", "LabelTextBackgroundColor": "Hintergrundfarbe des Textes:", @@ -1305,7 +1305,7 @@ "Home": "Startseite", "Horizontal": "Horizontal", "LabelAlbum": "Album:", - "LabelAudio": "Audio:", + "LabelAudio": "Audio", "LabelCache": "Cache:", "LabelFormat": "Format:", "LabelH264Crf": "H264 Encodierungs-CRF:", @@ -1324,7 +1324,7 @@ "LabelTypeText": "Text", "LabelVersion": "Version:", "LabelVersionNumber": "Version {0}", - "LabelVideo": "Video:", + "LabelVideo": "Video", "LeaveBlankToNotSetAPassword": "Du kannst dieses Feld frei lassen um kein Passwort zu setzen.", "LinksValue": "Links: {0}", "MessageImageFileTypeAllowed": "Nur JPEG- und PNG-Dateien werden unterstützt.", diff --git a/src/strings/el.json b/src/strings/el.json index 8e0b77ac17..3856480fd0 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -450,7 +450,7 @@ "LabelAppNameExample": "Παράδειγμα: Sickbeard, NzbDrone", "LabelArtists": "Καλλιτέχνες:", "LabelArtistsHelp": "Ξεχωρίστε πολλαπλά χρησιμοποιώντας;", - "LabelAudio": "Ήχος:", + "LabelAudio": "Ήχος", "LabelAudioLanguagePreference": "Προτιμώμενη γλώσσα ήχου:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Αυτόματη ανανέωση μεταδεδομένων από το internet:", "LabelBirthDate": "Ημερομηνία Γενεθλίων:", @@ -664,7 +664,7 @@ "LabelStopWhenPossible": "Διακοπή όταν είναι δυνατόν:", "LabelSubtitleFormatHelp": "Παράδειγμα: srt", "LabelSubtitlePlaybackMode": "Λειτουργία υποτίτλων:", - "LabelSubtitles": "Υπότιτλοι:", + "LabelSubtitles": "Υπότιτλοι", "LabelSupportedMediaTypes": "Υποστηριζόμενοι τύποι μέσων:", "LabelTVHomeScreen": "Αρχική οθόνη λειτουργίας τηλεόρασης:", "LabelTag": "Ετικέτα:", @@ -694,7 +694,7 @@ "LabelVersion": "Έκδοση:", "LabelVersionInstalled": "{0} εγκαταστήθηκε", "LabelVersionNumber": "Έκδοση {0}", - "LabelVideo": "Βίντεο:", + "LabelVideo": "Βίντεο", "LabelXDlnaCapHelp": "Καθορίζει το περιεχόμενο του στοιχείου X_DLNACAP στο urn:schemas-dlna-org:device-1-0 namespace.", "LabelXDlnaDocHelp": "Καθορίζει το περιεχόμενο του στοιχείου X_DLNACAP στο urn:schemas-dlna-org:device-1-0 namespace.", "LabelYear": "Έτος:", diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index d5ed1acde5..757ea55266 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -806,7 +806,7 @@ "LabelTag": "Tag:", "LabelTVHomeScreen": "TV mode home screen:", "LabelSupportedMediaTypes": "Supported Media Types:", - "LabelSubtitles": "Subtitles:", + "LabelSubtitles": "Subtitles", "LabelSubtitlePlaybackMode": "Subtitle mode:", "LabelSubtitleFormatHelp": "Example: srt", "LabelSubtitleDownloaders": "Subtitle downloaders:", @@ -1167,7 +1167,7 @@ "LabelAudioChannels": "Audio channels:", "LabelAudioBitrate": "Audio bitrate:", "LabelAudioBitDepth": "Audio bit depth:", - "LabelAudio": "Audio:", + "LabelAudio": "Audio", "LabelArtistsHelp": "Separate multiple using ;", "LabelArtists": "Artists:", "LabelAppName": "App name", @@ -1336,7 +1336,7 @@ "MediaInfoSoftware": "Software", "ValueOneSeries": "1 series", "MediaInfoBitrate": "Bitrate", - "LabelVideo": "Video:", + "LabelVideo": "Video", "LabelPrevious": "Previous", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelKodiMetadataEnableExtraThumbs": "Copy extrafanart to extrathumbs field", diff --git a/src/strings/es-mx.json b/src/strings/es-mx.json index 76679b698f..1aff47675c 100644 --- a/src/strings/es-mx.json +++ b/src/strings/es-mx.json @@ -781,7 +781,7 @@ "LabelSubtitleDownloaders": "Recolectores de Subtitulos:", "LabelSubtitleFormatHelp": "Ejemplo: srt", "LabelSubtitlePlaybackMode": "Modo de subtítulo:", - "LabelSubtitles": "Subtítulos:", + "LabelSubtitles": "Subtítulos", "LabelSupportedMediaTypes": "Tipos de Medios Soportados:", "LabelTVHomeScreen": "Modo de pantalla de TV:", "LabelTag": "Etiqueta:", @@ -1365,7 +1365,7 @@ "HeaderRestartingServer": "Reiniciando servidor", "HeaderVideos": "Videos", "Horizontal": "Horizontal", - "LabelAudio": "Audio:", + "LabelAudio": "Audio", "LabelAuthProvider": "Proveedor de autenticación:", "LabelDynamicExternalId": "{0} Id:", "LabelPasswordResetProvider": "Proveedor de restablecimiento de contraseña:", @@ -1378,7 +1378,7 @@ "DashboardServerName": "Servidor: {0}", "DashboardOperatingSystem": "Sistema operativo: {0}", "DashboardArchitecture": "Arquitectura: {0}", - "LabelVideo": "Video:", + "LabelVideo": "Video", "LabelWeb": "Web: ", "LaunchWebAppOnStartup": "Iniciar la interfaz web al iniciar el servidor", "LaunchWebAppOnStartupHelp": "Abre el cliente web en su navegador web predeterminado cuando se inicia el servidor. Esto no ocurrirá cuando se utilice la función de reinicio del servidor.", diff --git a/src/strings/es.json b/src/strings/es.json index 2f3fb2769b..6666964c49 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1288,7 +1288,7 @@ "HeaderVideoType": "Tipo de vídeo", "Home": "Inicio", "Horizontal": "Horizontal", - "LabelAudio": "Audio:", + "LabelAudio": "Audio", "LabelBurnSubtitles": "Incrustar subtítulos:", "LabelDashboardTheme": "Tema para la interfaz del servidor:", "LabelDateTimeLocale": "Fecha y hora local:", @@ -1306,10 +1306,10 @@ "LabelSortBy": "Ordenar por:", "LabelSortOrder": "Orden:", "LabelSoundEffects": "Efectos de sonido:", - "LabelSubtitles": "Subtítulos:", + "LabelSubtitles": "Subtítulos", "LabelTVHomeScreen": "Modo televisión en pantalla de inicio:", "LabelVersion": "Versión:", - "LabelVideo": "Vídeo:", + "LabelVideo": "Vídeo", "LabelXDlnaCap": "X-DNLA cap:", "LabelXDlnaDoc": "X-DLNA doc:", "LearnHowYouCanContribute": "Descubre cómo puedes contribuir.", diff --git a/src/strings/fr.json b/src/strings/fr.json index 465eca15f1..aab47271c0 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -776,7 +776,7 @@ "LabelSubtitleDownloaders": "Outils de téléchargement de sous-titres :", "LabelSubtitleFormatHelp": "Exemple : srt", "LabelSubtitlePlaybackMode": "Mode des sous-titres :", - "LabelSubtitles": "Sous-titres :", + "LabelSubtitles": "Sous-titres", "LabelSupportedMediaTypes": "Types de médias supportés :", "LabelTVHomeScreen": "Écran d'accueil du mode TV :", "LabelTag": "Étiquette :", @@ -813,7 +813,7 @@ "LabelValue": "Valeur :", "LabelVersion": "Version :", "LabelVersionInstalled": "{0} installé(s)", - "LabelVideo": "Vidéo :", + "LabelVideo": "Vidéo", "LabelXDlnaCap": "Cap X-DLNA :", "LabelXDlnaCapHelp": "Détermine le contenu de l'élément X_DLNACAP dans l'espace de nom urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDoc": "Doc X-DLNA :", @@ -1339,7 +1339,7 @@ "HeaderTuners": "Égaliseur", "Horizontal": "Horizontal", "Images": "Images", - "LabelAudio": "Audio :", + "LabelAudio": "Audio", "LabelVersionNumber": "Version {0}", "LeaveBlankToNotSetAPassword": "Laissez vide pour ne pas définir de mot de passe.", "Logo": "Logo", diff --git a/src/strings/hu.json b/src/strings/hu.json index 69ce7acedd..f8dfecb6c0 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -231,7 +231,7 @@ "LabelAllowServerAutoRestart": "Automatikus újraindítás engedélyezése a szervernek a frissítések telepítéséhez", "LabelAllowServerAutoRestartHelp": "A szerver csak akkor indul újra ha nincs felhasználói tevékenység.", "LabelArtists": "Előadók:", - "LabelAudio": "Audió:", + "LabelAudio": "Audió", "LabelAudioLanguagePreference": "Audió nyelvének beállítása:", "LabelBirthYear": "Születési év:", "LabelCachePath": "Gyorsítótár útvonal:", @@ -319,7 +319,7 @@ "LabelStopping": "Megállítás", "LabelSubtitleFormatHelp": "Például: srt", "LabelSubtitlePlaybackMode": "Felirat mód:", - "LabelSubtitles": "Feliratok:", + "LabelSubtitles": "Feliratok", "LabelTagline": "Címke:", "LabelTheme": "Kinézet:", "LabelTime": "Idő:", @@ -336,7 +336,7 @@ "LabelUsername": "Felhasználónév:", "LabelVersionInstalled": "{0} telepítve", "LabelVersionNumber": "Verzió {0}", - "LabelVideo": "Videó:", + "LabelVideo": "Videó", "LabelYear": "Év:", "LabelYourFirstName": "Keresztneved:", "LabelYoureDone": "Készen vagy!", diff --git a/src/strings/it.json b/src/strings/it.json index 6ba6df0d12..cf9e06910e 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -749,7 +749,7 @@ "LabelSubtitleDownloaders": "Downloader sottotitoli:", "LabelSubtitleFormatHelp": "Esempio: srt", "LabelSubtitlePlaybackMode": "Modalità Sottotitolo:", - "LabelSubtitles": "Sottotitoli:", + "LabelSubtitles": "Sottotitoli", "LabelSupportedMediaTypes": "Tipi di media supportati:", "LabelTVHomeScreen": "Schermata iniziale della modalità TV:", "LabelTagline": "Slogan:", @@ -1317,7 +1317,7 @@ "HeaderRestartingServer": "Riavvio Server", "Home": "Home", "LabelAlbum": "Album:", - "LabelAudio": "Audio:", + "LabelAudio": "Audio", "LabelCache": "Cache:", "ButtonAddImage": "Aggiungi Immagine", "CopyStreamURL": "Copia Indirizzo dello Stream", @@ -1398,7 +1398,7 @@ "LabelTranscodingProgress": "Progresso di trascodifica:", "DashboardVersionNumber": "Versione: {0}", "DashboardServerName": "Server: {0}", - "LabelVideo": "Video:", + "LabelVideo": "Video", "DashboardArchitecture": "Architettura: {0}", "LabelWeb": "Web:", "LaunchWebAppOnStartup": "Lancia l'interfaccia web quando viene avviato il server", diff --git a/src/strings/ja.json b/src/strings/ja.json index 9a881bce0d..4a15d798c3 100644 --- a/src/strings/ja.json +++ b/src/strings/ja.json @@ -558,7 +558,7 @@ "LabelOriginalAspectRatio": "元のアスペクト比:", "LabelPrevious": "前へ", "LabelServerName": "サーバー名:", - "LabelSubtitles": "字幕:", + "LabelSubtitles": "字幕", "LabelSupportedMediaTypes": "サポートされているメディアタイプ:", "LabelTVHomeScreen": "TVモードホームスクリーン:", "LabelTextColor": "文字色:", @@ -858,7 +858,7 @@ "LabelAllowedRemoteAddresses": "リモートIPアドレスフィルター:", "LabelAppNameExample": "例: スケートボード、ソナー", "LabelArtists": "アーティスト:", - "LabelAudio": "音声:", + "LabelAudio": "音声", "LabelAudioBitDepth": "音声ビット深度:", "LabelAudioBitrate": "音声ビットレート:", "LabelAudioChannels": "音声チャンネル:", @@ -963,7 +963,7 @@ "DashboardVersionNumber": "バージョン: {0}", "DashboardServerName": "サーバー: {0}", "DashboardArchitecture": "アーキテクチャ: {0}", - "LabelVideo": "映像:", + "LabelVideo": "映像", "LabelVideoBitrate": "映像ビットレート:", "LabelYourFirstName": "名前:", "Share": "共有", diff --git a/src/strings/kk.json b/src/strings/kk.json index 665091106d..852e408a3b 100644 --- a/src/strings/kk.json +++ b/src/strings/kk.json @@ -536,7 +536,7 @@ "LabelAppNameExample": "Mysaly: Sickbeard, Sonarr", "LabelArtists": "Oryndaýshylar:", "LabelArtistsHelp": "Birneshýin mynaýmen bólińiz ;", - "LabelAudio": "Dybys:", + "LabelAudio": "Dybys", "LabelAudioLanguagePreference": "Dybys tiliniń teńshelimi:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Metaderekterdi Internetten avtomatty jańartý:", "LabelBindToLocalNetworkAddress": "Jergilikti jeli mekenjaıyna baılastyrý:", @@ -807,7 +807,7 @@ "LabelSubtitleDownloaders": "Sýbtıtrler júkteýshileri:", "LabelSubtitleFormatHelp": "Mysal: srt", "LabelSubtitlePlaybackMode": "Sýbtıtr rejimi:", - "LabelSubtitles": "Sýbtıtrler:", + "LabelSubtitles": "Sýbtıtrler", "LabelSupportedMediaTypes": "Qoldaýdaǵy tasyǵyshderekter túrleri:", "LabelTVHomeScreen": "TD rejimindegi basqy ekran:", "LabelTag": "Teg:", @@ -849,7 +849,7 @@ "LabelVersion": "Nusqa:", "LabelVersionInstalled": "{0} ornatylǵan", "LabelVersionNumber": "Nýsqasy: {0}", - "LabelVideo": "Beıne:", + "LabelVideo": "Beıne", "LabelXDlnaCap": "X-DLNA sıpattary:", "LabelXDlnaCapHelp": "urn:schemas-dlna-org:device-1-0 ataýlar keńistigindegi X_DLNACAP elementi mazmunyn anyqtaıdy.", "LabelXDlnaDoc": "X-DLNA tásimi:", diff --git a/src/strings/ko.json b/src/strings/ko.json index b96642d8d1..833f8ccb10 100644 --- a/src/strings/ko.json +++ b/src/strings/ko.json @@ -1025,7 +1025,7 @@ "LabelWeb": "웹:", "LabelVideoCodec": "비디오 코덱:", "LabelVideoBitrate": "비디오 비트레이트:", - "LabelVideo": "비디오:", + "LabelVideo": "비디오", "DashboardArchitecture": "아키텍처: {0}", "DashboardOperatingSystem": "운영체제: {0}", "DashboardServerName": "서버: {0}", @@ -1042,7 +1042,7 @@ "LabelTheme": "테마:", "LabelTextSize": "글자 크기:", "LabelTextColor": "글자 색:", - "LabelSubtitles": "자막:", + "LabelSubtitles": "자막", "LabelSubtitleFormatHelp": "예시: srt", "LabelSubtitleDownloaders": "자막 다운로더:", "LabelStopping": "중지", @@ -1082,7 +1082,7 @@ "LabelAudioCodec": "오디오 코덱:", "LabelAudioChannels": "오디오 채널:", "LabelAudioBitrate": "오디오 비트레이트:", - "LabelAudio": "오디오:", + "LabelAudio": "오디오", "Items": "항목", "Kids": "어린이", "Home": "홈", diff --git a/src/strings/lt-lt.json b/src/strings/lt-lt.json index 07d1b790af..c87628316c 100644 --- a/src/strings/lt-lt.json +++ b/src/strings/lt-lt.json @@ -784,7 +784,7 @@ "HeaderLoginFailure": "Prisijungimo klaida", "Hide": "Paslėpti", "LabelAll": "Visi", - "LabelAudio": "Garsas:", + "LabelAudio": "Garsas", "LabelCancelled": "Atšaukta", "LabelCertificatePassword": "Sertifikato slaptažodis:", "LabelCertificatePasswordHelp": "Jei sertifikatui reikalingas slaptažodis, jį įveskite čia.", diff --git a/src/strings/lv.json b/src/strings/lv.json index 660ebcd971..8c19b23ad7 100644 --- a/src/strings/lv.json +++ b/src/strings/lv.json @@ -52,7 +52,7 @@ "LabelVideoResolution": "Video izšķirtspēja:", "LabelVideoCodec": "Video kodeks:", "LabelVideoBitrate": "Video bitu-ātrums:", - "LabelVideo": "Video:", + "LabelVideo": "Video", "DashboardArchitecture": "Arhitektūra: {0}", "DashboardOperatingSystem": "Operētājsistēma: {0}", "DashboardServerName": "Serveris: {0}", @@ -85,7 +85,7 @@ "LabelTag": "Tags:", "LabelTVHomeScreen": "TV režīma mājas ekrāns:", "LabelSupportedMediaTypes": "Atbalstītie Multivides Veidi:", - "LabelSubtitles": "Subtitri:", + "LabelSubtitles": "Subtitri", "LabelSubtitlePlaybackMode": "Subtitru veids:", "LabelSubtitleFormatHelp": "Piemērs: srt", "LabelSubtitleDownloaders": "Subtitru lejupielādētāji:", @@ -222,7 +222,7 @@ "LabelBirthYear": "Dzimšanas gads:", "LabelBirthDate": "Dzimšanas datums:", "LabelAudioLanguagePreference": "Ieteicamā audio valoda:", - "LabelAudio": "Audio:", + "LabelAudio": "Audio", "LabelArtistsHelp": "Atdali vairākus izmantojot ;", "LabelArtists": "Izpildītājs:", "LabelAppNameExample": "Piemēram: Sickbeard, Sonarr", diff --git a/src/strings/nb.json b/src/strings/nb.json index 373cdc8a55..3d863d17e0 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -1179,7 +1179,7 @@ "MediaInfoSampleRate": "Samplingsfrekvens", "MediaInfoStreamTypeData": "Data", "Option3D": "3D", - "LabelVideo": "Video:", + "LabelVideo": "Video", "OptionAlbum": "Album", "OptionAlbumArtist": "Albumartist", "Filters": "Filtre", @@ -1313,7 +1313,7 @@ "Horizontal": "Horisontal", "HttpsRequiresCert": "For å bruke sikker tilkobling må du legge inn et klarert SSL-sertifikat, for eksempel fra Let's Encrypt. Du må enten legge inn et sertifikat, eller deaktivere sikker tilkobling.", "LabelAlbumArtPN": "Albumomslag PN:", - "LabelAudio": "Lyd:", + "LabelAudio": "Lyd", "LabelAuthProvider": "Autentiserings-metode:", "LabelBitrate": "Bithastighet:", "LabelBurnSubtitles": "Brenn inn undertekst:", @@ -1342,7 +1342,7 @@ "LabelSpecialSeasonsDisplayName": "Visningsnavn for spesialsesong:", "LabelStatus": "Status:", "LabelSubtitleDownloaders": "Kilder for undertekst:", - "LabelSubtitles": "Undertekster:", + "LabelSubtitles": "Undertekster", "LabelTVHomeScreen": "Hjemskjerm for TV-modus:", "LabelTag": "Tagg:", "LabelTextBackgroundColor": "Tekstbagrunnsfarge:", diff --git a/src/strings/nl.json b/src/strings/nl.json index 5ca394dc26..2acfe83414 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -744,7 +744,7 @@ "LabelSubtitleDownloaders": "Ondertiteldownloaders:", "LabelSubtitleFormatHelp": "Voorbeeld: srt", "LabelSubtitlePlaybackMode": "Ondertitel mode:", - "LabelSubtitles": "Ondertitels:", + "LabelSubtitles": "Ondertitels", "LabelSupportedMediaTypes": "Ondersteunde Media Types:", "LabelTVHomeScreen": "TV mode begin scherm", "LabelTextBackgroundColor": "Tekst achtergrond kleur:", @@ -1310,7 +1310,7 @@ "ItemCount": "{0} items", "Items": "Items", "LabelAlbum": "Album:", - "LabelAudio": "Audio:", + "LabelAudio": "Audio", "LabelAuthProvider": "Authenticatie Aanbieder:", "LabelCache": "Cache:", "LabelDidlMode": "DIDL mode:", @@ -1429,7 +1429,7 @@ "LabelXDlnaCap": "X-DLNA cap:", "DashboardVersionNumber": "Versie: {0}", "DashboardArchitecture": "Architectuur: {0}", - "LabelVideo": "Video:", + "LabelVideo": "Video", "MediaInfoStreamTypeAudio": "Audio", "MediaInfoStreamTypeData": "Data", "MediaInfoStreamTypeSubtitle": "Ondertiteling", diff --git a/src/strings/pl.json b/src/strings/pl.json index 71a4ba06e9..32e9a97980 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -523,7 +523,7 @@ "LabelAppNameExample": "Przykład: Sickbeard, Sonarr", "LabelArtists": "Wykonawcy:", "LabelArtistsHelp": "Oddzielaj używając ;", - "LabelAudio": "Dźwięk:", + "LabelAudio": "Dźwięk", "LabelAudioLanguagePreference": "Preferowany język ścieżki dźwiękowej:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Odświeżaj automatycznie metadane z Internetu:", "LabelBindToLocalNetworkAddress": "Przypisz do lokalnego adresu sieciowego:", @@ -789,7 +789,7 @@ "LabelSubtitleDownloaders": "Dostawcy napisów:", "LabelSubtitleFormatHelp": "Przykład: srt", "LabelSubtitlePlaybackMode": "Tryb napisów:", - "LabelSubtitles": "Napisy:", + "LabelSubtitles": "Napisy", "LabelSupportedMediaTypes": "Obsługiwane typy mediów:", "LabelTVHomeScreen": "Ekran startowy trybu telewizyjnego:", "LabelTag": "Znacznik:", @@ -827,7 +827,7 @@ "LabelVersion": "Wersja:", "LabelVersionInstalled": "Zainstalowano {0}", "LabelVersionNumber": "Wersja {0}", - "LabelVideo": "Wideo:", + "LabelVideo": "Wideo", "LabelXDlnaCapHelp": "Określa zawartość elementu X_DLNACAP w przestrzeni nazw urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDocHelp": "Określa zawartość elementu X_DLNADOC w przestrzeni nazw urn:schemas-dlna-org:device-1-0.", "LabelYear": "Rok:", diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index c5b426fead..f1bffad58c 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -506,7 +506,7 @@ "LabelAppNameExample": "Exemplo: Sickbeard, Sonarr", "LabelArtists": "Artistas:", "LabelArtistsHelp": "Separa vários usando ;", - "LabelAudio": "Áudio:", + "LabelAudio": "Áudio", "LabelAudioLanguagePreference": "Idioma preferido de áudio:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Atualizar automaticamente os metadados da internet:", "LabelBindToLocalNetworkAddress": "Vincular a um endereço de rede local:", @@ -768,7 +768,7 @@ "LabelSubtitleDownloaders": "Downloaders de legendas:", "LabelSubtitleFormatHelp": "Exemplo: srt", "LabelSubtitlePlaybackMode": "Modo de legenda:", - "LabelSubtitles": "Legendas:", + "LabelSubtitles": "Legendas", "LabelSupportedMediaTypes": "Tipos de Mídia Suportados:", "LabelTVHomeScreen": "Tela inicial do modo TV:", "LabelTagline": "Slogan:", @@ -804,7 +804,7 @@ "LabelVersion": "Versão:", "LabelVersionInstalled": "{0} instalado", "LabelVersionNumber": "Versão {0}", - "LabelVideo": "Vídeo:", + "LabelVideo": "Vídeo", "LabelXDlnaCapHelp": "Determina o conteúdo do elemento X_DLNACAP no namespace urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDocHelp": "Determina o conteúdo do elemento X_DLNADOC no namespace urn:schemas-dlna-org:device-1-0.", "LabelYear": "Ano:", diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index f80bc1f5aa..d4a81580f2 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -955,7 +955,7 @@ "LabelBindToLocalNetworkAddress": "Endereço local para colocar o servidor à escuta:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Atualizar metadados automaticamente a partir da Internet:", "LabelAuthProvider": "Provedor de autenticação:", - "LabelAudio": "Áudio:", + "LabelAudio": "Áudio", "LabelAllowedRemoteAddressesMode": "Tipo de filtro de IP remoto:", "LabelAllowedRemoteAddresses": "Filtro de IP remoto:", "LabelAllowHWTranscoding": "Permitir transcodificação por hardware", @@ -1306,7 +1306,7 @@ "LabelWeb": "Web:", "LabelVideoCodec": "Codec de vídeo:", "LabelVideoBitrate": "Taxa de bits de vídeo:", - "LabelVideo": "Vídeo:", + "LabelVideo": "Vídeo", "DashboardArchitecture": "Arquitetura: {0}", "DashboardOperatingSystem": "Sistema Operativo: {0}", "DashboardServerName": "Servidor: {0}", @@ -1320,7 +1320,7 @@ "LabelTextColor": "Côr do texto:", "LabelTextBackgroundColor": "Côr de fundo do texto:", "LabelTag": "Etiqueta:", - "LabelSubtitles": "Legendas:", + "LabelSubtitles": "Legendas", "LabelSportsCategories": "Categorias de Desporto:", "FetchingData": "A transferir informação adicional", "List": "lista", diff --git a/src/strings/pt.json b/src/strings/pt.json index a7cd41299d..57787e93eb 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -450,7 +450,7 @@ "LabelAudioCodec": "Codec de áudio:", "LabelAudioChannels": "Canais de áudio:", "LabelAudioBitrate": "Taxa de bits de áudio:", - "LabelAudio": "Áudio:", + "LabelAudio": "Áudio", "LabelArtistsHelp": "Separe múltiplos com ;", "LabelArtists": "Artistas:", "LabelAppNameExample": "Exemplo: Sickbeard, NzbDrone", diff --git a/src/strings/ro.json b/src/strings/ro.json index a5b938e7ee..427ccff485 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -653,7 +653,7 @@ "LabelTag": "Etichetă:", "LabelTVHomeScreen": "Ecran de pornire în modul TV:", "LabelSupportedMediaTypes": "Tipuri media suportate:", - "LabelSubtitles": "Subtitrări:", + "LabelSubtitles": "Subtitrări", "LabelSubtitlePlaybackMode": "Mod subtitrare:", "LabelSubtitleFormatHelp": "Exemplu: srt", "LabelSubtitleDownloaders": "Descărcare subtitrări:", @@ -903,7 +903,7 @@ "LabelAudioChannels": "Canale audio:", "LabelAudioBitrate": "Rata de biți audio:", "LabelAudioBitDepth": "Adâncimea bitului audio:", - "LabelAudio": "Audio:", + "LabelAudio": "Audio", "LabelAppNameExample": "Exemplu: Sickbeard, Sonarr", "LabelAppName": "Nume app", "LabelAllowedRemoteAddressesMode": "Modul de filtrare a adresei IP de la distanță:", @@ -1146,7 +1146,7 @@ "LabelWeb": "Web:", "LabelVideoCodec": "Codec video:", "LabelVideoBitrate": "Rata de biți a video-ului:", - "LabelVideo": "Video:", + "LabelVideo": "Video", "DashboardArchitecture": "Arhitectură: {0}", "DashboardOperatingSystem": "Sistem de operare: {0}", "DashboardServerName": "Server: {0}", diff --git a/src/strings/ru.json b/src/strings/ru.json index 4986855da5..d50bcaccaa 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -525,7 +525,7 @@ "LabelAppNameExample": "Пример: Sickbeard, Sonarr", "LabelArtists": "Исполнители:", "LabelArtistsHelp": "Для разделения используйте точку с запятой ;", - "LabelAudio": "Аудио:", + "LabelAudio": "Аудио", "LabelAudioLanguagePreference": "Выбор языка аудио:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Автоматически обновлять метаданные из Интернета:", "LabelBindToLocalNetworkAddress": "Привязка к адресу в локальной сети:", @@ -792,7 +792,7 @@ "LabelSubtitleDownloaders": "Загрузчики субтитров:", "LabelSubtitleFormatHelp": "Пример: srt", "LabelSubtitlePlaybackMode": "Режим субтитров:", - "LabelSubtitles": "Субтитры:", + "LabelSubtitles": "Субтитры", "LabelSupportedMediaTypes": "Поддерживаемые типы медиаданных:", "LabelTVHomeScreen": "Главная страница ТВ-режима:", "LabelTag": "Тег:", @@ -830,7 +830,7 @@ "LabelVersion": "Версия:", "LabelVersionInstalled": "Установлена: {0}", "LabelVersionNumber": "Версия {0}", - "LabelVideo": "Видео:", + "LabelVideo": "Видео", "LabelXDlnaCap": "Свойства X-Dlna:", "LabelXDlnaCapHelp": "Определяется содержание из элемента X_DLNACAP во пространстве имён urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDoc": "Схема X-Dlna:", diff --git a/src/strings/sk.json b/src/strings/sk.json index 2727fe01d1..e0bebec52f 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -471,7 +471,7 @@ "LabelStartWhenPossible": "Spustiť akonáhle je možné:", "LabelStatus": "Stav:", "LabelSubtitleFormatHelp": "Príklad: srt", - "LabelSubtitles": "Titulky:", + "LabelSubtitles": "Titulky", "LabelSupportedMediaTypes": "Podporované typy médií:", "LabelTextBackgroundColor": "Farba pozadia textu:", "LabelTextColor": "Farba textu:", @@ -960,7 +960,7 @@ "HeaderVideoType": "Typ videa", "HeaderVideoTypes": "Typy videí", "LabelAirsBeforeSeason": "Vysielané pred sériou:", - "LabelAudio": "Zvuk:", + "LabelAudio": "Zvuk", "LabelBlockContentWithTags": "Blokovať položky s tagmi:", "LabelDisplayMode": "Režim zobrazenia:", "LabelDisplaySpecialsWithinSeasons": "Zobraziť špeciálne epizódy v sérií, v ktorej boli odvysielané", @@ -1327,7 +1327,7 @@ "LabelXDlnaCap": "X-DLNA cap:", "LabelVideoCodec": "Video kodek:", "LabelVideoBitrate": "Dátový tok videa:", - "LabelVideo": "Video:", + "LabelVideo": "Video", "LabelVaapiDeviceHelp": "Toto je vykreslovací node, ktorý sa používa na hardvérovú akceleráciu.", "LabelVaapiDevice": "VA API zariadenie:", "LabelUserRemoteClientBitrateLimitHelp": "Prepíše východzie globálne hodnoty nastavené v nastavení prehrávania servera.", diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index 9b74efe3a7..a692edbd3f 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -594,7 +594,7 @@ "LabelAppName": "Ime aplikacije", "LabelAppNameExample": "Primer: Sickbeard, Sonarr", "LabelArtistsHelp": "Loči več z ;", - "LabelAudio": "Zvok:", + "LabelAudio": "Zvok", "LabelAudioBitrate": "Bitna hitrost zvoka:", "LabelAudioChannels": "Kanali zvoka:", "LabelAudioCodec": "Zvočni kodek:", @@ -1185,7 +1185,7 @@ "LabelTextBackgroundColor": "Barva ozadja besedila:", "LabelTag": "Oznaka:", "LabelSupportedMediaTypes": "Podprti tipi predstavnosti:", - "LabelSubtitles": "Podnapisi:", + "LabelSubtitles": "Podnapisi", "LabelSubtitlePlaybackMode": "Način podnapisov:", "LabelSubtitleFormatHelp": "Primer: srt", "LabelSubtitleDownloaders": "Pridobivanje podnapisov:", diff --git a/src/strings/sv.json b/src/strings/sv.json index 2dd5ec2dc2..595780f070 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -480,7 +480,7 @@ "LabelAppNameExample": "Exempel: Sickbeard, Sonarr", "LabelArtists": "Artister:", "LabelArtistsHelp": "Separera med vid flera ;", - "LabelAudio": "Ljud:", + "LabelAudio": "Ljud", "LabelAudioLanguagePreference": "Önskat ljudspråk:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Uppdatera metadata automatiskt ifrån internet:", "LabelBindToLocalNetworkAddress": "Knyt till lokal nätverksadress:", @@ -740,7 +740,7 @@ "LabelSubtitleDownloaders": "Undertextskällor:", "LabelSubtitleFormatHelp": "Exempel: srt", "LabelSubtitlePlaybackMode": "Undertextläge:", - "LabelSubtitles": "Undertexter:", + "LabelSubtitles": "Undertexter", "LabelSupportedMediaTypes": "Mediaformat som stöds:", "LabelTVHomeScreen": "Hemskärm i TV-läge:", "LabelTag": "Etikett:", @@ -1451,7 +1451,7 @@ "LabelVideoResolution": "Video upplösning:", "LabelVideoCodec": "Video codec:", "LabelVideoBitrate": "Video bitrate:", - "LabelVideo": "Video:", + "LabelVideo": "Video", "DashboardArchitecture": "Arkitektur: {0}", "DashboardOperatingSystem": "Operativsystem: {0}", "DashboardServerName": "Server: {0}", diff --git a/src/strings/tr.json b/src/strings/tr.json index 7d2afd756f..5588a3091e 100644 --- a/src/strings/tr.json +++ b/src/strings/tr.json @@ -649,7 +649,7 @@ "LabelAudioSampleRate": "Ses örnekleme hızı:", "LabelAudioCodec": "Ses kodeği:", "LabelAudioChannels": "Ses kanalları:", - "LabelAudio": "Ses:", + "LabelAudio": "Ses", "LabelAppName": "Uygulama adı", "LabelAllowHWTranscoding": "Donanım kod dönüştürmesine izin ver", "LabelAll": "Tümü", diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 271be38b5f..1a3aa1e4de 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -753,7 +753,7 @@ "LabelSubtitleDownloaders": "字幕下载器:", "LabelSubtitleFormatHelp": "例如:SRT", "LabelSubtitlePlaybackMode": "字幕模式:", - "LabelSubtitles": "字幕:", + "LabelSubtitles": "字幕", "LabelSupportedMediaTypes": "支持的媒体类型:", "LabelTVHomeScreen": "TV 模式主屏幕:", "LabelTag": "标签:", @@ -1327,7 +1327,7 @@ "HeaderFavoriteVideos": "最爱的视频", "HeaderVideoType": "视频类型", "Items": "项目", - "LabelAudio": "音频:", + "LabelAudio": "音频", "LabelServerName": "服务器名称:", "LabelTranscodePath": "转码路径:", "LabelTranscodes": "转码:", @@ -1363,7 +1363,7 @@ "LabelUserLoginAttemptsBeforeLockout": "用户被封禁前可尝试的次数:", "DashboardVersionNumber": "版本:{0}", "DashboardServerName": "服务器:{0}", - "LabelVideo": "视频:", + "LabelVideo": "视频", "LabelWeb": "网站:", "LeaveBlankToNotSetAPassword": "您可以将此字段留空以设置空密码。", "LinksValue": "链接:{0}", diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index 59ab7fcdda..718cb4d572 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -915,7 +915,7 @@ "LabelAppNameExample": "例如: Sickbeard, Sonarr", "LabelArtists": "藝人:", "LabelArtistsHelp": "分開多重使用 ;", - "LabelAudio": "音頻:", + "LabelAudio": "音頻", "LabelAuthProvider": "認證提供者:", "LabelAutomaticallyRefreshInternetMetadataEvery": "從網路自動刷新數據:", "LabelBindToLocalNetworkAddress": "聯結本地網絡地址:", @@ -1044,7 +1044,7 @@ "LabelExtractChaptersDuringLibraryScan": "於媒體庫掃描時擷取章節圖片", "LabelHttpsPort": "本地 HTTPS 端口:", "LabelFailed": "失敗", - "LabelSubtitles": "字幕:", + "LabelSubtitles": "字幕", "LabelSupportedMediaTypes": "支援的媒體類型:", "LabelTextBackgroundColor": "文字背景顏色:", "LabelTextColor": "文字顏色:", @@ -1060,7 +1060,7 @@ "LabelTypeText": "文本", "LabelUsername": "使用者名稱:", "DashboardOperatingSystem": "作業系統:{0}", - "LabelVideo": "影片:", + "LabelVideo": "影片", "LabelVideoCodec": "影片編碼:", "LabelYear": "年:", "LatestFromLibrary": "最新 {0}", From 37ebb772e8443c602f61d7f8746b98aa008789e5 Mon Sep 17 00:00:00 2001 From: Fernando Date: Thu, 26 Mar 2020 19:25:34 +0000 Subject: [PATCH 072/120] Translated using Weblate (Spanish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/ --- src/strings/es.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/strings/es.json b/src/strings/es.json index 3d56ff56d8..f99c06410e 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -5,7 +5,7 @@ "AddToCollection": "Añadir a la colección", "AddToPlaylist": "Añadir a la lista de reproducción", "AddedOnValue": "Añadido {0}", - "AdditionalNotificationServices": "Visite el catálogo de complementos para instalar servicios de notificación adicionales.", + "AdditionalNotificationServices": "Visite el catálogo de extensiones para instalar servicios de notificación adicionales.", "Albums": "Álbumes", "Alerts": "Alertas", "All": "Todo", @@ -40,7 +40,7 @@ "Box": "Caja", "BoxRear": "Caja (trasera)", "Browse": "Explorar", - "BrowsePluginCatalogMessage": "Navegar el catalogo de complementos para ver los complementos disponibles.", + "BrowsePluginCatalogMessage": "Explore el catálogo de extensiones para ver las extensiones disponibles.", "ButtonAdd": "Añadir", "ButtonAddMediaLibrary": "Añadir biblioteca de medios", "ButtonAddScheduledTaskTrigger": "Agregar Activador", @@ -818,16 +818,16 @@ "MessageItemSaved": "Elemento grabado.", "MessageItemsAdded": "Ítems añadidos.", "MessageLeaveEmptyToInherit": "Dejar en blanco para heredar la configuración del elemento padre, o el valor global por defecto.", - "MessageNoAvailablePlugins": "No hay complementos disponibles.", + "MessageNoAvailablePlugins": "No hay extensiones disponibles.", "MessageNoMovieSuggestionsAvailable": "No hay sugerencias de películas disponibles. Comience ver y calificar sus películas y vuelva para ver las recomendaciones.", - "MessageNoPluginsInstalled": "No tiene complementos instalados.", + "MessageNoPluginsInstalled": "No hay extensiones instaladas.", "MessageNoTrailersFound": "No se han encontrado tráilers. Instala el canal de tráilers para mejorar su experiencia añadiendo una biblioteca de tráilers por internet.", "MessageNothingHere": "Nada aquí.", "MessagePasswordResetForUsers": "Se ha restablecido las contraseñas a los siguientes usuarios. Ahora pueden iniciar sesión con los códigos PIN que usaron para el restablecimiento.", "MessagePleaseEnsureInternetMetadata": "Asegúrate de que la descarga de etiquetas desde internet está activada.", "MessagePleaseWait": "Por favor, espere.", "MessagePluginConfigurationRequiresLocalAccess": "Para configurar este complemento inicia sesión en tu servidor local directamente.", - "MessagePluginInstallDisclaimer": "Los complementos creados por los miembros de la comunidad de Jellyfin son una buena forma de mejorar tu experiencia Jellyfin con características adicionales y otros beneficios. Antes de instalarlos considera los efectos que pueden tener en tu servidor Jellyfin, como escaneos de la biblioteca más largos, procesado en segundo plano adicional y una reducción de la estabilidad del sistema.", + "MessagePluginInstallDisclaimer": "Las extensiones creadas por los miembros de la comunidad de Jellyfin son una buena forma de mejorar tu experiencia con características adicionales y otros beneficios. Antes de instalarlos considera los efectos que pueden tener en tu servidor Jellyfin, como escaneos de la biblioteca más largos, procesado en segundo plano adicional y una reducción de la estabilidad del sistema.", "MessageReenableUser": "Mira abajo para reactivarlo", "MessageSettingsSaved": "Ajustes guardados.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Se eliminarán las siguientes ubicaciones de medios de tu biblioteca:", @@ -1138,7 +1138,7 @@ "TabMovies": "Películas", "TabMusic": "Música", "TabMusicVideos": "Videos musicales", - "TabMyPlugins": "Mis complementos", + "TabMyPlugins": "Mis extensiones", "TabNetworks": "Cadenas", "TabNfoSettings": "Ajustes de NFO", "TabNotifications": "Notificaciones", @@ -1418,7 +1418,7 @@ "TV": "Televisión", "TabInfo": "Info", "TabLogs": "Registros", - "TabPlugins": "Complementos", + "TabPlugins": "Extensiones", "TabSeries": "Series", "TabTrailers": "Tráilers", "TagsValue": "Etiquetas: {0}", From 499f9835b48fa27847f368dd0c6f5737363a7644 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 26 Mar 2020 21:04:37 +0100 Subject: [PATCH 073/120] Remove Last Played label on details page --- src/assets/css/librarybrowser.css | 3 ++- src/controllers/itemdetailpage.js | 13 ------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index b599ddde33..4e3f36921d 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -1140,11 +1140,12 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards { } .trackSelections .selectContainer { - margin: 0 0 0.15em !important; + margin: 0 0 0.3em !important; } .detailsGroupItem .label, .trackSelections .selectContainer .selectLabel { + cursor: default; flex-grow: 0; flex-shrink: 0; flex-basis: 6.25em; diff --git a/src/controllers/itemdetailpage.js b/src/controllers/itemdetailpage.js index 3d74ab4327..23a672751c 100644 --- a/src/controllers/itemdetailpage.js +++ b/src/controllers/itemdetailpage.js @@ -703,18 +703,6 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } } - function renderUserInfo(page, item) { - var lastPlayedElement = page.querySelector(".itemLastPlayed"); - - if (item.UserData && item.UserData.LastPlayedDate) { - lastPlayedElement.classList.remove("hide"); - var datePlayed = datetime.parseISO8601Date(item.UserData.LastPlayedDate); - lastPlayedElement.innerHTML = globalize.translate("DatePlayed") + ": " + datetime.toLocaleDateString(datePlayed) + " " + datetime.getDisplayTime(datePlayed); - } else { - lastPlayedElement.classList.add("hide"); - } - } - function renderLinks(linksElem, item) { var html = []; @@ -1123,7 +1111,6 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti reloadUserDataButtons(page, item); renderLinks(externalLinksElem, item); - renderUserInfo(page, item); renderTags(page, item); renderSeriesAirTime(page, item, isStatic); } From af3176af7c31e50bb94c6a12337b6966b8ff1a6a Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 26 Mar 2020 21:13:26 +0100 Subject: [PATCH 074/120] Fix oversized track selector on details page --- src/assets/css/librarybrowser.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index 4e3f36921d..965adec943 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -1159,6 +1159,7 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards { .trackSelections .selectContainer .detailTrackSelect { font-size: inherit; padding: 0; + overflow: hidden; } .trackSelections .selectContainer .selectArrowContainer .selectArrow { From f3b5c804a323a72803824e673936f3b72447b90b Mon Sep 17 00:00:00 2001 From: Cameron Cordes Date: Thu, 19 Mar 2020 21:20:47 -0400 Subject: [PATCH 075/120] Migrate some easy components to ES6 --- package.json | 22 +- src/components/filedownloader.js | 28 +- src/components/filesystem.js | 29 +-- src/components/input/keyboardnavigation.js | 290 ++++++++++----------- src/components/sanitizefilename.js | 154 ++++++----- 5 files changed, 256 insertions(+), 267 deletions(-) diff --git a/package.json b/package.json index 2de78b821c..9bf666a74e 100644 --- a/package.json +++ b/package.json @@ -70,11 +70,23 @@ "whatwg-fetch": "^3.0.0" }, "babel": { - "presets": ["@babel/preset-env"], - "overrides": [{ - "test": ["src/components/cardbuilder/cardBuilder.js"], - "plugins": ["@babel/plugin-transform-modules-amd"] - }] + "presets": [ + "@babel/preset-env" + ], + "overrides": [ + { + "test": [ + "src/components/cardbuilder/cardBuilder.js", + "src/components/filedownloader.js", + "src/components/filesystem.js", + "src/components/input/keyboardnavigation.js", + "src/components/sanatizefilename.js" + ], + "plugins": [ + "@babel/plugin-transform-modules-amd" + ] + } + ] }, "browserslist": [ "last 2 Firefox versions", diff --git a/src/components/filedownloader.js b/src/components/filedownloader.js index 08b6176a02..d64e48967c 100644 --- a/src/components/filedownloader.js +++ b/src/components/filedownloader.js @@ -1,18 +1,14 @@ -define(['multi-download'], function (multiDownload) { - 'use strict'; +import multiDownload from "multi-download" - return { - download: function (items) { +export function download(items) { - if (window.NativeShell) { - items.map(function (item) { - window.NativeShell.downloadFile(item.url); - }); - } else { - multiDownload(items.map(function (item) { - return item.url; - })); - } - } - }; -}); + if (window.NativeShell) { + items.map(function (item) { + window.NativeShell.downloadFile(item.url); + }); + } else { + multiDownload(items.map(function (item) { + return item.url; + })); + } +} diff --git a/src/components/filesystem.js b/src/components/filesystem.js index aac697415e..3c14020d1a 100644 --- a/src/components/filesystem.js +++ b/src/components/filesystem.js @@ -1,18 +1,13 @@ -define([], function () { - 'use strict'; +export function fileExists(path) { + if (window.NativeShell && window.NativeShell.FileSystem) { + return window.NativeShell.FileSystem.fileExists(path); + } + return Promise.reject(); +} - return { - fileExists: function (path) { - if (window.NativeShell && window.NativeShell.FileSystem) { - return window.NativeShell.FileSystem.fileExists(path); - } - return Promise.reject(); - }, - directoryExists: function (path) { - if (window.NativeShell && window.NativeShell.FileSystem) { - return window.NativeShell.FileSystem.directoryExists(path); - } - return Promise.reject(); - } - }; -}); +export function directoryExists(path) { + if (window.NativeShell && window.NativeShell.FileSystem) { + return window.NativeShell.FileSystem.directoryExists(path); + } + return Promise.reject(); +} diff --git a/src/components/input/keyboardnavigation.js b/src/components/input/keyboardnavigation.js index 0359ee7430..bdcb733179 100644 --- a/src/components/input/keyboardnavigation.js +++ b/src/components/input/keyboardnavigation.js @@ -1,165 +1,157 @@ -define(["inputManager", "layoutManager"], function (inputManager, layoutManager) { - "use strict"; +import inputManager from "inputManager"; +import layoutManager from "layoutManager"; - /** - * Key name mapping. - */ - // Add more to support old browsers - var KeyNames = { - 13: "Enter", - 19: "Pause", - 27: "Escape", - 32: "Space", - 37: "ArrowLeft", - 38: "ArrowUp", - 39: "ArrowRight", - 40: "ArrowDown", - // MediaRewind (Tizen/WebOS) - 412: "MediaRewind", - // MediaStop (Tizen/WebOS) - 413: "MediaStop", - // MediaPlay (Tizen/WebOS) - 415: "MediaPlay", - // MediaFastForward (Tizen/WebOS) - 417: "MediaFastForward", - // Back (WebOS) - 461: "Back", - // Back (Tizen) - 10009: "Back", - // MediaTrackPrevious (Tizen) - 10232: "MediaTrackPrevious", - // MediaTrackNext (Tizen) - 10233: "MediaTrackNext", - // MediaPlayPause (Tizen) - 10252: "MediaPlayPause" - }; +/** + * Key name mapping. + */ +const KeyNames = { + 13: "Enter", + 19: "Pause", + 27: "Escape", + 32: "Space", + 37: "ArrowLeft", + 38: "ArrowUp", + 39: "ArrowRight", + 40: "ArrowDown", + // MediaRewind (Tizen/WebOS) + 412: "MediaRewind", + // MediaStop (Tizen/WebOS) + 413: "MediaStop", + // MediaPlay (Tizen/WebOS) + 415: "MediaPlay", + // MediaFastForward (Tizen/WebOS) + 417: "MediaFastForward", + // Back (WebOS) + 461: "Back", + // Back (Tizen) + 10009: "Back", + // MediaTrackPrevious (Tizen) + 10232: "MediaTrackPrevious", + // MediaTrackNext (Tizen) + 10233: "MediaTrackNext", + // MediaPlayPause (Tizen) + 10252: "MediaPlayPause" +}; - /** - * Keys used for keyboard navigation. - */ - var NavigationKeys = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"]; +/** + * Keys used for keyboard navigation. + */ +const NavigationKeys = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"]; - var hasFieldKey = false; - try { - hasFieldKey = "key" in new KeyboardEvent("keydown"); - } catch (e) { - console.error("error checking 'key' field"); +let hasFieldKey = false; +try { + hasFieldKey = "key" in new KeyboardEvent("keydown"); +} catch (e) { + console.error("error checking 'key' field"); +} + +if (!hasFieldKey) { + // Add [a..z] + for (let i = 65; i <= 90; i++) { + KeyNames[i] = String.fromCharCode(i).toLowerCase(); } +} - if (!hasFieldKey) { - // Add [a..z] - for (var i = 65; i <= 90; i++) { - KeyNames[i] = String.fromCharCode(i).toLowerCase(); +/** + * Returns key name from event. + * + * @param {KeyboardEvent} event keyboard event + * @return {string} key name + */ +export function getKeyName(event) { + return KeyNames[event.keyCode] || event.key; +} + +/** + * Returns _true_ if key is used for navigation. + * + * @param {string} key name + * @return {boolean} _true_ if key is used for navigation + */ +export function isNavigationKey(key) { + return NavigationKeys.indexOf(key) != -1; +} + +export function enable() { + document.addEventListener("keydown", function (e) { + const key = getKeyName(e); + + // Ignore navigation keys for non-TV + if (!layoutManager.tv && isNavigationKey(key)) { + return; } - } - /** - * Returns key name from event. - * - * @param {KeyboardEvent} keyboard event - * @return {string} key name - */ - function getKeyName(event) { - return KeyNames[event.keyCode] || event.key; - } + let capture = true; - /** - * Returns _true_ if key is used for navigation. - * - * @param {string} key name - * @return {boolean} _true_ if key is used for navigation - */ - function isNavigationKey(key) { - return NavigationKeys.indexOf(key) != -1; - } + switch (key) { + case "ArrowLeft": + inputManager.handle("left"); + break; + case "ArrowUp": + inputManager.handle("up"); + break; + case "ArrowRight": + inputManager.handle("right"); + break; + case "ArrowDown": + inputManager.handle("down"); + break; - function enable() { - document.addEventListener("keydown", function (e) { - var key = getKeyName(e); + case "Back": + inputManager.handle("back"); + break; - // Ignore navigation keys for non-TV - if (!layoutManager.tv && isNavigationKey(key)) { - return; - } - - var capture = true; - - switch (key) { - case "ArrowLeft": - inputManager.handle("left"); - break; - case "ArrowUp": - inputManager.handle("up"); - break; - case "ArrowRight": - inputManager.handle("right"); - break; - case "ArrowDown": - inputManager.handle("down"); - break; - - case "Back": + case "Escape": + if (layoutManager.tv) { inputManager.handle("back"); - break; - - case "Escape": - if (layoutManager.tv) { - inputManager.handle("back"); - } else { - capture = false; - } - break; - - case "MediaPlay": - inputManager.handle("play"); - break; - case "Pause": - inputManager.handle("pause"); - break; - case "MediaPlayPause": - inputManager.handle("playpause"); - break; - case "MediaRewind": - inputManager.handle("rewind"); - break; - case "MediaFastForward": - inputManager.handle("fastforward"); - break; - case "MediaStop": - inputManager.handle("stop"); - break; - case "MediaTrackPrevious": - inputManager.handle("previoustrack"); - break; - case "MediaTrackNext": - inputManager.handle("nexttrack"); - break; - - default: + } else { capture = false; - } + } + break; - if (capture) { - console.debug("disabling default event handling"); - e.preventDefault(); - } - }); - } + case "MediaPlay": + inputManager.handle("play"); + break; + case "Pause": + inputManager.handle("pause"); + break; + case "MediaPlayPause": + inputManager.handle("playpause"); + break; + case "MediaRewind": + inputManager.handle("rewind"); + break; + case "MediaFastForward": + inputManager.handle("fastforward"); + break; + case "MediaStop": + inputManager.handle("stop"); + break; + case "MediaTrackPrevious": + inputManager.handle("previoustrack"); + break; + case "MediaTrackNext": + inputManager.handle("nexttrack"); + break; - // Gamepad initialisation. No script is required if no gamepads are present at init time, saving a bit of resources. - // Whenever the gamepad is connected, we hand all the control of the gamepad to gamepadtokey.js by removing the event handler - function attachGamepadScript(e) { - console.log("Gamepad connected! Attaching gamepadtokey.js script"); - window.removeEventListener("gamepadconnected", attachGamepadScript); - require(["components/input/gamepadtokey"]); - } + default: + capture = false; + } - // No need to check for gamepads manually at load time, the eventhandler will be fired for that - window.addEventListener("gamepadconnected", attachGamepadScript); + if (capture) { + console.debug("disabling default event handling"); + e.preventDefault(); + } + }); +} - return { - enable: enable, - getKeyName: getKeyName, - isNavigationKey: isNavigationKey - }; -}); +// Gamepad initialisation. No script is required if no gamepads are present at init time, saving a bit of resources. +// Whenever the gamepad is connected, we hand all the control of the gamepad to gamepadtokey.js by removing the event handler +function attachGamepadScript(e) { + console.log("Gamepad connected! Attaching gamepadtokey.js script"); + window.removeEventListener("gamepadconnected", attachGamepadScript); + require(["components/input/gamepadtokey"]); +} + +// No need to check for gamepads manually at load time, the eventhandler will be fired for that +window.addEventListener("gamepadconnected", attachGamepadScript); diff --git a/src/components/sanitizefilename.js b/src/components/sanitizefilename.js index f53ce613f6..adfb852e1f 100644 --- a/src/components/sanitizefilename.js +++ b/src/components/sanitizefilename.js @@ -1,96 +1,90 @@ // From https://github.com/parshap/node-sanitize-filename -define([], function () { - 'use strict'; +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 = /[\. ]+$/; - var illegalRe = /[\/\?<>\\:\*\|":]/g; - // eslint-disable-next-line no-control-regex - var controlRe = /[\x00-\x1f\x80-\x9f]/g; - var reservedRe = /^\.+$/; - var windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i; - var windowsTrailingRe = /[\. ]+$/; +function isHighSurrogate(codePoint) { + return codePoint >= 0xd800 && codePoint <= 0xdbff; +} - function isHighSurrogate(codePoint) { - return codePoint >= 0xd800 && codePoint <= 0xdbff; +function isLowSurrogate(codePoint) { + return codePoint >= 0xdc00 && codePoint <= 0xdfff; +} + +function getByteLength(string) { + if (typeof string !== "string") { + throw new Error("Input must be string"); } - function isLowSurrogate(codePoint) { - return codePoint >= 0xdc00 && codePoint <= 0xdfff; - } - - function getByteLength(string) { - if (typeof string !== "string") { - throw new Error("Input must be string"); - } - - var charLength = string.length; - var byteLength = 0; - var codePoint = null; - var prevCodePoint = null; - for (var i = 0; i < charLength; i++) { - codePoint = string.charCodeAt(i); - // handle 4-byte non-BMP chars - // low surrogate - if (isLowSurrogate(codePoint)) { - // when parsing previous hi-surrogate, 3 is added to byteLength - if (prevCodePoint != null && isHighSurrogate(prevCodePoint)) { - byteLength += 1; - } else { - byteLength += 3; - } - } else if (codePoint <= 0x7f) { + const charLength = string.length; + let byteLength = 0; + let codePoint = null; + let prevCodePoint = null; + for (let i = 0; i < charLength; i++) { + codePoint = string.charCodeAt(i); + // handle 4-byte non-BMP chars + // low surrogate + if (isLowSurrogate(codePoint)) { + // when parsing previous hi-surrogate, 3 is added to byteLength + if (prevCodePoint != null && isHighSurrogate(prevCodePoint)) { byteLength += 1; - } else if (codePoint >= 0x80 && codePoint <= 0x7ff) { - byteLength += 2; - } else if (codePoint >= 0x800 && codePoint <= 0xffff) { + } else { byteLength += 3; } - prevCodePoint = codePoint; + } else if (codePoint <= 0x7f) { + byteLength += 1; + } else if (codePoint >= 0x80 && codePoint <= 0x7ff) { + byteLength += 2; + } else if (codePoint >= 0x800 && codePoint <= 0xffff) { + byteLength += 3; } - - return byteLength; + prevCodePoint = codePoint; } - function truncate(string, byteLength) { - if (typeof string !== "string") { - throw new Error("Input must be string"); - } + return byteLength; +} - var charLength = string.length; - var curByteLength = 0; - var codePoint; - var segment; - - for (var i = 0; i < charLength; i += 1) { - codePoint = string.charCodeAt(i); - segment = string[i]; - - if (isHighSurrogate(codePoint) && isLowSurrogate(string.charCodeAt(i + 1))) { - i += 1; - segment += string[i]; - } - - curByteLength += getByteLength(segment); - - if (curByteLength === byteLength) { - return string.slice(0, i + 1); - } else if (curByteLength > byteLength) { - return string.slice(0, i - segment.length + 1); - } - } - - return string; +function truncate(string, byteLength) { + if (typeof string !== "string") { + throw new Error("Input must be string"); } - return { - sanitize: function (input, replacement) { - var sanitized = input - .replace(illegalRe, replacement) - .replace(controlRe, replacement) - .replace(reservedRe, replacement) - .replace(windowsReservedRe, replacement) - .replace(windowsTrailingRe, replacement); - return truncate(sanitized, 255); + const charLength = string.length; + let curByteLength = 0; + let codePoint; + let segment; + + for (let i = 0; i < charLength; i += 1) { + codePoint = string.charCodeAt(i); + segment = string[i]; + + if (isHighSurrogate(codePoint) && isLowSurrogate(string.charCodeAt(i + 1))) { + i += 1; + segment += string[i]; } - }; -}); + + curByteLength += getByteLength(segment); + + if (curByteLength === byteLength) { + return string.slice(0, i + 1); + } else if (curByteLength > byteLength) { + return string.slice(0, i - segment.length + 1); + } + } + + return string; +} + +export function sanitize(input, replacement) { + const sanitized = input + .replace(illegalRe, replacement) + .replace(controlRe, replacement) + .replace(reservedRe, replacement) + .replace(windowsReservedRe, replacement) + .replace(windowsTrailingRe, replacement); + return truncate(sanitized, 255); +} From 9f18abb938b1207034f6a27525d43fa127ee9bce Mon Sep 17 00:00:00 2001 From: Cameron Cordes Date: Thu, 26 Mar 2020 18:53:10 -0400 Subject: [PATCH 076/120] Fix package.json formatting --- package.json | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 9bf666a74e..81dd250ab5 100644 --- a/package.json +++ b/package.json @@ -70,23 +70,17 @@ "whatwg-fetch": "^3.0.0" }, "babel": { - "presets": [ - "@babel/preset-env" - ], - "overrides": [ - { + "presets": ["@babel/preset-env"], + "overrides": [{ "test": [ - "src/components/cardbuilder/cardBuilder.js", - "src/components/filedownloader.js", - "src/components/filesystem.js", - "src/components/input/keyboardnavigation.js", - "src/components/sanatizefilename.js" + "src/components/cardbuilder/cardBuilder.js", + "src/components/filedownloader.js", + "src/components/filesystem.js", + "src/components/input/keyboardnavigation.js", + "src/components/sanatizefilename.js" ], - "plugins": [ - "@babel/plugin-transform-modules-amd" - ] - } - ] + "plugins": ["@babel/plugin-transform-modules-amd"] + }] }, "browserslist": [ "last 2 Firefox versions", From b9dbad421a4214ee70586959b9a4f76451c9e0de Mon Sep 17 00:00:00 2001 From: Danilo Date: Fri, 27 Mar 2020 00:13:50 +0000 Subject: [PATCH 077/120] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 116 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 4 deletions(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index ecd6ccb079..8457cb9f8b 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -340,7 +340,7 @@ "LabelHttpsPort": "Número da porta HTTPS local:", "LabelHomeScreenSectionValue": "Secção {0} do Painel Principal:", "LabelHomeNetworkQuality": "Qualidade da rede interna:", - "LabelHardwareAccelerationTypeHelp": "Esta funcionalidade é experimental e está disponível apenas em sistemas suportados.", + "LabelHardwareAccelerationTypeHelp": "A aceleração de hardware requer configuração adicional.", "LabelHardwareAccelerationType": "Aceleração por hardware:", "LabelEncoderPreset": "Predefinição para codificação H264:", "LabelH264Crf": "CRF para codificação H264:", @@ -377,7 +377,7 @@ "LabelEnableDlnaClientDiscoveryInterval": "Intervalo para descoberta de clientes (segundos)", "LabelEnableBlastAliveMessagesHelp": "Activar esta opção se o servidor não for convenientemente detectado por outros dispositivos UPnP na rede.", "LabelEnableBlastAliveMessages": "Enviar mensagens de reconhecimento", - "LabelEnableAutomaticPortMapHelp": "Tenta correponder automaticamente a porta pública para a porta local através de UPnP. Isto poderá não funcionar em alguns modelos de routers.", + "LabelEnableAutomaticPortMapHelp": "Tenta corresponder automaticamente a porta pública para a porta local através de UPnP. Isto poderá não funcionar em alguns modelos de roteadores. As alterações não serão até reinicialização do servidor.", "LabelEnableAutomaticPortMap": "Activar a correspondência automática de portas", "LabelEmbedAlbumArtDidlHelp": "Alguns dispositivos preferem este método para obter a capa do álbum. Outros pode não ser capazes de reproduzir com esta opção activada.", "LabelEmbedAlbumArtDidl": "Incorporar a capa do álbum no DIDL", @@ -1092,7 +1092,7 @@ "AuthProviderHelp": "Seleccione um mecanismo de autenticação a ser utilizado para validar as credenciais deste utilizador.", "Audio": "Áudio", "AttributeNew": "Novo", - "AspectRatio": "Formato", + "AspectRatio": "Proporção da tela", "Ascending": "Crescente", "Art": "Capa", "AroundTime": "Por volta das {0}", @@ -1218,5 +1218,113 @@ "LabelUserLoginAttemptsBeforeLockout": "Número de tentativas de login falhadas antes do bloqueio do utilizador:", "LabelTrackNumber": "Número da faixa:", "LabelSportsCategories": "Categorias de Desportos:", - "Yesterday": "Ontem" + "Yesterday": "Ontem", + "MusicVideo": "Vídeo de música", + "MusicLibraryHelp": "Reveja o {0} guia de nomes de músicas {1}.", + "MusicArtist": "Artista musical", + "MusicAlbum": "Álbum de música", + "MovieLibraryHelp": "Reveja o {0} guia de nomeação de filmes {1}.", + "MoveRight": "Mover para a direita", + "MoveLeft": "Mova à esquerda", + "MoreMediaInfo": "Informações sobre mídia", + "MoreFromValue": "Mais de {0}", + "MediaInfoRefFrames": "Quadros de referência", + "MediaInfoContainer": "Container", + "MediaInfoAnamorphic": "Anamorphic", + "LabelVideoResolution": "Resolução do vídeo:", + "LabelTypeMetadataDownloaders": "{0} metadata downloaders:", + "LabelTranscodePath": "Caminho da transcodificação:", + "OnlyImageFormats": "Somente formatos de imagem (VOBSUB, PGS, SUB, etc)", + "OnlyForcedSubtitlesHelp": "Apenas as legendas marcadas como forçadas serão carregadas.", + "OnlyForcedSubtitles": "Apenas legendas forçadas", + "Off": "Desligar", + "NumLocationsValue": "{0} pastas", + "Normal": "Normal", + "None": "Nenhum", + "NoSubtitlesHelp": "As legendas não serão carregadas por padrão. Eles ainda podem ser ativados manualmente durante a reprodução.", + "NoSubtitles": "Sem legendas", + "NoSubtitleSearchResultsFound": "Nenhum resultado encontrado.", + "NoNewDevicesFound": "Não foram encontrados novos dispositivos. Para adicionar um novo sintonizador, feche esta caixa de diálogo e insira as informações do dispositivo manualmente.", + "NoCreatedLibraries": "Parece que você ainda não criou nenhuma biblioteca. {0} Deseja criar um agora? {1}", + "No": "Não", + "Mobile": "Celular", + "MetadataSettingChangeHelp": "A alteração das configurações de metadados afetará o novo conteúdo adicionado a partir de agora. Para atualizar o conteúdo existente, abra a tela de detalhes e clique no botão Atualizar ou execute atualizações em massa usando o gerenciador de metadados.", + "MetadataManager": "Gestor de metadados", + "Metadata": "Metadados", + "MessageYouHaveVersionInstalled": "Você possui a versão {0} atualmente instalada.", + "MessageUnsetContentHelp": "O conteúdo será exibido como pastas simples. Para obter melhores resultados, use o gerenciador de metadados para definir os tipos de conteúdo das subpastas.", + "MessageSettingsSaved": "Configurações salvas.", + "MessagePleaseWait": "Por favor, espere. Isso pode levar um minuto.", + "MessagePlayAccessRestricted": "A reprodução deste conteúdo está atualmente restrita. Entre em contato com o administrador do servidor para obter mais informações.", + "MessageNoServersAvailable": "Nenhum servidor foi encontrado usando a descoberta automática de servidores.", + "MessageNoCollectionsAvailable": "As coleções permitem que você desfrute de agrupamentos personalizados de filmes, séries e álbuns. Clique no botão + para começar a criar coleções.", + "MessageConfirmAppExit": "Você quer sair?", + "MediaInfoLayout": "Layout", + "MediaInfoLanguage": "Língua", + "MediaInfoInterlaced": "Entrelaçada", + "MediaInfoFramerate": "Taxa de quadros", + "MediaInfoForced": "Forçar", + "MediaInfoExternal": "Externo", + "MediaInfoDefault": "Padrão", + "MediaInfoCodecTag": "Codec tag", + "MediaInfoCodec": "Codec", + "MediaInfoBitrate": "Taxa de bits", + "MediaInfoBitDepth": "Profundidade de bits", + "MediaInfoAspectRatio": "Proporção da tela", + "ManageRecording": "Gerenciar gravações", + "Logo": "Logo", + "List": "Lista", + "LinksValue": "Links: {0}", + "Like": "Gostei", + "LeaveBlankToNotSetAPassword": "Você pode deixar esse campo em branco para definir nenhuma senha.", + "LearnHowYouCanContribute": "Aprenda como você pode contribuir.", + "LaunchWebAppOnStartupHelp": "Open the web client in your default web browser when the server initially starts. This will not occur when using the restart server function.", + "LaunchWebAppOnStartup": "Inicie a interface da web ao iniciar o servidor", + "Large": "Amplo", + "LanNetworksHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be considered on local network when enforcing bandwidth restrictions. If set, all other IP addresses will be considered to be on the external network and will be subject to the external bandwidth restrictions. If left blank, only the server's subnet is considered to be on the local network.", + "LabelffmpegPathHelp": "O caminho para o arquivo do aplicativo ffmpeg ou pasta que contém o ffmpeg.", + "LabelffmpegPath": "FFmpeg caminho:", + "LabelYear": "Ano:", + "LabelXDlnaDoc": "X-DLNA doc:", + "LabelXDlnaCap": "X-DLNA cap:", + "LabelWeb": "Web:", + "LabelVideoCodec": "Vídeo: codec:", + "LabelVideoBitrate": "Vídeo taxa de bits:", + "LabelVideo": "Vídeo:", + "DashboardArchitecture": "Arquitetura: {0}", + "DashboardServerName": "Servidor: {0}", + "DashboardVersionNumber": "Versão: {0}", + "LabelVersion": "Versão:", + "LabelVaapiDeviceHelp": "Este é o nó de renderização usado para aceleração de hardware.", + "LabelVaapiDevice": "VA API Dispositivo:", + "LabelUserAgent": "Agente de usuário", + "LabelTranscodes": "Transcodificação:", + "LabelTranscodingFramerate": "Transcodificação frame por segundo:", + "LabelTranscodingProgress": "Progresso da transcodificação:", + "LabelTitle": "Título:", + "LabelTheme": "Tema:", + "LabelTextColor": "Cor do texto:", + "LabelTextBackgroundColor": "Cor do plano de fundo do texto:", + "LabelTag": "Tag:", + "LabelTVHomeScreen": "Tela inicial do modo TV:", + "LabelSubtitles": "Legendas:", + "LabelSubtitleDownloaders": "Downloaders de legendas:", + "LabelStreamType": "Tipo de fluxo:", + "LabelSpecialSeasonsDisplayName": "Nome de exibição da temporada especial:", + "LabelSoundEffects": "Efeitos sonoros:", + "LabelSortTitle": "Classificar título:", + "LabelSortOrder": "Ordem da Ordenação", + "LabelSortBy": "Ordenar por:", + "LabelSkin": "Skin:", + "EnableFastImageFadeInHelp": "Habilite uma animação mais rápida para imagens carregadas", + "EnableFastImageFadeIn": "Efeito de imagem fade-in rápido", + "LabelRemoteClientBitrateLimitHelp": "Um limite opcional de taxa de bits por fluxo para todos os dispositivos fora da rede. Isso é útil para impedir que os dispositivos solicitem uma taxa de bits mais alta do que a sua conexão à Internet pode suportar. Isso pode resultar no aumento da carga da CPU no servidor para transcodificar vídeos em tempo real para uma taxa de bits mais baixa.", + "LabelPlayerDimensions": "Dimensões do reprodutor:", + "LabelParentNumber": "Número pai:", + "LabelMetadataSavers": "Economizadores de metadados:", + "LabelDroppedFrames": "Quadros caídos:", + "LabelCorruptedFrames": "Quadros corrompidos:", + "LabelAudioBitDepth": "Profundidade do bit de áudio:", + "ClientSettings": "Configurações do Cliente", + "AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux se aproximar da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais útil ao assistir sem procurar com frequência. Desative isso se você tiver problemas de reprodução." } From a02fe56a871b3ad43df44e5bb6c74e8d5ce5c085 Mon Sep 17 00:00:00 2001 From: Danilo Date: Fri, 27 Mar 2020 00:34:22 +0000 Subject: [PATCH 078/120] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index 8457cb9f8b..a66f98916b 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -1326,5 +1326,6 @@ "LabelCorruptedFrames": "Quadros corrompidos:", "LabelAudioBitDepth": "Profundidade do bit de áudio:", "ClientSettings": "Configurações do Cliente", - "AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux se aproximar da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais útil ao assistir sem procurar com frequência. Desative isso se você tiver problemas de reprodução." + "AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux se aproximar da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais útil ao assistir sem procurar com frequência. Desative isso se você tiver problemas de reprodução.", + "MySubtitles": "Minhas legendas" } From 63a05df3a8dd9a192819b5fede49d51e500bff64 Mon Sep 17 00:00:00 2001 From: Danilo Date: Fri, 27 Mar 2020 00:34:29 +0000 Subject: [PATCH 079/120] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index a66f98916b..e9a0f2dd05 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -1327,5 +1327,6 @@ "LabelAudioBitDepth": "Profundidade do bit de áudio:", "ClientSettings": "Configurações do Cliente", "AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux se aproximar da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais útil ao assistir sem procurar com frequência. Desative isso se você tiver problemas de reprodução.", - "MySubtitles": "Minhas legendas" + "MySubtitles": "Minhas legendas", + "Name": "Nome" } From 000f6e776d481b9af69a674f6a965c0b40958ee2 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Fri, 27 Mar 2020 15:52:50 +0300 Subject: [PATCH 080/120] Fix dom addEventListener/removeEventListener for case of undefined options --- src/components/dom.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/dom.js b/src/components/dom.js index cc37e2fc5b..b91e5b1687 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -74,17 +74,17 @@ define([], function () { } function addEventListenerWithOptions(target, type, handler, options) { - var optionsOrCapture = options; + var optionsOrCapture = options || {}; if (!supportsCaptureOption) { - optionsOrCapture = options.capture; + optionsOrCapture = optionsOrCapture.capture; } target.addEventListener(type, handler, optionsOrCapture); } function removeEventListenerWithOptions(target, type, handler, options) { - var optionsOrCapture = options; + var optionsOrCapture = options || {}; if (!supportsCaptureOption) { - optionsOrCapture = options.capture; + optionsOrCapture = optionsOrCapture.capture; } target.removeEventListener(type, handler, optionsOrCapture); } From 8f1e1075c249e2e858f6626673e5c9f9118bf7c2 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 28 Mar 2020 11:36:58 +0100 Subject: [PATCH 081/120] Update CI to use NodeJS 12 --- .ci/azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/azure-pipelines.yml b/.ci/azure-pipelines.yml index 48f042d729..7c7801b866 100644 --- a/.ci/azure-pipelines.yml +++ b/.ci/azure-pipelines.yml @@ -33,7 +33,7 @@ jobs: - task: NodeTool@0 displayName: 'Install Node' inputs: - versionSpec: '10.x' + versionSpec: '12.x' - task: Cache@2 displayName: 'Check Cache' @@ -82,7 +82,7 @@ jobs: - task: NodeTool@0 displayName: 'Install Node' inputs: - versionSpec: '10.x' + versionSpec: '12.x' - task: Cache@2 displayName: 'Check Cache' From 8743edf0273b7aa75e90452518105f829c00327a Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 28 Mar 2020 12:11:46 +0100 Subject: [PATCH 082/120] Update dependencies --- package.json | 32 +++++----- yarn.lock | 162 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 124 insertions(+), 70 deletions(-) diff --git a/package.json b/package.json index 81dd250ab5..721520d1be 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,8 @@ "license": "GPL-2.0-or-later", "devDependencies": { "@babel/core": "^7.8.6", - "@babel/polyfill": "^7.8.7", "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/polyfill": "^7.8.7", "@babel/preset-env": "^7.8.6", "autoprefixer": "^9.7.4", "babel-loader": "^8.0.6", @@ -18,7 +18,7 @@ "cssnano": "^4.1.10", "del": "^5.1.0", "eslint": "^6.8.0", - "file-loader": "^5.0.2", + "file-loader": "^6.0.0", "gulp": "^4.0.2", "gulp-babel": "^8.0.0", "gulp-cli": "^2.2.0", @@ -31,7 +31,7 @@ "gulp-sass": "^4.0.2", "gulp-sourcemaps": "^2.6.5", "gulp-terser": "^1.2.0", - "html-webpack-plugin": "^3.2.0", + "html-webpack-plugin": "^4.0.2", "node-sass": "^4.13.1", "postcss-loader": "^3.0.0", "postcss-preset-env": "^6.7.0", @@ -63,24 +63,30 @@ "page": "^1.11.5", "query-string": "^6.11.1", "resize-observer-polyfill": "^1.5.1", - "shaka-player": "^2.5.9", + "shaka-player": "^2.5.10", "sortablejs": "^1.10.2", "swiper": "^5.3.1", "webcomponents.js": "^0.7.24", "whatwg-fetch": "^3.0.0" }, "babel": { - "presets": ["@babel/preset-env"], - "overrides": [{ + "presets": [ + "@babel/preset-env" + ], + "overrides": [ + { "test": [ - "src/components/cardbuilder/cardBuilder.js", - "src/components/filedownloader.js", - "src/components/filesystem.js", - "src/components/input/keyboardnavigation.js", - "src/components/sanatizefilename.js" + "src/components/cardbuilder/cardBuilder.js", + "src/components/filedownloader.js", + "src/components/filesystem.js", + "src/components/input/keyboardnavigation.js", + "src/components/sanatizefilename.js" ], - "plugins": ["@babel/plugin-transform-modules-amd"] - }] + "plugins": [ + "@babel/plugin-transform-modules-amd" + ] + } + ] }, "browserslist": [ "last 2 Firefox versions", diff --git a/yarn.lock b/yarn.lock index 8b7697cef4..546fbf639c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1649,11 +1649,6 @@ better-assert@~1.0.0: dependencies: callsite "1.0.0" -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== - big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -2129,6 +2124,14 @@ camel-case@3.0.x: no-case "^2.2.0" upper-case "^1.1.1" +camel-case@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" + integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== + dependencies: + pascal-case "^3.1.1" + tslib "^1.10.0" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -2317,7 +2320,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-css@4.2.x: +clean-css@4.2.x, clean-css@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== @@ -2530,6 +2533,11 @@ commander@^2.2.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" @@ -3463,6 +3471,14 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" +dot-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" + integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + dot-prop@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" @@ -3580,7 +3596,7 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -eme-encryption-scheme-polyfill@^2.0.0: +eme-encryption-scheme-polyfill@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/eme-encryption-scheme-polyfill/-/eme-encryption-scheme-polyfill-2.0.1.tgz#b080b01bffd74c75c9cf8044c1cabedf3b83954f" integrity sha512-Wz+Ro1c0/2Wsx2RLFvTOO0m4LvYn+7cSnq3XOvRvLLBq8jbvUACH/zpU9s0/5+mQa5oaelkU69x+q0z/iWYrFA== @@ -4271,13 +4287,13 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -file-loader@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-5.1.0.tgz#cb56c070efc0e40666424309bd0d9e45ac6f2bb8" - integrity sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg== +file-loader@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f" + integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== dependencies: - loader-utils "^1.4.0" - schema-utils "^2.5.0" + loader-utils "^2.0.0" + schema-utils "^2.6.5" file-type@5.2.0, file-type@^5.2.0: version "5.2.0" @@ -5336,7 +5352,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -he@1.2.x: +he@1.2.x, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -5410,7 +5426,20 @@ html-entities@^1.2.1: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= -html-minifier@^3.2.3, html-minifier@^3.5.20: +html-minifier-terser@^5.0.1: + version "5.0.5" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.5.tgz#8f12f639789f04faa9f5cf2ff9b9f65607f21f8b" + integrity sha512-cBSFFghQh/uHcfSiL42KxxIRMF7A144+3E44xdlctIjxEmkEfCvouxNyFH2wysXk1fCGBPwtcr3hDWlGTfkDew== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-minifier@^3.5.20: version "3.5.21" resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA== @@ -5433,17 +5462,16 @@ html-tags@^3.1.0: resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== -html-webpack-plugin@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" - integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s= +html-webpack-plugin@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.2.tgz#c96a48d0ee53d33dcc909d6b65ad28f3d627efd4" + integrity sha512-dCyjg2dEBf0Azni2byDcwfk5l5XKNEnA3OU4cejovqkKGc4ZixC6Aw6+U2sAG/ellHIjoiQhyU4oKMO6fQFaYA== dependencies: - html-minifier "^3.2.3" - loader-utils "^0.2.16" - lodash "^4.17.3" - pretty-error "^2.0.2" - tapable "^1.0.0" - toposort "^1.0.0" + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + pretty-error "^2.1.1" + tapable "^1.1.3" util.promisify "1.0.0" htmlparser2@^3.10.0, htmlparser2@^3.3.0: @@ -6373,11 +6401,6 @@ json3@^3.3.2: resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== -json5@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -6535,7 +6558,7 @@ levn@^0.3.0, levn@~0.3.0: "libass-wasm@https://github.com/jellyfin/JavascriptSubtitlesOctopus": version "4.0.0" - resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#1d12af0b04fb2337570b57d706dd97db2f904b9d" + resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#3269ee2b5442a495cc814164e1d70d87dc3cf2f9" liftoff@^3.1.0: version "3.1.0" @@ -6601,16 +6624,6 @@ loader-utils@1.2.3: emojis-list "^2.0.0" json5 "^1.0.1" -loader-utils@^0.2.16: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" - integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" - loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" @@ -6620,6 +6633,15 @@ loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + localtunnel@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.9.2.tgz#0012fcabc29cf964c130a01858768aa2bb65b5af" @@ -6797,7 +6819,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@~4.17.12: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@~4.17.12: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -6866,6 +6888,13 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= +lower-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" + integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== + dependencies: + tslib "^1.10.0" + lowercase-keys@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" @@ -7415,6 +7444,14 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +no-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" + integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== + dependencies: + lower-case "^2.0.1" + tslib "^1.10.0" + node-forge@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" @@ -8014,6 +8051,14 @@ param-case@2.1.x: dependencies: no-case "^2.2.0" +param-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238" + integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA== + dependencies: + dot-case "^3.0.3" + tslib "^1.10.0" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -8108,6 +8153,14 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascal-case@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" + integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -9087,7 +9140,7 @@ pretty-bytes@^5.3.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== -pretty-error@^2.0.2: +pretty-error@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= @@ -9510,7 +9563,7 @@ regjsparser@^0.6.4: dependencies: jsesc "~0.5.0" -relateurl@0.2.x: +relateurl@0.2.x, relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= @@ -9903,7 +9956,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.4, schema-utils@^2.6.5: +schema-utils@^2.6.0, schema-utils@^2.6.4, schema-utils@^2.6.5: version "2.6.5" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== @@ -10103,12 +10156,12 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shaka-player@^2.5.9: - version "2.5.9" - resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-2.5.9.tgz#007dc19df2bb5d3d959d278b2d894af05adffe38" - integrity sha512-XavLBqxvIbvLOPfk7VKZu5fbMJyVko9bBfzxmMWdX5bvQwUSjU7ZhV8v2tHqXQYafpHml1hlGHzKkLs7idouNQ== +shaka-player@^2.5.10: + version "2.5.10" + resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-2.5.10.tgz#6f4e72e2433002d11824a223b02edd5004e30e2b" + integrity sha512-kS9TQL6bWODo4XNnozERZWsEiWlLZ6huspPx4ZjmMjeOBL9gwqlULLfLyO+5gA3CYV/dk9LaAi1WAEaLWckGpA== dependencies: - eme-encryption-scheme-polyfill "^2.0.0" + eme-encryption-scheme-polyfill "^2.0.1" shebang-command@^1.2.0: version "1.2.0" @@ -11077,7 +11130,7 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser@^4.0.0, terser@^4.1.2: +terser@^4.0.0, terser@^4.1.2, terser@^4.6.3: version "4.6.7" resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== @@ -11248,11 +11301,6 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -toposort@^1.0.0: - version "1.0.7" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" - integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= - tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -11305,7 +11353,7 @@ trough@^1.0.0: dependencies: glob "^7.1.2" -tslib@^1.9.0: +tslib@^1.10.0, tslib@^1.9.0: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== From cc66fb672c199270919cac651027eb1fabebabf5 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sat, 28 Mar 2020 19:42:18 +0300 Subject: [PATCH 083/120] Migrate ScrollManger to ES6 --- package.json | 3 +- src/components/scrollManager.js | 239 +++++++++++++++++--------------- 2 files changed, 126 insertions(+), 116 deletions(-) diff --git a/package.json b/package.json index 81dd250ab5..5672ab6d2e 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,8 @@ "src/components/filedownloader.js", "src/components/filesystem.js", "src/components/input/keyboardnavigation.js", - "src/components/sanatizefilename.js" + "src/components/sanatizefilename.js", + "src/components/scrollManager.js" ], "plugins": ["@babel/plugin-transform-modules-amd"] }] diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index 5fc3729bac..96317fa998 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -1,15 +1,23 @@ -define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManager) { - "use strict"; +/* eslint-disable indent */ + +/** + * Module for controlling scroll behavior. + * @module components/scrollManager + */ + +import dom from "dom"; +import browser from "browser"; +import layoutManager from "layoutManager"; /** * Scroll time in ms. */ - var ScrollTime = 270; + const ScrollTime = 270; /** * Epsilon for comparing values. */ - var Epsilon = 1e-6; + const Epsilon = 1e-6; // FIXME: Need to scroll to top of page to fully show the top menu. This can be solved by some marker of top most elements or their containers /** @@ -19,20 +27,20 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage * @return {number} minimum vertical scroll */ function minimumScrollY() { - var topMenu = document.querySelector(".headerTop"); + const topMenu = document.querySelector(".headerTop"); if (topMenu) { return topMenu.clientHeight; } return 0; } - var supportsSmoothScroll = "scrollBehavior" in document.documentElement.style; + const supportsSmoothScroll = "scrollBehavior" in document.documentElement.style; - var supportsScrollToOptions = false; + let supportsScrollToOptions = false; try { - var elem = document.createElement("div"); + const elem = document.createElement("div"); - var opts = Object.defineProperty({}, "behavior", { + const opts = Object.defineProperty({}, "behavior", { // eslint-disable-next-line getter-return get: function () { supportsScrollToOptions = true; @@ -47,9 +55,9 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage /** * Returns value clamped by range [min, max]. * - * @param {number} value clamped value - * @param {number} min begining of range - * @param {number} max ending of range + * @param {number} value - clamped value + * @param {number} min - begining of range + * @param {number} max - ending of range * @return {number} clamped value */ function clamp(value, min, max) { @@ -60,15 +68,15 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage * Returns the required delta to fit range 1 into range 2. * In case of range 1 is bigger than range 2 returns delta to fit most out of range part. * - * @param {number} begin1 begining of range 1 - * @param {number} end1 ending of range 1 - * @param {number} begin2 begining of range 2 - * @param {number} end2 ending of range 2 + * @param {number} begin1 - begining of range 1 + * @param {number} end1 - ending of range 1 + * @param {number} begin2 - begining of range 2 + * @param {number} end2 - ending of range 2 * @return {number} delta: <0 move range1 to the left, >0 - to the right */ function fitRange(begin1, end1, begin2, end2) { - var delta1 = begin1 - begin2; - var delta2 = end2 - end1; + const delta1 = begin1 - begin2; + const delta2 = end2 - end1; if (delta1 < 0 && delta1 < delta2) { return -delta1; } else if (delta2 < 0) { @@ -80,7 +88,7 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage /** * Ease value. * - * @param {number} t value in range [0, 1] + * @param {number} t - value in range [0, 1] * @return {number} eased value in range [0, 1] */ function ease(t) { @@ -100,41 +108,40 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage * * Tizen 5 Browser/Native: scrolls documentElement (and window); has a document.scrollingElement */ - function DocumentScroller() { - } - - DocumentScroller.prototype = { + class DocumentScroller { get scrollLeft() { return window.pageXOffset; - }, + } + set scrollLeft(val) { window.scroll(val, window.pageYOffset); - }, + } get scrollTop() { return window.pageYOffset; - }, + } + set scrollTop(val) { window.scroll(window.pageXOffset, val); - }, + } get scrollWidth() { return Math.max(document.documentElement.scrollWidth, document.body.scrollWidth); - }, + } get scrollHeight() { return Math.max(document.documentElement.scrollHeight, document.body.scrollHeight); - }, + } get clientWidth() { return Math.min(document.documentElement.clientWidth, document.body.clientWidth); - }, + } get clientHeight() { return Math.min(document.documentElement.clientHeight, document.body.clientHeight); - }, + } - getBoundingClientRect: function() { + getBoundingClientRect() { // Make valid viewport coordinates: documentElement.getBoundingClientRect returns rect of entire document relative to viewport return { left: 0, @@ -142,26 +149,29 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage width: this.clientWidth, height: this.clientHeight }; - }, + } - scrollTo: function() { + scrollTo() { window.scrollTo.apply(window, arguments); } - }; + } - var documentScroller = new DocumentScroller(); + /** + * Default (document) scroller. + */ + const documentScroller = new DocumentScroller(); /** * Returns parent element that can be scrolled. If no such, returns documentElement. * - * @param {HTMLElement} element element for which parent is being searched - * @param {boolean} vertical search for vertical scrollable parent + * @param {HTMLElement} element - element for which parent is being searched + * @param {boolean} vertical - search for vertical scrollable parent */ function getScrollableParent(element, vertical) { if (element) { - var nameScroll = "scrollWidth"; - var nameClient = "clientWidth"; - var nameClass = "scrollX"; + let nameScroll = "scrollWidth"; + let nameClient = "clientWidth"; + let nameClass = "scrollX"; if (vertical) { nameScroll = "scrollHeight"; @@ -169,7 +179,7 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage nameClass = "scrollY"; } - var parent = element.parentElement; + let parent = element.parentElement; while (parent) { // Skip 'emby-scroller' because it scrolls by itself @@ -187,20 +197,20 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage /** * @typedef {Object} ScrollerData - * @property {number} scrollPos current scroll position - * @property {number} scrollSize scroll size - * @property {number} clientSize client size + * @property {number} scrollPos - current scroll position + * @property {number} scrollSize - scroll size + * @property {number} clientSize - client size */ /** * Returns scroll data for specified orientation. * - * @param {HTMLElement} scroller scroller - * @param {boolean} vertical vertical scroll data + * @param {HTMLElement} scroller - scroller + * @param {boolean} vertical - vertical scroll data * @return {ScrollerData} scroll data */ function getScrollerData(scroller, vertical) { - var data = {}; + let data = {}; if (!vertical) { data.scrollPos = scroller.scrollLeft; @@ -218,14 +228,14 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage /** * Returns position of child of scroller for specified orientation. * - * @param {HTMLElement} scroller scroller - * @param {HTMLElement} element child of scroller - * @param {boolean} vertical vertical scroll + * @param {HTMLElement} scroller - scroller + * @param {HTMLElement} element - child of scroller + * @param {boolean} vertical - vertical scroll * @return {number} child position */ function getScrollerChildPos(scroller, element, vertical) { - var elementRect = element.getBoundingClientRect(); - var scrollerRect = scroller.getBoundingClientRect(); + const elementRect = element.getBoundingClientRect(); + const scrollerRect = scroller.getBoundingClientRect(); if (!vertical) { return scroller.scrollLeft + elementRect.left - scrollerRect.left; @@ -237,21 +247,21 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage /** * Returns scroll position for element. * - * @param {ScrollerData} scrollerData scroller data - * @param {number} elementPos child element position - * @param {number} elementSize child element size - * @param {boolean} centered scroll to center + * @param {ScrollerData} scrollerData - scroller data + * @param {number} elementPos - child element position + * @param {number} elementSize - child element size + * @param {boolean} centered - scroll to center * @return {number} scroll position */ function calcScroll(scrollerData, elementPos, elementSize, centered) { - var maxScroll = scrollerData.scrollSize - scrollerData.clientSize; + const maxScroll = scrollerData.scrollSize - scrollerData.clientSize; - var scroll; + let scroll; if (centered) { scroll = elementPos + (elementSize - scrollerData.clientSize) / 2; } else { - var delta = fitRange(elementPos, elementPos + elementSize - 1, scrollerData.scrollPos, scrollerData.scrollPos + scrollerData.clientSize - 1); + const delta = fitRange(elementPos, elementPos + elementSize - 1, scrollerData.scrollPos, scrollerData.scrollPos + scrollerData.clientSize - 1); scroll = scrollerData.scrollPos - delta; } @@ -261,14 +271,14 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage /** * Calls scrollTo function in proper way. * - * @param {HTMLElement} scroller scroller - * @param {ScrollToOptions} options scroll options + * @param {HTMLElement} scroller - scroller + * @param {ScrollToOptions} options - scroll options */ function scrollToHelper(scroller, options) { if ("scrollTo" in scroller) { if (!supportsScrollToOptions) { - var scrollX = (options.left !== undefined ? options.left : scroller.scrollLeft); - var scrollY = (options.top !== undefined ? options.top : scroller.scrollTop); + const scrollX = (options.left !== undefined ? options.left : scroller.scrollLeft); + const scrollY = (options.top !== undefined ? options.top : scroller.scrollTop); scroller.scrollTo(scrollX, scrollY); } else { scroller.scrollTo(options); @@ -286,14 +296,14 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage /** * Performs built-in scroll. * - * @param {HTMLElement} xScroller horizontal scroller - * @param {number} scrollX horizontal coordinate - * @param {HTMLElement} yScroller vertical scroller - * @param {number} scrollY vertical coordinate - * @param {boolean} smooth smooth scrolling + * @param {HTMLElement} xScroller - horizontal scroller + * @param {number} scrollX - horizontal coordinate + * @param {HTMLElement} yScroller - vertical scroller + * @param {number} scrollY - vertical coordinate + * @param {boolean} smooth - smooth scrolling */ function builtinScroll(xScroller, scrollX, yScroller, scrollY, smooth) { - var scrollBehavior = smooth ? "smooth" : "instant"; + const scrollBehavior = smooth ? "smooth" : "instant"; if (xScroller !== yScroller) { scrollToHelper(xScroller, {left: scrollX, behavior: scrollBehavior}); @@ -303,7 +313,7 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage } } - var scrollTimer; + let scrollTimer; /** * Resets scroll timer to stop scrolling. @@ -316,29 +326,29 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage /** * Performs animated scroll. * - * @param {HTMLElement} xScroller horizontal scroller - * @param {number} scrollX horizontal coordinate - * @param {HTMLElement} yScroller vertical scroller - * @param {number} scrollY vertical coordinate + * @param {HTMLElement} xScroller - horizontal scroller + * @param {number} scrollX - horizontal coordinate + * @param {HTMLElement} yScroller - vertical scroller + * @param {number} scrollY - vertical coordinate */ function animateScroll(xScroller, scrollX, yScroller, scrollY) { - var ox = xScroller.scrollLeft; - var oy = yScroller.scrollTop; - var dx = scrollX - ox; - var dy = scrollY - oy; + const ox = xScroller.scrollLeft; + const oy = yScroller.scrollTop; + const dx = scrollX - ox; + const dy = scrollY - oy; if (Math.abs(dx) < Epsilon && Math.abs(dy) < Epsilon) { return; } - var start; + let start; function scrollAnim(currentTimestamp) { start = start || currentTimestamp; - var k = Math.min(1, (currentTimestamp - start) / ScrollTime); + let k = Math.min(1, (currentTimestamp - start) / ScrollTime); if (k === 1) { resetScrollTimer(); @@ -348,8 +358,8 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage k = ease(k); - var x = ox + dx*k; - var y = oy + dy*k; + const x = ox + dx*k; + const y = oy + dy*k; builtinScroll(xScroller, x, yScroller, y, false); @@ -362,11 +372,11 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage /** * Performs scroll. * - * @param {HTMLElement} xScroller horizontal scroller - * @param {number} scrollX horizontal coordinate - * @param {HTMLElement} yScroller vertical scroller - * @param {number} scrollY vertical coordinate - * @param {boolean} smooth smooth scrolling + * @param {HTMLElement} xScroller - horizontal scroller + * @param {number} scrollX - horizontal coordinate + * @param {HTMLElement} yScroller - vertical scroller + * @param {number} scrollY - vertical coordinate + * @param {boolean} smooth - smooth scrolling */ function doScroll(xScroller, scrollX, yScroller, scrollY, smooth) { @@ -403,26 +413,26 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage /** * Returns true if scroll manager is enabled. */ - var isEnabled = function() { + export function isEnabled() { return layoutManager.tv; - }; + } /** * Scrolls the document to a given position. * - * @param {number} scrollX horizontal coordinate - * @param {number} scrollY vertical coordinate - * @param {boolean} [smooth=false] smooth scrolling + * @param {number} scrollX - horizontal coordinate + * @param {number} scrollY - vertical coordinate + * @param {boolean} [smooth=false] - smooth scrolling */ - var scrollTo = function(scrollX, scrollY, smooth) { + export function scrollTo(scrollX, scrollY, smooth) { smooth = !!smooth; // Scroller is document itself by default - var scroller = getScrollableParent(null, false); + const scroller = getScrollableParent(null, false); - var xScrollerData = getScrollerData(scroller, false); - var yScrollerData = getScrollerData(scroller, true); + const xScrollerData = getScrollerData(scroller, false); + const yScrollerData = getScrollerData(scroller, true); scrollX = clamp(Math.round(scrollX), 0, xScrollerData.scrollSize - xScrollerData.clientSize); scrollY = clamp(Math.round(scrollY), 0, yScrollerData.scrollSize - yScrollerData.clientSize); @@ -433,39 +443,39 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage /** * Scrolls the document to a given element. * - * @param {HTMLElement} element target element of scroll task - * @param {boolean} [smooth=false] smooth scrolling + * @param {HTMLElement} element - target element of scroll task + * @param {boolean} [smooth=false] - smooth scrolling */ - var scrollToElement = function(element, smooth) { + export function scrollToElement(element, smooth) { smooth = !!smooth; - var scrollCenterX = true; - var scrollCenterY = true; + let scrollCenterX = true; + let scrollCenterY = true; - var offsetParent = element.offsetParent; + const offsetParent = element.offsetParent; // In Firefox offsetParent.offsetParent is BODY - var isFixed = offsetParent && (!offsetParent.offsetParent || window.getComputedStyle(offsetParent).position === "fixed"); + const isFixed = offsetParent && (!offsetParent.offsetParent || window.getComputedStyle(offsetParent).position === "fixed"); // Scroll fixed elements to nearest edge (or do not scroll at all) if (isFixed) { scrollCenterX = scrollCenterY = false; } - var xScroller = getScrollableParent(element, false); - var yScroller = getScrollableParent(element, true); + const xScroller = getScrollableParent(element, false); + const yScroller = getScrollableParent(element, true); - var elementRect = element.getBoundingClientRect(); + const elementRect = element.getBoundingClientRect(); - var xScrollerData = getScrollerData(xScroller, false); - var yScrollerData = getScrollerData(yScroller, true); + const xScrollerData = getScrollerData(xScroller, false); + const yScrollerData = getScrollerData(yScroller, true); - var xPos = getScrollerChildPos(xScroller, element, false); - var yPos = getScrollerChildPos(yScroller, element, true); + const xPos = getScrollerChildPos(xScroller, element, false); + const yPos = getScrollerChildPos(yScroller, element, true); - var scrollX = calcScroll(xScrollerData, xPos, elementRect.width, scrollCenterX); - var scrollY = calcScroll(yScrollerData, yPos, elementRect.height, scrollCenterY); + const scrollX = calcScroll(xScrollerData, xPos, elementRect.width, scrollCenterX); + let scrollY = calcScroll(yScrollerData, yPos, elementRect.height, scrollCenterY); // HACK: Scroll to top for top menu because it is hidden // FIXME: Need a marker to scroll top/bottom @@ -490,9 +500,8 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage }, {capture: true}); } - return { + export default { isEnabled: isEnabled, scrollTo: scrollTo, scrollToElement: scrollToElement }; -}); From 460717c7ef8e3c59cc2530842077f45fee81fd0b Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sat, 28 Mar 2020 20:02:22 +0300 Subject: [PATCH 084/120] Migrate AutoFocuser to ES6 --- package.json | 1 + src/components/autoFocuser.js | 45 ++++++++++++++++++----------------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 5672ab6d2e..3af6fabbb9 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "presets": ["@babel/preset-env"], "overrides": [{ "test": [ + "src/components/autoFocuser.js", "src/components/cardbuilder/cardBuilder.js", "src/components/filedownloader.js", "src/components/filesystem.js", diff --git a/src/components/autoFocuser.js b/src/components/autoFocuser.js index 6d99009e67..93ebb4b3be 100644 --- a/src/components/autoFocuser.js +++ b/src/components/autoFocuser.js @@ -1,22 +1,29 @@ -define(["focusManager", "layoutManager"], function (focusManager, layoutManager) { - "use strict"; +/* eslint-disable indent */ + +/** + * Module for performing auto-focus. + * @module components/autoFocuser + */ + +import focusManager from "focusManager"; +import layoutManager from "layoutManager"; /** * Previously selected element. */ - var activeElement; + let activeElement; /** - * Returns true if AutoFocuser is enabled. + * Returns _true_ if AutoFocuser is enabled. */ - function isEnabled() { + export function isEnabled() { return layoutManager.tv; } /** * Start AutoFocuser */ - function enable() { + export function enable() { if (!isEnabled()) { return; } @@ -28,24 +35,19 @@ define(["focusManager", "layoutManager"], function (focusManager, layoutManager) console.debug("AutoFocuser enabled"); } - /** - * Create an array from some source. - */ - var arrayFrom = Array.prototype.from || function (src) { - return Array.prototype.slice.call(src); - } - /** * Set focus on a suitable element, taking into account the previously selected. + * @param {HTMLElement} [container] - element to limit scope + * @returns {HTMLElement} focused element */ - function autoFocus(container) { + export function autoFocus(container) { if (!isEnabled()) { - return; + return null; } container = container || document.body; - var candidates = []; + let candidates = []; if (activeElement) { // These elements are recreated @@ -62,10 +64,10 @@ define(["focusManager", "layoutManager"], function (focusManager, layoutManager) candidates.push(activeElement); } - candidates = candidates.concat(arrayFrom(container.querySelectorAll(".btnResume"))); - candidates = candidates.concat(arrayFrom(container.querySelectorAll(".btnPlay"))); + candidates = candidates.concat(Array.from(container.querySelectorAll(".btnResume"))); + candidates = candidates.concat(Array.from(container.querySelectorAll(".btnPlay"))); - var focusedElement; + let focusedElement; candidates.every(function (element) { if (focusManager.isCurrentlyFocusable(element)) { @@ -79,7 +81,7 @@ define(["focusManager", "layoutManager"], function (focusManager, layoutManager) if (!focusedElement) { // FIXME: Multiple itemsContainers - var itemsContainer = container.querySelector(".itemsContainer"); + const itemsContainer = container.querySelector(".itemsContainer"); if (itemsContainer) { focusedElement = focusManager.autoFocus(itemsContainer); @@ -93,9 +95,8 @@ define(["focusManager", "layoutManager"], function (focusManager, layoutManager) return focusedElement; } - return { + export default { isEnabled: isEnabled, enable: enable, autoFocus: autoFocus }; -}); From 5efc95fd097c7bdcc3139e9fd39bfa305353d0fb Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sun, 29 Mar 2020 00:03:15 +0300 Subject: [PATCH 085/120] Migrate DOM-module to ES6 --- package.json | 1 + src/components/dom.js | 163 +++++++++++++++++++++++++++++++----------- 2 files changed, 121 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 3af6fabbb9..f6f2436b2a 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,7 @@ "test": [ "src/components/autoFocuser.js", "src/components/cardbuilder/cardBuilder.js", + "src/components/dom.js", "src/components/filedownloader.js", "src/components/filesystem.js", "src/components/input/keyboardnavigation.js", diff --git a/src/components/dom.js b/src/components/dom.js index b91e5b1687..fdc5e607eb 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -1,8 +1,18 @@ -define([], function () { - 'use strict'; +/* eslint-disable indent */ - function parentWithAttribute(elem, name, value) { +/** + * Useful DOM utilities. + * @module components/dom + */ + /** + * Returns parent of element with specified attribute value. + * @param {HTMLElement} elem - element whose parent need to find + * @param {string} name - attribute name + * @param {mixed} value - attribute value + * @returns {HTMLElement} Parent with specified attribute value + */ + export function parentWithAttribute(elem, name, value) { while ((value ? elem.getAttribute(name) !== value : !elem.getAttribute(name))) { elem = elem.parentNode; @@ -14,8 +24,13 @@ define([], function () { return elem; } - function parentWithTag(elem, tagNames) { - + /** + * Returns parent of element with one of specified tag names. + * @param {HTMLElement} elem - element whose parent need to find + * @param {(string|Array)} tagNames - tag name or array of tag names + * @returns {HTMLElement} Parent with one of specified tag names + */ + export function parentWithTag(elem, tagNames) { // accept both string and array passed in if (!Array.isArray(tagNames)) { tagNames = [tagNames]; @@ -32,9 +47,14 @@ define([], function () { return elem; } + /** + * Returns _true_ if class list contains one of specified names. + * @param {DOMTokenList} classList - class list + * @param {Array} classNames - array of class names + * @returns {boolean} _true_ if class list contains one of specified names + */ function containsAnyClass(classList, classNames) { - - for (var i = 0, length = classNames.length; i < length; i++) { + for (let i = 0, length = classNames.length; i < length; i++) { if (classList.contains(classNames[i])) { return true; } @@ -42,8 +62,13 @@ define([], function () { return false; } - function parentWithClass(elem, classNames) { - + /** + * Returns parent of element with one of specified class names. + * @param {HTMLElement} elem - element whose parent need to find + * @param {(string|Array)} classNames - class name or array of class names + * @returns {HTMLElement} Parent with one of specified class names + */ + export function parentWithClass(elem, classNames) { // accept both string and array passed in if (!Array.isArray(classNames)) { classNames = [classNames]; @@ -60,9 +85,9 @@ define([], function () { return elem; } - var supportsCaptureOption = false; + let supportsCaptureOption = false; try { - var opts = Object.defineProperty({}, 'capture', { + const opts = Object.defineProperty({}, 'capture', { // eslint-disable-next-line getter-return get: function () { supportsCaptureOption = true; @@ -73,29 +98,58 @@ define([], function () { console.debug('error checking capture support'); } - function addEventListenerWithOptions(target, type, handler, options) { - var optionsOrCapture = options || {}; + /** + * Adds event listener to specified target. + * @param {EventTarget} target - event target + * @param {string} type - event type + * @param {function} handler - event handler + * @param {Object} [options] - listener options + */ + export function addEventListener(target, type, handler, options) { + let optionsOrCapture = options || {}; if (!supportsCaptureOption) { optionsOrCapture = optionsOrCapture.capture; } target.addEventListener(type, handler, optionsOrCapture); } - function removeEventListenerWithOptions(target, type, handler, options) { - var optionsOrCapture = options || {}; + /** + * Removes event listener from specified target. + * @param {EventTarget} target - event target + * @param {string} type - event type + * @param {function} handler - event handler + * @param {Object} [options] - listener options + */ + export function removeEventListener(target, type, handler, options) { + let optionsOrCapture = options || {}; if (!supportsCaptureOption) { optionsOrCapture = optionsOrCapture.capture; } target.removeEventListener(type, handler, optionsOrCapture); } - var windowSize; - var windowSizeEventsBound; + /** + * Cached window size. + */ + let windowSize; + + /** + * Flag of event listener bound. + */ + let windowSizeEventsBound; + + /** + * Resets cached window size. + */ function clearWindowSize() { windowSize = null; } - function getWindowSize() { + /** + * Returns window size. + * @returns {Object} Window size + */ + export function getWindowSize() { if (!windowSize) { windowSize = { innerHeight: window.innerHeight, @@ -104,46 +158,60 @@ define([], function () { if (!windowSizeEventsBound) { windowSizeEventsBound = true; - addEventListenerWithOptions(window, "orientationchange", clearWindowSize, { passive: true }); - addEventListenerWithOptions(window, 'resize', clearWindowSize, { passive: true }); + addEventListener(window, "orientationchange", clearWindowSize, { passive: true }); + addEventListener(window, 'resize', clearWindowSize, { passive: true }); } } return windowSize; } - var standardWidths = [480, 720, 1280, 1440, 1920, 2560, 3840, 5120, 7680]; - function getScreenWidth() { - var width = window.innerWidth; - var height = window.innerHeight; + /** + * Standard screen widths. + */ + const standardWidths = [480, 720, 1280, 1440, 1920, 2560, 3840, 5120, 7680]; + + /** + * Returns screen width. + * @returns {number} Screen width + */ + export function getScreenWidth() { + let width = window.innerWidth; + const height = window.innerHeight; if (height > width) { width = height * (16.0 / 9.0); } - var closest = standardWidths.sort(function (a, b) { + const closest = standardWidths.sort(function (a, b) { return Math.abs(width - a) - Math.abs(width - b); })[0]; return closest; } - var _animationEvent; - function whichAnimationEvent() { + /** + * Name of animation end event. + */ + let _animationEvent; + /** + * Returns name of animation end event. + * @returns {string} Name of animation end event + */ + export function whichAnimationEvent() { if (_animationEvent) { return _animationEvent; } - var t; - var el = document.createElement("div"); - var animations = { + const el = document.createElement("div"); + const animations = { "animation": "animationend", "OAnimation": "oAnimationEnd", "MozAnimation": "animationend", "WebkitAnimation": "webkitAnimationEnd" }; - for (t in animations) { + for (let t in animations) { if (el.style[t] !== undefined) { _animationEvent = animations[t]; return animations[t]; @@ -154,26 +222,36 @@ define([], function () { return _animationEvent; } - function whichAnimationCancelEvent() { - + /** + * Returns name of animation cancel event. + * @returns {string} Name of animation cancel event + */ + export function whichAnimationCancelEvent() { return whichAnimationEvent().replace('animationend', 'animationcancel').replace('AnimationEnd', 'AnimationCancel'); } - var _transitionEvent; - function whichTransitionEvent() { + /** + * Name of transition end event. + */ + let _transitionEvent; + + /** + * Returns name of transition end event. + * @returns {string} Name of transition end event + */ + export function whichTransitionEvent() { if (_transitionEvent) { return _transitionEvent; } - var t; - var el = document.createElement("div"); - var transitions = { + const el = document.createElement("div"); + const transitions = { "transition": "transitionend", "OTransition": "oTransitionEnd", "MozTransition": "transitionend", "WebkitTransition": "webkitTransitionEnd" }; - for (t in transitions) { + for (let t in transitions) { if (el.style[t] !== undefined) { _transitionEvent = transitions[t]; return transitions[t]; @@ -184,16 +262,15 @@ define([], function () { return _transitionEvent; } - return { + export default { parentWithAttribute: parentWithAttribute, parentWithClass: parentWithClass, parentWithTag: parentWithTag, - addEventListener: addEventListenerWithOptions, - removeEventListener: removeEventListenerWithOptions, + addEventListener: addEventListener, + removeEventListener: removeEventListener, getWindowSize: getWindowSize, getScreenWidth: getScreenWidth, whichTransitionEvent: whichTransitionEvent, whichAnimationEvent: whichAnimationEvent, whichAnimationCancelEvent: whichAnimationCancelEvent }; -}); From eb047175be762e69e0fcefde26199e423a7ed87b Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sun, 29 Mar 2020 00:06:27 +0300 Subject: [PATCH 086/120] Add default export for compatibility --- src/components/cardbuilder/cardBuilder.js | 11 +++++++++++ src/components/input/keyboardnavigation.js | 15 +++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 9d86bc9d7c..1249f802af 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1853,3 +1853,14 @@ import 'programStyles'; cell.removeAttribute('data-seriestimerid'); } } + +export default { + getCardsHtml: getCardsHtml, + getDefaultBackgroundClass: getDefaultBackgroundClass, + getDefaultText: getDefaultText, + buildCards: buildCards, + onUserDataChanged: onUserDataChanged, + onTimerCreated: onTimerCreated, + onTimerCancelled: onTimerCancelled, + onSeriesTimerCancelled: onSeriesTimerCancelled +}; diff --git a/src/components/input/keyboardnavigation.js b/src/components/input/keyboardnavigation.js index bdcb733179..caddf46797 100644 --- a/src/components/input/keyboardnavigation.js +++ b/src/components/input/keyboardnavigation.js @@ -1,3 +1,8 @@ +/** + * Module for performing keyboard navigation. + * @module components/input/keyboardnavigation + */ + import inputManager from "inputManager"; import layoutManager from "layoutManager"; @@ -55,7 +60,7 @@ if (!hasFieldKey) { /** * Returns key name from event. * - * @param {KeyboardEvent} event keyboard event + * @param {KeyboardEvent} event - keyboard event * @return {string} key name */ export function getKeyName(event) { @@ -65,7 +70,7 @@ export function getKeyName(event) { /** * Returns _true_ if key is used for navigation. * - * @param {string} key name + * @param {string} key - key name * @return {boolean} _true_ if key is used for navigation */ export function isNavigationKey(key) { @@ -155,3 +160,9 @@ function attachGamepadScript(e) { // No need to check for gamepads manually at load time, the eventhandler will be fired for that window.addEventListener("gamepadconnected", attachGamepadScript); + +export default { + enable: enable, + getKeyName: getKeyName, + isNavigationKey: isNavigationKey +}; From 5dfc5d6c2be8cc7957af11dae6dc0951691be033 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 29 Mar 2020 12:48:55 +0200 Subject: [PATCH 087/120] Fix admin drawer logo showing up everywhere --- src/assets/css/dashboard.css | 6 +++++- src/assets/css/librarybrowser.css | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/assets/css/dashboard.css b/src/assets/css/dashboard.css index 8c8a9ca7f1..894d7332f4 100644 --- a/src/assets/css/dashboard.css +++ b/src/assets/css/dashboard.css @@ -63,6 +63,10 @@ progress[aria-valuenow]::before { } .adminDrawerLogo { + display: none; +} + +.layout-mobile .adminDrawerLogo { padding: 1.5em 1em 1.2em; border-bottom: 1px solid #e0e0e0; margin-bottom: 1em; @@ -161,7 +165,7 @@ div[data-role=controlgroup] a.ui-btn-active { @media all and (min-width: 40em) { .content-primary { - padding-top: 7em; + padding-top: 4.6em; } .withTabs .content-primary { diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index 13265e40d1..1b0fab8d14 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -313,7 +313,7 @@ } .dashboardDocument .mainDrawer-scrollContainer { - margin-top: 6em !important; + margin-top: 4.6em !important; } } From 0afe5f62ef5f709db5710174aa5b68f6e7f5888b Mon Sep 17 00:00:00 2001 From: bg56530 Date: Sun, 29 Mar 2020 15:58:21 +0000 Subject: [PATCH 088/120] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index aab47271c0..234f8dace7 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1470,5 +1470,6 @@ "NoCreatedLibraries": "Il semblerait que vous n'ayez créé aucune librairie. {0}Voulez-vous en créer une maintenant ?{1}", "PlaybackErrorNoCompatibleStream": "Problème de profil client, le serveur n’a pas pu envoyer un format média compatible.", "PreferEmbeddedEpisodeInfosOverFileNames": "Préférer les informations intégrées aux noms de fichiers", - "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Utilise les informations des métadonnées intégrées, si disponible." + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Utilise les informations des métadonnées intégrées, si disponible.", + "ClientSettings": "Paramètres Client" } From ace822a8af8441874ab997fb10d2524259ea73a6 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 29 Mar 2020 22:04:36 +0300 Subject: [PATCH 089/120] Switch to new version of JavascriptSubtitlesOctopus, enable new options --- package.json | 2 +- src/components/htmlvideoplayer/plugin.js | 14 +++++++++++++- yarn.lock | 4 ++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 2df8c1a637..602f20c092 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto", "jquery": "^3.4.1", "jstree": "^3.3.7", - "libass-wasm": "https://github.com/jellyfin/JavascriptSubtitlesOctopus", + "libass-wasm": "https://github.com/jellyfin/JavascriptSubtitlesOctopus#4.0.0-jf", "material-design-icons-iconfont": "^5.0.1", "native-promise-only": "^0.8.0-a", "page": "^1.11.5", diff --git a/src/components/htmlvideoplayer/plugin.js b/src/components/htmlvideoplayer/plugin.js index 995df6607b..97056f80ff 100644 --- a/src/components/htmlvideoplayer/plugin.js +++ b/src/components/htmlvideoplayer/plugin.js @@ -1058,7 +1058,19 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa legacyWorkerUrl: appRouter.baseUrl() + "/libraries/subtitles-octopus-worker-legacy.js", onError: function() { htmlMediaHelper.onErrorInternal(self, 'mediadecodeerror'); - } + }, + + // new octopus options; override all, even defaults + renderMode: 'blend', + dropAllAnimations: false, + libassMemoryLimit: 40, + libassGlyphLimit: 40, + targetFps: 24, + prescaleTradeoff: 0.8, + softHeightLimit: 1080, + hardHeightLimit: 2160, + resizeVariation: 0.2, + renderAhead: 90 }; require(['JavascriptSubtitlesOctopus'], function(SubtitlesOctopus) { currentSubtitlesOctopus = new SubtitlesOctopus(options); diff --git a/yarn.lock b/yarn.lock index 5641ad41a5..d356ba6086 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6576,9 +6576,9 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -"libass-wasm@https://github.com/jellyfin/JavascriptSubtitlesOctopus": +"libass-wasm@https://github.com/jellyfin/JavascriptSubtitlesOctopus#4.0.0-jf": version "4.0.0" - resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#1d12af0b04fb2337570b57d706dd97db2f904b9d" + resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#7e6b75dcab9f7dad12719983510d05242803707c" liftoff@^3.1.0: version "3.1.0" From 30ecc52ba4af24544f6f6f99b0fe453e1ef91aea Mon Sep 17 00:00:00 2001 From: Nazar78 Date: Sun, 29 Mar 2020 05:40:33 +0800 Subject: [PATCH 090/120] Support H264 Level 52 (Tizen 5.0) - app only --- src/scripts/browserdeviceprofile.js | 38 +++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/scripts/browserdeviceprofile.js b/src/scripts/browserdeviceprofile.js index 337463987c..e5e3fd67c0 100644 --- a/src/scripts/browserdeviceprofile.js +++ b/src/scripts/browserdeviceprofile.js @@ -355,6 +355,31 @@ define(['browser'], function (browser) { // Not sure how to test for this var supportsMp2VideoAudio = browser.edgeUwp || browser.tizen || browser.orsay || browser.web0s; + // Get Tizen version & support + var getTizenVersion = self.tizen && self.tizen.systeminfo ? + parseFloat(tizen.systeminfo.getCapability('http://tizen.org/feature/platform.version')) : null; + + function getTizenSupport(feature, version, current) { + if (getTizenVersion) { + var version = parseFloat(version); + switch(feature) { + case 'supportsDts': + if (getTizenVersion >= version) { + current = false; + } + break; + case 'maxH264Level': + if (getTizenVersion >= version) { + current = 52; + } + break; + default: + break; + } + } + return current; + } + var maxVideoWidth = browser.xboxOne ? (self.screen ? self.screen.width : null) : null; @@ -433,14 +458,8 @@ define(['browser'], function (browser) { var supportsDts = browser.tizen || browser.orsay || browser.web0s || options.supportsDts; - if (self.tizen && self.tizen.systeminfo) { - var v = tizen.systeminfo.getCapability('http://tizen.org/feature/platform.version'); - - // DTS audio not supported in 2018 models (Tizen 4.0) - if (v && parseFloat(v) >= parseFloat('4.0')) { - supportsDts = false; - } - } + // DTS audio not supported in 2018 models (Tizen 4.0) + supportsDts = getTizenSupport('supportsDts', '4.0', supportsDts); if (supportsDts) { videoAudioCodecs.push('dca'); @@ -766,6 +785,9 @@ define(['browser'], function (browser) { maxH264Level = 51; } + // Support H264 Level 52 (Tizen 5.0) + maxH264Level = getTizenSupport('maxH264Level', '5.0', maxH264Level); + if (browser.tizen || browser.orsay || videoTestElement.canPlayType('video/mp4; codecs="avc1.6e0033"').replace(/no/, '')) { From 3f11095fec66cf91a7846fef17bfc6b0234b74b0 Mon Sep 17 00:00:00 2001 From: Nazar78 Date: Sun, 29 Mar 2020 05:40:33 +0800 Subject: [PATCH 091/120] Support H264 Level 52 (Tizen 5.0) - app only --- src/scripts/browserdeviceprofile.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/scripts/browserdeviceprofile.js b/src/scripts/browserdeviceprofile.js index 337463987c..570c0d2fa1 100644 --- a/src/scripts/browserdeviceprofile.js +++ b/src/scripts/browserdeviceprofile.js @@ -433,13 +433,9 @@ define(['browser'], function (browser) { var supportsDts = browser.tizen || browser.orsay || browser.web0s || options.supportsDts; - if (self.tizen && self.tizen.systeminfo) { - var v = tizen.systeminfo.getCapability('http://tizen.org/feature/platform.version'); - - // DTS audio not supported in 2018 models (Tizen 4.0) - if (v && parseFloat(v) >= parseFloat('4.0')) { - supportsDts = false; - } + // DTS audio not supported in 2018 models (Tizen 4.0) + if (browser.tizenVersion >= 4) { + supportsDts = false; } if (supportsDts) { @@ -766,6 +762,11 @@ define(['browser'], function (browser) { maxH264Level = 51; } + // Support H264 Level 52 (Tizen 5.0) - app only + if (browser.tizenVersion >= 5 && window.NativeShell) { + maxH264Level = 52; + } + if (browser.tizen || browser.orsay || videoTestElement.canPlayType('video/mp4; codecs="avc1.6e0033"').replace(/no/, '')) { From 0c0b91b7a5833ff311fa3d8fbddf27e833c40e69 Mon Sep 17 00:00:00 2001 From: Nazar78 Date: Mon, 30 Mar 2020 17:02:16 +0800 Subject: [PATCH 092/120] Support H264 Level 52 (Tizen 5.0) - app only --- src/scripts/browserdeviceprofile.js | 900 ++++++++++++++++++++++++++++ 1 file changed, 900 insertions(+) create mode 100644 src/scripts/browserdeviceprofile.js diff --git a/src/scripts/browserdeviceprofile.js b/src/scripts/browserdeviceprofile.js new file mode 100644 index 0000000000..570c0d2fa1 --- /dev/null +++ b/src/scripts/browserdeviceprofile.js @@ -0,0 +1,900 @@ +define(['browser'], function (browser) { + 'use strict'; + + function canPlayH264(videoTestElement) { + return !!(videoTestElement.canPlayType && videoTestElement.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, '')); + } + + function canPlayH265(videoTestElement, options) { + if (browser.tizen || browser.orsay || browser.xboxOne || browser.web0s || options.supportsHevc) { + return true; + } + + var userAgent = navigator.userAgent.toLowerCase(); + if (browser.chromecast) { + var isChromecastUltra = userAgent.indexOf('aarch64') !== -1; + if (isChromecastUltra) { + return true; + } + } + + if (browser.ps4) { + return false; + } + + return !!videoTestElement.canPlayType && + (videoTestElement.canPlayType('video/mp4; codecs="hvc1.1.L120"').replace(/no/, '') || + videoTestElement.canPlayType('video/mp4; codecs="hev1.1.L120"').replace(/no/, '') || + videoTestElement.canPlayType('video/mp4; codecs="hvc1.1.0.L120"').replace(/no/, '') || + videoTestElement.canPlayType('video/mp4; codecs="hev1.1.0.L120"').replace(/no/, '')); + } + + var _supportsTextTracks; + function supportsTextTracks() { + if (browser.tizen || browser.orsay) { + return true; + } + + if (_supportsTextTracks == null) { + _supportsTextTracks = document.createElement('video').textTracks != null; + } + + // For now, until ready + return _supportsTextTracks; + } + + var _canPlayHls; + function canPlayHls() { + if (_canPlayHls == null) { + _canPlayHls = canPlayNativeHls() || canPlayHlsWithMSE(); + } + + return _canPlayHls; + } + + function canPlayNativeHls() { + if (browser.tizen || browser.orsay) { + return true; + } + + var media = document.createElement('video'); + if (media.canPlayType('application/x-mpegURL').replace(/no/, '') || + media.canPlayType('application/vnd.apple.mpegURL').replace(/no/, '')) { + return true; + } + + return false; + } + + function canPlayHlsWithMSE() { + // text tracks don’t work with this in firefox + return window.MediaSource != null; + } + + function supportsAc3(videoTestElement) { + if (browser.edgeUwp || browser.tizen || browser.orsay || browser.web0s) { + return true; + } + + return videoTestElement.canPlayType('audio/mp4; codecs="ac-3"').replace(/no/, ''); + } + + function supportsEac3(videoTestElement) { + if (browser.tizen || browser.orsay || browser.web0s) { + return true; + } + + return videoTestElement.canPlayType('audio/mp4; codecs="ec-3"').replace(/no/, ''); + } + + function supportsAc3InHls(videoTestElement) { + if (browser.tizen || browser.orsay || browser.web0s) { + return true; + } + + if (videoTestElement.canPlayType) { + return videoTestElement.canPlayType('application/x-mpegurl; codecs="avc1.42E01E, ac-3"').replace(/no/, '') || + videoTestElement.canPlayType('application/vnd.apple.mpegURL; codecs="avc1.42E01E, ac-3"').replace(/no/, ''); + } + + return false; + } + + function canPlayAudioFormat(format) { + var typeString; + + if (format === 'flac') { + if (browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp) { + return true; + } + } else if (format === 'wma') { + if (browser.tizen || browser.orsay || browser.edgeUwp) { + return true; + } + } else if (format === 'asf') { + if (browser.tizen || browser.web0s || browser.edgeUwp) { + return true; + } + } else if (format === 'opus') { + if (!browser.web0s) { + typeString = 'audio/ogg; codecs="opus"'; + return !!document.createElement('audio').canPlayType(typeString).replace(/no/, ''); + } + + return false; + } else if (format === 'alac') { + if (browser.iOS || browser.osx) { + return true; + } + } else if (format === 'mp2') { + // For now + return false; + } + + if (format === 'webma') { + typeString = 'audio/webm'; + } else if (format === 'mp2') { + typeString = 'audio/mpeg'; + } else { + typeString = 'audio/' + format; + } + + return !!document.createElement('audio').canPlayType(typeString).replace(/no/, ''); + } + + function testCanPlayMkv(videoTestElement) { + if (browser.tizen || browser.orsay || browser.web0s) { + return true; + } + + if (videoTestElement.canPlayType('video/x-matroska').replace(/no/, '') || + videoTestElement.canPlayType('video/mkv').replace(/no/, '')) { + return true; + } + + // Unfortunately there's no real way to detect mkv support + if (browser.chrome) { + // Not supported on opera tv + if (browser.operaTv) { + return false; + } + + var userAgent = navigator.userAgent.toLowerCase(); + + // Filter out browsers based on chromium that don't support mkv + if (userAgent.indexOf('vivaldi') !== -1 || userAgent.indexOf('opera') !== -1) { + return false; + } + + return true; + } + + if (browser.edgeUwp) { + return true; + } + + return false; + } + + function testCanPlayTs() { + return browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + } + + function supportsMpeg2Video() { + return browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + } + + function supportsVc1() { + return browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + } + + function getFlvMseDirectPlayProfile() { + var videoAudioCodecs = ['aac']; + if (!browser.edge && !browser.msie) { + videoAudioCodecs.push('mp3'); + } + + return { + Container: 'flv', + Type: 'Video', + VideoCodec: 'h264', + AudioCodec: videoAudioCodecs.join(',') + }; + } + + function getDirectPlayProfileForVideoContainer(container, videoAudioCodecs, videoTestElement, options) { + var supported = false; + var profileContainer = container; + var videoCodecs = []; + + switch (container) { + case 'asf': + supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + videoAudioCodecs = []; + break; + case 'avi': + supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + // New Samsung TV don't support XviD/DivX + // Explicitly add supported codecs to make other codecs be transcoded + if (browser.tizenVersion >= 4) { + videoCodecs.push('h264'); + if (canPlayH265(videoTestElement, options)) { + videoCodecs.push('h265'); + videoCodecs.push('hevc'); + } + } + break; + case 'mpg': + case 'mpeg': + supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + break; + case 'flv': + supported = browser.tizen || browser.orsay; + //if (!supported && window.MediaSource != null && window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"')) { + // return getFlvMseDirectPlayProfile(); + //} + break; + case '3gp': + case 'mts': + case 'trp': + case 'vob': + case 'vro': + supported = browser.tizen || browser.orsay; + break; + case 'mov': + supported = browser.tizen || browser.orsay || browser.web0s || browser.chrome || browser.edgeUwp; + videoCodecs.push('h264'); + break; + case 'm2ts': + supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + videoCodecs.push('h264'); + if (supportsVc1()) { + videoCodecs.push('vc1'); + } + if (supportsMpeg2Video()) { + videoCodecs.push('mpeg2video'); + } + break; + case 'wmv': + supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; + videoAudioCodecs = []; + break; + case 'ts': + supported = testCanPlayTs(); + videoCodecs.push('h264'); + if (canPlayH265(videoTestElement, options)) { + videoCodecs.push('h265'); + videoCodecs.push('hevc'); + } + if (supportsVc1()) { + videoCodecs.push('vc1'); + } + if (supportsMpeg2Video()) { + videoCodecs.push('mpeg2video'); + } + profileContainer = 'ts,mpegts'; + break; + default: + break; + } + + return supported ? { + Container: profileContainer, + Type: 'Video', + VideoCodec: videoCodecs.join(','), + AudioCodec: videoAudioCodecs.join(',') + } : null; + } + + function getMaxBitrate() { + return 120000000; + } + + function getGlobalMaxVideoBitrate() { + var userAgent = navigator.userAgent.toLowerCase(); + if (browser.chromecast) { + var isChromecastUltra = userAgent.indexOf('aarch64') !== -1; + if (isChromecastUltra) { + return null; + } + + // This is a hack to try and detect chromecast on vizio + if (self.screen && self.screen.width >= 3800) { + return null; + } + + return 30000000; + } + + var isTizenFhd = false; + if (browser.tizen) { + try { + var isTizenUhd = webapis.productinfo.isUdPanelSupported(); + isTizenFhd = !isTizenUhd; + console.debug("isTizenFhd = " + isTizenFhd); + } catch (error) { + console.error("isUdPanelSupported() error code = " + error.code); + } + } + + return browser.ps4 ? 8000000 : + (browser.xboxOne ? 12000000 : + (browser.edgeUwp ? null : + (browser.tizen && isTizenFhd ? 20000000 : null))); + } + + return function (options) { + options = options || {}; + + var physicalAudioChannels = options.audioChannels || (browser.tv || browser.ps4 || browser.xboxOne ? 6 : 2); + + var bitrateSetting = getMaxBitrate(); + + var videoTestElement = document.createElement('video'); + + var canPlayVp8 = videoTestElement.canPlayType('video/webm; codecs="vp8"').replace(/no/, ''); + var canPlayVp9 = videoTestElement.canPlayType('video/webm; codecs="vp9"').replace(/no/, ''); + var webmAudioCodecs = ['vorbis']; + + var canPlayMkv = testCanPlayMkv(videoTestElement); + + var profile = {}; + + profile.MaxStreamingBitrate = bitrateSetting; + profile.MaxStaticBitrate = 100000000; + profile.MusicStreamingTranscodingBitrate = Math.min(bitrateSetting, 192000); + + profile.DirectPlayProfiles = []; + + var videoAudioCodecs = []; + var hlsVideoAudioCodecs = []; + + var supportsMp3VideoAudio = videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.69"').replace(/no/, '') || + videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.6B"').replace(/no/, ''); + + // Not sure how to test for this + var supportsMp2VideoAudio = browser.edgeUwp || browser.tizen || browser.orsay || browser.web0s; + + var maxVideoWidth = browser.xboxOne ? + (self.screen ? self.screen.width : null) : + null; + + if (options.maxVideoWidth) { + maxVideoWidth = options.maxVideoWidth; + } + + var canPlayAacVideoAudio = videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.2"').replace(/no/, ''); + + if (canPlayAacVideoAudio && browser.chromecast && physicalAudioChannels <= 2) { + // prioritize this first + videoAudioCodecs.push('aac'); + } + + // Only put mp3 first if mkv support is there + // Otherwise with HLS and mp3 audio we're seeing some browsers + // safari is lying + if (supportsAc3(videoTestElement)) { + + videoAudioCodecs.push('ac3'); + + var eAc3 = supportsEac3(videoTestElement); + if (eAc3) { + videoAudioCodecs.push('eac3'); + } + + // This works in edge desktop, but not mobile + // TODO: Retest this on mobile + if (supportsAc3InHls(videoTestElement)) { + hlsVideoAudioCodecs.push('ac3'); + if (eAc3) { + hlsVideoAudioCodecs.push('eac3'); + } + } + } + + if (canPlayAacVideoAudio && browser.chromecast && videoAudioCodecs.indexOf('aac') === -1) { + // prioritize this first + videoAudioCodecs.push('aac'); + } + + if (supportsMp3VideoAudio) { + videoAudioCodecs.push('mp3'); + + // PS4 fails to load HLS with mp3 audio + if (!browser.ps4) { + // mp3 encoder only supports 2 channels, so only make that preferred if we're only requesting 2 channels + // Also apply it for chromecast because it no longer supports AAC 5.1 + if (physicalAudioChannels <= 2) { + hlsVideoAudioCodecs.push('mp3'); + } + } + } + + if (canPlayAacVideoAudio) { + if (videoAudioCodecs.indexOf('aac') === -1) { + videoAudioCodecs.push('aac'); + } + + hlsVideoAudioCodecs.push('aac'); + } + + if (supportsMp3VideoAudio) { + // PS4 fails to load HLS with mp3 audio + if (!browser.ps4) { + if (hlsVideoAudioCodecs.indexOf('mp3') === -1) { + hlsVideoAudioCodecs.push('mp3'); + } + } + } + + if (supportsMp2VideoAudio) { + videoAudioCodecs.push('mp2'); + } + + var supportsDts = browser.tizen || browser.orsay || browser.web0s || options.supportsDts; + + // DTS audio not supported in 2018 models (Tizen 4.0) + if (browser.tizenVersion >= 4) { + supportsDts = false; + } + + if (supportsDts) { + videoAudioCodecs.push('dca'); + videoAudioCodecs.push('dts'); + } + + if (browser.tizen || browser.orsay || browser.web0s) { + videoAudioCodecs.push('pcm_s16le'); + videoAudioCodecs.push('pcm_s24le'); + } + + if (options.supportsTrueHd) { + videoAudioCodecs.push('truehd'); + } + + if (browser.tizen || browser.orsay) { + videoAudioCodecs.push('aac_latm'); + } + + if (canPlayAudioFormat('opus')) { + videoAudioCodecs.push('opus'); + hlsVideoAudioCodecs.push('opus'); + webmAudioCodecs.push('opus'); + } + + if (canPlayAudioFormat('flac')) { + videoAudioCodecs.push('flac'); + } + + videoAudioCodecs = videoAudioCodecs.filter(function (c) { + return (options.disableVideoAudioCodecs || []).indexOf(c) === -1; + }); + + hlsVideoAudioCodecs = hlsVideoAudioCodecs.filter(function (c) { + return (options.disableHlsVideoAudioCodecs || []).indexOf(c) === -1; + }); + + var mp4VideoCodecs = []; + var hlsVideoCodecs = []; + + if (canPlayH264(videoTestElement)) { + mp4VideoCodecs.push('h264'); + hlsVideoCodecs.push('h264'); + } + + if (canPlayH265(videoTestElement, options)) { + mp4VideoCodecs.push('h265'); + mp4VideoCodecs.push('hevc'); + + if (browser.tizen || browser.web0s) { + hlsVideoCodecs.push('h265'); + hlsVideoCodecs.push('hevc'); + } + } + + if (supportsMpeg2Video()) { + mp4VideoCodecs.push('mpeg2video'); + } + + if (supportsVc1()) { + mp4VideoCodecs.push('vc1'); + } + + if (browser.tizen || browser.orsay) { + mp4VideoCodecs.push('msmpeg4v2'); + } + + if (canPlayVp8) { + mp4VideoCodecs.push('vp8'); + } + + if (canPlayVp9) { + mp4VideoCodecs.push('vp9'); + } + + if (canPlayVp8 || browser.tizen || browser.orsay) { + videoAudioCodecs.push('vorbis'); + } + + if (mp4VideoCodecs.length) { + profile.DirectPlayProfiles.push({ + Container: 'mp4,m4v', + Type: 'Video', + VideoCodec: mp4VideoCodecs.join(','), + AudioCodec: videoAudioCodecs.join(',') + }); + } + + if (canPlayMkv && mp4VideoCodecs.length) { + profile.DirectPlayProfiles.push({ + Container: 'mkv', + Type: 'Video', + VideoCodec: mp4VideoCodecs.join(','), + AudioCodec: videoAudioCodecs.join(',') + }); + } + + // These are formats we can't test for but some devices will support + ['m2ts', 'wmv', 'ts', 'asf', 'avi', 'mpg', 'mpeg', 'flv', '3gp', 'mts', 'trp', 'vob', 'vro', 'mov'].map(function (container) { + return getDirectPlayProfileForVideoContainer(container, videoAudioCodecs, videoTestElement, options); + }).filter(function (i) { + return i != null; + }).forEach(function (i) { + profile.DirectPlayProfiles.push(i); + }); + + ['opus', 'mp3', 'mp2', 'aac', 'flac', 'alac', 'webma', 'wma', 'wav', 'ogg', 'oga'].filter(canPlayAudioFormat).forEach(function (audioFormat) { + + if (audioFormat === 'mp2') { + profile.DirectPlayProfiles.push({ + Container: 'mp2,mp3', + Type: 'Audio', + AudioCodec: audioFormat + }); + } else if (audioFormat === 'mp3') { + profile.DirectPlayProfiles.push({ + Container: audioFormat, + Type: 'Audio', + AudioCodec: audioFormat + }); + } else { + profile.DirectPlayProfiles.push({ + Container: audioFormat === 'webma' ? 'webma,webm' : audioFormat, + Type: 'Audio' + }); + } + + // aac also appears in the m4a and m4b container + if (audioFormat === 'aac' || audioFormat === 'alac') { + profile.DirectPlayProfiles.push({ + Container: 'm4a,m4b', + AudioCodec: audioFormat, + Type: 'Audio' + }); + } + }); + + if (canPlayVp8) { + profile.DirectPlayProfiles.push({ + Container: 'webm', + Type: 'Video', + AudioCodec: webmAudioCodecs.join(','), + VideoCodec: 'VP8' + }); + } + + if (canPlayVp9) { + profile.DirectPlayProfiles.push({ + Container: 'webm', + Type: 'Video', + AudioCodec: webmAudioCodecs.join(','), + VideoCodec: 'VP9' + }); + } + + profile.TranscodingProfiles = []; + + var hlsBreakOnNonKeyFrames = browser.iOS || browser.osx || browser.edge || !canPlayNativeHls() ? true : false; + + if (canPlayHls() && browser.enableHlsAudio !== false) { + profile.TranscodingProfiles.push({ + // hlsjs, edge, and android all seem to require ts container + Container: !canPlayNativeHls() || browser.edge || browser.android ? 'ts' : 'aac', + Type: 'Audio', + AudioCodec: 'aac', + Context: 'Streaming', + Protocol: 'hls', + MaxAudioChannels: physicalAudioChannels.toString(), + MinSegments: browser.iOS || browser.osx ? '2' : '1', + BreakOnNonKeyFrames: hlsBreakOnNonKeyFrames + }); + } + + // For streaming, prioritize opus transcoding after mp3/aac. It is too problematic with random failures + // But for static (offline sync), it will be just fine. + // Prioritize aac higher because the encoder can accept more channels than mp3 + ['aac', 'mp3', 'opus', 'wav'].filter(canPlayAudioFormat).forEach(function (audioFormat) { + profile.TranscodingProfiles.push({ + Container: audioFormat, + Type: 'Audio', + AudioCodec: audioFormat, + Context: 'Streaming', + Protocol: 'http', + MaxAudioChannels: physicalAudioChannels.toString() + }); + }); + + ['opus', 'mp3', 'aac', 'wav'].filter(canPlayAudioFormat).forEach(function (audioFormat) { + profile.TranscodingProfiles.push({ + Container: audioFormat, + Type: 'Audio', + AudioCodec: audioFormat, + Context: 'Static', + Protocol: 'http', + MaxAudioChannels: physicalAudioChannels.toString() + }); + }); + + if (canPlayMkv && !browser.tizen && !browser.orsay && options.enableMkvProgressive !== false) { + profile.TranscodingProfiles.push({ + Container: 'mkv', + Type: 'Video', + AudioCodec: videoAudioCodecs.join(','), + VideoCodec: mp4VideoCodecs.join(','), + Context: 'Streaming', + MaxAudioChannels: physicalAudioChannels.toString(), + CopyTimestamps: true + }); + } + + if (canPlayMkv) { + profile.TranscodingProfiles.push({ + Container: 'mkv', + Type: 'Video', + AudioCodec: videoAudioCodecs.join(','), + VideoCodec: mp4VideoCodecs.join(','), + Context: 'Static', + MaxAudioChannels: physicalAudioChannels.toString(), + CopyTimestamps: true + }); + } + + if (canPlayHls() && hlsVideoAudioCodecs.length && options.enableHls !== false) { + profile.TranscodingProfiles.push({ + Container: 'ts', + Type: 'Video', + AudioCodec: hlsVideoAudioCodecs.join(','), + VideoCodec: hlsVideoCodecs.join(','), + Context: 'Streaming', + Protocol: 'hls', + MaxAudioChannels: physicalAudioChannels.toString(), + MinSegments: browser.iOS || browser.osx ? '2' : '1', + BreakOnNonKeyFrames: hlsBreakOnNonKeyFrames + }); + } + + if (canPlayVp8) { + profile.TranscodingProfiles.push({ + Container: 'webm', + Type: 'Video', + AudioCodec: 'vorbis', + VideoCodec: 'vpx', + Context: 'Streaming', + Protocol: 'http', + // If audio transcoding is needed, limit channels to number of physical audio channels + // Trying to transcode to 5 channels when there are only 2 speakers generally does not sound good + MaxAudioChannels: physicalAudioChannels.toString() + }); + } + + profile.TranscodingProfiles.push({ + Container: 'mp4', + Type: 'Video', + AudioCodec: videoAudioCodecs.join(','), + VideoCodec: 'h264', + Context: 'Static', + Protocol: 'http' + }); + + profile.ContainerProfiles = []; + + profile.CodecProfiles = []; + + var supportsSecondaryAudio = browser.tizen || browser.orsay || videoTestElement.audioTracks; + + var aacCodecProfileConditions = []; + + // Handle he-aac not supported + if (!videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.5"').replace(/no/, '')) { + // TODO: This needs to become part of the stream url in order to prevent stream copy + aacCodecProfileConditions.push({ + Condition: 'NotEquals', + Property: 'AudioProfile', + Value: 'HE-AAC' + }); + } + + if (!supportsSecondaryAudio) { + aacCodecProfileConditions.push({ + Condition: 'Equals', + Property: 'IsSecondaryAudio', + Value: 'false', + IsRequired: false + }); + } + + if (browser.chromecast) { + aacCodecProfileConditions.push({ + Condition: 'LessThanEqual', + Property: 'AudioChannels', + Value: '2', + IsRequired: true + }); + } + + if (aacCodecProfileConditions.length) { + profile.CodecProfiles.push({ + Type: 'VideoAudio', + Codec: 'aac', + Conditions: aacCodecProfileConditions + }); + } + + if (!supportsSecondaryAudio) { + profile.CodecProfiles.push({ + Type: 'VideoAudio', + Conditions: [ + { + Condition: 'Equals', + Property: 'IsSecondaryAudio', + Value: 'false', + IsRequired: false + } + ] + }); + } + + var maxH264Level = 42; + var h264Profiles = 'high|main|baseline|constrained baseline'; + + if (browser.tizen || browser.orsay || browser.web0s || + videoTestElement.canPlayType('video/mp4; codecs="avc1.640833"').replace(/no/, '')) { + maxH264Level = 51; + } + + // Support H264 Level 52 (Tizen 5.0) - app only + if (browser.tizenVersion >= 5 && window.NativeShell) { + maxH264Level = 52; + } + + if (browser.tizen || browser.orsay || + videoTestElement.canPlayType('video/mp4; codecs="avc1.6e0033"').replace(/no/, '')) { + + // These tests are passing in safari, but playback is failing + if (!browser.safari && !browser.iOS && !browser.web0s && !browser.edge && !browser.mobile) { + h264Profiles += '|high 10'; + } + } + + profile.CodecProfiles.push({ + Type: 'Video', + Codec: 'h264', + Conditions: [ + { + Condition: 'NotEquals', + Property: 'IsAnamorphic', + Value: 'true', + IsRequired: false + }, + { + Condition: 'EqualsAny', + Property: 'VideoProfile', + Value: h264Profiles, + IsRequired: false + }, + { + Condition: 'LessThanEqual', + Property: 'VideoLevel', + Value: maxH264Level.toString(), + IsRequired: false + } + ] + }); + + if (!browser.edgeUwp && !browser.tizen && !browser.orsay && !browser.web0s) { + //profile.CodecProfiles[profile.CodecProfiles.length - 1].Conditions.push({ + // Condition: 'NotEquals', + // Property: 'IsAVC', + // Value: 'false', + // IsRequired: false + //}); + + //profile.CodecProfiles[profile.CodecProfiles.length - 1].Conditions.push({ + // Condition: 'NotEquals', + // Property: 'IsInterlaced', + // Value: 'true', + // IsRequired: false + //}); + } + + if (maxVideoWidth) { + profile.CodecProfiles[profile.CodecProfiles.length - 1].Conditions.push({ + Condition: 'LessThanEqual', + Property: 'Width', + Value: maxVideoWidth.toString(), + IsRequired: false + }); + } + + var globalMaxVideoBitrate = (getGlobalMaxVideoBitrate() || '').toString(); + + var h264MaxVideoBitrate = globalMaxVideoBitrate; + + if (h264MaxVideoBitrate) { + profile.CodecProfiles[profile.CodecProfiles.length - 1].Conditions.push({ + Condition: 'LessThanEqual', + Property: 'VideoBitrate', + Value: h264MaxVideoBitrate, + IsRequired: true + }); + } + + var globalVideoConditions = []; + + if (globalMaxVideoBitrate) { + globalVideoConditions.push({ + Condition: 'LessThanEqual', + Property: 'VideoBitrate', + Value: globalMaxVideoBitrate + }); + } + + if (maxVideoWidth) { + globalVideoConditions.push({ + Condition: 'LessThanEqual', + Property: 'Width', + Value: maxVideoWidth.toString(), + IsRequired: false + }); + } + + if (globalVideoConditions.length) { + profile.CodecProfiles.push({ + Type: 'Video', + Conditions: globalVideoConditions + }); + } + + if (browser.chromecast) { + profile.CodecProfiles.push({ + Type: 'Audio', + Codec: 'flac', + Conditions: [ + { + Condition: 'LessThanEqual', + Property: 'AudioSampleRate', + Value: '96000' + }] + }); + } + + // Subtitle profiles + // External vtt or burn in + profile.SubtitleProfiles = []; + if (supportsTextTracks()) { + profile.SubtitleProfiles.push({ + Format: 'vtt', + Method: 'External' + }); + } + + profile.ResponseProfiles = []; + profile.ResponseProfiles.push({ + Type: 'Video', + Container: 'm4v', + MimeType: 'video/mp4' + }); + + return profile; + }; +}); From 41896e126ae0e29383408d0aa159fce0aaf5126f Mon Sep 17 00:00:00 2001 From: NoFrosty Date: Mon, 30 Mar 2020 07:28:46 +0000 Subject: [PATCH 093/120] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 234f8dace7..ced0674031 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1446,7 +1446,7 @@ "LabelAudioChannels": "Canaux audio :", "HeaderFavoriteBooks": "Livres préférés", "FetchingData": "Récuperer des données suplémentaires", - "CopyStreamURLSuccess": "URL copiée.", + "CopyStreamURLSuccess": "URL copiée avec succès", "CopyStreamURL": "Copier l'URL du flux", "LabelBaseUrlHelp": "Vous pouvez ajouter un sous-répertoire personalisé ici pour accéder au serveur depuis une URL plus exclusive.", "HeaderFavoritePeople": "Personnes préférées", @@ -1460,9 +1460,9 @@ "LabelStreamType": "Type de flux :", "EnableFastImageFadeInHelp": "Activer un transition plus rapide pour images téléchargées", "EnableFastImageFadeIn": "Transition d'image rapide", - "LabelPlayerDimensions": "Dimension du lecteur:", - "LabelDroppedFrames": "Images perdues:", - "LabelCorruptedFrames": "Images corrompues:", + "LabelPlayerDimensions": "Dimension du lecteur :", + "LabelDroppedFrames": "Images perdues :", + "LabelCorruptedFrames": "Images corrompues :", "CopyStreamURLError": "Il y a eu une erreur lors de la copie du URL.", "AskAdminToCreateLibrary": "Demander à un administrateur de créer une médiathèque.", "AllowFfmpegThrottlingHelp": "Quand le transcodage ou le remultiplexage est suffisamment loin de la position de lecture, le processus se mettra en pause afin d’économiser des ressources. Plus utile lors d’une lecture continue. À désactiver en cas de problèmes de lecture.", From d8fb547035b6cea7d23bc5e56957db1596dbbed0 Mon Sep 17 00:00:00 2001 From: AdmiralAnimE Date: Mon, 30 Mar 2020 14:12:03 +0000 Subject: [PATCH 094/120] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index e6aaa30fb1..bf264bbcfb 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -303,9 +303,9 @@ "LabelCriticRating": "Оценка на критиците:", "LabelCurrentPassword": "Текуща парола:", "LabelCustomCertificatePath": "Път към потребителския сертификат:", - "LabelCustomCertificatePathHelp": "Път до файл с шифровъчен стандарт №12, съдържащ сертификат и частен ключ за поддръжка на протокол TLS на собствен домейн.", + "LabelCustomCertificatePathHelp": "Път до файл с шифровъчен стандарт №12 (PKCS #12), съдържащ сертификат и частен ключ за поддръжка на протокол TLS на собствен домейн.", "LabelCustomCss": "CSS по избор:", - "LabelCustomCssHelp": "Използвайте собствен CSS към уеб интерфейса.", + "LabelCustomCssHelp": "Използвайте собствен CSS към мрежовия интерфейс.", "LabelCustomDeviceDisplayName": "Показвано име:", "LabelCustomRating": "Оценка по избор:", "LabelDashboardTheme": "Облик на сървърното табло:", @@ -834,5 +834,10 @@ "AllowOnTheFlySubtitleExtraction": "Позволява моментално извличане на поднадписи", "AllowHWTranscodingHelp": "Позволява на тунера да прекодира моментално. Това може да помогне за редуциране на прекодирането от сървъра.", "AddItemToCollectionHelp": "Добавяне към колекция чрез търсенето им и използване на дясно-щракване с мишката или контекстното меню.", - "Absolute": "Aбсолютен" + "Absolute": "Aбсолютен", + "LabelLanNetworks": "Локални мрежи:", + "LabelKodiMetadataSaveImagePathsHelp": "Препоръчително е ако имате изображения, пътят към които не е съобразен с изискванията на Коди.", + "LabelKodiMetadataSaveImagePaths": "Записване на пътеките към изображенията в nfo файловете", + "LabelChannels": "Канали:", + "DropShadow": "Сянка" } From 86c2201718ef9df8b30a05adae7e8da88a8e8caf Mon Sep 17 00:00:00 2001 From: abdulaziz Date: Mon, 30 Mar 2020 22:18:06 +0000 Subject: [PATCH 095/120] Translated using Weblate (Arabic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/ --- src/strings/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ar.json b/src/strings/ar.json index 18ceb61dea..7fae30a084 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -918,7 +918,7 @@ "HeaderFavoriteEpisodes": "الحلقات المفضلة", "HeaderFavoriteArtists": "الفنانون المفضلون", "Shows": "الحلقات", - "Books": "كتب", + "Books": "الكتب", "ValueSpecialEpisodeName": "مميز - {0}", "HeaderFavoriteAlbums": "الألبومات المفضلة", "HeaderAlbumArtists": "فناني الألبومات", From 4f0dd18e59f60ff15ce697efb73d226f2e107be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Rodr=C3=ADguez?= Date: Mon, 30 Mar 2020 19:37:01 +0000 Subject: [PATCH 096/120] Translated using Weblate (Spanish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/ --- src/strings/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/es.json b/src/strings/es.json index 10eb8655e1..df8ecf483f 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1474,5 +1474,6 @@ "LabelDroppedFrames": "Frames perdidos:", "LabelCorruptedFrames": "Frames corruptos:", "AskAdminToCreateLibrary": "Solo un administrador puede crear librerías.", - "AllowFfmpegThrottling": "Acelerar transcodificación" + "AllowFfmpegThrottling": "Acelerar transcodificación", + "ClientSettings": "Ajustes de cliente" } From 35acc83b234a56559c8675ac5332c11b823189b9 Mon Sep 17 00:00:00 2001 From: Nyanmisaka <799610810@qq.com> Date: Tue, 31 Mar 2020 03:19:32 +0000 Subject: [PATCH 097/120] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 1a3aa1e4de..ccd90e05b5 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -217,7 +217,7 @@ "EveryNDays": "每 {0} 天", "ExitFullscreen": "退出全屏", "ExtraLarge": "特大", - "ExtractChapterImagesHelp": "提取章节图像将允许客户端显示一个图像形式的场景选择菜单。这个提取的过程可能会非常缓慢、占用大量 CPU 资源,并且可能需要几个GB的硬盘空间。提取将会在视频被发现时启动,同时也作为一个夜间计划任务运行。这个任务可以在“计划任务”选项中进行设置。不建议在高峰使用时间运行这个任务。", + "ExtractChapterImagesHelp": "提取剧集图片将允许客户端显示一个图像形式的场景选择菜单。这个提取的过程可能会非常缓慢、占用大量 CPU 资源,并且可能需要几个GB的硬盘空间。提取将会在视频被发现时启动,同时也作为一个夜间计划任务运行。这个任务可以在“计划任务”选项中进行设置。不建议在高峰使用时间运行这个任务。", "Extras": "额外", "FFmpegSavePathNotFound": "我们无法通过你输入的路径定位 FFmpeg。FFprobe 同样也是必要的并且应该被放在同一个文件夹中。他们通常会被打包在一起以供下载。请检查这个路径然后再试一次。", "FastForward": "快进", @@ -277,7 +277,7 @@ "HeaderCastCrew": "演职人员", "HeaderChannelAccess": "频道访问", "HeaderChannels": "频道", - "HeaderChapterImages": "章节图片", + "HeaderChapterImages": "剧集图片", "HeaderCodecProfile": "编解码器配置", "HeaderCodecProfileHelp": "编解码器的配置文件标明了设备播放特定编码时的限制。如果在限制之内则媒体将被转码,否则编解码器将被配置为直接播放。", "HeaderConfigureRemoteAccess": "配置远程访问", @@ -568,8 +568,8 @@ "LabelEpisodeNumber": "集号:", "LabelEvent": "事件:", "LabelEveryXMinutes": "每:", - "LabelExtractChaptersDuringLibraryScan": "媒体库扫描过程中解压章节图像", - "LabelExtractChaptersDuringLibraryScanHelp": "当媒体库导入视频并扫描时,将提取章节图像。否则,章节图像将在之后的计划任务提取,而媒体库会更快完成扫描。", + "LabelExtractChaptersDuringLibraryScan": "媒体库扫描过程中解压剧集图片", + "LabelExtractChaptersDuringLibraryScanHelp": "当媒体库导入视频并扫描时,将提取剧集图片。否则,剧集图片将在之后的计划任务提取,而媒体库会更快完成扫描。", "LabelFailed": "失败", "LabelFileOrUrl": "文件或网址:", "LabelFinish": "完成", @@ -998,7 +998,7 @@ "OptionEstimateContentLength": "转码时,估计内容长度", "OptionEveryday": "每天", "OptionExternallyDownloaded": "外部下载", - "OptionExtractChapterImage": "开启章节图像提取", + "OptionExtractChapterImage": "开启剧集图片提取", "OptionFavorite": "我的最爱", "OptionFriday": "星期五", "OptionHasSpecialFeatures": "特殊功能", From be60f23264f0b8f7efe13063f8a159be464f1ba4 Mon Sep 17 00:00:00 2001 From: pucherot Date: Tue, 31 Mar 2020 10:52:02 +0000 Subject: [PATCH 098/120] Translated using Weblate (Spanish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/ --- src/strings/es.json | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/strings/es.json b/src/strings/es.json index df8ecf483f..06318c22d3 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -183,7 +183,7 @@ "ErrorAddingListingsToSchedulesDirect": "Ha habido un error añadiendo la alineación a tu cuenta de Schedules Direct. Schedules Direct solo permite un determinado número de alineaciones por cuenta. Necesitarás iniciar sesión en la web de Schedules Direct y quitar otras listas de tu cuenta antes de proceder.", "ErrorAddingMediaPathToVirtualFolder": "Ha habido un error añadiendo la ruta de los medios. Por favor, asegúrate de que la ruta es válida y que el proceso del servidor Jellyfin tiene acceso a esa ubicación.", "ErrorAddingTunerDevice": "Ha habido un error añadiendo el dispositivo sintonizador. Por favor, asegúrate de que es accesible e inténtalo otra vez.", - "ErrorAddingXmlTvFile": "Hubo un un error accediendo el archivo XML. Por favor, asegurese que el archivo existe e inténtalo de nuevo.", + "ErrorAddingXmlTvFile": "Ha sucedido un error accediendo al archivo XML. Por favor, asegúrate que el archivo existe e inténtalo de nuevo.", "ErrorGettingTvLineups": "Ha habido un error descargando la programación de TV. Por favor, asegúrese que la información es correcta e inténtalo de nuevo.", "ErrorMessageStartHourGreaterThanEnd": "La hora de finalización tiene que ser mayor que la de inicio.", "ErrorPleaseSelectLineup": "Por favor selecciona una alineación e inténtalo otra vez. Si no hay alineaciones disponibles, revisa que tu nombre de usuario, contraseña y código postal son correctos.", @@ -420,7 +420,7 @@ "Help": "Ayuda", "Hide": "Ocultar", "HideWatchedContentFromLatestMedia": "Esconder medios vistos de los medios más recientes", - "HttpsRequiresCert": "Para activar la conexión segura, necesitas un certificado SSL de confianza, como Let's Encrypt. De lo contrario, desactive las conexiones seguras", + "HttpsRequiresCert": "Para activar la conexión segura, necesitas un certificado SSL de confianza, como Let's Encrypt. De lo contrario, desactive las conexiones seguras.", "Identify": "Identificar", "Images": "Imágenes", "ImportFavoriteChannelsHelp": "Si está activado, sólo los canales guardados como favoritos en el sintonizador se importarán.", @@ -1248,14 +1248,14 @@ "Descending": "Descendiente", "DirectStreamHelp1": "El tipo de archivo (H.264, AC3, etc.) y la resolución son compatibles con el dispositivo, pero no el contenedor (mkv, avi, wmv, etc.). El vídeo será re-empaquetado al vuelo antes de transmitirlo al dispositivo.", "DirectStreamHelp2": "La transmisión directa del archivo usa muy poco procesamiento sin ninguna pérdida de calidad en el vídeo.", - "Director": "Director", + "Director": "Dirección", "Directors": "Directores", "Display": "Mostrar", "DisplayInMyMedia": "Mostrar en la pantalla de inicio", "DisplayInOtherHomeScreenSections": "Mostrar en las secciones de la pantalla de inicio al igual que \"últimos\" y \"continuar viendo\"", "DisplayMissingEpisodesWithinSeasons": "Mostrar episodios ausentes en las temporadas", "DisplayMissingEpisodesWithinSeasonsHelp": "Esto también debe ser habilitado para la biblioteca de TV en la configuración del servidor.", - "DropShadow": "Sombra", + "DropShadow": "Eliminar sombra", "EditMetadata": "Editar etiquetas", "EnableBackdrops": "Imágenes de fondo", "EnableBackdropsHelp": "Mostrar imágenes de fondo en algunas páginas mientras se explora la biblioteca.", @@ -1404,7 +1404,7 @@ "RunAtStartup": "Ejecutar al iniciar", "Series": "Series", "SeriesDisplayOrderHelp": "Ordena los episodios por fecha de emisión, orden de DVD o número absoluto.", - "ShowTitle": "Mostrar título", + "ShowTitle": "Título del show", "ShowYear": "Año del show", "SmallCaps": "Letras minúsculas", "Smaller": "Más pequeño", @@ -1455,9 +1455,9 @@ "MusicLibraryHelp": "Revisar la {0}guía de nombres de música{1}.", "FetchingData": "Obteniendo datos adicionales", "ButtonAddImage": "Añadir imagen", - "HeaderFavoritePeople": "Gente Favorita", + "HeaderFavoritePeople": "Gente favorita", "OptionRandom": "Aleatorio", - "SelectAdminUsername": "Por favor seleccione un nombre de usuario para la cuenta de administrador.", + "SelectAdminUsername": "Por favor seleccione un nombre de usuario para la cuenta administrador.", "ButtonSplit": "Dividir", "HeaderNavigation": "Navegación", "MessageConfirmAppExit": "¿Quieres salir?", @@ -1475,5 +1475,7 @@ "LabelCorruptedFrames": "Frames corruptos:", "AskAdminToCreateLibrary": "Solo un administrador puede crear librerías.", "AllowFfmpegThrottling": "Acelerar transcodificación", - "ClientSettings": "Ajustes de cliente" + "ClientSettings": "Ajustes de cliente", + "PreferEmbeddedEpisodeInfosOverFileNames": "Priorizar la información embebida sobre los nombres de archivos", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Usar la información de episodio de los metadatos embebidos si está disponible." } From f6543d01795d072f9633191c7de01c3cb5d3cae0 Mon Sep 17 00:00:00 2001 From: amirmasoud Date: Tue, 31 Mar 2020 08:08:37 +0000 Subject: [PATCH 099/120] Translated using Weblate (Persian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fa/ --- src/strings/fa.json | 122 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 102 insertions(+), 20 deletions(-) diff --git a/src/strings/fa.json b/src/strings/fa.json index d4b60fe7c6..d9afcd66cc 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -35,7 +35,7 @@ "HeaderInstantMix": "درهم کردن فوری", "HeaderKodiMetadataHelp": "برای فعال یا غیرفعال سازی متاداده های Nfo ، یک کتابخانه را در صفحه تنظیم کتابخانه Jellyfin ویرایش کرده و قسمت سرورهای متاداده را مسیردهی کنید.", "HeaderLatestEpisodes": "آخرین قسمت ها", - "HeaderNextUp": "بعدی", + "HeaderNextUp": "قسمت بعدی", "HeaderPaths": "مسیرها", "HeaderPlayAll": "پخش همه", "HeaderPreferredMetadataLanguage": "زبان مدنظر اطلاعات محتوی", @@ -113,34 +113,116 @@ "UserProfilesIntro": "Jellyfin دارای پشتیبانی داخلی از پروفایل کاربران می باشد. با فعال سازی هر کاربر، او می تواند تنظیمات ، وضعیت پخش و کنترل والدین خاص خودش را داشته باشد.", "WelcomeToProject": "به Jellyfin خوش آمدید!", "WizardCompleted": "همه چیزی که فعلا می خواهیم همین است.جمع آوری اطلاعات کتابخانه های شما هم اکنون توسط Jellyfin آغاز شده است. اپلیکیشن های ما را امتحان کنید و سپس بر روی پایان کلیک کنید تا پیشخوان سرور را مشاهده نمایید.", - "Albums": "آلبوم ها", + "Albums": "آلبوم‌ها", "Artists": "هنرمندان", - "Books": "کتاب ها", - "Channels": "کانال ها", - "Collections": "کلکسیون ها", - "Favorites": "مورد علاقه ها", - "Folders": "پوشه ها", + "Books": "کتاب‌ها", + "Channels": "کانال‌ها", + "Collections": "مجموعه‌ها", + "Favorites": "مورد علاقه‌ها", + "Folders": "پوشه‌ها", "Genres": "ژانرها", "HeaderAlbumArtists": "هنرمندان آلبوم", - "HeaderFavoriteShows": "سریال های مورد علاقه", - "HeaderFavoriteEpisodes": "قسمت های مورد علاقه", - "HeaderFavoriteAlbums": "آلبوم های مورد علاقه", + "HeaderFavoriteShows": "سریال‌های مورد علاقه", + "HeaderFavoriteEpisodes": "قسمت‌های مورد علاقه", + "HeaderFavoriteAlbums": "آلبوم‌های مورد علاقه", "HeaderFavoriteArtists": "هنرمندان مورد علاقه", - "HeaderFavoriteSongs": "آهنگ های مورد علاقه", + "HeaderFavoriteSongs": "آهنگ‌های مورد علاقه", "HeaderLiveTV": "پخش زنده تلویزیون", - "Movies": "فیلم های سینمایی", - "Photos": "عکس ها", - "Playlists": "لیست های پخش", - "Shows": "سریال ها", - "Songs": "آهنگ ها", - "Sync": "همگامسازی", - "ValueSpecialEpisodeName": "ویژه- {0}", + "Movies": "فیلم‌ها", + "Photos": "عکس‌ها", + "Playlists": "لیست‌های پخش", + "Shows": "سریال‌ها", + "Songs": "موسیقی‌ها", + "Sync": "همگام‌سازی", + "ValueSpecialEpisodeName": "ویژه - {0}", "AllEpisodes": "تمام قسمت ها", "AllLanguages": "تمام زبان ها", "AllLibraries": "تمام کتابخانه ها", - "AllowHWTranscodingHelp": "اگر فعال شود, اجازه میدهید تبدیل ( کم و زیاد کردن کیفیت ) درلحظه و توسط کارت دریافت سیگنال صورت گیرد. این کمک میکند به اینکه سرور جلیفین کمتر عمل تبدیل را انجام دهد.", + "AllowHWTranscodingHelp": "اگر فعال شود, اجازه می‌دهید تبدیل کیفیت در لحظه انجام شود. این ممکن است به کاهش کدگذاری لازم برای Jellyfin منجر بشود.", "AllowOnTheFlySubtitleExtraction": "اجازه میدهد در لحظه زیرنویس بازشود", "Add": "افزودن", "Actor": "بازیگر", - "AccessRestrictedTryAgainLater": "دسترسی در حال حاضر محدود شده است. لطفا دوباره تلاش کنید." + "AccessRestrictedTryAgainLater": "دسترسی در حال حاضر محدود شده است. لطفا دوباره تلاش کنید.", + "ButtonShuffle": "مخلوط کردن", + "ButtonSettings": "تنظیمات", + "ButtonSend": "ارسال", + "ButtonSelectView": "انتخاب نما", + "ButtonSelectServer": "انتخاب سرور", + "ButtonSearch": "جستجو", + "ButtonScanAllLibraries": "پویش تمام کتابخانه‌ها", + "ButtonRevoke": "ابطال", + "ButtonResume": "ادامه", + "ButtonRestart": "راه اندازی مجدد", + "ButtonResetEasyPassword": "بازنشانی کد پین آسان", + "ButtonRepeat": "تکرار", + "ButtonRename": "تغییر نام", + "ButtonRemove": "حذف", + "ButtonRefreshGuideData": "به‌روز‌رسانی داده‌ی راهنما", + "ButtonRefresh": "به‌روز‌رسانی", + "ButtonProfile": "نمایه", + "ButtonNextTrack": "ترانه پسین", + "ButtonPreviousTrack": "ترانه پیشین", + "ButtonPause": "مکث", + "ButtonParentalControl": "کنترل والدین", + "ButtonOpen": "باز", + "ButtonOff": "خاموش", + "ButtonNetwork": "شبکه", + "ButtonMore": "بیشتر", + "ButtonManualLogin": "ورود دستی", + "ButtonLibraryAccess": "دسترسی به کتابخانه", + "ButtonLearnMore": "بیشتر بدانید", + "ButtonInfo": "اطلاعات", + "ButtonHome": "خانه", + "ButtonHelp": "کمک", + "ButtonGuide": "راهنما", + "ButtonGotIt": "متوجه شدم", + "ButtonFullscreen": "تمام صفحه", + "ButtonForgotPassword": "فراموشی گذرواژه", + "ButtonEditImages": "ویرایش عکس‌ها", + "ButtonEdit": "ویرایش", + "ButtonDownload": "بارگیری", + "ButtonDown": "پایین", + "ButtonDelete": "حذف", + "ButtonConnect": "اتصال", + "ButtonChangeServer": "تغییر سرور", + "ButtonBack": "بازگشت", + "ButtonArrowUp": "بالا", + "ButtonArrowRight": "راست", + "ButtonArrowLeft": "چپ", + "ButtonArrowDown": "پایین", + "ButtonAddServer": "افزودن سرور", + "ButtonAddScheduledTaskTrigger": "افزودن راه انداز", + "ButtonAddMediaLibrary": "افزودن کتابخانه رسانه", + "ButtonAddImage": "افزودن تصویر", + "ButtonAdd": "افزودن", + "BoxRear": "جعبه (پشت)", + "Box": "جعبه", + "Blacklist": "لیست سیاه", + "BirthPlaceValue": "محل تولد: {0}", + "BirthLocation": "محل تولد", + "BirthDateValue": "متولد: {0}", + "Banner": "سرصفحه", + "Backdrops": "پس زمینه‌ها", + "Backdrop": "پس زمینه", + "AutoBasedOnLanguageSetting": "خودکار (بر اساس تنظیمات زبانی)", + "Auto": "خودکار", + "Audio": "صدا", + "AttributeNew": "جدید", + "AspectRatio": "نسبت ابعاد", + "AskAdminToCreateLibrary": "از کاربر مدیر بخواهید که یک کتابخانه ایجاد کند.", + "Ascending": "بالا رونده", + "AsManyAsPossible": "تا حدی که ممکن است", + "AroundTime": "حدود {0}", + "Anytime": "هر زمانی", + "AnyLanguage": "هر زبانی", + "AlwaysPlaySubtitles": "همیشه زیرنویس را نمایش بده", + "AllowFfmpegThrottling": "گلوگاه تبدیل کیفیت", + "AllChannels": "همه‌ی کانال‌ها", + "Alerts": "هشدارها", + "Aired": "پخش شده", + "AirDate": "تاریخ پخش", + "AddedOnValue": "{0} افزوده شد", + "AddToPlaylist": "افزودن به لیست پخش", + "AddToPlayQueue": "افزودن به صف پخش", + "AddToCollection": "افزودن به مجموعه" } From a1cc9778725bc8e4eaf4c0408919f39b4640c02b Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Tue, 31 Mar 2020 18:59:12 +0300 Subject: [PATCH 100/120] Update documentation --- src/components/autoFocuser.js | 6 +- src/components/dom.js | 52 +++++------ src/components/scrollManager.js | 148 +++++++++++++++++++++----------- 3 files changed, 125 insertions(+), 81 deletions(-) diff --git a/src/components/autoFocuser.js b/src/components/autoFocuser.js index 93ebb4b3be..a469eb8854 100644 --- a/src/components/autoFocuser.js +++ b/src/components/autoFocuser.js @@ -21,7 +21,7 @@ import layoutManager from "layoutManager"; } /** - * Start AutoFocuser + * Start AutoFocuser. */ export function enable() { if (!isEnabled()) { @@ -37,8 +37,8 @@ import layoutManager from "layoutManager"; /** * Set focus on a suitable element, taking into account the previously selected. - * @param {HTMLElement} [container] - element to limit scope - * @returns {HTMLElement} focused element + * @param {HTMLElement} [container] - Element to limit scope. + * @returns {HTMLElement} Focused element. */ export function autoFocus(container) { if (!isEnabled()) { diff --git a/src/components/dom.js b/src/components/dom.js index fdc5e607eb..3fe4287320 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -7,10 +7,10 @@ /** * Returns parent of element with specified attribute value. - * @param {HTMLElement} elem - element whose parent need to find - * @param {string} name - attribute name - * @param {mixed} value - attribute value - * @returns {HTMLElement} Parent with specified attribute value + * @param {HTMLElement} elem - Element whose parent need to find. + * @param {string} name - Attribute name. + * @param {mixed} value - Attribute value. + * @returns {HTMLElement} Parent with specified attribute value. */ export function parentWithAttribute(elem, name, value) { while ((value ? elem.getAttribute(name) !== value : !elem.getAttribute(name))) { @@ -26,9 +26,9 @@ /** * Returns parent of element with one of specified tag names. - * @param {HTMLElement} elem - element whose parent need to find - * @param {(string|Array)} tagNames - tag name or array of tag names - * @returns {HTMLElement} Parent with one of specified tag names + * @param {HTMLElement} elem - Element whose parent need to find. + * @param {(string|Array)} tagNames - Tag name or array of tag names. + * @returns {HTMLElement} Parent with one of specified tag names. */ export function parentWithTag(elem, tagNames) { // accept both string and array passed in @@ -49,9 +49,9 @@ /** * Returns _true_ if class list contains one of specified names. - * @param {DOMTokenList} classList - class list - * @param {Array} classNames - array of class names - * @returns {boolean} _true_ if class list contains one of specified names + * @param {DOMTokenList} classList - Class list. + * @param {Array} classNames - Array of class names. + * @returns {boolean} _true_ if class list contains one of specified names. */ function containsAnyClass(classList, classNames) { for (let i = 0, length = classNames.length; i < length; i++) { @@ -64,9 +64,9 @@ /** * Returns parent of element with one of specified class names. - * @param {HTMLElement} elem - element whose parent need to find - * @param {(string|Array)} classNames - class name or array of class names - * @returns {HTMLElement} Parent with one of specified class names + * @param {HTMLElement} elem - Element whose parent need to find. + * @param {(string|Array)} classNames - Class name or array of class names. + * @returns {HTMLElement} Parent with one of specified class names. */ export function parentWithClass(elem, classNames) { // accept both string and array passed in @@ -100,10 +100,10 @@ /** * Adds event listener to specified target. - * @param {EventTarget} target - event target - * @param {string} type - event type - * @param {function} handler - event handler - * @param {Object} [options] - listener options + * @param {EventTarget} target - Event target. + * @param {string} type - Event type. + * @param {function} handler - Event handler. + * @param {Object} [options] - Listener options. */ export function addEventListener(target, type, handler, options) { let optionsOrCapture = options || {}; @@ -115,10 +115,10 @@ /** * Removes event listener from specified target. - * @param {EventTarget} target - event target - * @param {string} type - event type - * @param {function} handler - event handler - * @param {Object} [options] - listener options + * @param {EventTarget} target - Event target. + * @param {string} type - Event type. + * @param {function} handler - Event handler. + * @param {Object} [options] - Listener options. */ export function removeEventListener(target, type, handler, options) { let optionsOrCapture = options || {}; @@ -147,7 +147,7 @@ /** * Returns window size. - * @returns {Object} Window size + * @returns {Object} Window size. */ export function getWindowSize() { if (!windowSize) { @@ -173,7 +173,7 @@ /** * Returns screen width. - * @returns {number} Screen width + * @returns {number} Screen width. */ export function getScreenWidth() { let width = window.innerWidth; @@ -197,7 +197,7 @@ /** * Returns name of animation end event. - * @returns {string} Name of animation end event + * @returns {string} Name of animation end event. */ export function whichAnimationEvent() { if (_animationEvent) { @@ -224,7 +224,7 @@ /** * Returns name of animation cancel event. - * @returns {string} Name of animation cancel event + * @returns {string} Name of animation cancel event. */ export function whichAnimationCancelEvent() { return whichAnimationEvent().replace('animationend', 'animationcancel').replace('AnimationEnd', 'AnimationCancel'); @@ -237,7 +237,7 @@ /** * Returns name of transition end event. - * @returns {string} Name of transition end event + * @returns {string} Name of transition end event. */ export function whichTransitionEvent() { if (_transitionEvent) { diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index 96317fa998..037ca5b059 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -24,7 +24,7 @@ import layoutManager from "layoutManager"; * Returns minimum vertical scroll. * Scroll less than that value will be zeroed. * - * @return {number} minimum vertical scroll + * @return {number} Minimum vertical scroll. */ function minimumScrollY() { const topMenu = document.querySelector(".headerTop"); @@ -55,10 +55,10 @@ import layoutManager from "layoutManager"; /** * Returns value clamped by range [min, max]. * - * @param {number} value - clamped value - * @param {number} min - begining of range - * @param {number} max - ending of range - * @return {number} clamped value + * @param {number} value - Clamped value. + * @param {number} min - Begining of range. + * @param {number} max - Ending of range. + * @return {number} Clamped value. */ function clamp(value, min, max) { return value <= min ? min : value >= max ? max : value; @@ -68,11 +68,11 @@ import layoutManager from "layoutManager"; * Returns the required delta to fit range 1 into range 2. * In case of range 1 is bigger than range 2 returns delta to fit most out of range part. * - * @param {number} begin1 - begining of range 1 - * @param {number} end1 - ending of range 1 - * @param {number} begin2 - begining of range 2 - * @param {number} end2 - ending of range 2 - * @return {number} delta: <0 move range1 to the left, >0 - to the right + * @param {number} begin1 - Begining of range 1. + * @param {number} end1 - Ending of range 1. + * @param {number} begin2 - Begining of range 2. + * @param {number} end2 - Ending of range 2. + * @return {number} Delta: <0 move range1 to the left, >0 - to the right. */ function fitRange(begin1, end1, begin2, end2) { const delta1 = begin1 - begin2; @@ -88,13 +88,21 @@ import layoutManager from "layoutManager"; /** * Ease value. * - * @param {number} t - value in range [0, 1] - * @return {number} eased value in range [0, 1] + * @param {number} t - Value in range [0, 1]. + * @return {number} Eased value in range [0, 1]. */ function ease(t) { return t*(2 - t); // easeOutQuad === ease-out } + /** + * @typedef {Object} Rect + * @property {number} left - X coordinate of top-left corner. + * @property {number} top - Y coordinate of top-left corner. + * @property {number} width - Width. + * @property {number} height - Height. + */ + /** * Document scroll wrapper helps to unify scrolling and fix issues of some browsers. * @@ -109,6 +117,10 @@ import layoutManager from "layoutManager"; * Tizen 5 Browser/Native: scrolls documentElement (and window); has a document.scrollingElement */ class DocumentScroller { + /** + * Horizontal scroll position. + * @type {number} + */ get scrollLeft() { return window.pageXOffset; } @@ -117,6 +129,10 @@ import layoutManager from "layoutManager"; window.scroll(val, window.pageYOffset); } + /** + * Vertical scroll position. + * @type {number} + */ get scrollTop() { return window.pageYOffset; } @@ -125,22 +141,42 @@ import layoutManager from "layoutManager"; window.scroll(window.pageXOffset, val); } + /** + * Horizontal scroll size (scroll width). + * @type {number} + */ get scrollWidth() { return Math.max(document.documentElement.scrollWidth, document.body.scrollWidth); } + /** + * Vertical scroll size (scroll height). + * @type {number} + */ get scrollHeight() { return Math.max(document.documentElement.scrollHeight, document.body.scrollHeight); } + /** + * Horizontal client size (client width). + * @type {number} + */ get clientWidth() { return Math.min(document.documentElement.clientWidth, document.body.clientWidth); } + /** + * Vertical client size (client height). + * @type {number} + */ get clientHeight() { return Math.min(document.documentElement.clientHeight, document.body.clientHeight); } + /** + * Returns bounding client rect. + * @return {Rect} Bounding client rect. + */ getBoundingClientRect() { // Make valid viewport coordinates: documentElement.getBoundingClientRect returns rect of entire document relative to viewport return { @@ -151,6 +187,10 @@ import layoutManager from "layoutManager"; }; } + /** + * Scrolls window. + * @param {...mixed} args See window.scrollTo. + */ scrollTo() { window.scrollTo.apply(window, arguments); } @@ -162,10 +202,11 @@ import layoutManager from "layoutManager"; const documentScroller = new DocumentScroller(); /** - * Returns parent element that can be scrolled. If no such, returns documentElement. + * Returns parent element that can be scrolled. If no such, returns document scroller. * - * @param {HTMLElement} element - element for which parent is being searched - * @param {boolean} vertical - search for vertical scrollable parent + * @param {HTMLElement} element - Element for which parent is being searched. + * @param {boolean} vertical - Search for vertical scrollable parent. + * @param {HTMLElement|DocumentScroller} Parent element that can be scrolled or document scroller. */ function getScrollableParent(element, vertical) { if (element) { @@ -197,17 +238,17 @@ import layoutManager from "layoutManager"; /** * @typedef {Object} ScrollerData - * @property {number} scrollPos - current scroll position - * @property {number} scrollSize - scroll size - * @property {number} clientSize - client size + * @property {number} scrollPos - Current scroll position. + * @property {number} scrollSize - Scroll size. + * @property {number} clientSize - Client size. */ /** - * Returns scroll data for specified orientation. + * Returns scroller data for specified orientation. * - * @param {HTMLElement} scroller - scroller - * @param {boolean} vertical - vertical scroll data - * @return {ScrollerData} scroll data + * @param {HTMLElement} scroller - Scroller. + * @param {boolean} vertical - Vertical scroller data. + * @return {ScrollerData} Scroller data. */ function getScrollerData(scroller, vertical) { let data = {}; @@ -228,10 +269,10 @@ import layoutManager from "layoutManager"; /** * Returns position of child of scroller for specified orientation. * - * @param {HTMLElement} scroller - scroller - * @param {HTMLElement} element - child of scroller - * @param {boolean} vertical - vertical scroll - * @return {number} child position + * @param {HTMLElement} scroller - Scroller. + * @param {HTMLElement} element - Child of scroller. + * @param {boolean} vertical - Vertical scroll. + * @return {number} Child position. */ function getScrollerChildPos(scroller, element, vertical) { const elementRect = element.getBoundingClientRect(); @@ -247,11 +288,11 @@ import layoutManager from "layoutManager"; /** * Returns scroll position for element. * - * @param {ScrollerData} scrollerData - scroller data - * @param {number} elementPos - child element position - * @param {number} elementSize - child element size - * @param {boolean} centered - scroll to center - * @return {number} scroll position + * @param {ScrollerData} scrollerData - Scroller data. + * @param {number} elementPos - Child element position. + * @param {number} elementSize - Child element size. + * @param {boolean} centered - Scroll to center. + * @return {number} Scroll position. */ function calcScroll(scrollerData, elementPos, elementSize, centered) { const maxScroll = scrollerData.scrollSize - scrollerData.clientSize; @@ -271,8 +312,8 @@ import layoutManager from "layoutManager"; /** * Calls scrollTo function in proper way. * - * @param {HTMLElement} scroller - scroller - * @param {ScrollToOptions} options - scroll options + * @param {HTMLElement} scroller - Scroller. + * @param {ScrollToOptions} options - Scroll options. */ function scrollToHelper(scroller, options) { if ("scrollTo" in scroller) { @@ -296,11 +337,11 @@ import layoutManager from "layoutManager"; /** * Performs built-in scroll. * - * @param {HTMLElement} xScroller - horizontal scroller - * @param {number} scrollX - horizontal coordinate - * @param {HTMLElement} yScroller - vertical scroller - * @param {number} scrollY - vertical coordinate - * @param {boolean} smooth - smooth scrolling + * @param {HTMLElement} xScroller - Horizontal scroller. + * @param {number} scrollX - Horizontal coordinate. + * @param {HTMLElement} yScroller - Vertical scroller. + * @param {number} scrollY - Vertical coordinate. + * @param {boolean} smooth - Smooth scrolling. */ function builtinScroll(xScroller, scrollX, yScroller, scrollY, smooth) { const scrollBehavior = smooth ? "smooth" : "instant"; @@ -313,6 +354,9 @@ import layoutManager from "layoutManager"; } } + /** + * Requested frame for animated scroll. + */ let scrollTimer; /** @@ -326,10 +370,10 @@ import layoutManager from "layoutManager"; /** * Performs animated scroll. * - * @param {HTMLElement} xScroller - horizontal scroller - * @param {number} scrollX - horizontal coordinate - * @param {HTMLElement} yScroller - vertical scroller - * @param {number} scrollY - vertical coordinate + * @param {HTMLElement} xScroller - Horizontal scroller. + * @param {number} scrollX - Horizontal coordinate. + * @param {HTMLElement} yScroller - Vertical scroller. + * @param {number} scrollY - Vertical coordinate. */ function animateScroll(xScroller, scrollX, yScroller, scrollY) { @@ -372,11 +416,11 @@ import layoutManager from "layoutManager"; /** * Performs scroll. * - * @param {HTMLElement} xScroller - horizontal scroller - * @param {number} scrollX - horizontal coordinate - * @param {HTMLElement} yScroller - vertical scroller - * @param {number} scrollY - vertical coordinate - * @param {boolean} smooth - smooth scrolling + * @param {HTMLElement} xScroller - Horizontal scroller. + * @param {number} scrollX - Horizontal coordinate. + * @param {HTMLElement} yScroller - Vertical scroller. + * @param {number} scrollY - Vertical coordinate. + * @param {boolean} smooth - Smooth scrolling. */ function doScroll(xScroller, scrollX, yScroller, scrollY, smooth) { @@ -420,9 +464,9 @@ import layoutManager from "layoutManager"; /** * Scrolls the document to a given position. * - * @param {number} scrollX - horizontal coordinate - * @param {number} scrollY - vertical coordinate - * @param {boolean} [smooth=false] - smooth scrolling + * @param {number} scrollX - Horizontal coordinate. + * @param {number} scrollY - Vertical coordinate. + * @param {boolean} [smooth=false] - Smooth scrolling. */ export function scrollTo(scrollX, scrollY, smooth) { @@ -443,8 +487,8 @@ import layoutManager from "layoutManager"; /** * Scrolls the document to a given element. * - * @param {HTMLElement} element - target element of scroll task - * @param {boolean} [smooth=false] - smooth scrolling + * @param {HTMLElement} element - Target element of scroll task. + * @param {boolean} [smooth=false] - Smooth scrolling. */ export function scrollToElement(element, smooth) { From 8789b1b69b2b5298fe90aaee51ce7ec1f151622c Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Tue, 31 Mar 2020 19:07:03 +0300 Subject: [PATCH 101/120] Update documentation --- src/components/input/keyboardnavigation.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/input/keyboardnavigation.js b/src/components/input/keyboardnavigation.js index caddf46797..d356854a3e 100644 --- a/src/components/input/keyboardnavigation.js +++ b/src/components/input/keyboardnavigation.js @@ -60,8 +60,8 @@ if (!hasFieldKey) { /** * Returns key name from event. * - * @param {KeyboardEvent} event - keyboard event - * @return {string} key name + * @param {KeyboardEvent} event - Keyboard event. + * @return {string} Key name. */ export function getKeyName(event) { return KeyNames[event.keyCode] || event.key; @@ -70,8 +70,8 @@ export function getKeyName(event) { /** * Returns _true_ if key is used for navigation. * - * @param {string} key - key name - * @return {boolean} _true_ if key is used for navigation + * @param {string} key - Key name. + * @return {boolean} _true_ if key is used for navigation. */ export function isNavigationKey(key) { return NavigationKeys.indexOf(key) != -1; From c202339b9a60f87d78f2693fefa680e672e1a269 Mon Sep 17 00:00:00 2001 From: nextlooper42 Date: Tue, 31 Mar 2020 15:11:31 +0000 Subject: [PATCH 102/120] Translated using Weblate (Slovak) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/ --- src/strings/sk.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/sk.json b/src/strings/sk.json index e0bebec52f..c90853c5f2 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -1468,5 +1468,8 @@ "AskAdminToCreateLibrary": "Pokiaľ chcete vytvoriť knižnicu, musíte sa spýtať administrátora.", "PlaybackErrorNoCompatibleStream": "Nastal problém s profilom klienta a server preto neposiela kompatibilný mediálny formát.", "AllowFfmpegThrottlingHelp": "Keď sa transkódovanie alebo remuxovanie dostane do bodu, kedy je dostatočne vopred voči súčasnej polohe prehrávania, pozastaví proces aby spotrebovával menej zdrojov. Toto je najviac užitočné, keď sa pozerá obsah bez pretáčania. Vypnite túto možnosť, pokiaľ má vaše prehrávanie problémy.", - "AllowFfmpegThrottling": "Obmedzenie transkódovania" + "AllowFfmpegThrottling": "Obmedzenie transkódovania", + "PreferEmbeddedEpisodeInfosOverFileNames": "Preferovať vložené informácie o epizóde pred názvom súboru", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Toto využíva informácie o epizóde z vložených metadát, pokiaľ sú dostupne.", + "ClientSettings": "Nastavenie klienta" } From 3d7e7105e177b033f9d150ba8aa9028538af5636 Mon Sep 17 00:00:00 2001 From: Medzhnun Date: Wed, 1 Apr 2020 12:00:43 +0000 Subject: [PATCH 103/120] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index bf264bbcfb..4a9c3146d5 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -10,7 +10,7 @@ "All": "Всички", "AllLibraries": "Всички библиотеки", "Art": "Картина", - "Artists": "Изпълнители", + "Artists": "Артисти", "AttributeNew": "Нови", "Audio": "Звук", "Auto": "Автоматично", @@ -839,5 +839,7 @@ "LabelKodiMetadataSaveImagePathsHelp": "Препоръчително е ако имате изображения, пътят към които не е съобразен с изискванията на Коди.", "LabelKodiMetadataSaveImagePaths": "Записване на пътеките към изображенията в nfo файловете", "LabelChannels": "Канали:", - "DropShadow": "Сянка" + "DropShadow": "Сянка", + "Raised": "Повишено", + "OptionResElement": "рес. елемент" } From e69bb1534b7e2231fa910222a894cd2b7d19f17f Mon Sep 17 00:00:00 2001 From: KGT1 Date: Tue, 31 Mar 2020 23:33:47 +0000 Subject: [PATCH 104/120] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index 97cb1f959e..3dab52c547 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1401,7 +1401,7 @@ "TitleSupport": "Hilfe", "Whitelist": "Erlaubt", "AuthProviderHelp": "Auswählen eines Authentifizierungsanbieter, der zur Authentifizierung des Passworts dieses Benutzes verwendet werden soll.", - "Features": "Features", + "Features": "Funktionen", "HeaderFavoriteBooks": "Lieblingsbücher", "HeaderFavoriteMovies": "Lieblingsfilme", "HeaderFavoriteShows": "Lieblingsserien", From bb834a79e7be143235e1b1ed02c5616e323046c0 Mon Sep 17 00:00:00 2001 From: amirmasoud Date: Wed, 1 Apr 2020 12:24:21 +0000 Subject: [PATCH 105/120] Translated using Weblate (Persian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fa/ --- src/strings/fa.json | 93 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/src/strings/fa.json b/src/strings/fa.json index d9afcd66cc..6dcc8cbb66 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -224,5 +224,96 @@ "AddedOnValue": "{0} افزوده شد", "AddToPlaylist": "افزودن به لیست پخش", "AddToPlayQueue": "افزودن به صف پخش", - "AddToCollection": "افزودن به مجموعه" + "AddToCollection": "افزودن به مجموعه", + "ExitFullscreen": "خروج از تمام صفحه", + "EveryNDays": "هر {0} روز", + "ErrorMessageStartHourGreaterThanEnd": "زمان پایان باید پس از زمان شروع باشد.", + "Episodes": "قسمت‌ها", + "EndsAtValue": "تمام شده در {0}", + "Ended": "تمام شده", + "EnableThemeVideos": "تم فیلم‌ها", + "EnableThemeSongs": "آهنگ‌های تم", + "EnableStreamLooping": "چرخش خودکار پخش‌های زنده", + "EnablePhotos": "نمایش عکس‌ها", + "EnableNextVideoInfoOverlay": "نمایش اطلاعات ودیوی بعدی حین پخش ویدیو", + "EnableHardwareEncoding": "فعال سازی رمزگذاری سخت افزاری", + "EnableExternalVideoPlayersHelp": "یک منوی پخش کننده ویدیوی خارجی، زمانی که شروع به پخش ویدیو می‌شود نمایش داده خواهد شد.", + "EnableExternalVideoPlayers": "پخش کننده ویدیوی خارجی", + "EnableDisplayMirroring": "نمایش حالت آینه", + "EnableCinemaMode": "حالت سینما", + "EnableBackdrops": "پشت‌زمینه‌ها", + "EditSubtitles": "ویرایش زیرنویس‌ها", + "EditMetadata": "ویرایش ابرداده", + "EditImages": "ویرایش عکس‌ها", + "Edit": "ویرایش", + "DropShadow": "سایه پشت زمینه", + "DrmChannelsNotImported": "کانال‌ها با DRM وارد نخواند شد.", + "DownloadsValue": "{0} بارگیری‌ها", + "Download": "بارگیری", + "Down": "پایین", + "DoNotRecord": "ضبط نکن", + "DisplayModeHelp": "نوع صفحه نمایشی که Jellyfin را اجرا می‌کنید را انتخاب کنید‌‌.", + "DisplayMissingEpisodesWithinSeasons": "قسمت‌های ناموجود در فصل‌ها را نمایش بده", + "DisplayInMyMedia": "نمایش در صفحه‌ی خانه", + "Display": "نمایش", + "Dislike": "دوست نداشتن", + "Disconnect": "قطع اتصال", + "Disc": "دیسک", + "Directors": "کارگردانان", + "Director": "کارگردان", + "DirectStreaming": "پخش مستقیم", + "DirectStreamHelp2": "پخش مستقیم فایل از قدرت پردازش بسیار کمی بدون از دست دادن کیفیت ویدیو استفاده می‌کند.", + "DirectPlaying": "پخش مستقیم", + "DetectingDevices": "در حال تشخیص دستگاه‌ها", + "Descending": "پایین رونده", + "Depressed": "پژمرده", + "DeleteUserConfirmation": "آیا اطمینان دارید که می‌خواهید این کاربر را حذف کنید؟", + "DeleteUser": "حذف کاربر", + "DeleteImageConfirmation": "آیا اطمینان دارید که می‌خواهید این تصویر را حذف کنید؟", + "DeleteImage": "حذف تصویر", + "DeleteDeviceConfirmation": "آیا از حذف این دستگاه اطمینان دارید؟ هنگامی که یک کاربر دوباره با آن دستگاه وارد شود، دوباره نمایش داده می‌شود.", + "Delete": "حذف", + "DefaultMetadataLangaugeDescription": "این موارد پیشفرض‌های شماست و می‌توانید برای هر کتابخانه آن را شخصی سازی کنید.", + "DefaultErrorMessage": "خطایی در پردازش درخواست رخ داد. لطفا اندکی بعد دوباره تلاش کنید.", + "Default": "پیشفرض", + "DeathDateValue": "تلف شد: {0}", + "DatePlayed": "تاریخ پخش شده", + "DateAdded": "تاریخ اضافه شده", + "CriticRating": "امتیاز منتقدان", + "CopyStreamURLError": "در کپی کردن آدرس خطایی رخ داد.", + "CopyStreamURLSuccess": "آدرس با موفقیت کپی شد.", + "CopyStreamURL": "کپی آدرس پخش", + "Continuing": "ادامه", + "ContinueWatching": "ادامه تماشا", + "Connect": "اتصال", + "ConfirmEndPlayerSession": "آیا می‌خواهید Jellyfin را روی {0} خاموش کنید؟", + "ConfirmDeletion": "تایید حذف", + "ConfirmDeleteImage": "حذف تصویر؟", + "Composer": "آهنگساز", + "CommunityRating": "امتیاز عمومی", + "ColorTransfer": "انتقال رنگ", + "ColorSpace": "فضای رنگی", + "ColorPrimaries": "مقدمات رنگی", + "ClientSettings": "تنظیمات مشتری", + "ChannelNumber": "شماره کانال", + "ChannelNameOnly": "تنها کانال {0}", + "Categories": "دسته‌بندی‌ها", + "CancelSeries": "لغو سریال‌ها", + "CancelRecording": "لغو ضبط", + "ButtonWebsite": "وبسایت", + "ButtonViewWebsite": "بازدید وبسایت", + "ButtonUp": "بالا", + "ButtonUninstall": "حذف نصب", + "ButtonTrailer": "تریلر", + "ButtonSubtitles": "زیرنویس‌ها", + "ButtonSubmit": "تایید", + "ButtonSplit": "جدا کردن", + "ButtonStop": "توقف", + "ButtonStart": "شروع", + "ButtonSignIn": "ورود", + "ButtonShutdown": "خاموش", + "ButtonSelectDirectory": "انتخاب مسیر", + "ButtonEditOtherUserPreferences": "نمایه، تصویر و ترجیحات شخصی این کاربر را ویرایش کنید.", + "BrowsePluginCatalogMessage": "برای مرور کردن افزونه‌های موجود، به فروشگاه افزونه‌های ما سر بزنید.", + "AuthProviderHelp": "ارائه دهنده تأیید اعتبار را انتخاب کنید تا برای تأیید اعتبار گذرواژه این کاربر استفاده شود." } From da45e28b721f36df28122a47ab03f5969e373243 Mon Sep 17 00:00:00 2001 From: Louis Hermier Date: Wed, 1 Apr 2020 17:09:15 +0000 Subject: [PATCH 106/120] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index ced0674031..53aac4f66b 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1446,7 +1446,7 @@ "LabelAudioChannels": "Canaux audio :", "HeaderFavoriteBooks": "Livres préférés", "FetchingData": "Récuperer des données suplémentaires", - "CopyStreamURLSuccess": "URL copiée avec succès", + "CopyStreamURLSuccess": "URL copiée avec succès.", "CopyStreamURL": "Copier l'URL du flux", "LabelBaseUrlHelp": "Vous pouvez ajouter un sous-répertoire personalisé ici pour accéder au serveur depuis une URL plus exclusive.", "HeaderFavoritePeople": "Personnes préférées", From f3ce3c6166efdbe836503d387ac2c5f7331f8347 Mon Sep 17 00:00:00 2001 From: MG Date: Wed, 1 Apr 2020 15:50:50 +0000 Subject: [PATCH 107/120] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/strings/it.json b/src/strings/it.json index cf9e06910e..69680a46c4 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -264,7 +264,7 @@ "HeaderAddUser": "Aggiungi utente", "HeaderAdditionalParts": "Parti addizionali", "HeaderAdmin": "Admin", - "HeaderAlbumArtists": "Artisti dell' Album", + "HeaderAlbumArtists": "Artisti degli Album", "HeaderAlbums": "Album", "HeaderAlert": "Avviso", "HeaderAllowMediaDeletionFrom": "Abilita Eliminazione Media Da", @@ -572,7 +572,7 @@ "LabelEvent": "Evento:", "LabelEveryXMinutes": "Tutti:", "LabelExtractChaptersDuringLibraryScan": "Estrarre immagini capitolo durante la scansione della libreria", - "LabelExtractChaptersDuringLibraryScanHelp": "Genera le immagini del capitolo quando i video vengono importati durante la scansione della libreria. Altrimenti verranno estratti durante l'operazione pianificata di estrazione delle immagini capitolo, permettendo la scansione della libreria più velocemente.", + "LabelExtractChaptersDuringLibraryScanHelp": "Genera le immagini capitolo quando i video vengono importati durante la scansione della libreria. Alternativamente, verranno estratti durante l'operazione pianificata di estrazione delle immagini capitolo, permettendo la scansione della libreria più velocemente.", "LabelFailed": "Fallito", "LabelFileOrUrl": "File o URL:", "LabelFinish": "Finito", @@ -947,8 +947,8 @@ "OptionCustomUsers": "Personalizza", "OptionDaily": "Giornaliero", "OptionDateAdded": "Aggiunto il", - "OptionDateAddedFileTime": "Utilizzare file di data di creazione", - "OptionDateAddedImportTime": "Utilizza la data scansionato in biblioteca", + "OptionDateAddedFileTime": "Utilizzare la data di creazione del file", + "OptionDateAddedImportTime": "Utilizza la data di scansione nella libreria", "OptionDatePlayed": "Visto il", "OptionDescending": "Decrescente", "OptionDisableUser": "Disabilita questo utente", @@ -1076,7 +1076,7 @@ "Programs": "Programmi", "Quality": "Qualità", "QueueAllFromHere": "In coda tutto da qui in poi", - "Raised": "Sospeso", + "Raised": "Rilievo", "Rate": "Vota", "RecentlyWatched": "Visti di recente", "RecommendationBecauseYouLike": "Perché ti piace {0}", @@ -1168,7 +1168,7 @@ "SystemDlnaProfilesHelp": "I profili di sistema sono in sola lettura. Le modifiche ad un profilo di sistema verranno salvate in un nuovo profilo personalizzato.", "TabAccess": "Accesso", "TabAdvanced": "Avanzato", - "TabAlbumArtists": "Artisti degli album", + "TabAlbumArtists": "Artisti degli Album", "TabAlbums": "Album", "TabArtists": "Artisti", "TabCatalog": "Catalogo", @@ -1312,7 +1312,7 @@ "HeaderFavoriteArtists": "Artisti Preferiti", "HeaderFavoriteSongs": "Brani Preferiti", "HeaderFavoriteVideos": "Video Preferiti", - "HeaderFetcherSettings": "Impostazioni Fetcher", + "HeaderFetcherSettings": "Impostazioni del Fetcher", "HeaderImageOptions": "Opzioni Immagine", "HeaderRestartingServer": "Riavvio Server", "Home": "Home", @@ -1467,5 +1467,8 @@ "LabelCorruptedFrames": "Frame corrotti:", "AskAdminToCreateLibrary": "Chiedi ad un amministratore di creare una libreria.", "AllowFfmpegThrottlingHelp": "Quando una transcodifica o un remux sono abbastanza avanti rispetto alla corrente posizione di riproduzione, pausa il processo così da consumare meno risorse. Questo è utile quando si guarda un video senza avanzare spesso durante la riproduzione. Disattiva questa opzione se stai avendo problemi di riproduzione.", - "AllowFfmpegThrottling": "Acceleratore Transcodifica" + "AllowFfmpegThrottling": "Acceleratore Transcodifica", + "PreferEmbeddedEpisodeInfosOverFileNames": "Preferisci le informazioni incorporate nell'episodio rispetto ai nomi dei file", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Questo utilizza le informazioni dell'episodio provenienti dai metadata incorporati, se disponibili.", + "ClientSettings": "Impostazioni del client" } From d524c25258c1865c4bcf8810aea6f2365ad340b4 Mon Sep 17 00:00:00 2001 From: dkanada Date: Thu, 2 Apr 2020 03:51:22 +0900 Subject: [PATCH 108/120] port web settings to es6 --- package.json | 3 ++- src/components/apphost.js | 6 ++--- src/scripts/settings/webSettings.js | 36 ++++++++--------------------- 3 files changed, 15 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 090d98f4bb..381d3946f7 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,8 @@ "src/components/filedownloader.js", "src/components/filesystem.js", "src/components/input/keyboardnavigation.js", - "src/components/sanatizefilename.js" + "src/components/sanatizefilename.js", + "src/scripts/settings/webSettings.js" ], "plugins": [ "@babel/plugin-transform-modules-amd" diff --git a/src/components/apphost.js b/src/components/apphost.js index ce19e17551..868416b369 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -278,9 +278,9 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], f features.push("targetblank"); features.push("screensaver"); - if (webSettings.enableMultiServer()) { - features.push("multiserver") - } + webSettings.enableMultiServer().then(enabled => { + if (enabled) features.push("multiserver") + }) if (!browser.orsay && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || supportsCue())) { features.push("subtitleappearancesettings"); diff --git a/src/scripts/settings/webSettings.js b/src/scripts/settings/webSettings.js index de0dff94ab..503eff0896 100644 --- a/src/scripts/settings/webSettings.js +++ b/src/scripts/settings/webSettings.js @@ -1,27 +1,11 @@ -define(['appStorage', 'events'], function (appStorage, events) { - 'use strict'; +function getConfig() { + return fetch("/config.json?nocache=" + new Date().getUTCMilliseconds()).then(function (response) { + return response.json(); + }); +} - var data; - - function getConfig() { - if (data) { - return data; - } - - fetch("/config.json").then(function (response) { - data = response.json(); - }) - - return data; - } - - function WebSettings() { - getConfig(); - } - - WebSettings.prototype.enableMultiServer = function () { - return getConfig().multiServer || false; - }; - - return new WebSettings(); -}); +export function enableMultiServer() { + return getConfig().then(config => { + return config.multiserver; + }); +} From 555e57105c8df319ae78d670bc953268a021cca1 Mon Sep 17 00:00:00 2001 From: Vitorvlv Date: Wed, 1 Apr 2020 18:34:31 +0000 Subject: [PATCH 109/120] Translated using Weblate (Portuguese (Brazil)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/ --- src/strings/pt-br.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index f1bffad58c..761e773d71 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -1467,5 +1467,8 @@ "PlaybackErrorNoCompatibleStream": "Houve um erro na criação de perfil do cliente e o servidor não está enviando um formato de mídia compatível.", "EnableFastImageFadeInHelp": "Habilitar animações rápidas de aparecimento para imagens carregadas", "LabelDroppedFrames": "Quadros caídos:", - "AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux estiver suficientemente avançada da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais proveitoso para quando não há avanço ou retrocesso do vídeo com frequência. Desative se tiver problemas de reprodução." + "AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux estiver suficientemente avançada da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais proveitoso para quando não há avanço ou retrocesso do vídeo com frequência. Desative se tiver problemas de reprodução.", + "PreferEmbeddedEpisodeInfosOverFileNames": "Preferir informações do episodio incorporados ao invés dos nomes dos arquivos", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Isso utiliza as informações do episodio provida pelos metadados incorporados caso estejam disponíveis.", + "ClientSettings": "Configurações do cliente" } From 2f44701a03937436f61aed68b6a0f193ea19705d Mon Sep 17 00:00:00 2001 From: dkanada Date: Thu, 2 Apr 2020 05:10:46 +0900 Subject: [PATCH 110/120] use strict comparison Co-Authored-By: Julien Machiels --- src/scripts/settings/appSettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/settings/appSettings.js b/src/scripts/settings/appSettings.js index 31112d71e3..30fcf62e94 100644 --- a/src/scripts/settings/appSettings.js +++ b/src/scripts/settings/appSettings.js @@ -21,7 +21,7 @@ define(['appStorage', 'events'], function (appStorage, events) { }; AppSettings.prototype.enableSystemExternalPlayers = function (val) { - if (val != null) { + if (val !== null) { this.set('enableSystemExternalPlayers', val.toString()); } From b3e1809abef71834229c378a494ee79310445c60 Mon Sep 17 00:00:00 2001 From: Vitorvlv Date: Thu, 2 Apr 2020 03:57:13 +0000 Subject: [PATCH 111/120] Translated using Weblate (Portuguese (Brazil)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/ --- src/strings/pt-br.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index 761e773d71..45681762ca 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -1468,7 +1468,7 @@ "EnableFastImageFadeInHelp": "Habilitar animações rápidas de aparecimento para imagens carregadas", "LabelDroppedFrames": "Quadros caídos:", "AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux estiver suficientemente avançada da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais proveitoso para quando não há avanço ou retrocesso do vídeo com frequência. Desative se tiver problemas de reprodução.", - "PreferEmbeddedEpisodeInfosOverFileNames": "Preferir informações do episodio incorporados ao invés dos nomes dos arquivos", - "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Isso utiliza as informações do episodio provida pelos metadados incorporados caso estejam disponíveis.", + "PreferEmbeddedEpisodeInfosOverFileNames": "Preferir as informações incorporadas nos arquivos dos episódios ao invés dos nomes", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Isso utiliza as informações dos episódios incorporadas nos metadados dos arquivos se estiverem disponíveis.", "ClientSettings": "Configurações do cliente" } From 31048d0ce508ff08a51b1045a8329822f452c320 Mon Sep 17 00:00:00 2001 From: dkanada Date: Thu, 2 Apr 2020 19:44:21 +0900 Subject: [PATCH 112/120] only load the config once per session --- src/scripts/settings/webSettings.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/scripts/settings/webSettings.js b/src/scripts/settings/webSettings.js index 503eff0896..ba621275f9 100644 --- a/src/scripts/settings/webSettings.js +++ b/src/scripts/settings/webSettings.js @@ -1,4 +1,7 @@ +let data; + function getConfig() { + if (data) return Promise.resolve(data); return fetch("/config.json?nocache=" + new Date().getUTCMilliseconds()).then(function (response) { return response.json(); }); From 0a6fefd417700f82b84c5696f32acf737579cdbb Mon Sep 17 00:00:00 2001 From: dkanada Date: Thu, 2 Apr 2020 19:50:09 +0900 Subject: [PATCH 113/120] assign data before returning value --- src/scripts/settings/webSettings.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scripts/settings/webSettings.js b/src/scripts/settings/webSettings.js index ba621275f9..4b1b658e9b 100644 --- a/src/scripts/settings/webSettings.js +++ b/src/scripts/settings/webSettings.js @@ -3,7 +3,8 @@ let data; function getConfig() { if (data) return Promise.resolve(data); return fetch("/config.json?nocache=" + new Date().getUTCMilliseconds()).then(function (response) { - return response.json(); + data = response.json(); + return data; }); } From 751b300be167da4200807b057fd6a30f65090990 Mon Sep 17 00:00:00 2001 From: amirmasoud Date: Thu, 2 Apr 2020 11:23:22 +0000 Subject: [PATCH 114/120] Translated using Weblate (Persian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fa/ --- src/strings/fa.json | 104 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 2 deletions(-) diff --git a/src/strings/fa.json b/src/strings/fa.json index 6dcc8cbb66..3a737a6be0 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -33,7 +33,7 @@ "HeaderFilters": "فیلتر ها", "HeaderImageOptions": "گزینه های تصویر", "HeaderInstantMix": "درهم کردن فوری", - "HeaderKodiMetadataHelp": "برای فعال یا غیرفعال سازی متاداده های Nfo ، یک کتابخانه را در صفحه تنظیم کتابخانه Jellyfin ویرایش کرده و قسمت سرورهای متاداده را مسیردهی کنید.", + "HeaderKodiMetadataHelp": "برای فعال یا غیرفعال سازی ابرداده‌های Nfo ، یک کتابخانه را در صفحه تنظیم کتابخانه Jellyfin ویرایش کرده و قسمت سرورهای ابرداده را مسیردهی کنید.", "HeaderLatestEpisodes": "آخرین قسمت ها", "HeaderNextUp": "قسمت بعدی", "HeaderPaths": "مسیرها", @@ -315,5 +315,105 @@ "ButtonSelectDirectory": "انتخاب مسیر", "ButtonEditOtherUserPreferences": "نمایه، تصویر و ترجیحات شخصی این کاربر را ویرایش کنید.", "BrowsePluginCatalogMessage": "برای مرور کردن افزونه‌های موجود، به فروشگاه افزونه‌های ما سر بزنید.", - "AuthProviderHelp": "ارائه دهنده تأیید اعتبار را انتخاب کنید تا برای تأیید اعتبار گذرواژه این کاربر استفاده شود." + "AuthProviderHelp": "ارائه دهنده تأیید اعتبار را انتخاب کنید تا برای تأیید اعتبار گذرواژه این کاربر استفاده شود.", + "HeaderRecordingPostProcessing": "در حال ضبط پس پردازش", + "HeaderRecordingOptions": "گزینه‌های ضبط", + "HeaderRecentlyPlayed": "به تازگی پخش شده", + "HeaderProfileInformation": "اطلاعات نمایه", + "HeaderProfile": "نمایه", + "HeaderPluginInstallation": "نصب افزونه", + "HeaderPleaseSignIn": "لطفا وارد شوید", + "HeaderPlaybackError": "خطای پخش", + "HeaderPlayback": "پخش رسانه", + "HeaderPlayOn": "پخش در", + "HeaderPinCodeReset": "بازنشانی پین کد", + "HeaderPhotoAlbums": "آلبوم‌های عکس", + "HeaderPeople": "افراد", + "HeaderPendingInvitations": "دعوت‌های در انتظار", + "HeaderPasswordReset": "بازنشانی گذرواژه", + "HeaderPassword": "گذرواژه", + "HeaderParentalRatings": "رتبه بندی والدین", + "HeaderOtherItems": "آیتم‌های دیگر", + "HeaderOnNow": "هم اکنون", + "HeaderNextVideoPlayingInValue": "پخش ویدیوی بعد در {0}", + "HeaderNextEpisodePlayingInValue": "پخش قسمت بعدی در {0}", + "HeaderNewDevices": "دستگاه جدید", + "HeaderNewApiKey": "کلید API جدید", + "HeaderMyMediaSmall": "رسانه‌ی من (کوچک)", + "HeaderMyMedia": "رسانه‌ی من", + "HeaderMyDevice": "دستگاه‌های من", + "HeaderMusicVideos": "موزیک ویدیوها", + "HeaderMusicQuality": "کیفیت آهنگ", + "HeaderMovies": "فیلم‌ها", + "HeaderMoreLikeThis": "موارد مشابه با این", + "HeaderMetadataSettings": "تنظیمات ابرداده", + "HeaderMediaInfo": "اطلاعات رسانه", + "HeaderMediaFolders": "پوشه‌های رسانه", + "HeaderMedia": "رسانه", + "HeaderLoginFailure": "ورود ناموفق", + "HeaderLiveTvTunerSetup": "تنظیم تلویزیون زنده", + "HeaderLiveTv": "تلویزیون زنده", + "HeaderLibrarySettings": "تنظیمات کتابخانه", + "HeaderLibraryOrder": "ترتیت کتابخانه", + "HeaderLibraryFolders": "پوشه‌های کتابخانه", + "HeaderLibraryAccess": "دسترسی به کتابخانه", + "HeaderLibraries": "کتابخانه‌ها", + "HeaderLatestRecordings": "آخرین ضبط‌ها", + "HeaderLatestMusic": "آخرین آهنگ‌ها", + "HeaderLatestMovies": "آخرین فیلم‌ها", + "HeaderLatestMedia": "آخرین رسانه‌ها", + "HeaderKeepSeries": "سریال ادامه دهید", + "HeaderKeepRecording": "ضبط را ادامه دهید", + "HeaderItems": "موارد", + "HeaderInstall": "نصب", + "HeaderImageSettings": "تنظیمات عکس", + "HeaderIdentifyItemHelp": "یک یا بیشتر مورد برای جستجو وارد کنید. موارد را حذف کنید تا نتیجه جستجو را افزایش دهید.", + "HeaderIdentificationHeader": "سرفصل تعیین هویت", + "HeaderIdentificationCriteriaHelp": "حداقل یک مورد تعیین هویت وارد کنید.", + "HeaderIdentification": "تعیین هویت", + "HeaderHttpHeaders": "سرفصل‌های HTTP", + "HeaderHome": "خانه", + "HeaderGuideProviders": "ارائه دهنده داده راهنمای تلویزیونی", + "HeaderGenres": "ژانرها", + "HeaderFrequentlyPlayed": "اغلب پخش شده", + "HeaderForgotPassword": "فراموشی گذرواژه", + "HeaderForKids": "برای کودکان", + "HeaderFetchImages": "دریافت عکس‌ها:", + "HeaderFeatures": "برجسته‌ها", + "HeaderFeatureAccess": "دسترسی‌های برجسته", + "HeaderFavoriteVideos": "ویدیو‌های مورد علاقه", + "HeaderFavoritePeople": "افراد مورد علاقه", + "HeaderFavoriteMovies": "فیلم‌های مورد علاقه", + "HeaderFavoriteBooks": "کتاب‌های مورد علاقه", + "HeaderExternalIds": "ID های خارجی:", + "HeaderError": "خطا", + "HeaderEpisodes": "قسمت‌ها", + "HeaderEnabledFieldsHelp": "یک فیلد را برای جلوگیری از تغییر در داده‌ی آن علامت بزنید تا قفل بشود.", + "HeaderEnabledFields": "فیلد‌های فعال شده", + "HeaderEditImages": "ویرایش عکس‌ها", + "HeaderDownloadSync": "بارگیری و همگام‌سازی", + "HeaderDisplay": "نمایش", + "HeaderDirectPlayProfileHelp": "نمایه‌ی پخش مستقیم را اضافه کنید تا مشخص کنید با چه فرمی دستگاه می‌تواند محلی برخورد کند.", + "HeaderDirectPlayProfile": "نمایه‌ی پخش مستقیم", + "HeaderDevices": "دستگاه‌ها", + "HeaderDeveloperInfo": "اطلاعات توسعه دهنده", + "HeaderDetectMyDevices": "تشخیص دستگاه‌های من", + "HeaderDeleteTaskTrigger": "حذف راه انداز وظیفه", + "HeaderDeleteProvider": "حذف ارائه‌دهنده", + "HeaderDeleteItems": "حذف آیتم‌ها", + "HeaderDeleteItem": "حذف آیتم", + "HeaderDeleteDevice": "حذف دستگاه", + "HeaderDefaultRecordingSettings": "تنظمیات پیش‌فرض ضبط", + "HeaderDateIssued": "تاریخ صدور", + "HeaderCodecProfileHelp": "نمایه‌های کدک محدودیت‌های یک دستگاه را هنگام پخش کدک‌های خاص نشان می‌دهد. اگر محدودیتی اعمال شود، رسانه‌ها کد گذاری می‌شوند ، حتی اگر کدک برای پخش مستقیم پیکربندی شده باشد.", + "HeaderCodecProfile": "نمایه کدک", + "HeaderChapterImages": "عکس‌های سکانس", + "HeaderChannels": "کانال‌ها", + "HeaderChannelAccess": "دسترسی به کانال", + "HeaderCastCrew": "بازیگران و کارکنان", + "HeaderCastAndCrew": "بازیگران و کارکنان", + "HeaderCancelSeries": "لغو سریال", + "HeaderCancelRecording": "لغو ضبط", + "HeaderBooks": "کتاب‌ها", + "HeaderBlockItemsWithNoRating": "موارد مسدود شده با نقص یا عدم وجود اطلاعات امتیاز:" } From 278ca4c6cdc3a896c1b87f5545a440db37c47c99 Mon Sep 17 00:00:00 2001 From: Louis Hermier Date: Thu, 2 Apr 2020 11:32:23 +0000 Subject: [PATCH 115/120] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 53aac4f66b..81b8c5f85a 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -14,7 +14,7 @@ "Alerts": "Alertes", "All": "Tout", "AllChannels": "Toutes les chaînes", - "AllComplexFormats": "Tous les formats complexes (ASS, SSA, VOBSUB, PGS, SUB/IDX, etc…)", + "AllComplexFormats": "Tous les formats complexes (ASS, SSA, VOBSUB, PGS, SUB, IDX, etc…)", "AllEpisodes": "Tous les épisodes", "AllLanguages": "Toutes les langues", "AllLibraries": "Toutes les médiathèques", @@ -51,7 +51,7 @@ "BoxRear": "Dos de boîtier", "Browse": "Parcourir", "BrowsePluginCatalogMessage": "Explorer notre catalogue des plugins pour voir les plugins disponibles.", - "BurnSubtitlesHelp": "Détermine si le serveur doit incruster les sous-titres lors de la conversion vidéo en fonction du format des sous-titres. Éviter l'incrustation des sous-titres améliorera les performances du serveur. Sélectionnez Auto pour incruster les formats basés sur l'image (VOBSUB, PGS, SUB/IDX etc) et certains sous-titres ASS/SSA.", + "BurnSubtitlesHelp": "Détermine si le serveur doit incruster les sous-titres lors du transcodage de la vidéo. Éviter cela améliorera nettement la performance. Sélectionnez Auto pour incruster les formats basés sur l'image (VOBSUB, PGS, SUB, IDX etc) et certains sous-titres ASS ou SSA.", "ButtonAdd": "Ajouter", "ButtonAddMediaLibrary": "Ajouter une médiathèque", "ButtonAddScheduledTaskTrigger": "Ajouter un déclencheur", @@ -186,7 +186,7 @@ "DisplayInOtherHomeScreenSections": "Afficher dans les sections de l’écran d’accueil comme Ajouts récents et Reprendre", "DisplayMissingEpisodesWithinSeasons": "Afficher les épisodes manquants dans les saisons", "DisplayMissingEpisodesWithinSeasonsHelp": "Cette option doit aussi être activée pour les médiathèques TV dans les paramètres du serveur.", - "DisplayModeHelp": "Sélectionner le type d'écran sur lequel vous utilisez Jellyfin.", + "DisplayModeHelp": "Sélectionner l'agencement que vous désirez pour l'interface.", "DoNotRecord": "Ne pas enregistrer", "Down": "Bas", "Download": "Téléchargement", @@ -948,7 +948,7 @@ "OneChannel": "Une chaîne", "OnlyForcedSubtitles": "Seulement les sous-titres forcés", "OnlyForcedSubtitlesHelp": "Seuls les sous-titres marqués comme forcés seront chargés.", - "OnlyImageFormats": "Seulement les formats image (VOBSUB, PGS, SUB, etc)", + "OnlyImageFormats": "Seulement les formats image (VOBSUB, PGS, SUB)", "OptionAdminUsers": "Administrateurs", "OptionAlbumArtist": "Artiste de l'album", "OptionAllUsers": "Tous les utilisateurs", From 44aa8e5ccbbd764ddc1522ef958ec590fffcb90b Mon Sep 17 00:00:00 2001 From: MG Date: Thu, 2 Apr 2020 15:50:43 +0000 Subject: [PATCH 116/120] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/strings/it.json b/src/strings/it.json index 69680a46c4..1133e47718 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -14,7 +14,7 @@ "Albums": "Album", "All": "Tutto", "AllChannels": "Tutti i canali", - "AllComplexFormats": "Tutti i formati complessi (ASS, SSA, VOBSUB, PGS, SUB / IDX, ecc.)", + "AllComplexFormats": "Tutti i formati complessi (ASS, SSA, VOBSUB, PGS, SUB, IDX)", "AllEpisodes": "Tutti gli episodi", "AllLanguages": "Tutte le lingue", "AllLibraries": "Tutte le librerie", @@ -24,7 +24,7 @@ "AllowRemoteAccess": "Abilita connessioni remote a questo Server Jellyfin.", "AllowRemoteAccessHelp": "Se deselezionato, tutte le connessioni remote saranno bloccate.", "AllowedRemoteAddressesHelp": "Elenco separato da virgola di indirizzi IP o voci IP / maschera di rete per reti che potranno connettersi da remoto. Se lasciato vuoto, saranno consentiti tutti gli indirizzi remoti.", - "AlwaysPlaySubtitles": "Visualizza sempre i sottotitoli", + "AlwaysPlaySubtitles": "Riproduci sempre", "AlwaysPlaySubtitlesHelp": "I sottotitoli corrispondenti alla lingua preferita saranno caricati a prescindere dalla lingua dell'audio.", "AnyLanguage": "Qualsiasi lingua", "Anytime": "In qualsiasi momento", @@ -45,7 +45,7 @@ "BoxRear": "Box (retro)", "Browse": "Esplora", "BrowsePluginCatalogMessage": "Sfoglia il catalogo dei Plugins.", - "BurnSubtitlesHelp": "Determina se il server deve applicare i sottotitoli quando si convertono video in base al formato dei sottotitoli. Evitando di applicare i sottotitoli migliorerà le prestazioni del server. Selezionare Auto per applicare formati basati sull'immagine (VOBSUB, PGS, SUB / IDX, ecc.) e alcuni sottotitoli ASS / SSA.", + "BurnSubtitlesHelp": "Determina se il server deve imprimere i sottotitoli quando i video vengono convertiti. Evitare ciò migliorerà di molto le prestazioni. Selezionare Auto per imprimere formati basati sull'immagine (VOBSUB, PGS, SUB, IDX) e alcuni sottotitoli ASS o SSA.", "ButtonAdd": "Aggiungi", "ButtonAddMediaLibrary": "Aggiungi raccolta multimediale", "ButtonAddScheduledTaskTrigger": "Aggiungi operazione", @@ -175,7 +175,7 @@ "DisplayInOtherHomeScreenSections": "Mostra le sezioni della schermata home come gli ultimi media e continua a guardare", "DisplayMissingEpisodesWithinSeasons": "Visualizza gli episodi mancanti nelle stagioni", "DisplayMissingEpisodesWithinSeasonsHelp": "Questo deve anche essere abilitato per le librerie TV nella configurazione del server.", - "DisplayModeHelp": "Scegli il tipo di schermo su cui stai utilizzando Jellyfin.", + "DisplayModeHelp": "Seleziona lo stile del layout che vuoi per l'interfaccia.", "DoNotRecord": "Non registrare", "Down": "Giù", "Download": "Scarica", @@ -901,16 +901,16 @@ "NoNextUpItemsMessage": "Trovato niente. Inizia a guardare i tuoi programmi!", "NoPluginConfigurationMessage": "Questo Plugin non ha impostazioni da configurare.", "NoSubtitleSearchResultsFound": "Nessun risultato.", - "NoSubtitles": "Nessun Sottotitolo", + "NoSubtitles": "Nessuno", "NoSubtitlesHelp": "I sottotitoli non verranno caricati per impostazione predefinita.Possono essere ancora caricati manualmente durante la riproduzione.", "None": "Nessuno", "Normal": "Normale", "NumLocationsValue": "{0} cartelle", "Off": "Spento", "OneChannel": "Un canale", - "OnlyForcedSubtitles": "Solo i sottotitoli forzati", + "OnlyForcedSubtitles": "Solo forzati", "OnlyForcedSubtitlesHelp": "Solo i sottotitoli contrassegnati come forzati saranno caricati.", - "OnlyImageFormats": "Solo formati immagine (VOBSUB, PGS, SUB, ecc)", + "OnlyImageFormats": "Solo formati immagine (VOBSUB, PGS, SUB)", "OptionAdminUsers": "Amministratori", "OptionAlbumArtist": "Artista Album", "OptionAllUsers": "Tutti gli utenti", @@ -1013,7 +1013,7 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "Questo è necessario per alcuni dispositivi che non hanno l'avanzamento rapido che funziona bene.", "OptionRequirePerfectSubtitleMatch": "Scarica solo i sottotitoli che corrispondono perfettamente ai miei file video", "OptionRequirePerfectSubtitleMatchHelp": "La richiesta di una corrispondenza perfetta filtrerà i sottotitoli per includere solo quelli che sono stati testati e verificati con il file video esatto. Deselezionando questo aumenterà la probabilità che i sottotitoli vengono scaricati, ma aumenteranno le probabilità di testo sottotitolato impreciso o errato.", - "OptionResElement": "elemento res", + "OptionResElement": "res element", "OptionResumable": "Interrotto", "OptionRuntime": "Durata", "OptionSaturday": "Sabato", From db5dac8f22d2e139a04c42e8141636d255dd2c43 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 2 Apr 2020 18:43:54 +0200 Subject: [PATCH 117/120] Remove duplicate implementations of parentWithClass() --- src/components/channelmapper/channelmapper.js | 17 ++------- .../collectioneditor/collectioneditor.js | 17 ++------- src/components/filterdialog/filterdialog.js | 20 +++-------- .../imagedownloader/imagedownloader.js | 30 +++------------- .../playlisteditor/playlisteditor.js | 36 ++----------------- src/components/refreshdialog/refreshdialog.js | 17 ++------- 6 files changed, 19 insertions(+), 118 deletions(-) diff --git a/src/components/channelmapper/channelmapper.js b/src/components/channelmapper/channelmapper.js index 1b536f440b..2ea7a3a13a 100644 --- a/src/components/channelmapper/channelmapper.js +++ b/src/components/channelmapper/channelmapper.js @@ -1,18 +1,7 @@ -define(["dialogHelper", "loading", "connectionManager", "globalize", "actionsheet", "emby-input", "paper-icon-button-light", "emby-button", "listViewStyle", "material-icons", "formDialogStyle"], function (dialogHelper, loading, connectionManager, globalize, actionsheet) { +define(["dom", "dialogHelper", "loading", "connectionManager", "globalize", "actionsheet", "emby-input", "paper-icon-button-light", "emby-button", "listViewStyle", "material-icons", "formDialogStyle"], function (dom, dialogHelper, loading, connectionManager, globalize, actionsheet) { "use strict"; return function (options) { - function parentWithClass(elem, className) { - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - if (!elem) { - return null; - } - } - - return elem; - } - function mapChannel(button, channelId, providerChannelId) { loading.show(); var providerId = options.providerId; @@ -26,7 +15,7 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee }, dataType: "json" }).then(function (mapping) { - var listItem = parentWithClass(button, "listItem"); + var listItem = dom.parentWithClass(button, "listItem"); button.setAttribute("data-providerid", mapping.ProviderChannelId); listItem.querySelector(".secondary").innerHTML = getMappingSecondaryName(mapping, currentMappingOptions.ProviderName); loading.hide(); @@ -34,7 +23,7 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee } function onChannelsElementClick(e) { - var btnMap = parentWithClass(e.target, "btnMap"); + var btnMap = dom.parentWithClass(e.target, "btnMap"); if (btnMap) { var channelId = btnMap.getAttribute("data-id"); diff --git a/src/components/collectioneditor/collectioneditor.js b/src/components/collectioneditor/collectioneditor.js index 79220ac335..49784df498 100644 --- a/src/components/collectioneditor/collectioneditor.js +++ b/src/components/collectioneditor/collectioneditor.js @@ -1,25 +1,12 @@ -define(['dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (dialogHelper, loading, appHost, layoutManager, connectionManager, appRouter, globalize) { +define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (dom, dialogHelper, loading, appHost, layoutManager, connectionManager, appRouter, globalize) { 'use strict'; var currentServerId; - function parentWithClass(elem, className) { - - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - - if (!elem) { - return null; - } - } - - return elem; - } - function onSubmit(e) { loading.show(); - var panel = parentWithClass(this, 'dialog'); + var panel = dom.parentWithClass(this, 'dialog'); var collectionId = panel.querySelector('#selectCollectionToAddTo').value; diff --git a/src/components/filterdialog/filterdialog.js b/src/components/filterdialog/filterdialog.js index 7301c65669..cbbb1919b0 100644 --- a/src/components/filterdialog/filterdialog.js +++ b/src/components/filterdialog/filterdialog.js @@ -1,4 +1,4 @@ -define(["dialogHelper", "globalize", "connectionManager", "events", "browser", "require", "emby-checkbox", "emby-collapse", "css!./style"], function (dialogHelper, globalize, connectionManager, events, browser, require) { +define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "browser", "require", "emby-checkbox", "emby-collapse", "css!./style"], function (dom, dialogHelper, globalize, connectionManager, events, browser, require) { "use strict"; function renderOptions(context, selector, cssClass, items, isCheckedFn) { @@ -106,16 +106,6 @@ define(["dialogHelper", "globalize", "connectionManager", "events", "browser", " events.trigger(instance, "filterchange"); } - function parentWithClass(elem, className) { - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - if (!elem) { - return null; - } - } - return elem; - } - function setVisibility(context, options) { if (options.mode == "livetvchannels" || options.mode == "albums" || options.mode == "artists" || options.mode == "albumartists" || options.mode == "songs") { hideByClass(context, "videoStandard"); @@ -320,7 +310,7 @@ define(["dialogHelper", "globalize", "connectionManager", "events", "browser", " triggerChange(self); }); context.addEventListener("change", function (e) { - var chkGenreFilter = parentWithClass(e.target, "chkGenreFilter"); + var chkGenreFilter = dom.parentWithClass(e.target, "chkGenreFilter"); if (chkGenreFilter) { var filterName = chkGenreFilter.getAttribute("data-filter"); var filters = query.Genres || ""; @@ -334,7 +324,7 @@ define(["dialogHelper", "globalize", "connectionManager", "events", "browser", " triggerChange(self); return; } - var chkTagFilter = parentWithClass(e.target, "chkTagFilter"); + var chkTagFilter = dom.parentWithClass(e.target, "chkTagFilter"); if (chkTagFilter) { var filterName = chkTagFilter.getAttribute("data-filter"); var filters = query.Tags || ""; @@ -348,7 +338,7 @@ define(["dialogHelper", "globalize", "connectionManager", "events", "browser", " triggerChange(self); return; } - var chkYearFilter = parentWithClass(e.target, "chkYearFilter"); + var chkYearFilter = dom.parentWithClass(e.target, "chkYearFilter"); if (chkYearFilter) { var filterName = chkYearFilter.getAttribute("data-filter"); var filters = query.Years || ""; @@ -362,7 +352,7 @@ define(["dialogHelper", "globalize", "connectionManager", "events", "browser", " triggerChange(self); return; } - var chkOfficialRatingFilter = parentWithClass(e.target, "chkOfficialRatingFilter"); + var chkOfficialRatingFilter = dom.parentWithClass(e.target, "chkOfficialRatingFilter"); if (chkOfficialRatingFilter) { var filterName = chkOfficialRatingFilter.getAttribute("data-filter"); var filters = query.OfficialRatings || ""; diff --git a/src/components/imagedownloader/imagedownloader.js b/src/components/imagedownloader/imagedownloader.js index ce53b5cf0d..f4fcd7091f 100644 --- a/src/components/imagedownloader/imagedownloader.js +++ b/src/components/imagedownloader/imagedownloader.js @@ -1,4 +1,4 @@ -define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader', 'browser', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'emby-checkbox', 'paper-icon-button-light', 'emby-button', 'formDialogStyle', 'cardStyle'], function (loading, appHost, dialogHelper, connectionManager, imageLoader, browser, layoutManager, scrollHelper, globalize, require) { +define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader', 'browser', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'emby-checkbox', 'paper-icon-button-light', 'emby-button', 'formDialogStyle', 'cardStyle'], function (dom, loading, appHost, dialogHelper, connectionManager, imageLoader, browser, layoutManager, scrollHelper, globalize, require) { 'use strict'; var enableFocusTransform = !browser.slow && !browser.edge; @@ -126,21 +126,7 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' return html; } - function parentWithClass(elem, className) { - - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - - if (!elem) { - return null; - } - } - - return elem; - } - function downloadRemoteImage(page, apiClient, url, type, provider) { - var options = getBaseRemoteOptions(); options.Type = type; @@ -152,7 +138,7 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' apiClient.downloadRemoteImage(options).then(function () { hasChanges = true; - var dlg = parentWithClass(page, 'dialog'); + var dlg = dom.parentWithClass(page, 'dialog'); dialogHelper.close(dlg); }); } @@ -162,7 +148,6 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' } function getRemoteImageHtml(image, imageType, apiClient) { - var tagName = layoutManager.tv ? 'button' : 'div'; var enableFooterButtons = !layoutManager.tv; @@ -293,7 +278,6 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' } function initEditor(page, apiClient) { - page.querySelector('#selectBrowsableImageType').addEventListener('change', function () { browsableImageType = this.value; browsableImageStartIndex = 0; @@ -319,14 +303,14 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' page.addEventListener('click', function (e) { - var btnDownloadRemoteImage = parentWithClass(e.target, 'btnDownloadRemoteImage'); + var btnDownloadRemoteImage = dom.parentWithClass(e.target, 'btnDownloadRemoteImage'); if (btnDownloadRemoteImage) { - var card = parentWithClass(btnDownloadRemoteImage, 'card'); + var card = dom.parentWithClass(btnDownloadRemoteImage, 'card'); downloadRemoteImage(page, apiClient, card.getAttribute('data-imageurl'), card.getAttribute('data-imagetype'), card.getAttribute('data-imageprovider')); return; } - var btnImageCard = parentWithClass(e.target, 'btnImageCard'); + var btnImageCard = dom.parentWithClass(e.target, 'btnImageCard'); if (btnImageCard) { downloadRemoteImage(page, apiClient, btnImageCard.getAttribute('data-imageurl'), btnImageCard.getAttribute('data-imagetype'), btnImageCard.getAttribute('data-imageprovider')); } @@ -334,7 +318,6 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' } function showEditor(itemId, serverId, itemType) { - loading.show(); require(['text!./imagedownloader.template.html'], function (template) { @@ -380,7 +363,6 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' } function onDialogClosed() { - var dlg = this; if (layoutManager.tv) { @@ -397,9 +379,7 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' return { show: function (itemId, serverId, itemType, imageType) { - return new Promise(function (resolve, reject) { - currentResolve = resolve; currentReject = reject; hasChanges = false; diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js index c274b40799..69356a38c9 100644 --- a/src/components/playlisteditor/playlisteditor.js +++ b/src/components/playlisteditor/playlisteditor.js @@ -1,24 +1,10 @@ -define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', 'connectionManager', 'userSettings', 'appRouter', 'globalize', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (shell, dialogHelper, loading, layoutManager, playbackManager, connectionManager, userSettings, appRouter, globalize) { +define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', 'connectionManager', 'userSettings', 'appRouter', 'globalize', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (dom, shell, dialogHelper, loading, layoutManager, playbackManager, connectionManager, userSettings, appRouter, globalize) { 'use strict'; var currentServerId; - function parentWithClass(elem, className) { - - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - - if (!elem) { - return null; - } - } - - return elem; - } - function onSubmit(e) { - - var panel = parentWithClass(this, 'dialog'); + var panel = dom.parentWithClass(this, 'dialog'); var playlistId = panel.querySelector('#selectPlaylistToAddTo').value; var apiClient = connectionManager.getApiClient(currentServerId); @@ -35,11 +21,9 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', } function createPlaylist(apiClient, dlg) { - loading.show(); var url = apiClient.getUrl("Playlists", { - Name: dlg.querySelector('#txtNewPlaylistName').value, Ids: dlg.querySelector('.fldSelectedItemIds').value || '', userId: apiClient.getCurrentUserId() @@ -50,9 +34,7 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', type: "POST", url: url, dataType: "json" - }).then(function (result) { - loading.hide(); var id = result.Id; @@ -63,16 +45,13 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', } function redirectToPlaylist(apiClient, id) { - appRouter.showItem(id, apiClient.serverId()); } function addToPlaylist(apiClient, dlg, id) { - var itemIds = dlg.querySelector('.fldSelectedItemIds').value || ''; if (id === 'queue') { - playbackManager.queue({ serverId: apiClient.serverId(), ids: itemIds.split(',') @@ -85,7 +64,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', loading.show(); var url = apiClient.getUrl("Playlists/" + id + "/Items", { - Ids: itemIds, userId: apiClient.getCurrentUserId() }); @@ -95,7 +73,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', url: url }).then(function () { - loading.hide(); dlg.submitted = true; @@ -108,7 +85,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', } function populatePlaylists(editorOptions, panel) { - var select = panel.querySelector('#selectPlaylistToAddTo'); loading.hide(); @@ -116,7 +92,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', panel.querySelector('.newPlaylistInfo').classList.add('hide'); var options = { - Recursive: true, IncludeItemTypes: "Playlist", SortBy: 'SortName', @@ -125,7 +100,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', var apiClient = connectionManager.getApiClient(currentServerId); apiClient.getItems(apiClient.getCurrentUserId(), options).then(function (result) { - var html = ''; if (editorOptions.enableAddToPlayQueue !== false && playbackManager.isPlaying()) { @@ -135,7 +109,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', html += ''; html += result.Items.map(function (i) { - return ''; }); @@ -159,7 +132,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', } function getEditorHtml(items) { - var html = ''; html += '
'; @@ -195,7 +167,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', } function initEditor(content, options, items) { - content.querySelector('#selectPlaylistToAddTo').addEventListener('change', function () { if (this.value) { content.querySelector('.newPlaylistInfo').classList.add('hide'); @@ -235,7 +206,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', } PlaylistEditor.prototype.show = function (options) { - var items = options.items || {}; currentServerId = options.serverId; @@ -272,7 +242,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', initEditor(dlg, options, items); dlg.querySelector('.btnCancel').addEventListener('click', function () { - dialogHelper.close(dlg); }); @@ -281,7 +250,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', } return dialogHelper.open(dlg).then(function () { - if (layoutManager.tv) { centerFocus(dlg.querySelector('.formDialogContent'), false, false); } diff --git a/src/components/refreshdialog/refreshdialog.js b/src/components/refreshdialog/refreshdialog.js index b5730e592a..1e54d98372 100644 --- a/src/components/refreshdialog/refreshdialog.js +++ b/src/components/refreshdialog/refreshdialog.js @@ -1,19 +1,6 @@ -define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-input', 'emby-checkbox', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (shell, dialogHelper, loading, layoutManager, connectionManager, appRouter, globalize) { +define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-input', 'emby-checkbox', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (dom, shell, dialogHelper, loading, layoutManager, connectionManager, appRouter, globalize) { 'use strict'; - function parentWithClass(elem, className) { - - while (!elem.classList || !elem.classList.contains(className)) { - elem = elem.parentNode; - - if (!elem) { - return null; - } - } - - return elem; - } - function getEditorHtml() { var html = ''; @@ -65,7 +52,7 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager' loading.show(); var instance = this; - var dlg = parentWithClass(e.target, 'dialog'); + var dlg = dom.parentWithClass(e.target, 'dialog'); var options = instance.options; var apiClient = connectionManager.getApiClient(options.serverId); From 40d03204d8041d9b3b0a0ccefc2d0272ace63a7b Mon Sep 17 00:00:00 2001 From: 4d1m Date: Fri, 3 Apr 2020 09:24:07 +0000 Subject: [PATCH 118/120] Translated using Weblate (Romanian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ro/ --- src/strings/ro.json | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/strings/ro.json b/src/strings/ro.json index 427ccff485..d5cb84fd42 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -229,7 +229,7 @@ "AllLibraries": "Toate librăriile", "AllLanguages": "Toate limbile", "AllEpisodes": "Toate episoadele", - "AllComplexFormats": "Toate formatele complexe (ASS, SSA, VOBSUB, PGS, SUB/IDX, etc.)", + "AllComplexFormats": "Toate formatele complexe (ASS, SSA, VOBSUB, PGS, SUB, IDX)", "AllChannels": "Toate canalele", "Alerts": "Alerte", "Albums": "Albume", @@ -251,8 +251,8 @@ "Collections": "Colecții", "AllowRemoteAccess": "Permite conexiuni externe către serverul Jellyfin.", "AllowRemoteAccessHelp": "Dacă este nebifat, toate conexiunile externe vor fi blocate.", - "AlwaysPlaySubtitles": "Întotdeauna folosește subtitrări", - "AnyLanguage": "Orice limbă", + "AlwaysPlaySubtitles": "Întotdeauna arată", + "AnyLanguage": "Orice Limbă", "Anytime": "Oricând", "Art": "Artă", "AlwaysPlaySubtitlesHelp": "Subtitrările care se potrivesc cu preferințele limbii utilizate vor fi încărcate indiferent de limba audio.", @@ -288,7 +288,7 @@ "Director": "Regizor", "AllowOnTheFlySubtitleExtractionHelp": "Subtitrările încorporate pot fi extrase din video și transmise către client în mod text pentru a preveni transcodarea videoului. Pe unele sisteme acest lucru poate dura mult timp și poate cauza oprirea redării video în timpul procesului de extragere. Dezactivează opțiunea pentru a avea subtitrările încorporate incluse în videoul transcodat atunci când nu sunt nativ suportate de către dispozitivul client.", "BirthLocation": "Locul nașterii", - "BurnSubtitlesHelp": "Determină dacă serverul ar trebui să includă subtitrări când face conversia video depinzând de formatul subtitrărilor. Evitând includerea subtitrărilor va îmbunătăți performanța serverului. Selectează Auto pentru includerea formaturilor bazate pe imagini (VOBSUB, PGS, SUB/IDX, etc) și anumitor subtitrări ASS/SSA.", + "BurnSubtitlesHelp": "Determină dacă serverul ar trebui să includă subtitrări când face transcodarea video. Evitând acest lucru va îmbunătăți performanța serverului. Selectează Auto pentru includerea formaturilor bazate pe imagini (VOBSUB, PGS, SUB, IDX) și anumitor subtitrări ASS sau SSA.", "ButtonPreviousTrack": "Calea anterioară", "ButtonRevoke": "Revocă", "ButtonSettings": "Setări", @@ -588,7 +588,7 @@ "DisplayInOtherHomeScreenSections": "Afișați în secțiuni ecranul principal, cum ar fi cele mai noi suporturi și continuați să vizionați", "DisplayMissingEpisodesWithinSeasons": "Afișați episoade lipsă din sezoane", "DisplayMissingEpisodesWithinSeasonsHelp": "Acesta trebuie de asemenea activat pentru bibliotecile TV din configurația serverului.", - "DisplayModeHelp": "Selectați tipul de ecran pe care executați Jellyfin.", + "DisplayModeHelp": "Selectați stilul schemei pe care îl doriți pentru interfață.", "Download": "Descarcă", "DrmChannelsNotImported": "Canalele cu DRM nu vor fi importate.", "DropShadow": "Umbra", @@ -1000,16 +1000,16 @@ "OptionAlbum": "Album", "OptionAdminUsers": "Administratorii", "Option3D": "3D", - "OnlyImageFormats": "Numai formate de imagine (VOBSUB, PGS, SUB, etc)", + "OnlyImageFormats": "Numai formate de imagine (VOBSUB, PGS, SUB)", "OnlyForcedSubtitlesHelp": "Se vor încărca doar subtitrările marcate drept forțate.", - "OnlyForcedSubtitles": "Numai subtitrări forțate", + "OnlyForcedSubtitles": "Numai forțate", "OneChannel": "Un canal", "Off": "Oprit", "NumLocationsValue": "{0} dosare", "Normal": "Normal", "None": "Nici unul", "NoSubtitlesHelp": "Subtitrările nu vor fi încărcate în mod implicit. Acestea pot fi însă activate manual în timpul redării.", - "NoSubtitles": "Fără subtitrare", + "NoSubtitles": "Fără", "NoSubtitleSearchResultsFound": "Nici un rezultat găsit.", "NoPluginConfigurationMessage": "Acest plugin nu are setări de configurat.", "NoNewDevicesFound": "Nu s-au găsit dispozitive noi. Pentru a adăuga un nou tuner, închideți acest dialog și introduceți informațiile dispozitivului manual.", @@ -1466,5 +1466,19 @@ "AskAdminToCreateLibrary": "Cereți unui administrator să creeze o bibliotecă.", "PlaybackErrorNoCompatibleStream": "A apărut o problemă cu profilarea clientului, iar serverul nu trimite un format media compatibil.", "AllowFfmpegThrottlingHelp": "Când un transcod sau un remux se află destul de departe înainte de poziția actuală de redare, întrerupeți procesul, astfel încât să consume mai puține resurse. Acest lucru este cel mai util când priviți fără a derula des. Dezactivați acestă opțiune dacă întâmpinați probleme de redare.", - "AllowFfmpegThrottling": "Accelerare Transcod-uri" + "AllowFfmpegThrottling": "Accelerare Transcod-uri", + "Track": "Cale", + "Season": "Sezon", + "ReleaseGroup": "Gruparea lansării", + "PreferEmbeddedEpisodeInfosOverFileNames": "Preferați informațiile despre episod încorporate în fișier decât numele fișierelor", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Aceasta folosește informațiile despre episod din metadatele încorporate, dacă sunt disponibile.", + "Person": "Persoană", + "OtherArtist": "Alt artist", + "Movie": "Film", + "Episode": "Episod", + "ClientSettings": "Setări pentru client", + "BoxSet": "Set de colecție", + "Artist": "Artist", + "AlbumArtist": "Artistul albumului", + "Album": "Album" } From 8702b04da1d69e5a605c03ac9f67d9ad49143c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Libor=20Fil=C3=ADpek?= Date: Fri, 3 Apr 2020 14:06:58 +0000 Subject: [PATCH 119/120] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index bf74c4ad2d..84e8ec0c3d 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -14,7 +14,7 @@ "AllEpisodes": "Všechny epizody", "AllLanguages": "Všechny jazyky", "AllowHWTranscodingHelp": "Povolit tuneru překódování v reálném čase. Může snížit zátěž překódovávání požadované Jellyfin serverem.", - "AlwaysPlaySubtitles": "Vždy zobrazit titulky", + "AlwaysPlaySubtitles": "Vždy zobrazovat", "AlwaysPlaySubtitlesHelp": "Titulky odpovídající jazykové předvolbě se načtou bez ohledu na jazyk audia.", "Anytime": "Kdykoliv", "AroundTime": "Okolo {0}", @@ -158,7 +158,7 @@ "Display": "Zobrazení", "DisplayMissingEpisodesWithinSeasons": "Zobrazit chybějící epizody", "DisplayMissingEpisodesWithinSeasonsHelp": "Toto musí být zapnuto pro knihovny TV v nastavení serveru.", - "DisplayModeHelp": "Zvolte typ obrazovky, na které používáte Jellyfin.", + "DisplayModeHelp": "Vyberte styl rozvržení, který chcete pro rozhraní.", "DoNotRecord": "Nenahrávat", "Down": "Dolů", "Download": "Stáhnout", @@ -862,14 +862,14 @@ "NoNextUpItemsMessage": "Nic nenalezeno. Začněte sledovat Vaše oblíbené seriály!", "NoPluginConfigurationMessage": "Tento zásuvný modul nemá žádné nastavení.", "NoSubtitleSearchResultsFound": "Žádné výsledky.", - "NoSubtitles": "Žádné titulky", + "NoSubtitles": "Žádné", "NoSubtitlesHelp": "Ve výchozím nastavení nebudou titulky načteny. Během přehrávání však mohou být manuálně zapnuty.", "None": "Žádný", "Normal": "Normální", "NumLocationsValue": "{0} složky", "Off": "Vypnuto", "OneChannel": "Jeden kanál", - "OnlyForcedSubtitles": "Pouze vynucené titulky", + "OnlyForcedSubtitles": "Pouze vynucené", "OnlyForcedSubtitlesHelp": "Jen vynucené titulky budou nahrány.", "OptionAdminUsers": "Administrátoři", "OptionAlbumArtist": "Umělec Alba", @@ -1248,7 +1248,7 @@ "Blacklist": "Černá listina", "BobAndWeaveWithHelp": "Bob and weave (vyšší kvalita, ale pomalejší)", "Browse": "Procházet", - "BurnSubtitlesHelp": "Určuje, zda má server vypalovat titulky při převodu videa v závislosti na formátu titulků. Vynechání vypalování titulků zlepší výkon serveru. Chcete-li vypálit grafické formáty (VOBSUB, PGS, SUB / IDX atd.) a některé titulky ASS / SSA, vyberte možnost Auto.", + "BurnSubtitlesHelp": "Určuje, zda má server vypalovat titulky při překódování videa. Vynechání tohoto zlepší výkon serveru. Chcete-li vypálit grafické formáty (VOBSUB, PGS, SUB / IDX atd.) a některé titulky ASS / SSA, vyberte možnost Auto.", "ButtonInfo": "Info", "ButtonMenu": "Menu", "ButtonOk": "Ok", @@ -1570,5 +1570,19 @@ "NoCreatedLibraries": "Zdá se, že jste dosud nevytvořili žádnou knihovnu. {0}Chtěli byste nějakou vytvořit nyní?{1}", "AskAdminToCreateLibrary": "Požádejte administrátora o vytvoření knihovny.", "AllowFfmpegThrottlingHelp": "Když se překódování nebo remux dostane dostatečně daleko dopředu od aktuální pozice přehrávání, pozastaví se proces, aby spotřeboval méně zdrojů. To je nejužitečnější při sledování bez častého vyhledávání. Pokud máte problémy s přehráváním, vypněte tuto funkci.", - "AllowFfmpegThrottling": "Omezit překódování" + "AllowFfmpegThrottling": "Omezit překódování", + "BoxSet": "Sbírka", + "Track": "Stopa", + "Season": "Sezóna", + "ReleaseGroup": "Vydavatel", + "PreferEmbeddedEpisodeInfosOverFileNames": "Preferovat vložené informace o epizodě před názvy souborů", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Používá se informace o epizodě z vložených metadat, pokud jsou k dispozici.", + "Person": "Osoba", + "OtherArtist": "Ostatní interpreti", + "Movie": "Film", + "Episode": "Epizoda", + "ClientSettings": "Nastavení klienta", + "Artist": "Interpret", + "AlbumArtist": "Interpret alba", + "Album": "Album" } From 402c0ba7d1a6fa944c06a8ee2c0b71c81c9edd09 Mon Sep 17 00:00:00 2001 From: Louis Hermier Date: Fri, 3 Apr 2020 15:04:05 +0000 Subject: [PATCH 120/120] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 81b8c5f85a..77a0c37b2d 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1471,5 +1471,16 @@ "PlaybackErrorNoCompatibleStream": "Problème de profil client, le serveur n’a pas pu envoyer un format média compatible.", "PreferEmbeddedEpisodeInfosOverFileNames": "Préférer les informations intégrées aux noms de fichiers", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Utilise les informations des métadonnées intégrées, si disponible.", - "ClientSettings": "Paramètres Client" + "ClientSettings": "Paramètres Client", + "Track": "Piste", + "Season": "Saison", + "ReleaseGroup": "Groupe de Parution", + "Person": "Personne", + "OtherArtist": "Autre Artiste", + "Movie": "Film", + "Episode": "Épisode", + "BoxSet": "Coffret", + "Artist": "Artiste", + "AlbumArtist": "Artiste de l'Album", + "Album": "Album" }