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

Add option to always burn in subtitles if transcoding is triggered

This commit is contained in:
gnattu 2024-08-24 07:31:25 +08:00
parent ef6d9c7241
commit e48321a2c4
4 changed files with 35 additions and 2 deletions

View file

@ -1,4 +1,5 @@
import { PlaybackErrorCode } from '@jellyfin/sdk/lib/generated-client/models/playback-error-code.js'; 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 merge from 'lodash-es/merge';
import Screenfull from 'screenfull'; 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 { MediaError } from 'types/mediaError';
import { getMediaError } from 'utils/mediaError'; import { getMediaError } from 'utils/mediaError';
import { toApi } from 'utils/jellyfin-apiclient/compat';
const UNLIMITED_ITEMS = -1; 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) { if (!itemHelper.isLocalItem(item) && item.MediaType === 'Audio' && !player.useServerPlaybackInfoForAudio) {
return Promise.resolve({ return Promise.resolve({
MediaSources: [ MediaSources: [
@ -427,6 +429,9 @@ function getPlaybackInfo(player, apiClient, item, deviceProfile, mediaSourceId,
StartTimeTicks: options.startPosition || 0 StartTimeTicks: options.startPosition || 0
}; };
const api = toApi(apiClient);
const mediaInfoApi = getMediaInfoApi(api);
if (options.isPlayback) { if (options.isPlayback) {
query.IsPlayback = true; query.IsPlayback = true;
query.AutoOpenLiveStream = true; query.AutoOpenLiveStream = true;
@ -480,7 +485,12 @@ function getPlaybackInfo(player, apiClient, item, deviceProfile, mediaSourceId,
query.DirectPlayProtocols = player.getDirectPlayProtocols(); 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) { function getOptimalMediaSource(apiClient, item, versions) {

View file

@ -64,6 +64,7 @@ function loadForm(context, user, userSettings, appearanceSettings, apiClient) {
context.querySelector('#chkSubtitleRenderPgs').checked = appSettings.get('subtitlerenderpgs') === 'true'; context.querySelector('#chkSubtitleRenderPgs').checked = appSettings.get('subtitlerenderpgs') === 'true';
context.querySelector('#selectSubtitleBurnIn').dispatchEvent(new CustomEvent('change', {})); context.querySelector('#selectSubtitleBurnIn').dispatchEvent(new CustomEvent('change', {}));
context.querySelector('#chkAlwaysBurnInSubtitleWhenTranscoding').checked = appSettings.alwaysBurnInSubtitleWhenTranscoding();
onAppearanceFieldChange({ onAppearanceFieldChange({
target: context.querySelector('#selectTextSize') 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('subtitleburnin', context.querySelector('#selectSubtitleBurnIn').value);
appSettings.set('subtitlerenderpgs', context.querySelector('#chkSubtitleRenderPgs').checked); appSettings.set('subtitlerenderpgs', context.querySelector('#chkSubtitleRenderPgs').checked);
appSettings.alwaysBurnInSubtitleWhenTranscoding(context.querySelector('#chkAlwaysBurnInSubtitleWhenTranscoding').checked);
apiClient.getUser(userId).then(function (user) { apiClient.getUser(userId).then(function (user) {
saveUser(context, user, userSettings, instance.appearanceKey, apiClient).then(function () { saveUser(context, user, userSettings, instance.appearanceKey, apiClient).then(function () {

View file

@ -42,6 +42,14 @@
</div> </div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label>
<input is="emby-checkbox" type="checkbox" id="chkAlwaysBurnInSubtitleWhenTranscoding" />
<span>${AlwaysBurnInSubtitleWhenTranscoding}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${AlwaysBurnInSubtitleWhenTranscodingHelp}</div>
</div>
<div class="verticalSection subtitleAppearanceSection hide"> <div class="verticalSection subtitleAppearanceSection hide">
<h2 class="sectionTitle"> <h2 class="sectionTitle">
${HeaderSubtitleAppearance} ${HeaderSubtitleAppearance}

View file

@ -156,6 +156,19 @@ class AppSettings {
return this.get('preferredTranscodeVideoAudioCodec') || ''; 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. * Get or set 'Enable DTS' state.
* @param {boolean|undefined} val - Flag to enable 'Enable DTS' or undefined. * @param {boolean|undefined} val - Flag to enable 'Enable DTS' or undefined.