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:
parent
ef6d9c7241
commit
e48321a2c4
4 changed files with 35 additions and 2 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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 () {
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue