diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index e14aa062d1..086ab3c937 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1,4 +1,5 @@ import { PlaybackErrorCode } from '@jellyfin/sdk/lib/generated-client/models/playback-error-code.js'; +import { getMediaInfoApi } from '@jellyfin/sdk/lib/utils/api/media-info-api'; import merge from 'lodash-es/merge'; import Screenfull from 'screenfull'; @@ -22,6 +23,7 @@ import { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type' import { MediaError } from 'types/mediaError'; import { getMediaError } from 'utils/mediaError'; +import { toApi } from 'utils/jellyfin-apiclient/compat'; const UNLIMITED_ITEMS = -1; @@ -401,7 +403,7 @@ function setStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPositio }); } -function getPlaybackInfo(player, apiClient, item, deviceProfile, mediaSourceId, liveStreamId, options) { +async function getPlaybackInfo(player, apiClient, item, deviceProfile, mediaSourceId, liveStreamId, options) { if (!itemHelper.isLocalItem(item) && item.MediaType === 'Audio' && !player.useServerPlaybackInfoForAudio) { return Promise.resolve({ MediaSources: [ @@ -427,6 +429,9 @@ function getPlaybackInfo(player, apiClient, item, deviceProfile, mediaSourceId, StartTimeTicks: options.startPosition || 0 }; + const api = toApi(apiClient); + const mediaInfoApi = getMediaInfoApi(api); + if (options.isPlayback) { query.IsPlayback = true; query.AutoOpenLiveStream = true; @@ -480,7 +485,12 @@ function getPlaybackInfo(player, apiClient, item, deviceProfile, mediaSourceId, query.DirectPlayProtocols = player.getDirectPlayProtocols(); } - return apiClient.getPlaybackInfo(itemId, query, deviceProfile); + query.AlwaysBurnInSubtitleWhenTranscoding = appSettings.alwaysBurnInSubtitleWhenTranscoding(); + + query.DeviceProfile = deviceProfile; + + const res = await mediaInfoApi.getPostedPlaybackInfo({ itemId: itemId, playbackInfoDto: query }); + return res.data; } function getOptimalMediaSource(apiClient, item, versions) { diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index da548a747c..b7852a79fb 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -64,6 +64,7 @@ function loadForm(context, user, userSettings, appearanceSettings, apiClient) { context.querySelector('#chkSubtitleRenderPgs').checked = appSettings.get('subtitlerenderpgs') === 'true'; context.querySelector('#selectSubtitleBurnIn').dispatchEvent(new CustomEvent('change', {})); + context.querySelector('#chkAlwaysBurnInSubtitleWhenTranscoding').checked = appSettings.alwaysBurnInSubtitleWhenTranscoding(); onAppearanceFieldChange({ target: context.querySelector('#selectTextSize') @@ -90,6 +91,7 @@ function save(instance, context, userId, userSettings, apiClient, enableSaveConf appSettings.set('subtitleburnin', context.querySelector('#selectSubtitleBurnIn').value); appSettings.set('subtitlerenderpgs', context.querySelector('#chkSubtitleRenderPgs').checked); + appSettings.alwaysBurnInSubtitleWhenTranscoding(context.querySelector('#chkAlwaysBurnInSubtitleWhenTranscoding').checked); apiClient.getUser(userId).then(function (user) { saveUser(context, user, userSettings, instance.appearanceKey, apiClient).then(function () { diff --git a/src/components/subtitlesettings/subtitlesettings.template.html b/src/components/subtitlesettings/subtitlesettings.template.html index 003a2a4e22..32584fc6da 100644 --- a/src/components/subtitlesettings/subtitlesettings.template.html +++ b/src/components/subtitlesettings/subtitlesettings.template.html @@ -42,6 +42,14 @@ +
+ +
${AlwaysBurnInSubtitleWhenTranscodingHelp}
+
+

${HeaderSubtitleAppearance} diff --git a/src/scripts/settings/appSettings.js b/src/scripts/settings/appSettings.js index cf6cbea284..e10d6053d3 100644 --- a/src/scripts/settings/appSettings.js +++ b/src/scripts/settings/appSettings.js @@ -156,6 +156,19 @@ class AppSettings { return this.get('preferredTranscodeVideoAudioCodec') || ''; } + /** + * Get or set 'Always burn in subtitle when transcoding' state. + * @param {boolean|undefined} val - Flag to enable 'Always burn in subtitle when transcoding' or undefined. + * @return {boolean} 'Always burn in subtitle when transcoding' state. + */ + alwaysBurnInSubtitleWhenTranscoding(val) { + if (val !== undefined) { + return this.set('alwaysBurnInSubtitleWhenTranscoding', val.toString()); + } + + return toBoolean(this.get('alwaysBurnInSubtitleWhenTranscoding'), false); + } + /** * Get or set 'Enable DTS' state. * @param {boolean|undefined} val - Flag to enable 'Enable DTS' or undefined.