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

Merge branch 'master' into subtitle-improvements-1

This commit is contained in:
MBR-0001 2023-09-11 18:10:57 +02:00 committed by GitHub
commit 29b7be4a96
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 246 additions and 67 deletions

12
package-lock.json generated
View file

@ -38,7 +38,7 @@
"flv.js": "1.6.2",
"headroom.js": "0.12.0",
"history": "5.3.0",
"hls.js": "1.4.4",
"hls.js": "github:nyanmisaka/hls.js#v1.5.0-fix-firefox-av1",
"intersection-observer": "0.12.2",
"jassub": "1.7.1",
"jellyfin-apiclient": "1.10.0",
@ -9460,9 +9460,8 @@
}
},
"node_modules/hls.js": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.4.4.tgz",
"integrity": "sha512-Yix3i1klHtTWIj8Fa/yoN5mFreY3eLKGrmVldpkQ+2Bb1PmEok9Ah/VfAzlJnwtInCo4rs5l6/W2tUh76DaSNA=="
"resolved": "git+ssh://git@github.com/nyanmisaka/hls.js.git#2ca771e97a15d8078a3850c4c4cf225f497dcaa7",
"license": "Apache-2.0"
},
"node_modules/hoist-non-react-statics": {
"version": "3.3.2",
@ -27345,9 +27344,8 @@
}
},
"hls.js": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.4.4.tgz",
"integrity": "sha512-Yix3i1klHtTWIj8Fa/yoN5mFreY3eLKGrmVldpkQ+2Bb1PmEok9Ah/VfAzlJnwtInCo4rs5l6/W2tUh76DaSNA=="
"version": "git+ssh://git@github.com/nyanmisaka/hls.js.git#2ca771e97a15d8078a3850c4c4cf225f497dcaa7",
"from": "hls.js@github:nyanmisaka/hls.js#v1.5.0-fix-firefox-av1"
},
"hoist-non-react-statics": {
"version": "3.3.2",

View file

@ -93,7 +93,7 @@
"flv.js": "1.6.2",
"headroom.js": "0.12.0",
"history": "5.3.0",
"hls.js": "1.4.4",
"hls.js": "github:nyanmisaka/hls.js#v1.5.0-fix-firefox-av1",
"intersection-observer": "0.12.2",
"jassub": "1.7.1",
"jellyfin-apiclient": "1.10.0",

View file

@ -16,11 +16,14 @@ function getBaseProfileOptions(item) {
if (browser.edge) {
disableHlsVideoAudioCodecs.push('mp3');
}
if (!browser.edgeChromium) {
disableHlsVideoAudioCodecs.push('ac3');
disableHlsVideoAudioCodecs.push('eac3');
}
if (!(browser.chrome || browser.edgeChromium || browser.firefox)) {
disableHlsVideoAudioCodecs.push('opus');
}
}
return {
enableMkvProgressive: false,

View file

@ -43,8 +43,8 @@ export function enableHlsJsPlayer(runTimeTicks, mediaType) {
}
if (canPlayNativeHls()) {
// Having trouble with chrome's native support and transcoded music
if (browser.android && mediaType === 'Audio') {
// Android Webview's native HLS has performance and compatiblity issues
if (browser.android && (mediaType === 'Audio' || mediaType === 'Video')) {
return true;
}

View file

@ -124,6 +124,12 @@
<span>${AllowHevcEncoding}</span>
</label>
</div>
<div class="checkboxList">
<label>
<input type="checkbox" is="emby-checkbox" id="chkAllowAv1Encoding" />
<span>${AllowAv1Encoding}</span>
</label>
</div>
</div>
<div class="vppTonemappingOptions hide">

View file

@ -18,6 +18,7 @@ function loadPage(page, config, systemInfo) {
page.querySelector('#chkIntelLpHevcHwEncoder').checked = config.EnableIntelLowPowerHevcHwEncoder;
page.querySelector('#chkHardwareEncoding').checked = config.EnableHardwareEncoding;
page.querySelector('#chkAllowHevcEncoding').checked = config.AllowHevcEncoding;
page.querySelector('#chkAllowAv1Encoding').checked = config.AllowAv1Encoding;
$('#selectVideoDecoder', page).val(config.HardwareAccelerationType);
$('#selectThreadCount', page).val(config.EncodingThreadCount);
page.querySelector('#chkEnableAudioVbr').checked = config.EnableAudioVbr;
@ -123,6 +124,7 @@ function onSubmit() {
config.EnableIntelLowPowerHevcHwEncoder = form.querySelector('#chkIntelLpHevcHwEncoder').checked;
config.EnableHardwareEncoding = form.querySelector('#chkHardwareEncoding').checked;
config.AllowHevcEncoding = form.querySelector('#chkAllowHevcEncoding').checked;
config.AllowAv1Encoding = form.querySelector('#chkAllowAv1Encoding').checked;
ApiClient.updateNamedConfiguration('encoding', config).then(function () {
updateEncoder(form);
}, function () {

View file

@ -23,6 +23,17 @@ function canPlayHevc(videoTestElement, options) {
|| videoTestElement.canPlayType('video/mp4; codecs="hev1.1.0.L120"').replace(/no/, ''));
}
function canPlayAv1(videoTestElement) {
if (browser.tizenVersion >= 5.5 || browser.web0sVersion >= 5) {
return true;
}
// av1 main level 5.3
return !!videoTestElement.canPlayType
&& (videoTestElement.canPlayType('video/mp4; codecs="av01.0.15M.08"').replace(/no/, '')
&& videoTestElement.canPlayType('video/mp4; codecs="av01.0.15M.10"').replace(/no/, ''));
}
let _supportsTextTracks;
function supportsTextTracks() {
if (browser.tizen) {
@ -56,6 +67,14 @@ function canPlayNativeHls() {
|| media.canPlayType('application/vnd.apple.mpegURL').replace(/no/, ''));
}
function canPlayNativeHlsInFmp4() {
if (browser.tizenVersion >= 3 || browser.web0sVersion >= 3.5) {
return true;
}
return (browser.iOS && browser.iOSVersion >= 11) || browser.osx;
}
function canPlayHlsWithMSE() {
// text tracks dont work with this in firefox
return window.MediaSource != null; /* eslint-disable-line compat/compat */
@ -157,14 +176,6 @@ function testCanPlayMkv(videoTestElement) {
return !!browser.edgeUwp;
}
function testCanPlayAv1(videoTestElement) {
if (browser.tizenVersion >= 5.5 || browser.web0sVersion >= 5) {
return true;
}
return videoTestElement.canPlayType('video/webm; codecs="av01.0.15M.10"').replace(/no/, '');
}
function testCanPlayTs() {
return browser.tizen || browser.web0s || browser.edgeUwp;
}
@ -437,8 +448,15 @@ export default function (options) {
// Do not use AC3 for audio transcoding unless AAC and MP3 are not supported.
if (canPlayAc3VideoAudio) {
videoAudioCodecs.push('ac3');
if (browser.edgeChromium) {
hlsInFmp4VideoAudioCodecs.push('ac3');
}
if (canPlayEac3VideoAudio) {
videoAudioCodecs.push('eac3');
if (browser.edgeChromium) {
hlsInFmp4VideoAudioCodecs.push('eac3');
}
}
if (canPlayAc3VideoAudioInHls) {
@ -492,6 +510,9 @@ export default function (options) {
if (browser.tizen) {
hlsInTsVideoAudioCodecs.push('opus');
}
if (!browser.safari) {
hlsInFmp4VideoAudioCodecs.push('opus');
}
}
if (canPlayAudioFormat('flac')) {
@ -521,18 +542,23 @@ export default function (options) {
const hlsInTsVideoCodecs = [];
const hlsInFmp4VideoCodecs = [];
if ((browser.safari || browser.tizen || browser.web0s) && canPlayHevc(videoTestElement, options)) {
if (canPlayAv1(videoTestElement)
&& !browser.mobile && (browser.edgeChromium || browser.firefox || browser.chrome)) {
// disable av1 on mobile since it can be very slow software decoding
hlsInFmp4VideoCodecs.push('av1');
}
if (canPlayHevc(videoTestElement, options)
&& (browser.edgeChromium || browser.safari || browser.tizen || browser.web0s || (browser.chrome && (!browser.android || browser.chrome.versionMajor >= 105)))) {
// Chromium used to support HEVC on Android but not via MSE
hlsInFmp4VideoCodecs.push('hevc');
}
if (canPlayH264(videoTestElement)) {
mp4VideoCodecs.push('h264');
hlsInTsVideoCodecs.push('h264');
if (browser.safari || browser.tizen || browser.web0s) {
hlsInFmp4VideoCodecs.push('h264');
}
}
if (canPlayHevc(videoTestElement, options)) {
// safari is lying on HDR and 60fps videos, use fMP4 instead
@ -566,7 +592,7 @@ export default function (options) {
webmVideoCodecs.push('vp9');
}
if (testCanPlayAv1(videoTestElement)) {
if (canPlayAv1(videoTestElement)) {
mp4VideoCodecs.push('av1');
webmVideoCodecs.push('av1');
}
@ -687,7 +713,11 @@ export default function (options) {
});
if (canPlayHls() && options.enableHls !== false) {
if (hlsInFmp4VideoCodecs.length && hlsInFmp4VideoAudioCodecs.length && userSettings.preferFmp4HlsContainer() && (browser.safari || browser.tizen || browser.web0s)) {
let enableFmp4Hls = userSettings.preferFmp4HlsContainer();
if ((browser.safari || browser.tizen || browser.web0s) && !canPlayNativeHlsInFmp4()) {
enableFmp4Hls = false;
}
if (hlsInFmp4VideoCodecs.length && hlsInFmp4VideoAudioCodecs.length && enableFmp4Hls) {
profile.TranscodingProfiles.push({
Container: 'mp4',
Type: 'Video',
@ -817,6 +847,33 @@ export default function (options) {
hevcProfiles = 'main|main 10';
}
let maxAv1Level = 15; // level 5.3
const av1Profiles = 'main'; // av1 main covers 4:2:0 8 & 10 bits
// av1 main level 6.0
if (videoTestElement.canPlayType('video/mp4; codecs="av01.0.16M.08"').replace(/no/, '')
&& videoTestElement.canPlayType('video/mp4; codecs="av01.0.16M.10"').replace(/no/, '')) {
maxAv1Level = 16;
}
// av1 main level 6.1
if (videoTestElement.canPlayType('video/mp4; codecs="av01.0.17M.08"').replace(/no/, '')
&& videoTestElement.canPlayType('video/mp4; codecs="av01.0.17M.10"').replace(/no/, '')) {
maxAv1Level = 17;
}
// av1 main level 6.2
if (videoTestElement.canPlayType('video/mp4; codecs="av01.0.18M.08"').replace(/no/, '')
&& videoTestElement.canPlayType('video/mp4; codecs="av01.0.18M.10"').replace(/no/, '')) {
maxAv1Level = 18;
}
// av1 main level 6.3
if (videoTestElement.canPlayType('video/mp4; codecs="av01.0.19M.08"').replace(/no/, '')
&& videoTestElement.canPlayType('video/mp4; codecs="av01.0.19M.10"').replace(/no/, '')) {
maxAv1Level = 19;
}
const h264VideoRangeTypes = 'SDR';
let hevcVideoRangeTypes = 'SDR';
let vp9VideoRangeTypes = 'SDR';
@ -830,12 +887,15 @@ export default function (options) {
}
if (browser.tizen || browser.web0s) {
hevcVideoRangeTypes += '|HDR10|HLG|DOVI';
hevcVideoRangeTypes += '|HDR10|HLG';
vp9VideoRangeTypes += '|HDR10|HLG';
av1VideoRangeTypes += '|HDR10|HLG';
}
if (browser.edgeChromium || browser.chrome || browser.firefox) {
// Chrome mobile and Firefox have no client side tone-mapping
// Edge Chromium on Nvidia is known to have color issues on 10-bit video
if (browser.chrome && !browser.mobile) {
hevcVideoRangeTypes += '|HDR10|HLG';
vp9VideoRangeTypes += '|HDR10|HLG';
av1VideoRangeTypes += '|HDR10|HLG';
}
@ -904,11 +964,29 @@ export default function (options) {
];
const av1CodecProfileConditions = [
{
Condition: 'NotEquals',
Property: 'IsAnamorphic',
Value: 'true',
IsRequired: false
},
{
Condition: 'EqualsAny',
Property: 'VideoProfile',
Value: av1Profiles,
IsRequired: false
},
{
Condition: 'EqualsAny',
Property: 'VideoRangeType',
Value: av1VideoRangeTypes,
IsRequired: false
},
{
Condition: 'LessThanEqual',
Property: 'VideoLevel',
Value: maxAv1Level.toString(),
IsRequired: false
}
];
@ -942,6 +1020,13 @@ export default function (options) {
Value: maxVideoWidth.toString(),
IsRequired: false
});
av1CodecProfileConditions.push({
Condition: 'LessThanEqual',
Property: 'Width',
Value: maxVideoWidth.toString(),
IsRequired: false
});
}
const globalMaxVideoBitrate = (getGlobalMaxVideoBitrate() || '').toString();
@ -950,6 +1035,8 @@ export default function (options) {
const hevcMaxVideoBitrate = globalMaxVideoBitrate;
const av1MaxVideoBitrate = globalMaxVideoBitrate;
if (h264MaxVideoBitrate) {
h264CodecProfileConditions.push({
Condition: 'LessThanEqual',
@ -968,6 +1055,15 @@ export default function (options) {
});
}
if (av1MaxVideoBitrate) {
av1CodecProfileConditions.push({
Condition: 'LessThanEqual',
Property: 'VideoBitrate',
Value: av1MaxVideoBitrate,
IsRequired: true
});
}
// On iOS 12.x, for TS container max h264 level is 4.2
if (browser.iOS && browser.iOSVersion < 13) {
const codecProfile = {

View file

@ -1386,7 +1386,7 @@
"LabelTonemappingRange": "Rozsah mapování tónů",
"TonemappingAlgorithmHelp": "Mapování tonů je možné dále ladit. Pokud možnostem zde nerozumíte, je možné ponechat vše ve výchozím nastavení. Doporučená hodnota je 'BT.2390'.",
"LabelTonemappingAlgorithm": "Algoritmus mapování tónů",
"AllowTonemappingHelp": "Mapování tónů umožňuje změnit dynamický rozsah videa z HDR na SDR bez ztráty detailů a barev, tj. důležitých informací původního obrazu. Tato funkce momentálně funguje pouze u videí, které obsahují 10bitové HDR10, HLG nebo Dolby Vision. Funkce rovněž vyžaduje OpenCL nebo CUDA.",
"AllowTonemappingHelp": "Mapování tónů umožňuje změnit dynamický rozsah videa z HDR na SDR bez ztráty důležitých informací původního obrazu, jako jsou detaily a barvy. Tato funkce momentálně funguje pouze u videí, které obsahují 10bitové HDR10, HLG nebo Dolby Vision. Funkce rovněž vyžaduje OpenCL nebo CUDA.",
"EnableTonemapping": "Zapnout mapování tónů",
"LabelOpenclDeviceHelp": "Zařízení OpenCL použité pro mapování tónů. Nalevo od tečky je číslo platformy, napravo pak číslo zařízení na této platformě. Výchozí hodnota je 0.0. Soubor aplikace FFmpeg, který obsahuje metodu pro hardwarovou akceleraci OpenCL, je povinný.",
"LabelOpenclDevice": "Zařízení OpenCL",

View file

@ -1700,5 +1700,7 @@
"EnableCardLayout": "Vis visuel CardBox",
"ResolutionMatchSource": "Match kilde",
"SubtitleCyan": "Cyan",
"SubtitleMagenta": "Magenta"
"SubtitleMagenta": "Magenta",
"AllowCollectionManagement": "Tillad denne bruger at administrere samlinger",
"AllowSegmentDeletion": "Slet segmenter"
}

View file

@ -38,7 +38,7 @@
"AllowOnTheFlySubtitleExtractionHelp": "Embedded subtitles can be extracted from videos and delivered to clients in plain text, in order to help prevent video transcoding. On some systems this can take a long time and cause video playback to stall during the extraction process. Disable this to have embedded subtitles burned in with video transcoding when they are not natively supported by the client device.",
"AllowRemoteAccess": "Allow remote connections to this server",
"AllowRemoteAccessHelp": "If unchecked, all remote connections will be blocked.",
"AllowTonemappingHelp": "Tone-mapping can transform the dynamic range of a video from HDR to SDR while maintaining image details and colors, which are very important information for representing the original scene. Currently works only with 10bit HDR10HLG and DoVi videos. This requires the corresponding OpenCL or CUDA runtime.",
"AllowTonemappingHelp": "Tone-mapping can transform the dynamic range of a video from HDR to SDR while maintaining image details and colors, which are very important information for representing the original scene. Currently works only with 10bit HDR10, HLG and DoVi videos. This requires the corresponding OpenCL or CUDA runtime.",
"AlwaysPlaySubtitles": "Always Play",
"AlwaysPlaySubtitlesHelp": "Subtitles matching the language preference will be loaded regardless of the audio language.",
"AnyLanguage": "Any Language",
@ -1716,6 +1716,7 @@
"LabelTonemappingMode": "Tone mapping mode",
"TonemappingModeHelp": "Select the tone mapping mode. If you experience blown out highlights try switching to the RGB mode.",
"Unknown": "Unknown",
"AllowAv1Encoding": "Allow encoding in AV1 format",
"AiTranslated": "AI Translated",
"MachineTranslated": "Machine Translated",
"ForeignPartsOnly": "Forced/Foreign parts only",

View file

@ -1176,5 +1176,10 @@
"LabelModelUrl": "כתובת דגם",
"Restart": "הפעלה מחדש",
"TabStreaming": "הזרמה",
"Metadata": "נתוני על"
"Metadata": "נתוני על",
"AllowSegmentDeletion": "מחק אותות",
"AllowSegmentDeletionHelp": "מחק אותות ישנים אחרי שהם נשלחו ללקוח. זה ימנע שמירת כל הקובץ המפוענח על הדיסק. עובד רק כאשר מצב חנק פעיל. כבה אפשרות זו אם הינך חווה בעיות בנגן.",
"LabelThrottleDelaySeconds": "חנוק אחרי",
"LabelSegmentKeepSeconds": "זמן שמירת אותות",
"LabelSegmentKeepSecondsHelp": "זמן בשניות שבהן הקטעים צריכים להישאר לפני שהם נדרסים. צריך להיות גדול מ\"חנוק אחרי\". עובד רק כאשר מחיקת אות מאופשרת."
}

View file

@ -1396,7 +1396,7 @@
"HeaderAddUser": "Dodaj użytkownika",
"HeaderAddUpdateSubtitle": "Dodaj/Zaktualizuj napisy",
"EnableTonemapping": "Włącz Tone mapping",
"AllowTonemappingHelp": "Mapowanie tonalne może przekształcić zakres dynamiczny wideo z HDR na SDR, zachowując jednocześnie szczegóły obrazu i kolory, które są bardzo ważnymi informacjami dla odwzorowania oryginalnej sceny. Obecnie działa tylko z filmami 10bit HDR10, HLG i DoVi. Wymaga to odpowiedniego środowiska uruchomieniowego OpenCL lub CUDA.",
"AllowTonemappingHelp": "Mapowanie tonalne może przekształcić zakres dynamiczny wideo z HDR na SDR, zachowując jednocześnie szczegóły obrazu i kolory, które są bardzo ważnymi informacjami dla odwzorowania oryginalnej sceny. Obecnie działa tylko z 10-bitowymi filmami HDR10, HLG i DoVi. Wymaga to odpowiedniego środowiska wykonawczego OpenCL lub CUDA.",
"TonemappingAlgorithmHelp": "Mapowanie tonów może zostać dostrojone. Jeśli nie znasz tych opcji, pozostaw domyślne wartości. Domyślna wartość to 'BT.2390'.",
"PreferFmp4HlsContainerHelp": "Preferuj fMP4 jako domyślny format dla HLS, pozwalając na bezpośrednie odtwarzanie zawartości HEVC na wspieranych urządzeniach.",
"PreferFmp4HlsContainer": "Preferuj format fMP4-HLS",
@ -1763,5 +1763,6 @@
"LabelThrottleDelaySeconds": "Ograniczaj po",
"LabelThrottleDelaySecondsHelp": "Czas w sekundach, po którym transkoder zostanie ograniczony. Musi być wystarczająco duży, aby klient mógł utrzymać właściwy bufor. Działa tylko wtedy, gdy włączone jest ograniczanie.",
"LabelBackdropScreensaverIntervalHelp": "Czas w sekundach między różnymi fototapetami podczas korzystania z wygaszacza ekranu z fototapetami.",
"LabelBackdropScreensaverInterval": "Interwał fototapet wygaszacza ekranu"
"LabelBackdropScreensaverInterval": "Interwał fototapet wygaszacza ekranu",
"AllowAv1Encoding": "Zezwalaj na kodowanie w formacie AV1"
}

View file

@ -1761,5 +1761,7 @@
"LabelThrottleDelaySeconds": "Ограничить после",
"LabelThrottleDelaySecondsHelp": "Время в секундах, после которого транскодер будет приторможен. Должно быть достаточно большим, чтобы клиент мог поддерживать работоспособный буфер. Работает только если ограничение включено.",
"LabelSegmentKeepSeconds": "Время сохранения сегментов",
"LogLevel.Error": "Ошибка"
"LogLevel.Error": "Ошибка",
"LabelBackdropScreensaverInterval": "Интервал между фонами у заставки",
"LabelBackdropScreensaverIntervalHelp": "Время в секундах между разными фонами, когда используется заставка."
}

View file

@ -831,7 +831,7 @@
"HeaderMyMedia": "我的媒體",
"HeaderMyDevice": "我的裝置",
"HeaderMusicQuality": "音質",
"HeaderMoreLikeThis": "類似影片",
"HeaderMoreLikeThis": "更多類似的",
"HeaderMetadataSettings": "中繼資料設定",
"HeaderMedia": "媒體",
"HeaderLoginFailure": "登入失敗",

View file

@ -45,7 +45,7 @@
"HeaderFetchImages": "擷取圖像",
"HeaderFrequentlyPlayed": "經常播放",
"HeaderGuideProviders": "節目表提供者",
"HeaderImageSettings": "圖像設",
"HeaderImageSettings": "圖像設",
"HeaderInstantMix": "瞬時混播",
"HeaderLatestEpisodes": "最新劇集",
"HeaderLatestMovies": "最新電影",
@ -112,7 +112,7 @@
"MessageItemsAdded": "已新增項目。",
"MessageNoMovieSuggestionsAvailable": "目前並沒有推薦的電影,開始觀看並對您的電影評分後,我們就會為您推薦您可能會喜歡的內容。",
"MessageNothingHere": "這裡沒有什麼。",
"MessagePasswordResetForUsers": "下列使用者的密碼已被重新設置。該使用者現在可以使用在密碼重設時所使用之簡易 PIN code 進行登入。",
"MessagePasswordResetForUsers": "下列使用者的密碼已被重新設定,現在可以使用在密碼重設時所使用 PIN code 進行登入。",
"MessagePleaseEnsureInternetMetadata": "請確保已啟用從網際網路下載媒體資料。",
"Monday": "星期一",
"MoreUsersCanBeAddedLater": "也可於控制台內新增使用者。",
@ -178,7 +178,7 @@
"SearchForSubtitles": "搜尋字幕",
"SeriesRecordingScheduled": "已排程錄製整個系列。",
"ServerUpdateNeeded": "伺服器需要更新,請至 {0} 取得最新版本",
"SettingsSaved": "設已保存。",
"SettingsSaved": "設已保存。",
"Share": "分享",
"Subtitles": "字幕",
"Sunday": "星期天",
@ -198,7 +198,7 @@
"Tuesday": "星期二",
"UninstallPluginConfirmation": "你確定要解除安裝 {0}",
"HeaderUninstallPlugin": "解除安裝附加元件",
"UserProfilesIntro": "Jellyfin 可單獨對使用者進行設定,所有使用者擁有自己的顯示設,播放狀態和家長控制。",
"UserProfilesIntro": "Jellyfin 可單獨對使用者進行設定,所有使用者擁有自己的顯示設,播放狀態和家長控制。",
"Wednesday": "星期三",
"WelcomeToProject": "歡迎使用 Jellyfin",
"WizardCompleted": "這就是我們所需的全部資訊Jellyfin 現在正在收集你的媒體櫃的資料,在這段時間內,不妨參考我們推出的應用程式。按一下<b>完成</b>進入<b>控制台</b>。",
@ -388,7 +388,7 @@
"GuestStar": "客串",
"Guide": "指南",
"GuideProviderSelectListings": "選擇清單",
"H264CrfHelp": "恆定速率因子CRF是x264和x265編碼器的預設品質設置。 可以設定在0到51之間其中值越低品質越好(檔案較大)。 推薦值為18到28之間。x264的預設值為23x265的預設值為28。",
"H264CrfHelp": "Constant Rate FactorCRF是 x264 和 x265 編碼器的品質設定。 有效範圍為 0 - 51值越低品質越好(檔案較大)。 推薦值為18到28之間。x264的預設值為23x265的預設值為28。",
"EncoderPresetHelp": "速度越慢則會得到更好的壓縮編碼效率。",
"HDPrograms": "HD 節目",
"HardwareAccelerationWarning": "啟動硬體加速可能在某些環境下導致系統不穩定。請確認你的作業系統和影片驅動程式是最新的。如果你在開啟此項後難以播放影片,那麼你需要將此選項設回「無」。",
@ -409,7 +409,7 @@
"HeaderAppearsOn": "同時出現於",
"HeaderAudioBooks": "有聲書",
"HeaderAudioSettings": "音訊設定",
"HeaderBlockItemsWithNoRating": "封鎖沒有評級或設置不允許的內容",
"HeaderBlockItemsWithNoRating": "封鎖沒有或無法識別評級的內容",
"HeaderBranding": "品牌",
"HeaderCancelRecording": "取消錄製",
"HeaderCancelSeries": "取消系列",
@ -446,13 +446,13 @@
"HeaderEnabledFieldsHelp": "反選欄位以鎖定並不讓其數據被更改。",
"HeaderError": "錯誤",
"HeaderExternalIds": "外部 ID",
"HeaderFetcherSettings": "擷取器設",
"HeaderFetcherSettings": "擷取器設",
"HeaderForKids": "給兒童",
"HeaderHttpHeaders": "HTTP 標頭",
"HeaderIdentification": "身份識別",
"HeaderIdentificationCriteriaHelp": "至少輸入一個識別標準。",
"HeaderIdentificationHeader": "身份識別標題",
"HeaderIdentifyItemHelp": "輸入一個或多個搜索條件。刪除條件可得到更多搜索結果。",
"HeaderIdentifyItemHelp": "輸入一個或多個搜尋條件。刪除條件可得到更多搜尋結果。",
"HeaderImageOptions": "圖片選項",
"HeaderInstall": "安裝",
"HeaderKeepRecording": "繼續錄製",
@ -505,7 +505,7 @@
"HeaderSeriesOptions": "系列選項",
"HeaderSeriesStatus": "系列狀態",
"HeaderServerSettings": "伺服器設定",
"HeaderSetupLibrary": "設你的媒體庫",
"HeaderSetupLibrary": "設你的媒體庫",
"HeaderSortBy": "分類",
"HeaderSortOrder": "分類順序",
"HeaderSpecialEpisodeInfo": "特集資訊",
@ -549,7 +549,7 @@
"HeaderVideos": "影片",
"HeaderXmlDocumentAttribute": "XML 檔案屬性",
"HeaderXmlDocumentAttributes": "XML 檔案屬性",
"HeaderXmlSettings": "XML 設",
"HeaderXmlSettings": "XML 設",
"HeaderYears": "年份",
"Hide": "隱藏",
"HideWatchedContentFromLatestMedia": "從最新媒體中隱藏已觀看的內容",
@ -942,8 +942,8 @@
"SeriesDisplayOrderHelp": "按播出日期、DVD 順序或編號對劇集進行排序。",
"SeriesSettings": "系列設定",
"SeriesYearToPresent": "{0} - 現在",
"ServerNameIsRestarting": "伺服器將於 {0} 後重新啟動。",
"ServerNameIsShuttingDown": "伺服器將於 {0} 後關閉。",
"ServerNameIsRestarting": "伺服器 {0} 正在重新啟動。",
"ServerNameIsShuttingDown": "伺服器 {0} 正在關閉。",
"SimultaneousConnectionLimitHelp": "允許的同時串流的最大數量。輸入 0 表示無限制。",
"SkipEpisodesAlreadyInMyLibrary": "不錄製已存在於媒體庫中的劇集",
"SmallCaps": "小型大寫字母",
@ -1020,7 +1020,7 @@
"MessageNoCollectionsAvailable": "分組能夠讓您享受個性化的影片、劇集和專輯。點擊\"\"按鈕開始建立分組。",
"MessagePlayAccessRestricted": "此內容的播放受到限制,聯繫您的伺服器管理員以獲取更多訊息。",
"MessagePluginConfigurationRequiresLocalAccess": "請直接登入你的本地伺服器以設定這個附加元件。",
"MessagePluginInstallDisclaimer": "安裝 Jellyfin 社區成員建立的附加元件來讓您的 Jellyfin 獲取額外的功能最佳化您的使用體驗。但可能會對你的 Jellyfin 伺服器效能造成影響,如更長的媒體庫掃描時間、額外的背景資料處理與系統穩定性降低等。",
"MessagePluginInstallDisclaimer": "警告:安裝第三方外掛程式有一定風險。第三方外掛程式可能包含不穩定或惡意的程式,並且有可能在任何時候改變。請只安裝你信任的作者的插件,並知悉潛在的影響,包含對外部服務的查詢,更長的媒體庫塞考時間,和額外的背景處理等。",
"MessageReenableUser": "請參閱以下以重新啟用",
"MessageUnableToConnectToServer": "無法連上所選的伺服器,請確保該伺服器正在運作中。",
"MessageYouHaveVersionInstalled": "你目前安裝了 {0} 版本。",
@ -1076,7 +1076,7 @@
"Raised": "浮凹",
"Rate": "評等",
"Recordings": "錄影",
"ServerRestartNeededAfterPluginInstall": "安裝附加元件後Jellyfin 伺服器需要重啟使其生效。",
"ServerRestartNeededAfterPluginInstall": "安裝外掛程式後Jellyfin 伺服器需要重新啟動使其生效。",
"ShowIndicatorsFor": "顯示指標",
"Sort": "排序",
"Studios": "工作室",
@ -1094,7 +1094,7 @@
"LabelInNetworkSignInWithEasyPasswordHelp": "你可以在你的區域網路中使用你的簡易 PIN code 登錄 Jellyfin 應用程式,僅在你使用外部網路時才需要輸入密碼,如果 PIN code 留空,那麼在你的區域網路中便不需輸入密碼。",
"LabelReleaseDate": "釋出日期",
"LabelRemoteClientBitrateLimit": "網際網路串流傳輸位元率限制Mbps",
"LanNetworksHelp": "在強制頻寬限制時,認作本地網路上的 IP 位址或 IP/子網域遮罩項目的逗號分隔清單。若設置此項,所有其它 IP 位址將被視作在外部網路上,並且將受到外部頻寬限制。如果保留為空,則只將伺服器的子網域遮罩作本地網路。",
"LanNetworksHelp": "在執行頻寬限制時,視同區域網路上的 IP 位址或 IP/子網域遮罩項目的逗號分隔清單。若設定此項,所有其它 IP 位址將被視作在外部網路上,並且將受到外部頻寬限制。如果保留為空,則只將伺服器的子網域遮罩作本地網路。",
"OptionIgnoreTranscodeByteRangeRequests": "忽略轉檔位元組範圍請求",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "這些請求會被接受,但會忽略的位元組範圍標頭。",
"OptionLoginAttemptsBeforeLockoutHelp": "若值為 0則表示將允許普通使用者嘗試三次、管理員嘗試五次的預設值設定為 -1 來停用此功能。",
@ -1266,7 +1266,7 @@
"Season": "季",
"Person": "人物",
"Movie": "電影",
"LabelLibraryPageSizeHelp": "設媒體庫頁面每頁要顯示的最多媒體個數。設置為 0 來停用分頁。",
"LabelLibraryPageSizeHelp": "設媒體庫頁面每頁要顯示的最多媒體個數。設置為 0 來停用分頁。",
"LabelLibraryPageSize": "媒體庫分頁大小",
"LabelDeinterlaceMethod": "反交錯方法",
"Episode": "劇集",
@ -1277,7 +1277,7 @@
"New": "新增",
"ApiKeysCaption": "目前已啟用的 API 金鑰清單",
"ButtonTogglePlaylist": "播放清單",
"ButtonSyncPlay": "SyncPlay",
"ButtonSyncPlay": "同步播放",
"LabelRequireHttpsHelp": "開啟後伺服器將自動將所有 HTTP 請求導向 HTTPS。若伺服器沒有啟用 HTTPS 則不生效。",
"EnableFasterAnimationsHelp": "使用更快的動畫與過渡效果。",
"EnableFasterAnimations": "更快的動畫",
@ -1413,7 +1413,7 @@
"LabelTonemappingRange": "色調映射範圍",
"TonemappingAlgorithmHelp": "色調映射可以微調。如果你不是很熟悉這些選項,保持預設即可。建議值為 \"BT.2390\"。",
"LabelTonemappingAlgorithm": "選擇要使用的色調映射算法",
"AllowTonemappingHelp": "色調映射可以將影片的動態範圍從 HDR 變換成 SDR同時保持圖像細節與顏色等對於表現原始場景非常重要的資訊。目前僅針對 HDR10 或 HLG 影片有效。此一選項需要對應的 OpenCL 或 CUDA runtime。",
"AllowTonemappingHelp": "色調轉換可以將影片從 HDR 轉換成 SDR同時保持影像細節與顏色等對於表現場景非常重要的資訊。目前僅針對 HDR10、HLG 和 Dolby Vision 影片有效。此一選項需要對應的 OpenCL 或 CUDA 環境。",
"EnableTonemapping": "啟用色調映射",
"LabelOpenclDeviceHelp": "此 OpenCL 設備用來色調映射。點的左側為平台號碼,右側為此平台上的設備號碼。默認值為 0.0。需要有 OpenCL 硬體加速功能的 FFmpeg 應用程式。",
"LabelColorPrimaries": "三原色",
@ -1426,7 +1426,7 @@
"LabelTonemappingPeak": "色調映射峰值",
"LabelTonemappingThresholdHelp": "此參數對每個場景的色調映射算法進行微調。此閾值用於檢測場景是否已更改。如果當前幀平均亮度和當前運行平均值之間的距離超過閾值,我們將重新計算場景平均和峰值亮度。建議值和預設值分別為 0.8 和 0.2。",
"LabelTonemappingThreshold": "色調映射閾值",
"LabelTonemappingDesatHelp": "降低超過此亮度級別的亮部飽和度。此值越大,將保留更多的顏色資訊。此設置可以平滑地變成白色,從而有助於防止超高亮顯示出不自然的顏色。這使圖像感覺更自然,但以減少超出範圍的顏色的相關資訊為代價。建議值和預設值分別為 0 和 0.5。",
"LabelTonemappingDesatHelp": "降低超過此亮度級別的亮部飽和度。此值越大,將保留更多的顏色資訊。此設定可以平滑地變成白色,從而防止超高亮顯示出不自然的顏色。這使圖像感覺更自然,但以減少超出範圍的顏色的相關資訊為代價。建議值和預設值分別為 0 和 0.5。",
"LabelCreateHttpPortMap": "為 HTTP 與 HTTPS 流量啟用自動端口映射。",
"LabelAutomaticDiscoveryHelp": "允許程式通過UDP 7359 連接埠自動偵測Jellyfin 。",
"LabelAutomaticDiscovery": "啟動自動探索",
@ -1539,7 +1539,7 @@
"LabelCreateHttpPortMapHelp": "允許自動端口映射為除了HTTPS之外的HTTP流量創建規則。",
"HeaderContinueReading": "繼續閱讀",
"DisableCustomCss": "停用伺服器提供的自訂CSS樣式",
"DirectPlayHelp": "原始檔完全相容於此客戶端,且工作階段正在接收檔案並未作任何修改。",
"DirectPlayHelp": "原始檔完全相容於此用戶端,並正在直接接收原始檔案。",
"LabelHardwareEncoding": "硬體編碼器",
"Track": "音軌",
"Remixer": "重混師",
@ -1606,8 +1606,8 @@
"RememberAudioSelectionsHelp": "嘗試將音軌設定為與上一個影片最接近的匹配。",
"ShowParentImages": "顯示系列圖片",
"ContainerBitrateExceedsLimit": "影片碼率超過限制",
"EnableIntelLowPowerH264HwEncoder": "啟用 Intel 低功耗 H.264 硬體編碼",
"IntelLowPowerEncHelp": "低功耗編碼可以保持不必要的 CPU-GPU 同步。 在 Linux 上,如果未配置 i915 HuC 驅動程式,則必須禁用它們。",
"EnableIntelLowPowerH264HwEncoder": "啟用 Intel 低功耗 H.264 硬體編碼",
"IntelLowPowerEncHelp": "低功耗編碼可以保持不必要的 CPU-GPU 同步。 在 Linux 上僅適用於 i915 HuC 驅動程式。",
"AudioIsExternal": "外部音訊串流",
"LabelVppTonemappingBrightness": "VPP 色調映射亮度增益",
"EnableSplashScreen": "啟用啟動畫面",
@ -1651,7 +1651,7 @@
"TypeOptionPluralVideo": "影片",
"TypeOptionPluralSeries": "電視節目",
"Typewriter": "打字機",
"EnableIntelLowPowerHevcHwEncoder": "啟用 Intel 低功耗 HEVC 硬體編碼",
"EnableIntelLowPowerHevcHwEncoder": "啟用 Intel 低功耗 HEVC 硬體編碼",
"LabelHardwareEncodingOptions": "硬體編碼選項",
"UnknownVideoStreamInfo": "未知的影片串流資訊",
"UnknownAudioStreamInfo": "未知的音訊串流資訊",
@ -1664,7 +1664,7 @@
"ThemeSong": "主題曲",
"ThemeVideo": "主題影片",
"EnableEnhancedNvdecDecoderHelp": "實驗性 NVDEC 實現,除非遇到解碼錯誤,否則不要啟用此選項。",
"LabelVppTonemappingBrightnessHelp": "在 VPP 色調映射中使用亮度增益。 推薦值和預設值均為 16 和 0。",
"LabelVppTonemappingBrightnessHelp": "在 VPP 色調轉換中使用亮度增益。 推薦值和預設值為 16 和 0。",
"LabelVppTonemappingContrast": "VPP 色調映射對比度增益",
"VideoRangeTypeNotSupported": "不支援影片的範圍類型",
"LabelVideoRangeType": "影片範圍類型",
@ -1691,13 +1691,76 @@
"HeaderDummyChapter": "章節影像",
"LabelEnableAudioVbr": "啟用 VBR 音訊編碼",
"LabelParallelImageEncodingLimit": "並行圖片編碼限制",
"LabelParallelImageEncodingLimitHelp": "允許並行運行的圖像編碼最大數量。將其設置為 0 將根據您的系統規格限制。",
"LabelParallelImageEncodingLimitHelp": "允許同時進行的圖像編碼最大數量0為自動。",
"HeaderPerformance": "效能",
"LabelDummyChapterDuration": "頻率",
"LabelDummyChapterDurationHelp": "章節圖片擷取頻率為幾秒。",
"LabelDummyChapterDurationHelp": "虛擬章節之間的間隔設定為0以禁用。修改此設定不會影響現有的虛擬章節。",
"LabelDummyChapterCount": "限制",
"LabelDummyChapterCountHelp": "每個媒體檔案的最大的章節擷取圖片數量。",
"LabelChapterImageResolution": "解析度",
"LabelChapterImageResolutionHelp": "章節擷取圖片解析度。",
"HeaderRecordingMetadataSaving": "錄製中繼資料"
"LabelChapterImageResolutionHelp": "章節圖片擷取解析度。修改此設定對於現存的虛擬章節沒有影響。",
"HeaderRecordingMetadataSaving": "錄製中繼資料",
"SaveRecordingImagesHelp": "將 EPG 提供的圖像和媒體一起保存。",
"SubtitleGreen": "綠色",
"SubtitleLightGray": "淺灰色",
"PasswordRequiredForAdmin": "管理員帳號需要密碼。",
"SubtitleCyan": "青色",
"SubtitleRed": "紅色",
"MenuClose": "關閉選單",
"SaveRecordingImages": "儲存 EPG 影像",
"Studio": "工作室",
"SubtitleBlue": "藍色",
"SubtitleMagenta": "洋紅色",
"SubtitleBlack": "黑色",
"SubtitleYellow": "黃色",
"SubtitleWhite": "白色",
"PreferEmbeddedExtrasTitlesOverFileNames": "對額外內容優先使用內部的標題",
"AllowSegmentDeletion": "刪除片段",
"AllowSegmentDeletionHelp": "將已經傳送給用戶端的片段刪除。這樣可以減少需要儲存的轉碼暫存檔。需要啟動限制轉碼才有效。如果播放出現問題,請關閉此選項。",
"LabelThrottleDelaySeconds": "轉碼緩衝時間",
"LabelThrottleDelaySecondsHelp": "限制轉碼的時間(秒)。必須足夠長,以保障用戶端擁有足夠的緩衝區。只有在限制轉碼啟用時有效。",
"LabelSegmentKeepSeconds": "片段保留時間",
"LabelSegmentKeepSecondsHelp": "片段在被覆寫前保留的時間。必須大於緩衝時間。只在刪除片段啟用時有效。",
"GetThePlugin": "取得外掛",
"PreferEmbeddedExtrasTitlesOverFileNamesHelp": "額外內容通常和上級項目擁有相同的標題,勾選以使用內部標題。",
"SecondarySubtitles": "次要字幕",
"LabelSyncPlayNoGroups": "沒有可用的群組",
"NotificationsMovedMessage": "通知功能已經轉移至 Webhook 外掛程式中。",
"TonemappingModeHelp": "如果遇到高光過度曝光,請嘗試切換到 RGB 模式。",
"EnableAudioNormalizationHelp": "音量標準化將增加一個增益以保持平均音量在恆定的大小(-18dB。",
"EnableAudioNormalization": "音量標準化",
"LabelEnableLUFSScan": "啟用 LUFS 掃描",
"HeaderEpisodesStatus": "劇集狀態",
"SaveRecordingNFO": "在 NFO 中保存 EPG 資訊",
"SaveRecordingNFOHelp": "和媒體資訊一起儲存 EPG 內容。",
"LabelDate": "日期",
"LabelLevel": "等級",
"LabelMediaDetails": "媒體詳細資料",
"LogLevel.Trace": "追蹤",
"LogLevel.Debug": "除錯",
"LogLevel.None": "沒有",
"Notifications": "通知",
"LabelBackdropScreensaverInterval": "螢幕保護程式間隔",
"LabelBackdropScreensaverIntervalHelp": "螢幕保護裝置切換背景的間隔。",
"LabelSystem": "系統",
"LogLevel.Information": "資訊",
"LogLevel.Warning": "警告",
"LogLevel.Error": "錯誤",
"LogLevel.Critical": "嚴重",
"PleaseConfirmRepositoryInstallation": "如果您已閱讀上述內容,並希望繼續安裝外掛程式庫,輕點擊 OK。",
"ResolutionMatchSource": "配對來源",
"SubtitleGray": "灰色",
"Select": "選擇",
"LabelTonemappingMode": "色調轉換模式",
"Unknown": "未知",
"LabelDeveloper": "開發者",
"Featurette": "花絮",
"Short": "短片",
"LabelEnableAudioVbrHelp": "可變位元率VBR比起平均位元率ABR能提供更好的音質。在少數情況可能造成相容性問題。",
"MenuOpen": "打開選單",
"UserMenu": "用戶選單",
"HeaderConfirmRepositoryInstallation": "確認外掛來源庫",
"MessageRepositoryInstallDisclaimer": "警告:安裝第三方外掛程式庫有風險。其中可能包不穩定或含惡意的程式,並且可能隨時變化。請只安裝你信任的作者提供的外掛程式庫。",
"LabelEnableLUFSScanHelp": "針對音樂啟用 LUFS 掃描(需要更多時間和資源)。",
"AllowCollectionManagement": "允許用戶管理合輯"
}