From 25e4d378435adb0f22739712b5cde85f0066d795 Mon Sep 17 00:00:00 2001 From: lucaperl <52839381+lucaperl@users.noreply.github.com> Date: Sat, 28 Jan 2023 19:13:50 +0100 Subject: [PATCH 001/156] Added "Light Grey" and "Dark Grey" subtitle colors For OLED screens and HDR content, where white subtitles would be blinding. --- src/components/subtitlesettings/subtitlesettings.template.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/subtitlesettings/subtitlesettings.template.html b/src/components/subtitlesettings/subtitlesettings.template.html index 685b03997e..e530b83f98 100644 --- a/src/components/subtitlesettings/subtitlesettings.template.html +++ b/src/components/subtitlesettings/subtitlesettings.template.html @@ -102,6 +102,8 @@
- - + + From c7dab8daa40a6ad4cb823170467ee2036049b0e6 Mon Sep 17 00:00:00 2001 From: lucaperl <52839381+lucaperl@users.noreply.github.com> Date: Sun, 29 Jan 2023 19:10:20 +0100 Subject: [PATCH 003/156] Update subtitle color string keys --- .../subtitlesettings.template.html | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/subtitlesettings/subtitlesettings.template.html b/src/components/subtitlesettings/subtitlesettings.template.html index b4ef9775df..5f1f14ae9d 100644 --- a/src/components/subtitlesettings/subtitlesettings.template.html +++ b/src/components/subtitlesettings/subtitlesettings.template.html @@ -101,16 +101,16 @@
From 85e4f67005babefc7b08656da7d9f857e236cdd5 Mon Sep 17 00:00:00 2001 From: lucaperl <52839381+lucaperl@users.noreply.github.com> Date: Sun, 29 Jan 2023 19:22:22 +0100 Subject: [PATCH 004/156] Add Subtitle color strings Subtitle color strings as added in #3549 and #4311 --- src/strings/en-us.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 7a2bd21686..af48ce9b86 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1448,10 +1448,20 @@ "Subtitle": "Subtitle", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "These settings also apply to any Google Cast playback started by this device.", "SubtitleAppearanceSettingsDisclaimer": "Following settings do not apply to the graphical subtitles mentioned above or ASS/SSA subtitles that embed their own styles.", + "SubtitleBlack": "Black", + "SubtitleBlue": "Blue", + "SubtitleCyan": "Cyan", "SubtitleDownloadersHelp": "Enable and rank your preferred subtitle downloaders in order of priority.", + "SubtitleGray": "Gray", + "SubtitleGreen": "Green", + "SubtitleLightGray": "Light Gray", + "SubtitleMagenta": "Magenta", "SubtitleOffset": "Subtitle Offset", + "SubtitleRed": "Red", "Subtitles": "Subtitles", "SubtitleVerticalPositionHelp": "Line number where text appears. Positive numbers indicate top down. Negative numbers indicate bottom up.", + "SubtitleWhite": "White", + "SubtitleYellow": "Yellow", "Suggestions": "Suggestions", "Sunday": "Sunday", "Sync": "Sync", From e5d6fefdd5af3707ee8ab603c601d064d06f6a99 Mon Sep 17 00:00:00 2001 From: Andi Chandler Date: Sun, 12 Feb 2023 20:51:36 +0000 Subject: [PATCH 005/156] Translated using Weblate (English (United Kingdom)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/ --- src/strings/en-gb.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index 969b5a1463..fd3cd5de27 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -1701,5 +1701,7 @@ "LabelChapterImageResolution": "Resolution:", "LabelChapterImageResolutionHelp": "The resolution of the extracted chapter images.", "ResolutionMatchSource": "Match Source", - "SaveRecordingNFO": "Save recording EPG metadata in NFO" + "SaveRecordingNFO": "Save recording EPG metadata in NFO", + "PreferEmbeddedExtrasTitlesOverFileNames": "Prefer embedded titles over filenames for extras", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Extras often have the same embedded name as the parent, check this to use embedded titles for them anyway." } From ff9c6978940ad06f12a222dfa230ad9a3b6a1ffc Mon Sep 17 00:00:00 2001 From: Zourlo Date: Sun, 12 Feb 2023 23:30:01 +0000 Subject: [PATCH 006/156] Translated using Weblate (Japanese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ja/ --- src/strings/ja.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/ja.json b/src/strings/ja.json index 06337cb602..f7c431d3f1 100644 --- a/src/strings/ja.json +++ b/src/strings/ja.json @@ -144,8 +144,8 @@ "DirectStreamHelp1": "ビデオストリームは、お使いのデバイスとの互換性がありますが、(DTS、Dolby TrueHDなどの)オーディオフォーマットまたはオーディオチャンネル数で互換性がありません。ビデオストリームは、デバイスに送信される前に、ロスレスに再パッケージされ、音声ストリームのみをトランスコードします。", "DirectStreamHelp2": "ダイレクトストリーミングによって消費される電力はオーディオプロファイルによります。動画のストリームのみが可逆圧縮です。", "DirectStreaming": "ダイレクトストリーミング", - "Director": "ディレクター", - "Directors": "ディレクターズ", + "Director": "監督", + "Directors": "監督", "Disc": "ディスク", "Disconnect": "切断", "Display": "ディスプレイ", From 19dea327bb9d9844bc7b5cb6cf16d0480b248cb1 Mon Sep 17 00:00:00 2001 From: Joe Rogers <1337joe@gmail.com> Date: Mon, 13 Feb 2023 01:20:54 -0500 Subject: [PATCH 007/156] Remove duplicated display of studios, unused parameter --- src/controllers/itemDetails/index.js | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 28b0424153..5309119aec 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1090,7 +1090,7 @@ function renderTagline(page, item) { } } -function renderDetails(page, item, apiClient, context, isStatic) { +function renderDetails(page, item, apiClient, context) { renderSimilarItems(page, item, context); renderMoreFromSeason(page, item, apiClient); renderMoreFromArtist(page, item, apiClient); @@ -1110,7 +1110,7 @@ function renderDetails(page, item, apiClient, context, isStatic) { } renderTags(page, item); - renderSeriesAirTime(page, item, isStatic); + renderSeriesAirTime(page, item); } function enableScrollX() { @@ -1289,7 +1289,7 @@ function renderSimilarItems(page, item, context) { } } -function renderSeriesAirTime(page, item, isStatic) { +function renderSeriesAirTime(page, item) { const seriesAirTime = page.querySelector('#seriesAirTime'); if (item.Type != 'Series') { seriesAirTime.classList.add('hide'); @@ -1308,19 +1308,6 @@ function renderSeriesAirTime(page, item, isStatic) { if (item.AirTime) { html += ' at ' + item.AirTime; } - if (item.Studios.length) { - if (isStatic) { - html += ' on ' + escapeHtml(item.Studios[0].Name); - } else { - const context = inferContext(item); - const href = appRouter.getRouteUrl(item.Studios[0], { - context: context, - itemType: 'Studio', - serverId: item.ServerId - }); - html += ' on ' + escapeHtml(item.Studios[0].Name) + ''; - } - } if (html) { html = (item.Status == 'Ended' ? 'Aired ' : 'Airs ') + html; seriesAirTime.innerHTML = html; From 94212cdd1f722af4556100f4227c4cea5b98a768 Mon Sep 17 00:00:00 2001 From: Aditya Gupta Date: Mon, 13 Feb 2023 14:22:47 +0000 Subject: [PATCH 008/156] Translated using Weblate (Hindi) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hi/ --- src/strings/hi-in.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/hi-in.json b/src/strings/hi-in.json index 5e594f3b3f..6d91c56039 100644 --- a/src/strings/hi-in.json +++ b/src/strings/hi-in.json @@ -129,5 +129,8 @@ "MusicVideos": "संगीत वीडियो", "OptionBluray": "BD", "Playlists": "प्लेलिस्ट", - "Photos": "तस्वीरें" + "Photos": "तस्वीरें", + "AgeValue": "({0} साल पुराना)", + "ButtonClose": "बंद करें", + "AddToFavorites": "पसंदीदो में शामिल करे" } From 4f75faab56b6ec21101978df8d6861e8836b997a Mon Sep 17 00:00:00 2001 From: Aditya Gupta Date: Mon, 13 Feb 2023 14:23:56 +0000 Subject: [PATCH 009/156] Translated using Weblate (Hindi) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hi/ --- src/strings/hi-in.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/hi-in.json b/src/strings/hi-in.json index 6d91c56039..f2dd5f66c5 100644 --- a/src/strings/hi-in.json +++ b/src/strings/hi-in.json @@ -132,5 +132,7 @@ "Photos": "तस्वीरें", "AgeValue": "({0} साल पुराना)", "ButtonClose": "बंद करें", - "AddToFavorites": "पसंदीदो में शामिल करे" + "AddToFavorites": "पसंदीदो में शामिल करे", + "ButtonExitApp": "ऐप को बंद करें", + "ButtonSpace": "स्पेस" } From 57f4324e3d5844a2d0f53fb4fb81140dd4c5f37d Mon Sep 17 00:00:00 2001 From: Aditya Gupta Date: Mon, 13 Feb 2023 14:24:30 +0000 Subject: [PATCH 010/156] Translated using Weblate (Hindi) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hi/ --- src/strings/hi-in.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/hi-in.json b/src/strings/hi-in.json index f2dd5f66c5..3b582c39d5 100644 --- a/src/strings/hi-in.json +++ b/src/strings/hi-in.json @@ -134,5 +134,7 @@ "ButtonClose": "बंद करें", "AddToFavorites": "पसंदीदो में शामिल करे", "ButtonExitApp": "ऐप को बंद करें", - "ButtonSpace": "स्पेस" + "ButtonSpace": "स्पेस", + "ButtonSplit": "विभाजित करें", + "ButtonStart": "शुरु करें" } From 9ddb443ef6656b167b41fe15306d0e7a649c36ba Mon Sep 17 00:00:00 2001 From: Aditya Gupta Date: Mon, 13 Feb 2023 14:33:35 +0000 Subject: [PATCH 011/156] Translated using Weblate (Hindi) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hi/ --- src/strings/hi-in.json | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/strings/hi-in.json b/src/strings/hi-in.json index 3b582c39d5..46c2072174 100644 --- a/src/strings/hi-in.json +++ b/src/strings/hi-in.json @@ -17,16 +17,16 @@ "AddToCollection": "संग्रह में जोड़ें", "Add": "जोड़ें", "Actor": "अभिनेता", - "AccessRestrictedTryAgainLater": "वर्तमान में पहुंच प्रतिबंधित है। कृपया बाद में पुनः प्रयास करें.", + "AccessRestrictedTryAgainLater": "पहुंच प्रतिबंधित है। कृपया बाद में प्रयास करें.", "AllowHWTranscodingHelp": "ट्यूनर को निरंतर रूप से धाराओं को ट्रांसकोड करने दें। यह सर्वर द्वारा ट्रांसकोडिंग को कम करने में मदद कर सकता है।", "AllLanguages": "सभी भाषाएं", "AllEpisodes": "सभी प्रकरण", - "AllComplexFormats": "सभी जटिल प्रारूप (ASS, SSA, VobSub, PGS, SUB, IDX, …)", + "AllComplexFormats": "सभी प्रारूप (ASS, SSA, VobSub, PGS, SUB, IDX, …)", "AllChannels": "सभी चैनल्स", "Alerts": "चेतावनियां", "Albums": "एल्बम", - "Aired": "प्रसारित हो चुका", - "AdditionalNotificationServices": "अतिरिक्त सूचना सेवाओं को स्थापित करने के लिए प्लगइन सूची पर नज़र डालें।", + "Aired": "प्रसारित हो चुका है", + "AdditionalNotificationServices": "दी गयी सूची में से प्लगिन इनस्टॉल करें|", "AddedOnValue": "जोड़ दिया", "AddToPlaylist": "प्लेलिस्ट में जोड़ें", "AllowMediaConversionHelp": "मीडिया परिवर्तन के लिये अनुमति दें या इनकार करें.", @@ -86,7 +86,7 @@ "AllowFfmpegThrottlingHelp": "जब एक ट्रांसकोड या रीमूक्स वर्तमान प्लेबैक स्थिति से काफी आगे हो जाता है, तो प्रक्रिया को रोकें ताकि यह कम संसाधनों का उपभोग करेगा। अक्सर मांग किए बिना देखने पर यह सबसे उपयोगी है। यदि आप प्लेबैक समस्याओं का अनुभव करते हैं तो इसे बंद कर दें।", "AllowFfmpegThrottling": "थ्रोटल ट्रांसकोड", "AllowOnTheFlySubtitleExtractionHelp": "वीडियो ट्रांसकोडिंग को रोकने में मदद करने के लिए एंबेडेड सबटाइटल वीडियो से निकाले जा सकते हैं और सादे पाठ में ग्राहकों तक पहुंचाए जाते हैं। कुछ प्रणालियों पर यह एक लंबा समय ले सकता है और निष्कर्षण प्रक्रिया के दौरान वीडियो प्लेबैक को स्टाल करने का कारण बन सकता है। जब वे क्लाइंट डिवाइस द्वारा मूल रूप से समर्थित नहीं होते हैं, तो वीडियो ट्रांसकोडिंग के साथ जले हुए एम्बेडेड उपशीर्षक को अक्षम करें।", - "AlbumArtist": "चित्राधार कलाकार", + "AlbumArtist": "एल्बम कलाकार", "AllowOnTheFlySubtitleExtraction": "मक्खी पर उपशीर्षक निष्कर्षण की अनुमति दें", "Album": "एल्बम", "ButtonSyncPlay": "SyncPlay", @@ -136,5 +136,10 @@ "ButtonExitApp": "ऐप को बंद करें", "ButtonSpace": "स्पेस", "ButtonSplit": "विभाजित करें", - "ButtonStart": "शुरु करें" + "ButtonStart": "शुरु करें", + "ButtonStop": "रोकें", + "ButtonSubmit": "प्रस्तुत करें", + "ButtonTogglePlaylist": "प्लेलिस्ट", + "ButtonUninstall": "ऐप हटाएं", + "ButtonTrailer": "ट्रेलर" } From 1e2f52a28edafeae6441d5e0393488e4c1c5cafb Mon Sep 17 00:00:00 2001 From: ArneNaessens Date: Mon, 13 Feb 2023 16:53:50 +0000 Subject: [PATCH 012/156] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 2fdce82585..0ee3872694 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1687,5 +1687,10 @@ "DownloadAll": "Alles downloaden", "Experimental": "Experimenteel", "StereoDownmixAlgorithmHelp": "Algoritme dat gebruikt wordt om multikanaals geluid naar stereo te downmixen.", - "LabelStereoDownmixAlgorithm": "Stereo-downmix-algoritme" + "LabelStereoDownmixAlgorithm": "Stereo-downmix-algoritme", + "LabelChapterImageResolutionHelp": "De resolutie van de opgehaalde hoofdstuk afbeeldingen.", + "LabelDummyChapterDuration": "Interval:", + "LabelDummyChapterCount": "Limiet:", + "LabelDummyChapterCountHelp": "Het maximum aantal hoofdstukafbeeldingen dat wordt opgehaald uit ieder mediabestand.", + "LabelChapterImageResolution": "Resolutie:" } From bbd1921629a5848a7daa0c58aa6e87a9e435d444 Mon Sep 17 00:00:00 2001 From: felix920506 Date: Mon, 13 Feb 2023 20:05:19 +0000 Subject: [PATCH 013/156] 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 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index cb157541ca..8097c827ee 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -570,9 +570,9 @@ "LabelAccessStart": "開始時間:", "LabelAirDays": "播出日期:", "LabelAirTime": "播出時間:", - "LabelAirsAfterSeason": "已播放劇集季度:", - "LabelAirsBeforeEpisode": "集播出前:", - "LabelAirsBeforeSeason": "尚未播放劇集季度:", + "LabelAirsAfterSeason": "在季度後播出:", + "LabelAirsBeforeEpisode": "在集數前播出:", + "LabelAirsBeforeSeason": "在季度前播出:", "LabelAlbum": "專輯:", "LabelAlbumArtHelp": "PN 在 upnp:albumArtURI 裡的 dlna:profileID 屬性用於專輯封面。某些設備不管圖像的尺寸大小,都會要求特定的值。", "LabelAlbumArtMaxHeight": "專輯封面最大高度:", @@ -1169,7 +1169,7 @@ "LabelOptionalNetworkPathHelp": "如果這個資料夾在網路上分享,提供網路分享路徑可以供其他應用程式直接存取媒體檔案,例如 {0} 或者 {1}。", "LabelOriginalAspectRatio": "原始長寬比:", "LabelOverview": "內容概述:", - "LabelParentalRating": "家長分級:", + "LabelParentalRating": "分級:", "LabelPasswordConfirm": "確認密碼:", "LabelPasswordResetProvider": "密碼重設提供者:", "LabelPasswordRecoveryPinCode": "PIN 碼:", From ddef7075a17f49c271d41a7e90697184c74b65c8 Mon Sep 17 00:00:00 2001 From: stegl Date: Mon, 13 Feb 2023 23:12:06 +0000 Subject: [PATCH 014/156] Translated using Weblate (Slovenian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sl/ --- src/strings/sl-si.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index 3a9451b2d6..fe584d7802 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -1686,5 +1686,6 @@ "StereoDownmixAlgorithmHelp": "Algoritem uporabljen za downmix večkanalnega zvoka v stereo.", "Experimental": "Poskusno", "LabelStereoDownmixAlgorithm": "Stereo Downmix algoritem", - "DownloadAll": "Prenesi vse" + "DownloadAll": "Prenesi vse", + "HeaderDummyChapter": "Slike poglavja" } From 125b31000c4a1e14d607c515e6ecc595c225c191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=80=A0xu=5Fzh?= Date: Tue, 14 Feb 2023 09:38:19 +0000 Subject: [PATCH 015/156] 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 | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index e3f3831f5c..818bf42ffd 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -135,7 +135,7 @@ "Disconnect": "断开连接", "Display": "显示", "DisplayInMyMedia": "在主屏幕显示", - "DisplayInOtherHomeScreenSections": "在“最新媒体”和“继续观看“等主屏幕模块中显示", + "DisplayInOtherHomeScreenSections": "在“新增媒体”和“继续观看“等主屏幕模块中显示", "DisplayMissingEpisodesWithinSeasons": "显示每季里缺少的剧集", "DisplayMissingEpisodesWithinSeasonsHelp": "必须在服务器的 TV 媒体库设置中也启用该功能。", "DoNotRecord": "不录制", @@ -273,11 +273,11 @@ "HeaderInstall": "安装", "HeaderInstantMix": "速成合辑", "HeaderKodiMetadataHelp": "要启用或禁用 NFO 元数据,请编辑库并找到“元数据保护程序”部分。", - "HeaderLatestEpisodes": "最新剧集", - "HeaderLatestMedia": "最新媒体", - "HeaderLatestMovies": "最新电影", - "HeaderLatestMusic": "最新音乐", - "HeaderLatestRecordings": "最新录制的节目", + "HeaderLatestEpisodes": "新增剧集", + "HeaderLatestMedia": "新增媒体", + "HeaderLatestMovies": "新增电影", + "HeaderLatestMusic": "新增音乐", + "HeaderLatestRecordings": "新增录制", "HeaderLibraries": "媒体库", "HeaderLibraryAccess": "媒体库访问", "HeaderLibraryFolders": "媒体文件夹", @@ -368,7 +368,7 @@ "HeaderYears": "年份", "Help": "帮助", "Hide": "隐藏", - "HideWatchedContentFromLatestMedia": "隐藏来自“最新媒体”的观看内容", + "HideWatchedContentFromLatestMedia": "隐藏来自“新增媒体”的已观看内容", "Home": "首页", "HttpsRequiresCert": "要启用安全连接, 您需要提供一个受信任的 SSL 证书, 如 \"Let's Encrypt\"。请提供证书或禁用安全连接。", "Identify": "识别", @@ -705,7 +705,7 @@ "LabelffmpegPathHelp": "FFmpeg 应用文件或包含 FFmpeg 的文件夹的路径。", "LanNetworksHelp": "在强制带宽限制时,认作本地网络上的 IP 地址或 IP/网络掩码条目的逗号分隔列表。如果设置此项,所有其它 IP 地址将被视为在外部网络上,并且将受到外部带宽限制。如果保留为空,则只将服务器的子网视为本地网络。", "Large": "大", - "LatestFromLibrary": "最近添加于{0}", + "LatestFromLibrary": "最近添加于 {0}", "LearnHowYouCanContribute": "了解如何贡献。", "LibraryAccessHelp": "选择共享给此用户的媒体库。管理员有权使用媒体资料管理器来编辑所有文件夹。", "List": "列表", @@ -1036,7 +1036,7 @@ "TabContainers": "媒体载体", "TabDashboard": "控制台", "TabDirectPlay": "直接播放", - "TabLatest": "最新", + "TabLatest": "新增", "TabLogs": "日志", "TabMusic": "音乐", "TabMyPlugins": "我的插件", @@ -1689,5 +1689,19 @@ "Experimental": "实验功能", "LabelStereoDownmixAlgorithm": "立体声降混算法", "StereoDownmixAlgorithmHelp": "用于将多声道下降混合为立体声的算法。", - "HeaderRecordingMetadataSaving": "记录元数据" + "HeaderRecordingMetadataSaving": "记录元数据", + "LabelDummyChapterDuration": "间隔:", + "LabelDummyChapterDurationHelp": "章节图像提取间隔,以秒为单位。", + "PreferEmbeddedExtrasTitlesOverFileNames": "对额外内容优先使用内置的标题而不是文件名", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "额外内容通常与父项有相同的内置标题,勾选此项来对它们使用内置标题。", + "SaveRecordingNFO": "在 NFO 中保存录制的 EPG 元数据", + "SaveRecordingNFOHelp": "将 EPG 列表提供者提供的元数据与媒体一起保存。", + "ResolutionMatchSource": "匹配来源", + "SaveRecordingImagesHelp": "将 EPG 列表提供者提供的图像与媒体一起保存。", + "SaveRecordingImages": "保存录制的 EPG 图像", + "HeaderDummyChapter": "章节图片", + "LabelDummyChapterCount": "限制:", + "LabelDummyChapterCountHelp": "每个媒体文件的最大章节图像提取数。", + "LabelChapterImageResolution": "分辨率:", + "LabelChapterImageResolutionHelp": "提取的章节图像的分辨率。" } From a889769e0dc62cec0c4750344faa2dfd56af8357 Mon Sep 17 00:00:00 2001 From: Spon4ik Date: Tue, 14 Feb 2023 13:51:46 +0000 Subject: [PATCH 016/156] Translated using Weblate (Hebrew) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/ --- src/strings/he.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/strings/he.json b/src/strings/he.json index 0dc93afe57..73611089f8 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -773,7 +773,7 @@ "EnableDecodingColorDepth10Hevc": "אפשר פענוח חומרה של 10 סיביות עבור HEVC", "EnableBackdropsHelp": "הצג את התפאורות ברקע של כמה דפים בעת גלישה בספרייה.", "DisplayMissingEpisodesWithinSeasonsHelp": "יש להפעיל זאת גם עבור ספריות טלוויזיה בתצורת השרת.", - "DisplayInOtherHomeScreenSections": "הצג בקטעי מסך הבית כגון המדיה העדכנית והמשיך בצפייה", + "DisplayInOtherHomeScreenSections": "הצג במסך הבית מחיצות כגון \"התוכן, שנוסף לאחרונה\" ו-\"המשיך בצפייה\"", "DeinterlaceMethodHelp": "בחר בשיטת deinterlacing לשימוש בהמרת תוכנה מקושרת לתוכן. כאשר מופעלת האצת חומרה התומכת בפירוק חומרה של חומרה, ישתמש במתקן החומרה במקום בהגדרה זו.", "DefaultSubtitlesHelp": "כתוביות נטענות על סמך ברירת המחדל והדגלים המאולצים במטא הנתונים המוטמעים. העדפות שפה נחשבות כאשר קיימות אפשרויות מרובות.", "ColorTransfer": "העברת צבע", @@ -1049,5 +1049,6 @@ "DownloadAll": "הורד הכל", "Experimental": "ניסיוני", "LabelDisableCustomCss": "אפשר קוד css מותאם אישית בשביל עיצובים מהשרת", - "LabelEasyPinCode": "קוד PIN קל" + "LabelEasyPinCode": "קוד PIN קל", + "EnableCardLayout": "הצג מערך ארגז חזותי" } From b01860da84fdf32d254c21bcb3d6a01e11c3410d Mon Sep 17 00:00:00 2001 From: Daniarla Date: Tue, 14 Feb 2023 17:17:56 +0000 Subject: [PATCH 017/156] Translated using Weblate (Spanish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/ --- src/strings/es.json | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/strings/es.json b/src/strings/es.json index 20f07190e3..035e371c93 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -248,11 +248,11 @@ "HeaderKeepRecording": "Mantener grabación", "HeaderKeepSeries": "Mantener series", "HeaderKodiMetadataHelp": "Para habilitar o deshabilitar los metadatos NFO, edite una biblioteca y busque la sección 'Guardadores de metadatos'.", - "HeaderLatestEpisodes": "Últimos episodios", - "HeaderLatestMedia": "Últimos", - "HeaderLatestMovies": "Últimas películas", - "HeaderLatestMusic": "Última música", - "HeaderLatestRecordings": "Últimas grabaciones", + "HeaderLatestEpisodes": "Últimos episodios añadidos", + "HeaderLatestMedia": "Últimos elementos añadidos", + "HeaderLatestMovies": "Últimas películas añadidas", + "HeaderLatestMusic": "Última música añadida", + "HeaderLatestRecordings": "Últimas grabaciones añadidas", "HeaderLibraries": "Bibliotecas", "HeaderLibraryAccess": "Acceso a la biblioteca", "HeaderLibraryFolders": "Carpetas de la biblioteca", @@ -344,7 +344,7 @@ "HeaderYears": "Años", "Help": "Ayuda", "Hide": "Ocultar", - "HideWatchedContentFromLatestMedia": "Esconder contenido visto de \"Últimos\"", + "HideWatchedContentFromLatestMedia": "Esconder contenido visto de \"Últimos elementos\"", "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", @@ -1078,7 +1078,7 @@ "Directors": "Directores", "Display": "Visualización", "DisplayInMyMedia": "Mostrar en la pantalla de inicio", - "DisplayInOtherHomeScreenSections": "Mostrar en las secciones de la pantalla de inicio como \"Últimos\" y \"Continuar viendo\"", + "DisplayInOtherHomeScreenSections": "Mostrar en la pantalla de inicio secciones como \"Últimos elementos añadidos\" 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": "Eliminar sombra", @@ -1693,5 +1693,9 @@ "SaveRecordingNFO": "Guardar grabación de metadatos EPG en NFO", "SaveRecordingNFOHelp": "Guardar metadatos del proveedor de listados EPG junto con los archivos multimedia.", "SaveRecordingImages": "Guardar grabación de imágenes EPG", - "SaveRecordingImagesHelp": "Guardar imágenes del proveedor de listados EPG junto con los archivos multimedia." + "SaveRecordingImagesHelp": "Guardar imágenes del proveedor de listados EPG junto con los archivos multimedia.", + "LabelDummyChapterDuration": "Intervalo:", + "LabelDummyChapterDurationHelp": "Intervalo de extracción de imágenes de los capítulos", + "HeaderDummyChapter": "Imágenes de capítulos", + "LabelDummyChapterCount": "Límite:" } From 7f7430e02393433f83b88439c4970db736e7455f Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Tue, 14 Feb 2023 23:01:00 +0300 Subject: [PATCH 018/156] Simplify adding modules to babel-loader --- webpack.common.js | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/webpack.common.js b/webpack.common.js index 14826c9f0b..f18711b999 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -146,7 +146,25 @@ const config = { }, { test: /\.(js|jsx)$/, - exclude: /node_modules[\\/](?!@uupaa[\\/]dynamic-import-polyfill|@jellyfin[\\/]sdk|@remix-run[\\/]router|axios|blurhash|compare-versions|date-fns|dom7|epubjs|flv.js|libarchive.js|marked|react-router|screenfull|ssr-window|swiper)/, + include: [ + path.resolve(__dirname, 'node_modules/@jellyfin/sdk'), + path.resolve(__dirname, 'node_modules/@remix-run/router'), + path.resolve(__dirname, 'node_modules/@uupaa/dynamic-import-polyfill'), + path.resolve(__dirname, 'node_modules/axios'), + path.resolve(__dirname, 'node_modules/blurhash'), + path.resolve(__dirname, 'node_modules/compare-versions'), + path.resolve(__dirname, 'node_modules/date-fns'), + path.resolve(__dirname, 'node_modules/dom7'), + path.resolve(__dirname, 'node_modules/epubjs'), + path.resolve(__dirname, 'node_modules/flv.js'), + path.resolve(__dirname, 'node_modules/libarchive.js'), + path.resolve(__dirname, 'node_modules/marked'), + path.resolve(__dirname, 'node_modules/react-router'), + path.resolve(__dirname, 'node_modules/screenfull'), + path.resolve(__dirname, 'node_modules/ssr-window'), + path.resolve(__dirname, 'node_modules/swiper'), + path.resolve(__dirname, 'src') + ], use: [{ loader: 'babel-loader', options: { @@ -172,7 +190,11 @@ const config = { }, /* modules that Babel breaks when transforming to ESM */ { - test: /node_modules[\\/](pdfjs-dist|xmldom)[\\/].*\.js$/, + test: /\.js$/, + include: [ + path.resolve(__dirname, 'node_modules/pdfjs-dist'), + path.resolve(__dirname, 'node_modules/xmldom') + ], use: [{ loader: 'babel-loader', options: { From d436fae6dad2d2b5a0cf66225889dca0b8661cc3 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Tue, 14 Feb 2023 23:01:30 +0300 Subject: [PATCH 019/156] Babelify @jellyfin/libass-wasm --- webpack.common.js | 1 + 1 file changed, 1 insertion(+) diff --git a/webpack.common.js b/webpack.common.js index f18711b999..eebd423d98 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -147,6 +147,7 @@ const config = { { test: /\.(js|jsx)$/, include: [ + path.resolve(__dirname, 'node_modules/@jellyfin/libass-wasm'), path.resolve(__dirname, 'node_modules/@jellyfin/sdk'), path.resolve(__dirname, 'node_modules/@remix-run/router'), path.resolve(__dirname, 'node_modules/@uupaa/dynamic-import-polyfill'), From c65f8467bd025159e4e1126984f3036b8af76672 Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Tue, 14 Feb 2023 22:36:13 +0000 Subject: [PATCH 020/156] 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 64f4d939fd..229cd46806 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -1687,5 +1687,12 @@ "DownloadAll": "Descargar todo", "Experimental": "Experimental", "LabelStereoDownmixAlgorithm": "Algoritmo de mezcla estéreo", - "StereoDownmixAlgorithmHelp": "Algoritmo utilizado para mezclar audio multicanal a estéreo." + "StereoDownmixAlgorithmHelp": "Algoritmo utilizado para mezclar audio multicanal a estéreo.", + "LabelDummyChapterDurationHelp": "El intervalo de extracción de la imagen del capítulo en segundos.", + "HeaderRecordingMetadataSaving": "Grabando metadatos", + "HeaderDummyChapter": "Imágenes del capítulo", + "LabelDummyChapterDuration": "Intervalo:", + "LabelDummyChapterCount": "Límite:", + "LabelDummyChapterCountHelp": "El número máximo de imágenes de capítulos que se extraerán para cada archivo multimedia.", + "LabelChapterImageResolution": "Resolución:" } From 96b8d8b28e317695b8a69c27e4dd3f2128e84bb0 Mon Sep 17 00:00:00 2001 From: Bas Date: Tue, 14 Feb 2023 20:41:45 +0000 Subject: [PATCH 021/156] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 0ee3872694..46f7d49f04 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -139,7 +139,7 @@ "Disconnect": "Loskoppelen", "Display": "Weergave", "DisplayInMyMedia": "Op het startscherm weergeven", - "DisplayInOtherHomeScreenSections": "In secties van het startscherm weergeven, zoals \"Recente media\" en \"Verder kijken\"", + "DisplayInOtherHomeScreenSections": "In secties van het startscherm weergeven, zoals 'Onlangs toegevoegde media' en 'Verderkijken'", "DisplayMissingEpisodesWithinSeasons": "Toon ontbrekende afleveringen binnen een seizoen", "DisplayMissingEpisodesWithinSeasonsHelp": "Dit moet ook worden ingeschakeld voor tv-bibliotheken in de serverconfiguratie.", "DisplayModeHelp": "Selecteer het schermtype waar Jellyfin op draait.", @@ -284,11 +284,11 @@ "HeaderKeepRecording": "Bewaar opname", "HeaderKeepSeries": "Series behouden", "HeaderKodiMetadataHelp": "Om NFO-metadata in of uit te schakelen, bewerk een bibliotheek en zoek in de metadata-downloaders sectie.", - "HeaderLatestEpisodes": "Nieuwste afleveringen", - "HeaderLatestMedia": "Nieuwste media", - "HeaderLatestMovies": "Nieuwste films", - "HeaderLatestMusic": "Nieuwste muziek", - "HeaderLatestRecordings": "Nieuwste opnames", + "HeaderLatestEpisodes": "Onlangs toegevoegde afleveringen", + "HeaderLatestMedia": "Onlangs toegevoegde media", + "HeaderLatestMovies": "Onlangs toegevoegde films", + "HeaderLatestMusic": "Onlangs toegevoegde muziek", + "HeaderLatestRecordings": "Onlangs toegevoegde opnamen", "HeaderLibraries": "Bibliotheken", "HeaderLibraryAccess": "Bibliotheek toegang", "HeaderLibraryFolders": "Bibliotheekmappen", @@ -382,7 +382,7 @@ "HeaderYears": "Jaren", "Help": "Hulp", "Hide": "Verbergen", - "HideWatchedContentFromLatestMedia": "Verberg bekeken inhoud uit 'Nieuwste media'", + "HideWatchedContentFromLatestMedia": "Bekeken inhoud verbergen uit 'Onlangs toegevoegde media'", "Home": "Start", "Horizontal": "Horizontaal", "HttpsRequiresCert": "Om beveiligde verbindingen in te schakelen, is een vertrouwd SSL-certificaat vereist (zoals Let's Encrypt). Geef een certificaat op of schakel beveiligde verbindingen uit.", @@ -488,7 +488,7 @@ "LabelEpisodeNumber": "Afleveringsnummer:", "LabelEvent": "Gebeurtenis:", "LabelEveryXMinutes": "Iedere:", - "LabelExtractChaptersDuringLibraryScan": "Hoofdstukafbeeldingen uitpakken tijdens het scannen van de bibliotheek", + "LabelExtractChaptersDuringLibraryScan": "Hoofdstukafbeeldingen uitpakken tijdens bibliotheekscan", "LabelExtractChaptersDuringLibraryScanHelp": "Genereer hoofdstuk afbeeldingen wanneer video's geïmporteerd worden tijdens het scannen van de bibliotheek. Zo niet, zullen deze gegenereerd worden tijdens een geplande taak, hierdoor zal reguliere bibliotheek scan sneller voltooien.", "LabelFailed": "Mislukt", "LabelFileOrUrl": "Bestand of URL:", @@ -694,7 +694,7 @@ "LabelffmpegPathHelp": "Het pad naar het FFmpeg applicatiebestand, of de folder die FFmpeg bevat.", "LanNetworksHelp": "Komma-gescheiden lijst van IP-adressen of IP/netmask adressen voor netwerken die als lokaal gezien worden wanneer bandbreedtebeperkingen van toepassing zijn. Indien ingesteld, worden alle overige IP-adressen gezien als externe adressen en zullen worden onderworpen aan de bandbreedte-instellingen voor externe adressen. Indien blanco, zal alleen het subnet van de server als lokaal netwerk gezien worden.", "Large": "Groot", - "LatestFromLibrary": "Nieuwste {0}", + "LatestFromLibrary": "Onlangs toegevoegd in {0}", "LearnHowYouCanContribute": "Lees meer over hoe u kunt bijdragen.", "LibraryAccessHelp": "Selecteer de bibliotheken om met deze gebruiker te delen. Beheerders kunnen alle mappen bewerken via de metadata-beheerder.", "List": "Lijst", @@ -1017,7 +1017,7 @@ "TabAdvanced": "Geavanceerd", "TabCatalog": "Catalogus", "TabDirectPlay": "Direct Afspelen", - "TabLatest": "Nieuwste", + "TabLatest": "Onlangs toegevoegd", "TabLogs": "Logboeken", "TabMusic": "Muziek", "TabMyPlugins": "Mijn plug-ins", @@ -1688,7 +1688,7 @@ "Experimental": "Experimenteel", "StereoDownmixAlgorithmHelp": "Algoritme dat gebruikt wordt om multikanaals geluid naar stereo te downmixen.", "LabelStereoDownmixAlgorithm": "Stereo-downmix-algoritme", - "LabelChapterImageResolutionHelp": "De resolutie van de opgehaalde hoofdstuk afbeeldingen.", + "LabelChapterImageResolutionHelp": "De resolutie van de uitgepakte hoofdstukafbeeldingen.", "LabelDummyChapterDuration": "Interval:", "LabelDummyChapterCount": "Limiet:", "LabelDummyChapterCountHelp": "Het maximum aantal hoofdstukafbeeldingen dat wordt opgehaald uit ieder mediabestand.", From 85fac85968a877679ecde866358172a824e3ab62 Mon Sep 17 00:00:00 2001 From: stegl Date: Tue, 14 Feb 2023 23:02:01 +0000 Subject: [PATCH 022/156] Translated using Weblate (Slovenian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sl/ --- src/strings/sl-si.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index fe584d7802..5bdd55a1ff 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -1687,5 +1687,17 @@ "Experimental": "Poskusno", "LabelStereoDownmixAlgorithm": "Stereo Downmix algoritem", "DownloadAll": "Prenesi vse", - "HeaderDummyChapter": "Slike poglavja" + "HeaderDummyChapter": "Slike poglavja", + "SaveRecordingNFO": "Shrani posnete EPG metapodatke v NFO", + "SaveRecordingImagesHelp": "Shrani prenešene slike v mapo datoteke.", + "PreferEmbeddedExtrasTitlesOverFileNames": "Raje uporabi vdelane naslove kot imena datotek", + "SaveRecordingNFOHelp": "Shrani metapodatke v isto mapo", + "LabelDummyChapterDuration": "interval:", + "LabelDummyChapterDurationHelp": "Interval ekstrakcije slike poglavja v sekundah.", + "LabelDummyChapterCount": "Limit:", + "LabelDummyChapterCountHelp": "Največje število slik poglavij, ki bodo ekstrahirane za vsako medijsko datoteko.", + "LabelChapterImageResolution": "Resolucija:", + "LabelChapterImageResolutionHelp": "Ločljivost slik poglavij.", + "ResolutionMatchSource": "ujemanje z virom", + "HeaderRecordingMetadataSaving": "Snemanje metapodatkov" } From c92bc15a43d7504e85e7ff880004add66f0962ce Mon Sep 17 00:00:00 2001 From: ikoch Date: Wed, 15 Feb 2023 12:05:56 +0000 Subject: [PATCH 023/156] Translated using Weblate (Russian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/ --- src/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ru.json b/src/strings/ru.json index 8e4ab190bd..97bc59933d 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -1060,7 +1060,7 @@ "ShowIndicatorsFor": "Показывать метки для:", "ShowTitle": "Отображать название", "ShowYear": "Отображать год", - "Shows": "Передачи", + "Shows": "Телешоу", "Shuffle": "Перемешать", "New": "Новое", "Filter": "Фильтрoвать", From f45f1ff868c49b711eb3ac9894c060ce808bbe61 Mon Sep 17 00:00:00 2001 From: Daniarla Date: Wed, 15 Feb 2023 15:22:33 +0000 Subject: [PATCH 024/156] Translated using Weblate (Spanish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/ --- src/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/es.json b/src/strings/es.json index 035e371c93..704b5761f4 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1695,7 +1695,7 @@ "SaveRecordingImages": "Guardar grabación de imágenes EPG", "SaveRecordingImagesHelp": "Guardar imágenes del proveedor de listados EPG junto con los archivos multimedia.", "LabelDummyChapterDuration": "Intervalo:", - "LabelDummyChapterDurationHelp": "Intervalo de extracción de imágenes de los capítulos", + "LabelDummyChapterDurationHelp": "Intervalo de extracción de imágenes de los capítulos en segundos", "HeaderDummyChapter": "Imágenes de capítulos", "LabelDummyChapterCount": "Límite:" } From e19dbbc93755e7262fe4d806502315bc9b881616 Mon Sep 17 00:00:00 2001 From: Ruben Kremer Date: Wed, 15 Feb 2023 21:52:02 +0000 Subject: [PATCH 025/156] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 46f7d49f04..6a9add068d 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1692,5 +1692,15 @@ "LabelDummyChapterDuration": "Interval:", "LabelDummyChapterCount": "Limiet:", "LabelDummyChapterCountHelp": "Het maximum aantal hoofdstukafbeeldingen dat wordt opgehaald uit ieder mediabestand.", - "LabelChapterImageResolution": "Resolutie:" + "LabelChapterImageResolution": "Resolutie:", + "PreferEmbeddedExtrasTitlesOverFileNames": "Voorkeur voor ingebedde titels boven bestandsnamen voor extra's", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Extra's hebben vaak dezelfde ingebedde naam als de hoofdcontent, vink dit aan om toch de ingebedde titels te gebruiken.", + "SaveRecordingImagesHelp": "Sla afbeeldingen van de EPG vermeldingen op naast de media.", + "SaveRecordingNFO": "Sla opname EPG-metadata op in de NFO", + "SaveRecordingNFOHelp": "Sla metadata uit de EPG vermelding op naast de media.", + "SaveRecordingImages": "Sla opname EPG afbeeldingen op", + "HeaderDummyChapter": "Hoofdstukafbeeldingen", + "LabelDummyChapterDurationHelp": "De hoofdstukafbeelding extractie interval in seconden.", + "ResolutionMatchSource": "Bron matchen", + "HeaderRecordingMetadataSaving": "Opname metadata" } From bf5521f7a2424feb4c3b1afd10c3b8c3df4dc223 Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Thu, 16 Feb 2023 18:24:02 +0000 Subject: [PATCH 026/156] 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 229cd46806..ab8ae2a636 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -1694,5 +1694,6 @@ "LabelDummyChapterDuration": "Intervalo:", "LabelDummyChapterCount": "Límite:", "LabelDummyChapterCountHelp": "El número máximo de imágenes de capítulos que se extraerán para cada archivo multimedia.", - "LabelChapterImageResolution": "Resolución:" + "LabelChapterImageResolution": "Resolución:", + "LabelChapterImageResolutionHelp": "La resolución de las imágenes de los capítulos extraídos." } From 19b9924279741ce555a1acb34ee965a79814fb4e Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 16 Feb 2023 18:59:05 +0000 Subject: [PATCH 027/156] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 6a9add068d..543962164b 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1693,14 +1693,14 @@ "LabelDummyChapterCount": "Limiet:", "LabelDummyChapterCountHelp": "Het maximum aantal hoofdstukafbeeldingen dat wordt opgehaald uit ieder mediabestand.", "LabelChapterImageResolution": "Resolutie:", - "PreferEmbeddedExtrasTitlesOverFileNames": "Voorkeur voor ingebedde titels boven bestandsnamen voor extra's", - "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Extra's hebben vaak dezelfde ingebedde naam als de hoofdcontent, vink dit aan om toch de ingebedde titels te gebruiken.", - "SaveRecordingImagesHelp": "Sla afbeeldingen van de EPG vermeldingen op naast de media.", - "SaveRecordingNFO": "Sla opname EPG-metadata op in de NFO", - "SaveRecordingNFOHelp": "Sla metadata uit de EPG vermelding op naast de media.", - "SaveRecordingImages": "Sla opname EPG afbeeldingen op", + "PreferEmbeddedExtrasTitlesOverFileNames": "Ingesloten titels boven bestandsnamen verkiezen voor extra's", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Extra's hebben vaak dezelfde ingesloten naam als de hoofdinhoud; vink dit aan om toch de ingesloten titels te gebruiken.", + "SaveRecordingImagesHelp": "Afbeeldingen uit EPG-vermeldingen naast media opslaan.", + "SaveRecordingNFO": "EPG-metadata in NFO opslaan", + "SaveRecordingNFOHelp": "Metadata uit de EPG-vermeldingen naast media opslaan.", + "SaveRecordingImages": "EPG-afbeeldingen opslaan", "HeaderDummyChapter": "Hoofdstukafbeeldingen", - "LabelDummyChapterDurationHelp": "De hoofdstukafbeelding extractie interval in seconden.", - "ResolutionMatchSource": "Bron matchen", - "HeaderRecordingMetadataSaving": "Opname metadata" + "LabelDummyChapterDurationHelp": "De extractieinterval voor hoofdstukafbeeldingen in seconden.", + "ResolutionMatchSource": "Gelijk aan bron", + "HeaderRecordingMetadataSaving": "Metadata opname" } From 58db679016226cc2cebe4e1b90dcbc222d40d986 Mon Sep 17 00:00:00 2001 From: adrian gustavo martinez Date: Fri, 17 Feb 2023 02:15:44 +0000 Subject: [PATCH 028/156] 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index ab8ae2a636..5d4d6f500b 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -154,7 +154,7 @@ "DateAdded": "Fecha agregada", "DatePlayed": "Fecha de reproducción", "DeathDateValue": "Muerte: {0}", - "Default": "Por Defecto", + "Default": "Predeterminado", "ErrorDefault": "Hubo un error procesando la solicitud. Por favor intentalo nuevamente mas tarde.", "DefaultMetadataLangaugeDescription": "Estos son tus predeterminados y pueden ser personalizados por librería únicamente.", "Delete": "Borrar", From e802c43fb48314582aa2193413dad0030b115bbb Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Fri, 17 Feb 2023 11:31:04 +0100 Subject: [PATCH 029/156] Respect server ordering of media sources --- src/controllers/itemDetails/index.js | 29 +--------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 28b0424153..4c2c429829 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -177,34 +177,7 @@ function renderTrackSelections(page, instance, item, forceReload) { return; } - let mediaSources = item.MediaSources; - - const resolutionNames = []; - const sourceNames = []; - mediaSources.forEach(function (v) { - (v.Name.endsWith('p') || v.Name.endsWith('i')) && !Number.isNaN(parseInt(v.Name, 10)) ? resolutionNames.push(v) : sourceNames.push(v); - }); - - resolutionNames.sort((a, b) => parseInt(b.Name, 10) - parseInt(a.Name, 10)); - sourceNames.sort((a, b) => { - const nameA = a.Name.toUpperCase(); - const nameB = b.Name.toUpperCase(); - if (nameA < nameB) { - return -1; - } else if (nameA > nameB) { - return 1; - } - return 0; - }); - - mediaSources = []; - resolutionNames.forEach(v => { - mediaSources.push(v); - }); - sourceNames.forEach(v => { - mediaSources.push(v); - }); - + const mediaSources = item.MediaSources; instance._currentPlaybackMediaSources = mediaSources; page.querySelector('.trackSelections').classList.remove('hide'); From 7d86f1a47d268d0781d17be846b67da5a95f32f1 Mon Sep 17 00:00:00 2001 From: rushmash Date: Fri, 17 Feb 2023 20:05:33 +0000 Subject: [PATCH 030/156] Translated using Weblate (Belarusian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/be/ --- src/strings/be-by.json | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/strings/be-by.json b/src/strings/be-by.json index 8253518011..266b83683b 100644 --- a/src/strings/be-by.json +++ b/src/strings/be-by.json @@ -54,7 +54,7 @@ "BehindTheScenes": "За кулісамі", "EnableEnhancedNvdecDecoderHelp": "Эксперыментальная рэалізацыя NVDEC, не ўключайце гэту опцыю, калі вы не сутыкнуліся з памылкамі дэкадавання.", "LabelYear": "Год:", - "LatestFromLibrary": "Апошнія {0}", + "LatestFromLibrary": "Нядаўна дададзеныя ў {0}", "Lyricist": "Аўтар тэкстаў", "ManageRecording": "Кіраванне запісам", "Logo": "Лагатып", @@ -612,7 +612,7 @@ "HeaderIdentificationCriteriaHelp": "Увядзіце хаця б адзін крытэрый ідэнтыфікацыі.", "HeaderIdentifyItemHelp": "Увядзіце адзін або некалькі крытэрыяў пошуку. Выдаліце крытэрыі, каб павялічыць вынікі пошуку.", "HeaderKodiMetadataHelp": "Каб уключыць або выключыць метададзеныя NFO, адрэдагуйце бібліятэку і знайдзіце раздзел «Захоўвальнікі метададзеных».", - "HeaderLatestEpisodes": "Новыя серыі", + "HeaderLatestEpisodes": "Нядаўна дададзеныя эпізоды", "HeaderLiveTvTunerSetup": "Налада ТБ-цюнэра ў прамым эфіры", "HeaderLoginFailure": "Памылка ўваходу", "HeaderMedia": "Медыя", @@ -887,7 +887,7 @@ "EnablePlugin": "Уключыць", "DisableCustomCss": "Адключыць карыстальніцкі код CSS, прадастаўлены серверам", "DisablePlugin": "Адключыць", - "DisplayInOtherHomeScreenSections": "Паказаць ў раздзелах галоўнага экрана такія секцыі як \"Апошнія медыя\" і \"Працягнуць прагляд\"", + "DisplayInOtherHomeScreenSections": "Паказаць ў раздзелах галоўнага экрана такія секцыі як \"Нядаўна дададзеныя мультымедыя\" і \"Працягнуць прагляд\"", "DisplayMissingEpisodesWithinSeasons": "Паказаць адсутныя серыі ў сезону", "DrmChannelsNotImported": "Каналы з DRM не будуць імпартаваны.", "DropShadow": "Цень", @@ -1303,7 +1303,7 @@ "ShowAdvancedSettings": "Паказаць дадатковыя налады", "Suggestions": "Прапановы", "TabDashboard": "Панэль кіравання", - "TabLatest": "Апошні", + "TabLatest": "Нядаўна дададзены", "TabLogs": "Журналы", "TabMusic": "Музыка", "TabParentalControl": "Бацькоўскі кантроль", @@ -1435,7 +1435,7 @@ "Studios": "Студыі", "Subtitle": "Падзагаловак", "SubtitleVerticalPositionHelp": "Нумар радка, дзе з'яўляецца тэкст. Дадатныя лічбы паказваюць зверху ўніз. Адмоўныя лічбы паказваюць знізу ўверх.", - "HideWatchedContentFromLatestMedia": "Схаваць прагледжанае змесціва з \"Апошніх медыя\"", + "HideWatchedContentFromLatestMedia": "Схаваць прагледжанае змесціва з \"Нядаўна дададзеных медыя\"", "MessageRenameMediaFolder": "Перайменаванне медыятэкі прывядзе да страты ўсіх метададзеных, будзьце асцярожныя.", "LabelMaxDaysForNextUpHelp": "Усталюйце максімальную колькасць дзён, на працягу якіх шоу павінна заставацца ў спісе \"Далей\", без яго прагляду.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Наступныя медыя-месцы будуць выдалены з вашай бібліятэкі:", @@ -1492,10 +1492,10 @@ "HeaderInstall": "Усталяваць", "HeaderInstantMix": "Імгненны мікс", "HeaderKeepSeries": "Захоўвацт серыял", - "HeaderLatestMedia": "Новыя медыя", - "HeaderLatestMovies": "Апошнія фільмы", - "HeaderLatestMusic": "Новая музыка", - "HeaderLatestRecordings": "Апошнія запісы", + "HeaderLatestMedia": "Нядаўна дададзеныя медыя", + "HeaderLatestMovies": "Нядаўна дададзеныя фільмы", + "HeaderLatestMusic": "Нядаўна дададзеная музыка", + "HeaderLatestRecordings": "Нядаўна дададзеныя запісы", "HeaderLibraries": "Медыятэкі", "HeaderLibraryFolders": "Папкі медыятэкі", "HeaderLibraryOrder": "Парадак медыятэк", @@ -1679,5 +1679,15 @@ "SaveRecordingNFO": "Захаваць метададзеныя запісу EPG у NFO", "SaveRecordingNFOHelp": "Захоўвайце метаданыя ад пастаўшчыка спісаў EPG разам з медыяфайламі.", "SaveRecordingImages": "Захаванне запісу EPG выяў", - "SaveRecordingImagesHelp": "Захоўвайце выявы з спісаў EPG разам з мультымедыя." + "SaveRecordingImagesHelp": "Захоўвайце выявы з спісаў EPG разам з мультымедыя.", + "PreferEmbeddedExtrasTitlesOverFileNames": "Аддавайце перавагу ўбудаваным загалоўкам, а не імёнам файлаў для extras", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Extras часта маюць такое ж убудаванае імя, што і бацькоўскі, пазначце гэта, каб у любым выпадку выкарыстоўваць для іх убудаваныя загалоўкі.", + "HeaderDummyChapter": "Выявы раздзела", + "LabelDummyChapterDuration": "Інтэрвал:", + "LabelDummyChapterDurationHelp": "Інтэрвал вымання выявы главы ў секундах.", + "LabelDummyChapterCount": "Ліміт:", + "LabelDummyChapterCountHelp": "Максімальная колькасць выяваў раздзелаў, якія будуць выняты для кожнага медыяфайла.", + "LabelChapterImageResolution": "Дазвол:", + "LabelChapterImageResolutionHelp": "Дазвол вынятых малюнкаў раздзелаў.", + "ResolutionMatchSource": "Супадзенне з крыніцай" } From 3629e071c429b637ee8bf3fb67c24069f67f7c4a Mon Sep 17 00:00:00 2001 From: Pretendexxx Date: Fri, 17 Feb 2023 20:48:09 +0000 Subject: [PATCH 031/156] Translated using Weblate (Lithuanian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/lt/ --- src/strings/lt-lt.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/lt-lt.json b/src/strings/lt-lt.json index 6ae8ade103..74dff4a2ee 100644 --- a/src/strings/lt-lt.json +++ b/src/strings/lt-lt.json @@ -115,7 +115,7 @@ "Identify": "Identifikuoti", "Images": "Atvaizdai", "InstallingPackage": "Diegiama {0} (versija {1})", - "InstantMix": "Leisti miksą", + "InstantMix": "Maišyti", "ItemCount": "{0} elementų", "Kids": "Vaikams", "Label3DFormat": "3D formatas:", @@ -809,7 +809,7 @@ "LabelProtocol": "Protokolas:", "LabelProtocolInfo": "Apie protokolą:", "HeaderCodecProfileHelp": "Kodekų profiliai nurodo įrenginio apribojimus, kai medija leidžiama su konkrečiais kodekais. Jei taikomas apribojimas, laikmena perkoduojama, net jei kodekas sukonfigūruotas tiesioginiam atkūrimui.", - "HeaderInstantMix": "auto miksavimas", + "HeaderInstantMix": "Maišyti", "HeaderLibraryAccess": "Mediatekos prieigos teisės", "HeaderLibraryOrder": "Mediatekos eiliškumas", "HeaderLibrarySettings": "Mediatekos nustatymai", From 8ee978aa700d5f199b62b4dd03e406e34453dfc7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 18 Feb 2023 02:01:34 +0000 Subject: [PATCH 032/156] Update Linters --- package-lock.json | 332 +++++++++++++++++++++++----------------------- package.json | 10 +- 2 files changed, 171 insertions(+), 171 deletions(-) diff --git a/package-lock.json b/package-lock.json index c4fb4ec7ec..a06ce5f18e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,8 +68,8 @@ "@types/lodash-es": "4.17.6", "@types/react": "17.0.53", "@types/react-dom": "17.0.18", - "@typescript-eslint/eslint-plugin": "5.50.0", - "@typescript-eslint/parser": "5.50.0", + "@typescript-eslint/eslint-plugin": "5.51.0", + "@typescript-eslint/parser": "5.51.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.13", "babel-loader": "9.1.2", @@ -81,8 +81,8 @@ "css-loader": "6.7.3", "cssnano": "5.1.14", "es-check": "7.1.0", - "eslint": "8.33.0", - "eslint-plugin-compat": "4.0.2", + "eslint": "8.34.0", + "eslint-plugin-compat": "4.1.1", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.27.5", "eslint-plugin-jsx-a11y": "6.7.1", @@ -105,7 +105,7 @@ "stylelint": "14.16.1", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", - "stylelint-order": "6.0.1", + "stylelint-order": "6.0.2", "stylelint-scss": "4.3.0", "ts-loader": "9.4.2", "typescript": "4.9.5", @@ -2679,9 +2679,9 @@ } }, "node_modules/@mdn/browser-compat-data": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.1.8.tgz", - "integrity": "sha512-iY8qGU+yJvscccvWLyWPKfF9BSLmSFth5HBNjSNtIfoyUrQV3lTZml+zyKWRymMYCgvos6LiSqMj1RDEj3TehA==", + "version": "5.2.36", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.2.36.tgz", + "integrity": "sha512-cS+xbp4jq+W04pFqw5639Grzj82JevJZst4b55Mk2NGc9wY7uXD6hlM6H0hkK5mLKXXZKsT1xq79W6LsSG4crw==", "dev": true }, "node_modules/@mrmlnc/readdir-enhanced": { @@ -3175,14 +3175,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", - "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz", + "integrity": "sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/type-utils": "5.50.0", - "@typescript-eslint/utils": "5.50.0", + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/type-utils": "5.51.0", + "@typescript-eslint/utils": "5.51.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -3224,14 +3224,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", - "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.51.0.tgz", + "integrity": "sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/typescript-estree": "5.51.0", "debug": "^4.3.4" }, "engines": { @@ -3251,13 +3251,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", + "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0" + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3268,13 +3268,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz", - "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz", + "integrity": "sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.50.0", - "@typescript-eslint/utils": "5.50.0", + "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/utils": "5.51.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3295,9 +3295,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", + "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3308,13 +3308,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", - "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", + "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3379,16 +3379,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", - "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz", + "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/typescript-estree": "5.51.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -3420,12 +3420,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", + "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/types": "5.51.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4417,9 +4417,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "devOptional": true, "funding": [ { @@ -4432,10 +4432,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" @@ -4445,9 +4445,9 @@ } }, "node_modules/browserslist/node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "devOptional": true }, "node_modules/buffer-from": { @@ -4604,9 +4604,9 @@ "dev": true }, "node_modules/caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "version": "1.0.30001456", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001456.tgz", + "integrity": "sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA==", "devOptional": true, "funding": [ { @@ -6086,9 +6086,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.265", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.265.tgz", - "integrity": "sha512-38KaYBNs0oCzWCpr6j7fY/W9vF0vSp4tKFIshQTgdZMhUpkxgotkQgjJP6iGMdmlsgMs3i0/Hkko4UXLTrkYVQ==", + "version": "1.4.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.302.tgz", + "integrity": "sha512-Uk7C+7aPBryUR1Fwvk9VmipBcN9fVsqBO57jV2ZjTm+IZ6BMNqu7EDVEg2HxCNufk6QcWlFsBkhQyQroB2VWKw==", "devOptional": true }, "node_modules/emoji-regex": { @@ -6385,9 +6385,9 @@ } }, "node_modules/eslint": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", - "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.4.1", @@ -6504,19 +6504,19 @@ } }, "node_modules/eslint-plugin-compat": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.0.2.tgz", - "integrity": "sha512-xqvoO54CLTVaEYGMzhu35Wzwk/As7rCvz/2dqwnFiWi0OJccEtGIn+5qq3zqIu9nboXlpdBN579fZcItC73Ycg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.1.1.tgz", + "integrity": "sha512-vUAaqKcDwXpVASyCAfKzkfaw3NxZ6FqeCNSGp7yqHpUMzkAiWRO0B6pR5zqh8RUhvybwXhPXvwVKDLr9GqGFUQ==", "dev": true, "dependencies": { - "@mdn/browser-compat-data": "^4.1.5", + "@mdn/browser-compat-data": "^5.2.34", "ast-metadata-inferer": "^0.7.0", - "browserslist": "^4.16.8", - "caniuse-lite": "^1.0.30001304", - "core-js": "^3.16.2", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001450", + "core-js": "^3.27.2", "find-up": "^5.0.0", "lodash.memoize": "4.1.2", - "semver": "7.3.5" + "semver": "7.3.8" }, "engines": { "node": ">=9.x" @@ -6587,9 +6587,9 @@ } }, "node_modules/eslint-plugin-compat/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -17037,16 +17037,16 @@ } }, "node_modules/stylelint-order": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.1.tgz", - "integrity": "sha512-C9gJDZArRBZvn+4MPgggwYTp7dK49WPnYa5+6tBEkZnW/YWj4xBVNJdQjIik14w5orlF9RqFpYDHN0FPWIFOSQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.2.tgz", + "integrity": "sha512-yuac0BE6toHd27wUPvYVVQicAJthKFIv1HPQFH3Q0dExiO3Z6Uam7geoO0tUd5Z9ddsATYK++1qWNDX4RxMH5Q==", "dev": true, "dependencies": { - "postcss": "^8.4.20", + "postcss": "^8.4.21", "postcss-sorting": "^8.0.1" }, "peerDependencies": { - "stylelint": "^14.0.0" + "stylelint": "^14.0.0 || ^15.0.0" } }, "node_modules/stylelint-order/node_modules/postcss-sorting": { @@ -18120,9 +18120,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "devOptional": true, "funding": [ { @@ -20905,9 +20905,9 @@ } }, "@mdn/browser-compat-data": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.1.8.tgz", - "integrity": "sha512-iY8qGU+yJvscccvWLyWPKfF9BSLmSFth5HBNjSNtIfoyUrQV3lTZml+zyKWRymMYCgvos6LiSqMj1RDEj3TehA==", + "version": "5.2.36", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.2.36.tgz", + "integrity": "sha512-cS+xbp4jq+W04pFqw5639Grzj82JevJZst4b55Mk2NGc9wY7uXD6hlM6H0hkK5mLKXXZKsT1xq79W6LsSG4crw==", "dev": true }, "@mrmlnc/readdir-enhanced": { @@ -21356,14 +21356,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", - "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz", + "integrity": "sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/type-utils": "5.50.0", - "@typescript-eslint/utils": "5.50.0", + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/type-utils": "5.51.0", + "@typescript-eslint/utils": "5.51.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -21385,53 +21385,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", - "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.51.0.tgz", + "integrity": "sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/typescript-estree": "5.51.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", + "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0" + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0" } }, "@typescript-eslint/type-utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz", - "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz", + "integrity": "sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.50.0", - "@typescript-eslint/utils": "5.50.0", + "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/utils": "5.51.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", + "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", - "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", + "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -21471,16 +21471,16 @@ } }, "@typescript-eslint/utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", - "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz", + "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/typescript-estree": "5.51.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -21498,12 +21498,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", + "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/types": "5.51.0", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { @@ -22281,21 +22281,21 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "devOptional": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" }, "dependencies": { "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "devOptional": true } } @@ -22421,9 +22421,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "version": "1.0.30001456", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001456.tgz", + "integrity": "sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA==", "devOptional": true }, "ccount": { @@ -23511,9 +23511,9 @@ } }, "electron-to-chromium": { - "version": "1.4.265", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.265.tgz", - "integrity": "sha512-38KaYBNs0oCzWCpr6j7fY/W9vF0vSp4tKFIshQTgdZMhUpkxgotkQgjJP6iGMdmlsgMs3i0/Hkko4UXLTrkYVQ==", + "version": "1.4.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.302.tgz", + "integrity": "sha512-Uk7C+7aPBryUR1Fwvk9VmipBcN9fVsqBO57jV2ZjTm+IZ6BMNqu7EDVEg2HxCNufk6QcWlFsBkhQyQroB2VWKw==", "devOptional": true }, "emoji-regex": { @@ -23757,9 +23757,9 @@ "dev": true }, "eslint": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", - "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", "dev": true, "requires": { "@eslint/eslintrc": "^1.4.1", @@ -24046,19 +24046,19 @@ } }, "eslint-plugin-compat": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.0.2.tgz", - "integrity": "sha512-xqvoO54CLTVaEYGMzhu35Wzwk/As7rCvz/2dqwnFiWi0OJccEtGIn+5qq3zqIu9nboXlpdBN579fZcItC73Ycg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.1.1.tgz", + "integrity": "sha512-vUAaqKcDwXpVASyCAfKzkfaw3NxZ6FqeCNSGp7yqHpUMzkAiWRO0B6pR5zqh8RUhvybwXhPXvwVKDLr9GqGFUQ==", "dev": true, "requires": { - "@mdn/browser-compat-data": "^4.1.5", + "@mdn/browser-compat-data": "^5.2.34", "ast-metadata-inferer": "^0.7.0", - "browserslist": "^4.16.8", - "caniuse-lite": "^1.0.30001304", - "core-js": "^3.16.2", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001450", + "core-js": "^3.27.2", "find-up": "^5.0.0", "lodash.memoize": "4.1.2", - "semver": "7.3.5" + "semver": "7.3.8" }, "dependencies": { "find-up": { @@ -24099,9 +24099,9 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -31839,12 +31839,12 @@ } }, "stylelint-order": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.1.tgz", - "integrity": "sha512-C9gJDZArRBZvn+4MPgggwYTp7dK49WPnYa5+6tBEkZnW/YWj4xBVNJdQjIik14w5orlF9RqFpYDHN0FPWIFOSQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.2.tgz", + "integrity": "sha512-yuac0BE6toHd27wUPvYVVQicAJthKFIv1HPQFH3Q0dExiO3Z6Uam7geoO0tUd5Z9ddsATYK++1qWNDX4RxMH5Q==", "dev": true, "requires": { - "postcss": "^8.4.20", + "postcss": "^8.4.21", "postcss-sorting": "^8.0.1" }, "dependencies": { @@ -32551,9 +32551,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "devOptional": true, "requires": { "escalade": "^3.1.1", diff --git a/package.json b/package.json index bafc4ff4bc..f664622998 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "@types/lodash-es": "4.17.6", "@types/react": "17.0.53", "@types/react-dom": "17.0.18", - "@typescript-eslint/eslint-plugin": "5.50.0", - "@typescript-eslint/parser": "5.50.0", + "@typescript-eslint/eslint-plugin": "5.51.0", + "@typescript-eslint/parser": "5.51.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.13", "babel-loader": "9.1.2", @@ -32,8 +32,8 @@ "css-loader": "6.7.3", "cssnano": "5.1.14", "es-check": "7.1.0", - "eslint": "8.33.0", - "eslint-plugin-compat": "4.0.2", + "eslint": "8.34.0", + "eslint-plugin-compat": "4.1.1", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.27.5", "eslint-plugin-jsx-a11y": "6.7.1", @@ -56,7 +56,7 @@ "stylelint": "14.16.1", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", - "stylelint-order": "6.0.1", + "stylelint-order": "6.0.2", "stylelint-scss": "4.3.0", "ts-loader": "9.4.2", "typescript": "4.9.5", From a859bfe1417c0c27cfd162fceb43605736cbd7e1 Mon Sep 17 00:00:00 2001 From: rushmash Date: Sun, 19 Feb 2023 13:12:06 +0000 Subject: [PATCH 033/156] Translated using Weblate (Russian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/ --- src/strings/ru.json | 60 ++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/strings/ru.json b/src/strings/ru.json index 97bc59933d..a53e391db2 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -30,7 +30,7 @@ "AlwaysPlaySubtitlesHelp": "Субтитры, соответствующие настройке языка, будут загружаться независимо от языка аудио.", "AnyLanguage": "Любой язык", "Anytime": "В любое время", - "AroundTime": "Около", + "AroundTime": "Около {0}", "Art": "Вырезка", "Artists": "Исполнители", "AsManyAsPossible": "Как можно больше", @@ -79,20 +79,20 @@ "ButtonPreviousTrack": "Предыдущая дорожка", "ButtonQuickStartGuide": "Руководство по запуску", "ButtonRefreshGuideData": "Обновить данные телегида", - "ButtonRemove": "Изъять", + "ButtonRemove": "Удалить", "ButtonRename": "Переименовать", "ButtonResetEasyPassword": "Сбросить простой PIN-код", - "ButtonResume": "Возобновление", + "ButtonResume": "Возобновить", "ButtonRevoke": "Отозвать", "ButtonScanAllLibraries": "Сканировать все медиатеки", "ButtonSelectDirectory": "Выбрать каталог", "ButtonSelectView": "Выбрать представление", "ButtonSend": "Отправить", "ButtonShutdown": "Завершить работу", - "ButtonSignIn": "Вход", + "ButtonSignIn": "Войти", "ButtonSignOut": "Выйти", "ButtonStart": "Запустить", - "ButtonStop": "Стоп", + "ButtonStop": "Остановить", "ButtonSubmit": "Подтвердить", "ButtonTogglePlaylist": "Плей-лист", "ButtonTrailer": "Трейлер", @@ -116,10 +116,10 @@ "ConfirmDeleteImage": "Удалить изображение?", "ConfirmDeleteItem": "При удалении данного элемента, он удалится и из файловой системы, и из медиатеки. Вы действительно хотите продолжить?", "ConfirmDeleteItems": "При удалении данных элементов, он удалится и из файловой системы, и из медиатеки. Вы действительно хотите продолжить?", - "ConfirmDeletion": "Подтверждение удаления", + "ConfirmDeletion": "Подтверить удаление", "ConfirmEndPlayerSession": "Вы хотите завершить работу Jellyfin на {0}?", "Connect": "Соединиться", - "ContinueWatching": "Продолжение просмотра", + "ContinueWatching": "Продолжить просмотр", "Continuing": "Продолжаемое", "Copied": "Скопировано", "Copy": "Копировать", @@ -155,7 +155,7 @@ "Disconnect": "Разъединиться", "Display": "Отображение", "DisplayInMyMedia": "Показывать на главном экране", - "DisplayInOtherHomeScreenSections": "Показывать в разделах главного экрана как \"Новые медиаданные\", \"Продолжение просмотра\"", + "DisplayInOtherHomeScreenSections": "Показывать в разделах главного экрана как \"Новые медиаданные\", \"Продолжить просмотр\"", "DisplayMissingEpisodesWithinSeasons": "Отображать отсутствующие эпизоды в пределах сезонов", "DisplayMissingEpisodesWithinSeasonsHelp": "Это также должно быть включено для ТВ-медиатек в конфигурации сервера.", "DisplayModeHelp": "Выберите желательный стиль разметки для интерфейса.", @@ -204,7 +204,7 @@ "Extras": "Допматериалы", "FFmpegSavePathNotFound": "Мы не смогли найти FFmpeg по введённому вами пути. FFprobe также необходим и должен быть в той же самой папке. Эти компоненты обычно поставляются вместе в одном загрузочном пакете. Проверьте путь и повторите попытку.", "FastForward": "Быстро вперёд", - "Favorite": "Избранное", + "Favorite": "Избранный", "Favorites": "Избранное", "Features": "Средства", "File": "Файл", @@ -214,12 +214,12 @@ "Filters": "Фильтры", "Folders": "Папки", "FormatValue": "Формат: {0}", - "Friday": "пятница", + "Friday": "Пятница", "Fullscreen": "Полный экран", "General": "Общие", "Genre": "Жанр", "Genres": "Жанры", - "GroupBySeries": "Группирование по сериалам", + "GroupBySeries": "Сгруппировать по сериалам", "GroupVersions": "Сгруппировать версии", "GuestStar": "Приглашенный актёр", "Guide": "Телегид", @@ -267,7 +267,7 @@ "HeaderContainerProfile": "Профиль контейнера", "HeaderContainerProfileHelp": "Профили контейнеров обозначают ограничения устройства при воспроизведении определённых форматов. Если применяется ограничение, то медиаданные перекодируются, даже если формат настроен для прямого воспроизведения.", "HeaderContinueListening": "Продолжение прослушивания", - "HeaderContinueWatching": "Продолжение просмотра", + "HeaderContinueWatching": "Продолжить просмотр", "HeaderCustomDlnaProfiles": "Настраиваемые профили", "HeaderDateIssued": "Дата выдачи", "HeaderDefaultRecordingSettings": "Стандартные параметры записи", @@ -307,11 +307,11 @@ "HeaderKeepRecording": "Продолжать запись", "HeaderKeepSeries": "Хранение сериала", "HeaderKodiMetadataHelp": "Для включения или отключения NFO-метаданных, правьте медиатеку и найдите раздел \"Хранители метаданных\".", - "HeaderLatestEpisodes": "Новые эпизоды", - "HeaderLatestMedia": "Новые медиаданные", - "HeaderLatestMovies": "Новые фильмы", - "HeaderLatestMusic": "Новая музыка", - "HeaderLatestRecordings": "Новые записи", + "HeaderLatestEpisodes": "Недавно добавленные эпизоды", + "HeaderLatestMedia": "Недавно добавленные медиаданные", + "HeaderLatestMovies": "Недавно добавленные фильмы", + "HeaderLatestMusic": "Недавно добавленная музыка", + "HeaderLatestRecordings": "Недавно добавленные записи", "HeaderLibraries": "Медиатеки", "HeaderLibraryAccess": "Доступ к медиатеке", "HeaderLibraryFolders": "Медиатечные папки", @@ -409,7 +409,7 @@ "HeaderYears": "Годы", "Help": "Справка", "Hide": "Скрыть", - "HideWatchedContentFromLatestMedia": "Скрыть просмотренное содержание в разделе «Новые медиаданные»", + "HideWatchedContentFromLatestMedia": "Скрыть просмотренное содержание в разделе «Недавно добавленные медиаданные»", "Home": "Главное", "Horizontal": "Горизонтально", "HttpsRequiresCert": "Чтобы включить HTTPS для внешних подключений, вам нужно будет предоставить доверенный SSL-cертификат, например, Let's Encrypt. Предоставьте сертификат или отключите защищенные соединения.", @@ -743,7 +743,7 @@ "LabelffmpegPathHelp": "Путь к файлу приложения FFmpeg или к папке содержащей FFmpeg.", "LanNetworksHelp": "Список разделённых запятыми IP-адресов или записей IP/netmask для сетей, которые будут считаться находящимися в локальной сети, когда принудительно ограничивается пропускная способность. Если так установлено, то все остальные IP-адреса будут считаться находящимися во внешней сети и будут подлежать ограничениям внешней полосы пропускания. Если не заполнять, то считается, что только подсеть сервера находится в локальной сети.", "Large": "Крупный", - "LatestFromLibrary": "Новые: {0}", + "LatestFromLibrary": "Недавно добавленные в: {0}", "LearnHowYouCanContribute": "Изучите, как вы можете внести свой вклад.", "LibraryAccessHelp": "Выделите медиатеки, чтобы дать доступ этому пользователю. Администраторы могут изменять все папки с помощью «Диспетчера метаданных».", "List": "Список", @@ -1096,7 +1096,7 @@ "TabContainers": "Контейнеры", "TabDashboard": "Панель", "TabDirectPlay": "Прямое воспроизведение", - "TabLatest": "Последние", + "TabLatest": "Недавно добавленные", "TabLogs": "Журналы", "TabMusic": "Музыка", "TabMyPlugins": "Мои плагины", @@ -1247,7 +1247,7 @@ "OptionForceRemoteSourceTranscoding": "Перекодировать принудительно удалённые источники медиаданных (нпр., эфирное ТВ)", "NoCreatedLibraries": "Похоже, вы еще не создали ни одной медиатеки. {0}Желаете создать её сейчас?{1}", "AskAdminToCreateLibrary": "Попросите администратора создать медиатеку.", - "AllowFfmpegThrottling": "Дросселировать перекодировки", + "AllowFfmpegThrottling": "Ограничить перекодировки", "PlaybackErrorNoCompatibleStream": "Этот клиент несовместим с медиаданными, а сервер не отправляет медиаданные в совместимом формате.", "AllowFfmpegThrottlingHelp": "Когда перекодировка или ремуксинг заметно опережают текущую позицию воспроизведения, процесс приостанавливается, чтобы потреблять меньше ресурсов. Это очень полезно, когда вы редко перематываете видео при просмотре. Выключите это, если возникают проблемы с воспроизведением.", "OnWakeFromSleep": "При пробуждении ото сна", @@ -1281,7 +1281,7 @@ "UnsupportedPlayback": "Jellyfin не может расшифровать содержимое, защищенное DRM, но в любом случае будет предпринята попытка расшифровки всего содержимого, включая защищенные заголовки. Некоторые файлы могут выглядеть полностью черными из-за шифрования или других неподдерживаемых средств, таких как интерактивные заголовки.", "LabelRequireHttpsHelp": "Если этот флажок установлен, сервер будет автоматически перенаправлять все запросы через HTTP на HTTPS. Это не имеет никакого эффекта, если сервер не слушает HTTPS.", "LabelEnableHttpsHelp": "Прослушивается указанный HTTPS-порт. Чтобы это вступило в силу, также необходимо предоставить действительный сертификат.", - "ApiKeysCaption": "Список действующих текущих API-ключей", + "ApiKeysCaption": "Список действующих API-ключей", "SaveChanges": "Изменить", "LabelRequireHttps": "Требуется HTTPS", "LabelStable": "Стабильная", @@ -1328,7 +1328,7 @@ "EnableBlurHashHelp": "Рисунки, которые всё ещё загружаются, будут отображаться с уникальным заполнением.", "EnableBlurHash": "Включить размытые заполнители для изображений", "ButtonSyncPlay": "Совместный просмотр", - "ButtonCast": "Трансляция на устройство", + "ButtonCast": "Транслировать на устройство", "TabRepositories": "Репозитории", "MessageNoGenresAvailable": "Включаются какие-либо поставщики метаданных для получения жанров из интернета.", "MessageAddRepository": "Если вы хотите добавить репозиторий, нажмите кнопку рядом с заголовком и заполните необходимую информацию.", @@ -1412,7 +1412,7 @@ "EnableQuickConnect": "Разрешить быстрое подключение", "EnableAutoCast": "Задать по умолчанию", "ButtonUseQuickConnect": "Использовать быстрое подключение", - "ButtonActivate": "Активация", + "ButtonActivate": "Активировать", "Authorize": "Авторизовать", "LabelUserMaxActiveSessions": "Максимальное количество одновременных пользовательских сессий:", "OptionMaxActiveSessionsHelp": "Значение 0 отключит эту функцию.", @@ -1510,7 +1510,7 @@ "EnableEnhancedNvdecDecoder": "Включить улучшенный декодер NVDEC", "DisablePlugin": "Отключить", "EnablePlugin": "Включить", - "Framerate": "Ч-та кадров", + "Framerate": "Частота кадров", "DirectPlayHelp": "Исходный файл полностью совместим с этим клиентом, а сеанс получает файл без изменений.", "HeaderContinueReading": "Продолжение чтения", "EnableGamepadHelp": "Слушать ввод от любых подключенных контроллеров. (Необходим режим отображения \"TV\")", @@ -1520,8 +1520,8 @@ "MessageSent": "Сообщение отправлено.", "LabelSlowResponseTime": "Время, после которого ответ считается медленным, мс:", "LabelSlowResponseEnabled": "Журналировать предупреждающее сообщение, если сервер отвечал медленно", - "UseEpisodeImagesInNextUpHelp": "В разделах \"Следующие серии\" и \"Продолжение просмотра\" будут использоваться как эскизы рисунки эпизодов вместо головного эскиза сериала.", - "UseEpisodeImagesInNextUp": "Использовать рисунки эпизодов в разделах \"Следующие серии\" и \"Продолжение просмотра\"", + "UseEpisodeImagesInNextUpHelp": "В разделах \"Следующие серии\" и \"Продолжить просмотр\" будут использоваться как эскизы рисунки эпизодов вместо головного эскиза сериала.", + "UseEpisodeImagesInNextUp": "Использовать рисунки эпизодов в разделах \"Следующие серии\" и \"Продолжить просмотр\"", "LabelLocalCustomCss": "Настраиваемый CSS-код для стилизации, применимый только к этому клиенту. Вы можете отключить настраиваемый CSS-код сервера.", "LabelDisableCustomCss": "Отключает настраиваемый CSS-код для тематирования/брендирования, предоставляемый сервером.", "DisableCustomCss": "Отключить предоставляемый сервером настраиваемый CSS-код", @@ -1588,7 +1588,7 @@ "Typewriter": "Машинописный", "Print": "Типографский", "Larger": "Очень крупный", - "Console": "Консольный", + "Console": "Консоль", "Casual": "Неформальный", "TypeOptionPluralVideo": "Видео элементы", "TypeOptionPluralSeries": "ТВ-передачи", @@ -1603,7 +1603,7 @@ "TypeOptionPluralAudio": "Аудио элементы", "LabelAutomaticallyAddToCollectionHelp": "Если хотя бы два фильма имеют одинаковое название коллекции, они будут автоматически добавлены в коллекцию.", "LabelAutomaticallyAddToCollection": "Автоматически добавлять в коллекцию", - "Cursive": "Курсивный", + "Cursive": "Курсив", "PreferSystemNativeHwDecoder": "Предпочитать из декодеров встроенный в ОС DXVA или аппаратный VA-API", "LabelHardwareEncodingOptions": "Опции аппаратного кодирования:", "IntelLowPowerEncHelp": "Энергосберегающее кодирование может оставить ненужную синхронизацию CPU-GPU. В Linux они должны быть отключены, если микропрограмма i915 HuC не настроена.", @@ -1625,7 +1625,7 @@ "BehindTheScenes": "За кадром", "Trailer": "Трейлер", "Clip": "Отрывок", - "ButtonExitApp": "Выход из приложения", + "ButtonExitApp": "Выйти из приложения", "AllowEmbeddedSubtitlesAllowTextOption": "Разрешить текст", "AllowEmbeddedSubtitlesAllowImageOption": "Разрешить рисунок", "AllowEmbeddedSubtitlesAllowNoneOption": "Ничего не разрешать", From 5844721cae59baab9c2313a40d9510878a843da6 Mon Sep 17 00:00:00 2001 From: rushmash Date: Sun, 19 Feb 2023 13:33:10 +0000 Subject: [PATCH 034/156] Translated using Weblate (Russian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/ --- src/strings/ru.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/ru.json b/src/strings/ru.json index a53e391db2..5f6dad04e0 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -1688,5 +1688,10 @@ "DownloadAll": "Скачать все", "StereoDownmixAlgorithmHelp": "Алгоритм используемый для смешивания многоканального аудио в стерео.", "LabelStereoDownmixAlgorithm": "Алгоритм смешивания стерео", - "Experimental": "Экспериментальные" + "Experimental": "Экспериментальные", + "LabelDummyChapterDuration": "Интервал:", + "LabelChapterImageResolution": "Разрешение изображения:", + "HeaderDummyChapter": "Изображения глав", + "LabelDummyChapterCount": "Лимит:", + "HeaderRecordingMetadataSaving": "Метадата записей" } From 865e9323b260547a9943ba62cac6fb0ffe51e9ae Mon Sep 17 00:00:00 2001 From: rushmash Date: Sun, 19 Feb 2023 17:10:32 +0000 Subject: [PATCH 035/156] Translated using Weblate (Russian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/ --- src/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ru.json b/src/strings/ru.json index 5f6dad04e0..90b9def5f2 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -1693,5 +1693,5 @@ "LabelChapterImageResolution": "Разрешение изображения:", "HeaderDummyChapter": "Изображения глав", "LabelDummyChapterCount": "Лимит:", - "HeaderRecordingMetadataSaving": "Метадата записей" + "HeaderRecordingMetadataSaving": "Метаданные записей" } From 89b82e6d5214d37d94deed23dbf2acc7c7f838fc Mon Sep 17 00:00:00 2001 From: Cyteon Date: Mon, 20 Feb 2023 13:56:41 +0000 Subject: [PATCH 036/156] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)=20Translation:=20Jellyfin/Jellyfin=20Web=20Tr?= =?UTF-8?q?anslate-URL:=20https://translate.jellyfin.org/projects/jellyfin?= =?UTF-8?q?/jellyfin-web/nb=5FNO/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/strings/nb.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/strings/nb.json b/src/strings/nb.json index 27185c3720..c67c6a61d0 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -1525,7 +1525,7 @@ "VideoFramerateNotSupported": "Videoens bildefrekvens støttes ikke", "VideoBitDepthNotSupported": "Videoens bitdybde støttes ikke", "RefFramesNotSupported": "Referanse-bilder støttes ikke", - "EnableGamepadHelp": "Lytt til inndata fra tilkoblet kontroller.", + "EnableGamepadHelp": "Lytt til inndata fra tilkoblet kontroller. (Krever: \"TV\"-visningsmodus)", "LabelEnableGamepad": "Aktiver spillkontroller", "AudioBitDepthNotSupported": "Lydens bitdybde støttes ikke", "ThemeSong": "Tema-låt", @@ -1685,5 +1685,12 @@ "MessageNoItemsAvailable": "Ingen filer er tilgjengelige for øyeblikket.", "OptionDateShowAdded": "Dato serien ble lagt til", "Experimental": "Eksperimentell", - "DownloadAll": "Laste ned alt" + "DownloadAll": "Laste ned alt", + "LabelDummyChapterCountHelp": "Maksimalt antall kapittelbilder som vil bli ekstrahert for hver mediefil.", + "LabelStereoDownmixAlgorithm": "Stereo nedmiksingsalgoritme", + "HeaderDummyChapter": "Kapittel Bilder", + "LabelDummyChapterCount": "Grense:", + "LabelChapterImageResolution": "Oppløsning:", + "LabelDummyChapterDuration": "Intervall:", + "HeaderRecordingMetadataSaving": "Opptak metadata" } From 9686fb58f40554dca5d35914fe3c75405fa8ed93 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Feb 2023 17:25:36 +0000 Subject: [PATCH 037/156] Update dependency dompurify to v2.4.4 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a06ce5f18e..8e41559fff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "classnames": "2.3.2", "core-js": "3.27.2", "date-fns": "2.29.3", - "dompurify": "2.4.3", + "dompurify": "2.4.4", "epubjs": "0.4.2", "escape-html": "1.0.3", "fast-text-encoding": "1.0.6", @@ -5940,9 +5940,9 @@ "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==" }, "node_modules/dompurify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", - "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==" + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.4.tgz", + "integrity": "sha512-1e2SpqHiRx4DPvmRuXU5J0di3iQACwJM+mFGE2HAkkK7Tbnfk9WcghcAmyWc9CRrjyRRUpmuhPUH6LphQQR3EQ==" }, "node_modules/domutils": { "version": "1.7.0", @@ -23399,9 +23399,9 @@ "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==" }, "dompurify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", - "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==" + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.4.tgz", + "integrity": "sha512-1e2SpqHiRx4DPvmRuXU5J0di3iQACwJM+mFGE2HAkkK7Tbnfk9WcghcAmyWc9CRrjyRRUpmuhPUH6LphQQR3EQ==" }, "domutils": { "version": "1.7.0", diff --git a/package.json b/package.json index f664622998..c32a113e06 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "classnames": "2.3.2", "core-js": "3.27.2", "date-fns": "2.29.3", - "dompurify": "2.4.3", + "dompurify": "2.4.4", "epubjs": "0.4.2", "escape-html": "1.0.3", "fast-text-encoding": "1.0.6", From 288196827fd2c74a2c58e8757f2f15b4e9fe3a74 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Feb 2023 21:39:36 +0000 Subject: [PATCH 038/156] Update dependency core-js to v3.28.0 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a06ce5f18e..f4fe09eb6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "blurhash": "2.0.4", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.27.2", + "core-js": "3.28.0", "date-fns": "2.29.3", "dompurify": "2.4.3", "epubjs": "0.4.2", @@ -5141,9 +5141,9 @@ } }, "node_modules/core-js": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.2.tgz", - "integrity": "sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w==", + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz", + "integrity": "sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -22822,9 +22822,9 @@ } }, "core-js": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.2.tgz", - "integrity": "sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w==" + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz", + "integrity": "sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==" }, "core-js-compat": { "version": "3.25.3", diff --git a/package.json b/package.json index f664622998..fe76051456 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "blurhash": "2.0.4", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.27.2", + "core-js": "3.28.0", "date-fns": "2.29.3", "dompurify": "2.4.3", "epubjs": "0.4.2", From 2a4d34711690beb2c602d52969aa24ae059354ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20I=C3=B1aki=20Bilbao?= Date: Tue, 21 Feb 2023 03:31:34 +0000 Subject: [PATCH 039/156] 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 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 5d4d6f500b..4962e4b8e0 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -1235,7 +1235,7 @@ "TitleHostingSettings": "Configuraciones de alojamiento", "TitleHardwareAcceleration": "Aceleración por hardware", "Thursday": "Jueves", - "Thumb": "Pulgar", + "Thumb": "Miniatura", "TheseSettingsAffectSubtitlesOnThisDevice": "Esta configuración afecta los subtítulos en este dispositivo", "ThemeVideos": "Videos temáticos", "ThemeSongs": "Canciones temáticas", @@ -1353,7 +1353,7 @@ "NextTrack": "Pasar al siguiente", "LabelUnstable": "Inestable", "Video": "Video", - "ThumbCard": "Tarjeta de pulgar", + "ThumbCard": "Tarjeta de miniatura", "Subtitle": "Subtítulo", "SpecialFeatures": "Características especiales", "SelectServer": "Seleccionar servidor", @@ -1517,7 +1517,7 @@ "MessageSent": "Mensaje enviado.", "LabelSlowResponseTime": "Tiempo en ms después de lo cual una respuesta es considerada lenta:", "LabelSlowResponseEnabled": "Log de alarma si la respuesta del servidor fue lenta", - "UseEpisodeImagesInNextUpHelp": "Las secciones Siguiente y Continuar viendo utilizaran imagenes del episodio como miniaturas en lugar de miniaturas del show.", + "UseEpisodeImagesInNextUpHelp": "Las secciones 'Siguiente' y 'Continuar viendo' utilizarán imágenes del episodio como miniaturas en lugar de miniaturas del show.", "UseEpisodeImagesInNextUp": "Usar imágenes de los episodios en \"Siguiente\" y \"Continuar Viendo\"", "LabelAutomaticallyAddToCollection": "Agregar automáticamente a la colección", "HeaderSyncPlayTimeSyncSettings": "Sincronización de tiempo", From d69d4b22d9b72180fd8f27e6cbf384e2f4db032c Mon Sep 17 00:00:00 2001 From: lyaschuchenko Date: Tue, 21 Feb 2023 05:23:24 +0000 Subject: [PATCH 040/156] Translated using Weblate (Ukrainian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/ --- src/strings/uk.json | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/src/strings/uk.json b/src/strings/uk.json index a529cdbb78..07b7b3c2a0 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -8,10 +8,10 @@ "DeathDateValue": "Помер: {0}", "Favorite": "Обране", "HeaderDeleteDevice": "Видаліть пристрій", - "HeaderLatestEpisodes": "Нещодавно переглянуті епізоди", - "HeaderLatestMedia": "Нещодавно переглянуті", - "HeaderLatestMovies": "Нещодавні фільми", - "HeaderLatestMusic": "Остання музика", + "HeaderLatestEpisodes": "Нещодавно додані серії", + "HeaderLatestMedia": "Нещодавно додані медіа", + "HeaderLatestMovies": "Нещодавно додані фільми", + "HeaderLatestMusic": "Нещодавно додана музика", "HeaderSeasons": "Сезони", "HeaderTracks": "Доріжки", "HeaderUsers": "Користувачі", @@ -274,7 +274,7 @@ "DrmChannelsNotImported": "Канали з DRM не імпортуватимуться.", "DisplayModeHelp": "Виберіть бажаний стиль макету інтерфейсу.", "DisplayMissingEpisodesWithinSeasonsHelp": "Також, це має бути включено для ТВ-медіатек у конфігурації сервера.", - "DisplayInOtherHomeScreenSections": "Показувати на головному екрані такі розділи як \"Останні медіа\" і \"Продовження перегляду\"", + "DisplayInOtherHomeScreenSections": "Відображення в розділах головного екрана, таких як «Нещодавно додані медіа» та «Продовжити перегляд»", "DeleteDevicesConfirmation": "Ви впевнені, що хочете видалити всі пристрої? Усі інші сеанси будуть завершені. Пристрої знову з’являться, після того як користувач увійде в систему.", "DeleteAll": "Видалити все", "Data": "Дані", @@ -583,7 +583,7 @@ "Identify": "Ідентифікувати", "Horizontal": "Горизонтально", "Home": "Головна", - "HideWatchedContentFromLatestMedia": "Приховати переглянуте з останніх медіа", + "HideWatchedContentFromLatestMedia": "Приховати переглянутий вміст із «Нещодавно доданих медіа»", "Hide": "Приховати", "Help": "Допомога", "HeaderYears": "Роки", @@ -723,7 +723,7 @@ "HeaderLibraryAccess": "Доступ до медіатеки", "HeaderLibraryFolders": "Папки медіатеки", "HeaderLibraryOrder": "Порядок медіатек", - "HeaderLatestRecordings": "Останні записи", + "HeaderLatestRecordings": "Нещодавно додані записи", "HeaderKodiMetadataHelp": "Щоб увімкнути або вимкнути метадані NFO, відкрийте меню редагування медіатеки та знайдіть розділ \"Збереження метаданих\".", "HeaderKeepSeries": "Зберегти серіал", "HeaderKeepRecording": "Продовжуйте записувати", @@ -909,7 +909,7 @@ "LibraryAccessHelp": "Виберіть медіатеки, якими хочете поділитися з цим користувачем. Адміністратори зможуть редагувати всі папки за допомогою менеджера метаданих.", "LeaveBlankToNotSetAPassword": "Ви можете залишити це поле порожнім, щоб не встановлювати пароль.", "LearnHowYouCanContribute": "Дізнайтеся, як ви можете зробити свій внесок.", - "LatestFromLibrary": "Нове в {0}", + "LatestFromLibrary": "Нещодавно додано в {0}", "LastSeen": "Востаннє був {0}", "Larger": "Більший", "LabelZipCode": "Індекс:", @@ -1049,7 +1049,7 @@ "LabelSelectFolderGroupsHelp": "Папки, для яких не встановлено прапорець, відображатимуться самі по собі у власному поданні.", "LabelSeasonNumber": "Номер сезону:", "LabelScreensaver": "Заставка:", - "LabelScheduledTaskLastRan": "Останній раз запускалося: {0}, час виконання: {1}.", + "LabelScheduledTaskLastRan": "Останній запуск: {0}, час виконання: {1}.", "LabelSaveLocalMetadata": "Збережіть ілюстрацію в медіа-папках", "LabelRuntimeMinutes": "Час виконання:", "LabelRequireHttps": "Вимагати HTTPS", @@ -1284,7 +1284,7 @@ "PackageInstallFailed": "Помилка встановлення {0} (версія {1}).", "PackageInstallCompleted": "Установлення {0} (версія {1}) завершено.", "PackageInstallCancelled": "Установлення {0} (версія {1}) скасовано.", - "OtherArtist": "Інший художник", + "OtherArtist": "Інший виконавець", "OriginalAirDateValue": "Початкова дата ефіру: {0}", "OptionWakeFromSleep": "Пробудити", "OptionUnairedEpisode": "Невипущені епізоди", @@ -1422,7 +1422,7 @@ "TabMyPlugins": "Мої плагіни", "TabMusic": "Музика", "TabLogs": "Журнали", - "TabLatest": "Останні", + "TabLatest": "Нещодавно додані", "TabDashboard": "Панель", "TabContainers": "Контейнери", "TabCodecs": "Кодеки", @@ -1518,7 +1518,7 @@ "SubtitleCodecNotSupported": "Кодек субтитрів не підтримується", "ContainerNotSupported": "Контейнер не підтримується", "AudioCodecNotSupported": "Аудіокодек не підтримується", - "EnableGamepadHelp": "Слухайте вхід з будь-яких підключених контролерів.", + "EnableGamepadHelp": "Очікуйте вхідних даних від будь-яких підключених контролерів. (Вимагається: режим відображення «TV»)", "LabelEnableGamepad": "Увімкнути геймпад", "Controls": "Елементи керування", "AllowVppTonemappingHelp": "Повне відображення тонів на основі драйверів Intel. Наразі працює лише на певному обладнанні з відео HDR10. Це має вищий пріоритет порівняно з іншою реалізацією OpenCL.", @@ -1559,8 +1559,8 @@ "XmlTvMovieCategoriesHelp": "Програми з цими категоріями відображатимуться як фільми. Розділіть множинні символом \"|\".", "XmlTvKidsCategoriesHelp": "Програми з цими категоріями відображатимуться як програми для дітей. Розділіть множинні символом \"|\".", "XmlDocumentAttributeListHelp": "Ці атрибути застосовуються до кореневого елемента кожної відповіді XML.", - "Writers": "Письменники", - "Writer": "Письменник", + "Writers": "Сценаристи", + "Writer": "Сценарист", "WizardCompleted": "Це все, що нам зараз потрібно. Jellyfin почав збирати інформацію про вашу медіатеку. Перегляньте деякі з наших програм, а потім натисніть Готово, щоб переглянути інформаційну панель.", "Whitelist": "Білий список", "WelcomeToProject": "Ласкаво просимо до Jellyfin!", @@ -1685,5 +1685,20 @@ "MessageNoFavoritesAvailable": "Зараз немає доступних улюблених.", "Experimental": "Експериментальний", "LabelStereoDownmixAlgorithm": "Stereo Downmix алгоритм", - "StereoDownmixAlgorithmHelp": "Алгоритм мікшування багатоканального аудіо у стерео." + "StereoDownmixAlgorithmHelp": "Алгоритм мікшування багатоканального аудіо у стерео.", + "LabelChapterImageResolutionHelp": "Роздільна здатність витягнутих зображень розділу.", + "PreferEmbeddedExtrasTitlesOverFileNames": "Віддавайте перевагу вбудованим назвам, а не назвам файлів для додаткових функцій", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Додатки часто мають таке ж вбудоване ім’я, що й батьківське, позначте це, щоб усе одно використовувати для них вбудовані заголовки.", + "ResolutionMatchSource": "Джерело відповідності", + "SaveRecordingNFO": "Збережіть метадані EPG запису в NFO", + "SaveRecordingNFOHelp": "Зберігайте метадані від постачальника списків EPG разом із бічними носіями.", + "SaveRecordingImages": "Зберегти записані зображення EPG", + "SaveRecordingImagesHelp": "Зберігайте зображення з постачальника списків EPG разом із носієм.", + "HeaderDummyChapter": "Зображення розділів", + "LabelDummyChapterDuration": "Інтервал:", + "LabelDummyChapterDurationHelp": "Інтервал вилучення зображення розділу в секундах.", + "LabelDummyChapterCount": "Ліміт:", + "LabelDummyChapterCountHelp": "Максимальна кількість зображень розділів, які буде видобуто для кожного медіафайлу.", + "LabelChapterImageResolution": "Роздільна здатність:", + "HeaderRecordingMetadataSaving": "Метадані запису" } From 145aea184fb6746d551da90a88831e201330deb9 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Thu, 15 Sep 2022 14:22:41 -0400 Subject: [PATCH 041/156] feat: add native secondary subtitle support --- src/components/playback/playbackmanager.js | 67 ++++++++++++++++++++ src/controllers/playback/video/index.js | 73 +++++++++++++++++++++- src/plugins/htmlVideoPlayer/plugin.js | 71 ++++++++++++++++----- src/strings/en-us.json | 1 + 4 files changed, 192 insertions(+), 20 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 0013eb6544..48e2913188 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -876,6 +876,17 @@ class PlaybackManager { }); }; + self.hasSecondarySubtitleSupport = function (player = self._currentPlayer) { + if (!player) return false; + return Boolean(player.supports('SecondarySubtitles')); + }; + + self.secondarySubtitleTracks = function (player = self._currentPlayer) { + const streams = self.subtitleTracks(player); + // Currently, only External subtitles are supported + return streams.filter((stream) => getDeliveryMethod(stream) === 'External'); + }; + function getCurrentSubtitleStream(player) { if (!player) { throw new Error('player cannot be null'); @@ -890,6 +901,20 @@ class PlaybackManager { return getSubtitleStream(player, index); } + function getCurrentSecondarySubtitleStream(player) { + if (!player) { + throw new Error('player cannot be null'); + } + + const index = getPlayerData(player).secondarySubtitleStreamIndex; + + if (index == null || index === -1) { + return null; + } + + return getSubtitleStream(player, index); + } + function getSubtitleStream(player, index) { return self.subtitleTracks(player).filter(function (s) { return s.Type === 'Subtitle' && s.Index === index; @@ -1522,9 +1547,51 @@ class PlaybackManager { player.setSubtitleStreamIndex(selectedTrackElementIndex); + // Also disable secondary subtitles when disabling the primary subtitles + if (selectedTrackElementIndex === -1) { + self.setSecondarySubtitleStreamIndex(selectedTrackElementIndex); + } + getPlayerData(player).subtitleStreamIndex = index; }; + self.setSecondarySubtitleStreamIndex = function (index, player) { + player = player || self._currentPlayer; + if (!self.hasSecondarySubtitleSupport(player)) return; + if (player && !enableLocalPlaylistManagement(player)) { + try { + return player.setSecondarySubtitleStreamIndex(index); + } catch (e) { + console.error(`AutoSet - Failed to set secondary track: ${e}`); + } + } + + const currentStream = getCurrentSecondarySubtitleStream(player); + + const newStream = getSubtitleStream(player, index); + + if (!currentStream && !newStream) { + return; + } + + const clearingStream = currentStream && !newStream; + const changingStream = currentStream && newStream; + const addingStream = !currentStream && newStream; + // Secondary subtitles are currently only handled client side + // Changes to the server code are required before we can handle other delivery methods + if (!clearingStream && (changingStream || addingStream) && getDeliveryMethod(newStream) !== 'External') { + return; + } + + getPlayerData(player).secondarySubtitleStreamIndex = index; + + try { + player.setSecondarySubtitleStreamIndex(index); + } catch (e) { + console.error(`AutoSet - Failed to set secondary track: ${e}`); + } + }; + self.supportSubtitleOffset = function (player) { player = player || self._currentPlayer; return player && 'setSubtitleOffset' in player; diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 8fc6976598..6ca0f59b4a 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -988,9 +988,57 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components }); } + function showSecondarySubtitlesMenu(actionsheet, positionTo) { + const player = currentPlayer; + if (!playbackManager.hasSecondarySubtitleSupport(player)) return; + let currentIndex = playbackManager.getSecondarySubtitleStreamIndex(player); + const streams = playbackManager.secondarySubtitleTracks(player); + + if (currentIndex == null) { + currentIndex = -1; + } + + streams.unshift({ + Index: -1, + DisplayTitle: globalize.translate('Off') + }); + + const menuItems = streams.map(function (stream) { + const opt = { + name: stream.DisplayTitle, + id: stream.Index + }; + + if (stream.Index === currentIndex) { + opt.selected = true; + } + + return opt; + }); + + actionsheet.show({ + title: globalize.translate('SecondarySubtitles'), + items: menuItems, + positionTo + }).then(function (id) { + if (id) { + const index = parseInt(id); + if (index !== currentIndex) { + playbackManager.setSecondarySubtitleStreamIndex(index, player); + } + } + }) + .finally(() => { + resetIdle(); + }); + + setTimeout(resetIdle, 0); + } + function showSubtitleTrackSelection() { const player = currentPlayer; const streams = playbackManager.subtitleTracks(player); + const secondaryStreams = playbackManager.secondarySubtitleTracks(player); let currentIndex = playbackManager.getSubtitleStreamIndex(player); if (currentIndex == null) { @@ -1013,18 +1061,37 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components return opt; }); + + // Only show option if: player has support, has more than 1 subtitle track, has valid secondary tracks, primary subtitle is not off + if (playbackManager.hasSecondarySubtitleSupport(player) && streams.length > 1 && secondaryStreams.length > 0 && currentIndex !== -1) { + const secondarySubtitleMenuItem = { + name: globalize.translate('SecondarySubtitles'), + id: 'secondarysubtitle' + }; + menuItems.unshift(secondarySubtitleMenuItem); + } + const positionTo = this; import('../../../components/actionSheet/actionSheet').then(({default: actionsheet}) => { actionsheet.show({ title: globalize.translate('Subtitles'), items: menuItems, + resolveOnClick: true, positionTo: positionTo }).then(function (id) { - const index = parseInt(id); + if (id === 'secondarysubtitle') { + try { + showSecondarySubtitlesMenu(actionsheet, positionTo); + } catch (e) { + console.error(e); + } + } else { + const index = parseInt(id); - if (index !== currentIndex) { - playbackManager.setSubtitleStreamIndex(index, player); + if (index !== currentIndex) { + playbackManager.setSubtitleStreamIndex(index, player); + } } toggleSubtitleSync(); diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index af136e9185..2222548a7c 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -178,7 +178,6 @@ function tryRemoveElement(elem) { * @type {boolean} */ isFetching = false; - /** * @type {HTMLDivElement | null | undefined} */ @@ -207,6 +206,10 @@ function tryRemoveElement(elem) { * @type {number | undefined} */ #customTrackIndex; + /** + * @type {number | undefined} + */ + #customSecondaryTrackIndex; /** * @type {boolean | undefined} */ @@ -270,6 +273,14 @@ function tryRemoveElement(elem) { * @type {any | undefined} */ _currentPlayOptions; + /** + * @type {number} + */ + _PRIMARY_TEXT_TRACK_INDEX = 0; + /** + * @type {number} + */ + _SECONDARY_TEXT_TRACK_INDEX = 1; /** * @type {any | undefined} */ @@ -490,6 +501,10 @@ function tryRemoveElement(elem) { this.setCurrentTrackElement(index); } + setSecondarySubtitleStreamIndex(index) { + this.setCurrentTrackElement(index, this._SECONDARY_TEXT_TRACK_INDEX); + } + resetSubtitleOffset() { this.#currentTrackOffset = 0; this.#showTrackOffset = false; @@ -514,7 +529,7 @@ function tryRemoveElement(elem) { const videoElement = this.#mediaElement; if (videoElement) { return Array.from(videoElement.textTracks) - .find(function (trackElement) { + .filter(function (trackElement) { // get showing .vtt textTack return trackElement.mode === 'showing'; }); @@ -591,6 +606,10 @@ function tryRemoveElement(elem) { return this.#currentTrackOffset; } + isSecondaryTrack(textTrackIndex) { + return textTrackIndex === this._SECONDARY_TEXT_TRACK_INDEX; + } + /** * @private */ @@ -956,7 +975,9 @@ function tryRemoveElement(elem) { /** * @private */ - destroyCustomTrack(videoElement) { + destroyCustomTrack(videoElement, targetTrackIndex) { + const destroySingleTrack = typeof targetTrackIndex === 'number'; + if (this.#videoSubtitlesElem) { const subtitlesContainer = this.#videoSubtitlesElem.parentNode; if (subtitlesContainer) { @@ -969,7 +990,11 @@ function tryRemoveElement(elem) { if (videoElement) { const allTracks = videoElement.textTracks || []; // get list of tracks - for (const track of allTracks) { + for (let index = 0; index < allTracks.length; index++) { + const track = allTracks[index]; + if (destroySingleTrack && targetTrackIndex !== index) { + continue; + } if (track.label.includes('manualTrack')) { track.mode = 'disabled'; } @@ -1029,23 +1054,34 @@ function tryRemoveElement(elem) { /** * @private */ - setTrackForDisplay(videoElement, track) { + setTrackForDisplay(videoElement, track, targetTextTrackIndex = this._PRIMARY_TEXT_TRACK_INDEX) { if (!track) { - this.destroyCustomTrack(videoElement); + // Destroy all tracks by passing undefined if there is no valid primary track + this.destroyCustomTrack(videoElement, this.isSecondaryTrack(targetTextTrackIndex) ? targetTextTrackIndex : undefined); return; } + let targetTrackIndex = this.#customTrackIndex; + if (this.isSecondaryTrack(targetTextTrackIndex)) { + targetTrackIndex = this.#customSecondaryTrackIndex; + } + // skip if already playing this track - if (this.#customTrackIndex === track.Index) { + if (targetTrackIndex === track.Index) { return; } this.resetSubtitleOffset(); const item = this._currentPlayOptions.item; - this.destroyCustomTrack(videoElement); - this.#customTrackIndex = track.Index; - this.renderTracksEvents(videoElement, track, item); + this.destroyCustomTrack(videoElement, targetTextTrackIndex); + + if (this.isSecondaryTrack(targetTextTrackIndex)) { + this.#customSecondaryTrackIndex = track.Index; + } else { + this.#customTrackIndex = track.Index; + } + this.renderTracksEvents(videoElement, track, item, targetTextTrackIndex); } /** @@ -1211,7 +1247,7 @@ function tryRemoveElement(elem) { /** * @private */ - renderTracksEvents(videoElement, track, item) { + renderTracksEvents(videoElement, track, item, targetTextTrackIndex = this._PRIMARY_TEXT_TRACK_INDEX) { if (!itemHelper.isLocalItem(item) || track.IsExternal) { const format = (track.Codec || '').toLowerCase(); if (format === 'ssa' || format === 'ass') { @@ -1220,15 +1256,15 @@ function tryRemoveElement(elem) { } if (this.requiresCustomSubtitlesElement()) { - this.renderSubtitlesWithCustomElement(videoElement, track, item); + this.renderSubtitlesWithCustomElement(videoElement, track, item, targetTextTrackIndex); return; } } let trackElement = null; - if (videoElement.textTracks && videoElement.textTracks.length > 0) { - trackElement = videoElement.textTracks[0]; - + const updatingTrack = videoElement.textTracks && videoElement.textTracks.length > (this.isSecondaryTrack(targetTextTrackIndex) ? 1 : 0); + if (updatingTrack) { + trackElement = videoElement.textTracks[targetTextTrackIndex]; // This throws an error in IE, but is fine in chrome // In IE it's not necessary anyway because changing the src seems to be enough try { @@ -1313,7 +1349,7 @@ function tryRemoveElement(elem) { /** * @private */ - setCurrentTrackElement(streamIndex) { + setCurrentTrackElement(streamIndex, targetTextTrackIndex) { console.debug(`setting new text track index to: ${streamIndex}`); const mediaStreamTextTracks = getMediaStreamTextTracks(this._currentPlayOptions.mediaSource); @@ -1322,7 +1358,7 @@ function tryRemoveElement(elem) { return t.Index === streamIndex; })[0]; - this.setTrackForDisplay(this.#mediaElement, track); + this.setTrackForDisplay(this.#mediaElement, track, targetTextTrackIndex); if (enableNativeTrackSupport(this.#currentSrc, track)) { if (streamIndex !== -1) { this.setCueAppearance(); @@ -1500,6 +1536,7 @@ function tryRemoveElement(elem) { list.push('SetBrightness'); list.push('SetAspectRatio'); + list.push('SecondarySubtitles'); return list; } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 50567aadad..5ca842e8fa 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1412,6 +1412,7 @@ "SearchForSubtitles": "Search for Subtitles", "SearchResults": "Search Results", "Season": "Season", + "SecondarySubtitles": "Secondary Subtitles", "SelectAdminUsername": "Please select a username for the admin account.", "SelectServer": "Select Server", "SendMessage": "Send message", From ab993886c12021e595a9febf9f26e639fc0a60e3 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Thu, 15 Sep 2022 14:25:34 -0400 Subject: [PATCH 042/156] feat: add custom rendered secondary tracks --- src/plugins/htmlVideoPlayer/plugin.js | 111 ++++++++++++++++++------- src/plugins/htmlVideoPlayer/style.scss | 8 ++ 2 files changed, 88 insertions(+), 31 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 2222548a7c..3766624d68 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -222,10 +222,18 @@ function tryRemoveElement(elem) { * @type {HTMLElement | null | undefined} */ #videoSubtitlesElem; + /** + * @type {HTMLElement | null | undefined} + */ + #videoSecondarySubtitlesElem; /** * @type {any | null | undefined} */ #currentTrackEvents; + /** + * @type {any | null | undefined} + */ + #currentSecondaryTrackEvents; /** * @type {string[] | undefined} */ @@ -977,17 +985,30 @@ function tryRemoveElement(elem) { */ destroyCustomTrack(videoElement, targetTrackIndex) { const destroySingleTrack = typeof targetTrackIndex === 'number'; + const destroyPrimaryTrack = targetTrackIndex === this._PRIMARY_TEXT_TRACK_INDEX; + const destroySecondaryTrack = targetTrackIndex === this._SECONDARY_TEXT_TRACK_INDEX; - if (this.#videoSubtitlesElem) { - const subtitlesContainer = this.#videoSubtitlesElem.parentNode; - if (subtitlesContainer) { - tryRemoveElement(subtitlesContainer); + if (destroyPrimaryTrack) { + if (this.#videoSubtitlesElem) { + tryRemoveElement(this.#videoSubtitlesElem); + this.#videoSubtitlesElem = null; + } + } else if (destroySecondaryTrack) { + if (this.#videoSecondarySubtitlesElem) { + tryRemoveElement(this.#videoSecondarySubtitlesElem); + this.#videoSecondarySubtitlesElem = null; + } + } else { + if (this.#videoSubtitlesElem) { + const subtitlesContainer = this.#videoSubtitlesElem.parentNode; + if (subtitlesContainer) { + tryRemoveElement(subtitlesContainer); + } + this.#videoSubtitlesElem = null; + this.#videoSecondarySubtitlesElem = null; } - this.#videoSubtitlesElem = null; } - this.#currentTrackEvents = null; - if (videoElement) { const allTracks = videoElement.textTracks || []; // get list of tracks for (let index = 0; index < allTracks.length; index++) { @@ -1001,7 +1022,19 @@ function tryRemoveElement(elem) { } } - this.#customTrackIndex = -1; + if (destroyPrimaryTrack) { + this.#customTrackIndex = -1; + this.#currentTrackEvents = null; + } else if (destroySecondaryTrack) { + this.#customSecondaryTrackIndex = -1; + this.#currentSecondaryTrackEvents = null; + } else { + this.#customTrackIndex = -1; + this.#customSecondaryTrackIndex = -1; + this.#currentTrackEvents = null; + this.#currentSecondaryTrackEvents = null; + } + this.#currentClock = null; this._currentAspectRatio = null; @@ -1191,16 +1224,27 @@ function tryRemoveElement(elem) { /** * @private */ - renderSubtitlesWithCustomElement(videoElement, track, item) { + renderSubtitlesWithCustomElement(videoElement, track, item, targetTextTrackIndex) { this.fetchSubtitles(track, item).then((data) => { if (!this.#videoSubtitlesElem) { - const subtitlesContainer = document.createElement('div'); - subtitlesContainer.classList.add('videoSubtitles'); - subtitlesContainer.innerHTML = '
'; - this.#videoSubtitlesElem = subtitlesContainer.querySelector('.videoSubtitlesInner'); - this.setSubtitleAppearance(subtitlesContainer, this.#videoSubtitlesElem); - videoElement.parentNode.appendChild(subtitlesContainer); - this.#currentTrackEvents = data.TrackEvents; + if (!this.isSecondaryTrack(targetTextTrackIndex)) { + const subtitlesContainer = document.createElement('div'); + subtitlesContainer.classList.add('videoSubtitles'); + subtitlesContainer.innerHTML = '
'; + this.#videoSubtitlesElem = subtitlesContainer.querySelector('.videoSubtitlesInner'); + this.setSubtitleAppearance(subtitlesContainer, this.#videoSubtitlesElem); + videoElement.parentNode.appendChild(subtitlesContainer); + this.#currentTrackEvents = data.TrackEvents; + } + } else if (this.isSecondaryTrack(targetTextTrackIndex)) { + const subtitlesContainer = document.querySelector('.videoSubtitles'); + if (!subtitlesContainer) return; + const secondarySubtitlesElement = document.createElement('div'); + secondarySubtitlesElement.classList.add('videoSecondarySubtitlesInner'); + subtitlesContainer.prepend(secondarySubtitlesElement); + this.#videoSecondarySubtitlesElem = secondarySubtitlesElement; + this.setSubtitleAppearance(subtitlesContainer, this.#videoSecondarySubtitlesElem); + this.#currentSecondaryTrackEvents = data.TrackEvents; } }); } @@ -1324,24 +1368,29 @@ function tryRemoveElement(elem) { return; } - const trackEvents = this.#currentTrackEvents; - const subtitleTextElement = this.#videoSubtitlesElem; + const allTrackEvents = [this.#currentTrackEvents, this.#currentSecondaryTrackEvents]; + const subtitleTextElements = [this.#videoSubtitlesElem, this.#videoSecondarySubtitlesElem]; - if (trackEvents && subtitleTextElement) { - const ticks = timeMs * 10000; - let selectedTrackEvent; - for (const trackEvent of trackEvents) { - if (trackEvent.StartPositionTicks <= ticks && trackEvent.EndPositionTicks >= ticks) { - selectedTrackEvent = trackEvent; - break; + for (let i = 0; i < allTrackEvents.length; i++) { + const trackEvents = allTrackEvents[i]; + const subtitleTextElement = subtitleTextElements[i]; + + if (trackEvents && subtitleTextElement) { + const ticks = timeMs * 10000; + let selectedTrackEvent; + for (const trackEvent of trackEvents) { + if (trackEvent.StartPositionTicks <= ticks && trackEvent.EndPositionTicks >= ticks) { + selectedTrackEvent = trackEvent; + break; + } } - } - if (selectedTrackEvent && selectedTrackEvent.Text) { - subtitleTextElement.innerHTML = normalizeTrackEventText(selectedTrackEvent.Text, true); - subtitleTextElement.classList.remove('hide'); - } else { - subtitleTextElement.classList.add('hide'); + if (selectedTrackEvent && selectedTrackEvent.Text) { + subtitleTextElement.innerHTML = normalizeTrackEventText(selectedTrackEvent.Text, true); + subtitleTextElement.classList.remove('hide'); + } else { + subtitleTextElement.classList.add('hide'); + } } } } diff --git a/src/plugins/htmlVideoPlayer/style.scss b/src/plugins/htmlVideoPlayer/style.scss index 390e25a994..36f86314b4 100644 --- a/src/plugins/htmlVideoPlayer/style.scss +++ b/src/plugins/htmlVideoPlayer/style.scss @@ -74,6 +74,14 @@ video[controls]::-webkit-media-controls { display: inline-block; } +.videoSecondarySubtitlesInner { + max-width: 70%; + background-color: rgba(0, 0, 0, 0.8); + margin: auto; + display: block; + margin-bottom: 0 !important; +} + @keyframes htmlvideoplayer-zoomin { from { transform: scale3d(0.2, 0.2, 0.2); From 256084ffb8a560998daa18b0e3a1c38e4cd07b37 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Thu, 15 Sep 2022 14:29:21 -0400 Subject: [PATCH 043/156] fix: correctly apply offsets/hide existing for certain browsers --- src/plugins/htmlVideoPlayer/plugin.js | 73 +++++++++++++++++++++------ 1 file changed, 58 insertions(+), 15 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 3766624d68..5b9fb3d471 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -533,7 +533,7 @@ function tryRemoveElement(elem) { /** * @private */ - getTextTrack() { + getTextTracks() { const videoElement = this.#mediaElement; if (videoElement) { return Array.from(videoElement.textTracks) @@ -546,9 +546,6 @@ function tryRemoveElement(elem) { } } - /** - * @private - */ setSubtitleOffset(offset) { const offsetValue = parseFloat(offset); @@ -557,12 +554,13 @@ function tryRemoveElement(elem) { this.updateCurrentTrackOffset(offsetValue); this.#currentSubtitlesOctopus.timeOffset = (this._currentPlayOptions.transcodingOffsetTicks || 0) / 10000000 + offsetValue; } else { - const trackElement = this.getTextTrack(); + const trackElements = this.getTextTracks(); // if .vtt currently rendering - if (trackElement) { - this.setTextTrackSubtitleOffset(trackElement, offsetValue); - } else if (this.#currentTrackEvents) { - this.setTrackEventsSubtitleOffset(this.#currentTrackEvents, offsetValue); + if (trackElements.length > 0) { + trackElements.forEach((trackElement, index) => this.setTextTrackSubtitleOffset(trackElement, offsetValue, index)); + } else if (this.#currentTrackEvents || this.#currentSecondaryTrackEvents) { + this.#currentTrackEvents && this.setTrackEventsSubtitleOffset(this.#currentTrackEvents, offsetValue, this._PRIMARY_TEXT_TRACK_INDEX); + this.#currentSecondaryTrackEvents && this.setTrackEventsSubtitleOffset(this.#currentSecondaryTrackEvents, offsetValue, this._SECONDARY_TEXT_TRACK_INDEX); } else { console.debug('No available track, cannot apply offset: ', offsetValue); } @@ -572,10 +570,21 @@ function tryRemoveElement(elem) { /** * @private */ - updateCurrentTrackOffset(offsetValue) { + updateCurrentTrackOffset(offsetValue, currentTrackIndex = 0) { + const skipRelativeOffset = currentTrackIndex !== this._PRIMARY_TEXT_TRACK_INDEX; let relativeOffset = offsetValue; const newTrackOffset = offsetValue; - if (this.#currentTrackOffset) { + if (this.#currentTrackOffset && !skipRelativeOffset) { + /** + * Only calculate the offset for the first track. + * The offset gets set after this method is first called. + * Subsequent method calls (when playing multiple tracks) + * will have the calculated relative offset cancel out + * and will be `0` + * @example + * first_call: (relativeOffset = -2) -= (this.#currentTrackOffset = -1) -> 1 + * second_call: (relativeOffset = -2) -= (this.#currentTrackOffset = -2) -> 0 + */ relativeOffset -= this.#currentTrackOffset; } this.#currentTrackOffset = newTrackOffset; @@ -585,10 +594,41 @@ function tryRemoveElement(elem) { /** * @private + * These browsers will not clear the existing active cue when setting an offset + * for native TextTracks. + * Any previous text tracks that are on the screen when the offset changes will + * remain next to the new tracks until they reach the new offset's instance of the track. */ - setTextTrackSubtitleOffset(currentTrack, offsetValue) { + requiresHidingActiveCuesOnOffsetChange() { + if (browser.firefox) { + return true; + } + return false; + } + + /** + * @private + */ + hideTextTrackActiveCues(currentTrack) { + if (currentTrack.activeCues) { + Array.from(currentTrack.activeCues).forEach((cue) => { + cue.text = ''; + }); + } + } + + /** + * @private + */ + setTextTrackSubtitleOffset(currentTrack, offsetValue, currentTrackIndex) { if (currentTrack.cues) { - offsetValue = this.updateCurrentTrackOffset(offsetValue); + offsetValue = this.updateCurrentTrackOffset(offsetValue, currentTrackIndex); + if (offsetValue === 0) { + return; + } + if (this.requiresHidingActiveCuesOnOffsetChange()) { + this.hideTextTrackActiveCues(currentTrack); + } Array.from(currentTrack.cues) .forEach(function (cue) { cue.startTime -= offsetValue; @@ -600,9 +640,12 @@ function tryRemoveElement(elem) { /** * @private */ - setTrackEventsSubtitleOffset(trackEvents, offsetValue) { + setTrackEventsSubtitleOffset(trackEvents, offsetValue, currentTrackIndex) { if (Array.isArray(trackEvents)) { - offsetValue = this.updateCurrentTrackOffset(offsetValue) * 1e7; // ticks + offsetValue = this.updateCurrentTrackOffset(offsetValue, currentTrackIndex) * 1e7; // ticks + if (offsetValue === 0) { + return; + } trackEvents.forEach(function (trackEvent) { trackEvent.StartPositionTicks -= offsetValue; trackEvent.EndPositionTicks -= offsetValue; From 348de5ac7f1d5b7e5a735c10a31c89f115980465 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Thu, 15 Sep 2022 14:30:51 -0400 Subject: [PATCH 044/156] feat: resume secondary track for current session --- src/components/playback/playbackmanager.js | 18 +++++++++++++++++ src/plugins/htmlVideoPlayer/plugin.js | 23 ++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 48e2913188..f0cf735522 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1488,6 +1488,24 @@ class PlaybackManager { return getPlayerData(player).subtitleStreamIndex; }; + self.getSecondarySubtitleStreamIndex = function (player) { + player = player || self._currentPlayer; + + try { + if (player && !enableLocalPlaylistManagement(player)) { + return player.getSecondarySubtitleStreamIndex(); + } + } catch (e) { + console.error(`Failed to get secondary stream index: ${e}`); + } + + if (!player) { + throw new Error('player cannot be null'); + } + + return getPlayerData(player).secondarySubtitleStreamIndex; + }; + function getDeliveryMethod(subtitleStream) { // This will be null for internal subs for local items if (subtitleStream.DeliveryMethod) { diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 5b9fb3d471..ac178d8511 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -186,6 +186,10 @@ function tryRemoveElement(elem) { * @type {number | undefined} */ #subtitleTrackIndexToSetOnPlaying; + /** + * @type {number | undefined} + */ + #secondarySubtitleTrackIndexToSetOnPlaying; /** * @type {number | null} */ @@ -474,6 +478,15 @@ function tryRemoveElement(elem) { this.#subtitleTrackIndexToSetOnPlaying = -1; } } + // Continue using the secondary track that has been set during this watch session + const currentSecondaryTrackIndex = playbackManager.getSecondarySubtitleStreamIndex(); + this.#secondarySubtitleTrackIndexToSetOnPlaying = currentSecondaryTrackIndex == null ? -1 : currentSecondaryTrackIndex; + if (this.#secondarySubtitleTrackIndexToSetOnPlaying != null && this.#secondarySubtitleTrackIndexToSetOnPlaying >= 0) { + const initialSecondarySubtitleStream = options.mediaSource.MediaStreams[this.#secondarySubtitleTrackIndexToSetOnPlaying]; + if (!initialSecondarySubtitleStream || initialSecondarySubtitleStream.DeliveryMethod !== 'External') { + this.#secondarySubtitleTrackIndexToSetOnPlaying = -1; + } + } this.#audioTrackIndexToSetOnPlaying = options.playMethod === 'Transcode' ? null : options.mediaSource.DefaultAudioStreamIndex; @@ -889,6 +902,16 @@ function tryRemoveElement(elem) { if (this.#audioTrackIndexToSetOnPlaying != null && this.canSetAudioStreamIndex()) { this.setAudioStreamIndex(this.#audioTrackIndexToSetOnPlaying); } + + if (this.#secondarySubtitleTrackIndexToSetOnPlaying != null && this.#secondarySubtitleTrackIndexToSetOnPlaying >= 0) { + /** + * Using a 0ms timeout to set the secondary subtitles because of some weird race condition when + * setting both primary and secondary tracks at the same time. + * The `TextTrack` content and cues will somehow get mixed up and each track will play a mix of both languages. + * Putting this in a timeout fixes it completely. + */ + setTimeout(() => this.setSecondarySubtitleStreamIndex(this.#secondarySubtitleTrackIndexToSetOnPlaying), 0); + } } /** From 529e70222a16aa5daac026e174755b82dc5e16ca Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Thu, 15 Sep 2022 20:22:11 -0400 Subject: [PATCH 045/156] fix: update custom renderer logic/custom track spacing --- src/plugins/htmlVideoPlayer/plugin.js | 21 ++++++++++++--------- src/plugins/htmlVideoPlayer/style.scss | 3 ++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index ac178d8511..1605bcfbbd 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1292,17 +1292,20 @@ function tryRemoveElement(elem) { */ renderSubtitlesWithCustomElement(videoElement, track, item, targetTextTrackIndex) { this.fetchSubtitles(track, item).then((data) => { - if (!this.#videoSubtitlesElem) { - if (!this.isSecondaryTrack(targetTextTrackIndex)) { - const subtitlesContainer = document.createElement('div'); + if (!this.#videoSubtitlesElem && !this.isSecondaryTrack(targetTextTrackIndex)) { + let subtitlesContainer = document.querySelector('.videoSubtitles'); + if (!subtitlesContainer) { + subtitlesContainer = document.createElement('div'); subtitlesContainer.classList.add('videoSubtitles'); - subtitlesContainer.innerHTML = '
'; - this.#videoSubtitlesElem = subtitlesContainer.querySelector('.videoSubtitlesInner'); - this.setSubtitleAppearance(subtitlesContainer, this.#videoSubtitlesElem); - videoElement.parentNode.appendChild(subtitlesContainer); - this.#currentTrackEvents = data.TrackEvents; } - } else if (this.isSecondaryTrack(targetTextTrackIndex)) { + const subtitlesElement = document.createElement('div'); + subtitlesElement.classList.add('videoSubtitlesInner'); + subtitlesContainer.appendChild(subtitlesElement); + this.#videoSubtitlesElem = subtitlesContainer.querySelector('.videoSubtitlesInner'); + this.setSubtitleAppearance(subtitlesContainer, this.#videoSubtitlesElem); + videoElement.parentNode.appendChild(subtitlesContainer); + this.#currentTrackEvents = data.TrackEvents; + } else if (!this.#videoSecondarySubtitlesElem && this.isSecondaryTrack(targetTextTrackIndex)) { const subtitlesContainer = document.querySelector('.videoSubtitles'); if (!subtitlesContainer) return; const secondarySubtitlesElement = document.createElement('div'); diff --git a/src/plugins/htmlVideoPlayer/style.scss b/src/plugins/htmlVideoPlayer/style.scss index 36f86314b4..54137685b7 100644 --- a/src/plugins/htmlVideoPlayer/style.scss +++ b/src/plugins/htmlVideoPlayer/style.scss @@ -79,7 +79,8 @@ video[controls]::-webkit-media-controls { background-color: rgba(0, 0, 0, 0.8); margin: auto; display: block; - margin-bottom: 0 !important; + min-height: 0 !important; + margin-bottom: 0.5em !important; } @keyframes htmlvideoplayer-zoomin { From e8713002659e8acce61328eea1c114122a1b92b7 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Thu, 15 Sep 2022 21:36:25 -0400 Subject: [PATCH 046/156] chore: refactor destroyCustomTrack method --- src/plugins/htmlVideoPlayer/plugin.js | 36 ++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 1605bcfbbd..274247ff91 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1049,8 +1049,7 @@ function tryRemoveElement(elem) { /** * @private */ - destroyCustomTrack(videoElement, targetTrackIndex) { - const destroySingleTrack = typeof targetTrackIndex === 'number'; + destroyCustomRenderedTrackElements(targetTrackIndex) { const destroyPrimaryTrack = targetTrackIndex === this._PRIMARY_TEXT_TRACK_INDEX; const destroySecondaryTrack = targetTrackIndex === this._SECONDARY_TEXT_TRACK_INDEX; @@ -1064,7 +1063,7 @@ function tryRemoveElement(elem) { tryRemoveElement(this.#videoSecondarySubtitlesElem); this.#videoSecondarySubtitlesElem = null; } - } else { + } else { // destroy all if (this.#videoSubtitlesElem) { const subtitlesContainer = this.#videoSubtitlesElem.parentNode; if (subtitlesContainer) { @@ -1074,11 +1073,18 @@ function tryRemoveElement(elem) { this.#videoSecondarySubtitlesElem = null; } } + } + /** + * @private + */ + destroyNativeTracks(videoElement, targetTrackIndex) { if (videoElement) { + const destroySingleTrack = typeof targetTrackIndex === 'number'; const allTracks = videoElement.textTracks || []; // get list of tracks for (let index = 0; index < allTracks.length; index++) { const track = allTracks[index]; + // Skip all other tracks if we are targeting just one if (destroySingleTrack && targetTrackIndex !== index) { continue; } @@ -1087,6 +1093,14 @@ function tryRemoveElement(elem) { } } } + } + + /** + * @private + */ + destroyStoredTrackInfo(targetTrackIndex) { + const destroyPrimaryTrack = targetTrackIndex === this._PRIMARY_TEXT_TRACK_INDEX; + const destroySecondaryTrack = targetTrackIndex === this._SECONDARY_TEXT_TRACK_INDEX; if (destroyPrimaryTrack) { this.#customTrackIndex = -1; @@ -1094,12 +1108,26 @@ function tryRemoveElement(elem) { } else if (destroySecondaryTrack) { this.#customSecondaryTrackIndex = -1; this.#currentSecondaryTrackEvents = null; - } else { + } else { // destroy all this.#customTrackIndex = -1; this.#customSecondaryTrackIndex = -1; this.#currentTrackEvents = null; this.#currentSecondaryTrackEvents = null; } + } + + /** + * @private + */ + destroyCustomTrack(videoElement, targetTrackIndex) { + if (this.#resizeObserver) { + this.#resizeObserver.disconnect(); + this.#resizeObserver = null; + } + + this.destroyCustomRenderedTrackElements(targetTrackIndex); + this.destroyNativeTracks(videoElement, targetTrackIndex); + this.destroyStoredTrackInfo(targetTrackIndex); this.#currentClock = null; this._currentAspectRatio = null; From e01124cbcaa14675b6129092c0c2ad5ce804380a Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Fri, 16 Sep 2022 13:16:15 -0400 Subject: [PATCH 047/156] chore: use specific method for checking track --- src/plugins/htmlVideoPlayer/plugin.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 274247ff91..74a824706e 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -670,6 +670,10 @@ function tryRemoveElement(elem) { return this.#currentTrackOffset; } + isPrimaryTrack(textTrackIndex) { + return textTrackIndex === this._PRIMARY_TEXT_TRACK_INDEX; + } + isSecondaryTrack(textTrackIndex) { return textTrackIndex === this._SECONDARY_TEXT_TRACK_INDEX; } @@ -1050,15 +1054,12 @@ function tryRemoveElement(elem) { * @private */ destroyCustomRenderedTrackElements(targetTrackIndex) { - const destroyPrimaryTrack = targetTrackIndex === this._PRIMARY_TEXT_TRACK_INDEX; - const destroySecondaryTrack = targetTrackIndex === this._SECONDARY_TEXT_TRACK_INDEX; - - if (destroyPrimaryTrack) { + if (this.isPrimaryTrack(targetTrackIndex)) { if (this.#videoSubtitlesElem) { tryRemoveElement(this.#videoSubtitlesElem); this.#videoSubtitlesElem = null; } - } else if (destroySecondaryTrack) { + } else if (this.isSecondaryTrack(targetTrackIndex)) { if (this.#videoSecondarySubtitlesElem) { tryRemoveElement(this.#videoSecondarySubtitlesElem); this.#videoSecondarySubtitlesElem = null; @@ -1099,13 +1100,10 @@ function tryRemoveElement(elem) { * @private */ destroyStoredTrackInfo(targetTrackIndex) { - const destroyPrimaryTrack = targetTrackIndex === this._PRIMARY_TEXT_TRACK_INDEX; - const destroySecondaryTrack = targetTrackIndex === this._SECONDARY_TEXT_TRACK_INDEX; - - if (destroyPrimaryTrack) { + if (this.isPrimaryTrack(targetTrackIndex)) { this.#customTrackIndex = -1; this.#currentTrackEvents = null; - } else if (destroySecondaryTrack) { + } else if (this.isSecondaryTrack(targetTrackIndex)) { this.#customSecondaryTrackIndex = -1; this.#currentSecondaryTrackEvents = null; } else { // destroy all From f33699ad8a341383b422fba8bca92343a5ef494d Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Sun, 9 Oct 2022 22:33:08 -0400 Subject: [PATCH 048/156] fix: only show secondary if primary sill valid, remove resolveOnClick --- src/controllers/playback/video/index.js | 18 +++++++++++++++--- src/plugins/htmlVideoPlayer/plugin.js | 24 +++++++++++++++++------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 6ca0f59b4a..dfbf714c7a 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1062,8 +1062,21 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components return opt; }); - // Only show option if: player has support, has more than 1 subtitle track, has valid secondary tracks, primary subtitle is not off - if (playbackManager.hasSecondarySubtitleSupport(player) && streams.length > 1 && secondaryStreams.length > 0 && currentIndex !== -1) { + /** + * Only show option if: + * - player has support + * - has more than 1 subtitle track + * - has valid secondary tracks + * - primary subtitle is not off + * - primary subtitle is `External` + */ + if ( + playbackManager.hasSecondarySubtitleSupport(player) && + streams.length > 1 && + secondaryStreams.length > 0 && + currentIndex !== -1 && + playbackManager.isSubtitleStreamExternal(currentIndex, player) + ) { const secondarySubtitleMenuItem = { name: globalize.translate('SecondarySubtitles'), id: 'secondarysubtitle' @@ -1077,7 +1090,6 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components actionsheet.show({ title: globalize.translate('Subtitles'), items: menuItems, - resolveOnClick: true, positionTo: positionTo }).then(function (id) { if (id === 'secondarysubtitle') { diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 74a824706e..d00ff53d2c 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -471,15 +471,30 @@ function tryRemoveElement(elem) { destroyFlvPlayer(this); destroyCastPlayer(this); + let secondaryTrackValid = true; + this.#subtitleTrackIndexToSetOnPlaying = options.mediaSource.DefaultSubtitleStreamIndex == null ? -1 : options.mediaSource.DefaultSubtitleStreamIndex; if (this.#subtitleTrackIndexToSetOnPlaying != null && this.#subtitleTrackIndexToSetOnPlaying >= 0) { const initialSubtitleStream = options.mediaSource.MediaStreams[this.#subtitleTrackIndexToSetOnPlaying]; if (!initialSubtitleStream || initialSubtitleStream.DeliveryMethod === 'Encode') { this.#subtitleTrackIndexToSetOnPlaying = -1; } + // secondary track should not be shown if primary track is no longer `External` or is not on + if (initialSubtitleStream && initialSubtitleStream.DeliveryMethod !== 'External') { + secondaryTrackValid = false; + } + } else { + secondaryTrackValid = false; } - // Continue using the secondary track that has been set during this watch session - const currentSecondaryTrackIndex = playbackManager.getSecondarySubtitleStreamIndex(); + + // Get the secondary track that has been set during this watch session + let currentSecondaryTrackIndex = playbackManager.getSecondarySubtitleStreamIndex(); + + if (!secondaryTrackValid) { + currentSecondaryTrackIndex = -1; + playbackManager.setSecondarySubtitleStreamIndex(currentSecondaryTrackIndex); + } + this.#secondarySubtitleTrackIndexToSetOnPlaying = currentSecondaryTrackIndex == null ? -1 : currentSecondaryTrackIndex; if (this.#secondarySubtitleTrackIndexToSetOnPlaying != null && this.#secondarySubtitleTrackIndexToSetOnPlaying >= 0) { const initialSecondarySubtitleStream = options.mediaSource.MediaStreams[this.#secondarySubtitleTrackIndexToSetOnPlaying]; @@ -1118,11 +1133,6 @@ function tryRemoveElement(elem) { * @private */ destroyCustomTrack(videoElement, targetTrackIndex) { - if (this.#resizeObserver) { - this.#resizeObserver.disconnect(); - this.#resizeObserver = null; - } - this.destroyCustomRenderedTrackElements(targetTrackIndex); this.destroyNativeTracks(videoElement, targetTrackIndex); this.destroyStoredTrackInfo(targetTrackIndex); From 9ddafb063b104728acda04bb1195bcf62f7cce7e Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Mon, 10 Oct 2022 21:26:15 -0400 Subject: [PATCH 049/156] fix: limit secondary to non-SSA/ASS subtitles --- src/components/playback/playbackmanager.js | 21 +++++++++++++++++---- src/controllers/playback/video/index.js | 4 ++-- src/plugins/htmlVideoPlayer/plugin.js | 5 +++-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index f0cf735522..f6c366b7ae 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -876,15 +876,28 @@ class PlaybackManager { }); }; - self.hasSecondarySubtitleSupport = function (player = self._currentPlayer) { + self.playerHasSecondarySubtitleSupport = function (player = self._currentPlayer) { if (!player) return false; return Boolean(player.supports('SecondarySubtitles')); }; + /** + * Checks if: + * - the track can be used directly as a secondary subtitle + * - or if it can be paired with a secondary subtitle when used as a primary subtitle + */ + self.trackHasSecondarySubtitleSupport = function (track, player = self._currentPlayer) { + if (!player || !self.playerHasSecondarySubtitleSupport(player)) return false; + const format = (track.Codec || '').toLowerCase(); + // Currently, only non-SSA/non-ASS external subtitles are supported. + // Showing secondary subtitles does not work with any SSA/ASS subtitle combinations because + // of the complexity of how they are rendered and the risk of the subtitles overlapping + return format !== 'ssa' && format !== 'ass' && getDeliveryMethod(track) === 'External'; + }; + self.secondarySubtitleTracks = function (player = self._currentPlayer) { const streams = self.subtitleTracks(player); - // Currently, only External subtitles are supported - return streams.filter((stream) => getDeliveryMethod(stream) === 'External'); + return streams.filter((stream) => self.trackHasSecondarySubtitleSupport(stream, player)); }; function getCurrentSubtitleStream(player) { @@ -1575,7 +1588,7 @@ class PlaybackManager { self.setSecondarySubtitleStreamIndex = function (index, player) { player = player || self._currentPlayer; - if (!self.hasSecondarySubtitleSupport(player)) return; + if (!self.playerHasSecondarySubtitleSupport(player)) return; if (player && !enableLocalPlaylistManagement(player)) { try { return player.setSecondarySubtitleStreamIndex(index); diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index dfbf714c7a..84e7a8d719 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -990,7 +990,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components function showSecondarySubtitlesMenu(actionsheet, positionTo) { const player = currentPlayer; - if (!playbackManager.hasSecondarySubtitleSupport(player)) return; + if (!playbackManager.playerHasSecondarySubtitleSupport(player)) return; let currentIndex = playbackManager.getSecondarySubtitleStreamIndex(player); const streams = playbackManager.secondarySubtitleTracks(player); @@ -1071,7 +1071,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components * - primary subtitle is `External` */ if ( - playbackManager.hasSecondarySubtitleSupport(player) && + playbackManager.playerHasSecondarySubtitleSupport(player) && streams.length > 1 && secondaryStreams.length > 0 && currentIndex !== -1 && diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index d00ff53d2c..c532bc95a4 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -478,9 +478,10 @@ function tryRemoveElement(elem) { const initialSubtitleStream = options.mediaSource.MediaStreams[this.#subtitleTrackIndexToSetOnPlaying]; if (!initialSubtitleStream || initialSubtitleStream.DeliveryMethod === 'Encode') { this.#subtitleTrackIndexToSetOnPlaying = -1; + secondaryTrackValid = false; } - // secondary track should not be shown if primary track is no longer `External` or is not on - if (initialSubtitleStream && initialSubtitleStream.DeliveryMethod !== 'External') { + // secondary track should not be shown if primary track is no longer a valid pair + if (initialSubtitleStream && !playbackManager.trackHasSecondarySubtitleSupport(initialSubtitleStream)) { secondaryTrackValid = false; } } else { From 8fd9d83d8ecf9e61d5ab82b9abdc80726abe0eaf Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Wed, 19 Oct 2022 20:24:55 -0400 Subject: [PATCH 050/156] chore: refactor check, move consts --- src/plugins/htmlVideoPlayer/plugin.js | 32 ++++++++++----------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index c532bc95a4..7df882fceb 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -155,6 +155,9 @@ function tryRemoveElement(elem) { return profileBuilder({}); } + const PRIMARY_TEXT_TRACK_INDEX = 0; + const SECONDARY_TEXT_TRACK_INDEX = 1; + export class HtmlVideoPlayer { /** * @type {string} @@ -285,14 +288,6 @@ function tryRemoveElement(elem) { * @type {any | undefined} */ _currentPlayOptions; - /** - * @type {number} - */ - _PRIMARY_TEXT_TRACK_INDEX = 0; - /** - * @type {number} - */ - _SECONDARY_TEXT_TRACK_INDEX = 1; /** * @type {any | undefined} */ @@ -539,7 +534,7 @@ function tryRemoveElement(elem) { } setSecondarySubtitleStreamIndex(index) { - this.setCurrentTrackElement(index, this._SECONDARY_TEXT_TRACK_INDEX); + this.setCurrentTrackElement(index, SECONDARY_TEXT_TRACK_INDEX); } resetSubtitleOffset() { @@ -588,8 +583,8 @@ function tryRemoveElement(elem) { if (trackElements.length > 0) { trackElements.forEach((trackElement, index) => this.setTextTrackSubtitleOffset(trackElement, offsetValue, index)); } else if (this.#currentTrackEvents || this.#currentSecondaryTrackEvents) { - this.#currentTrackEvents && this.setTrackEventsSubtitleOffset(this.#currentTrackEvents, offsetValue, this._PRIMARY_TEXT_TRACK_INDEX); - this.#currentSecondaryTrackEvents && this.setTrackEventsSubtitleOffset(this.#currentSecondaryTrackEvents, offsetValue, this._SECONDARY_TEXT_TRACK_INDEX); + this.#currentTrackEvents && this.setTrackEventsSubtitleOffset(this.#currentTrackEvents, offsetValue, PRIMARY_TEXT_TRACK_INDEX); + this.#currentSecondaryTrackEvents && this.setTrackEventsSubtitleOffset(this.#currentSecondaryTrackEvents, offsetValue, SECONDARY_TEXT_TRACK_INDEX); } else { console.debug('No available track, cannot apply offset: ', offsetValue); } @@ -600,7 +595,7 @@ function tryRemoveElement(elem) { * @private */ updateCurrentTrackOffset(offsetValue, currentTrackIndex = 0) { - const skipRelativeOffset = currentTrackIndex !== this._PRIMARY_TEXT_TRACK_INDEX; + const skipRelativeOffset = currentTrackIndex !== PRIMARY_TEXT_TRACK_INDEX; let relativeOffset = offsetValue; const newTrackOffset = offsetValue; if (this.#currentTrackOffset && !skipRelativeOffset) { @@ -629,10 +624,7 @@ function tryRemoveElement(elem) { * remain next to the new tracks until they reach the new offset's instance of the track. */ requiresHidingActiveCuesOnOffsetChange() { - if (browser.firefox) { - return true; - } - return false; + return !!browser.firefox; } /** @@ -687,11 +679,11 @@ function tryRemoveElement(elem) { } isPrimaryTrack(textTrackIndex) { - return textTrackIndex === this._PRIMARY_TEXT_TRACK_INDEX; + return textTrackIndex === PRIMARY_TEXT_TRACK_INDEX; } isSecondaryTrack(textTrackIndex) { - return textTrackIndex === this._SECONDARY_TEXT_TRACK_INDEX; + return textTrackIndex === SECONDARY_TEXT_TRACK_INDEX; } /** @@ -1190,7 +1182,7 @@ function tryRemoveElement(elem) { /** * @private */ - setTrackForDisplay(videoElement, track, targetTextTrackIndex = this._PRIMARY_TEXT_TRACK_INDEX) { + setTrackForDisplay(videoElement, track, targetTextTrackIndex = PRIMARY_TEXT_TRACK_INDEX) { if (!track) { // Destroy all tracks by passing undefined if there is no valid primary track this.destroyCustomTrack(videoElement, this.isSecondaryTrack(targetTextTrackIndex) ? targetTextTrackIndex : undefined); @@ -1397,7 +1389,7 @@ function tryRemoveElement(elem) { /** * @private */ - renderTracksEvents(videoElement, track, item, targetTextTrackIndex = this._PRIMARY_TEXT_TRACK_INDEX) { + renderTracksEvents(videoElement, track, item, targetTextTrackIndex = PRIMARY_TEXT_TRACK_INDEX) { if (!itemHelper.isLocalItem(item) || track.IsExternal) { const format = (track.Codec || '').toLowerCase(); if (format === 'ssa' || format === 'ass') { From 49bae6b67c9c6010611a0d595a156cd80eaa8dd2 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Wed, 19 Oct 2022 21:20:18 -0400 Subject: [PATCH 051/156] fix: failed lint check --- src/plugins/htmlVideoPlayer/plugin.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 7df882fceb..b8903ee326 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -581,7 +581,9 @@ function tryRemoveElement(elem) { const trackElements = this.getTextTracks(); // if .vtt currently rendering if (trackElements.length > 0) { - trackElements.forEach((trackElement, index) => this.setTextTrackSubtitleOffset(trackElement, offsetValue, index)); + trackElements.forEach(function (trackElement, index) { + this.setTextTrackSubtitleOffset(trackElement, offsetValue, index); + }); } else if (this.#currentTrackEvents || this.#currentSecondaryTrackEvents) { this.#currentTrackEvents && this.setTrackEventsSubtitleOffset(this.#currentTrackEvents, offsetValue, PRIMARY_TEXT_TRACK_INDEX); this.#currentSecondaryTrackEvents && this.setTrackEventsSubtitleOffset(this.#currentSecondaryTrackEvents, offsetValue, SECONDARY_TEXT_TRACK_INDEX); From abc663f6f6ecca6c7c4babe35b057e3c938f884e Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Sun, 13 Nov 2022 20:22:55 -0500 Subject: [PATCH 052/156] fix: update ssa/ass checks, custom track location, offsets --- src/components/playback/playbackmanager.js | 12 ++--- src/controllers/playback/video/index.js | 34 +++++++------ src/plugins/htmlVideoPlayer/plugin.js | 58 +++++++++++++++------- src/plugins/htmlVideoPlayer/style.scss | 1 + 4 files changed, 65 insertions(+), 40 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index f6c366b7ae..9104eceb78 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -887,7 +887,7 @@ class PlaybackManager { * - or if it can be paired with a secondary subtitle when used as a primary subtitle */ self.trackHasSecondarySubtitleSupport = function (track, player = self._currentPlayer) { - if (!player || !self.playerHasSecondarySubtitleSupport(player)) return false; + if (!player) return false; const format = (track.Codec || '').toLowerCase(); // Currently, only non-SSA/non-ASS external subtitles are supported. // Showing secondary subtitles does not work with any SSA/ASS subtitle combinations because @@ -1578,8 +1578,9 @@ class PlaybackManager { player.setSubtitleStreamIndex(selectedTrackElementIndex); - // Also disable secondary subtitles when disabling the primary subtitles - if (selectedTrackElementIndex === -1) { + // Also disable secondary subtitles when disabling the primary + // subtitles, or if it doesn't support a secondary pair + if (selectedTrackElementIndex === -1 || !self.trackHasSecondarySubtitleSupport(newStream)) { self.setSecondarySubtitleStreamIndex(selectedTrackElementIndex); } @@ -1605,12 +1606,9 @@ class PlaybackManager { return; } - const clearingStream = currentStream && !newStream; - const changingStream = currentStream && newStream; - const addingStream = !currentStream && newStream; // Secondary subtitles are currently only handled client side // Changes to the server code are required before we can handle other delivery methods - if (!clearingStream && (changingStream || addingStream) && getDeliveryMethod(newStream) !== 'External') { + if (newStream && getDeliveryMethod(newStream) !== 'External') { return; } diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 84e7a8d719..ccbc295987 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1035,10 +1035,26 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components setTimeout(resetIdle, 0); } + /** + * Only show option if: + * - player has support + * - has more than 1 subtitle track + * - has valid secondary tracks + * - primary subtitle is not off + * - primary subtitle has support (index + 1 because `'Off'` is index 0 in `streams` array) + */ + function currentTrackCanHaveSecondarySubtitle(player, streams, currentIndex) { + const secondaryStreams = playbackManager.secondarySubtitleTracks(player); + return playbackManager.playerHasSecondarySubtitleSupport(player) && + streams.length > 1 && + secondaryStreams.length > 0 && + currentIndex !== -1 && + playbackManager.trackHasSecondarySubtitleSupport(streams[currentIndex + 1], player); + } + function showSubtitleTrackSelection() { const player = currentPlayer; const streams = playbackManager.subtitleTracks(player); - const secondaryStreams = playbackManager.secondarySubtitleTracks(player); let currentIndex = playbackManager.getSubtitleStreamIndex(player); if (currentIndex == null) { @@ -1062,21 +1078,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components return opt; }); - /** - * Only show option if: - * - player has support - * - has more than 1 subtitle track - * - has valid secondary tracks - * - primary subtitle is not off - * - primary subtitle is `External` - */ - if ( - playbackManager.playerHasSecondarySubtitleSupport(player) && - streams.length > 1 && - secondaryStreams.length > 0 && - currentIndex !== -1 && - playbackManager.isSubtitleStreamExternal(currentIndex, player) - ) { + if (currentTrackCanHaveSecondarySubtitle(player, streams, currentIndex)) { const secondarySubtitleMenuItem = { name: globalize.translate('SecondarySubtitles'), id: 'secondarysubtitle' diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index b8903ee326..a40b99a273 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -225,6 +225,14 @@ function tryRemoveElement(elem) { * @type {number | undefined} */ #currentTrackOffset; + /** + * @type {HTMLElement | null | undefined} + */ + #secondaryTrackOffset; + /** + * @type {number | null | undefined} + */ + #subtitleVerticalPosition; /** * @type {HTMLElement | null | undefined} */ @@ -539,6 +547,7 @@ function tryRemoveElement(elem) { resetSubtitleOffset() { this.#currentTrackOffset = 0; + this.#secondaryTrackOffset = 0; this.#showTrackOffset = false; } @@ -581,7 +590,7 @@ function tryRemoveElement(elem) { const trackElements = this.getTextTracks(); // if .vtt currently rendering if (trackElements.length > 0) { - trackElements.forEach(function (trackElement, index) { + trackElements.forEach((trackElement, index) => { this.setTextTrackSubtitleOffset(trackElement, offsetValue, index); }); } else if (this.#currentTrackEvents || this.#currentSecondaryTrackEvents) { @@ -596,24 +605,25 @@ function tryRemoveElement(elem) { /** * @private */ - updateCurrentTrackOffset(offsetValue, currentTrackIndex = 0) { - const skipRelativeOffset = currentTrackIndex !== PRIMARY_TEXT_TRACK_INDEX; + updateCurrentTrackOffset(offsetValue, currentTrackIndex = PRIMARY_TEXT_TRACK_INDEX) { + let offsetToCompare = this.#currentTrackOffset; + if (this.isSecondaryTrack(currentTrackIndex)) { + offsetToCompare = this.#secondaryTrackOffset; + } + let relativeOffset = offsetValue; const newTrackOffset = offsetValue; - if (this.#currentTrackOffset && !skipRelativeOffset) { - /** - * Only calculate the offset for the first track. - * The offset gets set after this method is first called. - * Subsequent method calls (when playing multiple tracks) - * will have the calculated relative offset cancel out - * and will be `0` - * @example - * first_call: (relativeOffset = -2) -= (this.#currentTrackOffset = -1) -> 1 - * second_call: (relativeOffset = -2) -= (this.#currentTrackOffset = -2) -> 0 - */ - relativeOffset -= this.#currentTrackOffset; + + if (offsetToCompare) { + relativeOffset -= offsetToCompare; } - this.#currentTrackOffset = newTrackOffset; + + if (this.isSecondaryTrack(currentTrackIndex)) { + this.#secondaryTrackOffset = newTrackOffset; + } else { + this.#currentTrackOffset = newTrackOffset; + } + // relative to currentTrackOffset return relativeOffset; } @@ -1132,6 +1142,7 @@ function tryRemoveElement(elem) { this.destroyNativeTracks(videoElement, targetTrackIndex); this.destroyStoredTrackInfo(targetTrackIndex); + this.#subtitleVerticalPosition = null; this.#currentClock = null; this._currentAspectRatio = null; @@ -1322,6 +1333,14 @@ function tryRemoveElement(elem) { * @private */ renderSubtitlesWithCustomElement(videoElement, track, item, targetTextTrackIndex) { + if (this.#subtitleVerticalPosition == null) { + import('../../scripts/settings/userSettings').then((userSettings) => { + const subtitleAppearance = userSettings.getSubtitleAppearanceSettings(); + this.#subtitleVerticalPosition = subtitleAppearance.verticalPosition; + this.#subtitleVerticalPosition = parseInt(subtitleAppearance.verticalPosition, 10); + }); + } + this.fetchSubtitles(track, item).then((data) => { if (!this.#videoSubtitlesElem && !this.isSecondaryTrack(targetTextTrackIndex)) { let subtitlesContainer = document.querySelector('.videoSubtitles'); @@ -1341,7 +1360,12 @@ function tryRemoveElement(elem) { if (!subtitlesContainer) return; const secondarySubtitlesElement = document.createElement('div'); secondarySubtitlesElement.classList.add('videoSecondarySubtitlesInner'); - subtitlesContainer.prepend(secondarySubtitlesElement); + // determine the order of the subtitles + if (this.#subtitleVerticalPosition < 0) { + subtitlesContainer.prepend(secondarySubtitlesElement); + } else { + subtitlesContainer.appendChild(secondarySubtitlesElement); + } this.#videoSecondarySubtitlesElem = secondarySubtitlesElement; this.setSubtitleAppearance(subtitlesContainer, this.#videoSecondarySubtitlesElem); this.#currentSecondaryTrackEvents = data.TrackEvents; diff --git a/src/plugins/htmlVideoPlayer/style.scss b/src/plugins/htmlVideoPlayer/style.scss index 54137685b7..21b2047392 100644 --- a/src/plugins/htmlVideoPlayer/style.scss +++ b/src/plugins/htmlVideoPlayer/style.scss @@ -80,6 +80,7 @@ video[controls]::-webkit-media-controls { margin: auto; display: block; min-height: 0 !important; + margin-top: 0.5em !important; margin-bottom: 0.5em !important; } From f3865f0dac1063e0accc519fa003a525b1945cd1 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Sun, 13 Nov 2022 20:40:02 -0500 Subject: [PATCH 053/156] chore: move logic from method to const --- src/controllers/playback/video/index.js | 34 ++++++++++++------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index ccbc295987..1f1006ddbd 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1035,26 +1035,10 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components setTimeout(resetIdle, 0); } - /** - * Only show option if: - * - player has support - * - has more than 1 subtitle track - * - has valid secondary tracks - * - primary subtitle is not off - * - primary subtitle has support (index + 1 because `'Off'` is index 0 in `streams` array) - */ - function currentTrackCanHaveSecondarySubtitle(player, streams, currentIndex) { - const secondaryStreams = playbackManager.secondarySubtitleTracks(player); - return playbackManager.playerHasSecondarySubtitleSupport(player) && - streams.length > 1 && - secondaryStreams.length > 0 && - currentIndex !== -1 && - playbackManager.trackHasSecondarySubtitleSupport(streams[currentIndex + 1], player); - } - function showSubtitleTrackSelection() { const player = currentPlayer; const streams = playbackManager.subtitleTracks(player); + const secondaryStreams = playbackManager.secondarySubtitleTracks(player); let currentIndex = playbackManager.getSubtitleStreamIndex(player); if (currentIndex == null) { @@ -1078,7 +1062,21 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components return opt; }); - if (currentTrackCanHaveSecondarySubtitle(player, streams, currentIndex)) { + /** + * Only show option if: + * - player has support + * - has more than 1 subtitle track + * - has valid secondary tracks + * - primary subtitle is not off + * - primary subtitle has support (index + 1 because `'Off'` is index 0 in `streams` array) + */ + const currentTrackCanAddSecondarySubtitle = playbackManager.playerHasSecondarySubtitleSupport(player) && + streams.length > 1 && + secondaryStreams.length > 0 && + currentIndex !== -1 && + playbackManager.trackHasSecondarySubtitleSupport(streams[currentIndex + 1], player); + + if (currentTrackCanAddSecondarySubtitle) { const secondarySubtitleMenuItem = { name: globalize.translate('SecondarySubtitles'), id: 'secondarysubtitle' From b1e397c4bcadd3514543f32eda25413b52e0c6dc Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Mon, 14 Nov 2022 22:29:30 -0500 Subject: [PATCH 054/156] fix: use correct stream, code safety, race conditions, update css --- src/components/playback/playbackmanager.js | 16 ++++++------- src/controllers/playback/video/index.js | 4 ++-- src/plugins/htmlVideoPlayer/plugin.js | 27 ++++++++-------------- src/plugins/htmlVideoPlayer/style.scss | 7 +++--- 4 files changed, 22 insertions(+), 32 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 9104eceb78..493df16e14 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -911,7 +911,7 @@ class PlaybackManager { return null; } - return getSubtitleStream(player, index); + return self.getSubtitleStream(player, index); } function getCurrentSecondarySubtitleStream(player) { @@ -925,14 +925,14 @@ class PlaybackManager { return null; } - return getSubtitleStream(player, index); + return self.getSubtitleStream(player, index); } - function getSubtitleStream(player, index) { + self.getSubtitleStream = function (player, index) { return self.subtitleTracks(player).filter(function (s) { return s.Type === 'Subtitle' && s.Index === index; })[0]; - } + }; self.getPlaylist = function (player) { player = player || self._currentPlayer; @@ -1536,7 +1536,7 @@ class PlaybackManager { const currentStream = getCurrentSubtitleStream(player); - const newStream = getSubtitleStream(player, index); + const newStream = self.getSubtitleStream(player, index); if (!currentStream && !newStream) { return; @@ -1581,7 +1581,7 @@ class PlaybackManager { // Also disable secondary subtitles when disabling the primary // subtitles, or if it doesn't support a secondary pair if (selectedTrackElementIndex === -1 || !self.trackHasSecondarySubtitleSupport(newStream)) { - self.setSecondarySubtitleStreamIndex(selectedTrackElementIndex); + self.setSecondarySubtitleStreamIndex(-1); } getPlayerData(player).subtitleStreamIndex = index; @@ -1600,7 +1600,7 @@ class PlaybackManager { const currentStream = getCurrentSecondarySubtitleStream(player); - const newStream = getSubtitleStream(player, index); + const newStream = self.getSubtitleStream(player, index); if (!currentStream && !newStream) { return; @@ -1644,7 +1644,7 @@ class PlaybackManager { }; self.isSubtitleStreamExternal = function (index, player) { - const stream = getSubtitleStream(player, index); + const stream = self.getSubtitleStream(player, index); return stream ? getDeliveryMethod(stream) === 'External' : false; }; diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 1f1006ddbd..74ba461e84 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1068,13 +1068,13 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components * - has more than 1 subtitle track * - has valid secondary tracks * - primary subtitle is not off - * - primary subtitle has support (index + 1 because `'Off'` is index 0 in `streams` array) + * - primary subtitle has support */ const currentTrackCanAddSecondarySubtitle = playbackManager.playerHasSecondarySubtitleSupport(player) && streams.length > 1 && secondaryStreams.length > 0 && currentIndex !== -1 && - playbackManager.trackHasSecondarySubtitleSupport(streams[currentIndex + 1], player); + playbackManager.trackHasSecondarySubtitleSupport(playbackManager.getSubtitleStream(player, currentIndex), player); if (currentTrackCanAddSecondarySubtitle) { const secondarySubtitleMenuItem = { diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index a40b99a273..bfa74fb2c2 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -229,10 +229,6 @@ function tryRemoveElement(elem) { * @type {HTMLElement | null | undefined} */ #secondaryTrackOffset; - /** - * @type {number | null | undefined} - */ - #subtitleVerticalPosition; /** * @type {HTMLElement | null | undefined} */ @@ -589,7 +585,7 @@ function tryRemoveElement(elem) { } else { const trackElements = this.getTextTracks(); // if .vtt currently rendering - if (trackElements.length > 0) { + if (trackElements?.length > 0) { trackElements.forEach((trackElement, index) => { this.setTextTrackSubtitleOffset(trackElement, offsetValue, index); }); @@ -1142,7 +1138,6 @@ function tryRemoveElement(elem) { this.destroyNativeTracks(videoElement, targetTrackIndex); this.destroyStoredTrackInfo(targetTrackIndex); - this.#subtitleVerticalPosition = null; this.#currentClock = null; this._currentAspectRatio = null; @@ -1333,15 +1328,11 @@ function tryRemoveElement(elem) { * @private */ renderSubtitlesWithCustomElement(videoElement, track, item, targetTextTrackIndex) { - if (this.#subtitleVerticalPosition == null) { - import('../../scripts/settings/userSettings').then((userSettings) => { - const subtitleAppearance = userSettings.getSubtitleAppearanceSettings(); - this.#subtitleVerticalPosition = subtitleAppearance.verticalPosition; - this.#subtitleVerticalPosition = parseInt(subtitleAppearance.verticalPosition, 10); - }); - } + Promise.all([import('../../scripts/settings/userSettings'), this.fetchSubtitles(track, item)]).then((results) => { + const [userSettings, subtitleData] = results; + const subtitleAppearance = userSettings.getSubtitleAppearanceSettings(); + const subtitleVerticalPosition = parseInt(subtitleAppearance.verticalPosition, 10); - this.fetchSubtitles(track, item).then((data) => { if (!this.#videoSubtitlesElem && !this.isSecondaryTrack(targetTextTrackIndex)) { let subtitlesContainer = document.querySelector('.videoSubtitles'); if (!subtitlesContainer) { @@ -1354,21 +1345,21 @@ function tryRemoveElement(elem) { this.#videoSubtitlesElem = subtitlesContainer.querySelector('.videoSubtitlesInner'); this.setSubtitleAppearance(subtitlesContainer, this.#videoSubtitlesElem); videoElement.parentNode.appendChild(subtitlesContainer); - this.#currentTrackEvents = data.TrackEvents; + this.#currentTrackEvents = subtitleData.TrackEvents; } else if (!this.#videoSecondarySubtitlesElem && this.isSecondaryTrack(targetTextTrackIndex)) { const subtitlesContainer = document.querySelector('.videoSubtitles'); if (!subtitlesContainer) return; const secondarySubtitlesElement = document.createElement('div'); secondarySubtitlesElement.classList.add('videoSecondarySubtitlesInner'); // determine the order of the subtitles - if (this.#subtitleVerticalPosition < 0) { - subtitlesContainer.prepend(secondarySubtitlesElement); + if (subtitleVerticalPosition < 0) { + subtitlesContainer.insertBefore(secondarySubtitlesElement, subtitlesContainer.firstChild); } else { subtitlesContainer.appendChild(secondarySubtitlesElement); } this.#videoSecondarySubtitlesElem = secondarySubtitlesElement; this.setSubtitleAppearance(subtitlesContainer, this.#videoSecondarySubtitlesElem); - this.#currentSecondaryTrackEvents = data.TrackEvents; + this.#currentSecondaryTrackEvents = subtitleData.TrackEvents; } }); } diff --git a/src/plugins/htmlVideoPlayer/style.scss b/src/plugins/htmlVideoPlayer/style.scss index 21b2047392..0026146081 100644 --- a/src/plugins/htmlVideoPlayer/style.scss +++ b/src/plugins/htmlVideoPlayer/style.scss @@ -65,20 +65,19 @@ video[controls]::-webkit-media-controls { padding-left: env(safe-area-inset-left); padding-right: env(safe-area-inset-right); padding-bottom: env(safe-area-inset-bottom); + display: flex; + flex-direction: column; + align-items: center; } .videoSubtitlesInner { max-width: 70%; background-color: rgba(0, 0, 0, 0.8); - margin: auto; - display: inline-block; } .videoSecondarySubtitlesInner { max-width: 70%; background-color: rgba(0, 0, 0, 0.8); - margin: auto; - display: block; min-height: 0 !important; margin-top: 0.5em !important; margin-bottom: 0.5em !important; From a50fae3b7d264d5774444829169b1676cfdb74e6 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Thu, 17 Nov 2022 17:21:12 -0500 Subject: [PATCH 055/156] chore: simplify/refactor to reuse existing method --- src/components/playback/playbackmanager.js | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 493df16e14..f19d1f0fa4 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -900,26 +900,12 @@ class PlaybackManager { return streams.filter((stream) => self.trackHasSecondarySubtitleSupport(stream, player)); }; - function getCurrentSubtitleStream(player) { + function getCurrentSubtitleStream(player, isSecondaryStream = false) { if (!player) { throw new Error('player cannot be null'); } - const index = getPlayerData(player).subtitleStreamIndex; - - if (index == null || index === -1) { - return null; - } - - return self.getSubtitleStream(player, index); - } - - function getCurrentSecondarySubtitleStream(player) { - if (!player) { - throw new Error('player cannot be null'); - } - - const index = getPlayerData(player).secondarySubtitleStreamIndex; + const index = isSecondaryStream ? getPlayerData(player).secondarySubtitleStreamIndex : getPlayerData(player).subtitleStreamIndex; if (index == null || index === -1) { return null; @@ -1598,7 +1584,7 @@ class PlaybackManager { } } - const currentStream = getCurrentSecondarySubtitleStream(player); + const currentStream = getCurrentSubtitleStream(player, true); const newStream = self.getSubtitleStream(player, index); From 69265e2118625803602b37201ad30207e0defee4 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel <30599893+is343@users.noreply.github.com> Date: Wed, 8 Feb 2023 17:34:27 -0500 Subject: [PATCH 056/156] Update src/components/playback/playbackmanager.js Update error logging Co-authored-by: Bill Thornton --- src/components/playback/playbackmanager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index f19d1f0fa4..20e466b83d 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1495,7 +1495,7 @@ class PlaybackManager { return player.getSecondarySubtitleStreamIndex(); } } catch (e) { - console.error(`Failed to get secondary stream index: ${e}`); + console.error('[playbackmanager] Failed to get secondary stream index:', e); } if (!player) { From c68d01a0f0b6888c735ba796a2919fff626e0859 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel <30599893+is343@users.noreply.github.com> Date: Thu, 9 Feb 2023 19:38:03 -0500 Subject: [PATCH 057/156] Update error logging in src/components/playback/playbackmanager.js Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/components/playback/playbackmanager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 20e466b83d..b25854146e 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1580,7 +1580,7 @@ class PlaybackManager { try { return player.setSecondarySubtitleStreamIndex(index); } catch (e) { - console.error(`AutoSet - Failed to set secondary track: ${e}`); + console.error('[playbackmanager] AutoSet - Failed to set secondary track:', e); } } From e5c05b4ebcb10cb7e313c37043b35587cc7ad004 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel <30599893+is343@users.noreply.github.com> Date: Thu, 9 Feb 2023 19:38:28 -0500 Subject: [PATCH 058/156] Update error logging in src/components/playback/playbackmanager.js src/components/playback/playbackmanager.js Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/components/playback/playbackmanager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index b25854146e..0633aceb9d 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1603,7 +1603,7 @@ class PlaybackManager { try { player.setSecondarySubtitleStreamIndex(index); } catch (e) { - console.error(`AutoSet - Failed to set secondary track: ${e}`); + console.error('[playbackmanager] AutoSet - Failed to set secondary track:', e); } }; From 5a217ca0849f7479e8efab62533c2c3114040bf2 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel <30599893+is343@users.noreply.github.com> Date: Thu, 9 Feb 2023 19:39:52 -0500 Subject: [PATCH 059/156] set secondary sub index after player succeeds Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/components/playback/playbackmanager.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 0633aceb9d..e2c2fefa04 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1598,10 +1598,9 @@ class PlaybackManager { return; } - getPlayerData(player).secondarySubtitleStreamIndex = index; - try { player.setSecondarySubtitleStreamIndex(index); + getPlayerData(player).secondarySubtitleStreamIndex = index; } catch (e) { console.error('[playbackmanager] AutoSet - Failed to set secondary track:', e); } From 2a1ff26ad9a64eda2f6e6b7912f0432dbaaafade Mon Sep 17 00:00:00 2001 From: Ivan Schurawel <30599893+is343@users.noreply.github.com> Date: Thu, 9 Feb 2023 19:40:28 -0500 Subject: [PATCH 060/156] clean up code Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/components/playback/playbackmanager.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index e2c2fefa04..cf26ee7d67 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1490,18 +1490,18 @@ class PlaybackManager { self.getSecondarySubtitleStreamIndex = function (player) { player = player || self._currentPlayer; + if (!player) { + throw new Error('player cannot be null'); + } + try { - if (player && !enableLocalPlaylistManagement(player)) { + if (!enableLocalPlaylistManagement(player)) { return player.getSecondarySubtitleStreamIndex(); } } catch (e) { console.error('[playbackmanager] Failed to get secondary stream index:', e); } - if (!player) { - throw new Error('player cannot be null'); - } - return getPlayerData(player).secondarySubtitleStreamIndex; }; From c3b50c6d7307f75738033165c896a457c365437f Mon Sep 17 00:00:00 2001 From: Ivan Schurawel <30599893+is343@users.noreply.github.com> Date: Thu, 9 Feb 2023 19:41:50 -0500 Subject: [PATCH 061/156] fix code styling Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/controllers/playback/video/index.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 74ba461e84..19c1492d0e 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1070,11 +1070,11 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components * - primary subtitle is not off * - primary subtitle has support */ - const currentTrackCanAddSecondarySubtitle = playbackManager.playerHasSecondarySubtitleSupport(player) && - streams.length > 1 && - secondaryStreams.length > 0 && - currentIndex !== -1 && - playbackManager.trackHasSecondarySubtitleSupport(playbackManager.getSubtitleStream(player, currentIndex), player); + const currentTrackCanAddSecondarySubtitle = playbackManager.playerHasSecondarySubtitleSupport(player) + && streams.length > 1 + && secondaryStreams.length > 0 + && currentIndex !== -1 + && playbackManager.trackHasSecondarySubtitleSupport(playbackManager.getSubtitleStream(player, currentIndex), player); if (currentTrackCanAddSecondarySubtitle) { const secondarySubtitleMenuItem = { From 6c0a1733612f597088a55bfe023559dde1997a5c Mon Sep 17 00:00:00 2001 From: Ivan Schurawel <30599893+is343@users.noreply.github.com> Date: Fri, 10 Feb 2023 08:15:12 -0500 Subject: [PATCH 062/156] use whole subtitles element Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/plugins/htmlVideoPlayer/plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index bfa74fb2c2..ca07c2d7a5 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1342,7 +1342,7 @@ function tryRemoveElement(elem) { const subtitlesElement = document.createElement('div'); subtitlesElement.classList.add('videoSubtitlesInner'); subtitlesContainer.appendChild(subtitlesElement); - this.#videoSubtitlesElem = subtitlesContainer.querySelector('.videoSubtitlesInner'); + this.#videoSubtitlesElem = subtitlesElement; this.setSubtitleAppearance(subtitlesContainer, this.#videoSubtitlesElem); videoElement.parentNode.appendChild(subtitlesContainer); this.#currentTrackEvents = subtitleData.TrackEvents; From c7f31c0fac2f4060fc2f12dd0076e922657ac4c7 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Fri, 10 Feb 2023 13:52:53 -0500 Subject: [PATCH 063/156] fix: pass player to playbackManager --- src/plugins/htmlVideoPlayer/plugin.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index ca07c2d7a5..700eedd141 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -480,7 +480,7 @@ function tryRemoveElement(elem) { secondaryTrackValid = false; } // secondary track should not be shown if primary track is no longer a valid pair - if (initialSubtitleStream && !playbackManager.trackHasSecondarySubtitleSupport(initialSubtitleStream)) { + if (initialSubtitleStream && !playbackManager.trackHasSecondarySubtitleSupport(initialSubtitleStream, this)) { secondaryTrackValid = false; } } else { @@ -488,11 +488,11 @@ function tryRemoveElement(elem) { } // Get the secondary track that has been set during this watch session - let currentSecondaryTrackIndex = playbackManager.getSecondarySubtitleStreamIndex(); + let currentSecondaryTrackIndex = playbackManager.getSecondarySubtitleStreamIndex(this); if (!secondaryTrackValid) { currentSecondaryTrackIndex = -1; - playbackManager.setSecondarySubtitleStreamIndex(currentSecondaryTrackIndex); + playbackManager.setSecondarySubtitleStreamIndex(currentSecondaryTrackIndex, this); } this.#secondarySubtitleTrackIndexToSetOnPlaying = currentSecondaryTrackIndex == null ? -1 : currentSecondaryTrackIndex; From fe970743f1b37293cea2aa17a2e4b9a6f62613c1 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Tue, 14 Feb 2023 19:11:16 -0500 Subject: [PATCH 064/156] chore: remove fix for stuck track cues --- src/plugins/htmlVideoPlayer/plugin.js | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 700eedd141..b45bc4d845 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -624,28 +624,6 @@ function tryRemoveElement(elem) { return relativeOffset; } - /** - * @private - * These browsers will not clear the existing active cue when setting an offset - * for native TextTracks. - * Any previous text tracks that are on the screen when the offset changes will - * remain next to the new tracks until they reach the new offset's instance of the track. - */ - requiresHidingActiveCuesOnOffsetChange() { - return !!browser.firefox; - } - - /** - * @private - */ - hideTextTrackActiveCues(currentTrack) { - if (currentTrack.activeCues) { - Array.from(currentTrack.activeCues).forEach((cue) => { - cue.text = ''; - }); - } - } - /** * @private */ @@ -655,9 +633,6 @@ function tryRemoveElement(elem) { if (offsetValue === 0) { return; } - if (this.requiresHidingActiveCuesOnOffsetChange()) { - this.hideTextTrackActiveCues(currentTrack); - } Array.from(currentTrack.cues) .forEach(function (cue) { cue.startTime -= offsetValue; From fb68bb1419044d0c7b67c4a585b9b90502e00174 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Wed, 15 Feb 2023 02:10:00 -0500 Subject: [PATCH 065/156] fix: define options before setting secondary track --- src/plugins/htmlVideoPlayer/plugin.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index b45bc4d845..646c902a5d 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -487,6 +487,10 @@ function tryRemoveElement(elem) { secondaryTrackValid = false; } + this.#audioTrackIndexToSetOnPlaying = options.playMethod === 'Transcode' ? null : options.mediaSource.DefaultAudioStreamIndex; + + this._currentPlayOptions = options; + // Get the secondary track that has been set during this watch session let currentSecondaryTrackIndex = playbackManager.getSecondarySubtitleStreamIndex(this); @@ -503,10 +507,6 @@ function tryRemoveElement(elem) { } } - this.#audioTrackIndexToSetOnPlaying = options.playMethod === 'Transcode' ? null : options.mediaSource.DefaultAudioStreamIndex; - - this._currentPlayOptions = options; - const crossOrigin = getCrossOriginValue(options.mediaSource); if (crossOrigin) { elem.crossOrigin = crossOrigin; From c74c0cddde3d9a0a8779bfd7241f1a68eec9d557 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Wed, 15 Feb 2023 02:10:55 -0500 Subject: [PATCH 066/156] chore: clear and set secondary track for continued plays --- src/components/playback/playbackmanager.js | 46 ++++++++++++++++------ 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index cf26ee7d67..7463b4b614 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -422,7 +422,8 @@ function getPlaybackInfo(player, enableDirectPlay, enableDirectStream, allowVideoStreamCopy, - allowAudioStreamCopy) { + allowAudioStreamCopy, + secondarySubtitleStreamIndex) { if (!itemHelper.isLocalItem(item) && item.MediaType === 'Audio' && !player.useServerPlaybackInfoForAudio) { return Promise.resolve({ MediaSources: [ @@ -462,6 +463,9 @@ function getPlaybackInfo(player, if (subtitleStreamIndex != null) { query.SubtitleStreamIndex = subtitleStreamIndex; } + if (secondarySubtitleStreamIndex != null) { + query.SecondarySubtitleStreamIndex = secondarySubtitleStreamIndex; + } if (enableDirectPlay != null) { query.EnableDirectPlay = enableDirectPlay; } @@ -1720,6 +1724,7 @@ class PlaybackManager { }).then(function (deviceProfile) { const audioStreamIndex = params.AudioStreamIndex == null ? getPlayerData(player).audioStreamIndex : params.AudioStreamIndex; const subtitleStreamIndex = params.SubtitleStreamIndex == null ? getPlayerData(player).subtitleStreamIndex : params.SubtitleStreamIndex; + const secondarySubtitleStreamIndex = params.SubtitleStreamIndex == null ? getPlayerData(player).secondarySubtitleStreamIndex : params.secondarySubtitleStreamIndex; let currentMediaSource = self.currentMediaSource(player); const apiClient = ServerConnections.getApiClient(currentItem.ServerId); @@ -1746,6 +1751,7 @@ class PlaybackManager { } getPlayerData(player).subtitleStreamIndex = subtitleStreamIndex; + getPlayerData(player).secondarySubtitleStreamIndex = secondarySubtitleStreamIndex; getPlayerData(player).audioStreamIndex = audioStreamIndex; getPlayerData(player).maxStreamingBitrate = maxBitrate; @@ -2031,6 +2037,7 @@ class PlaybackManager { state.PlayState.PlaybackRate = self.getPlaybackRate(player); state.PlayState.SubtitleStreamIndex = self.getSubtitleStreamIndex(player); + state.PlayState.SecondarySubtitleStreamIndex = self.getSecondarySubtitleStreamIndex(player); state.PlayState.AudioStreamIndex = self.getAudioStreamIndex(player); state.PlayState.BufferedRanges = self.getBufferedRanges(player); @@ -2311,11 +2318,16 @@ class PlaybackManager { }); } - function rankStreamType(prevIndex, prevSource, mediaSource, streamType) { + function rankStreamType(prevIndex, prevSource, mediaSource, streamType, isSecondarySubtitle) { if (prevIndex == -1) { console.debug(`AutoSet ${streamType} - No Stream Set`); - if (streamType == 'Subtitle') - mediaSource.DefaultSubtitleStreamIndex = -1; + if (streamType == 'Subtitle') { + if (isSecondarySubtitle) { + mediaSource.DefaultSecondarySubtitleStreamIndex = -1; + } else { + mediaSource.DefaultSubtitleStreamIndex = -1; + } + } return; } @@ -2373,8 +2385,13 @@ class PlaybackManager { if (bestStreamIndex != null) { console.debug(`AutoSet ${streamType} - Using ${bestStreamIndex} score ${bestStreamScore}.`); - if (streamType == 'Subtitle') - mediaSource.DefaultSubtitleStreamIndex = bestStreamIndex; + if (streamType == 'Subtitle') { + if (isSecondarySubtitle) { + mediaSource.DefaultSecondarySubtitleStreamIndex = bestStreamIndex; + } else { + mediaSource.DefaultSubtitleStreamIndex = bestStreamIndex; + } + } if (streamType == 'Audio') mediaSource.DefaultAudioStreamIndex = bestStreamIndex; } else { @@ -2382,7 +2399,7 @@ class PlaybackManager { } } - function autoSetNextTracks(prevSource, mediaSource, audio, subtitle) { + function autoSetNextTracks(prevSource, mediaSource, audio, subtitle, secondarySubtitle) { try { if (!prevSource) return; @@ -2398,6 +2415,10 @@ class PlaybackManager { if (subtitle && typeof prevSource.DefaultSubtitleStreamIndex == 'number') { rankStreamType(prevSource.DefaultSubtitleStreamIndex, prevSource, mediaSource, 'Subtitle'); } + + if (secondarySubtitle && typeof prevSource.DefaultSecondarySubtitleStreamIndex == 'number') { + rankStreamType(prevSource.DefaultSecondarySubtitleStreamIndex, prevSource, mediaSource, 'Subtitle', true); + } } catch (e) { console.error(`AutoSet - Caught unexpected error: ${e}`); } @@ -2463,14 +2484,14 @@ class PlaybackManager { return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex).then(async (mediaSource) => { const user = await apiClient.getCurrentUser(); - autoSetNextTracks(prevSource, mediaSource, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections); + const playerData = getPlayerData(player); + + autoSetNextTracks(prevSource, mediaSource, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections, playerData.secondarySubtitleStreamIndex); const streamInfo = createStreamInfo(apiClient, item.MediaType, item, mediaSource, startPosition, player); streamInfo.fullscreen = playOptions.fullscreen; - const playerData = getPlayerData(player); - playerData.isChangingStream = false; playerData.maxStreamingBitrate = maxBitrate; playerData.streamInfo = streamInfo; @@ -2832,7 +2853,8 @@ class PlaybackManager { return { ...prevSource, DefaultAudioStreamIndex: prevPlayerData.audioStreamIndex, - DefaultSubtitleStreamIndex: prevPlayerData.subtitleStreamIndex + DefaultSubtitleStreamIndex: prevPlayerData.subtitleStreamIndex, + DefaultSecondarySubtitleStreamIndex: prevPlayerData.secondarySubtitleStreamIndex }; } @@ -2991,9 +3013,11 @@ class PlaybackManager { if (mediaSource) { playerData.audioStreamIndex = mediaSource.DefaultAudioStreamIndex; playerData.subtitleStreamIndex = mediaSource.DefaultSubtitleStreamIndex; + playerData.secondarySubtitleStreamIndex = mediaSource.DefaultSecondarySubtitleStreamIndex; } else { playerData.audioStreamIndex = null; playerData.subtitleStreamIndex = null; + playerData.secondarySubtitleStreamIndex = null; } self._playNextAfterEnded = true; From 89ec4cf9cf2b7ffd612b609087bc4c4c0e86d7da Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Fri, 17 Feb 2023 17:45:43 -0500 Subject: [PATCH 067/156] chore: implement feedback --- src/components/playback/playbackmanager.js | 12 ++++++------ src/plugins/htmlVideoPlayer/plugin.js | 22 +++++++++------------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 7463b4b614..fe50820b50 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1724,7 +1724,7 @@ class PlaybackManager { }).then(function (deviceProfile) { const audioStreamIndex = params.AudioStreamIndex == null ? getPlayerData(player).audioStreamIndex : params.AudioStreamIndex; const subtitleStreamIndex = params.SubtitleStreamIndex == null ? getPlayerData(player).subtitleStreamIndex : params.SubtitleStreamIndex; - const secondarySubtitleStreamIndex = params.SubtitleStreamIndex == null ? getPlayerData(player).secondarySubtitleStreamIndex : params.secondarySubtitleStreamIndex; + const secondarySubtitleStreamIndex = params.SecondarySubtitleStreamIndex == null ? getPlayerData(player).secondarySubtitleStreamIndex : params.SecondarySubtitleStreamIndex; let currentMediaSource = self.currentMediaSource(player); const apiClient = ServerConnections.getApiClient(currentItem.ServerId); @@ -2399,7 +2399,7 @@ class PlaybackManager { } } - function autoSetNextTracks(prevSource, mediaSource, audio, subtitle, secondarySubtitle) { + function autoSetNextTracks(prevSource, mediaSource, audio, subtitle) { try { if (!prevSource) return; @@ -2416,7 +2416,7 @@ class PlaybackManager { rankStreamType(prevSource.DefaultSubtitleStreamIndex, prevSource, mediaSource, 'Subtitle'); } - if (secondarySubtitle && typeof prevSource.DefaultSecondarySubtitleStreamIndex == 'number') { + if (subtitle && typeof prevSource.DefaultSecondarySubtitleStreamIndex == 'number') { rankStreamType(prevSource.DefaultSecondarySubtitleStreamIndex, prevSource, mediaSource, 'Subtitle', true); } } catch (e) { @@ -2484,14 +2484,14 @@ class PlaybackManager { return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex).then(async (mediaSource) => { const user = await apiClient.getCurrentUser(); - const playerData = getPlayerData(player); - - autoSetNextTracks(prevSource, mediaSource, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections, playerData.secondarySubtitleStreamIndex); + autoSetNextTracks(prevSource, mediaSource, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections); const streamInfo = createStreamInfo(apiClient, item.MediaType, item, mediaSource, startPosition, player); streamInfo.fullscreen = playOptions.fullscreen; + const playerData = getPlayerData(player); + playerData.isChangingStream = false; playerData.maxStreamingBitrate = maxBitrate; playerData.streamInfo = streamInfo; diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 646c902a5d..4a9d1a7bf9 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -491,20 +491,16 @@ function tryRemoveElement(elem) { this._currentPlayOptions = options; - // Get the secondary track that has been set during this watch session - let currentSecondaryTrackIndex = playbackManager.getSecondarySubtitleStreamIndex(this); - - if (!secondaryTrackValid) { - currentSecondaryTrackIndex = -1; - playbackManager.setSecondarySubtitleStreamIndex(currentSecondaryTrackIndex, this); - } - - this.#secondarySubtitleTrackIndexToSetOnPlaying = currentSecondaryTrackIndex == null ? -1 : currentSecondaryTrackIndex; - if (this.#secondarySubtitleTrackIndexToSetOnPlaying != null && this.#secondarySubtitleTrackIndexToSetOnPlaying >= 0) { - const initialSecondarySubtitleStream = options.mediaSource.MediaStreams[this.#secondarySubtitleTrackIndexToSetOnPlaying]; - if (!initialSecondarySubtitleStream || initialSecondarySubtitleStream.DeliveryMethod !== 'External') { - this.#secondarySubtitleTrackIndexToSetOnPlaying = -1; + if (secondaryTrackValid) { + this.#secondarySubtitleTrackIndexToSetOnPlaying = options.mediaSource.DefaultSecondarySubtitleStreamIndex == null ? -1 : options.mediaSource.DefaultSecondarySubtitleStreamIndex; + if (this.#secondarySubtitleTrackIndexToSetOnPlaying != null && this.#secondarySubtitleTrackIndexToSetOnPlaying >= 0) { + const initialSecondarySubtitleStream = options.mediaSource.MediaStreams[this.#secondarySubtitleTrackIndexToSetOnPlaying]; + if (!initialSecondarySubtitleStream || initialSecondarySubtitleStream.DeliveryMethod !== 'External') { + this.#secondarySubtitleTrackIndexToSetOnPlaying = -1; + } } + } else { + this.#secondarySubtitleTrackIndexToSetOnPlaying = -1; } const crossOrigin = getCrossOriginValue(options.mediaSource); From 95a705a893814bd06cc01a71cb179bf6aad6af0c Mon Sep 17 00:00:00 2001 From: Ivan Schurawel <30599893+is343@users.noreply.github.com> Date: Sun, 19 Feb 2023 11:58:36 -0500 Subject: [PATCH 068/156] Update src/components/playback/playbackmanager.js Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/components/playback/playbackmanager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index fe50820b50..587705b1f8 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1598,7 +1598,7 @@ class PlaybackManager { // Secondary subtitles are currently only handled client side // Changes to the server code are required before we can handle other delivery methods - if (newStream && getDeliveryMethod(newStream) !== 'External') { + if (newStream && !self.trackHasSecondarySubtitleSupport(newStream, player)) { return; } From 4ca927991f04ed2028c89fdbf336ea83226947b8 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel <30599893+is343@users.noreply.github.com> Date: Sun, 19 Feb 2023 11:58:52 -0500 Subject: [PATCH 069/156] Update src/plugins/htmlVideoPlayer/plugin.js Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/plugins/htmlVideoPlayer/plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 4a9d1a7bf9..f2a2b8d30b 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -495,7 +495,7 @@ function tryRemoveElement(elem) { this.#secondarySubtitleTrackIndexToSetOnPlaying = options.mediaSource.DefaultSecondarySubtitleStreamIndex == null ? -1 : options.mediaSource.DefaultSecondarySubtitleStreamIndex; if (this.#secondarySubtitleTrackIndexToSetOnPlaying != null && this.#secondarySubtitleTrackIndexToSetOnPlaying >= 0) { const initialSecondarySubtitleStream = options.mediaSource.MediaStreams[this.#secondarySubtitleTrackIndexToSetOnPlaying]; - if (!initialSecondarySubtitleStream || initialSecondarySubtitleStream.DeliveryMethod !== 'External') { + if (!initialSecondarySubtitleStream || !playbackManager.trackHasSecondarySubtitleSupport(initialSecondarySubtitleStream, this)) { this.#secondarySubtitleTrackIndexToSetOnPlaying = -1; } } From 3c0ace33865b0852769e31ef224548e87fa9c46d Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Sun, 19 Feb 2023 12:50:12 -0500 Subject: [PATCH 070/156] fix: ensure secondary index is valid --- src/components/playback/playbackmanager.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 587705b1f8..6d95f4b9a2 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2387,7 +2387,11 @@ class PlaybackManager { console.debug(`AutoSet ${streamType} - Using ${bestStreamIndex} score ${bestStreamScore}.`); if (streamType == 'Subtitle') { if (isSecondarySubtitle) { - mediaSource.DefaultSecondarySubtitleStreamIndex = bestStreamIndex; + if (self.trackHasSecondarySubtitleSupport(mediaSource.MediaStreams[bestStreamIndex])) { + mediaSource.DefaultSecondarySubtitleStreamIndex = bestStreamIndex; + } else { + mediaSource.DefaultSecondarySubtitleStreamIndex = -1; + } } else { mediaSource.DefaultSubtitleStreamIndex = bestStreamIndex; } From 50eb5f277d4fae10423354b1b572138e009bcfa1 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Sun, 19 Feb 2023 13:09:37 -0500 Subject: [PATCH 071/156] fix: check if primary supports secondary track --- src/components/playback/playbackmanager.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 6d95f4b9a2..16e617f36e 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -3017,7 +3017,11 @@ class PlaybackManager { if (mediaSource) { playerData.audioStreamIndex = mediaSource.DefaultAudioStreamIndex; playerData.subtitleStreamIndex = mediaSource.DefaultSubtitleStreamIndex; - playerData.secondarySubtitleStreamIndex = mediaSource.DefaultSecondarySubtitleStreamIndex; + if (self.trackHasSecondarySubtitleSupport(mediaSource.MediaStreams[mediaSource.DefaultSubtitleStreamIndex])) { + playerData.secondarySubtitleStreamIndex = mediaSource.DefaultSecondarySubtitleStreamIndex; + } else { + playerData.secondarySubtitleStreamIndex = -1; + } } else { playerData.audioStreamIndex = null; playerData.subtitleStreamIndex = null; From 3d3a0c43b3e4e4e851a564b9e9e4a762856ed6d6 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Sun, 19 Feb 2023 15:40:36 -0500 Subject: [PATCH 072/156] chore: ensure check has valid track --- src/components/playback/playbackmanager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 16e617f36e..e3a73b7bf3 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -891,7 +891,7 @@ class PlaybackManager { * - or if it can be paired with a secondary subtitle when used as a primary subtitle */ self.trackHasSecondarySubtitleSupport = function (track, player = self._currentPlayer) { - if (!player) return false; + if (!player || !track) return false; const format = (track.Codec || '').toLowerCase(); // Currently, only non-SSA/non-ASS external subtitles are supported. // Showing secondary subtitles does not work with any SSA/ASS subtitle combinations because From 698abb929b74946150d54d409164fcc8d918b984 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Sun, 19 Feb 2023 16:40:12 -0500 Subject: [PATCH 073/156] Revert "fix: check if primary supports secondary track" This reverts commit e3e0348daeded50ed641c8def9a2619aff4f49bf. --- src/components/playback/playbackmanager.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index e3a73b7bf3..84def75483 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -3017,11 +3017,7 @@ class PlaybackManager { if (mediaSource) { playerData.audioStreamIndex = mediaSource.DefaultAudioStreamIndex; playerData.subtitleStreamIndex = mediaSource.DefaultSubtitleStreamIndex; - if (self.trackHasSecondarySubtitleSupport(mediaSource.MediaStreams[mediaSource.DefaultSubtitleStreamIndex])) { - playerData.secondarySubtitleStreamIndex = mediaSource.DefaultSecondarySubtitleStreamIndex; - } else { - playerData.secondarySubtitleStreamIndex = -1; - } + playerData.secondarySubtitleStreamIndex = mediaSource.DefaultSecondarySubtitleStreamIndex; } else { playerData.audioStreamIndex = null; playerData.subtitleStreamIndex = null; From ab75013d60f88f95bac5607d31d17c0e23ea545b Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Sun, 19 Feb 2023 16:40:47 -0500 Subject: [PATCH 074/156] Revert "fix: ensure secondary index is valid" This reverts commit 01dfad4996d2bdc96a8506b6d0c4542bfd15bc3b. --- src/components/playback/playbackmanager.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 84def75483..34e83eb683 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2387,11 +2387,7 @@ class PlaybackManager { console.debug(`AutoSet ${streamType} - Using ${bestStreamIndex} score ${bestStreamScore}.`); if (streamType == 'Subtitle') { if (isSecondarySubtitle) { - if (self.trackHasSecondarySubtitleSupport(mediaSource.MediaStreams[bestStreamIndex])) { - mediaSource.DefaultSecondarySubtitleStreamIndex = bestStreamIndex; - } else { - mediaSource.DefaultSecondarySubtitleStreamIndex = -1; - } + mediaSource.DefaultSecondarySubtitleStreamIndex = bestStreamIndex; } else { mediaSource.DefaultSubtitleStreamIndex = bestStreamIndex; } From 0ebf6c68995298fe66a7d0fbff24608e4a3fa478 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Sun, 19 Feb 2023 16:53:52 -0500 Subject: [PATCH 075/156] chore: simplify valid secondary track checks --- src/components/playback/playbackmanager.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 34e83eb683..2b8bd21280 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2486,6 +2486,19 @@ class PlaybackManager { const user = await apiClient.getCurrentUser(); autoSetNextTracks(prevSource, mediaSource, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections); + if (mediaSource.DefaultSubtitleStreamIndex == null || mediaSource.DefaultSubtitleStreamIndex < 0) { + mediaSource.DefaultSubtitleStreamIndex = mediaSource.DefaultSecondarySubtitleStreamIndex; + mediaSource.DefaultSecondarySubtitleStreamIndex = -1; + } + + const subtitleTrack1 = mediaSource.MediaStreams[mediaSource.DefaultSubtitleStreamIndex]; + const subtitleTrack2 = mediaSource.MediaStreams[mediaSource.DefaultSecondarySubtitleStreamIndex]; + + if (!self.trackHasSecondarySubtitleSupport(subtitleTrack1, player) + || !self.trackHasSecondarySubtitleSupport(subtitleTrack2, player)) { + mediaSource.DefaultSecondarySubtitleStreamIndex = -1; + } + const streamInfo = createStreamInfo(apiClient, item.MediaType, item, mediaSource, startPosition, player); streamInfo.fullscreen = playOptions.fullscreen; From 4f24ccdbbcf82889425cecf2129c77c8831aa2e4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Feb 2023 01:58:22 +0000 Subject: [PATCH 076/156] Update React --- package-lock.json | 64 +++++++++++++++++++++++------------------------ package.json | 4 +-- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index a06ce5f18e..9a8999a872 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "pdfjs-dist": "2.16.105", "react": "17.0.2", "react-dom": "17.0.2", - "react-router-dom": "6.8.0", + "react-router-dom": "6.8.1", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.0", @@ -67,7 +67,7 @@ "@types/loadable__component": "5.13.4", "@types/lodash-es": "4.17.6", "@types/react": "17.0.53", - "@types/react-dom": "17.0.18", + "@types/react-dom": "17.0.19", "@typescript-eslint/eslint-plugin": "5.51.0", "@typescript-eslint/parser": "5.51.0", "@uupaa/dynamic-import-polyfill": "1.0.2", @@ -2742,9 +2742,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.1.tgz", - "integrity": "sha512-+eun1Wtf72RNRSqgU7qM2AMX/oHp+dnx7BHk1qhK5ZHzdHTUU4LA1mGG1vT+jMc8sbhG3orvsfOmryjzx2PzQw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.2.tgz", + "integrity": "sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==", "engines": { "node": ">=14" } @@ -3069,9 +3069,9 @@ } }, "node_modules/@types/react-dom": { - "version": "17.0.18", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.18.tgz", - "integrity": "sha512-rLVtIfbwyur2iFKykP2w0pl/1unw26b5td16d5xMgp7/yjTHomkyxPYChFoCr/FtEX1lN9wY6lFj1qvKdS5kDw==", + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.19.tgz", + "integrity": "sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==", "dev": true, "dependencies": { "@types/react": "^17" @@ -13097,11 +13097,11 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-router": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.0.tgz", - "integrity": "sha512-760bk7y3QwabduExtudhWbd88IBbuD1YfwzpuDUAlJUJ7laIIcqhMvdhSVh1Fur1PE8cGl84L0dxhR3/gvHF7A==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.1.tgz", + "integrity": "sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==", "dependencies": { - "@remix-run/router": "1.3.1" + "@remix-run/router": "1.3.2" }, "engines": { "node": ">=14" @@ -13111,12 +13111,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.0.tgz", - "integrity": "sha512-hQouduSTywGJndE86CXJ2h7YEy4HYC6C/uh19etM+79FfQ6cFFFHnHyDlzO4Pq0eBUI96E4qVE5yUjA00yJZGQ==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.1.tgz", + "integrity": "sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==", "dependencies": { - "@remix-run/router": "1.3.1", - "react-router": "6.8.0" + "@remix-run/router": "1.3.2", + "react-router": "6.8.1" }, "engines": { "node": ">=14" @@ -20956,9 +20956,9 @@ } }, "@remix-run/router": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.1.tgz", - "integrity": "sha512-+eun1Wtf72RNRSqgU7qM2AMX/oHp+dnx7BHk1qhK5ZHzdHTUU4LA1mGG1vT+jMc8sbhG3orvsfOmryjzx2PzQw==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.2.tgz", + "integrity": "sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==" }, "@rollup/plugin-babel": { "version": "5.3.1", @@ -21251,9 +21251,9 @@ } }, "@types/react-dom": { - "version": "17.0.18", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.18.tgz", - "integrity": "sha512-rLVtIfbwyur2iFKykP2w0pl/1unw26b5td16d5xMgp7/yjTHomkyxPYChFoCr/FtEX1lN9wY6lFj1qvKdS5kDw==", + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.19.tgz", + "integrity": "sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==", "dev": true, "requires": { "@types/react": "^17" @@ -28632,20 +28632,20 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-router": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.0.tgz", - "integrity": "sha512-760bk7y3QwabduExtudhWbd88IBbuD1YfwzpuDUAlJUJ7laIIcqhMvdhSVh1Fur1PE8cGl84L0dxhR3/gvHF7A==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.1.tgz", + "integrity": "sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==", "requires": { - "@remix-run/router": "1.3.1" + "@remix-run/router": "1.3.2" } }, "react-router-dom": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.0.tgz", - "integrity": "sha512-hQouduSTywGJndE86CXJ2h7YEy4HYC6C/uh19etM+79FfQ6cFFFHnHyDlzO4Pq0eBUI96E4qVE5yUjA00yJZGQ==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.1.tgz", + "integrity": "sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==", "requires": { - "@remix-run/router": "1.3.1", - "react-router": "6.8.0" + "@remix-run/router": "1.3.2", + "react-router": "6.8.1" } }, "read-file-stdin": { diff --git a/package.json b/package.json index f664622998..8f607916e0 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "@types/loadable__component": "5.13.4", "@types/lodash-es": "4.17.6", "@types/react": "17.0.53", - "@types/react-dom": "17.0.18", + "@types/react-dom": "17.0.19", "@typescript-eslint/eslint-plugin": "5.51.0", "@typescript-eslint/parser": "5.51.0", "@uupaa/dynamic-import-polyfill": "1.0.2", @@ -102,7 +102,7 @@ "pdfjs-dist": "2.16.105", "react": "17.0.2", "react-dom": "17.0.2", - "react-router-dom": "6.8.0", + "react-router-dom": "6.8.1", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.0", From 009589b6c276bcf95d4fd0b2cbb7c0e08d0867ba Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Feb 2023 02:04:40 +0000 Subject: [PATCH 077/156] Update dependency sass to v1.58.1 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a8999a872..ceb26bdb05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -98,7 +98,7 @@ "postcss-loader": "7.0.2", "postcss-preset-env": "8.0.1", "postcss-scss": "4.0.6", - "sass": "1.58.0", + "sass": "1.58.1", "sass-loader": "13.2.0", "source-map-loader": "4.0.1", "style-loader": "3.3.1", @@ -13672,9 +13672,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.0.tgz", - "integrity": "sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg==", + "version": "1.58.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz", + "integrity": "sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -29068,9 +29068,9 @@ "dev": true }, "sass": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.0.tgz", - "integrity": "sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg==", + "version": "1.58.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz", + "integrity": "sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 8f607916e0..5799b9d5bd 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "postcss-loader": "7.0.2", "postcss-preset-env": "8.0.1", "postcss-scss": "4.0.6", - "sass": "1.58.0", + "sass": "1.58.1", "sass-loader": "13.2.0", "source-map-loader": "4.0.1", "style-loader": "3.3.1", From ed5fd855d712f2c3fc69893b9939ac3d5ca66857 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Feb 2023 02:05:24 +0000 Subject: [PATCH 078/156] Update Linters --- package-lock.json | 180 +++++++++++++++++++++++----------------------- package.json | 6 +- 2 files changed, 93 insertions(+), 93 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a8999a872..1976317dd1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,8 +68,8 @@ "@types/lodash-es": "4.17.6", "@types/react": "17.0.53", "@types/react-dom": "17.0.19", - "@typescript-eslint/eslint-plugin": "5.51.0", - "@typescript-eslint/parser": "5.51.0", + "@typescript-eslint/eslint-plugin": "5.52.0", + "@typescript-eslint/parser": "5.52.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.13", "babel-loader": "9.1.2", @@ -106,7 +106,7 @@ "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.2", - "stylelint-scss": "4.3.0", + "stylelint-scss": "4.4.0", "ts-loader": "9.4.2", "typescript": "4.9.5", "webpack": "5.75.0", @@ -3175,14 +3175,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz", - "integrity": "sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", + "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/type-utils": "5.51.0", - "@typescript-eslint/utils": "5.51.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/type-utils": "5.52.0", + "@typescript-eslint/utils": "5.52.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -3224,14 +3224,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.51.0.tgz", - "integrity": "sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", + "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", "debug": "^4.3.4" }, "engines": { @@ -3251,13 +3251,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", - "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0" + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3268,13 +3268,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz", - "integrity": "sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", + "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.51.0", - "@typescript-eslint/utils": "5.51.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/utils": "5.52.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3295,9 +3295,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", - "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3308,13 +3308,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", - "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3379,16 +3379,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz", - "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", + "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -3420,12 +3420,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", - "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/types": "5.52.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -17059,9 +17059,9 @@ } }, "node_modules/stylelint-scss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.3.0.tgz", - "integrity": "sha512-GvSaKCA3tipzZHoz+nNO7S02ZqOsdBzMiCx9poSmLlb3tdJlGddEX/8QzCOD8O7GQan9bjsvLMsO5xiw6IhhIQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.4.0.tgz", + "integrity": "sha512-Qy66a+/30aylFhPmUArHhVsHOun1qrO93LGT15uzLuLjWS7hKDfpFm34mYo1ndR4MCo8W4bEZM1+AlJRJORaaw==", "dev": true, "dependencies": { "lodash": "^4.17.21", @@ -17071,7 +17071,7 @@ "postcss-value-parser": "^4.1.0" }, "peerDependencies": { - "stylelint": "^14.5.1" + "stylelint": "^14.5.1 || ^15.0.0" } }, "node_modules/stylelint/node_modules/array-union": { @@ -21356,14 +21356,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz", - "integrity": "sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", + "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/type-utils": "5.51.0", - "@typescript-eslint/utils": "5.51.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/type-utils": "5.52.0", + "@typescript-eslint/utils": "5.52.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -21385,53 +21385,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.51.0.tgz", - "integrity": "sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", + "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", - "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0" + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" } }, "@typescript-eslint/type-utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz", - "integrity": "sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", + "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.51.0", - "@typescript-eslint/utils": "5.51.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/utils": "5.52.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", - "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", - "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -21471,16 +21471,16 @@ } }, "@typescript-eslint/utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz", - "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", + "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -21498,12 +21498,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", - "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/types": "5.52.0", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { @@ -31858,9 +31858,9 @@ } }, "stylelint-scss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.3.0.tgz", - "integrity": "sha512-GvSaKCA3tipzZHoz+nNO7S02ZqOsdBzMiCx9poSmLlb3tdJlGddEX/8QzCOD8O7GQan9bjsvLMsO5xiw6IhhIQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.4.0.tgz", + "integrity": "sha512-Qy66a+/30aylFhPmUArHhVsHOun1qrO93LGT15uzLuLjWS7hKDfpFm34mYo1ndR4MCo8W4bEZM1+AlJRJORaaw==", "dev": true, "requires": { "lodash": "^4.17.21", diff --git a/package.json b/package.json index 8f607916e0..b5b208c8b0 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "@types/lodash-es": "4.17.6", "@types/react": "17.0.53", "@types/react-dom": "17.0.19", - "@typescript-eslint/eslint-plugin": "5.51.0", - "@typescript-eslint/parser": "5.51.0", + "@typescript-eslint/eslint-plugin": "5.52.0", + "@typescript-eslint/parser": "5.52.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.13", "babel-loader": "9.1.2", @@ -57,7 +57,7 @@ "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.2", - "stylelint-scss": "4.3.0", + "stylelint-scss": "4.4.0", "ts-loader": "9.4.2", "typescript": "4.9.5", "webpack": "5.75.0", From 4b6f072bef1633300cca2c393e8b3c09a2fca8e1 Mon Sep 17 00:00:00 2001 From: lyaschuchenko Date: Wed, 22 Feb 2023 07:41:54 +0000 Subject: [PATCH 079/156] Translated using Weblate (Ukrainian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/ --- src/strings/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/uk.json b/src/strings/uk.json index 07b7b3c2a0..2168357faf 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -1329,7 +1329,7 @@ "OptionEnableM2tsMode": "Увімкнути режим M2TS", "OptionEnableForAllTuners": "Увімкнути для всіх пристроїв тюнера", "OptionEnableExternalContentInSuggestionsHelp": "Дозволити включати інтернет-трейлери та телепрограми в прямому ефірі до запропонованого вмісту.", - "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", + "OptionCaptionInfoExSamsung": "Функція CaptionInfoEx (Samsung)", "OptionEnableExternalContentInSuggestions": "Увімкнути зовнішній вміст у пропозиціях", "OptionEnableAccessToAllLibraries": "Увімкнути доступ до всіх медіатек", "OptionEnableAccessToAllChannels": "Увімкнути доступ до всіх каналів", From 721a766ca2606b80beafa45d0e73ecca7c6a6408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Wed, 22 Feb 2023 18:02:28 +0000 Subject: [PATCH 080/156] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index 839e85f4f7..78acddc0c0 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1703,5 +1703,6 @@ "LabelChapterImageResolutionHelp": "Rozližení extrahovaných obrázků kapitol.", "ResolutionMatchSource": "Stejné jako zdroj", "PreferEmbeddedExtrasTitlesOverFileNames": "Preferovat vložené názvy před názvy souborů pro doplňky", - "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Doplňky většinou mají stejný vložený název jako nadřazená položka. Zaškrtnutím je i přesto můžete upřednostnit." + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Doplňky většinou mají stejný vložený název jako nadřazená položka. Zaškrtnutím je i přesto můžete upřednostnit.", + "SecondarySubtitles": "Sekundární titulky" } From 488bb4248a8aeb112db1f6ea54b714f23fd58a71 Mon Sep 17 00:00:00 2001 From: Bas Date: Wed, 22 Feb 2023 18:30:31 +0000 Subject: [PATCH 081/156] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 543962164b..44d8eab396 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -366,7 +366,7 @@ "HeaderTranscodingProfile": "Direct Afspelen Profiel", "HeaderTranscodingProfileHelp": "Transcoding profielen toevoegen om aan te geven welke indelingen moeten worden gebruikt wanneer transcoding vereist is.", "HeaderTunerDevices": "Tuner apparaten", - "HeaderTypeImageFetchers": "Afbeelding downloaders ({0}):", + "HeaderTypeImageFetchers": "Ophalers afbeeldingen ({0}):", "HeaderTypeText": "Voer tekst in", "HeaderUpcomingOnTV": "Binnenkort op tv", "HeaderUploadImage": "Afbeelding Uploaden", @@ -504,7 +504,7 @@ "LabelHardwareAccelerationType": "Hardware acceleratie:", "LabelHardwareAccelerationTypeHelp": "Hardwarematige versnelling vereist extra configuratie.", "LabelHomeNetworkQuality": "Thuisnetwerk kwaliteit:", - "LabelHomeScreenSectionValue": "Beginscherm sectie {0}:", + "LabelHomeScreenSectionValue": "Beginschermsectie {0}:", "LabelHttpsPort": "Lokale HTTPS poort nummer:", "LabelHttpsPortHelp": "Het TCP poort nummer voor de HTTPS server.", "LabelIconMaxHeight": "Pictogram maximum hoogte:", @@ -735,7 +735,7 @@ "MessageConfirmRevokeApiKey": "Weet u zeker dat u deze API-sleutel in wilt trekken? De verbinding van de applicatie met deze server zal plotseling verbroken worden.", "MessageConfirmShutdown": "Weet u zeker dat u de server wilt afsluiten?", "MessageContactAdminToResetPassword": "Neem contact op met de serverbeheerder om uw wachtwoord te resetten.", - "MessageCreateAccountAt": "Maak een account bij {0}", + "MessageCreateAccountAt": "Account aanmaken bij {0}", "MessageDeleteTaskTrigger": "Weet u zeker dat u deze signaal taak wilt verwijderen?", "MessageDirectoryPickerBSDInstruction": "Voor BSD moet u mogelijk de opslag in uw FreeNAS Jail opzetten, zodat Jellyfin toegang heeft tot uw media.", "MessageDirectoryPickerLinuxInstruction": "Voor Linux op Arch Linux, CentOS, Debian, Fedora, openSUSE, of Ubuntu, moet u de service-gebruiker ten minste leestoegang tot uw opslaglocaties verlenen.", @@ -928,8 +928,8 @@ "Raised": "Verhoogd", "Rate": "Waardeer", "RecentlyWatched": "Onlangs bekeken", - "RecommendationBecauseYouLike": "Omdat u {0} leuk vond", - "RecommendationBecauseYouWatched": "Omdat u keek naar {0}", + "RecommendationBecauseYouLike": "Omdat je {0} leuk vindt", + "RecommendationBecauseYouWatched": "Omdat je keek naar {0}", "RecommendationDirectedBy": "Geregisseerd door {0}", "RecommendationStarring": "In de hoofdrollen {0}", "Record": "Opnemen", @@ -991,7 +991,7 @@ "Shuffle": "Willekeurig", "SimultaneousConnectionLimitHelp": "Het maximum aantal toegestane gelijktijdige streams. Geef 0 in voor geen limiet.", "SkipEpisodesAlreadyInMyLibrary": "Neem geen afleveringen op die al in mijn bibliotheek aanwezig zijn", - "SkipEpisodesAlreadyInMyLibraryHelp": "Afleveringen zullen worden vergeleken met behulp van seizoen en aflevering nummers, indien beschikbaar.", + "SkipEpisodesAlreadyInMyLibraryHelp": "Afleveringen zullen worden vergeleken met behulp van seizoens- en afleveringsnummers, indien beschikbaar.", "Small": "Klein", "SmallCaps": "Kleine letters", "Smaller": "Kleiner", @@ -1059,7 +1059,7 @@ "ValueConditions": "Voorwaarden: {0}", "ValueEpisodeCount": "{0} afleveringen", "ValueMovieCount": "{0} films", - "ValueMusicVideoCount": "{0} muziek video's", + "ValueMusicVideoCount": "{0} muziekvideo's", "ValueOneEpisode": "1 aflevering", "ValueOneMovie": "1 film", "ValueOneMusicVideo": "1 muziekvideo", @@ -1265,7 +1265,7 @@ "EveryXMinutes": "Elke {0} minuten", "OnWakeFromSleep": "Op het wakker worden vanuit slaapstand", "WeeklyAt": "{0}s op {1}", - "DailyAt": "Dagelijks op {0}", + "DailyAt": "Dagelijks om {0}", "LastSeen": "Laatst gezien {0}", "PersonRole": "als {0}", "ListPaging": "{0}-{1} van de {2}", @@ -1292,7 +1292,7 @@ "MessageSyncPlayGroupDoesNotExist": "Kan niet deelnemen aan de groep omdat deze niet bestaat.", "MessageSyncPlayPlaybackPermissionRequired": "Afspeelrechten vereist.", "MessageSyncPlayGroupWait": "{0} is aan het bufferen…", - "MessageSyncPlayUserLeft": "{0} i heeft de groep verlaten.", + "MessageSyncPlayUserLeft": "{0} heeft de groep verlaten.", "MessageSyncPlayUserJoined": "{0} is lid geworden van de groep.", "MessageSyncPlayDisabled": "SyncPlay uitgeschakeld.", "MessageSyncPlayEnabled": "SyncPlay ingeschakeld.", @@ -1702,5 +1702,6 @@ "HeaderDummyChapter": "Hoofdstukafbeeldingen", "LabelDummyChapterDurationHelp": "De extractieinterval voor hoofdstukafbeeldingen in seconden.", "ResolutionMatchSource": "Gelijk aan bron", - "HeaderRecordingMetadataSaving": "Metadata opname" + "HeaderRecordingMetadataSaving": "Metadata opname", + "SecondarySubtitles": "Secundaire ondertiteling" } From ca51355e9e7650aa598f91ae2b42465c6b416e26 Mon Sep 17 00:00:00 2001 From: blob03 Date: Wed, 22 Feb 2023 20:12:14 +0000 Subject: [PATCH 082/156] 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 d742a3d561..859cbd8640 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1703,5 +1703,6 @@ "LabelDummyChapterDuration": "Intervalle :", "LabelDummyChapterCountHelp": "Nombre maximal d’images de chapitre à extraire pour chaque fichier multimédia.", "PreferEmbeddedExtrasTitlesOverFileNames": "Préférer les titres intégrés aux médias pour les bonus", - "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Les bonus possèdent souvent un titre intégré identique au média parent, cocher l'option pour utiliser ce titre quoi qu'il en soit." + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Les bonus possèdent souvent un titre intégré identique au média parent, cocher l'option pour utiliser ce titre quoi qu'il en soit.", + "SecondarySubtitles": "Sous-titres secondaires" } From db51d280c469bc2cc9b15df35090000169602106 Mon Sep 17 00:00:00 2001 From: Pranav Avva Date: Wed, 22 Feb 2023 20:27:55 +0000 Subject: [PATCH 083/156] Translated using Weblate (Hindi) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hi/ --- src/strings/hi-in.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/strings/hi-in.json b/src/strings/hi-in.json index 46c2072174..32dd0870a8 100644 --- a/src/strings/hi-in.json +++ b/src/strings/hi-in.json @@ -141,5 +141,11 @@ "ButtonSubmit": "प्रस्तुत करें", "ButtonTogglePlaylist": "प्लेलिस्ट", "ButtonUninstall": "ऐप हटाएं", - "ButtonTrailer": "ट्रेलर" + "ButtonTrailer": "ट्रेलर", + "Large": "बड़ा", + "Small": "छोटा", + "Normal": "सामान्य", + "Songs": "गाने", + "Larger": "और बड़ा", + "ListPaging": "{2} का {0}-{1}" } From 92362e30068ebe6b12177650e7abe0fc495f4955 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Feb 2023 23:52:00 +0000 Subject: [PATCH 084/156] Update dependency cssnano to v5.1.15 --- package-lock.json | 86 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1aba4abd48..865a514c68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,7 +79,7 @@ "copy-webpack-plugin": "11.0.0", "cross-env": "7.0.3", "css-loader": "6.7.3", - "cssnano": "5.1.14", + "cssnano": "5.1.15", "es-check": "7.1.0", "eslint": "8.34.0", "eslint-plugin-compat": "4.1.1", @@ -5455,12 +5455,12 @@ } }, "node_modules/cssnano": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", - "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", "dev": true, "dependencies": { - "cssnano-preset-default": "^5.2.13", + "cssnano-preset-default": "^5.2.14", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -5476,22 +5476,22 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", - "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dev": true, "dependencies": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", + "postcss-colormin": "^5.3.1", "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.3", + "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", "postcss-minify-params": "^5.1.4", @@ -5506,7 +5506,7 @@ "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.1", + "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -9990,7 +9990,7 @@ "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, "node_modules/logform": { @@ -11388,12 +11388,12 @@ } }, "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" @@ -12101,9 +12101,9 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", - "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dev": true, "dependencies": { "browserslist": "^4.21.4", @@ -12571,9 +12571,9 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", - "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dev": true, "dependencies": { "browserslist": "^4.21.4", @@ -23025,33 +23025,33 @@ "dev": true }, "cssnano": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", - "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", "dev": true, "requires": { - "cssnano-preset-default": "^5.2.13", + "cssnano-preset-default": "^5.2.14", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", - "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dev": true, "requires": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", + "postcss-colormin": "^5.3.1", "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.3", + "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", "postcss-minify-params": "^5.1.4", @@ -23066,7 +23066,7 @@ "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.1", + "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -26456,7 +26456,7 @@ "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, "logform": { @@ -27476,12 +27476,12 @@ } }, "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" @@ -27971,9 +27971,9 @@ } }, "postcss-merge-rules": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", - "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dev": true, "requires": { "browserslist": "^4.21.4", @@ -28262,9 +28262,9 @@ } }, "postcss-reduce-initial": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", - "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dev": true, "requires": { "browserslist": "^4.21.4", diff --git a/package.json b/package.json index e1d25ca0a4..1b8b771097 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "copy-webpack-plugin": "11.0.0", "cross-env": "7.0.3", "css-loader": "6.7.3", - "cssnano": "5.1.14", + "cssnano": "5.1.15", "es-check": "7.1.0", "eslint": "8.34.0", "eslint-plugin-compat": "4.1.1", From f5b255c9f22dd429e5cc798e9803d31758c4970c Mon Sep 17 00:00:00 2001 From: Oskari Lavinto Date: Thu, 23 Feb 2023 01:12:04 +0000 Subject: [PATCH 085/156] Translated using Weblate (Finnish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/ --- src/strings/fi.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/fi.json b/src/strings/fi.json index 35b4abfc95..d2051489b4 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -1696,5 +1696,6 @@ "LabelChapterImageResolutionHelp": "Purettujen kappalekuvien resoluutio.", "ResolutionMatchSource": "Vastaa lähdettä", "PreferEmbeddedExtrasTitlesOverFileNames": "Suosi lisämateriaaleille upotettuja otsikoita tiedostonimien sijaan", - "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Lisämateriaaleilla on usein sama otsikko kuin niiden isännällä. Valitse tämä käyttääksesi silti upotettuja otsikoita." + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Lisämateriaaleilla on usein sama otsikko kuin niiden isännällä. Valitse tämä käyttääksesi silti upotettuja otsikoita.", + "SecondarySubtitles": "Toissijaiset tekstitykset" } From 2da9c9cba8d503ed34317b840b5cfe9de738a81a Mon Sep 17 00:00:00 2001 From: TnZzZHlp Date: Thu, 23 Feb 2023 12:26:07 +0000 Subject: [PATCH 086/156] 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 818bf42ffd..cee2f4d006 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1703,5 +1703,6 @@ "LabelDummyChapterCount": "限制:", "LabelDummyChapterCountHelp": "每个媒体文件的最大章节图像提取数。", "LabelChapterImageResolution": "分辨率:", - "LabelChapterImageResolutionHelp": "提取的章节图像的分辨率。" + "LabelChapterImageResolutionHelp": "提取的章节图像的分辨率。", + "SecondarySubtitles": "次字幕" } From b230b0cd9c99cbe75c61403c5e246eb63e6301e1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Feb 2023 19:52:27 +0000 Subject: [PATCH 087/156] Update dependency eslint-plugin-compat to v4.1.2 --- package-lock.json | 22 ++++++++++------------ package.json | 2 +- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1aba4abd48..b1cc230c6c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -82,7 +82,7 @@ "cssnano": "5.1.14", "es-check": "7.1.0", "eslint": "8.34.0", - "eslint-plugin-compat": "4.1.1", + "eslint-plugin-compat": "4.1.2", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.27.5", "eslint-plugin-jsx-a11y": "6.7.1", @@ -6504,22 +6504,21 @@ } }, "node_modules/eslint-plugin-compat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.1.1.tgz", - "integrity": "sha512-vUAaqKcDwXpVASyCAfKzkfaw3NxZ6FqeCNSGp7yqHpUMzkAiWRO0B6pR5zqh8RUhvybwXhPXvwVKDLr9GqGFUQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.1.2.tgz", + "integrity": "sha512-DNrQgDi5L4mAL4FdFboKBlSRg6MWfd75eA7K91lMjtP5ryN+O11qT2FDn7Z6zqy6sZ4sJawUR5V75qzB6l0CBg==", "dev": true, "dependencies": { "@mdn/browser-compat-data": "^5.2.34", "ast-metadata-inferer": "^0.7.0", "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001450", - "core-js": "^3.27.2", + "caniuse-lite": "^1.0.30001451", "find-up": "^5.0.0", "lodash.memoize": "4.1.2", "semver": "7.3.8" }, "engines": { - "node": ">=9.x" + "node": ">=16.x" }, "peerDependencies": { "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" @@ -24046,16 +24045,15 @@ } }, "eslint-plugin-compat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.1.1.tgz", - "integrity": "sha512-vUAaqKcDwXpVASyCAfKzkfaw3NxZ6FqeCNSGp7yqHpUMzkAiWRO0B6pR5zqh8RUhvybwXhPXvwVKDLr9GqGFUQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.1.2.tgz", + "integrity": "sha512-DNrQgDi5L4mAL4FdFboKBlSRg6MWfd75eA7K91lMjtP5ryN+O11qT2FDn7Z6zqy6sZ4sJawUR5V75qzB6l0CBg==", "dev": true, "requires": { "@mdn/browser-compat-data": "^5.2.34", "ast-metadata-inferer": "^0.7.0", "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001450", - "core-js": "^3.27.2", + "caniuse-lite": "^1.0.30001451", "find-up": "^5.0.0", "lodash.memoize": "4.1.2", "semver": "7.3.8" diff --git a/package.json b/package.json index e1d25ca0a4..24d3325686 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "cssnano": "5.1.14", "es-check": "7.1.0", "eslint": "8.34.0", - "eslint-plugin-compat": "4.1.1", + "eslint-plugin-compat": "4.1.2", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.27.5", "eslint-plugin-jsx-a11y": "6.7.1", From c16c6269a2226dec0ded0b5e490511d0cd726486 Mon Sep 17 00:00:00 2001 From: Ian Walton Date: Thu, 23 Feb 2023 23:05:48 -0500 Subject: [PATCH 088/156] Add dashboard to pluginManager exported functions. --- src/components/pluginManager.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index 80899d8bed..0f9a04091d 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -8,6 +8,7 @@ import { appRouter } from '../components/appRouter'; import * as inputManager from '../scripts/inputManager'; import toast from '../components/toast/toast'; import confirm from '../components/confirm/confirm'; +import * as dashboard from '../utils/dashboard'; // TODO: replace with each plugin version const cacheParam = new Date().getTime(); @@ -86,7 +87,8 @@ class PluginManager { appRouter, inputManager, toast, - confirm + confirm, + dashboard }); } else { console.debug(`Loading plugin (via dynamic import): ${pluginSpec}`); From 66dcbd59ca3e5a12fa5dc3ba7831b50de79fc195 Mon Sep 17 00:00:00 2001 From: Ian Walton Date: Thu, 23 Feb 2023 23:07:55 -0500 Subject: [PATCH 089/156] Add ServerConnections to pluginManager exported functions. --- src/components/pluginManager.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index 0f9a04091d..763f0eb2d1 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -9,6 +9,7 @@ import * as inputManager from '../scripts/inputManager'; import toast from '../components/toast/toast'; import confirm from '../components/confirm/confirm'; import * as dashboard from '../utils/dashboard'; +import ServerConnections from '../components/ServerConnections'; // TODO: replace with each plugin version const cacheParam = new Date().getTime(); @@ -88,7 +89,8 @@ class PluginManager { inputManager, toast, confirm, - dashboard + dashboard, + ServerConnections }); } else { console.debug(`Loading plugin (via dynamic import): ${pluginSpec}`); From 6eb760b03ca438bd7a334e0e930bb777a6671856 Mon Sep 17 00:00:00 2001 From: Valentin COMTE Date: Fri, 24 Feb 2023 04:43:16 +0000 Subject: [PATCH 090/156] Translated using Weblate (English (United Kingdom)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/ --- src/strings/en-gb.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index fd3cd5de27..a4e975a8a5 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -1703,5 +1703,6 @@ "ResolutionMatchSource": "Match Source", "SaveRecordingNFO": "Save recording EPG metadata in NFO", "PreferEmbeddedExtrasTitlesOverFileNames": "Prefer embedded titles over filenames for extras", - "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Extras often have the same embedded name as the parent, check this to use embedded titles for them anyway." + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Extras often have the same embedded name as the parent, check this to use embedded titles for them anyway.", + "SecondarySubtitles": "Secondary Subtitles" } From 527489af06d38643657372af6b9341183da8ae22 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 24 Feb 2023 12:34:31 +0000 Subject: [PATCH 091/156] Update dependency blurhash to v2.0.5 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1aba4abd48..fda672c43a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@jellyfin/libass-wasm": "4.1.1", "@jellyfin/sdk": "unstable", "@loadable/component": "5.15.3", - "blurhash": "2.0.4", + "blurhash": "2.0.5", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", "core-js": "3.28.0", @@ -4278,9 +4278,9 @@ } }, "node_modules/blurhash": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.4.tgz", - "integrity": "sha512-r/As72u2FbucLoK5NTegM/GucxJc3d8GvHc4ngo13IO/nt2HU4gONxNLq1XPN6EM/V8Y9URIa7PcSz2RZu553A==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", + "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==" }, "node_modules/body-parser": { "version": "1.20.0", @@ -22160,9 +22160,9 @@ "dev": true }, "blurhash": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.4.tgz", - "integrity": "sha512-r/As72u2FbucLoK5NTegM/GucxJc3d8GvHc4ngo13IO/nt2HU4gONxNLq1XPN6EM/V8Y9URIa7PcSz2RZu553A==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", + "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==" }, "body-parser": { "version": "1.20.0", diff --git a/package.json b/package.json index e1d25ca0a4..5e8ceaa684 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "@jellyfin/libass-wasm": "4.1.1", "@jellyfin/sdk": "unstable", "@loadable/component": "5.15.3", - "blurhash": "2.0.4", + "blurhash": "2.0.5", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", "core-js": "3.28.0", From 34d903d85bdeb1d03e5bdbd183f72a91487058ca Mon Sep 17 00:00:00 2001 From: Kilian von Pflugk Date: Fri, 24 Feb 2023 20:06:38 +0000 Subject: [PATCH 092/156] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index e874f5d420..89856057b3 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1688,5 +1688,21 @@ "DownloadAll": "Alle Herunterladen", "LabelStereoDownmixAlgorithm": "Stereo Downmix Algorithmus", "StereoDownmixAlgorithmHelp": "Algorithmus um Mehrkanal-Audio zu Stereo-Audio umzuwandeln.", - "Experimental": "Experimentell" + "Experimental": "Experimentell", + "SaveRecordingNFO": "Speichern der EPG-Metadaten in NFO", + "SaveRecordingNFOHelp": "Speichern Sie Metadaten von EPG-Anbietern zusammen mit den Medien.", + "ResolutionMatchSource": "Quelle der Übereinstimmung", + "PreferEmbeddedExtrasTitlesOverFileNames": "Eingebettete Titel gegenüber Dateinamen für Extras bevorzugen", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Extras haben oft denselben eingebetteten Namen wie die übergeordnete Datei. Aktivieren Sie diese Option, um trotzdem eingebettete Titel für sie zu verwenden.", + "SaveRecordingImages": "Speichern der EPG-Bilder der Aufnahme", + "SaveRecordingImagesHelp": "Speichern Sie Bilder von EPG-Anbietern zusammen mit den Medien.", + "SecondarySubtitles": "Sekundäre Untertitel", + "HeaderDummyChapter": "Kapitel Bilder", + "HeaderRecordingMetadataSaving": "Aufzeichnung von Metadaten", + "LabelDummyChapterDuration": "Intervall:", + "LabelDummyChapterDurationHelp": "Das Intervall für die Extraktion des Kapitelbildes in Sekunden.", + "LabelDummyChapterCount": "Limit:", + "LabelDummyChapterCountHelp": "Die maximale Anzahl von Kapitelbildern, die für jede Mediendatei extrahiert werden.", + "LabelChapterImageResolution": "Auflösung:", + "LabelChapterImageResolutionHelp": "Die Auflösung der extrahierten Kapitelbilder." } From 1476542f4f40d09d82e1fe9c212d68fbd52b3400 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 03:13:31 +0000 Subject: [PATCH 093/156] Update dependency sass to v1.58.3 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b1cc230c6c..c90c1e92ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -98,7 +98,7 @@ "postcss-loader": "7.0.2", "postcss-preset-env": "8.0.1", "postcss-scss": "4.0.6", - "sass": "1.58.1", + "sass": "1.58.3", "sass-loader": "13.2.0", "source-map-loader": "4.0.1", "style-loader": "3.3.1", @@ -13671,9 +13671,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.58.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz", - "integrity": "sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==", + "version": "1.58.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", + "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -29066,9 +29066,9 @@ "dev": true }, "sass": { - "version": "1.58.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz", - "integrity": "sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==", + "version": "1.58.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", + "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 24d3325686..37024acb6f 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "postcss-loader": "7.0.2", "postcss-preset-env": "8.0.1", "postcss-scss": "4.0.6", - "sass": "1.58.1", + "sass": "1.58.3", "sass-loader": "13.2.0", "source-map-loader": "4.0.1", "style-loader": "3.3.1", From 793e9c73f72d855081d20c7a7766303aea442d24 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 03:13:38 +0000 Subject: [PATCH 094/156] Update github/codeql-action action to v2.2.5 --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 9162d3ca71..d0d11b4c5f 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -21,11 +21,11 @@ jobs: - name: Checkout repository uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 - name: Initialize CodeQL - uses: github/codeql-action/init@17573ee1cc1b9d061760f3a006fc4aac4f944fd5 # v2.2.4 + uses: github/codeql-action/init@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2.2.5 with: languages: ${{ matrix.language }} queries: +security-extended - name: Autobuild - uses: github/codeql-action/autobuild@17573ee1cc1b9d061760f3a006fc4aac4f944fd5 # v2.2.4 + uses: github/codeql-action/autobuild@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2.2.5 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@17573ee1cc1b9d061760f3a006fc4aac4f944fd5 # v2.2.4 + uses: github/codeql-action/analyze@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2.2.5 From c46802166c4292892c93c66e1b91641cf88e5f30 Mon Sep 17 00:00:00 2001 From: Troja Date: Sat, 25 Feb 2023 14:39:19 +0000 Subject: [PATCH 095/156] Translated using Weblate (Belarusian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/be/ --- src/strings/be-by.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/be-by.json b/src/strings/be-by.json index 266b83683b..68b4794d0d 100644 --- a/src/strings/be-by.json +++ b/src/strings/be-by.json @@ -1689,5 +1689,6 @@ "LabelDummyChapterCountHelp": "Максімальная колькасць выяваў раздзелаў, якія будуць выняты для кожнага медыяфайла.", "LabelChapterImageResolution": "Дазвол:", "LabelChapterImageResolutionHelp": "Дазвол вынятых малюнкаў раздзелаў.", - "ResolutionMatchSource": "Супадзенне з крыніцай" + "ResolutionMatchSource": "Супадзенне з крыніцай", + "SecondarySubtitles": "Дадатковыя субтытры" } From 494c0ed43432ab6e21e491c0a36609a124624ad7 Mon Sep 17 00:00:00 2001 From: Netanel Henya Date: Sun, 26 Feb 2023 01:01:31 +0200 Subject: [PATCH 096/156] cleanup: reorganized sass files to be in src/styles instead of src/assets/css --- src/components/actionSheet/actionSheet.js | 2 +- src/components/collectionEditor/collectionEditor.js | 2 +- src/components/dialog/dialog.js | 2 +- src/components/dialogHelper/dialogHelper.js | 2 +- src/components/favoriteitems.js | 2 +- src/components/filtermenu/filtermenu.js | 2 +- src/components/guide/guide.js | 4 ++-- src/components/itemMediaInfo/itemMediaInfo.js | 2 +- .../mediaLibraryCreator/mediaLibraryCreator.js | 2 +- .../mediaLibraryEditor/mediaLibraryEditor.js | 2 +- src/components/metadataEditor/metadataEditor.js | 4 ++-- src/components/recordingcreator/recordingeditor.js | 4 ++-- src/components/recordingcreator/recordingfields.js | 2 +- .../recordingcreator/seriesrecordingeditor.js | 4 ++-- src/components/search/SearchFields.tsx | 2 +- src/components/sortmenu/sortmenu.js | 2 +- src/components/subtitleeditor/subtitleeditor.js | 2 +- src/components/subtitlesettings/subtitlesettings.js | 2 +- src/components/tvproviders/schedulesdirect.js | 2 +- src/components/upnextdialog/upnextdialog.js | 2 +- src/components/viewSettings/viewSettings.js | 2 +- src/controllers/dashboard/dashboard.js | 2 +- src/controllers/dashboard/logs.js | 2 +- src/controllers/itemDetails/index.js | 2 +- src/controllers/livetv/livetvsuggested.js | 2 +- src/controllers/livetvstatus.js | 2 +- src/controllers/music/musicrecommended.js | 4 ++-- src/controllers/playback/video/index.js | 4 ++-- src/controllers/session/selectServer/index.js | 2 +- src/controllers/shows/tvrecommended.js | 2 +- src/controllers/shows/tvupcoming.js | 2 +- src/controllers/wizard/user/index.js | 2 +- src/elements/emby-tabs/emby-tabs.js | 2 +- src/index.jsx | 10 +++++----- src/libraries/navdrawer/navdrawer.js | 2 +- src/libraries/scroller.js | 2 +- src/routes/user/userprofiles.tsx | 2 +- src/scripts/editorsidebar.js | 2 +- src/scripts/libraryMenu.js | 4 ++-- src/scripts/routes.js | 6 +++--- src/scripts/scrollHelper.js | 2 +- src/{assets/css => styles}/clearbutton.scss | 0 src/{assets/css => styles}/dashboard.scss | 0 src/{assets/css => styles}/detailtable.scss | 0 src/{assets/css => styles}/flexstyles.scss | 0 src/{assets/css => styles}/fonts.scss | 2 +- src/{assets/css => styles}/fonts.sized.scss | 0 src/{assets/css => styles}/ios.scss | 0 src/{assets/css => styles}/librarybrowser.scss | 0 src/{assets/css => styles}/livetv.scss | 0 src/{assets/css => styles}/metadataeditor.scss | 0 src/{assets/css => styles}/scrollstyles.scss | 0 src/{assets/css => styles}/site.scss | 0 src/{assets/css => styles}/videoosd.scss | 0 54 files changed, 55 insertions(+), 55 deletions(-) rename src/{assets/css => styles}/clearbutton.scss (100%) rename src/{assets/css => styles}/dashboard.scss (100%) rename src/{assets/css => styles}/detailtable.scss (100%) rename src/{assets/css => styles}/flexstyles.scss (100%) rename src/{assets/css => styles}/fonts.scss (96%) rename src/{assets/css => styles}/fonts.sized.scss (100%) rename src/{assets/css => styles}/ios.scss (100%) rename src/{assets/css => styles}/librarybrowser.scss (100%) rename src/{assets/css => styles}/livetv.scss (100%) rename src/{assets/css => styles}/metadataeditor.scss (100%) rename src/{assets/css => styles}/scrollstyles.scss (100%) rename src/{assets/css => styles}/site.scss (100%) rename src/{assets/css => styles}/videoosd.scss (100%) diff --git a/src/components/actionSheet/actionSheet.js b/src/components/actionSheet/actionSheet.js index eacf3624b2..1114908fcf 100644 --- a/src/components/actionSheet/actionSheet.js +++ b/src/components/actionSheet/actionSheet.js @@ -6,7 +6,7 @@ import dom from '../../scripts/dom'; import '../../elements/emby-button/emby-button'; import './actionSheet.scss'; import 'material-design-icons-iconfont'; -import '../../assets/css/scrollstyles.scss'; +import '../../styles/scrollstyles.scss'; import '../../components/listview/listview.scss'; function getOffsets(elems) { diff --git a/src/components/collectionEditor/collectionEditor.js b/src/components/collectionEditor/collectionEditor.js index 8af78fede2..89862725a5 100644 --- a/src/components/collectionEditor/collectionEditor.js +++ b/src/components/collectionEditor/collectionEditor.js @@ -12,7 +12,7 @@ import '../../elements/emby-input/emby-input'; import '../../elements/emby-select/emby-select'; import 'material-design-icons-iconfont'; import '../formdialog.scss'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; diff --git a/src/components/dialog/dialog.js b/src/components/dialog/dialog.js index 9629e9bb23..85e81abb02 100644 --- a/src/components/dialog/dialog.js +++ b/src/components/dialog/dialog.js @@ -10,7 +10,7 @@ import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-input/emby-input'; import '../formdialog.scss'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import template from './dialog.template.html'; /* eslint-disable indent */ diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index 9c1ecec625..6811525465 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -7,7 +7,7 @@ import { toBoolean } from '../../utils/string.ts'; import dom from '../../scripts/dom'; import './dialoghelper.scss'; -import '../../assets/css/scrollstyles.scss'; +import '../../styles/scrollstyles.scss'; /* eslint-disable indent */ diff --git a/src/components/favoriteitems.js b/src/components/favoriteitems.js index 67137b9174..6bba5c3bdc 100644 --- a/src/components/favoriteitems.js +++ b/src/components/favoriteitems.js @@ -6,7 +6,7 @@ import imageLoader from './images/imageLoader'; import globalize from '../scripts/globalize'; import layoutManager from './layoutManager'; import { getParameterByName } from '../utils/url.ts'; -import '../assets/css/scrollstyles.scss'; +import '../styles/scrollstyles.scss'; import '../elements/emby-itemscontainer/emby-itemscontainer'; /* eslint-disable indent */ diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js index d6b85256a9..4c1b6d625b 100644 --- a/src/components/filtermenu/filtermenu.js +++ b/src/components/filtermenu/filtermenu.js @@ -13,7 +13,7 @@ import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-select/emby-select'; import 'material-design-icons-iconfont'; import '../formdialog.scss'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import ServerConnections from '../ServerConnections'; import template from './filtermenu.template.html'; diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index 14c973d511..e353d562ab 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -17,13 +17,13 @@ import dom from '../../scripts/dom'; import './guide.scss'; import './programs.scss'; import 'material-design-icons-iconfont'; -import '../../assets/css/scrollstyles.scss'; +import '../../styles/scrollstyles.scss'; import '../../elements/emby-programcell/emby-programcell'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-tabs/emby-tabs'; import '../../elements/emby-scroller/emby-scroller'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import 'webcomponents.js/webcomponents-lite'; import ServerConnections from '../ServerConnections'; import template from './tvguide.template.html'; diff --git a/src/components/itemMediaInfo/itemMediaInfo.js b/src/components/itemMediaInfo/itemMediaInfo.js index d149a633a0..1a05d40849 100644 --- a/src/components/itemMediaInfo/itemMediaInfo.js +++ b/src/components/itemMediaInfo/itemMediaInfo.js @@ -20,7 +20,7 @@ import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; import '../formdialog.scss'; import 'material-design-icons-iconfont'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import ServerConnections from '../ServerConnections'; import template from './itemMediaInfo.template.html'; diff --git a/src/components/mediaLibraryCreator/mediaLibraryCreator.js b/src/components/mediaLibraryCreator/mediaLibraryCreator.js index 05c0fb02f8..0c049f8943 100644 --- a/src/components/mediaLibraryCreator/mediaLibraryCreator.js +++ b/src/components/mediaLibraryCreator/mediaLibraryCreator.js @@ -19,7 +19,7 @@ import '../../elements/emby-select/emby-select'; import '../../elements/emby-toggle/emby-toggle'; import '../listview/listview.scss'; import '../formdialog.scss'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import './style.scss'; import toast from '../toast/toast'; import alert from '../alert'; diff --git a/src/components/mediaLibraryEditor/mediaLibraryEditor.js b/src/components/mediaLibraryEditor/mediaLibraryEditor.js index da0dc2909c..ed54675016 100644 --- a/src/components/mediaLibraryEditor/mediaLibraryEditor.js +++ b/src/components/mediaLibraryEditor/mediaLibraryEditor.js @@ -17,7 +17,7 @@ import '../listview/listview.scss'; import '../../elements/emby-button/paper-icon-button-light'; import '../formdialog.scss'; import '../../elements/emby-toggle/emby-toggle'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import './style.scss'; import toast from '../toast/toast'; import confirm from '../confirm/confirm'; diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js index a36779ba53..6456c5721d 100644 --- a/src/components/metadataEditor/metadataEditor.js +++ b/src/components/metadataEditor/metadataEditor.js @@ -15,8 +15,8 @@ import '../../elements/emby-textarea/emby-textarea'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; import '../formdialog.scss'; -import '../../assets/css/clearbutton.scss'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/clearbutton.scss'; +import '../../styles/flexstyles.scss'; import './style.scss'; import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js index 19cec8d88e..b55754f540 100644 --- a/src/components/recordingcreator/recordingeditor.js +++ b/src/components/recordingcreator/recordingeditor.js @@ -4,7 +4,7 @@ import globalize from '../../scripts/globalize'; import layoutManager from '../layoutManager'; import loading from '../loading/loading'; import scrollHelper from '../../scripts/scrollHelper'; -import '../../assets/css/scrollstyles.scss'; +import '../../styles/scrollstyles.scss'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-collapse/emby-collapse'; import '../../elements/emby-input/emby-input'; @@ -12,7 +12,7 @@ import '../../elements/emby-button/paper-icon-button-light'; import '../formdialog.scss'; import './recordingcreator.scss'; import 'material-design-icons-iconfont'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import ServerConnections from '../ServerConnections'; import template from './recordingeditor.template.html'; diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js index 4b912392ad..a666a49562 100644 --- a/src/components/recordingcreator/recordingfields.js +++ b/src/components/recordingcreator/recordingfields.js @@ -7,7 +7,7 @@ import recordingHelper from './recordinghelper'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; import './recordingfields.scss'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import template from './recordingfields.template.html'; diff --git a/src/components/recordingcreator/seriesrecordingeditor.js b/src/components/recordingcreator/seriesrecordingeditor.js index a649b1231b..590c600e74 100644 --- a/src/components/recordingcreator/seriesrecordingeditor.js +++ b/src/components/recordingcreator/seriesrecordingeditor.js @@ -4,7 +4,7 @@ import layoutManager from '../layoutManager'; import loading from '../loading/loading'; import scrollHelper from '../../scripts/scrollHelper'; import datetime from '../../scripts/datetime'; -import '../../assets/css/scrollstyles.scss'; +import '../../styles/scrollstyles.scss'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-checkbox/emby-checkbox'; import '../../elements/emby-input/emby-input'; @@ -13,7 +13,7 @@ import '../../elements/emby-button/paper-icon-button-light'; import '../formdialog.scss'; import './recordingcreator.scss'; import 'material-design-icons-iconfont'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import ServerConnections from '../ServerConnections'; import template from './seriesrecordingeditor.template.html'; diff --git a/src/components/search/SearchFields.tsx b/src/components/search/SearchFields.tsx index 68cf02f38d..8a0fa01dfd 100644 --- a/src/components/search/SearchFields.tsx +++ b/src/components/search/SearchFields.tsx @@ -7,7 +7,7 @@ import globalize from '../../scripts/globalize'; import 'material-design-icons-iconfont'; import '../../elements/emby-input/emby-input'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import './searchfields.scss'; import layoutManager from '../layoutManager'; import browser from '../../scripts/browser'; diff --git a/src/components/sortmenu/sortmenu.js b/src/components/sortmenu/sortmenu.js index 394ced6dcb..65aef222e9 100644 --- a/src/components/sortmenu/sortmenu.js +++ b/src/components/sortmenu/sortmenu.js @@ -7,7 +7,7 @@ import '../../elements/emby-button/paper-icon-button-light'; import 'material-design-icons-iconfont'; import '../formdialog.scss'; import '../../elements/emby-button/emby-button'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import template from './sortmenu.template.html'; function onSubmit(e) { diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index 1aa6d57fc6..b332e4238f 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -14,7 +14,7 @@ import '../formdialog.scss'; import 'material-design-icons-iconfont'; import './subtitleeditor.scss'; import '../../elements/emby-button/emby-button'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import confirm from '../confirm/confirm'; diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 6cbced92d2..971b8c775d 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -13,7 +13,7 @@ import '../../elements/emby-select/emby-select'; import '../../elements/emby-slider/emby-slider'; import '../../elements/emby-input/emby-input'; import '../../elements/emby-checkbox/emby-checkbox'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import './subtitlesettings.scss'; import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; diff --git a/src/components/tvproviders/schedulesdirect.js b/src/components/tvproviders/schedulesdirect.js index d34fa40932..ca6f7a6e84 100644 --- a/src/components/tvproviders/schedulesdirect.js +++ b/src/components/tvproviders/schedulesdirect.js @@ -7,7 +7,7 @@ import '../listview/listview.scss'; import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-select/emby-select'; import '../../elements/emby-button/emby-button'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import './style.scss'; import Dashboard from '../../utils/dashboard'; import Events from '../../utils/events.ts'; diff --git a/src/components/upnextdialog/upnextdialog.js b/src/components/upnextdialog/upnextdialog.js index 31bb695f3e..2a37fcbe45 100644 --- a/src/components/upnextdialog/upnextdialog.js +++ b/src/components/upnextdialog/upnextdialog.js @@ -8,7 +8,7 @@ import globalize from '../../scripts/globalize'; import itemHelper from '../itemHelper'; import './upnextdialog.scss'; import '../../elements/emby-button/emby-button'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; /* eslint-disable indent */ diff --git a/src/components/viewSettings/viewSettings.js b/src/components/viewSettings/viewSettings.js index 8dfa589aa2..f5cb864206 100644 --- a/src/components/viewSettings/viewSettings.js +++ b/src/components/viewSettings/viewSettings.js @@ -9,7 +9,7 @@ import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-select/emby-select'; import 'material-design-icons-iconfont'; import '../formdialog.scss'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import template from './viewSettings.template.html'; function onSubmit(e) { diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 87704d406f..fd98d163e9 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -16,7 +16,7 @@ import imageHelper from '../../scripts/imagehelper'; import indicators from '../../components/indicators/indicators'; import '../../components/listview/listview.scss'; import '../../elements/emby-button/emby-button'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; import taskButton from '../../scripts/taskbutton'; import Dashboard from '../../utils/dashboard'; diff --git a/src/controllers/dashboard/logs.js b/src/controllers/dashboard/logs.js index aa6436962d..23a6d43853 100644 --- a/src/controllers/dashboard/logs.js +++ b/src/controllers/dashboard/logs.js @@ -3,7 +3,7 @@ import loading from '../../components/loading/loading'; import globalize from '../../scripts/globalize'; import '../../elements/emby-button/emby-button'; import '../../components/listview/listview.scss'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import Dashboard from '../../utils/dashboard'; import alert from '../../components/alert'; diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 4c2c429829..c2a7580724 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -22,7 +22,7 @@ import libraryMenu from '../../scripts/libraryMenu'; import globalize from '../../scripts/globalize'; import browser from '../../scripts/browser'; import { playbackManager } from '../../components/playback/playbackmanager'; -import '../../assets/css/scrollstyles.scss'; +import '../../styles/scrollstyles.scss'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../elements/emby-checkbox/emby-checkbox'; import '../../elements/emby-button/emby-button'; diff --git a/src/controllers/livetv/livetvsuggested.js b/src/controllers/livetv/livetvsuggested.js index f2a63f3ecd..4deb2b713a 100644 --- a/src/controllers/livetv/livetvsuggested.js +++ b/src/controllers/livetv/livetvsuggested.js @@ -6,7 +6,7 @@ import globalize from '../../scripts/globalize'; import * as mainTabsManager from '../../components/maintabsmanager'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; import imageLoader from '../../components/images/imageLoader'; -import '../../assets/css/scrollstyles.scss'; +import '../../styles/scrollstyles.scss'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../elements/emby-tabs/emby-tabs'; import '../../elements/emby-button/emby-button'; diff --git a/src/controllers/livetvstatus.js b/src/controllers/livetvstatus.js index d771464b1d..8b2b4bebc3 100644 --- a/src/controllers/livetvstatus.js +++ b/src/controllers/livetvstatus.js @@ -7,7 +7,7 @@ import layoutManager from '../components/layoutManager'; import loading from '../components/loading/loading'; import browser from '../scripts/browser'; import '../components/listview/listview.scss'; -import '../assets/css/flexstyles.scss'; +import '../styles/flexstyles.scss'; import '../elements/emby-itemscontainer/emby-itemscontainer'; import '../components/cardbuilder/card.scss'; import 'material-design-icons-iconfont'; diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js index 238b7a6d60..3ea00a9a8c 100644 --- a/src/controllers/music/musicrecommended.js +++ b/src/controllers/music/musicrecommended.js @@ -9,11 +9,11 @@ import imageLoader from '../../components/images/imageLoader'; import libraryMenu from '../../scripts/libraryMenu'; import * as mainTabsManager from '../../components/maintabsmanager'; import globalize from '../../scripts/globalize'; -import '../../assets/css/scrollstyles.scss'; +import '../../styles/scrollstyles.scss'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../elements/emby-tabs/emby-tabs'; import '../../elements/emby-button/emby-button'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import Dashboard from '../../utils/dashboard'; /* eslint-disable indent */ diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 19c1492d0e..cacea1a304 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -15,10 +15,10 @@ import { appHost } from '../../../components/apphost'; import layoutManager from '../../../components/layoutManager'; import * as userSettings from '../../../scripts/settings/userSettings'; import keyboardnavigation from '../../../scripts/keyboardNavigation'; -import '../../../assets/css/scrollstyles.scss'; +import '../../../styles/scrollstyles.scss'; import '../../../elements/emby-slider/emby-slider'; import '../../../elements/emby-button/paper-icon-button-light'; -import '../../../assets/css/videoosd.scss'; +import '../../../styles/videoosd.scss'; import ServerConnections from '../../../components/ServerConnections'; import shell from '../../../scripts/shell'; import SubtitleSync from '../../../components/subtitlesync/subtitlesync'; diff --git a/src/controllers/session/selectServer/index.js b/src/controllers/session/selectServer/index.js index 4665b2eba0..b45cb71060 100644 --- a/src/controllers/session/selectServer/index.js +++ b/src/controllers/session/selectServer/index.js @@ -10,7 +10,7 @@ import actionSheet from '../../../components/actionSheet/actionSheet'; import dom from '../../../scripts/dom'; import browser from '../../../scripts/browser'; import 'material-design-icons-iconfont'; -import '../../../assets/css/flexstyles.scss'; +import '../../../styles/flexstyles.scss'; import '../../../elements/emby-scroller/emby-scroller'; import '../../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../../components/cardbuilder/card.scss'; diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js index 1977b7cd4f..5d9b3e2e0b 100644 --- a/src/controllers/shows/tvrecommended.js +++ b/src/controllers/shows/tvrecommended.js @@ -9,7 +9,7 @@ import cardBuilder from '../../components/cardbuilder/cardBuilder'; import { playbackManager } from '../../components/playback/playbackmanager'; import * as mainTabsManager from '../../components/maintabsmanager'; import globalize from '../../scripts/globalize'; -import '../../assets/css/scrollstyles.scss'; +import '../../styles/scrollstyles.scss'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../elements/emby-button/emby-button'; import Dashboard from '../../utils/dashboard'; diff --git a/src/controllers/shows/tvupcoming.js b/src/controllers/shows/tvupcoming.js index 0c1be00a18..fa6be1f356 100644 --- a/src/controllers/shows/tvupcoming.js +++ b/src/controllers/shows/tvupcoming.js @@ -4,7 +4,7 @@ import datetime from '../../scripts/datetime'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; import imageLoader from '../../components/images/imageLoader'; import globalize from '../../scripts/globalize'; -import '../../assets/css/scrollstyles.scss'; +import '../../styles/scrollstyles.scss'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; /* eslint-disable indent */ diff --git a/src/controllers/wizard/user/index.js b/src/controllers/wizard/user/index.js index 9d1f13ae31..d6647f7357 100644 --- a/src/controllers/wizard/user/index.js +++ b/src/controllers/wizard/user/index.js @@ -1,6 +1,6 @@ import loading from '../../../components/loading/loading'; import globalize from '../../../scripts/globalize'; -import '../../../assets/css/dashboard.scss'; +import '../../../styles/dashboard.scss'; import '../../../elements/emby-input/emby-input'; import '../../../elements/emby-button/emby-button'; import Dashboard from '../../../utils/dashboard'; diff --git a/src/elements/emby-tabs/emby-tabs.js b/src/elements/emby-tabs/emby-tabs.js index 723cb7e8fe..9455b5e1db 100644 --- a/src/elements/emby-tabs/emby-tabs.js +++ b/src/elements/emby-tabs/emby-tabs.js @@ -5,7 +5,7 @@ import browser from '../../scripts/browser'; import focusManager from '../../components/focusManager'; import layoutManager from '../../components/layoutManager'; import './emby-tabs.scss'; -import '../../assets/css/scrollstyles.scss'; +import '../../styles/scrollstyles.scss'; /* eslint-disable indent */ const EmbyTabs = Object.create(HTMLDivElement.prototype); diff --git a/src/index.jsx b/src/index.jsx index b9a4d9603e..57bdaa2f19 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -6,7 +6,7 @@ import 'intersection-observer'; import 'classlist.js'; import 'whatwg-fetch'; import 'resize-observer-polyfill'; -import './assets/css/site.scss'; +import './styles/site.scss'; import React, { StrictMode } from 'react'; import * as ReactDOM from 'react-dom'; import Events from './utils/events.ts'; @@ -89,13 +89,13 @@ function onGlobalizeInit() { if (browser.tv && !browser.android) { console.debug('using system fonts with explicit sizes'); - import('./assets/css/fonts.sized.scss'); + import('./styles/fonts.sized.scss'); } else { console.debug('using default fonts'); - import('./assets/css/fonts.scss'); + import('./styles/fonts.scss'); } - import('./assets/css/librarybrowser.scss'); + import('./styles/librarybrowser.scss'); loadPlugins().then(onAppReady); } @@ -135,7 +135,7 @@ async function onAppReady() { console.debug('onAppReady: loading dependencies'); if (browser.iOS) { - import('./assets/css/ios.scss'); + import('./styles/ios.scss'); } Events.on(appHost, 'resume', () => { diff --git a/src/libraries/navdrawer/navdrawer.js b/src/libraries/navdrawer/navdrawer.js index bd27b6e55c..539682a076 100644 --- a/src/libraries/navdrawer/navdrawer.js +++ b/src/libraries/navdrawer/navdrawer.js @@ -6,7 +6,7 @@ import browser from '../../scripts/browser'; import dom from '../../scripts/dom'; import './navdrawer.scss'; -import '../../assets/css/scrollstyles.scss'; +import '../../styles/scrollstyles.scss'; import globalize from '../../scripts/globalize'; function getTouches(e) { diff --git a/src/libraries/scroller.js b/src/libraries/scroller.js index c388c52fe8..670a46f4b9 100644 --- a/src/libraries/scroller.js +++ b/src/libraries/scroller.js @@ -8,7 +8,7 @@ import layoutManager from '../components/layoutManager'; import dom from '../scripts/dom'; import focusManager from '../components/focusManager'; import ResizeObserver from 'resize-observer-polyfill'; -import '../assets/css/scrollstyles.scss'; +import '../styles/scrollstyles.scss'; import globalize from '../scripts/globalize'; /** diff --git a/src/routes/user/userprofiles.tsx b/src/routes/user/userprofiles.tsx index 7d46593ff6..ff39fae33f 100644 --- a/src/routes/user/userprofiles.tsx +++ b/src/routes/user/userprofiles.tsx @@ -11,7 +11,7 @@ import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; import '../../components/cardbuilder/card.scss'; import '../../components/indicators/indicators.scss'; -import '../../assets/css/flexstyles.scss'; +import '../../styles/flexstyles.scss'; import Page from '../../components/Page'; type MenuEntry = { diff --git a/src/scripts/editorsidebar.js b/src/scripts/editorsidebar.js index 10a474798c..06624898d1 100644 --- a/src/scripts/editorsidebar.js +++ b/src/scripts/editorsidebar.js @@ -303,7 +303,7 @@ import { getParameterByName } from '../utils/url.ts'; updateEditorNode(this, item); }).on('pagebeforeshow', '.metadataEditorPage', function () { /* eslint-disable-next-line @babel/no-unused-expressions */ - import('../assets/css/metadataeditor.scss'); + import('../styles/metadataeditor.scss'); }).on('pagebeforeshow', '.metadataEditorPage', function () { const page = this; Dashboard.getCurrentUser().then(function (user) { diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index 3afc730c33..92405f8fe3 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -22,8 +22,8 @@ import { getParameterByName } from '../utils/url.ts'; import '../elements/emby-button/paper-icon-button-light'; import 'material-design-icons-iconfont'; -import '../assets/css/scrollstyles.scss'; -import '../assets/css/flexstyles.scss'; +import '../styles/scrollstyles.scss'; +import '../styles/flexstyles.scss'; /* eslint-disable indent */ diff --git a/src/scripts/routes.js b/src/scripts/routes.js index f1574dd53e..d90eb95eaa 100644 --- a/src/scripts/routes.js +++ b/src/scripts/routes.js @@ -7,10 +7,10 @@ import '../elements/emby-collapse/emby-collapse'; import '../elements/emby-select/emby-select'; import '../elements/emby-checkbox/emby-checkbox'; import '../elements/emby-slider/emby-slider'; -import '../assets/css/livetv.scss'; +import '../styles/livetv.scss'; import '../components/listview/listview.scss'; -import '../assets/css/dashboard.scss'; -import '../assets/css/detailtable.scss'; +import '../styles/dashboard.scss'; +import '../styles/detailtable.scss'; import { appRouter } from '../components/appRouter'; /* eslint-disable indent */ diff --git a/src/scripts/scrollHelper.js b/src/scripts/scrollHelper.js index 57c8f28fb7..725df86434 100644 --- a/src/scripts/scrollHelper.js +++ b/src/scripts/scrollHelper.js @@ -1,6 +1,6 @@ import focusManager from '../components/focusManager'; import dom from './dom'; -import '../assets/css/scrollstyles.scss'; +import '../styles/scrollstyles.scss'; function getBoundingClientRect(elem) { // Support: BlackBerry 5, iOS 3 (original iPhone) diff --git a/src/assets/css/clearbutton.scss b/src/styles/clearbutton.scss similarity index 100% rename from src/assets/css/clearbutton.scss rename to src/styles/clearbutton.scss diff --git a/src/assets/css/dashboard.scss b/src/styles/dashboard.scss similarity index 100% rename from src/assets/css/dashboard.scss rename to src/styles/dashboard.scss diff --git a/src/assets/css/detailtable.scss b/src/styles/detailtable.scss similarity index 100% rename from src/assets/css/detailtable.scss rename to src/styles/detailtable.scss diff --git a/src/assets/css/flexstyles.scss b/src/styles/flexstyles.scss similarity index 100% rename from src/assets/css/flexstyles.scss rename to src/styles/flexstyles.scss diff --git a/src/assets/css/fonts.scss b/src/styles/fonts.scss similarity index 96% rename from src/assets/css/fonts.scss rename to src/styles/fonts.scss index 16142a3aab..681f1abd2c 100644 --- a/src/assets/css/fonts.scss +++ b/src/styles/fonts.scss @@ -1,4 +1,4 @@ -@import "../../styles/noto-sans/index.scss"; +@import "../styles/noto-sans/index.scss"; @mixin font($weight: null, $size: null) { font-weight: $weight; diff --git a/src/assets/css/fonts.sized.scss b/src/styles/fonts.sized.scss similarity index 100% rename from src/assets/css/fonts.sized.scss rename to src/styles/fonts.sized.scss diff --git a/src/assets/css/ios.scss b/src/styles/ios.scss similarity index 100% rename from src/assets/css/ios.scss rename to src/styles/ios.scss diff --git a/src/assets/css/librarybrowser.scss b/src/styles/librarybrowser.scss similarity index 100% rename from src/assets/css/librarybrowser.scss rename to src/styles/librarybrowser.scss diff --git a/src/assets/css/livetv.scss b/src/styles/livetv.scss similarity index 100% rename from src/assets/css/livetv.scss rename to src/styles/livetv.scss diff --git a/src/assets/css/metadataeditor.scss b/src/styles/metadataeditor.scss similarity index 100% rename from src/assets/css/metadataeditor.scss rename to src/styles/metadataeditor.scss diff --git a/src/assets/css/scrollstyles.scss b/src/styles/scrollstyles.scss similarity index 100% rename from src/assets/css/scrollstyles.scss rename to src/styles/scrollstyles.scss diff --git a/src/assets/css/site.scss b/src/styles/site.scss similarity index 100% rename from src/assets/css/site.scss rename to src/styles/site.scss diff --git a/src/assets/css/videoosd.scss b/src/styles/videoosd.scss similarity index 100% rename from src/assets/css/videoosd.scss rename to src/styles/videoosd.scss From 0edb3ae776a55b61ac39aeac3fb7131a81bfe379 Mon Sep 17 00:00:00 2001 From: MCSifreedsk33 Date: Sun, 26 Feb 2023 04:53:05 +0000 Subject: [PATCH 097/156] Translated using Weblate (Slovak) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/ --- src/strings/sk.json | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/strings/sk.json b/src/strings/sk.json index 282b1f0f8b..64bac51b24 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -173,11 +173,11 @@ "HeaderImageSettings": "Nastavenia obrázkov", "HeaderInstall": "Inštalovať", "HeaderInstantMix": "Okamžitý mix", - "HeaderLatestEpisodes": "Najnovšie epizódy", - "HeaderLatestMedia": "Najnovšie médiá", - "HeaderLatestMovies": "Najnovšie filmy", - "HeaderLatestMusic": "Najnovšia hudba", - "HeaderLatestRecordings": "Najnovšie nahrávky", + "HeaderLatestEpisodes": "Najnovšie pridané epizódy", + "HeaderLatestMedia": "Najnovšie pridané médiá", + "HeaderLatestMovies": "Najnovšie pridané filmy", + "HeaderLatestMusic": "Najnovšia pridaná hudba", + "HeaderLatestRecordings": "Najnovšie pridané nahrávky", "HeaderLibraries": "Knižnice", "HeaderLibraryAccess": "Prístup ku knižnici", "HeaderLibraryFolders": "Priečinky knižnice", @@ -659,7 +659,7 @@ "TabCodecs": "Kodeky", "TabContainers": "Kontajnery", "TabDashboard": "Dashboard", - "TabLatest": "Najnovšie", + "TabLatest": "Najnovšie pridané", "TabMusic": "Hudba", "TabMyPlugins": "Moje zásuvné moduly", "TabNetworks": "TV Siete", @@ -723,7 +723,7 @@ "ButtonRevoke": "Odvolať", "ButtonSelectView": "Výber zobrazenia", "CancelRecording": "Zrušiť nahrávanie", - "AirDate": "Dátum vysielania", + "AirDate": "Dátum prvého vysielania", "Aired": "Odvysielané", "Alerts": "Upozornenia", "AllowOnTheFlySubtitleExtraction": "Povoliť extrahovanie titulkov za behu", @@ -968,7 +968,7 @@ "EnableStreamLooping": "Autom. slučka živého vysielania", "EnableExternalVideoPlayersHelp": "Ponuka externého prehrávača sa zobrazí pri spustení prehrávania videa.", "EnableBackdropsHelp": "Zobraziť pozadia pre niektoré stránky pri prechádzaní knižnice.", - "DisplayInOtherHomeScreenSections": "Zobraziť v sekciách domovskej obrazovky, ako sú najnovšie médiá a pokračovať v pozeraní", + "DisplayInOtherHomeScreenSections": "Zobraziť 'Najnovšie pridané médiá' a 'Pokračovať v pozeraní' v sekciách domovskej obrazovky", "DirectStreamHelp1": "Video je kompatibilné zo zariadením, ale zvuková stopa je v nekompatibilnom formáte (DTS, Dolby TrueHD, atď.) alebo má nekompatibilný počet kanálov. Video bude pred odoslaním do zariadenia za behu bezstrátovo prebalené. Iba zvuk bude prekódovaný.", "Depressed": "Stlačený", "DefaultSubtitlesHelp": "Titulky sú načítané v závislosti od predvolených a vynútených nastavení vo vložených metadátach. Jazykové predvoľby sú zobrané do úvahy až vtedy, keď je k dispozícií viacero možností.", @@ -1701,5 +1701,6 @@ "LabelDummyChapterDurationHelp": "Interval extrakcie obrázkov kapitol v sekundách.", "SaveRecordingNFO": "Uložiť metadáta nahrávky zo sprievodcu EPG do NFO", "SaveRecordingImagesHelp": "Uloží obrázky z EPG položiek sprievodcu spolu s médiami.", - "HeaderRecordingMetadataSaving": "Metadáta nahrávok" + "HeaderRecordingMetadataSaving": "Metadáta nahrávok", + "SecondarySubtitles": "Sekundárne titulky" } From 6e4921b582188619de466b96d2e511c6b9c119bd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 23:49:36 +0000 Subject: [PATCH 098/156] Update dependency jstree to v3.3.15 --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index bee1500884..a95a62a1ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "intersection-observer": "0.12.2", "jellyfin-apiclient": "1.10.0", "jquery": "3.6.3", - "jstree": "3.3.14", + "jstree": "3.3.15", "libarchive.js": "1.3.0", "lodash-es": "4.17.21", "marked": "4.2.12", @@ -9785,11 +9785,11 @@ } }, "node_modules/jstree": { - "version": "3.3.14", - "resolved": "https://registry.npmjs.org/jstree/-/jstree-3.3.14.tgz", - "integrity": "sha512-W8t+nFOKENXNIulvu+DW4gPcnpOXY0FswiTiOn1Fnhs6poRe6eA/Kf6fS1/GJJ8C8KEy0q3ttF6tbGRDmHIM/g==", + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/jstree/-/jstree-3.3.15.tgz", + "integrity": "sha512-fNK2EBgGjaJQ3cJuINX/80vDeAufYWtM0csudgYl3eJG+eRAH/1r1IJVUOvAlJIa+uSgg+Fi8uGrt+Xbs92eKg==", "dependencies": { - "jquery": "^3.6.0" + "jquery": "^3.5.0" } }, "node_modules/jsx-ast-utils": { @@ -26275,11 +26275,11 @@ "dev": true }, "jstree": { - "version": "3.3.14", - "resolved": "https://registry.npmjs.org/jstree/-/jstree-3.3.14.tgz", - "integrity": "sha512-W8t+nFOKENXNIulvu+DW4gPcnpOXY0FswiTiOn1Fnhs6poRe6eA/Kf6fS1/GJJ8C8KEy0q3ttF6tbGRDmHIM/g==", + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/jstree/-/jstree-3.3.15.tgz", + "integrity": "sha512-fNK2EBgGjaJQ3cJuINX/80vDeAufYWtM0csudgYl3eJG+eRAH/1r1IJVUOvAlJIa+uSgg+Fi8uGrt+Xbs92eKg==", "requires": { - "jquery": "^3.6.0" + "jquery": "^3.5.0" } }, "jsx-ast-utils": { diff --git a/package.json b/package.json index b1ed0c59b0..27dffd1bb4 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "intersection-observer": "0.12.2", "jellyfin-apiclient": "1.10.0", "jquery": "3.6.3", - "jstree": "3.3.14", + "jstree": "3.3.15", "libarchive.js": "1.3.0", "lodash-es": "4.17.21", "marked": "4.2.12", From 5dec54a7b74b3af6c90d224439c98ac588f1be92 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 23:50:22 +0000 Subject: [PATCH 099/156] Update dependency stylelint to v15 --- package-lock.json | 181 +++++++++++++++++++++++++++++++++------------- package.json | 2 +- 2 files changed, 130 insertions(+), 53 deletions(-) diff --git a/package-lock.json b/package-lock.json index bee1500884..b13f56e99d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -102,7 +102,7 @@ "sass-loader": "13.2.0", "source-map-loader": "4.0.1", "style-loader": "3.3.1", - "stylelint": "14.16.1", + "stylelint": "15.2.0", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.2", @@ -2378,19 +2378,19 @@ } }, "node_modules/@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", + "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", "dev": true, "engines": { - "node": "^12 || ^14 || >=16" + "node": "^14 || ^16 || >=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.2", + "postcss": "^8.4", "postcss-selector-parser": "^6.0.10" } }, @@ -8824,9 +8824,9 @@ "dev": true }, "node_modules/ignore": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", - "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -14766,16 +14766,20 @@ } }, "node_modules/stylelint": { - "version": "14.16.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", - "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.2.0.tgz", + "integrity": "sha512-wjg5OLn8zQwjlj5cYUgyQpMWKzct42AG5dYlqkHRJQJqsystFFn3onqEc263KH4xfEI0W3lZCnlIhFfS64uwSA==", "dev": true, "dependencies": { - "@csstools/selector-specificity": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.0.1", + "@csstools/css-tokenizer": "^2.0.1", + "@csstools/media-query-list-parser": "^2.0.1", + "@csstools/selector-specificity": "^2.1.1", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", + "cosmiconfig": "^8.0.0", "css-functions-list": "^3.1.0", + "css-tree": "^2.3.1", "debug": "^4.3.4", "fast-glob": "^3.2.12", "fastest-levenshtein": "^1.0.16", @@ -14784,7 +14788,7 @@ "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.2.0", - "ignore": "^5.2.1", + "ignore": "^5.2.4", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", @@ -14794,7 +14798,7 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", @@ -14808,13 +14812,13 @@ "svg-tags": "^1.0.0", "table": "^6.8.1", "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" + "write-file-atomic": "^5.0.0" }, "bin": { "stylelint": "bin/stylelint.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^14.13.1 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -17073,6 +17077,12 @@ "stylelint": "^14.5.1 || ^15.0.0" } }, + "node_modules/stylelint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/stylelint/node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -17089,19 +17099,34 @@ "dev": true }, "node_modules/stylelint/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.0.tgz", + "integrity": "sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/stylelint/node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, "node_modules/stylelint/node_modules/globby": { @@ -17158,6 +17183,24 @@ "node": ">=0.10.0" } }, + "node_modules/stylelint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/stylelint/node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, "node_modules/stylelint/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -19102,16 +19145,16 @@ } }, "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", + "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/write-file-atomic/node_modules/signal-exit": { @@ -20671,9 +20714,9 @@ "requires": {} }, "@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", + "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", "dev": true, "requires": {} }, @@ -25592,9 +25635,9 @@ "dev": true }, "ignore": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", - "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "immediate": { @@ -29940,16 +29983,20 @@ } }, "stylelint": { - "version": "14.16.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", - "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.2.0.tgz", + "integrity": "sha512-wjg5OLn8zQwjlj5cYUgyQpMWKzct42AG5dYlqkHRJQJqsystFFn3onqEc263KH4xfEI0W3lZCnlIhFfS64uwSA==", "dev": true, "requires": { - "@csstools/selector-specificity": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.0.1", + "@csstools/css-tokenizer": "^2.0.1", + "@csstools/media-query-list-parser": "^2.0.1", + "@csstools/selector-specificity": "^2.1.1", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", + "cosmiconfig": "^8.0.0", "css-functions-list": "^3.1.0", + "css-tree": "^2.3.1", "debug": "^4.3.4", "fast-glob": "^3.2.12", "fastest-levenshtein": "^1.0.16", @@ -29958,7 +30005,7 @@ "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.2.0", - "ignore": "^5.2.1", + "ignore": "^5.2.4", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", @@ -29968,7 +30015,7 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", @@ -29982,9 +30029,15 @@ "svg-tags": "^1.0.0", "table": "^6.8.1", "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" + "write-file-atomic": "^5.0.0" }, "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -29998,16 +30051,25 @@ "dev": true }, "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.0.tgz", + "integrity": "sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==", "dev": true, "requires": { - "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "path-type": "^4.0.0" + } + }, + "css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "requires": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" } }, "globby": { @@ -30048,6 +30110,21 @@ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -33334,9 +33411,9 @@ } }, "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", + "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", "dev": true, "requires": { "imurmurhash": "^0.1.4", diff --git a/package.json b/package.json index b1ed0c59b0..54585eaa84 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "sass-loader": "13.2.0", "source-map-loader": "4.0.1", "style-loader": "3.3.1", - "stylelint": "14.16.1", + "stylelint": "15.2.0", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.2", From a5d4dc5738ee1c4354c5f863a4bfcfaec83c94a7 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Mon, 27 Feb 2023 10:24:27 +0100 Subject: [PATCH 100/156] Allow setting DummyChapterCount to 0 to disable dummy chapters --- src/controllers/dashboard/metadataimages.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/dashboard/metadataimages.html b/src/controllers/dashboard/metadataimages.html index d0de7cb738..a407ae387b 100644 --- a/src/controllers/dashboard/metadataimages.html +++ b/src/controllers/dashboard/metadataimages.html @@ -26,7 +26,7 @@
${LabelDummyChapterDurationHelp}
- +
${LabelDummyChapterCountHelp}
From 21e07e05add7869f0906351d1b962f08d8c823f6 Mon Sep 17 00:00:00 2001 From: CarlBishop Date: Mon, 27 Feb 2023 13:30:45 +0000 Subject: [PATCH 101/156] 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 1a325f784e..3ccb4247ad 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -137,7 +137,7 @@ "Disconnect": "Disconnetti", "Display": "Schermo", "DisplayInMyMedia": "Visualizza nella schermata di home", - "DisplayInOtherHomeScreenSections": "Mostra le sezioni della schermata home come 'Ultimi media' e 'Continua a guardare'", + "DisplayInOtherHomeScreenSections": "Visualizza nelle sezioni della schermata iniziale come \"Media aggiunti di recente\" 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": "Seleziona lo stile del layout che vuoi per l'interfaccia.", From ebf0c1d3bbd3c51308fa2dccda75fbfd1f0bc036 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 27 Feb 2023 17:12:36 +0000 Subject: [PATCH 102/156] Update Babel to v7.21.0 --- package-lock.json | 395 +++++++++++++++++++++++++--------------------- package.json | 4 +- 2 files changed, 215 insertions(+), 184 deletions(-) diff --git a/package-lock.json b/package-lock.json index bee1500884..6ac899b4ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ "workbox-precaching": "6.5.4" }, "devDependencies": { - "@babel/core": "7.20.12", + "@babel/core": "7.21.0", "@babel/eslint-parser": "7.19.1", "@babel/eslint-plugin": "7.19.1", "@babel/plugin-proposal-class-properties": "7.18.6", @@ -62,7 +62,7 @@ "@babel/plugin-transform-modules-umd": "7.18.6", "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", - "@babel/preset-typescript": "7.18.6", + "@babel/preset-typescript": "7.21.0", "@types/escape-html": "1.0.2", "@types/loadable__component": "5.13.4", "@types/lodash-es": "4.17.6", @@ -123,12 +123,26 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" }, "engines": { "node": ">=6.0.0" @@ -182,21 +196,21 @@ } }, "node_modules/@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", + "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", "dev": true, "dependencies": { - "@ampproject/remapping": "^2.1.0", + "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", + "@babel/generator": "^7.21.0", "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.0", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.0", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -246,13 +260,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", + "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.21.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -319,17 +334,18 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", - "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", + "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { @@ -394,13 +410,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -419,12 +435,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", - "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -443,9 +459,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -454,8 +470,8 @@ "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" }, "engines": { "node": ">=6.9.0" @@ -530,12 +546,12 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.20.0" }, "engines": { "node": ">=6.9.0" @@ -572,9 +588,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -596,14 +612,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "dev": true, "dependencies": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -624,9 +640,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", + "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1124,12 +1140,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1679,14 +1695,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz", - "integrity": "sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz", + "integrity": "sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/plugin-syntax-typescript": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" }, "engines": { "node": ">=6.9.0" @@ -1852,14 +1868,14 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", - "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz", + "integrity": "sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-typescript": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-transform-typescript": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -1894,19 +1910,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", - "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", + "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", + "@babel/generator": "^7.21.1", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", + "@babel/parser": "^7.21.2", + "@babel/types": "^7.21.2", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1915,9 +1931,9 @@ } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", + "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", @@ -2609,9 +2625,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "devOptional": true, "engines": { "node": ">=6.0.0" @@ -2637,19 +2653,19 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "devOptional": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@leichtgewicht/ip-codec": { @@ -19210,12 +19226,25 @@ }, "dependencies": { "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } } }, "@apideck/better-ajv-errors": { @@ -19253,21 +19282,21 @@ "dev": true }, "@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", + "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", "dev": true, "requires": { - "@ampproject/remapping": "^2.1.0", + "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", + "@babel/generator": "^7.21.0", "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.0", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.0", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -19296,13 +19325,14 @@ } }, "@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", + "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", "dev": true, "requires": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.21.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" } }, @@ -19356,17 +19386,18 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", - "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", + "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" } }, @@ -19410,13 +19441,13 @@ } }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" } }, "@babel/helper-hoist-variables": { @@ -19429,12 +19460,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", - "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", "dev": true, "requires": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.21.0" } }, "@babel/helper-module-imports": { @@ -19447,9 +19478,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", @@ -19458,8 +19489,8 @@ "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" } }, "@babel/helper-optimise-call-expression": { @@ -19513,12 +19544,12 @@ } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "requires": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.20.0" } }, "@babel/helper-split-export-declaration": { @@ -19543,9 +19574,9 @@ "dev": true }, "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true }, "@babel/helper-wrap-function": { @@ -19561,14 +19592,14 @@ } }, "@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "dev": true, "requires": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" } }, "@babel/highlight": { @@ -19583,9 +19614,9 @@ } }, "@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", + "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -19912,12 +19943,12 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-arrow-functions": { @@ -20257,14 +20288,14 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz", - "integrity": "sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz", + "integrity": "sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/plugin-syntax-typescript": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" } }, "@babel/plugin-transform-unicode-escapes": { @@ -20397,14 +20428,14 @@ } }, "@babel/preset-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", - "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz", + "integrity": "sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-typescript": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-transform-typescript": "^7.21.0" } }, "@babel/runtime": { @@ -20427,27 +20458,27 @@ } }, "@babel/traverse": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", - "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", + "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", + "@babel/generator": "^7.21.1", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", + "@babel/parser": "^7.21.2", + "@babel/types": "^7.21.2", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", + "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.19.4", @@ -20850,9 +20881,9 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "devOptional": true }, "@jridgewell/set-array": { @@ -20872,19 +20903,19 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "devOptional": true }, "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "devOptional": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@leichtgewicht/ip-codec": { diff --git a/package.json b/package.json index b1ed0c59b0..59ea84efbd 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { - "@babel/core": "7.20.12", + "@babel/core": "7.21.0", "@babel/eslint-parser": "7.19.1", "@babel/eslint-plugin": "7.19.1", "@babel/plugin-proposal-class-properties": "7.18.6", @@ -13,7 +13,7 @@ "@babel/plugin-transform-modules-umd": "7.18.6", "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", - "@babel/preset-typescript": "7.18.6", + "@babel/preset-typescript": "7.21.0", "@types/escape-html": "1.0.2", "@types/loadable__component": "5.13.4", "@types/lodash-es": "4.17.6", From f0ad8acd2856af920afe5ee1d75ab0847701d56b Mon Sep 17 00:00:00 2001 From: rushmash Date: Mon, 27 Feb 2023 16:20:55 +0000 Subject: [PATCH 103/156] Translated using Weblate (Belarusian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/be/ --- src/strings/be-by.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/strings/be-by.json b/src/strings/be-by.json index 68b4794d0d..fab979dd48 100644 --- a/src/strings/be-by.json +++ b/src/strings/be-by.json @@ -1690,5 +1690,15 @@ "LabelChapterImageResolution": "Дазвол:", "LabelChapterImageResolutionHelp": "Дазвол вынятых малюнкаў раздзелаў.", "ResolutionMatchSource": "Супадзенне з крыніцай", - "SecondarySubtitles": "Дадатковыя субтытры" + "SecondarySubtitles": "Дадатковыя субтытры", + "SubtitleBlack": "Чорны", + "SubtitleBlue": "Сіні", + "SubtitleCyan": "Блакітны", + "SubtitleGray": "Шэры", + "SubtitleGreen": "Зялёны", + "SubtitleLightGray": "Светла-шэры", + "SubtitleMagenta": "Пурпурны", + "SubtitleRed": "Чырвоны", + "SubtitleWhite": "Белы", + "SubtitleYellow": "Жоўты" } From b18a7c411e4f7992b9a256f454c3b714973740a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Mon, 27 Feb 2023 16:23:02 +0000 Subject: [PATCH 104/156] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index 78acddc0c0..369b0c17ca 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1704,5 +1704,15 @@ "ResolutionMatchSource": "Stejné jako zdroj", "PreferEmbeddedExtrasTitlesOverFileNames": "Preferovat vložené názvy před názvy souborů pro doplňky", "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Doplňky většinou mají stejný vložený název jako nadřazená položka. Zaškrtnutím je i přesto můžete upřednostnit.", - "SecondarySubtitles": "Sekundární titulky" + "SecondarySubtitles": "Sekundární titulky", + "SubtitleBlack": "Černá", + "SubtitleBlue": "Modrá", + "SubtitleCyan": "Tyrkysová", + "SubtitleGray": "Šedá", + "SubtitleGreen": "Zelená", + "SubtitleLightGray": "Světle šedá", + "SubtitleMagenta": "Fialová", + "SubtitleRed": "Červená", + "SubtitleWhite": "Bílá", + "SubtitleYellow": "Žlutá" } From 35a96997381e236c3046e97980d38b421c9b300d Mon Sep 17 00:00:00 2001 From: Bas Date: Mon, 27 Feb 2023 20:34:33 +0000 Subject: [PATCH 105/156] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 44d8eab396..1d40cce4f7 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1703,5 +1703,15 @@ "LabelDummyChapterDurationHelp": "De extractieinterval voor hoofdstukafbeeldingen in seconden.", "ResolutionMatchSource": "Gelijk aan bron", "HeaderRecordingMetadataSaving": "Metadata opname", - "SecondarySubtitles": "Secundaire ondertiteling" + "SecondarySubtitles": "Secundaire ondertiteling", + "SubtitleBlack": "Zwart", + "SubtitleBlue": "Blauw", + "SubtitleCyan": "Cyaan", + "SubtitleGray": "Grijs", + "SubtitleGreen": "Groen", + "SubtitleLightGray": "Lichtgrijs", + "SubtitleMagenta": "Magenta", + "SubtitleRed": "Rood", + "SubtitleWhite": "Wit", + "SubtitleYellow": "Geel" } From 8745ff57db9c3830ebf54642a06f5fdaed6879af Mon Sep 17 00:00:00 2001 From: Urtzi Odriozola Date: Mon, 27 Feb 2023 21:40:34 +0000 Subject: [PATCH 106/156] Translated using Weblate (Basque) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/eu/ --- src/strings/eu.json | 48 ++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/strings/eu.json b/src/strings/eu.json index e9fa50c682..bce8b4051f 100644 --- a/src/strings/eu.json +++ b/src/strings/eu.json @@ -129,7 +129,7 @@ "ValueCodec": "Kodeka: {0}", "ValueAudioCodec": "Audio-kodeka: {0}", "ValueAlbumCount": "{0} album", - "UserProfilesIntro": "Jellyfinek erabiltzaileen profilentzako euskarria barne hartzen du, eta erabiltzaile bakoitzak bere doikuntzak, ugaltze-egoera eta gurasoen kontrola izatea ahalbidetzen du.", + "UserProfilesIntro": "Jellyfinek erabiltzaileen profilentzako euskarria barne hartzen du, eta erabiltzaile bakoitzak bere ezarpenak, ugaltze-egoera eta gurasoen kontrola izatea ahalbidetzen du.", "UserAgentHelp": "Eman 'User-Agent' pertsonalizatutako http goiburu bat.", "UseEpisodeImagesInNextUpHelp": "\"Nobedadeak\" eta \"Ikusten jarraitu\" ataletan kapituluen irudiak agertuko dira miniatura gisa, seriearen miniatura nagusiaren ordez.", "UseEpisodeImagesInNextUp": "Erabili kapituluen irudiak \"Nobedadeak\" eta \"Ikusten jarraitu\" ataletan", @@ -188,7 +188,7 @@ "TabParentalControl": "Gurasoen kontrola", "TabOther": "Bestelakoak", "TabNotifications": "Jakinarazpenak", - "TabNfoSettings": "NFO doikuntzak", + "TabNfoSettings": "NFO ezarpenak", "TabNetworks": "Kate TB", "TabNetworking": "Sareak", "TabMyPlugins": "Nire osagarriak", @@ -212,7 +212,7 @@ "Subtitles": "Azpitituluak", "SubtitleOffset": "Azpitituluak lekualdatzea", "SubtitleDownloadersHelp": "Gaitu eta sailkatu hobetsitako azpitituluen deskargagailuak lehentasun-ordenaren arabera.", - "SubtitleAppearanceSettingsDisclaimer": "Ondorengo doikuntzak ez zaizkie aplikatuko aurretik aipatutako azpititulu grafikoei, ezta ASS/SSA azpitituluei ere, baldin eta beren estiloak badituzte.", + "SubtitleAppearanceSettingsDisclaimer": "Ondorengo ezarpenak ez zaizkie aplikatuko aurretik aipatutako azpititulu grafikoei, ezta ASS/SSA azpitituluei ere, baldin eta beren estiloak badituzte.", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Doikuntza horiek gailu honek hasitako Chromecast edozein erreprodukziori ere aplikatzen zaizkio.", "Subtitle": "Azpititulua", "Studios": "Ikasketak", @@ -246,13 +246,13 @@ "SetUsingLastTracks": "Audioko/azpitituluetako pista aurreko itemarekin ezartzea", "SettingsWarning": "Balio horiek aldatzeak ezegonkortasuna edo konektagarritasun-akatsak eragin ditzake. Arazoren bat izanez gero, berriz ere bere balio lehenetsira aldatzea gomendatzen dizugu.", "SettingsSaved": "Konfigurazio gordea.", - "Settings": "Doikuntzak", + "Settings": "Ezarpenak", "ServerUpdateNeeded": "Zerbitzaria eguneratu egin behar da. Azken bertsioa deskargatzeko, bisitatu {0}", "ServerRestartNeededAfterPluginInstall": "Jellyfin berriz hasi beharko da osagarri bat instalatu ondoren.", "ServerNameIsShuttingDown": "{0}(e)ko zerbitzaria itzaltzen ari da.", "ServerNameIsRestarting": "{0}(e)ko zerbitzaria berrabiarazten ari da.", "SeriesYearToPresent": "{0} - Gaur egun", - "SeriesSettings": "Serie-doikuntzak", + "SeriesSettings": "Serie ezarpenak", "SeriesRecordingScheduled": "Programatutako serieak grabatzea.", "SeriesDisplayOrderHelp": "Ordenatu kapituluak jaulkipen-dataren, DVD-ordenaren edo zenbaki absolutuaren arabera.", "SeriesCancelled": "Serie ezeztatua.", @@ -911,7 +911,7 @@ "Hide": "Ezkutatu", "Help": "Laguntza", "HeaderYears": "Urteak", - "HeaderXmlSettings": "XML doikuntzak", + "HeaderXmlSettings": "XML ezarpenak", "HeaderXmlDocumentAttributes": "XML dokumentuaren atributuak", "HeaderXmlDocumentAttribute": "XML dokumentuaren atributua", "HeaderVideoTypes": "Bideo motak", @@ -953,7 +953,7 @@ "LibraryAccessHelp": "Aukeratu erabiltzaile honekin partekatu beharreko liburutegiak. Administratzaileek karpeta guztiak editatu ahal izango dituzte metadatuen kudeatzailea erabiliz.", "LeaveBlankToNotSetAPassword": "Hutsik utz dezakezu pasahitza ez konfiguratzeko.", "LearnHowYouCanContribute": "Ezagutu nola lagundu dezakezun.", - "LatestFromLibrary": "Duela gutxi {0} liburutegian", + "LatestFromLibrary": "Duela gutxi gehituta: {0}", "LastSeen": "Azkenekoz ikusita {0}", "Larger": "Handiagoa", "Large": "Handia", @@ -1113,7 +1113,7 @@ "HeaderSortOrder": "Agindua", "HeaderSortBy": "Ordenatu", "HeaderSetupLibrary": "Konfiguratu zure multimedia-liburutegiak", - "HeaderServerSettings": "Zerbitzariaren doikuntzak", + "HeaderServerSettings": "Zerbitzariaren ezarpenak", "HeaderServerAddressSettings": "Zerbitzariaren helbidea konfiguratzea", "HeaderSeriesStatus": "Serieen egoera", "HeaderSeriesOptions": "Serieen aukerak", @@ -1138,7 +1138,7 @@ "HeaderRemoteControl": "Urrutiko kontrola", "HeaderRemoteAccessSettings": "Urruneko sarbide-aukerak", "HeaderRecordingPostProcessing": "Prozesatu osteko grabazioa", - "HeaderRecordingOptions": "Grabazio-doikuntzak", + "HeaderRecordingOptions": "Grabazio ezarpenak", "HeaderRecentlyPlayed": "Duela gutxi erreproduzitua", "HeaderProfileServerSettingsHelp": "Balio horiek zerbitzaria bezeroei nola aurkeztuko zaien kontrolatzen dute.", "HeaderProfileInformation": "Profilari buruzko informazioa", @@ -1169,12 +1169,12 @@ "HeaderMyDevice": "Nire gailua", "HeaderMusicQuality": "Soinuaren kalitatea", "HeaderMoreLikeThis": "Hau bezalakoa", - "HeaderMetadataSettings": "Metadatuen doikuntzak", + "HeaderMetadataSettings": "Metadatuen ezarpenak", "HeaderMediaFolders": "Multimedia karpetak", "HeaderMedia": "Multimedia", "HeaderLoginFailure": "Saioaren hasierako akatsa", - "HeaderLiveTvTunerSetup": "Telebista-sintonizadorearen doikuntzak", - "HeaderLibrarySettings": "Liburutegiaren doikuntzak", + "HeaderLiveTvTunerSetup": "Telebista-sintonizadorearen ezarpenak", + "HeaderLibrarySettings": "Liburutegiaren ezarpenak", "HeaderLibraryOrder": "Liburutegiaren agindua", "HeaderLibraryFolders": "Liburutegiko karpetak", "HeaderLibraryAccess": "Liburutegirako sarbidea", @@ -1184,24 +1184,24 @@ "HeaderLatestMovies": "Azken filmak", "HeaderLatestMedia": "Berriki gehituak", "HeaderLatestEpisodes": "Azken kapituluak", - "HeaderKodiMetadataHelp": "NFO formatuko metadatuak aktibatu edo desaktibatu ditzakezu, liburutegi baten konfigurazioa irekiz eta metadatuen ataleko doikuntzak berrikusiz.", + "HeaderKodiMetadataHelp": "NFO formatuko metadatuak aktibatu edo desaktibatu ditzakezu, liburutegi baten konfigurazioa irekiz eta metadatuen ataleko ezarpenak berrikusiz.", "HeaderKeepSeries": "Serieak mantentzea", "HeaderKeepRecording": "Grabazioa mantendu", "HeaderInstantMix": "Bat-bateko nahasketa", "HeaderInstall": "Instalatu", - "HeaderImageSettings": "Irudi-doikuntzak", + "HeaderImageSettings": "Irudi ezarpenak", "HeaderImageOptions": "Irudi-aukerak", "HeaderIdentifyItemHelp": "Sartu bilaketa-parametro bat edo gehiago. Bilaketaren emaitzen kopurua handitzeko parametroak ezabatzen ditu.", "HeaderIdentificationHeader": "Identifikazio-goiburua", "HeaderIdentificationCriteriaHelp": "Gutxienez identifikazio-irizpide bat sartzen du.", "HeaderIdentification": "Identifikazioa", - "HeaderHttpsSettings": "https aukerak", - "HeaderHttpHeaders": "http buruak", + "HeaderHttpsSettings": "HTTPS aukerak", + "HeaderHttpHeaders": "HTTP buruak", "HeaderGuideProviders": "Gida-hornitzaileak", "HeaderFrequentlyPlayed": "Maiz erreproduzitua", "HeaderForKids": "Haurrentzat", "HeaderFetchImages": "Bilatu irudiak:", - "HeaderFetcherSettings": "Harrapatzailearen doikuntzak", + "HeaderFetcherSettings": "Harrapatzailearen ezarpenak", "HeaderFeatureAccess": "Sartzeko baimenak:", "HeaderExternalIds": "Kanpoko IDS:", "HeaderError": "Errorea", @@ -1421,8 +1421,8 @@ "DeleteAll": "Ezabatu dena", "Delete": "Ezabatu", "DeinterlaceMethodHelp": "Hautatu bihurketan zehar elkarri lotuta dagoen edukia askatzeko aplikatuko den iragazki mota. Lotura kentzeko hardware bidezko azelerazioa aktibatuta badago, iragazki horren ordez erabiliko da.", - "DefaultSubtitlesHelp": "Erabiliko diren azpitituluak fitxategien pistetan txertatutako metadatuen araberakoak izango dira (bai \"lehenetsita\" edo \"behartuta\"). Hizkuntza-doikuntzak kontuan hartzen dira hainbat aukera eskuragarri daudenean.", - "DefaultMetadataLangaugeDescription": "Hauek dira zure doikuntzak eta liburutegi bakoitzerako pertsonalizatu daitezke.", + "DefaultSubtitlesHelp": "Erabiliko diren azpitituluak fitxategien pistetan txertatutako metadatuen araberakoak izango dira (bai \"lehenetsita\" edo \"behartuta\"). Hizkuntza ezarpenak kontuan hartzen dira hainbat aukera eskuragarri daudenean.", + "DefaultMetadataLangaugeDescription": "Hauek dira zure ezarpenak eta liburutegi bakoitzerako pertsonalizatu daitezke.", "Default": "Lehenetsia", "DeathDateValue": "Hil egin zen: {0}", "DatePlayed": "Erreproduzitua", @@ -1455,7 +1455,7 @@ "ColorSpace": "Kolore-espazioa", "ColorPrimaries": "Kolore primarioak", "Collections": "Bildumak", - "ClientSettings": "Bezeroaren doikuntzak", + "ClientSettings": "Bezeroaren ezarpenak", "ClearQueue": "Ezabatu buztana", "CinemaModeConfigurationHelp": "Zinema moduak zinemaren esperientzia zuzenean ematen du bere aretoan, funtzio nagusiaren aurretik trailerrak eta sarrera pertsonalizatuak erreproduzitzeko gaitasunarekin.", "Channels": "Kanalak", @@ -1547,7 +1547,7 @@ "HeaderBranding": "Itxura pertsonalizatzea", "HeaderBlockItemsWithNoRating": "Baloraziorik gabeko edo ezezagunak diren artikuluak blokeatzea:", "HeaderAutoDiscovery": "Sarearen aurkikuntza", - "HeaderAudioSettings": "Audio-doikuntzak", + "HeaderAudioSettings": "Audio ezarpenak", "HeaderAudioBooks": "Audioliburuak", "HeaderAppearsOn": "Hemen agertzen da", "HeaderApp": "Aplikazioa", @@ -1626,5 +1626,9 @@ "ButtonSpace": "Hutsunea", "EnableRewatchingNextUp": "Gaitu berriz ikustea Nobedadeak atalekoentzat", "EnableRewatchingNextUpHelp": "Gaitu jada ikusitako kapituluak \"Nobedadeak\" atalean agertzea.", - "LabelMaxVideoResolution": "Onartutako bideo-transkodetzearen bereizmen maximoa:" + "LabelMaxVideoResolution": "Onartutako bideo-transkodetzearen bereizmen maximoa:", + "EnableCardLayout": "Erakutsi CardBox ikusgai", + "GoogleCastUnsupported": "Google Cast ez da bateragarria", + "Experimental": "Esperimentala", + "DownloadAll": "Deskargatu dena" } From 6190041ef15dda7598e1713e21a795586f025722 Mon Sep 17 00:00:00 2001 From: blob03 Date: Tue, 28 Feb 2023 13:06:36 +0000 Subject: [PATCH 107/156] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 859cbd8640..e26cc1a0c0 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1704,5 +1704,15 @@ "LabelDummyChapterCountHelp": "Nombre maximal d’images de chapitre à extraire pour chaque fichier multimédia.", "PreferEmbeddedExtrasTitlesOverFileNames": "Préférer les titres intégrés aux médias pour les bonus", "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Les bonus possèdent souvent un titre intégré identique au média parent, cocher l'option pour utiliser ce titre quoi qu'il en soit.", - "SecondarySubtitles": "Sous-titres secondaires" + "SecondarySubtitles": "Sous-titres secondaires", + "SubtitleBlack": "Noir", + "SubtitleBlue": "Bleu", + "SubtitleCyan": "Cyan", + "SubtitleGray": "Gris", + "SubtitleGreen": "Vert", + "SubtitleLightGray": "Gris clair", + "SubtitleMagenta": "Magenta", + "SubtitleRed": "Rouge", + "SubtitleWhite": "Blanc", + "SubtitleYellow": "Jaune" } From 84f4e7c9911015e209901a79b2720ec8adbf11d3 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 28 Feb 2023 15:38:08 -0500 Subject: [PATCH 108/156] Fix login page redirect --- src/components/ConnectionRequired.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/ConnectionRequired.tsx b/src/components/ConnectionRequired.tsx index aa67a257e1..9c5f402b0a 100644 --- a/src/components/ConnectionRequired.tsx +++ b/src/components/ConnectionRequired.tsx @@ -1,5 +1,5 @@ import React, { FunctionComponent, useEffect, useState } from 'react'; -import { Outlet, useNavigate } from 'react-router-dom'; +import { Outlet, useLocation, useNavigate } from 'react-router-dom'; import type { ConnectResponse } from 'jellyfin-apiclient'; import alert from './alert'; @@ -31,11 +31,11 @@ const ConnectionRequired: FunctionComponent = ({ isUserRequired = true }) => { const navigate = useNavigate(); + const location = useLocation(); const [ isLoading, setIsLoading ] = useState(true); useEffect(() => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any const bounce = async (connectionResponse: ConnectResponse) => { switch (connectionResponse.State) { case ConnectionState.SignedIn: @@ -45,12 +45,12 @@ const ConnectionRequired: FunctionComponent = ({ return; case ConnectionState.ServerSignIn: // Bounce to the login page - console.debug('[ConnectionRequired] not logged in, redirecting to login page'); - navigate(BounceRoutes.Login, { - state: { - serverid: connectionResponse.ApiClient.serverId() - } - }); + if (location.pathname === BounceRoutes.Login) { + setIsLoading(false); + } else { + console.debug('[ConnectionRequired] not logged in, redirecting to login page'); + navigate(`${BounceRoutes.Login}?serverid=${connectionResponse.ApiClient.serverId()}`); + } return; case ConnectionState.ServerSelection: // Bounce to select server page @@ -144,7 +144,7 @@ const ConnectionRequired: FunctionComponent = ({ }; validateConnection(); - }, [ isAdminRequired, isUserRequired, navigate ]); + }, [ isAdminRequired, isUserRequired, location.pathname, navigate ]); if (isLoading) { return ; From 45de744a3981b3ad48173305480c19bde3c719c1 Mon Sep 17 00:00:00 2001 From: Kela910512 Date: Tue, 28 Feb 2023 20:56:41 +0000 Subject: [PATCH 109/156] Translated using Weblate (Hungarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/ --- src/strings/hu.json | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/strings/hu.json b/src/strings/hu.json index e83e7516b2..117a166d8a 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -107,9 +107,9 @@ "HeaderIdentifyItemHelp": "Adj meg egy vagy több keresési kritériumot. Távolítsd el a kritériumokat a keresési eredmények növelése érdekében.", "HeaderImageSettings": "Kép beállítások", "HeaderInstall": "Telepítés", - "HeaderLatestEpisodes": "Legújabb epizódok", - "HeaderLatestMedia": "Legújabb média", - "HeaderLatestMovies": "Legújabb filmek", + "HeaderLatestEpisodes": "Nemrég hozzáadott epizódok", + "HeaderLatestMedia": "Nemrég hozzáadott tartalmak", + "HeaderLatestMovies": "Nemrég hozzáadott filmek", "HeaderLibraries": "Könyvtárak", "HeaderLibraryAccess": "Könyvtár hozzáférés", "HeaderLibraryFolders": "Médiatár mappák", @@ -156,7 +156,7 @@ "HeaderVideos": "Videók", "HeaderYears": "Év", "Help": "Súgó", - "HideWatchedContentFromLatestMedia": "A megtekintett tartalom elrejtése a \"Legújabb Média\"-ból", + "HideWatchedContentFromLatestMedia": "A megtekintett tartalom elrejtése a \"Nemrég hozzáadott felvételek\"-ből", "Home": "Kezdőlap", "Identify": "Azonosítás", "Images": "Képek", @@ -395,7 +395,7 @@ "TabCodecs": "Kódek", "TabContainers": "Tároló", "TabDashboard": "Vezérlőpult", - "TabLatest": "Legújabb", + "TabLatest": "Nemrég hozzáadott", "TabLogs": "Naplók", "TabMusic": "Zene", "TabMyPlugins": "Telepített bővítmények", @@ -519,7 +519,7 @@ "Disc": "Lemez", "Disconnect": "Bontás", "DisplayInMyMedia": "Megjelenítés a kezdőképernyőn", - "DisplayInOtherHomeScreenSections": "Megjelenítés a kezdőképernyőn, mint például a 'Legújabb Média', és a 'Folyamatban lévő filmek'", + "DisplayInOtherHomeScreenSections": "Megjelenítés a kezdőképernyőn, mint például a 'Nemrég hozzáadott', és a 'Korábban megtekintett'", "DisplayModeHelp": "Válaszd ki a használni kívánt elrendezést.", "DoNotRecord": "Ne rögzítsen", "DownloadsValue": "{0} letöltés", @@ -604,8 +604,8 @@ "HeaderInstantMix": "Azonnali keverés", "HeaderKeepRecording": "Felvétel készítése", "HeaderKodiMetadataHelp": "Az NFO-metaadatok engedélyezéséhez vagy letiltásához szerkesszen egy könyvtárat, és keresse meg a „Metaadat-mentők” részt.", - "HeaderLatestMusic": "Legújabb zenék", - "HeaderLatestRecordings": "Legújabb felvételek", + "HeaderLatestMusic": "Nemrég hozzáadott zenék", + "HeaderLatestRecordings": "Nemrég hozzáadott felvételek", "HeaderLoginFailure": "Bejelentkezési hiba", "HeaderMusicQuality": "Zene minősége", "HeaderNewApiKey": "Új API kulcs", @@ -1510,7 +1510,7 @@ "Framerate": "Képkockasebesség", "DirectPlayHelp": "A forrásfájl teljes mértékben kompatibilis ezzel az klienssel, és a munkamenet módosítások nélkül fogadja a fájlt.", "HeaderContinueReading": "Olvasás folytatása", - "EnableGamepadHelp": "Figyeljen bármilyen csatlakoztatott kontroller bemenetére.", + "EnableGamepadHelp": "Figyeljen bármilyen csatlakoztatott bemenetre. (Szükséges: TV megjelenítési mód)", "LabelEnableGamepad": "Engedélyezze a Gamepad-ot", "Controls": "Vezérlők", "TextSent": "Szöveg elküldve.", @@ -1685,5 +1685,30 @@ "MessageNoItemsAvailable": "Jelenleg nincs elérhető elem.", "MessageNoFavoritesAvailable": "Jelenleg nincs elérhető kedvenc.", "Unreleased": "Még nem jelent meg", - "DownloadAll": "Összes letöltése" + "DownloadAll": "Összes letöltése", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Beágyazott címek használata.", + "SaveRecordingNFO": "A rögzített EPG metaadatok mentése NFO-ba", + "SubtitleBlack": "Fekete", + "SubtitleBlue": "Kék", + "SubtitleCyan": "Cián", + "SubtitleGray": "Szürke", + "SubtitleGreen": "Zöld", + "SubtitleLightGray": "Világos szürke", + "SubtitleMagenta": "Bíborvörös", + "SubtitleRed": "Piros", + "SubtitleWhite": "Fehér", + "SubtitleYellow": "Sárga", + "SecondarySubtitles": "Másodlagos feliratok", + "StereoDownmixAlgorithmHelp": "Többcsatornás hangot sztereóvá keverő algoritmus használata.", + "LabelDummyChapterCountHelp": "Az egyes médiafájlokból kibontható fejezetképek maximális száma.", + "PreferEmbeddedExtrasTitlesOverFileNames": "Részesítse előnyben a beágyazott címeket a fájlnevekkel szemben", + "SaveRecordingImages": "Rögzített EPG-képek mentése", + "Experimental": "Tapasztalati", + "LabelStereoDownmixAlgorithm": "Térhatású csatornák egyesítése", + "HeaderDummyChapter": "Fejezetképek", + "HeaderRecordingMetadataSaving": "Metaadatok rögzítése", + "LabelDummyChapterDuration": "Intervallum:", + "LabelDummyChapterCount": "Határvonal:", + "LabelChapterImageResolution": "Felbontás:", + "LabelChapterImageResolutionHelp": "A kinyert fejezetképek felbontása." } From 78cb9e06adda647f8ddecf23be850727f6056274 Mon Sep 17 00:00:00 2001 From: herinonja Date: Wed, 1 Mar 2023 02:16:26 -0500 Subject: [PATCH 110/156] Added translation using Weblate (Malagasy) --- src/strings/mg.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/strings/mg.json diff --git a/src/strings/mg.json b/src/strings/mg.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src/strings/mg.json @@ -0,0 +1 @@ +{} From a5df24c76edc53317f0dee97fe2403d8177da98e Mon Sep 17 00:00:00 2001 From: Oskari Lavinto Date: Wed, 1 Mar 2023 09:58:02 +0000 Subject: [PATCH 111/156] Translated using Weblate (Finnish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/ --- src/strings/fi.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/strings/fi.json b/src/strings/fi.json index d2051489b4..e35b229682 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -343,7 +343,7 @@ "LabelAbortedByServerShutdown": "(Keskeytetty palvelimen sammutuksen takia)", "Identify": "Tunnista", "Horizontal": "Horisontaalinen", - "HideWatchedContentFromLatestMedia": "Piilota toistettu sisältö 'Hiljattain lisätty media' -osiosta", + "HideWatchedContentFromLatestMedia": "Piilota toistettu sisältö 'Viimeksi lisätty media' -osiosta", "HeaderUpcomingOnTV": "Tulossa televisiosta", "HeaderTypeImageFetchers": "Kuvien lataajat ({0}):", "HeaderTranscodingProfile": "Transkoodausprofiili", @@ -411,11 +411,11 @@ "HeaderMediaFolders": "Mediakansiot", "HeaderMedia": "Media", "HeaderLibraryFolders": "Kirjaston kansiot", - "HeaderLatestMedia": "Hiljattain lisätty media", - "HeaderLatestRecordings": "Hiljattain lisätyt tallenteet", - "HeaderLatestMusic": "Hiljattain lisätty musiikki", - "HeaderLatestMovies": "Hiljattain lisätyt elokuvat", - "HeaderLatestEpisodes": "Hiljattain lisätyt jaksot", + "HeaderLatestMedia": "Viimeksi lisätty media", + "HeaderLatestRecordings": "Viimeksi lisätyt tallenteet", + "HeaderLatestMusic": "Viimeksi lisätty musiikki", + "HeaderLatestMovies": "Viimeksi lisätyt elokuvat", + "HeaderLatestEpisodes": "Viimeksi lisätyt jaksot", "HeaderInstall": "Asenna", "HeaderFrequentlyPlayed": "Usein toistetut", "HeaderFetcherSettings": "Lataajan asetukset", @@ -562,7 +562,7 @@ "TabMyPlugins": "Omat lisäosat", "TabMusic": "Musiikki", "TabLogs": "Lokit", - "TabLatest": "Hiljattain lisätyt", + "TabLatest": "Viimeksi lisätyt", "TabDirectPlay": "Muuntamaton toisto", "TabDashboard": "Hallintapaneeli", "TabCatalog": "Luettelo", @@ -1264,7 +1264,7 @@ "LabelMinAudiobookResumeHelp": "Kohteita pidetään toistamattomina, jos toisto keskeytetään ennen tätä aikaa.", "LabelMaxStreamingBitrate": "Suoratoiston enimmäislaatu:", "MoreFromValue": "Lisää kohteesta {0}", - "LatestFromLibrary": "Hiljattain lisätty: '{0}'", + "LatestFromLibrary": "Viimeksi lisätty: {0}", "LabelVideoRange": "Videon alue:", "LabelVaapiDeviceHelp": "Tämä on renderöintinoodi, jota käytetään laitteistokiihdytykseen.", "LabelUserRemoteClientBitrateLimitHelp": "Korvaa globaali arvo asetusten kohdasta Ohjauspaneeli > Toisto > Suoratoisto.", From d57ec4333d77e7b52f6b1e79eea39df66be6ec29 Mon Sep 17 00:00:00 2001 From: herinonja Date: Wed, 1 Mar 2023 07:26:29 +0000 Subject: [PATCH 112/156] Translated using Weblate (Malagasy) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/mg/ --- src/strings/mg.json | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/strings/mg.json b/src/strings/mg.json index 0967ef424b..54e2956c06 100644 --- a/src/strings/mg.json +++ b/src/strings/mg.json @@ -1 +1,42 @@ -{} +{ + "Add": "Manampy", + "AddToPlaylist": "Ampiana ao amin'ny playlist", + "AddToPlayQueue": "Ampiana ao amin'ny filaharana", + "AirDate": "Daty fandefasana", + "Aired": "Nalefa", + "AlbumArtist": "Artista tompon'ny Album", + "Alerts": "Lakolosy", + "AllChannels": "Fahitalavitra rehetra", + "AllowMediaConversion": "Avela hiasa hanao famadiahana format", + "AllowEmbeddedSubtitlesAllowNoneOption": "Tsy asiana mihitsy", + "AllowEmbeddedSubtitlesAllowTextOption": "Asiana soratra", + "Absolute": "Feno", + "AccessRestrictedTryAgainLater": "Voafetra ny fidirana amin'izao fotoana izao. Andramo indray afaka fotoana fohy.", + "Actor": "Mpilalao", + "AddedOnValue": "Nampiana", + "AdditionalNotificationServices": "Tsidiho ny katalaogin'ny plugin raha hanampy serivisy fampahafantarana fanampiny.", + "AddToCollection": "Ampiana ao amin'ny fitahirizana", + "AddToFavorites": "Ampiana ao amin'ireo ankafihizina", + "AgeValue": "({0} taona)", + "Album": "Album", + "Albums": "Albums", + "All": "Rehetra", + "AllComplexFormats": "Ireo endrika sarotra rehetra (ASS, SSA, VobSub, PGS, SUB, IDX, …)", + "AllEpisodes": "Fizaràna rehetra", + "AllLanguages": "Tenim-pirenena rehetra", + "AllLibraries": "Tahiry rehetra", + "AllowedRemoteAddressesHelp": "Lisitry ny adiresy IP na IP/netmask nosarahan'ny faingo ho an'ny tambajotra izay avela hifandray lavitra. Raha avela ho banga dia afaka miditra avokoa ny IP rehetra.", + "AllowEmbeddedSubtitles": "Atsahatra ny karazana dikanteny ao anatiny", + "AllowEmbeddedSubtitlesAllowAllOption": "Avela malalaka", + "AllowEmbeddedSubtitlesAllowImageOption": "Asiana sary", + "AllowEmbeddedSubtitlesHelp": "Atsahatra ny dikanteny raikitra ao anaty media. Mila fanavaozana ny tahiry rehetra.", + "AllowFfmpegThrottling": "Ahena ny asa famadihana format", + "AllowFfmpegThrottlingHelp": "Rehefa lasa lavitra mihoatra ny playback ny asa famadihana format dia atsahatra kely ny fampiasana CPU. Tena ilaina izany rehefa mijery fotsiny fa tsy mandingana na mamerina matetika. Aza alefa raha mahita olana amin'ny playback.", + "AllowHevcEncoding": "Avela hamadika format HEVC", + "AllowHWTranscodingHelp": "Avela ny tuner hiasa sady mamadika format. Mety hanampy amin'ny fampihenana ny asa takian'ny serveur izany.", + "AllowMediaConversionHelp": "Avela na lavina ny fidirana amin'ny asa famadihana format.", + "AllowOnTheFlySubtitleExtraction": "Avela hamaky dikanteny eny ampandehanana.", + "AllowOnTheFlySubtitleExtractionHelp": "Azo alaina avy amin'ilay video ny dikanteny ao anatiny ary aseho amin'ny soratra tsotra, mba hisorohana ny famadihana video. Mety haharitra ela izany ka hampiato ny famakiana horonan-tsary mandritra ny dingan'ny fitrandrahana. Atsaharo raha avela ho dikanteny miaraka amin'ny famadihana horonan-tsary.", + "AllowRemoteAccess": "Avela hifandray amin'ny hafa ity serveur ity", + "AllowRemoteAccessHelp": "Raha tsy marihina dia ho voasakana ny fifandraisana lavitra rehetra." +} From b3195991a3f4c13e3d3bfacb4260402a6adb7d0c Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 1 Mar 2023 09:35:21 -0500 Subject: [PATCH 113/156] Move public pages to react-router --- src/components/appRouter.js | 2 +- src/index.jsx | 5 +- src/routes/index.tsx | 4 +- src/routes/legacyRoutes/index.tsx | 1 + src/routes/legacyRoutes/public.ts | 81 ++++++++++++++++++++ src/scripts/routes.js | 123 ------------------------------ 6 files changed, 90 insertions(+), 126 deletions(-) create mode 100644 src/routes/legacyRoutes/public.ts delete mode 100644 src/scripts/routes.js diff --git a/src/components/appRouter.js b/src/components/appRouter.js index 05feb0ff9c..be7cfd5855 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -124,7 +124,7 @@ class AppRouter { isBack: action === Action.Pop }); } else { - console.info('[appRouter] "%s" route not found', normalizedPath, location); + // The route is not registered here, so it should be handled by react-router this.currentRouteInfo = { route: {}, path: normalizedPath + location.search diff --git a/src/index.jsx b/src/index.jsx index 57bdaa2f19..08b3bfada3 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -24,7 +24,6 @@ import { appRouter, history } from './components/appRouter'; import './elements/emby-button/emby-button'; import './scripts/autoThemes'; import './scripts/libraryMenu'; -import './scripts/routes'; import './components/themeMediaPlayer'; import './scripts/autoBackdrops'; import { pageClassOn, serverAddress } from './utils/dashboard'; @@ -39,6 +38,10 @@ import { currentSettings } from './scripts/settings/userSettings'; import taskButton from './scripts/taskbutton'; import App from './App.tsx'; +import './styles/livetv.scss'; +import './styles/dashboard.scss'; +import './styles/detailtable.scss'; + function loadCoreDictionary() { const languages = ['af', 'ar', 'be-by', 'bg-bg', 'bn_bd', 'ca', 'cs', 'cy', 'da', 'de', 'el', 'en-gb', 'en-us', 'eo', 'es', 'es_419', 'es-ar', 'es_do', 'es-mx', 'et', 'eu', 'fa', 'fi', 'fil', 'fr', 'fr-ca', 'gl', 'gsw', 'he', 'hi-in', 'hr', 'hu', 'id', 'it', 'ja', 'kk', 'ko', 'lt-lt', 'lv', 'mr', 'ms', 'nb', 'nl', 'nn', 'pl', 'pr', 'pt', 'pt-br', 'pt-pt', 'ro', 'ru', 'sk', 'sl-si', 'sq', 'sv', 'ta', 'th', 'tr', 'uk', 'ur_pk', 'vi', 'zh-cn', 'zh-hk', 'zh-tw']; const translations = languages.map(function (language) { diff --git a/src/routes/index.tsx b/src/routes/index.tsx index be24c811d8..06e3badaf3 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -4,7 +4,7 @@ import { Navigate, Route, Routes } from 'react-router-dom'; import { ASYNC_ADMIN_ROUTES, ASYNC_USER_ROUTES, toAsyncPageRoute } from './asyncRoutes'; import ConnectionRequired from '../components/ConnectionRequired'; import ServerContentPage from '../components/ServerContentPage'; -import { LEGACY_ADMIN_ROUTES, LEGACY_USER_ROUTES, toViewManagerPageRoute } from './legacyRoutes'; +import { LEGACY_ADMIN_ROUTES, LEGACY_PUBLIC_ROUTES, LEGACY_USER_ROUTES, toViewManagerPageRoute } from './legacyRoutes'; const AppRoutes = () => ( @@ -28,6 +28,8 @@ const AppRoutes = () => ( {/* Public routes */} }> } /> + + {LEGACY_PUBLIC_ROUTES.map(toViewManagerPageRoute)} {/* Suppress warnings for unhandled routes */} diff --git a/src/routes/legacyRoutes/index.tsx b/src/routes/legacyRoutes/index.tsx index b4e97250e9..8f498f98aa 100644 --- a/src/routes/legacyRoutes/index.tsx +++ b/src/routes/legacyRoutes/index.tsx @@ -21,4 +21,5 @@ export function toViewManagerPageRoute(route: LegacyRoute) { } export * from './admin'; +export * from './public'; export * from './user'; diff --git a/src/routes/legacyRoutes/public.ts b/src/routes/legacyRoutes/public.ts new file mode 100644 index 0000000000..0e05875520 --- /dev/null +++ b/src/routes/legacyRoutes/public.ts @@ -0,0 +1,81 @@ +import { LegacyRoute } from '.'; + +export const LEGACY_PUBLIC_ROUTES: LegacyRoute[] = [ + { + path: 'addserver.html', + pageProps: { + controller: 'session/addServer/index', + view: 'session/addServer/index.html' + } + }, + { + path: 'selectserver.html', + pageProps: { + controller: 'session/selectServer/index', + view: 'session/selectServer/index.html' + } + }, + { + path: 'login.html', + pageProps: { + controller: 'session/login/index', + view: 'session/login/index.html' + } + }, + { + path: 'forgotpassword.html', + pageProps: { + controller: 'session/forgotPassword/index', + view: 'session/forgotPassword/index.html' + } + }, + { + path: 'forgotpasswordpin.html', + pageProps: { + controller: 'session/resetPassword/index', + view: 'session/resetPassword/index.html' + } + }, + { + path: 'wizardremoteaccess.html', + pageProps: { + controller: 'wizard/remote/index', + view: 'wizard/remote/index.html' + } + }, + { + path: 'wizardfinish.html', + pageProps: { + controller: 'wizard/finish/index', + view: 'wizard/finish/index.html' + } + }, + { + path: 'wizardlibrary.html', + pageProps: { + controller: 'dashboard/library', + view: 'wizard/library.html' + } + }, + { + path: 'wizardsettings.html', + pageProps: { + controller: 'wizard/settings/index', + view: 'wizard/settings/index.html' + } + }, + { + path: 'wizardstart.html', + pageProps: { + controller: 'wizard/start/index', + view: 'wizard/start/index.html' + } + }, + { + path: 'wizarduser.html', + pageProps: { + controller: 'wizard/user/index', + view: 'wizard/user/index.html' + } + } +]; diff --git a/src/scripts/routes.js b/src/scripts/routes.js deleted file mode 100644 index d90eb95eaa..0000000000 --- a/src/scripts/routes.js +++ /dev/null @@ -1,123 +0,0 @@ -import '../elements/emby-button/emby-button'; -import '../elements/emby-input/emby-input'; -import '../scripts/livetvcomponents'; -import '../elements/emby-button/paper-icon-button-light'; -import '../elements/emby-itemscontainer/emby-itemscontainer'; -import '../elements/emby-collapse/emby-collapse'; -import '../elements/emby-select/emby-select'; -import '../elements/emby-checkbox/emby-checkbox'; -import '../elements/emby-slider/emby-slider'; -import '../styles/livetv.scss'; -import '../components/listview/listview.scss'; -import '../styles/dashboard.scss'; -import '../styles/detailtable.scss'; -import { appRouter } from '../components/appRouter'; - -/* eslint-disable indent */ - - console.groupCollapsed('defining core routes'); - - function defineRoute(newRoute) { - const path = newRoute.alias ? newRoute.alias : newRoute.path; - console.debug('defining route: ' + path); - newRoute.dictionary = 'core'; - appRouter.addRoute(path, newRoute); - } - - defineRoute({ - alias: '/addserver.html', - path: 'session/addServer/index.html', - autoFocus: false, - anonymous: true, - startup: true, - controller: 'session/addServer/index' - }); - - defineRoute({ - alias: '/selectserver.html', - path: 'session/selectServer/index.html', - autoFocus: false, - anonymous: true, - startup: true, - controller: 'session/selectServer/index', - type: 'selectserver' - }); - - defineRoute({ - alias: '/login.html', - path: 'session/login/index.html', - autoFocus: false, - anonymous: true, - startup: true, - controller: 'session/login/index', - type: 'login' - }); - - defineRoute({ - alias: '/forgotpassword.html', - path: 'session/forgotPassword/index.html', - anonymous: true, - startup: true, - controller: 'session/forgotPassword/index' - }); - - defineRoute({ - alias: '/forgotpasswordpin.html', - path: 'session/resetPassword/index.html', - autoFocus: false, - anonymous: true, - startup: true, - controller: 'session/resetPassword/index' - }); - - defineRoute({ - alias: '/wizardremoteaccess.html', - path: 'wizard/remote/index.html', - autoFocus: false, - anonymous: true, - controller: 'wizard/remote/index' - }); - - defineRoute({ - alias: '/wizardfinish.html', - path: 'wizard/finish/index.html', - autoFocus: false, - anonymous: true, - controller: 'wizard/finish/index' - }); - - defineRoute({ - alias: '/wizardlibrary.html', - path: 'wizard/library.html', - autoFocus: false, - anonymous: true, - controller: 'dashboard/library' - }); - - defineRoute({ - alias: '/wizardsettings.html', - path: 'wizard/settings/index.html', - autoFocus: false, - anonymous: true, - controller: 'wizard/settings/index' - }); - - defineRoute({ - alias: '/wizardstart.html', - path: 'wizard/start/index.html', - autoFocus: false, - anonymous: true, - controller: 'wizard/start/index' - }); - - defineRoute({ - alias: '/wizarduser.html', - path: 'wizard/user/index.html', - controller: 'wizard/user/index', - autoFocus: false, - anonymous: true - }); - - console.groupEnd('defining core routes'); - -/* eslint-enable indent */ From 482ac2c39fcd8fa7186ca1d327e8c86f93744468 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 1 Mar 2023 15:56:52 +0000 Subject: [PATCH 114/156] Update Linters to v5.53.0 --- package-lock.json | 164 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ba2c5dd1a..f3fb256907 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,8 +68,8 @@ "@types/lodash-es": "4.17.6", "@types/react": "17.0.53", "@types/react-dom": "17.0.19", - "@typescript-eslint/eslint-plugin": "5.52.0", - "@typescript-eslint/parser": "5.52.0", + "@typescript-eslint/eslint-plugin": "5.53.0", + "@typescript-eslint/parser": "5.53.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.13", "babel-loader": "9.1.2", @@ -3175,14 +3175,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", - "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", + "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/type-utils": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/type-utils": "5.53.0", + "@typescript-eslint/utils": "5.53.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -3224,14 +3224,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", - "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", + "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", "debug": "^4.3.4" }, "engines": { @@ -3251,13 +3251,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", - "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", + "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0" + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3268,13 +3268,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", - "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", + "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/utils": "5.53.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3295,9 +3295,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", + "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3308,13 +3308,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", + "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3379,16 +3379,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", - "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", + "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -3420,12 +3420,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", + "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/types": "5.53.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -21355,14 +21355,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", - "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", + "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/type-utils": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/type-utils": "5.53.0", + "@typescript-eslint/utils": "5.53.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -21384,53 +21384,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", - "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", + "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", - "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", + "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0" + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.0" } }, "@typescript-eslint/type-utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", - "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", + "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/utils": "5.53.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", + "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", + "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -21470,16 +21470,16 @@ } }, "@typescript-eslint/utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", - "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", + "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -21497,12 +21497,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", + "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/types": "5.53.0", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { diff --git a/package.json b/package.json index fb09c8bbbc..5c70366b74 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "@types/lodash-es": "4.17.6", "@types/react": "17.0.53", "@types/react-dom": "17.0.19", - "@typescript-eslint/eslint-plugin": "5.52.0", - "@typescript-eslint/parser": "5.52.0", + "@typescript-eslint/eslint-plugin": "5.53.0", + "@typescript-eslint/parser": "5.53.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.13", "babel-loader": "9.1.2", From 7b9ae31c6bc1ee2b79994abd9578917d6c5b5fe0 Mon Sep 17 00:00:00 2001 From: hoanghuy309 Date: Wed, 1 Mar 2023 15:38:56 +0000 Subject: [PATCH 115/156] Translated using Weblate (Vietnamese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/ --- src/strings/vi.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/strings/vi.json b/src/strings/vi.json index ad55122705..e4af70ebe1 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -1695,5 +1695,15 @@ "PreferEmbeddedExtrasTitlesOverFileNames": "Ưu tiên tiêu đề được nhúng hơn tên tệp cho các tính năng bổ sung", "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Phần bổ sung thường có cùng tên được nhúng với phần gốc, hãy kiểm tra điều này để sử dụng các tiêu đề được nhúng cho chúng.", "HeaderDummyChapter": "Hình Ảnh Phân Đoạn", - "HeaderRecordingMetadataSaving": "Dữ Liệu Mô Tả Bản Ghi" + "HeaderRecordingMetadataSaving": "Dữ Liệu Mô Tả Bản Ghi", + "SubtitleYellow": "Vàng", + "SubtitleBlack": "Đen", + "SubtitleBlue": "Xanh lam", + "SubtitleCyan": "Lục lam", + "SubtitleGray": "Xám", + "SubtitleGreen": "Xanh lá", + "SubtitleLightGray": "Xám Nhạt", + "SubtitleMagenta": "Đỏ Sậm", + "SubtitleRed": "Đỏ", + "SubtitleWhite": "Trắng" } From 417539eea948fa63307e6aacaff573daa7b6d25f Mon Sep 17 00:00:00 2001 From: hoanghuy309 Date: Thu, 2 Mar 2023 02:04:44 +0000 Subject: [PATCH 116/156] Translated using Weblate (Vietnamese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/ --- src/strings/vi.json | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/strings/vi.json b/src/strings/vi.json index e4af70ebe1..c52f73cf88 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -14,20 +14,20 @@ "FileNotFound": "Không tìm thấy tệp tin.", "FileReadCancelled": "Tệp đọc đã bị hủy.", "FileReadError": "Có một lỗi xảy ra khi đọc tệp tin này.", - "HeaderCustomDlnaProfiles": "Hồ sơ khách hàng", + "HeaderCustomDlnaProfiles": "Cấu Hình Tùy Chỉnh", "HeaderFeatureAccess": "Truy cập tính năng:", "HeaderFrequentlyPlayed": "Phát thường xuyên", "HeaderLatestEpisodes": "Tập Phim Thêm Gần Đây", "HeaderLatestMovies": "Phim Thêm Gần Đây", "HeaderRecentlyPlayed": "Phát gần đây", "HeaderStatus": "Trạng thái", - "HeaderSystemDlnaProfiles": "Hồ sơ hệ thống", + "HeaderSystemDlnaProfiles": "Cấu Hình Hệ Thống", "HeaderUsers": "Người dùng", "LabelAudioLanguagePreference": "Ngôn ngữ thoại ưa thích:", "LabelCountry": "Quốc gia:", "LabelCurrentPassword": "Mật khẩu hiện tại:", "LabelDay": "Ngày trong tuần:", - "LabelEnableDlnaPlayTo": "Bật tính năng 'Phát tới' DLNA", + "LabelEnableDlnaPlayTo": "Bật tính năng 'Phát Với' DLNA", "LabelEvent": "Sự kiện:", "LabelFinish": "Xong", "LabelLanguage": "Ngôn ngữ:", @@ -175,7 +175,7 @@ "DeathDateValue": "Đã chết: {0}", "DatePlayed": "Ngày phát", "DateAdded": "Ngày thêm", - "CustomDlnaProfilesHelp": "Tạo một bộ thiết lập tuỳ chọn dành cho một thiết bị mới hoặc thay thế một thiết lập hệ thống.", + "CustomDlnaProfilesHelp": "Tạo cấu hình tùy chỉnh nhắm đến thiết bị mới hoặc ghi đè cấu hình hệ thống.", "CriticRating": "Đánh giá của nhà phê bình", "CopyStreamURLSuccess": "Đã sao chép URL thành công.", "CopyStreamURL": "Sao chép URL luồng phát", @@ -254,7 +254,7 @@ "HeaderDateIssued": "Ngày Phát Hành", "HeaderContinueWatching": "Xem Tiếp", "HeaderContinueListening": "Tiếp Tục Nghe", - "HeaderCodecProfileHelp": "Hồ sơ mã hóa chỉ ra những kiểu mã hoá nhất định mà một thiết bị có thể phát. Nếu một nội dung không thể phát, nó sẽ được chuyển mã, thậm chí nếu kiểu mã hoá đó được cấu hình để phát lại trực tiếp.", + "HeaderCodecProfileHelp": "Cấu hình mã hóa cho biết các giới hạn của thiết bị khi phát các bộ mã hóa. Nếu giới hạn được áp dụng thì phương tiện sẽ được chuyển mã, ngay cả khi bộ mã hóa được cấu hình để phát lại trực tiếp.", "HeaderContainerProfileHelp": "Cấu hình vùng chứa cho biết các giới hạn của thiết bị khi phát các định dạng cụ thể. Nếu giới hạn được áp dụng thì phương tiện sẽ được chuyển mã, ngay cả khi định dạng được định cấu hình để phát lại trực tiếp.", "HeaderContainerProfile": "Hồ Sơ Định Dạng", "HeaderConnectionFailure": "Kế Nối Thất Bại", @@ -452,9 +452,9 @@ "HeaderTracks": "Bản ghi", "HeaderThisUserIsCurrentlyDisabled": "Người dùng này hiện tại đang bị khoá", "HeaderTaskTriggers": "Kích Hoạt Tác Vụ", - "HeaderSubtitleProfilesHelp": "Hồ sơ phụ đề chỉ ra những định dạng phụ đề được hỗ trợ bởi thiết bị phát.", - "HeaderSubtitleProfiles": "Hồ Sơ Phụ Đề", - "HeaderSubtitleProfile": "Hồ Sơ Phụ Đề", + "HeaderSubtitleProfilesHelp": "Cấu hình phụ đề chỉ ra những định dạng phụ đề được hỗ trợ bởi thiết bị phát.", + "HeaderSubtitleProfiles": "Cấu Hình Phụ Đề", + "HeaderSubtitleProfile": "Cấu Hình Phụ Đề", "HeaderSubtitleDownloads": "Tải Phụ Đề", "HeaderSubtitleAppearance": "Giao Diện Phụ Đề", "HeaderStopRecording": "Ngừng Ghi Hình/Ghi Âm", @@ -503,7 +503,7 @@ "LabelAlbumArtPN": "Bìa Tuyển Tập PN:", "LabelAlbumArtMaxWidth": "Chiều rộng tối đa bìa tuyển tập:", "LabelAlbumArtMaxHeight": "Chiều cao tối đa bìa tuyển tập:", - "LabelAlbumArtHelp": "PN được sử dụng cho bìa tuyển tập, trong 'dlna:profileID' thuộc tính upnp:albumArtURI. Một vài thiết bị phát cần một giá trị đặc biệt, không ảnh hưởng đến kích thước của hình ảnh.", + "LabelAlbumArtHelp": "PN được dùng cho ảnh bìa album, trong thuộc tính 'dlna:profileID' trên 'upnp:albumArtURI'. Một số thiết bị yêu cầu một giá trị cụ thể, bất kể kích thước của hình ảnh.", "LabelAlbum": "Tuyển Tập:", "LabelAirsBeforeSeason": "Phát sóng trước phần:", "LabelAirsBeforeEpisode": "Phát sóng trước tập:", @@ -544,8 +544,8 @@ "HeaderTypeImageFetchers": "Trình tìm nạp hình ảnh ({0}):", "HeaderTuners": "Bộ Điều Khiển Thu Phát Sóng", "HeaderTunerDevices": "Thiết Bị Dò", - "HeaderTranscodingProfileHelp": "Thêm hồ sơ chuyển mã để chỉ ra những định dạng nên dùng khi cần chuyển mã.", - "HeaderTranscodingProfile": "Hồ Sơ Chuyển Mã", + "HeaderTranscodingProfileHelp": "Thêm cấu hình chuyển mã để cho biết định dạng nào sẽ được sử dụng khi cần chuyển mã.", + "HeaderTranscodingProfile": "Cấu Hình Chuyển Mã", "LabelEnableAutomaticPortMap": "Kích hoạt tính năng tự động kết nối các port", "LabelEmbedAlbumArtDidlHelp": "Một số thiết bị thích cách này hơn để tải ảnh bìa album. Số khác có thể bị lỗi nếu tuỳ chọn này được bật.", "LabelEmbedAlbumArtDidl": "Bìa tuyển tập trong DIDL", @@ -567,7 +567,7 @@ "LabelDidlMode": "Chế độ DIDL:", "LabelDeviceDescription": "Mô tả thiết bị:", "LabelDeinterlaceMethod": "Phương pháp khử xen kẽ:", - "LabelDefaultUserHelp": "Xác định thư viện người dùng sẽ hiển thị trên các thiết bị được kết nối. Tuỳ chọn này có thể được ghi đè trên hồ sơ của từng thiết bị.", + "LabelDefaultUserHelp": "Xác định thư viện người dùng sẽ hiển thị trên các thiết bị được kết nối. Điều này có thể được ghi đè trên cấu hình từng thiết bị.", "LabelDefaultUser": "Người dùng mặc định:", "LabelDefaultScreen": "Màn hình mặc định:", "LabelDeathDate": "Ngày mất:", @@ -590,10 +590,10 @@ "LabelEnableHttps": "Bật HTTPS", "LabelEnableHardwareDecodingFor": "Bật giải mã phần cứng cho:", "LabelEnableDlnaServerHelp": "Cho phép các thiết bị UPnP trong mạng của bạn duyệt và phát nội dung.", - "LabelEnableDlnaServer": "Bật tính năng máy chủ DLNA", + "LabelEnableDlnaServer": "Bật máy chủ DLNA", "LabelEnableDlnaPlayToHelp": "Phát hiện các thiết bị trong mạng của bạn và cung cấp khả năng điều khiển chúng từ xa.", "LabelEnableDlnaDebugLoggingHelp": "Tạo tệp nhật ký lớn và chỉ nên dùng khi cần thiết để xử lý sự cố.", - "LabelEnableDlnaDebugLogging": "Bật tính năng gỡ lỗi DLNA", + "LabelEnableDlnaDebugLogging": "Bật ghi nhật ký gỡ lỗi DLNA", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Xác định thời gian tính bằng giây giữa hai lần tìm kiếm SSDP.", "LabelEnableDlnaClientDiscoveryInterval": "Thời gian dò tìm máy khách:", "LabelEnableBlastAliveMessagesHelp": "Bật cái này nếu máy chủ không được các thiết bị UPnP khác trên mạng của bạn tìm ra một cách đáng tin cậy.", @@ -837,7 +837,7 @@ "LabelProfileVideoCodecs": "Mã hóa video:", "LabelProfileContainersHelp": "Phân cách bằng dấu phẩy. Để trống để áp dụng cho tất cả các định dạng.", "LabelProfileContainer": "Định dạng:", - "LabelProfileCodecsHelp": "Phân cách bằng dấu phẩy. Điều này có thể được để trống để áp dụng cho tất cả các mã hóa.", + "LabelProfileCodecsHelp": "Phân cách bằng dấu phẩy. Có thể để trống để dùng tất cả các mã hóa.", "LabelProfileCodecs": "Mã hóa:", "LabelProfileAudioCodecs": "Mã hóa âm thanh:", "LabelPreferredSubtitleLanguage": "Ngôn ngữ phụ đề ưu tiên:", @@ -1271,7 +1271,7 @@ "Transcoding": "Chuyển mã", "Trailers": "Đoạn giới thiệu", "TabAccess": "Truy cập", - "SystemDlnaProfilesHelp": "Cấu hình hệ thống ở chế độ chỉ đọc. Các thay đổi đối với cấu hình hệ thống sẽ được lưu vào cấu hình tùy chỉnh mới.", + "SystemDlnaProfilesHelp": "Cấu hình hệ thống ở chế độ chỉ đọc. Thay đổi cấu hình hệ thống sẽ được lưu vào cấu hình tùy chỉnh mới.", "Sports": "Thể thao", "SpecialFeatures": "Các tính năng đặc biệt", "SortName": "Sắp xếp tên", @@ -1532,7 +1532,7 @@ "InterlacedVideoNotSupported": "Video xen kẽ không được hỗ trợ", "AnamorphicVideoNotSupported": "Video Anamorphic không được hỗ trợ", "AudioSampleRateNotSupported": "Tốc độ mẫu của âm thanh không được hỗ trợ", - "AudioProfileNotSupported": "Cấu hình của mã hóa âm thanh không được hỗ trợ", + "AudioProfileNotSupported": "Cấu hình mã hóa âm thanh không được hỗ trợ", "VideoResolutionNotSupported": "Độ phân giải của video không được hỗ trợ", "AudioChannelsNotSupported": "Số kênh âm thanh không được hỗ trợ", "AudioBitrateNotSupported": "Tốc độ bit của âm thanh không được hỗ trợ", From f2fd96aced6cfd9f14d55d997b4228dd56ea6ba2 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Sun, 12 Feb 2023 17:16:20 -0500 Subject: [PATCH 117/156] fix: clear stuck subtitle track cues --- src/plugins/htmlVideoPlayer/plugin.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index f2a2b8d30b..8902b9cf25 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -620,6 +620,28 @@ function tryRemoveElement(elem) { return relativeOffset; } + /** + * @private + * These browsers will not clear the existing active cue when setting an offset + * for native TextTracks. + * Any previous text tracks that are on the screen when the offset changes will + * remain next to the new tracks until they reach the new offset's instance of the track. + */ + requiresHidingActiveCuesOnOffsetChange() { + return !!browser.firefox; + } + + /** + * @private + */ + hideTextTrackActiveCues(currentTrack) { + if (currentTrack.activeCues) { + Array.from(currentTrack.activeCues).forEach((cue) => { + cue.text = ''; + }); + } + } + /** * @private */ @@ -629,6 +651,9 @@ function tryRemoveElement(elem) { if (offsetValue === 0) { return; } + if (this.requiresHidingActiveCuesOnOffsetChange()) { + this.hideTextTrackActiveCues(currentTrack); + } Array.from(currentTrack.cues) .forEach(function (cue) { cue.startTime -= offsetValue; From f20ee0b2ea0c486b97dcc1c197ed76b813013e29 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Tue, 14 Feb 2023 18:43:19 -0500 Subject: [PATCH 118/156] fix: disable track mode to force clear active cues --- src/plugins/htmlVideoPlayer/plugin.js | 48 ++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 8902b9cf25..695829ca2b 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -245,6 +245,12 @@ function tryRemoveElement(elem) { * @type {any | null | undefined} */ #currentSecondaryTrackEvents; + /** + * Used to temporarily store the text track when + * force-clearing the `activeCue` for certain browsers + * @type {TextTrack | null | undefined} + */ + #currentTextTrack; /** * @type {string[] | undefined} */ @@ -624,8 +630,8 @@ function tryRemoveElement(elem) { * @private * These browsers will not clear the existing active cue when setting an offset * for native TextTracks. - * Any previous text tracks that are on the screen when the offset changes will - * remain next to the new tracks until they reach the new offset's instance of the track. + * Any previous text tracks that are on the screen when the offset changes will remain next + * to the new tracks until they reach the end time of the new offset's instance of the track. */ requiresHidingActiveCuesOnOffsetChange() { return !!browser.firefox; @@ -634,11 +640,30 @@ function tryRemoveElement(elem) { /** * @private */ - hideTextTrackActiveCues(currentTrack) { + hideTextTrackWithActiveCues(currentTrack) { if (currentTrack.activeCues) { - Array.from(currentTrack.activeCues).forEach((cue) => { - cue.text = ''; - }); + currentTrack.mode = 'hidden'; + } + } + + /** + * Forces the active cue to clear by disabling then re-enabling the track. + * The track mode is reverted inside of a 0ms timeout to free up the track + * and allow it to disable and clear the active cue. + * The track needs to be temporarily stored in order for us to access it + * inside the timeout. The stored value is reset after it is used. + * @private + */ + forceClearTextTrackActiveCues(currentTrack) { + if (currentTrack.activeCues) { + this.#currentTextTrack = currentTrack; + currentTrack.mode = 'disabled'; + setTimeout(() => { + if (this.#currentTextTrack) { + this.#currentTextTrack.mode = 'showing'; + this.#currentTextTrack = null; + } + }, 0); } } @@ -651,14 +676,21 @@ function tryRemoveElement(elem) { if (offsetValue === 0) { return; } - if (this.requiresHidingActiveCuesOnOffsetChange()) { - this.hideTextTrackActiveCues(currentTrack); + + const shouldClearActiveCues = this.requiresClearingActiveCuesOnOffsetChange(); + if (shouldClearActiveCues) { + this.hideTextTrackWithActiveCues(currentTrack); } + Array.from(currentTrack.cues) .forEach(function (cue) { cue.startTime -= offsetValue; cue.endTime -= offsetValue; }); + + if (shouldClearActiveCues) { + this.forceClearTextTrackActiveCues(currentTrack); + } } } From 2caa2851b9b9a08cafa607cd5d5582a27c3cc5e6 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel <30599893+is343@users.noreply.github.com> Date: Fri, 17 Feb 2023 09:43:04 -0500 Subject: [PATCH 119/156] fix: use correct name Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/plugins/htmlVideoPlayer/plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 695829ca2b..aaf22f759b 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -677,7 +677,7 @@ function tryRemoveElement(elem) { return; } - const shouldClearActiveCues = this.requiresClearingActiveCuesOnOffsetChange(); + const shouldClearActiveCues = this.requiresHidingActiveCuesOnOffsetChange(); if (shouldClearActiveCues) { this.hideTextTrackWithActiveCues(currentTrack); } From 032d03d20135d0cdb357ad6f2dda1603af5ede1e Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Sun, 19 Feb 2023 10:56:10 -0500 Subject: [PATCH 120/156] fix: don't set temp variable --- src/plugins/htmlVideoPlayer/plugin.js | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index aaf22f759b..7936067145 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -245,12 +245,6 @@ function tryRemoveElement(elem) { * @type {any | null | undefined} */ #currentSecondaryTrackEvents; - /** - * Used to temporarily store the text track when - * force-clearing the `activeCue` for certain browsers - * @type {TextTrack | null | undefined} - */ - #currentTextTrack; /** * @type {string[] | undefined} */ @@ -650,19 +644,13 @@ function tryRemoveElement(elem) { * Forces the active cue to clear by disabling then re-enabling the track. * The track mode is reverted inside of a 0ms timeout to free up the track * and allow it to disable and clear the active cue. - * The track needs to be temporarily stored in order for us to access it - * inside the timeout. The stored value is reset after it is used. * @private */ forceClearTextTrackActiveCues(currentTrack) { if (currentTrack.activeCues) { - this.#currentTextTrack = currentTrack; currentTrack.mode = 'disabled'; setTimeout(() => { - if (this.#currentTextTrack) { - this.#currentTextTrack.mode = 'showing'; - this.#currentTextTrack = null; - } + currentTrack.mode = 'showing'; }, 0); } } From acdbf59b50e7a6d2b0114d490048aee337cfaa1b Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Sun, 19 Feb 2023 17:29:34 -0500 Subject: [PATCH 121/156] chore: add debounce to setSubtitleOffset --- src/plugins/htmlVideoPlayer/plugin.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 7936067145..cef47fe119 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -32,6 +32,7 @@ import { getIncludeCorsCredentials } from '../../scripts/settings/webSettings'; import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../components/backdrop/backdrop'; import Events from '../../utils/events.ts'; import { includesAny } from '../../utils/container.ts'; +import debounce from 'lodash-es/debounce'; /** * Returns resolved URL. @@ -571,7 +572,12 @@ function tryRemoveElement(elem) { } } - setSubtitleOffset(offset) { + setSubtitleOffset = debounce(this._setSubtitleOffset, 500); + + /** + * @private + */ + _setSubtitleOffset(offset) { const offsetValue = parseFloat(offset); // if .ass currently rendering From 4c71de481547f61fbb46e5065b895b6ce5a6895b Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Mon, 20 Feb 2023 15:26:17 -0500 Subject: [PATCH 122/156] chore: use smaller debounce time --- src/plugins/htmlVideoPlayer/plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index cef47fe119..4e120e5f78 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -572,7 +572,7 @@ function tryRemoveElement(elem) { } } - setSubtitleOffset = debounce(this._setSubtitleOffset, 500); + setSubtitleOffset = debounce(this._setSubtitleOffset, 100); /** * @private From c0fc93dedcbdf87c49cef6f4d72817bb5cd57172 Mon Sep 17 00:00:00 2001 From: Ivan Schurawel Date: Tue, 21 Feb 2023 09:12:39 -0500 Subject: [PATCH 123/156] fix: cancel debounce on player unmount --- src/plugins/htmlVideoPlayer/plugin.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 4e120e5f78..8b5afd90d5 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -822,6 +822,8 @@ function tryRemoveElement(elem) { } destroy() { + this.setSubtitleOffset.cancel(); + destroyHlsPlayer(this); destroyFlvPlayer(this); From 6fe1eec1ef1933cc8b23e0e4bb76bcb4786affda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=80=A0xu=5Fzh?= Date: Thu, 2 Mar 2023 08:41:26 +0000 Subject: [PATCH 124/156] 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 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index cee2f4d006..d6e77b18ef 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1704,5 +1704,15 @@ "LabelDummyChapterCountHelp": "每个媒体文件的最大章节图像提取数。", "LabelChapterImageResolution": "分辨率:", "LabelChapterImageResolutionHelp": "提取的章节图像的分辨率。", - "SecondarySubtitles": "次字幕" + "SecondarySubtitles": "次字幕", + "SubtitleBlack": "黑色", + "SubtitleGray": "灰色", + "SubtitleLightGray": "淡灰色", + "SubtitleWhite": "白色", + "SubtitleBlue": "蓝色", + "SubtitleCyan": "青色", + "SubtitleGreen": "绿色", + "SubtitleMagenta": "品红色", + "SubtitleRed": "红色", + "SubtitleYellow": "黄色" } From 20bcff0791e1f63a42821dec32a6d7d9b55c291b Mon Sep 17 00:00:00 2001 From: Andi Chandler Date: Sat, 4 Mar 2023 00:57:09 +0000 Subject: [PATCH 125/156] Translated using Weblate (English (United Kingdom)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/ --- src/strings/en-gb.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index a4e975a8a5..3dfb6b8d0d 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -1704,5 +1704,15 @@ "SaveRecordingNFO": "Save recording EPG metadata in NFO", "PreferEmbeddedExtrasTitlesOverFileNames": "Prefer embedded titles over filenames for extras", "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Extras often have the same embedded name as the parent, check this to use embedded titles for them anyway.", - "SecondarySubtitles": "Secondary Subtitles" + "SecondarySubtitles": "Secondary Subtitles", + "SubtitleBlack": "Black", + "SubtitleBlue": "Blue", + "SubtitleCyan": "Cyan", + "SubtitleGray": "Grey", + "SubtitleGreen": "Green", + "SubtitleLightGray": "Light Grey", + "SubtitleMagenta": "Magenta", + "SubtitleRed": "Red", + "SubtitleWhite": "White", + "SubtitleYellow": "Yellow" } From 56c848f31ecef81cba8a65e3837f65040fad2407 Mon Sep 17 00:00:00 2001 From: Bas Date: Sat, 4 Mar 2023 09:11:12 +0000 Subject: [PATCH 126/156] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 1d40cce4f7..58b353961d 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -324,7 +324,7 @@ "HeaderPreferredMetadataLanguage": "Gewenste metadata taal", "HeaderProfileInformation": "Profiel Informatie", "HeaderProfileServerSettingsHelp": "Deze waarden bepalen hoe de server zich zal presenteren aan het apparaat.", - "HeaderRecentlyPlayed": "Recent afgespeeld", + "HeaderRecentlyPlayed": "Onlangs afgespeeld", "HeaderRecordingOptions": "Opname instellingen", "HeaderRecordingPostProcessing": "Nabewerking opname", "HeaderRemoteControl": "Afstandsbediening", @@ -694,7 +694,7 @@ "LabelffmpegPathHelp": "Het pad naar het FFmpeg applicatiebestand, of de folder die FFmpeg bevat.", "LanNetworksHelp": "Komma-gescheiden lijst van IP-adressen of IP/netmask adressen voor netwerken die als lokaal gezien worden wanneer bandbreedtebeperkingen van toepassing zijn. Indien ingesteld, worden alle overige IP-adressen gezien als externe adressen en zullen worden onderworpen aan de bandbreedte-instellingen voor externe adressen. Indien blanco, zal alleen het subnet van de server als lokaal netwerk gezien worden.", "Large": "Groot", - "LatestFromLibrary": "Onlangs toegevoegd in {0}", + "LatestFromLibrary": "Onlangs toegevoegd aan {0}", "LearnHowYouCanContribute": "Lees meer over hoe u kunt bijdragen.", "LibraryAccessHelp": "Selecteer de bibliotheken om met deze gebruiker te delen. Beheerders kunnen alle mappen bewerken via de metadata-beheerder.", "List": "Lijst", From 19818bda60d0a6ade352faff8fa83c649bdc7404 Mon Sep 17 00:00:00 2001 From: kaypiff Date: Sat, 4 Mar 2023 10:15:36 +0000 Subject: [PATCH 127/156] Translated using Weblate (Polish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/ --- src/strings/pl.json | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/strings/pl.json b/src/strings/pl.json index ace38a17b4..d6f9ab9972 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -150,7 +150,7 @@ "Disconnect": "Rozłącz", "Display": "Wyświetlanie", "DisplayInMyMedia": "Wyświetlaj na ekranie startowym", - "DisplayInOtherHomeScreenSections": "Wyświetlaj na ekranie startowym sekcje 'Ostatnio dodane' i 'Kontynuuj odtwarzanie'", + "DisplayInOtherHomeScreenSections": "Wyświetlaj w sekcjach ekranu startowego, jak \"Ostatnio dodane media\" i \"Oglądaj dalej\"", "DisplayMissingEpisodesWithinSeasons": "Wyświetlaj w sezonach brakujące odcinki", "DisplayMissingEpisodesWithinSeasonsHelp": "Ta opcja musi zostać dodatkowo aktywowana w bibliotece seriali, w konfiguracji serwera.", "DisplayModeHelp": "Wybierz styl układu interfejsu.", @@ -301,11 +301,11 @@ "HeaderKeepRecording": "Zachowaj nagranie", "HeaderKeepSeries": "Zachowaj nagranie serialu", "HeaderKodiMetadataHelp": "By aktywować lub dezaktywować metadane NFO, edytuj ustawienia biblioteki w sekcji 'dostawcy metadanych'.", - "HeaderLatestEpisodes": "Odcinki ostatnio dodane", - "HeaderLatestMedia": "Media ostatnio dodane", - "HeaderLatestMovies": "Filmy ostatnio dodane", - "HeaderLatestMusic": "Muzyka ostatnio dodana", - "HeaderLatestRecordings": "Nagrania ostatnio dodane", + "HeaderLatestEpisodes": "Ostatnio dodane odcinki", + "HeaderLatestMedia": "Ostatnio dodane media", + "HeaderLatestMovies": "Ostatnio dodane filmy", + "HeaderLatestMusic": "Ostatnio dodana muzyka", + "HeaderLatestRecordings": "Ostatnio dodane nagrania", "HeaderLibraries": "Biblioteki", "HeaderLibraryAccess": "Dostęp do Bibliotek", "HeaderLibraryFolders": "Foldery biblioteki", @@ -1701,5 +1701,18 @@ "SaveRecordingNFO": "Zapisz nagrane metadane EPG w NFO", "SaveRecordingImages": "Zapisywanie obrazów EPG", "SaveRecordingImagesHelp": "Zapisz obrazy od dostawcy list EPG razem z mediami.", - "HeaderRecordingMetadataSaving": "Nagrywanie metadanych" + "HeaderRecordingMetadataSaving": "Nagrywanie metadanych", + "PreferEmbeddedExtrasTitlesOverFileNames": "Preferuj wbudowane tytuły zamiast nazw plików w materiałach dodatkowych", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Materiały dodatkowe często mają tę samą wbudowaną nazwę co rodzic, zaznacz, aby mimo to używać dla nich wbudowanych tytułów.", + "SubtitleBlack": "Czarny", + "SubtitleGreen": "Zielony", + "SubtitleMagenta": "Magenta", + "SubtitleBlue": "Niebieski", + "SubtitleCyan": "Cyjanowy", + "SubtitleGray": "Szary", + "SubtitleLightGray": "Jasnoszary", + "SubtitleRed": "Czerwony", + "SubtitleWhite": "Biały", + "SubtitleYellow": "Żółty", + "SecondarySubtitles": "Napisy drugorzędne" } From 12d2fb471ce6407389738a211198520e5215cbed Mon Sep 17 00:00:00 2001 From: Niels van Velzen Date: Sat, 4 Mar 2023 16:29:45 +0100 Subject: [PATCH 128/156] Support markdown in item descriptions --- src/controllers/itemDetails/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index c06043e472..05bfb8ee50 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1,5 +1,6 @@ import { intervalToDuration } from 'date-fns'; import DOMPurify from 'dompurify'; +import { marked } from 'marked'; import escapeHtml from 'escape-html'; import isEqual from 'lodash-es/isEqual'; @@ -877,7 +878,7 @@ function renderOverview(page, item) { const overviewElements = page.querySelectorAll('.overview'); if (overviewElements.length > 0) { - const overview = DOMPurify.sanitize(item.Overview || ''); + const overview = DOMPurify.sanitize(marked(item.Overview || '')); if (overview) { for (const overviewElemnt of overviewElements) { From 2db551880d0c6d187d2ac531d5c2d334cf81b7e0 Mon Sep 17 00:00:00 2001 From: Bas Date: Sun, 5 Mar 2023 07:56:22 +0000 Subject: [PATCH 129/156] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 58b353961d..7d493b7a6f 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -107,7 +107,7 @@ "ConfirmDeletion": "Bevestigen Verwijdering", "ConfirmEndPlayerSession": "Wilt u Jellyfin afsluiten op {0}?", "Connect": "Verbind", - "ContinueWatching": "Verder kijken", + "ContinueWatching": "Verderkijken", "Continuing": "Wordt vervolgd", "CriticRating": "Critici-beoordeling", "CustomDlnaProfilesHelp": "Maak een aangepast profiel om een nieuw apparaat aan te maken of overschrijf een systeemprofiel.", @@ -1544,7 +1544,7 @@ "LabelSyncPlaySettingsSkipToSyncHelp": "Synchronisatie correctiemethode die bestaat uit het zoeken naar de geschatte positie. Synchronisatie Correctie moet ingeschakeld zijn.", "MessageSent": "Bericht verzonden.", "Mixer": "Mixer", - "UseEpisodeImagesInNextUpHelp": "'Hierna'- en 'Verder kijken'-secties zullen afleveringsafbeeldingen gebruiken als thumbnails in plaats van de primaire thumbnail van de serie.", + "UseEpisodeImagesInNextUpHelp": "'Hierna'- en 'Verderkijken'-secties zullen afleveringsafbeeldingen gebruiken als thumbnails in plaats van de primaire thumbnail van de serie.", "SetUsingLastTracks": "Ondertitel/Audio-sporen instellen met vorig item", "SetUsingLastTracksHelp": "Probeer de ondertiteling/het audiospoor in te stellen op de video die het meest overeenkomt met de laatste video.", "TextSent": "Tekst verzonden.", @@ -1560,7 +1560,7 @@ "LabelMaxDaysForNextUpHelp": "Zet het maximaal aantal dagen dat een serie in de 'Hierna'-lijst staat zonder het te kijken.", "PreviousChapter": "Vorig hoofdstuk", "Remixer": "Remixer", - "UseEpisodeImagesInNextUp": "Gebruik afleveringscovers in de secties 'Hierna' en 'Verder kijken'", + "UseEpisodeImagesInNextUp": "Gebruik afleveringscovers in de secties 'Hierna' en 'Verderkijken'", "EnableGamepadHelp": "Luister naar input van alle aangesloten controllers. (Vereist weergavemodus 'Tv')", "VideoCodecNotSupported": "De videocodec wordt niet ondersteund", "AudioBitrateNotSupported": "De bitrate van de audio wordt niet ondersteund", From 8e1e176f8b352ff3c56f8b7f08fb20fe7bf79abc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 5 Mar 2023 10:32:49 +0000 Subject: [PATCH 130/156] Update dependency eslint to v8.35.0 --- package-lock.json | 63 ++++++++++++++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7db7869d9c..68845f01b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,7 +81,7 @@ "css-loader": "6.7.3", "cssnano": "5.1.15", "es-check": "7.1.0", - "eslint": "8.34.0", + "eslint": "8.35.0", "eslint-plugin-compat": "4.1.2", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.27.5", @@ -2431,9 +2431,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", + "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2533,6 +2533,15 @@ "node": ">=4" } }, + "node_modules/@eslint/js": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", + "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@fontsource/noto-sans": { "version": "4.5.11", "resolved": "https://registry.npmjs.org/@fontsource/noto-sans/-/noto-sans-4.5.11.tgz", @@ -6401,12 +6410,13 @@ } }, "node_modules/eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", + "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.4.1", + "@eslint/eslintrc": "^2.0.0", + "@eslint/js": "8.35.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -6420,7 +6430,7 @@ "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", "espree": "^9.4.0", - "esquery": "^1.4.0", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", @@ -7205,9 +7215,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -20769,9 +20779,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", + "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -20845,6 +20855,12 @@ } } }, + "@eslint/js": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", + "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "dev": true + }, "@fontsource/noto-sans": { "version": "4.5.11", "resolved": "https://registry.npmjs.org/@fontsource/noto-sans/-/noto-sans-4.5.11.tgz", @@ -23830,12 +23846,13 @@ "dev": true }, "eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", + "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.4.1", + "@eslint/eslintrc": "^2.0.0", + "@eslint/js": "8.35.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -23849,7 +23866,7 @@ "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", "espree": "^9.4.0", - "esquery": "^1.4.0", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", @@ -24406,9 +24423,9 @@ "dev": true }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" diff --git a/package.json b/package.json index df6a353305..855dfabe16 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "css-loader": "6.7.3", "cssnano": "5.1.15", "es-check": "7.1.0", - "eslint": "8.34.0", + "eslint": "8.35.0", "eslint-plugin-compat": "4.1.2", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.27.5", From a1d398c82d3becb5f5d4883a87a220e6cf737fab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 5 Mar 2023 21:35:13 +0000 Subject: [PATCH 131/156] Update dependency core-js to v3.29.0 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68845f01b3..0f909a9694 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "blurhash": "2.0.5", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.28.0", + "core-js": "3.29.0", "date-fns": "2.29.3", "dompurify": "2.4.4", "epubjs": "0.4.2", @@ -5166,9 +5166,9 @@ } }, "node_modules/core-js": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz", - "integrity": "sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==", + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz", + "integrity": "sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -22911,9 +22911,9 @@ } }, "core-js": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz", - "integrity": "sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==" + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz", + "integrity": "sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==" }, "core-js-compat": { "version": "3.25.3", diff --git a/package.json b/package.json index 855dfabe16..f8c9f45023 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "blurhash": "2.0.5", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.28.0", + "core-js": "3.29.0", "date-fns": "2.29.3", "dompurify": "2.4.4", "epubjs": "0.4.2", From 912dd6cb69597515a8721cf83422379b0dad1a2d Mon Sep 17 00:00:00 2001 From: stanol Date: Sun, 5 Mar 2023 21:32:51 +0000 Subject: [PATCH 132/156] Translated using Weblate (Ukrainian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/ --- src/strings/uk.json | 69 ++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/src/strings/uk.json b/src/strings/uk.json index 2168357faf..3a6d695e64 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -351,7 +351,7 @@ "EnablePhotosHelp": "Зображення будуть виявлені та відображені разом з іншими медіафайлами.", "EnableNextVideoInfoOverlayHelp": "Наприкінці відео відображати інформацію про наступне відео у поточному списку відтворення.", "EnableNextVideoInfoOverlay": "Показувати інформацію про наступне відео під час відтворення", - "EnableFasterAnimationsHelp": "Використовуйте швидші анімації та переходи.", + "EnableFasterAnimationsHelp": "Використовувати швидші анімації та переходи.", "EnableFasterAnimations": "Прискорена анімація", "EnableExternalVideoPlayersHelp": "Меню зовнішнього плеєра буде показано під час запуску відтворення відео.", "LabelCollection": "Добірка:", @@ -382,7 +382,7 @@ "LabelAlbumArtMaxHeight": "Максимальна висота зображення альбому:", "LabelAlbum": "Альбом:", "ErrorDeletingItem": "Сталася помилка під час видалення елемента з сервера. Перевірте, що Jellyfin має доступ до папки з медіа, та спробуйте ще раз.", - "ErrorAddingXmlTvFile": "Сталася помилка під час доступу к XMLTV файлу. Переконайтесь, що файл існує, та спробуйте ще раз.", + "ErrorAddingXmlTvFile": "Сталася помилка під час доступу до XMLTV файлу. Переконайтесь, що файл існує, та спробуйте ще раз.", "ErrorAddingTunerDevice": "Сталася помилка під час додавання тюнера. Переконайтесь, що пристрій доступний, та спробуйте ще раз.", "ErrorAddingMediaPathToVirtualFolder": "Сталася помилка під чам додавання шляха медіа. Переконайтесь, що шлях вірний, та Jellyfin має до нього доступ.", "EncoderPresetHelp": "Виберіть більше значення, щоб покращити швидкість, або менше, щоб поліпшити якість.", @@ -467,7 +467,7 @@ "Guide": "Посібник", "FFmpegSavePathNotFound": "Неможливо знайти FFmpeg в відомих системних директоріях. Додаток FFprobe також потрібен для роботи і мусить знаходитись в тій самій директорії. Ці компоненти зазвичай постачаються разом. Будь ласка перевірте шлях до них.", "ErrorStartHourGreaterThanEnd": "Час закінчення має бути більшим за час початку.", - "ErrorGettingTvLineups": "Сталася помилка під час завантаження списку телеканалів. Будь ласка перевірте корректність інформації та спробуйте ще раз.", + "ErrorGettingTvLineups": "Сталася помилка під час завантаження списку телеканалів. Будь ласка перевірте коректність інформації та спробуйте ще раз.", "LabelLogs": "Журнали:", "LabelOptionalNetworkPathHelp": "Якщо ця папка є спільною у вашій мережі, надання шляхів спільного доступу до мережі може дозволити клієнтам на інших пристроях отримувати прямий доступ до медіафайлів. Наприклад, {0} або {1}.", "LabelOptionalNetworkPath": "Спільна мережева тека:", @@ -494,7 +494,7 @@ "LabelMinResumeDurationHelp": "Найкоротша тривалість відео в секундах, з збереженням місця продовження перегляду.", "LabelMinResumeDuration": "Мінімальна відрізок для відновлення:", "LabelMetadataDownloadLanguage": "Бажана мова завантаження:", - "LabelMetadataDownloadersHelp": "Увімкніть та ранжуйте бажані завантажувачі метаданих у порядку їх пріоритетності. Завантажувачі нижчого пріоритету будуть використовуватися лише для заповнення відсутньої інформації.", + "LabelMetadataDownloadersHelp": "Увімкнути та ранжувати бажані завантажувачі метаданих у порядку їх пріоритетності. Завантажувачі нижчого пріоритету будуть використовуватися лише для заповнення відсутньої інформації.", "LabelMetadata": "Метадані:", "LabelMessageTitle": "Назва повідомлення:", "LabelMessageText": "Текст повідомлення:", @@ -514,7 +514,7 @@ "LabelManufacturer": "Виробник:", "LabelLoginDisclaimerHelp": "Повідомлення, яке відображатиметься внизу сторінки для входу.", "LabelLoginDisclaimer": "Відмова від відповідальності:", - "LabelLockItemToPreventChanges": "Заблокуйте цей елемент, щоб запобігти майбутнім змінам", + "LabelLockItemToPreventChanges": "Заблокувати цей елемент, щоб запобігти майбутнім змінам", "LabelLocalHttpServerPortNumberHelp": "Номер порту TCP для сервера HTTP.", "LabelLocalHttpServerPortNumber": "Номер локального порту HTTP:", "LabelLineup": "Склад:", @@ -535,11 +535,11 @@ "LabelKeepUpTo": "Дотримуйтесь до:", "LabelIsForced": "Примусово", "LabelInternetQuality": "Якість в Інтернет:", - "LabelInNetworkSignInWithEasyPasswordHelp": "Використовуйте простий PIN-код для входу з клієнтів у вашій локальній мережі. Ваш звичайний пароль знадобиться лише далеко від дому. Якщо PIN-код залишити порожнім, вам не знадобиться пароль у вашій домашній мережі.", + "LabelInNetworkSignInWithEasyPasswordHelp": "Використовувати простий PIN-код для входу з клієнтів у вашій локальній мережі. Ваш звичайний пароль знадобиться лише далеко від дому. Якщо PIN-код залишити порожнім, вам не знадобиться пароль у вашій домашній мережі.", "LabelInNetworkSignInWithEasyPassword": "Увімкнути вхід у мережу за допомогою мого простого PIN-коду", "LabelImportOnlyFavoriteChannels": "Обмежити до каналів, позначених як обрані", "LabelImageType": "Тип зображення:", - "LabelImageFetchersHelp": "Увімкніть та ранжируйте вибрані програми збору зображень у порядку пріоритету.", + "LabelImageFetchersHelp": "Увімкнути та ранжувати вибрані програми збору зображень у порядку пріоритету.", "LabelIdentificationFieldHelp": "Підрядок або регулярний вираз, що не чутливий до регістру.", "LabelIconMaxWidth": "Максимальна ширина значка:", "LabelCreateHttpPortMap": "Увімкніть автоматичне зіставлення портів для трафіку HTTP, а також HTTPS.", @@ -684,8 +684,8 @@ "LanNetworksHelp": "Список IP -адрес або записів IP/маски мережі, розділених комами, для мереж, які будуть враховуватися у локальній мережі під час застосування обмежень пропускної здатності. Якщо встановлено, усі інші IP -адреси вважатимуться зовнішніми мережами і на них поширюватимуться обмеження зовнішньої пропускної здатності. Якщо залишити це поле пустим, у локальній мережі вважається лише підмережа сервера.", "LabelTranscodingThreadCountHelp": "Виберіть максимальну кількість потоків для використання при перекодуванні. Зменшення кількості потоків знизить використання процесора, але може перетворити його недостатньо швидко для плавного відтворення.", "LabelTonemappingThresholdHelp": "Параметри алгоритму тонального відображення налаштовуються для кожної сцени. Поріг використовується для визначення того, змінилася сцена чи ні. Якщо відстань між поточною середньою яскравістю кадру та поточною середньою частотою перевищує порогове значення, ми б повторно обчислили середню сцену та пікову яскравість. Рекомендовані та стандартні значення - 0,8 та 0,2.", - "LabelTonemappingDesatHelp": "Застосовуйте десатурацію для світлих тонів, які перевищують цей рівень яскравості. Чим вище параметр, тим більше інформації про колір буде збережено. Це налаштування допомагає запобігти неприродним стиранням кольорів для надсвітків, шляхом (плавного) перетворення на білий. Це робить зображення більш природними, за рахунок зменшення інформації про кольори, що виходять за межі діапазону. Рекомендовані та стандартні значення - 0 та 0,5.", - "LabelSelectFolderGroups": "Автоматично групуйте вміст із таких папок у види, такі як Фільми, Музика та ТБ:", + "LabelTonemappingDesatHelp": "Застосувати десатурацію для світлих тонів, які перевищують цей рівень яскравості. Чим вище параметр, тим більше інформації про колір буде збережено. Це налаштування допомагає запобігти неприродним стиранням кольорів для надсвітків, шляхом (плавного) перетворення на білий. Це робить зображення більш природними, за рахунок зменшення інформації про кольори, що виходять за межі діапазону. Рекомендовані та стандартні значення - 0 та 0,5.", + "LabelSelectFolderGroups": "Автоматично групувати вміст із таких папок у види, такі як Фільми, Музика та ТБ:", "LabelSaveLocalMetadataHelp": "Збереження творів мистецтва в папках для медіа помістить їх у місце, де їх можна легко редагувати.", "LabelRequireHttpsHelp": "Якщо цей прапорець встановлено, сервер автоматично перенаправлятиме всі запити через HTTP на HTTPS. Це не впливає, якщо сервер не прослуховує протокол HTTPS.", "LabelRepositoryNameHelp": "Спеціальна назва, щоб відрізняти це сховище від будь -яких інших, доданих на ваш сервер.", @@ -726,7 +726,7 @@ "HeaderLatestRecordings": "Нещодавно додані записи", "HeaderKodiMetadataHelp": "Щоб увімкнути або вимкнути метадані NFO, відкрийте меню редагування медіатеки та знайдіть розділ \"Збереження метаданих\".", "HeaderKeepSeries": "Зберегти серіал", - "HeaderKeepRecording": "Продовжуйте записувати", + "HeaderKeepRecording": "Продовжувати записувати", "HeaderInstantMix": "Миттєвий мікс", "HeaderInstall": "Встановити", "HeaderImageSettings": "Налаштування зображення", @@ -778,7 +778,7 @@ "Large": "Більший", "LabelHDHomerunPortRangeHelp": "Обмежує діапазон портів UDP HD-HomeRun до цього значення. (За замовчуванням 1024 - 65535).", "HeaderSelectServerCachePathHelp": "Перегляньте або введіть шлях для файлів кешу сервера. Тека має бути з дозволом запису.", - "LabelSyncPlaySettingsExtraTimeOffsetHelp": "Вручну налаштуйте зсув часу (в мілісекундах) з вибраним пристроєм для синхронізації часу. Налаштуйте обережно.", + "LabelSyncPlaySettingsExtraTimeOffsetHelp": "Ручне налаштування зсуву часу (в мілісекундах) з вибраним пристроєм для синхронізації часу. Налаштовуйте обережно.", "LabelLocalCustomCss": "Спеціальний CSS-код для стилю, який стосується лише цього клієнта. Ви можете вимкнути користувацький CSS-код сервера.", "LabelMaxAudiobookResumeHelp": "Назви вважаються повністю відтвореними, якщо їх зупинити, коли тривалість, що залишилася, менша за це значення.", "LabelLibraryPageSizeHelp": "Встановлює кількість елементів для показу на сторінці медіатеки. Встановіть 0, щоб вимкнути підкачування сторінок.", @@ -797,7 +797,7 @@ "LabelH265Crf": "H.265, що кодує CRF:", "LabelH264Crf": "H.264, що кодує CRF:", "LabelGroupMoviesIntoCollectionsHelp": "Під час відображення списків фільмів фільми в добірці відображатимуться як один згрупований елемент.", - "LabelGroupMoviesIntoCollections": "Групуйте фільми у добірки", + "LabelGroupMoviesIntoCollections": "Групувати фільми у добірки", "LabelFriendlyName": "Спрощене ім'я:", "LabelFormat": "Формат:", "LabelForgotPasswordUsernameHelp": "Введіть своє ім’я користувача, якщо ви його пам’ятаєте.", @@ -808,7 +808,7 @@ "LabelffmpegPathHelp": "Шлях до файлу або папки програми FFmpeg, що містить FFmpeg.", "LabelffmpegPath": "Шлях FFmpeg:", "LabelFailed": "Не вдалося", - "LabelExtractChaptersDuringLibraryScan": "Витягуйте зображення розділів під час сканування медіатеки", + "LabelExtractChaptersDuringLibraryScan": "Витягувати зображення розділів під час сканування медіатеки", "LabelEvent": "Подія:", "LabelEveryXMinutes": "Кожен:", "LabelEpisodeNumber": "Номер епізоду:", @@ -829,7 +829,7 @@ "LabelEnableHardwareDecodingFor": "Увімкнути апаратне декодування для:", "LabelEnableDlnaServerHelp": "Дозволяє пристроям UPnP у вашій мережі переглядати та відтворювати вміст.", "LabelEnableDlnaServer": "Увімкнути сервер DLNA", - "LabelEnableDlnaPlayToHelp": "Виявляйте пристрої у вашій мережі та пропонуйте можливість керувати ними віддалено.", + "LabelEnableDlnaPlayToHelp": "Виявляти пристрої у вашій мережі та пропонувати можливість керувати ними віддалено.", "LabelEnableDlnaPlayTo": "Увімкніть функцію DLNA \"Play To\"", "LabelEnableDlnaDebugLoggingHelp": "Створює великі файли журналу, і їх слід використовувати лише за потреби для усунення несправностей.", "LabelEnableDlnaDebugLogging": "Увімкнути запис дебагу DLNA", @@ -849,7 +849,7 @@ "LabelDropImageHere": "Перетягніть зображення сюди або натисніть, щоб переглянути.", "LabelDownMixAudioScale": "Підсилення звуку під час мікшування:", "LabelDownloadLanguages": "Завантажити мови:", - "LabelDisplaySpecialsWithinSeasons": "Показуйте спеціальні пропозиції протягом сезонів, в яких вони виходили в етер", + "LabelDisplaySpecialsWithinSeasons": "Показувати спеціальні пропозиції протягом сезонів, в яких вони виходили в етер", "LabelDisplayOrder": "Порядок відображення:", "LabelDisplayName": "Відображуване ім'я:", "LabelDisplayMode": "Режим відображення:", @@ -868,7 +868,7 @@ "LabelDateAdded": "Дата додання:", "LabelDashboardTheme": "Тема інфопанелі сервера:", "LabelCustomRating": "Спеціальний рейтинг:", - "LabelCustomCssHelp": "Застосуйте свій власний код CSS для створення тем/брендингу у веб-інтерфейсі.", + "LabelCustomCssHelp": "Застосувати свій власний код CSS для створення тем/брендингу у веб-інтерфейсі.", "LabelCustomDeviceDisplayNameHelp": "Введіть спеціальне відображуване ім'я або залиште поле порожнім, щоб використовувати ім'я, повідомлене пристроєм.", "LabelCustomCss": "Кастомний CSS-код:", "LabelCustomCertificatePathHelp": "Шлях до файлу PKCS #12, що містить сертифікат та приватний ключ, щоб увімкнути підтримку TLS у користувацькому домені.", @@ -960,7 +960,7 @@ "LabelTonemappingRange": "Діапазон тонального відображення:", "LabelTonemappingPeakHelp": "Замінити сигнал/номінальний/еталонний пік за допомогою цього значення. Корисно, коли вбудована інформація про піки в метаданих дисплея не є надійною або коли тонове відображення з нижчого діапазону в більш високий діапазон. Рекомендовані значення і значення за замовчуванням – 100 і 0.", "LabelTonemappingPeak": "Пік тонального відображення:", - "LabelTonemappingParamHelp": "Налаштуйте алгоритм тонального відображення. Рекомендованим і стандартним значенням є NaN. Зазвичай залиште його порожнім.", + "LabelTonemappingParamHelp": "Налаштувати алгоритм тонального відображення. Рекомендованим і стандартним значенням є NaN. Зазвичай залишайте його порожнім.", "LabelTonemappingParam": "Параметр тонального відображення:", "LabelTonemappingDesat": "Відображення тональних даних:", "LabelTonemappingAlgorithm": "Виберіть алгоритм тонального відображення для використання:", @@ -999,7 +999,7 @@ "LabelSyncPlayNewGroup": "Нова група", "LabelSyncPlayLeaveGroupDescription": "Вимкніть SyncPlay", "LabelSyncPlayLeaveGroup": "Покинути групу", - "LabelSyncPlayHaltPlaybackDescription": "І ігноруйте поточні оновлення списку відтворення", + "LabelSyncPlayHaltPlaybackDescription": "Та ігнорувати поточні оновлення списку відтворення", "LabelSyncPlayHaltPlayback": "Зупинити локальне відтворення", "LabelSyncPlayAccessNone": "Вимкнено для цього користувача", "LabelSyncPlayAccessJoinGroups": "Дозволити користувачам приєднуватися до груп", @@ -1028,7 +1028,7 @@ "LabelSonyAggregationFlagsHelp": "Визначте вміст елемента 'aggregationFlags' в просторі імен 'urn:schemas-sonycom:av'.", "LabelSonyAggregationFlags": "Прапори агрегації Sony:", "LabelSlowResponseTime": "Час у мс, після якого відповідь вважається повільною:", - "LabelSlowResponseEnabled": "Зареєструйте попередження, якщо сервер повільно відповідає", + "LabelSlowResponseEnabled": "Зареєструвати попередження, якщо сервер повільно відповідає", "LabelSkipIfGraphicalSubsPresentHelp": "Збереження текстових версій субтитрів призведе до ефективнішої доставки та зменшить ймовірність перекодування відео.", "LabelSkipIfGraphicalSubsPresent": "Пропустити, якщо відео вже містить вбудовані субтитри", "LabelSkipIfAudioTrackPresentHelp": "Зніміть прапорець, щоб переконатися, що всі відео мають субтитри, незалежно від мови аудіо.", @@ -1077,7 +1077,7 @@ "LabelProfileAudioCodecs": "Аудіокодеки:", "LabelPreferredSubtitleLanguage": "Бажана мова субтитрів:", "LabelPreferredDisplayLanguage": "Бажана мова відображення:", - "LabelPostProcessorArgumentsHelp": "Використовуйте {path} як шлях до файлу запису.", + "LabelPostProcessorArgumentsHelp": "Використовувати {path} як шлях до файлу запису.", "LabelPostProcessorArguments": "Аргументи командного рядка постпроцесора:", "LabelPostProcessor": "Додаток для постобробки:", "LabelPleaseRestart": "Зміни набудуть чинності після ручного перезавантаження веб-клієнта.", @@ -1250,7 +1250,7 @@ "Premiere": "Прем'єра", "PreferEmbeddedTitlesOverFileNamesHelp": "Визначте заголовок відображення, який використовуватиметься, коли немає доступних Інтернет-метаданих або локальних метаданих.", "PreferEmbeddedTitlesOverFileNames": "Віддавайте перевагу вбудованим заголовкам над іменами файлів", - "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Використовуйте інформацію про епізод із вбудованих метаданих, якщо є.", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Використовувати інформацію про епізод із вбудованих метаданих, якщо є.", "PreferEmbeddedEpisodeInfosOverFileNames": "Віддавайте перевагу вбудованій інформації про епізоди над іменами файлів", "PosterCard": "Картка постеру", "Poster": "Постер", @@ -1290,7 +1290,7 @@ "OptionUnairedEpisode": "Невипущені епізоди", "OptionSpecialEpisode": "Спец", "OptionResumable": "Відновлюється", - "OptionRequirePerfectSubtitleMatch": "Завантажуйте лише субтитри, які ідеально підходять для відеофайлів", + "OptionRequirePerfectSubtitleMatch": "Завантажувати лише субтитри, які ідеально підходять для відеофайлів", "OptionReportByteRangeSeekingWhenTranscodingHelp": "Це потрібно для деяких пристроїв, які не дуже швидко шукають.", "OptionReportByteRangeSeekingWhenTranscoding": "Повідомте, що сервер підтримує пошук байтів під час перекодування", "OptionReleaseDate": "Дата випуску", @@ -1339,8 +1339,8 @@ "OptionDisableUserHelp": "Сервер не дозволить жодних з'єднань від цього користувача. Існуючі з’єднання будуть раптово обірвані.", "OptionDisableUser": "Вимкнути цього користувача", "OptionDatePlayed": "Дата відтворення", - "OptionDateAddedImportTime": "Використовуйте дату відсканування в медіатеку", - "OptionDateAddedFileTime": "Використовуйте дату створення файлу", + "OptionDateAddedImportTime": "Використовувати дату відсканування в медіатеку", + "OptionDateAddedFileTime": "Використовувати дату створення файлу", "OptionDateAdded": "Дата додавання", "OptionDaily": "Кожен день", "OptionCustomUsers": "Користувацький", @@ -1453,7 +1453,7 @@ "Smaller": "Менший", "SmallCaps": "Маленькі літери", "SkipEpisodesAlreadyInMyLibraryHelp": "Епізоди порівнюватимуться з використанням номерів сезонів та епізодів, якщо вони доступні.", - "SkipEpisodesAlreadyInMyLibrary": "Не записуйте епізоди, які вже є в моїй медіатеці", + "SkipEpisodesAlreadyInMyLibrary": "Не записувати епізоди, які вже є в моїй медіатеці", "SimultaneousConnectionLimitHelp": "Максимальна кількість дозволених одночасних потоків. Введіть 0 без обмежень.", "Shuffle": "Перемішати", "ShowMore": "Показати більше", @@ -1470,7 +1470,7 @@ "SeriesYearToPresent": "{0} – понині", "SeriesSettings": "Параметри серіалу", "SeriesRecordingScheduled": "Планується запис серіалу.", - "SeriesDisplayOrderHelp": "Упорядковуйте епізоди за датою ефіру, порядком DVD або абсолютною нумерацією.", + "SeriesDisplayOrderHelp": "Упорядковувати епізоди за датою ефіру, порядком DVD або абсолютною нумерацією.", "SeriesCancelled": "Серіал скасовано.", "Series": "Серіал", "SendMessage": "Відправити повідомлення", @@ -1518,7 +1518,7 @@ "SubtitleCodecNotSupported": "Кодек субтитрів не підтримується", "ContainerNotSupported": "Контейнер не підтримується", "AudioCodecNotSupported": "Аудіокодек не підтримується", - "EnableGamepadHelp": "Очікуйте вхідних даних від будь-яких підключених контролерів. (Вимагається: режим відображення «TV»)", + "EnableGamepadHelp": "Очікувати вхідних даних від будь-яких підключених контролерів. (Вимагається: режим відображення «TV»)", "LabelEnableGamepad": "Увімкнути геймпад", "Controls": "Елементи керування", "AllowVppTonemappingHelp": "Повне відображення тонів на основі драйверів Intel. Наразі працює лише на певному обладнанні з відео HDR10. Це має вищий пріоритет порівняно з іншою реалізацією OpenCL.", @@ -1583,7 +1583,7 @@ "UserProfilesIntro": "Jellyfin включає підтримку профілів користувачів із детальними налаштуваннями відображення, станом відтворення та батьківським контролем.", "UserAgentHelp": "Надайте спеціальний HTTP-заголовок «User-Agent».", "UseEpisodeImagesInNextUpHelp": "Розділи «Далі» та «Продовжити перегляд» використовуватимуть зображення епізодів як ескізи замість основного ескізу шоу.", - "UseEpisodeImagesInNextUp": "Використовуйте зображення епізодів у розділах «Далі» та «Продовжити перегляд»", + "UseEpisodeImagesInNextUp": "Використовувати зображення епізодів у розділах «Далі» та «Продовжити перегляд»", "UseDoubleRateDeinterlacing": "Подвоїте частоту кадрів під час деінтерлейсу", "Upload": "Завантажити", "Up": "Вгору", @@ -1700,5 +1700,16 @@ "LabelDummyChapterCount": "Ліміт:", "LabelDummyChapterCountHelp": "Максимальна кількість зображень розділів, які буде видобуто для кожного медіафайлу.", "LabelChapterImageResolution": "Роздільна здатність:", - "HeaderRecordingMetadataSaving": "Метадані запису" + "HeaderRecordingMetadataSaving": "Метадані запису", + "SubtitleBlack": "Чорний", + "SubtitleBlue": "Синій", + "SubtitleCyan": "Блакитний", + "SubtitleGray": "Сірий", + "SubtitleLightGray": "Світло-сірий", + "SubtitleMagenta": "Пурпуровий", + "SubtitleRed": "Червоний", + "SubtitleWhite": "Білий", + "SubtitleYellow": "Жовтий", + "SecondarySubtitles": "Додаткові субтитри", + "SubtitleGreen": "Зелений" } From 1c5f17d73871c5a95db4adccb6c4a46174d30011 Mon Sep 17 00:00:00 2001 From: robert-hamilton36 Date: Mon, 6 Mar 2023 14:05:41 +1300 Subject: [PATCH 133/156] Edit CSS to avoid text overflow --- src/components/upnextdialog/upnextdialog.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/upnextdialog/upnextdialog.scss b/src/components/upnextdialog/upnextdialog.scss index 08c4904bb5..fd2ae8d054 100644 --- a/src/components/upnextdialog/upnextdialog.scss +++ b/src/components/upnextdialog/upnextdialog.scss @@ -28,9 +28,9 @@ .upNextDialog-countdownText { font-weight: 500; + white-space: nowrap; } -.upNextDialog-nextVideoText, .upNextDialog-title { width: 25.5em; white-space: nowrap; From 7106611f9de01b1669a0d2e803621d8bf891608e Mon Sep 17 00:00:00 2001 From: WontTell Date: Mon, 6 Mar 2023 03:24:40 +0000 Subject: [PATCH 134/156] Translated using Weblate (Spanish (Latin America)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_419/ --- src/strings/es_419.json | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/strings/es_419.json b/src/strings/es_419.json index 707713eeea..db7ec1884c 100644 --- a/src/strings/es_419.json +++ b/src/strings/es_419.json @@ -16,7 +16,7 @@ "Books": "Libros", "Artists": "Artistas", "Albums": "Álbumes", - "TabLatest": "Recientes", + "TabLatest": "Agregado recientemente", "HeaderUser": "Usuario", "AlbumArtist": "Artista del álbum", "Album": "Álbum", @@ -309,7 +309,7 @@ "LibraryAccessHelp": "Selecciona las bibliotecas que deseas compartir con este usuario. Los administradores podrán editar todas las carpetas utilizando el gestor de metadatos.", "LeaveBlankToNotSetAPassword": "Puedes dejar este campo en blanco para no establecer ninguna contraseña.", "LearnHowYouCanContribute": "Aprende cómo puedes contribuir.", - "LatestFromLibrary": "Últimas - {0}", + "LatestFromLibrary": "Agregado recientemente en {0}", "Large": "Grande", "LanNetworksHelp": "Lista separada por comas de direcciones IP o entradas de IP/máscara de red para las redes que se considerarán en la red local al aplicar las restricciones de ancho de banda. Si se establecen, todas las demás direcciones IP se considerarán como parte de la red externa y estarán sujetas a las restricciones de ancho de banda externa. Si se deja en blanco, solo se considera a la subred del servidor estar en la red local.", "LabelffmpegPathHelp": "La ruta hacia el archivo ejecutable FFmpeg, o la carpeta que contenga FFmpeg.", @@ -875,7 +875,7 @@ "HttpsRequiresCert": "Para habilitar las conexiones seguras, necesitarás proporcionar un certificado SSL de confianza, como el de Let's Encrypt. Por favor, proporciona un certificado o desactiva las conexiones seguras.", "Horizontal": "Horizontal", "Home": "Inicio", - "HideWatchedContentFromLatestMedia": "Ocultar contenido ya visto de «Últimos medios»", + "HideWatchedContentFromLatestMedia": "Ocultar contenido ya visto de «Medios agregados recientemente»", "Hide": "Ocultar", "Help": "Ayuda", "HeaderYears": "Años", @@ -970,11 +970,11 @@ "HeaderLibraryFolders": "Carpetas de bibliotecas", "HeaderLibraryAccess": "Acceso a bibliotecas", "HeaderLibraries": "Bibliotecas", - "HeaderLatestRecordings": "Últimas grabaciones", - "HeaderLatestMusic": "Última música", - "HeaderLatestMovies": "Últimas películas", - "HeaderLatestMedia": "Últimos medios", - "HeaderLatestEpisodes": "Últimos episodios", + "HeaderLatestRecordings": "Grabaciones agregadas recientemente", + "HeaderLatestMusic": "Música agregada recientemente", + "HeaderLatestMovies": "Películas agregadas recientemente", + "HeaderLatestMedia": "Medios agregados recientemente", + "HeaderLatestEpisodes": "Episodios agregados recientemente", "HeaderKodiMetadataHelp": "Para habilitar o deshabilitar los metadatos NFO, edita una biblioteca y ubica la sección de 'Grabadores de metadatos'.", "HeaderKeepSeries": "Conservar serie", "HeaderKeepRecording": "Conservar grabación", @@ -1022,7 +1022,7 @@ "LabelLibraryPageSize": "Tamaño de las páginas de las bibliotecas:", "LabelLanguage": "Idioma:", "LabelLanNetworks": "Redes LAN:", - "LabelKodiMetadataUserHelp": "Guarda los datos de visto en archivos NFO para que otras aplicaciones los utilicen.", + "LabelKodiMetadataUserHelp": "Guarda los datos de visualización en los archivos NFO para que otras aplicaciones lo usen.", "LabelKodiMetadataUser": "Guardar los datos de visto del usuario en archivos NFO para:", "LabelKodiMetadataSaveImagePathsHelp": "Esto se recomienda si tienes nombres de imágenes que no se ajustan a los lineamientos de Kodi.", "LabelKodiMetadataSaveImagePaths": "Guardar las rutas de las imágenes en los archivos NFO", @@ -1166,7 +1166,7 @@ "DisplayModeHelp": "Selecciona el estilo de diseño que desea para la interfaz.", "DisplayMissingEpisodesWithinSeasonsHelp": "Esto también debe estar habilitado para las bibliotecas de TV en la configuración del servidor.", "DisplayMissingEpisodesWithinSeasons": "Mostrar episodios faltantes en las temporadas", - "DisplayInOtherHomeScreenSections": "Mostrar en las secciones de la pantalla de inicio como «Recientes» o «Continuar viendo»", + "DisplayInOtherHomeScreenSections": "Mostrar en las secciones de la pantalla de inicio como «Medios agregados recientemente» o «Continuar viendo»", "DisplayInMyMedia": "Mostrar en la pantalla de inicio", "Display": "Pantalla", "Disconnect": "Desconectar", @@ -1564,5 +1564,15 @@ "LabelSyncPlaySettingsSyncCorrection": "Corrección de sincronización", "LabelSyncPlaySettingsExtraTimeOffset": "Desfase de tiempo extra:", "LabelSyncPlaySettingsMinDelaySpeedToSync": "Retraso mínimo de SpeedToSync:", - "LabelOriginalName": "Nombre original:" + "LabelOriginalName": "Nombre original:", + "Experimental": "Experimental", + "HeaderRecordingMetadataSaving": "Metadatos de grabación", + "LabelStereoDownmixAlgorithm": "Algoritmo de downmix estéreo", + "LabelDummyChapterDuration": "Intervalo:", + "LabelDummyChapterCountHelp": "El máximo número de imágenes de capítulos que serán extraídas por cada archivo de medios.", + "HeaderDummyChapter": "Imágenes de capítulos", + "LabelDummyChapterDurationHelp": "El intervalo de la extracción de las imágenes de los capítulos, en segundos.", + "LabelDummyChapterCount": "Límite:", + "LabelChapterImageResolution": "Resolución:", + "LabelChapterImageResolutionHelp": "La resolución de las imágenes de capítulos extraídas." } From 52363c59d9556cbaf6178a448ad7d823cb107336 Mon Sep 17 00:00:00 2001 From: knackebrot Date: Mon, 6 Mar 2023 10:02:38 +0100 Subject: [PATCH 135/156] Update hls.js to 1.3.4 --- package-lock.json | 38 ++++++++------------------- package.json | 2 +- src/plugins/htmlAudioPlayer/plugin.js | 3 +++ src/plugins/htmlVideoPlayer/plugin.js | 3 +++ webpack.common.js | 1 + 5 files changed, 19 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97116e92d6..dcc6fb05f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "flv.js": "1.6.2", "headroom.js": "0.12.0", "history": "5.3.0", - "hls.js": "0.14.17", + "hls.js": "1.3.4", "intersection-observer": "0.12.2", "jellyfin-apiclient": "1.10.0", "jquery": "3.6.3", @@ -7301,7 +7301,8 @@ "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true }, "node_modules/events": { "version": "3.3.0", @@ -8467,13 +8468,9 @@ } }, "node_modules/hls.js": { - "version": "0.14.17", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-0.14.17.tgz", - "integrity": "sha512-25A7+m6qqp6UVkuzUQ//VVh2EEOPYlOBg32ypr34bcPO7liBMOkKFvbjbCBfiPAOTA/7BSx1Dujft3Th57WyFg==", - "dependencies": { - "eventemitter3": "^4.0.3", - "url-toolkit": "^2.1.6" - } + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.4.tgz", + "integrity": "sha512-iFEwVqtEDk6sKotcTwtJ5OMo/nuDTk9PrpB8FI2J2WYf8EriTVfR4FaK0aNyYtwbYeRSWCXJKlz23xeREdlNYg==" }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", @@ -18229,11 +18226,6 @@ "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, - "node_modules/url-toolkit": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.3.tgz", - "integrity": "sha512-Da75SQoxsZ+2wXS56CZBrj2nukQ4nlGUZUP/dqUBG5E1su5GKThgT94Q00x81eVII7AyS1Pn+CtTTZ4Z0pLUtQ==" - }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -24492,7 +24484,8 @@ "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true }, "events": { "version": "3.3.0", @@ -25405,13 +25398,9 @@ } }, "hls.js": { - "version": "0.14.17", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-0.14.17.tgz", - "integrity": "sha512-25A7+m6qqp6UVkuzUQ//VVh2EEOPYlOBg32ypr34bcPO7liBMOkKFvbjbCBfiPAOTA/7BSx1Dujft3Th57WyFg==", - "requires": { - "eventemitter3": "^4.0.3", - "url-toolkit": "^2.1.6" - } + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.4.tgz", + "integrity": "sha512-iFEwVqtEDk6sKotcTwtJ5OMo/nuDTk9PrpB8FI2J2WYf8EriTVfR4FaK0aNyYtwbYeRSWCXJKlz23xeREdlNYg==" }, "hoist-non-react-statics": { "version": "3.3.2", @@ -32698,11 +32687,6 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "url-toolkit": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.3.tgz", - "integrity": "sha512-Da75SQoxsZ+2wXS56CZBrj2nukQ4nlGUZUP/dqUBG5E1su5GKThgT94Q00x81eVII7AyS1Pn+CtTTZ4Z0pLUtQ==" - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", diff --git a/package.json b/package.json index 3d25ed4276..bc19c04a9e 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "flv.js": "1.6.2", "headroom.js": "0.12.0", "history": "5.3.0", - "hls.js": "0.14.17", + "hls.js": "1.3.4", "intersection-observer": "0.12.2", "jellyfin-apiclient": "1.10.0", "jquery": "3.6.3", diff --git a/src/plugins/htmlAudioPlayer/plugin.js b/src/plugins/htmlAudioPlayer/plugin.js index b5d3c8bd02..a1cad660fe 100644 --- a/src/plugins/htmlAudioPlayer/plugin.js +++ b/src/plugins/htmlAudioPlayer/plugin.js @@ -48,6 +48,9 @@ function supportsFade() { function requireHlsPlayer(callback) { import('hls.js').then(({ default: hls }) => { + hls.DefaultConfig.lowLatencyMode = false; + hls.DefaultConfig.backBufferLength = Infinity; + hls.DefaultConfig.liveBackBufferLength = 90; window.Hls = hls; callback(); }); diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index f2a2b8d30b..388cb4caad 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -106,6 +106,9 @@ function tryRemoveElement(elem) { function requireHlsPlayer(callback) { import('hls.js').then(({default: hls}) => { + hls.DefaultConfig.lowLatencyMode = false; + hls.DefaultConfig.backBufferLength = Infinity; + hls.DefaultConfig.liveBackBufferLength = 90; window.Hls = hls; callback(); }); diff --git a/webpack.common.js b/webpack.common.js index eebd423d98..1b5d41fc42 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -158,6 +158,7 @@ const config = { path.resolve(__dirname, 'node_modules/dom7'), path.resolve(__dirname, 'node_modules/epubjs'), path.resolve(__dirname, 'node_modules/flv.js'), + path.resolve(__dirname, 'node_modules/hls.js'), path.resolve(__dirname, 'node_modules/libarchive.js'), path.resolve(__dirname, 'node_modules/marked'), path.resolve(__dirname, 'node_modules/react-router'), From 2681d5c4ca781b9304ba1699b7d42edc94d6beb9 Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Mon, 6 Mar 2023 09:00:02 +0000 Subject: [PATCH 136/156] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/strings/de.json b/src/strings/de.json index 89856057b3..dedc1dfdc3 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -121,7 +121,7 @@ "DeleteMedia": "Medien löschen", "DeleteUser": "Benutzer löschen", "DeleteUserConfirmation": "Bist du dir sicher, dass du diesen Benutzer löschen willst?", - "Depressed": "gedrückt", + "Depressed": "Gedrückt", "Descending": "Absteigend", "DetectingDevices": "Suche Geräte", "DeviceAccessHelp": "Dies wird nur auf Geräte angewendet, die eindeutig identifiziert werden können, und verhindert nicht den Web-Zugriff. Gefilterter Zugriff auf Geräte verhindert die Nutzung neuer Geräte solange, bis der Zugriff für diese freigegeben wird.", @@ -279,11 +279,11 @@ "HeaderKeepRecording": "Aufnahme behalten", "HeaderKeepSeries": "Serie behalten", "HeaderKodiMetadataHelp": "Um NFO-Metadaten zu aktivieren oder zu deaktivieren, bearbeite eine Bibliothek und finde den Abschnitt zum Speichern von Metadaten.", - "HeaderLatestEpisodes": "Neueste Episoden", - "HeaderLatestMedia": "Neueste Medien", - "HeaderLatestMovies": "Neueste Filme", - "HeaderLatestMusic": "Neueste Musik", - "HeaderLatestRecordings": "Neueste Aufnahmen", + "HeaderLatestEpisodes": "Kürzlich hinzugefügte Episoden", + "HeaderLatestMedia": "Kürzlich hinzugefügte Medien", + "HeaderLatestMovies": "Kürzlich hinzugefügte Filme", + "HeaderLatestMusic": "Kürzlich hinzugefügte Musik", + "HeaderLatestRecordings": "Kürzlich hinzugefügte Aufnahmen", "HeaderLibraries": "Bibliotheken", "HeaderLibraryAccess": "Bibliothekszugriff", "HeaderLibraryFolders": "Bibliotheksverzeichnisse", @@ -301,7 +301,7 @@ "HeaderMyMediaSmall": "Meine Medien (Klein)", "HeaderNewApiKey": "Neuer API-Schlüssel", "HeaderNewDevices": "Neue Geräte", - "HeaderNextEpisodePlayingInValue": "Nächste Episode wird abgespielt in {0}", + "HeaderNextEpisodePlayingInValue": "Nächste Episode in {0}", "HeaderNextVideoPlayingInValue": "Nächstes Video wird abgespielt in {0}", "HeaderOnNow": "Gerade läuft", "HeaderOtherItems": "Andere Inhalte", @@ -696,7 +696,7 @@ "LabelffmpegPathHelp": "Verzeichnis zur FFmpeg-Applikationsdatei oder zum Ordner, der FFmpeg enthält.", "LanNetworksHelp": "Komma separierte Liste von IP-Adressen oder IP/Netzmasken die als lokale Netzwerke behandelt werden sollen, um Bandbreitenlimitationen auszusetzen. Wenn gesetzt, werden alle anderen IP-Adressen als extern behandelt und unterliegen den Bandbreitenlimitationen für externe Verbindungen. Wenn leer, wird nur das Subnetz des Servers als lokales Netzwerk behandelt.", "Large": "Groß", - "LatestFromLibrary": "Neueste {0}", + "LatestFromLibrary": "Kürzlich hinzugefügt in {0}", "LearnHowYouCanContribute": "Erfahre, wie du unterstützen kannst.", "LibraryAccessHelp": "Wähle die Bibliotheken aus, die du mit diesem Benutzer teilen möchtest. Administratoren können den Metadaten-Manager verwenden um alle Ordner zu bearbeiten.", "List": "Liste", @@ -1023,7 +1023,7 @@ "TabContainers": "Container", "TabDashboard": "Übersicht", "TabDirectPlay": "Direktwiedergabe", - "TabLatest": "Neueste", + "TabLatest": "Kürzlich hinzugefügt", "TabMusic": "Musik", "TabMyPlugins": "Meine Plugins", "TabNetworks": "Fernsehsender", @@ -1704,5 +1704,15 @@ "LabelDummyChapterCount": "Limit:", "LabelDummyChapterCountHelp": "Die maximale Anzahl von Kapitelbildern, die für jede Mediendatei extrahiert werden.", "LabelChapterImageResolution": "Auflösung:", - "LabelChapterImageResolutionHelp": "Die Auflösung der extrahierten Kapitelbilder." + "LabelChapterImageResolutionHelp": "Die Auflösung der extrahierten Kapitelbilder.", + "SubtitleBlack": "Schwarz", + "SubtitleBlue": "Blau", + "SubtitleCyan": "Cyan", + "SubtitleGray": "Grau", + "SubtitleGreen": "Grün", + "SubtitleLightGray": "Hellgrau", + "SubtitleMagenta": "Magenta", + "SubtitleRed": "Rot", + "SubtitleWhite": "Weiß", + "SubtitleYellow": "Gelb" } From bd9d3e5f65b805bc2d041b7b48e79fb3207de813 Mon Sep 17 00:00:00 2001 From: James Raspass Date: Thu, 2 Mar 2023 13:24:46 +0000 Subject: [PATCH 137/156] Remove old Emby (3.x) version checks As per https://trello.com/c/sA25wd46/8-remove-old-emby-3x-version-checks --- src/components/playback/playbackmanager.js | 6 ------ src/controllers/dashboard/devices/devices.js | 19 +++++++------------ src/controllers/itemDetails/index.js | 7 +------ 3 files changed, 8 insertions(+), 24 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 2b8bd21280..ffcd0e4d91 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -3423,12 +3423,6 @@ class PlaybackManager { streamInfo.lastMediaInfoQuery = new Date().getTime(); - const apiClient = ServerConnections.getApiClient(serverId); - - if (!apiClient.isMinServerVersion('3.2.70.7')) { - return; - } - ServerConnections.getApiClient(serverId).getLiveStreamMediaInfo(liveStreamId).then(function (info) { mediaSource.MediaStreams = info.MediaStreams; Events.trigger(player, 'mediastreamschange'); diff --git a/src/controllers/dashboard/devices/devices.js b/src/controllers/dashboard/devices/devices.js index 3c3a039745..537e842d90 100644 --- a/src/controllers/dashboard/devices/devices.js +++ b/src/controllers/dashboard/devices/devices.js @@ -54,15 +54,11 @@ import confirm from '../../../components/confirm/confirm'; } function showDeviceMenu(view, btn, deviceId) { - const menuItems = []; - - if (canEdit) { - menuItems.push({ - name: globalize.translate('Edit'), - id: 'open', - icon: 'mode_edit' - }); - } + const menuItems = [{ + name: globalize.translate('Edit'), + id: 'open', + icon: 'mode_edit' + }]; if (canDelete(deviceId)) { menuItems.push({ @@ -100,7 +96,7 @@ import confirm from '../../../components/confirm/confirm'; deviceHtml += '
'; deviceHtml += ''; deviceHtml += '
'; - if (canEdit || canDelete(device.Id)) { + if (canDelete(device.Id)) { if (globalize.getIsRTL()) deviceHtml += '
'; else @@ -155,7 +151,6 @@ import confirm from '../../../components/confirm/confirm'; }); } - const canEdit = ApiClient.isMinServerVersion('3.4.1.31'); export default function (view) { view.querySelector('.devicesList').addEventListener('click', function (e) { const btnDeviceMenu = dom.parentWithClass(e.target, 'btnDeviceMenu'); diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index c06043e472..478b6be23a 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1156,12 +1156,7 @@ function renderMoreFromArtist(view, item, apiClient) { const section = view.querySelector('.moreFromArtistSection'); if (section) { - if (item.Type === 'MusicArtist') { - if (!apiClient.isMinServerVersion('3.4.1.19')) { - section.classList.add('hide'); - return; - } - } else if (item.Type !== 'MusicAlbum' || !item.AlbumArtists || !item.AlbumArtists.length) { + if (item.Type !== 'MusicArtist' && (item.Type !== 'MusicAlbum' || !item.AlbumArtists || !item.AlbumArtists.length)) { section.classList.add('hide'); return; } From e4d6ba2de6e1079366605d6ad6f989fc5063c3f2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Mar 2023 00:56:24 +0000 Subject: [PATCH 138/156] Update dependency react-router-dom to v6.8.2 --- package-lock.json | 50 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0f909a9694..bd0707b57a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "pdfjs-dist": "2.16.105", "react": "17.0.2", "react-dom": "17.0.2", - "react-router-dom": "6.8.1", + "react-router-dom": "6.8.2", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.0", @@ -2767,9 +2767,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.2.tgz", - "integrity": "sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.3.tgz", + "integrity": "sha512-YRHie1yQEj0kqqCTCJEfHqYSSNlZQ696QJG+MMiW4mxSl9I0ojz/eRhJS4fs88Z5i6D1SmoF9d3K99/QOhI8/w==", "engines": { "node": ">=14" } @@ -13122,11 +13122,11 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-router": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.1.tgz", - "integrity": "sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.2.tgz", + "integrity": "sha512-lF7S0UmXI5Pd8bmHvMdPKI4u4S5McxmHnzJhrYi9ZQ6wE+DA8JN5BzVC5EEBuduWWDaiJ8u6YhVOCmThBli+rw==", "dependencies": { - "@remix-run/router": "1.3.2" + "@remix-run/router": "1.3.3" }, "engines": { "node": ">=14" @@ -13136,12 +13136,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.1.tgz", - "integrity": "sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.2.tgz", + "integrity": "sha512-N/oAF1Shd7g4tWy+75IIufCGsHBqT74tnzHQhbiUTYILYF0Blk65cg+HPZqwC+6SqEyx033nKqU7by38v3lBZg==", "dependencies": { - "@remix-run/router": "1.3.2", - "react-router": "6.8.1" + "@remix-run/router": "1.3.3", + "react-router": "6.8.2" }, "engines": { "node": ">=14" @@ -21045,9 +21045,9 @@ } }, "@remix-run/router": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.2.tgz", - "integrity": "sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.3.tgz", + "integrity": "sha512-YRHie1yQEj0kqqCTCJEfHqYSSNlZQ696QJG+MMiW4mxSl9I0ojz/eRhJS4fs88Z5i6D1SmoF9d3K99/QOhI8/w==" }, "@rollup/plugin-babel": { "version": "5.3.1", @@ -28721,20 +28721,20 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-router": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.1.tgz", - "integrity": "sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.2.tgz", + "integrity": "sha512-lF7S0UmXI5Pd8bmHvMdPKI4u4S5McxmHnzJhrYi9ZQ6wE+DA8JN5BzVC5EEBuduWWDaiJ8u6YhVOCmThBli+rw==", "requires": { - "@remix-run/router": "1.3.2" + "@remix-run/router": "1.3.3" } }, "react-router-dom": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.1.tgz", - "integrity": "sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.2.tgz", + "integrity": "sha512-N/oAF1Shd7g4tWy+75IIufCGsHBqT74tnzHQhbiUTYILYF0Blk65cg+HPZqwC+6SqEyx033nKqU7by38v3lBZg==", "requires": { - "@remix-run/router": "1.3.2", - "react-router": "6.8.1" + "@remix-run/router": "1.3.3", + "react-router": "6.8.2" } }, "read-file-stdin": { diff --git a/package.json b/package.json index f8c9f45023..5bc2a3b78f 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "pdfjs-dist": "2.16.105", "react": "17.0.2", "react-dom": "17.0.2", - "react-router-dom": "6.8.1", + "react-router-dom": "6.8.2", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.0", From b55a3751f236ebbf4b73ce6e8721a1155571b555 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Mar 2023 00:56:50 +0000 Subject: [PATCH 139/156] Update Linters to v5.54.0 --- package-lock.json | 164 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0f909a9694..a00e6750f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,8 +68,8 @@ "@types/lodash-es": "4.17.6", "@types/react": "17.0.53", "@types/react-dom": "17.0.19", - "@typescript-eslint/eslint-plugin": "5.53.0", - "@typescript-eslint/parser": "5.53.0", + "@typescript-eslint/eslint-plugin": "5.54.0", + "@typescript-eslint/parser": "5.54.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.13", "babel-loader": "9.1.2", @@ -3200,14 +3200,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", - "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz", + "integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/type-utils": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/scope-manager": "5.54.0", + "@typescript-eslint/type-utils": "5.54.0", + "@typescript-eslint/utils": "5.54.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -3249,14 +3249,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", - "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz", + "integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.54.0", + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/typescript-estree": "5.54.0", "debug": "^4.3.4" }, "engines": { @@ -3276,13 +3276,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", - "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz", + "integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0" + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/visitor-keys": "5.54.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3293,13 +3293,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", - "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz", + "integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/typescript-estree": "5.54.0", + "@typescript-eslint/utils": "5.54.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3320,9 +3320,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", - "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz", + "integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3333,13 +3333,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", - "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz", + "integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0", + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/visitor-keys": "5.54.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3404,16 +3404,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", - "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz", + "integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.54.0", + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/typescript-estree": "5.54.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -3445,12 +3445,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", - "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz", + "integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/types": "5.54.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -21445,14 +21445,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", - "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz", + "integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/type-utils": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/scope-manager": "5.54.0", + "@typescript-eslint/type-utils": "5.54.0", + "@typescript-eslint/utils": "5.54.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -21474,53 +21474,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", - "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz", + "integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.54.0", + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/typescript-estree": "5.54.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", - "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz", + "integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0" + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/visitor-keys": "5.54.0" } }, "@typescript-eslint/type-utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", - "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz", + "integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/typescript-estree": "5.54.0", + "@typescript-eslint/utils": "5.54.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", - "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz", + "integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", - "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz", + "integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0", + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/visitor-keys": "5.54.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -21560,16 +21560,16 @@ } }, "@typescript-eslint/utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", - "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz", + "integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.54.0", + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/typescript-estree": "5.54.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -21587,12 +21587,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", - "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz", + "integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/types": "5.54.0", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { diff --git a/package.json b/package.json index f8c9f45023..ad691b532d 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "@types/lodash-es": "4.17.6", "@types/react": "17.0.53", "@types/react-dom": "17.0.19", - "@typescript-eslint/eslint-plugin": "5.53.0", - "@typescript-eslint/parser": "5.53.0", + "@typescript-eslint/eslint-plugin": "5.54.0", + "@typescript-eslint/parser": "5.54.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.13", "babel-loader": "9.1.2", From 5e51616e18e9565719906e39d8608ae5a56e68a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20=C3=96rn=20Ketilsson?= Date: Tue, 7 Mar 2023 23:52:07 +0000 Subject: [PATCH 140/156] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index b4b01a1fda..585b335c18 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -447,6 +447,13 @@ "Mute": "Þagga", "MusicArtist": "Tónlistarmaður", "MusicAlbum": "Tónlistaralbúm", - "ButtonCast": "Senda efni út í tæki", - "AddToFavorites": "Bæta við eftirlæti" + "ButtonCast": "Senda út í tæki", + "AddToFavorites": "Bæta við eftirlæti", + "ButtonPlayer": "Spilari", + "AgeValue": "({0} ára)", + "ApiKeysCaption": "Listi yfir núverandi virkum API lyklum", + "ButtonActivate": "Virkja", + "ButtonClose": "Loka", + "ButtonSpace": "Bil", + "Authorize": "Heimila" } From 47c13444ccef523bbfa192cbcdb685babe76f76c Mon Sep 17 00:00:00 2001 From: Pier-Luc Ducharme Date: Fri, 30 Dec 2022 10:24:09 -0500 Subject: [PATCH 141/156] Add eslint max-params rule with a max of 7 --- .eslintrc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.js b/.eslintrc.js index 53dd01ff25..e2811f35a9 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -46,6 +46,7 @@ module.exports = { 'keyword-spacing': ['error'], 'no-throw-literal': ['error'], 'max-statements-per-line': ['error'], + 'max-params': ['error', 7], 'no-duplicate-imports': ['error'], 'no-empty-function': ['error'], 'no-floating-decimal': ['error'], From dc5ab265f694beaf09d888767bc1d8cbb47adfa2 Mon Sep 17 00:00:00 2001 From: Pier-Luc Ducharme Date: Fri, 30 Dec 2022 10:40:20 -0500 Subject: [PATCH 142/156] Refactor cardBuilder to follow max-params rule --- src/components/cardbuilder/cardBuilder.js | 40 ++++++++++------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 658837df83..657a4102d9 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -773,27 +773,24 @@ import { appRouter } from '../appRouter'; * @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 - 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 {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. + * @param {Object} flags - Various flags for the footer + * @param {Object} urls - Various urls for the footer * @returns {string} HTML markup of the card's footer text element. */ - function getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerClass, progressHtml, logoUrl, isOuterFooter) { + function getCardFooterText(item, apiClient, options, footerClass, progressHtml, flags, urls) { item = item.ProgramInfo || item; let html = ''; - if (logoUrl) { - html += ''; + if (urls.logoUrl) { + html += ''; } - const showOtherText = isOuterFooter ? !overlayText : overlayText; + const showTitle = options.showTitle === 'auto' ? true : (options.showTitle || item.Type === 'PhotoAlbum' || item.Type === 'Folder'); + const showOtherText = flags.isOuterFooter ? !flags.overlayText : flags.overlayText; - if (isOuterFooter && options.cardLayout && layoutManager.mobile && options.cardFooterAside !== 'none') { + if (flags.isOuterFooter && options.cardLayout && layoutManager.mobile && options.cardFooterAside !== 'none') { html += ``; } @@ -805,7 +802,7 @@ import { appRouter } from '../appRouter'; let titleAdded; if (showOtherText && (options.showParentTitle || options.showParentTitleOrTitle) && !parentTitleUnderneath) { - if (isOuterFooter && item.Type === 'Episode' && item.SeriesName) { + if (flags.isOuterFooter && item.Type === 'Episode' && item.SeriesName) { if (item.SeriesId) { lines.push(getTextActionButton({ Id: item.SeriesId, @@ -835,7 +832,7 @@ import { appRouter } from '../appRouter'; } let showMediaTitle = (showTitle && !titleAdded) || (options.showParentTitleOrTitle && !lines.length); - if (!showMediaTitle && !titleAdded && (showTitle || forceName)) { + if (!showMediaTitle && !titleAdded && (showTitle || flags.forceName)) { showMediaTitle = true; } @@ -856,7 +853,7 @@ import { appRouter } from '../appRouter'; if (showOtherText) { if (options.showParentTitle && parentTitleUnderneath) { - if (isOuterFooter && item.AlbumArtists && item.AlbumArtists.length) { + if (flags.isOuterFooter && item.AlbumArtists && item.AlbumArtists.length) { item.AlbumArtists[0].Type = 'MusicArtist'; item.AlbumArtists[0].IsFolder = true; lines.push(getTextActionButton(item.AlbumArtists[0], null, serverId)); @@ -991,23 +988,23 @@ import { appRouter } from '../appRouter'; } } - if ((showTitle || !imgUrl) && forceName && overlayText && lines.length === 1) { + if ((showTitle || !urls.imgUrl) && flags.forceName && flags.overlayText && lines.length === 1) { lines = []; } - if (overlayText && showTitle) { + if (flags.overlayText && showTitle) { lines = [escapeHtml(item.Name)]; } - const addRightTextMargin = isOuterFooter && options.cardLayout && !options.centerText && options.cardFooterAside !== 'none' && layoutManager.mobile; + const addRightTextMargin = flags.isOuterFooter && options.cardLayout && !options.centerText && options.cardFooterAside !== 'none' && layoutManager.mobile; - html += getCardTextLines(lines, cssClass, !options.overlayText, isOuterFooter, options.cardLayout, addRightTextMargin, options.lines); + html += getCardTextLines(lines, cssClass, !options.overlayText, flags.isOuterFooter, options.cardLayout, addRightTextMargin, options.lines); if (progressHtml) { html += progressHtml; } - if (html && (!isOuterFooter || logoUrl || options.cardLayout)) { + if (html && (!flags.isOuterFooter || urls.logoUrl || options.cardLayout)) { html = '
' + html; //cardFooter @@ -1217,7 +1214,6 @@ import { appRouter } from '../appRouter'; const forceName = imgInfo.forceName; - const showTitle = options.showTitle === 'auto' ? true : (options.showTitle || item.Type === 'PhotoAlbum' || item.Type === 'Folder'); const overlayText = options.overlayText; let cardImageContainerClass = 'cardImageContainer'; @@ -1265,7 +1261,7 @@ import { appRouter } from '../appRouter'; logoUrl = null; footerCssClass = progressHtml ? 'innerCardFooter fullInnerCardFooter' : 'innerCardFooter'; - innerCardFooter += getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, logoUrl, false); + innerCardFooter += getCardFooterText(item, apiClient, options, footerCssClass, progressHtml, {forceName: forceName, overlayText: overlayText, isOuterFooter: false}, {imgUrl: imgUrl, logoUrl: logoUrl}); footerOverlayed = true; } else if (progressHtml) { innerCardFooter += '
'; @@ -1292,7 +1288,7 @@ import { appRouter } from '../appRouter'; logoUrl = null; } - outerCardFooter = getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, logoUrl, true); + outerCardFooter = getCardFooterText(item, apiClient, options, footerCssClass, progressHtml, {forceName: forceName, overlayText: overlayText, isOuterFooter: true}, {imgUrl: imgUrl, logoUrl: logoUrl}); } if (outerCardFooter && !options.cardLayout) { From 5e5988c1077451b44c44d403394fc2b3726bd43e Mon Sep 17 00:00:00 2001 From: Pier-Luc Ducharme Date: Fri, 30 Dec 2022 12:55:07 -0500 Subject: [PATCH 143/156] Refactor guide to follow max-params rule --- src/components/guide/guide.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index e353d562ab..5e4ee8af00 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -345,7 +345,9 @@ function Guide(options) { } apiClient.getLiveTvPrograms(programQuery).then(function (programsResult) { - renderGuide(context, date, channelsResult.Items, programsResult.Items, renderOptions, apiClient, scrollToTimeMs, focusToTimeMs, startTimeOfDayMs, focusProgramOnRender); + const guideOptions = {focusProgramOnRender: focusProgramOnRender, scrollToTimeMs: scrollToTimeMs, focusToTimeMs: focusToTimeMs, startTimeOfDayMs: startTimeOfDayMs}; + + renderGuide(context, date, channelsResult.Items, programsResult.Items, renderOptions, guideOptions, apiClient); hideLoading(); }); @@ -667,7 +669,7 @@ function Guide(options) { return (channelIndex * 10000000) + (start.getTime() / 60000); } - function renderGuide(context, date, channels, programs, renderOptions, apiClient, scrollToTimeMs, focusToTimeMs, startTimeOfDayMs, focusProgramOnRender) { + function renderGuide(context, date, channels, programs, renderOptions, guideOptions, apiClient) { programs.sort(function (a, b) { return getProgramSortOrder(a, channels) - getProgramSortOrder(b, channels); }); @@ -689,11 +691,11 @@ function Guide(options) { items = {}; renderPrograms(context, date, channels, programs, renderOptions); - if (focusProgramOnRender) { - focusProgram(context, itemId, channelRowId, focusToTimeMs, startTimeOfDayMs); + if (guideOptions.focusProgramOnRender) { + focusProgram(context, itemId, channelRowId, guideOptions.focusToTimeMs, guideOptions.startTimeOfDayMs); } - scrollProgramGridToTimeMs(context, scrollToTimeMs, startTimeOfDayMs); + scrollProgramGridToTimeMs(context, guideOptions.scrollToTimeMs, guideOptions.startTimeOfDayMs); } function scrollProgramGridToTimeMs(context, scrollToTimeMs, startTimeOfDayMs) { From e9369e40bdcd41a4f6f1c8c9c86dd424f162d63b Mon Sep 17 00:00:00 2001 From: Pier-Luc Ducharme Date: Fri, 30 Dec 2022 13:34:50 -0500 Subject: [PATCH 144/156] Refactor imageeditor to follow max-params rule --- src/components/imageeditor/imageeditor.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/components/imageeditor/imageeditor.js b/src/components/imageeditor/imageeditor.js index 039770a217..85916e5cf8 100644 --- a/src/components/imageeditor/imageeditor.js +++ b/src/components/imageeditor/imageeditor.js @@ -96,7 +96,7 @@ import template from './imageeditor.template.html'; return apiClient.getScaledImageUrl(item.Id || item.ItemId, options); } - function getCardHtml(image, index, numImages, apiClient, imageProviders, imageSize, tagName, enableFooterButtons) { + function getCardHtml(image, apiClient, options) { // TODO move card creation code to Card component let html = ''; @@ -106,7 +106,7 @@ import template from './imageeditor.template.html'; cssClass += ' backdropCard backdropCard-scalable'; - if (tagName === 'button') { + if (options.tagName === 'button') { cssClass += ' btnImageCard'; if (layoutManager.tv) { @@ -122,7 +122,7 @@ import template from './imageeditor.template.html'; html += '
'; @@ -151,23 +151,23 @@ import template from './imageeditor.template.html'; } html += '
'; - if (enableFooterButtons) { + if (options.enableFooterButtons) { html += '
'; if (image.ImageType === 'Backdrop') { - if (index > 0) { + if (options.index > 0) { html += ''; } else { html += ''; } - if (index < numImages - 1) { + if (options.index < options.numImages - 1) { html += ''; } else { html += ''; } } else { - if (imageProviders.length) { + if (options.imageProviders.length) { html += ''; } } @@ -178,7 +178,7 @@ import template from './imageeditor.template.html'; html += '
'; html += '
'; - html += ''; + html += ''; return html; } @@ -226,7 +226,8 @@ import template from './imageeditor.template.html'; for (let i = 0, length = images.length; i < length; i++) { const image = images[i]; - html += getCardHtml(image, i, length, apiClient, imageProviders, imageSize, tagName, enableFooterButtons); + const options = {index: i, numImages: length, imageProviders: imageProviders, imageSize: imageSize, tagName: tagName, enableFooterButtons: enableFooterButtons}; + html += getCardHtml(image, apiClient, options); } elem.innerHTML = html; From 6544b7c698c204cc06d0810a5dcdd2e4f86b78a9 Mon Sep 17 00:00:00 2001 From: Pier-Luc Ducharme Date: Fri, 30 Dec 2022 21:04:16 -0500 Subject: [PATCH 145/156] Refactor playbackmanager to follow max-params rule --- src/components/playback/playbackmanager.js | 166 +++++++++++++-------- 1 file changed, 102 insertions(+), 64 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index ffcd0e4d91..7591c22917 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -299,20 +299,20 @@ function getAudioMaxValues(deviceProfile) { } let startingPlaySession = new Date().getTime(); -function getAudioStreamUrl(item, transcodingProfile, directPlayContainers, maxBitrate, apiClient, maxAudioSampleRate, maxAudioBitDepth, maxAudioBitrate, startPosition) { +function getAudioStreamUrl(item, transcodingProfile, directPlayContainers, apiClient, startPosition, maxValues) { const url = 'Audio/' + item.Id + '/universal'; startingPlaySession++; return apiClient.getUrl(url, { UserId: apiClient.getCurrentUserId(), DeviceId: apiClient.deviceId(), - MaxStreamingBitrate: maxAudioBitrate || maxBitrate, + MaxStreamingBitrate: maxValues.maxAudioBitrate || maxValues.maxBitrate, Container: directPlayContainers, TranscodingContainer: transcodingProfile.Container || null, TranscodingProtocol: transcodingProfile.Protocol || null, AudioCodec: transcodingProfile.AudioCodec, - MaxAudioSampleRate: maxAudioSampleRate, - MaxAudioBitDepth: maxAudioBitDepth, + MaxAudioSampleRate: maxValues.maxAudioSampleRate, + MaxAudioBitDepth: maxValues.maxAudioBitDepth, api_key: apiClient.accessToken(), PlaySessionId: startingPlaySession, StartTimeTicks: startPosition || 0, @@ -344,7 +344,7 @@ function getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, api const maxValues = getAudioMaxValues(deviceProfile); - return getAudioStreamUrl(item, transcodingProfile, directPlayContainers, maxBitrate, apiClient, maxValues.maxAudioSampleRate, maxValues.maxAudioBitDepth, maxValues.maxAudioBitrate, startPosition); + return getAudioStreamUrl(item, transcodingProfile, directPlayContainers, apiClient, startPosition, { maxBitrate: maxBitrate, ...maxValues }); } function getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition) { @@ -377,7 +377,7 @@ function getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPositio let streamUrl; if (item.MediaType === 'Audio' && !itemHelper.isLocalItem(item)) { - streamUrl = getAudioStreamUrl(item, audioTranscodingProfile, audioDirectPlayContainers, maxBitrate, apiClient, maxValues.maxAudioSampleRate, maxValues.maxAudioBitDepth, maxValues.maxAudioBitrate, startPosition); + streamUrl = getAudioStreamUrl(item, audioTranscodingProfile, audioDirectPlayContainers, apiClient, startPosition, { maxBitrate: maxBitrate, ...maxValues }); } streamUrls.push(streamUrl || ''); @@ -408,27 +408,12 @@ function setStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPositio }); } -function getPlaybackInfo(player, - apiClient, - item, - deviceProfile, - maxBitrate, - startPosition, - isPlayback, - mediaSourceId, - audioStreamIndex, - subtitleStreamIndex, - liveStreamId, - enableDirectPlay, - enableDirectStream, - allowVideoStreamCopy, - allowAudioStreamCopy, - secondarySubtitleStreamIndex) { +function getPlaybackInfo(player, apiClient, item, deviceProfile, mediaSourceId, liveStreamId, options) { if (!itemHelper.isLocalItem(item) && item.MediaType === 'Audio' && !player.useServerPlaybackInfoForAudio) { return Promise.resolve({ MediaSources: [ { - StreamUrl: getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, apiClient, startPosition), + StreamUrl: getAudioStreamUrlFromDeviceProfile(item, deviceProfile, options.maxBitrate, apiClient, options.startPosition), Id: item.Id, MediaStreams: [], RunTimeTicks: item.RunTimeTicks @@ -446,10 +431,10 @@ function getPlaybackInfo(player, const query = { UserId: apiClient.getCurrentUserId(), - StartTimeTicks: startPosition || 0 + StartTimeTicks: options.startPosition || 0 }; - if (isPlayback) { + if (options.isPlayback) { query.IsPlayback = true; query.AutoOpenLiveStream = true; } else { @@ -457,27 +442,26 @@ function getPlaybackInfo(player, query.AutoOpenLiveStream = false; } - if (audioStreamIndex != null) { - query.AudioStreamIndex = audioStreamIndex; + if (options.audioStreamIndex != null) { + query.AudioStreamIndex = options.audioStreamIndex; } - if (subtitleStreamIndex != null) { - query.SubtitleStreamIndex = subtitleStreamIndex; + if (options.subtitleStreamIndex != null) { + query.SubtitleStreamIndex = options.subtitleStreamIndex; } - if (secondarySubtitleStreamIndex != null) { - query.SecondarySubtitleStreamIndex = secondarySubtitleStreamIndex; + if (options.secondarySubtitleStreamIndex != null) { + query.SecondarySubtitleStreamIndex = options.secondarySubtitleStreamIndex; } - if (enableDirectPlay != null) { - query.EnableDirectPlay = enableDirectPlay; + if (options.enableDirectPlay != null) { + query.EnableDirectPlay = options.enableDirectPlay; } - - if (enableDirectStream != null) { - query.EnableDirectStream = enableDirectStream; + if (options.enableDirectStream != null) { + query.EnableDirectStream = options.enableDirectStream; } - if (allowVideoStreamCopy != null) { - query.AllowVideoStreamCopy = allowVideoStreamCopy; + if (options.allowVideoStreamCopy != null) { + query.AllowVideoStreamCopy = options.allowVideoStreamCopy; } - if (allowAudioStreamCopy != null) { - query.AllowAudioStreamCopy = allowAudioStreamCopy; + if (options.allowAudioStreamCopy != null) { + query.AllowAudioStreamCopy = options.allowAudioStreamCopy; } if (mediaSourceId) { query.MediaSourceId = mediaSourceId; @@ -485,8 +469,8 @@ function getPlaybackInfo(player, if (liveStreamId) { query.LiveStreamId = liveStreamId; } - if (maxBitrate) { - query.MaxStreamingBitrate = maxBitrate; + if (options.maxBitrate) { + query.MaxStreamingBitrate = options.maxBitrate; } if (player.enableMediaProbe && !player.enableMediaProbe(item)) { query.EnableMediaProbe = false; @@ -537,7 +521,7 @@ function getOptimalMediaSource(apiClient, item, versions) { }); } -function getLiveStream(player, apiClient, item, playSessionId, deviceProfile, maxBitrate, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex) { +function getLiveStream(player, apiClient, item, playSessionId, deviceProfile, mediaSource, options) { const postData = { DeviceProfile: deviceProfile, OpenToken: mediaSource.OpenToken @@ -545,19 +529,19 @@ function getLiveStream(player, apiClient, item, playSessionId, deviceProfile, ma const query = { UserId: apiClient.getCurrentUserId(), - StartTimeTicks: startPosition || 0, + StartTimeTicks: options.startPosition || 0, ItemId: item.Id, PlaySessionId: playSessionId }; - if (maxBitrate) { - query.MaxStreamingBitrate = maxBitrate; + if (options.maxBitrate) { + query.MaxStreamingBitrate = options.maxBitrate; } - if (audioStreamIndex != null) { - query.AudioStreamIndex = audioStreamIndex; + if (options.audioStreamIndex != null) { + query.AudioStreamIndex = options.audioStreamIndex; } - if (subtitleStreamIndex != null) { - query.SubtitleStreamIndex = subtitleStreamIndex; + if (options.subtitleStreamIndex != null) { + query.SubtitleStreamIndex = options.subtitleStreamIndex; } // lastly, enforce player overrides for special situations @@ -1737,7 +1721,19 @@ class PlaybackManager { const currentPlayOptions = currentItem.playOptions || getDefaultPlayOptions(); - getPlaybackInfo(player, apiClient, currentItem, deviceProfile, maxBitrate, ticks, true, currentMediaSource.Id, audioStreamIndex, subtitleStreamIndex, liveStreamId, params.EnableDirectPlay, params.EnableDirectStream, params.AllowVideoStreamCopy, params.AllowAudioStreamCopy).then(function (result) { + const options = { + maxBitrate: maxBitrate, + startPosition: ticks, + isPlayback: true, + audioStreamIndex: audioStreamIndex, + subtitleStreamIndex: subtitleStreamIndex, + enableDirectPlay: params.EnableDirectPlay, + enableDirectStream: params.EnableDirectStream, + allowVideoStreamCopy: params.AllowVideoStreamCopy, + allowAudioStreamCopy: params.AllowAudioStreamCopy + }; + + getPlaybackInfo(player, apiClient, currentItem, deviceProfile, currentMediaSource.Id, liveStreamId, options).then(function (result) { if (validatePlaybackInfoResult(self, result)) { currentMediaSource = result.MediaSources[0]; @@ -2303,17 +2299,17 @@ class PlaybackManager { }, reject); } - function sendPlaybackListToPlayer(player, items, deviceProfile, maxBitrate, apiClient, startPositionTicks, mediaSourceId, audioStreamIndex, subtitleStreamIndex, startIndex) { - return setStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPositionTicks).then(function () { + function sendPlaybackListToPlayer(player, items, deviceProfile, apiClient, mediaSourceId, options) { + return setStreamUrls(items, deviceProfile, options.maxBitrate, apiClient, options.startPosition).then(function () { loading.hide(); return player.play({ items: items, - startPositionTicks: startPositionTicks || 0, + startPositionTicks: options.startPosition || 0, mediaSourceId: mediaSourceId, - audioStreamIndex: audioStreamIndex, - subtitleStreamIndex: subtitleStreamIndex, - startIndex: startIndex + audioStreamIndex: options.audioStreamIndex, + subtitleStreamIndex: options.subtitleStreamIndex, + startIndex: options.startIndex }); }); } @@ -2474,15 +2470,27 @@ class PlaybackManager { const mediaSourceId = playOptions.mediaSourceId; const audioStreamIndex = playOptions.audioStreamIndex; const subtitleStreamIndex = playOptions.subtitleStreamIndex; + const options = { + maxBitrate: maxBitrate, + startPosition: startPosition, + isPlayback: null, + audioStreamIndex: audioStreamIndex, + subtitleStreamIndex: subtitleStreamIndex, + startIndex: playOptions.startIndex, + enableDirectPlay: null, + enableDirectStream: null, + allowVideoStreamCopy: null, + allowAudioStreamCopy: null + }; if (player && !enableLocalPlaylistManagement(player)) { - return sendPlaybackListToPlayer(player, playOptions.items, deviceProfile, maxBitrate, apiClient, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex, playOptions.startIndex); + return sendPlaybackListToPlayer(player, playOptions.items, deviceProfile, apiClient, mediaSourceId, options); } // this reference was only needed by sendPlaybackListToPlayer playOptions.items = null; - return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex).then(async (mediaSource) => { + return getPlaybackMediaSource(player, apiClient, deviceProfile, item, mediaSourceId, options).then(async (mediaSource) => { const user = await apiClient.getCurrentUser(); autoSetNextTracks(prevSource, mediaSource, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections); @@ -2540,7 +2548,20 @@ class PlaybackManager { const maxBitrate = getSavedMaxStreamingBitrate(ServerConnections.getApiClient(item.ServerId), mediaType); return player.getDeviceProfile(item).then(function (deviceProfile) { - return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, options.mediaSourceId, options.audioStreamIndex, options.subtitleStreamIndex).then(function (mediaSource) { + const mediaOptions = { + maxBitrate: maxBitrate, + startPosition: startPosition, + isPlayback: null, + audioStreamIndex: options.audioStreamIndex, + subtitleStreamIndex: options.subtitleStreamIndex, + startIndex: null, + enableDirectPlay: null, + enableDirectStream: null, + allowVideoStreamCopy: null, + allowAudioStreamCopy: null + }; + + return getPlaybackMediaSource(player, apiClient, deviceProfile, item, options.mediaSourceId, mediaOptions).then(function (mediaSource) { return createStreamInfo(apiClient, item.MediaType, item, mediaSource, startPosition, player); }); }); @@ -2560,7 +2581,19 @@ class PlaybackManager { const maxBitrate = getSavedMaxStreamingBitrate(ServerConnections.getApiClient(item.ServerId), mediaType); return player.getDeviceProfile(item).then(function (deviceProfile) { - return getPlaybackInfo(player, apiClient, item, deviceProfile, maxBitrate, startPosition, false, null, null, null, null).then(function (playbackInfoResult) { + const mediaOptions = { + maxBitrate: maxBitrate, + startPosition: startPosition, + isPlayback: true, + audioStreamIndex: null, + subtitleStreamIndex: null, + enableDirectPlay: null, + enableDirectStream: null, + allowVideoStreamCopy: null, + allowAudioStreamCopy: null + }; + + return getPlaybackInfo(player, apiClient, item, deviceProfile, null, null, mediaOptions).then(function (playbackInfoResult) { return playbackInfoResult.MediaSources; }); }); @@ -2701,13 +2734,18 @@ class PlaybackManager { return tracks; } - function getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex) { - return getPlaybackInfo(player, apiClient, item, deviceProfile, maxBitrate, startPosition, true, mediaSourceId, audioStreamIndex, subtitleStreamIndex, null).then(function (playbackInfoResult) { + function getPlaybackMediaSource(player, apiClient, deviceProfile, item, mediaSourceId, options) { + options.isPlayback = true; + + return getPlaybackInfo(player, apiClient, item, deviceProfile, mediaSourceId, null, options).then(function (playbackInfoResult) { if (validatePlaybackInfoResult(self, playbackInfoResult)) { return getOptimalMediaSource(apiClient, item, playbackInfoResult.MediaSources).then(function (mediaSource) { if (mediaSource) { if (mediaSource.RequiresOpening && !mediaSource.LiveStreamId) { - return getLiveStream(player, apiClient, item, playbackInfoResult.PlaySessionId, deviceProfile, maxBitrate, startPosition, mediaSource, null, null).then(function (openLiveStreamResult) { + options.audioStreamIndex = null; + options.subtitleStreamIndex = null; + + return getLiveStream(player, apiClient, item, playbackInfoResult.PlaySessionId, deviceProfile, mediaSource, options).then(function (openLiveStreamResult) { return supportsDirectPlay(apiClient, item, openLiveStreamResult.MediaSource).then(function (result) { openLiveStreamResult.MediaSource.enableDirectPlay = result; return openLiveStreamResult.MediaSource; From 29f16d5a04089d8ff87b40405bce296537c19084 Mon Sep 17 00:00:00 2001 From: Pier-Luc Ducharme Date: Mon, 16 Jan 2023 21:27:49 -0500 Subject: [PATCH 146/156] Refactor userdatabuttons to follow max-params rule --- .../userdatabuttons/userdatabuttons.js | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/components/userdatabuttons/userdatabuttons.js b/src/components/userdatabuttons/userdatabuttons.js index c170a7cc0f..c5cb746f9c 100644 --- a/src/components/userdatabuttons/userdatabuttons.js +++ b/src/components/userdatabuttons/userdatabuttons.js @@ -12,7 +12,10 @@ const userDataMethods = { markFavorite: markFavorite }; -function getUserDataButtonHtml(method, itemId, serverId, buttonCssClass, iconCssClass, icon, tooltip, style) { +function getUserDataButtonHtml(method, itemId, serverId, icon, tooltip, style, classes) { + let buttonCssClass = classes.buttonCssClass; + let iconCssClass = classes.iconCssClass; + if (style === 'fab-mini') { style = 'fab'; buttonCssClass = buttonCssClass ? (buttonCssClass + ' mini') : 'mini'; @@ -97,6 +100,11 @@ function getIconsHtml(options) { const iconCssClass = options.iconCssClass; + const classes = { + buttonCssClass: btnCssClass, + iconCssClass: iconCssClass + }; + const serverId = item.ServerId; if (includePlayed !== false) { @@ -104,18 +112,21 @@ function getIconsHtml(options) { if (itemHelper.canMarkPlayed(item)) { if (userData.Played) { - html += getUserDataButtonHtml('markPlayed', itemId, serverId, btnCssClass + ' btnUserDataOn', iconCssClass, 'check', tooltipPlayed, style); + const buttonCssClass = classes.buttonCssClass + ' btnUserDataOn'; + html += getUserDataButtonHtml('markPlayed', itemId, serverId, 'check', tooltipPlayed, style, {buttonCssClass: buttonCssClass, ...classes}); } else { - html += getUserDataButtonHtml('markPlayed', itemId, serverId, btnCssClass, iconCssClass, 'check', tooltipPlayed, style); + html += getUserDataButtonHtml('markPlayed', itemId, serverId, 'check', tooltipPlayed, style, classes); } } } const tooltipFavorite = globalize.translate('Favorite'); if (userData.IsFavorite) { - html += getUserDataButtonHtml('markFavorite', itemId, serverId, btnCssClass + ' btnUserData btnUserDataOn', iconCssClass, 'favorite', tooltipFavorite, style); + const buttonCssClass = classes.buttonCssClass + ' btnUserData btnUserDataOn'; + html += getUserDataButtonHtml('markFavorite', itemId, serverId, 'favorite', tooltipFavorite, style, {buttonCssClass: buttonCssClass, ...classes}); } else { - html += getUserDataButtonHtml('markFavorite', itemId, serverId, btnCssClass + ' btnUserData', iconCssClass, 'favorite', tooltipFavorite, style); + classes.buttonCssClass += ' btnUserData'; + html += getUserDataButtonHtml('markFavorite', itemId, serverId, 'favorite', tooltipFavorite, style, classes); } return html; From a3c330b4e1c67b75e8a3e3d05e5f1d8a102b184c Mon Sep 17 00:00:00 2001 From: Pier-Luc Ducharme Date: Mon, 30 Jan 2023 22:52:49 -0500 Subject: [PATCH 147/156] Add contributor to project --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index c867d81580..f3dbfec6da 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -59,6 +59,7 @@ - [Vankerkom](https://github.com/vankerkom) - [edvwib](https://github.com/edvwib) - [Rob Farraher](https://github.com/farraherbg) + - [Pier-Luc Ducharme](https://github.com/pl-ducharme) # Emby Contributors From cf5d65d86ec4c44c72e8c73deee998d931543102 Mon Sep 17 00:00:00 2001 From: Pier-Luc Ducharme Date: Thu, 9 Feb 2023 21:35:59 -0500 Subject: [PATCH 148/156] Simplify code with object shorthand syntax --- src/components/cardbuilder/cardBuilder.js | 4 +-- src/components/guide/guide.js | 2 +- src/components/imageeditor/imageeditor.js | 4 +-- src/components/playback/playbackmanager.js | 30 +++++++++---------- .../userdatabuttons/userdatabuttons.js | 11 ++----- 5 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 657a4102d9..a0c4aaf09b 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1261,7 +1261,7 @@ import { appRouter } from '../appRouter'; logoUrl = null; footerCssClass = progressHtml ? 'innerCardFooter fullInnerCardFooter' : 'innerCardFooter'; - innerCardFooter += getCardFooterText(item, apiClient, options, footerCssClass, progressHtml, {forceName: forceName, overlayText: overlayText, isOuterFooter: false}, {imgUrl: imgUrl, logoUrl: logoUrl}); + innerCardFooter += getCardFooterText(item, apiClient, options, footerCssClass, progressHtml, { forceName, overlayText, isOuterFooter: false }, { imgUrl, logoUrl }); footerOverlayed = true; } else if (progressHtml) { innerCardFooter += '
'; @@ -1288,7 +1288,7 @@ import { appRouter } from '../appRouter'; logoUrl = null; } - outerCardFooter = getCardFooterText(item, apiClient, options, footerCssClass, progressHtml, {forceName: forceName, overlayText: overlayText, isOuterFooter: true}, {imgUrl: imgUrl, logoUrl: logoUrl}); + outerCardFooter = getCardFooterText(item, apiClient, options, footerCssClass, progressHtml, { forceName, overlayText, isOuterFooter: true }, { imgUrl, logoUrl }); } if (outerCardFooter && !options.cardLayout) { diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index 5e4ee8af00..63a682ee65 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -345,7 +345,7 @@ function Guide(options) { } apiClient.getLiveTvPrograms(programQuery).then(function (programsResult) { - const guideOptions = {focusProgramOnRender: focusProgramOnRender, scrollToTimeMs: scrollToTimeMs, focusToTimeMs: focusToTimeMs, startTimeOfDayMs: startTimeOfDayMs}; + const guideOptions = { focusProgramOnRender, scrollToTimeMs, focusToTimeMs, startTimeOfDayMs }; renderGuide(context, date, channelsResult.Items, programsResult.Items, renderOptions, guideOptions, apiClient); diff --git a/src/components/imageeditor/imageeditor.js b/src/components/imageeditor/imageeditor.js index 85916e5cf8..9130bd311c 100644 --- a/src/components/imageeditor/imageeditor.js +++ b/src/components/imageeditor/imageeditor.js @@ -132,7 +132,7 @@ import template from './imageeditor.template.html'; html += '
'; - const imageUrl = getImageUrl(currentItem, apiClient, image.ImageType, image.ImageIndex, {maxWidth: options.imageSize}); + const imageUrl = getImageUrl(currentItem, apiClient, image.ImageType, image.ImageIndex, { maxWidth: options.imageSize }); html += '
'; @@ -226,7 +226,7 @@ import template from './imageeditor.template.html'; for (let i = 0, length = images.length; i < length; i++) { const image = images[i]; - const options = {index: i, numImages: length, imageProviders: imageProviders, imageSize: imageSize, tagName: tagName, enableFooterButtons: enableFooterButtons}; + const options = { index: i, numImages: length, imageProviders, imageSize, tagName, enableFooterButtons }; html += getCardHtml(image, apiClient, options); } diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 7591c22917..947f46eec8 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -344,7 +344,7 @@ function getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, api const maxValues = getAudioMaxValues(deviceProfile); - return getAudioStreamUrl(item, transcodingProfile, directPlayContainers, apiClient, startPosition, { maxBitrate: maxBitrate, ...maxValues }); + return getAudioStreamUrl(item, transcodingProfile, directPlayContainers, apiClient, startPosition, { maxBitrate, ...maxValues }); } function getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition) { @@ -377,7 +377,7 @@ function getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPositio let streamUrl; if (item.MediaType === 'Audio' && !itemHelper.isLocalItem(item)) { - streamUrl = getAudioStreamUrl(item, audioTranscodingProfile, audioDirectPlayContainers, apiClient, startPosition, { maxBitrate: maxBitrate, ...maxValues }); + streamUrl = getAudioStreamUrl(item, audioTranscodingProfile, audioDirectPlayContainers, apiClient, startPosition, { maxBitrate, ...maxValues }); } streamUrls.push(streamUrl || ''); @@ -1722,11 +1722,11 @@ class PlaybackManager { const currentPlayOptions = currentItem.playOptions || getDefaultPlayOptions(); const options = { - maxBitrate: maxBitrate, + maxBitrate, startPosition: ticks, isPlayback: true, - audioStreamIndex: audioStreamIndex, - subtitleStreamIndex: subtitleStreamIndex, + audioStreamIndex, + subtitleStreamIndex, enableDirectPlay: params.EnableDirectPlay, enableDirectStream: params.EnableDirectStream, allowVideoStreamCopy: params.AllowVideoStreamCopy, @@ -2304,9 +2304,9 @@ class PlaybackManager { loading.hide(); return player.play({ - items: items, + items, startPositionTicks: options.startPosition || 0, - mediaSourceId: mediaSourceId, + mediaSourceId, audioStreamIndex: options.audioStreamIndex, subtitleStreamIndex: options.subtitleStreamIndex, startIndex: options.startIndex @@ -2471,11 +2471,11 @@ class PlaybackManager { const audioStreamIndex = playOptions.audioStreamIndex; const subtitleStreamIndex = playOptions.subtitleStreamIndex; const options = { - maxBitrate: maxBitrate, - startPosition: startPosition, + maxBitrate, + startPosition, isPlayback: null, - audioStreamIndex: audioStreamIndex, - subtitleStreamIndex: subtitleStreamIndex, + audioStreamIndex, + subtitleStreamIndex, startIndex: playOptions.startIndex, enableDirectPlay: null, enableDirectStream: null, @@ -2549,8 +2549,8 @@ class PlaybackManager { return player.getDeviceProfile(item).then(function (deviceProfile) { const mediaOptions = { - maxBitrate: maxBitrate, - startPosition: startPosition, + maxBitrate, + startPosition, isPlayback: null, audioStreamIndex: options.audioStreamIndex, subtitleStreamIndex: options.subtitleStreamIndex, @@ -2582,8 +2582,8 @@ class PlaybackManager { return player.getDeviceProfile(item).then(function (deviceProfile) { const mediaOptions = { - maxBitrate: maxBitrate, - startPosition: startPosition, + maxBitrate, + startPosition, isPlayback: true, audioStreamIndex: null, subtitleStreamIndex: null, diff --git a/src/components/userdatabuttons/userdatabuttons.js b/src/components/userdatabuttons/userdatabuttons.js index c5cb746f9c..f75bbce81e 100644 --- a/src/components/userdatabuttons/userdatabuttons.js +++ b/src/components/userdatabuttons/userdatabuttons.js @@ -99,12 +99,7 @@ function getIconsHtml(options) { } const iconCssClass = options.iconCssClass; - - const classes = { - buttonCssClass: btnCssClass, - iconCssClass: iconCssClass - }; - + const classes = { buttonCssClass: btnCssClass, iconCssClass: iconCssClass }; const serverId = item.ServerId; if (includePlayed !== false) { @@ -113,7 +108,7 @@ function getIconsHtml(options) { if (itemHelper.canMarkPlayed(item)) { if (userData.Played) { const buttonCssClass = classes.buttonCssClass + ' btnUserDataOn'; - html += getUserDataButtonHtml('markPlayed', itemId, serverId, 'check', tooltipPlayed, style, {buttonCssClass: buttonCssClass, ...classes}); + html += getUserDataButtonHtml('markPlayed', itemId, serverId, 'check', tooltipPlayed, style, { buttonCssClass, ...classes }); } else { html += getUserDataButtonHtml('markPlayed', itemId, serverId, 'check', tooltipPlayed, style, classes); } @@ -123,7 +118,7 @@ function getIconsHtml(options) { const tooltipFavorite = globalize.translate('Favorite'); if (userData.IsFavorite) { const buttonCssClass = classes.buttonCssClass + ' btnUserData btnUserDataOn'; - html += getUserDataButtonHtml('markFavorite', itemId, serverId, 'favorite', tooltipFavorite, style, {buttonCssClass: buttonCssClass, ...classes}); + html += getUserDataButtonHtml('markFavorite', itemId, serverId, 'favorite', tooltipFavorite, style, { buttonCssClass, ...classes }); } else { classes.buttonCssClass += ' btnUserData'; html += getUserDataButtonHtml('markFavorite', itemId, serverId, 'favorite', tooltipFavorite, style, classes); From ecb84ff351eddca7f069431edca3c795cfea5a00 Mon Sep 17 00:00:00 2001 From: WontTell Date: Wed, 8 Mar 2023 02:55:32 +0000 Subject: [PATCH 149/156] Translated using Weblate (Spanish (Latin America)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_419/ --- src/strings/es_419.json | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/strings/es_419.json b/src/strings/es_419.json index db7ec1884c..a09b64a0b9 100644 --- a/src/strings/es_419.json +++ b/src/strings/es_419.json @@ -571,7 +571,7 @@ "LabelSelectVersionToInstall": "Seleccionar versión a instalar:", "LabelSelectUsers": "Seleccionar usuarios:", "LabelSelectFolderGroupsHelp": "Las carpetas sin marcar serán mostradas individualmente en su propia vista.", - "LabelSelectFolderGroups": "Agrupar automáticamente el contenido de las siguientes carpetas a vistas como Películas, Música y TV:", + "LabelSelectFolderGroups": "Agrupar automáticamente el contenido de las siguientes carpetas a vistas como «Películas», «Música» y «TV»:", "LabelSeasonNumber": "Temporada número:", "LabelScreensaver": "Protector de pantalla:", "LabelScheduledTaskLastRan": "Última ejecución {0}, tomando {1}.", @@ -1006,7 +1006,7 @@ "LabelMaxResumePercentageHelp": "Los medios se consideran totalmente reproducidos si se detienen después de este tiempo.", "LabelMaxResumePercentage": "Porcentaje máximo para la reanudación:", "LabelMaxParentalRating": "Máxima clasificación parental permitida:", - "LabelMaxChromecastBitrate": "Calidad de transmisión de Chromecast:", + "LabelMaxChromecastBitrate": "Calidad de transmisión de Google Cast:", "LabelMaxBackdropsPerItem": "Número máximo de imágenes de fondo por elemento:", "LabelMatchType": "Tipo de coincidencia:", "LabelManufacturerUrl": "URL del fabricante:", @@ -1354,7 +1354,7 @@ "MessagePluginInstallError": "Ocurrió un error instalando el complemento.", "PlaybackRate": "Tasa de reproducción", "Data": "Datos", - "ButtonUseQuickConnect": "Usar conexión rápida", + "ButtonUseQuickConnect": "Usar «Conexión rápida»", "ButtonActivate": "Activar", "Authorize": "Autorizar", "LabelCurrentStatus": "Estado actual:", @@ -1366,7 +1366,7 @@ "TonemappingAlgorithmHelp": "El mapeo de tonos puede ser modificado. Si no estas familiarizado con estas opciones, solo manten el predeterminado. El valor recomendado es Hable.", "LabelTonemappingThresholdHelp": "El algoritmo de mapeo de tonos puede ser finamente ajustado para cada escena. Y el umbral es usado para detectar si la escena ha cambiado. Si los valores entre el promedio de brillo del fotograma actual y el promedio actual excede el valor de umbral, se vuelve a calcular el brillo promedio y máximo. Los valores recomendados y por defecto son entre 0.2 y 0.8.", "ThumbCard": "Miniatura", - "LabelMaxMuxingQueueSizeHelp": "Numero máximo de paquetes que pueden estar en búfer mientras se espera a que se inicialicen todas las trasmisiones. Intenta incrementarlos si encuentras el error \"Too many packets buffered for output stream\" en los registros de ffmpeg. El valor recomendado es 2048.", + "LabelMaxMuxingQueueSizeHelp": "Numero máximo de paquetes que pueden estar en búfer mientras se espera a que se inicialicen todas las trasmisiones. Intenta incrementarlos si encuentras el error «Too many packets buffered for output stream» en los registros de ffmpeg. El valor recomendado es 2048.", "LabelMaxMuxingQueueSize": "Tamaño máximo cola de mezclado:", "LabelTonemappingParamHelp": "Modifica el algoritmo de mapeo de tonos. Los valores recomendados y por defecto son NaN. Se puede dejar en blanco.", "LabelTonemappingParam": "Parámetro Mapeo de tonos:", @@ -1380,7 +1380,7 @@ "LabelTonemappingAlgorithm": "Seleccione el algoritmo de mapeo de tonos:", "AllowTonemappingHelp": "El mapeo de tonos puede transformar el rango dinámico de un video de HDR a SDR manteniendo la calidad de imagen y los colores, que son datos muy importantes para mostrar la imagen original. Actualmente solo funciona con videos HDR10 o HLG. Esto requiere los tiempos de ejecución OpenCL o CUDA correspondientes.", "EnableTonemapping": "Habilitar mapeo de tonos", - "LabelOpenclDeviceHelp": "Este es el dispositivo OpenCL que se utiliza para el mapeo de tonos. El lado izquierdo del punto es el número de plataforma y el lado derecho es el número de dispositivo en la plataforma. El valor predeterminado es 0.0. Se requiere la aplicación ffmpeg que contiene el método de aceleración de hardware OpenCL.", + "LabelOpenclDeviceHelp": "Este es el dispositivo OpenCL que se utiliza para el mapeo de tonos. El lado izquierdo del punto es el número de plataforma y el lado derecho es el número de dispositivo en la plataforma. El valor predeterminado es 0.0. Se requiere la aplicación FFmpeg que contiene el método de aceleración de hardware OpenCL.", "LabelOpenclDevice": "Dispositivo OpenCL:", "LabelColorPrimaries": "Colores primarios:", "LabelColorTransfer": "Transferencia de Color:", @@ -1400,22 +1400,22 @@ "SelectServer": "Seleccionar Servidor", "Restart": "Reiniciar", "ResetPassword": "Resetear contraseña", - "QuickConnectNotActive": "Conexión Rápida no esta habilitado en el servidor", - "QuickConnectNotAvailable": "Pregunte al administrador del servidor para habilitar Conexión Rápida", - "QuickConnectInvalidCode": "Código Conexión Rápida inválido", - "QuickConnectDescription": "Para ingresar con Conexión Rápida, seleccione el botón Conexión Rápida en el dispositivo del cual estas ingresando e ingrese el siguiente código.", - "QuickConnectDeactivated": "Conexión Rápida se desactivó antes de que se pudiera aprobar la solicitud de inicio de sesión", - "QuickConnectAuthorizeFail": "Código Conexión Rápida desconocido", - "QuickConnectAuthorizeSuccess": "Requiere autorización", + "QuickConnectNotActive": "«Conexión rápida» no está habilitado en este servidor", + "QuickConnectNotAvailable": "Pide al administrador del servidor que habilite la «Conexión rápida»", + "QuickConnectInvalidCode": "Código de «Conexión rápida» inválido", + "QuickConnectDescription": "Para ingresar con «Conexión rápida», seleccione el botón «Conexión rápida» en el dispositivo del cual estas ingresando e ingrese el código mostrado a continuación.", + "QuickConnectDeactivated": "La «Conexión rápida» se desactivó antes de que se pudiera aprobar la solicitud de inicio de sesión", + "QuickConnectAuthorizeFail": "Código de «Conexión rápida» desconocido", + "QuickConnectAuthorizeSuccess": "Solicitud autorizada", "QuickConnectAuthorizeCode": "Ingrese el código {0} para acceder", - "QuickConnectActivationSuccessful": "Activación Exitosa", - "QuickConnect": "Conexión Rápida", + "QuickConnectActivationSuccessful": "Activado exitosamente", + "QuickConnect": "Conexión rápida", "Profile": "Perfil", "PosterCard": "Imagen del Cartel", "Poster": "Cartel", "Photo": "Foto", "MusicVideos": "Videos musicales", - "LabelQuickConnectCode": "Código conexión rápida:", + "LabelQuickConnectCode": "Código de «Conexión rápida»:", "LabelKnownProxies": "Proxies conocidos:", "LabelIconMaxResHelp": "Resolución maxima de los iconos por medio de la función 'upnp:icon'.", "EnableAutoCast": "Establecer como Predeterminado", @@ -1519,7 +1519,7 @@ "LabelSlowResponseEnabled": "Log de alarma si la respuesta del servidor fue lenta", "UseEpisodeImagesInNextUpHelp": "Las secciones Siguiente y Continuar viendo utilizaran imagenes del episodio como miniaturas en lugar de miniaturas del show.", "UseEpisodeImagesInNextUp": "Usar imágenes de los episodios en \"Siguiente\" y \"Continuar Viendo\"", - "LabelLocalCustomCss": "El CSS personalizado aplica solo a este cliente. Puede quieras deshabilitar el CSS del servidor.", + "LabelLocalCustomCss": "Código CSS personalizado para estilo que aplica solo a este cliente. Puede que quiera deshabilitar el código CSS personalizado del servidor.", "LabelDisableCustomCss": "Desactivar el código CSS personalizado para la tematización/marca proporcionada desde el servidor.", "DisableCustomCss": "Deshabilitar CSS proveniente del servidor", "LabelAutomaticallyAddToCollectionHelp": "Cuando al menos 2 películas tengan el mismo nombre de colección, se añadirán automáticamente a dicha colección.", @@ -1574,5 +1574,6 @@ "LabelDummyChapterDurationHelp": "El intervalo de la extracción de las imágenes de los capítulos, en segundos.", "LabelDummyChapterCount": "Límite:", "LabelChapterImageResolution": "Resolución:", - "LabelChapterImageResolutionHelp": "La resolución de las imágenes de capítulos extraídas." + "LabelChapterImageResolutionHelp": "La resolución de las imágenes de capítulos extraídas.", + "LabelMaxDaysForNextUp": "Días máximos en «A continuación»:" } From 2d95a95eaea64ad76565351776bba3b5800c1ac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20=C3=96rn=20Ketilsson?= Date: Wed, 8 Mar 2023 16:17:30 +0000 Subject: [PATCH 150/156] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 585b335c18..1d8d08631c 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -455,5 +455,16 @@ "ButtonActivate": "Virkja", "ButtonClose": "Loka", "ButtonSpace": "Bil", - "Authorize": "Heimila" + "Authorize": "Heimila", + "ChangingMetadataImageSettingsNewContent": "Breytingar á niðurhali lýsigögnum eða myndum mun aðeins gilda um ný efni sem bætt hafa verið í safnið. Til að breyta núverandi titla þarftu að endurnýja lýsigögnin handvirkt.", + "ColorTransfer": "Litaflutningur", + "Data": "Gögn", + "ClearQueue": "Hreinsa biðröð", + "DailyAt": "Daglega um {0}", + "DashboardServerName": "Þjónn: {0}", + "DashboardVersionNumber": "Útgáfa: {0}", + "ColorSpace": "Litarými", + "Copied": "Aftritað", + "Copy": "Afrita", + "CopyFailed": "Gat ekki afritað" } From aab068565d50b3ed617ea415133cea1f401e98bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20=C3=96rn=20Ketilsson?= Date: Wed, 8 Mar 2023 19:16:06 +0000 Subject: [PATCH 151/156] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 1d8d08631c..4d131ff8ad 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -466,5 +466,17 @@ "ColorSpace": "Litarými", "Copied": "Aftritað", "Copy": "Afrita", - "CopyFailed": "Gat ekki afritað" + "CopyFailed": "Gat ekki afritað", + "ButtonExitApp": "Fara úr forriti", + "EnableFasterAnimations": "Hraðari hreyfimyndir", + "EnablePlugin": "Virkja", + "Bwdif": "BWDIF", + "DisablePlugin": "Slökkva", + "EnableAutoCast": "Setja sem Sjálfgefið", + "EnableDetailsBanner": "Upplýsingar borði", + "DeleteAll": "Eyða Öllu", + "ButtonBackspace": "Backspace", + "ButtonUseQuickConnect": "Nota hraðtengingu", + "Digital": "Stafrænt", + "DownloadAll": "Sækja allt" } From 16c47fc74f473e91f4c56b3bcc9fcf3438f2cca8 Mon Sep 17 00:00:00 2001 From: fdolbec123 Date: Thu, 9 Mar 2023 16:51:22 +0000 Subject: [PATCH 152/156] Translated using Weblate (French (Canada)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr_CA/ --- src/strings/fr-ca.json | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/strings/fr-ca.json b/src/strings/fr-ca.json index 26e2fe3a71..15f1fe017b 100644 --- a/src/strings/fr-ca.json +++ b/src/strings/fr-ca.json @@ -334,7 +334,7 @@ "DownloadsValue": "{0} téléchargements", "DisplayModeHelp": "Sélectionner l'agencement que vous désirez pour l'interface.", "DisplayMissingEpisodesWithinSeasons": "Afficher les épisodes manquants dans les saisons", - "DisplayInOtherHomeScreenSections": "Afficher dans les sections de l’écran d’accueil comme « Ajouts récents » et reprendre le visionnement", + "DisplayInOtherHomeScreenSections": "Afficher dans les sections de l’écran d’accueil comme « Ajouts récents » et «Reprendre le visionnement»", "Directors": "Réalisateurs", "Director": "Réalisateur", "DetectingDevices": "Détection des appareils", @@ -349,7 +349,7 @@ "HeaderCodecProfile": "Profil de codec", "HeaderChapterImages": "Images des chapitres", "HeaderChannelAccess": "Accès aux chaînes", - "LatestFromLibrary": "{0}, ajouts récents", + "LatestFromLibrary": "{0} ajouts récents", "HideWatchedContentFromLatestMedia": "Masquer le contenu déjà vu dans les 'Derniers Médias'", "HeaderLatestRecordings": "Derniers enregistrements", "HeaderLatestMusic": "Dernière musique", @@ -1020,5 +1020,25 @@ "LabelMaxParentalRating": "Classification parentale maximale :", "SpecialFeatures": "Bonus", "Sort": "Trier", - "SortByValue": "Trier par" + "SortByValue": "Trier par", + "LabelMovieCategories": "Catégories de films:", + "LabelNewPassword": "Nouveau mot de passe:", + "LabelOriginalName": "Nom original:", + "LabelPasswordRecoveryPinCode": "Code NIP:", + "LabelOriginalTitle": "Titre original:", + "LabelMaxStreamingBitrate": "Qualité maximale de streaming:", + "LabelNotificationEnabled": "Activer cette notification", + "LabelNewName": "Nouveau nom:", + "LabelNewPasswordConfirm": "Confirmer le nouveau mot de passe:", + "LabelPersonRole": "Rôle:", + "LabelPasswordConfirm": "Confirmer le mot de passe:", + "LabelPersonRoleHelp": "Exemple: Conducteur de camion à crème glacée", + "LabelPleaseRestart": "Les changements prendront effets après avoir rechargé manuellement le client web.", + "LabelMinAudiobookResumeHelp": "Les titres sont considérés comme non joué s'ils sont arrêtés avant cette durée.", + "LabelPassword": "Mot de passe:", + "LabelPath": "Chemin:", + "LabelMetadataPath": "Chemin des métadonnées:", + "LabelDummyChapterDuration": "Intervalle:", + "LabelDummyChapterCount": "Limite:", + "LabelChapterImageResolution": "Résolution:" } From 339311008e1c06c81ff21507a2cd8fa4d3c79f94 Mon Sep 17 00:00:00 2001 From: stanol Date: Thu, 9 Mar 2023 18:59:01 +0000 Subject: [PATCH 153/156] Translated using Weblate (Ukrainian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/ --- src/strings/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/uk.json b/src/strings/uk.json index 3a6d695e64..7a7527dc02 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -1439,7 +1439,7 @@ "SubtitleDownloadersHelp": "Увімкніть та оцініть бажані завантажувачі субтитрів у порядку пріоритету.", "SubtitleAppearanceSettingsDisclaimer": "Наведені нижче налаштування не застосовуються до графічних субтитрів, згаданих вище, або субтитрів ASS/SSA, які вбудовують власні стилі.", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Ці налаштування також застосовуються до будь-якого відтворення Google Cast, запущеного цим пристроєм.", - "Subtitle": "Підзаголовок", + "Subtitle": "Субтитри", "Studios": "Студії", "StopRecording": "Зупинити запис", "StopPlayback": "Зупинити відтворення", From 8dbf40fa0a5077c34a2bf14a5ecb911d49e358d4 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 9 Mar 2023 19:43:06 -0500 Subject: [PATCH 154/156] Backport pull request #4330 from jellyfin/release-10.8.z Fix navigation for some types of INPUT Original-merge: 7e99e3ec515d9a461358b5053da0c78a9f452e8d Merged-by: Bill Thornton Backported-by: crobibero --- src/scripts/keyboardNavigation.js | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/scripts/keyboardNavigation.js b/src/scripts/keyboardNavigation.js index feef180630..39c187479d 100644 --- a/src/scripts/keyboardNavigation.js +++ b/src/scripts/keyboardNavigation.js @@ -50,6 +50,11 @@ const NavigationKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown']; */ const InteractiveElements = ['INPUT', 'TEXTAREA']; +/** + * Types of INPUT element for which navigation shouldn't be constrained. + */ +const NonInteractiveInputElements = ['button', 'checkbox', 'color', 'file', 'hidden', 'image', 'radio', 'reset', 'submit']; + let hasFieldKey = false; try { hasFieldKey = 'key' in new KeyboardEvent('keydown'); @@ -84,6 +89,24 @@ export function isNavigationKey(key) { return NavigationKeys.indexOf(key) != -1; } +/** + * Returns _true_ if the element is interactive. + * + * @param {Element} element - Element. + * @return {boolean} _true_ if the element is interactive. + */ +export function isInteractiveElement(element) { + if (element && InteractiveElements.includes(element.tagName)) { + if (element.tagName === 'INPUT') { + return !NonInteractiveInputElements.includes(element.type); + } + + return true; + } + + return false; +} + export function enable() { window.addEventListener('keydown', function (e) { const key = getKeyName(e); @@ -97,7 +120,7 @@ export function enable() { switch (key) { case 'ArrowLeft': - if (!InteractiveElements.includes(document.activeElement?.tagName)) { + if (!isInteractiveElement(document.activeElement)) { inputManager.handleCommand('left'); } else { capture = false; @@ -107,7 +130,7 @@ export function enable() { inputManager.handleCommand('up'); break; case 'ArrowRight': - if (!InteractiveElements.includes(document.activeElement?.tagName)) { + if (!isInteractiveElement(document.activeElement)) { inputManager.handleCommand('right'); } else { capture = false; From 2c4d065e0ebaca280bc71a2e5c126d22203168be Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 9 Mar 2023 19:43:07 -0500 Subject: [PATCH 155/156] Backport pull request #4362 from jellyfin/release-10.8.z Fix subtitle offset reset when seeking progressive stream Original-merge: af27e084d5fd6d7f0372b8f10a5eff339c73866c Merged-by: Bill Thornton Backported-by: crobibero --- src/components/playback/playbackmanager.js | 1 + src/plugins/htmlVideoPlayer/plugin.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 947f46eec8..e6cba06d2e 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1740,6 +1740,7 @@ class PlaybackManager { const streamInfo = createStreamInfo(apiClient, currentItem.MediaType, currentItem, currentMediaSource, ticks, player); streamInfo.fullscreen = currentPlayOptions.fullscreen; streamInfo.lastMediaInfoQuery = lastMediaInfoQuery; + streamInfo.resetSubtitleOffset = false; if (!streamInfo.url) { showPlaybackInfoErrorMessage(self, 'PlaybackErrorNoCompatibleStream'); diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 2582785f8e..a4f512768f 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -382,7 +382,7 @@ function tryRemoveElement(elem) { this.#currentTime = null; - this.resetSubtitleOffset(); + if (options.resetSubtitleOffset !== false) this.resetSubtitleOffset(); return this.createMediaElement(options).then(elem => { return this.updateVideoUrl(options).then(() => { From c9b72d87fe6299e79c025db60901a306325deab7 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 9 Mar 2023 19:43:08 -0500 Subject: [PATCH 156/156] Backport pull request #4395 from jellyfin/release-10.8.z Fix installed plugin version html Original-merge: 22d1f40587a79a0774fe0fe6f8c07a258d077f24 Merged-by: Bill Thornton Backported-by: crobibero --- src/controllers/dashboard/plugins/add/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/dashboard/plugins/add/index.js b/src/controllers/dashboard/plugins/add/index.js index 5e0a2d3f14..150fe3e1fd 100644 --- a/src/controllers/dashboard/plugins/add/index.js +++ b/src/controllers/dashboard/plugins/add/index.js @@ -68,7 +68,7 @@ function renderPackage(pkg, installedPlugins, page) { if (installedPlugin) { const currentVersionText = globalize.translate('MessageYouHaveVersionInstalled', '' + installedPlugin.Version + ''); - $('#pCurrentVersion', page).show().text(currentVersionText); + $('#pCurrentVersion', page).show().html(currentVersionText); } else { $('#pCurrentVersion', page).hide().text(''); }