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

Add vtt and ass subtitle-offset in videoplayer

This commit is contained in:
redSpoutnik 2019-03-30 22:11:39 +01:00
parent 9677981344
commit 91241ceea1
5 changed files with 157 additions and 0 deletions

View file

@ -188,6 +188,8 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
var currentAssRenderer;
var customTrackIndex = -1;
var currentTrackOffset;
var videoSubtitlesElem;
var currentTrackEvents;
@ -543,6 +545,65 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
setCurrentTrackElement(index);
};
self.setSubtitleOffset = function(offset) {
var offsetValue = parseFloat(offset);
var videoElement = self._mediaElement;
var mediaStreamTextTracks = getMediaStreamTextTracks(self._currentPlayOptions.mediaSource);
Array.from(videoElement.textTracks)
.filter(trackElement => {
if (customTrackIndex === -1 ) {
// get showing .vtt textTacks
return trackElement.mode === 'showing';
} else {
// get current .ass textTrack
return ("textTrack" + customTrackIndex) === trackElement.id;
}
})
.forEach(trackElement => {
var track = mediaStreamTextTracks.filter(stream => {
return ("textTrack" + stream.Index) === trackElement.id;
})[0];
if(track) {
offsetValue = updateCurrentTrackOffset(offsetValue);
var format = (track.Codec || '').toLowerCase();
if (format !== 'ass' && format !== 'ssa') {
setVttSubtitleOffset(trackElement, offsetValue);
}
} else {
console.log("No available track, cannot apply offset : " + offsetValue);
}
});
};
function updateCurrentTrackOffset(offsetValue) {
var relativeOffset = offsetValue;
var newTrackOffset = offsetValue;
if(currentTrackOffset){
relativeOffset -= currentTrackOffset;
}
currentTrackOffset = newTrackOffset;
// relative to currentTrackOffset
return relativeOffset;
}
function setVttSubtitleOffset(currentTrack, offsetValue) {
if(currentTrack.cues) {
Array.from(currentTrack.cues)
.forEach(cue => {
cue.startTime -= offsetValue;
cue.endTime -= offsetValue;
});
}
}
function isAudioStreamSupported(stream, deviceProfile) {
var codec = (stream.Codec || '').toLowerCase();
@ -1167,6 +1228,11 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
function updateSubtitleText(timeMs) {
// handle offset for ass tracks
if(currentTrackOffset) {
timeMs += (currentTrackOffset * 1000);
}
var clock = currentClock;
if (clock) {
try {