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

feat: add native secondary subtitle support

This commit is contained in:
Ivan Schurawel 2022-09-15 14:22:41 -04:00 committed by Ivan Schurawel
parent d69d4b22d9
commit 145aea184f
4 changed files with 192 additions and 20 deletions

View file

@ -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;