Skip to content

Commit 6761bac

Browse files
author
Armanc
committed
Add methods to expose current track events
Expose the current subtitle track events from the HTML video player and the playback manager in a normalized seconds-based format. This allows the subtitle sync UI to render a timeline of upcoming subtitle events.
1 parent 08fa48b commit 6761bac

2 files changed

Lines changed: 46 additions & 0 deletions

File tree

src/components/playback/playbackmanager.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1647,6 +1647,48 @@ export class PlaybackManager {
16471647
return index !== -1 && self.isSubtitleStreamExternal(index, player);
16481648
};
16491649

1650+
/**
1651+
* Gets the current subtitle track events in a normalized format.
1652+
* This method attempts to get subtitle events from either:
1653+
* 1. The player's getCurrentTrackEvents method (for Jellyfin events)
1654+
* 2. The player's getTextTracks method (for VTT cues)
1655+
*
1656+
* @param {Object} player - The player instance to get subtitle events from
1657+
* @returns {Array<{startTime: number, endTime: number, text: string}>|null} An array of normalized subtitle events or null if none found
1658+
*/
1659+
self.getCurrentSubtitleTrackEvents = function (player) {
1660+
player = player || self._currentPlayer;
1661+
1662+
// Try to get events using the new method
1663+
if (player?.getCurrentTrackEvents) {
1664+
const events = player.getCurrentTrackEvents();
1665+
if (events?.length) {
1666+
// Convert ticks to seconds format
1667+
return events.map(event => ({
1668+
startTime: event.StartPositionTicks / TICKS_PER_SECOND,
1669+
endTime: event.EndPositionTicks / TICKS_PER_SECOND,
1670+
text: event.Text || ''
1671+
}));
1672+
}
1673+
}
1674+
1675+
// Try to get text tracks using the player's getTextTracks method
1676+
if (player?.getTextTracks) {
1677+
const textTracks = player.getTextTracks();
1678+
const activeTrack = textTracks?.[0];
1679+
if (activeTrack?.cues?.length) {
1680+
// Convert VTTCues to our format
1681+
return Array.from(activeTrack.cues).map(cue => ({
1682+
startTime: cue.startTime,
1683+
endTime: cue.endTime,
1684+
text: cue.text || ''
1685+
}));
1686+
}
1687+
}
1688+
1689+
return null;
1690+
};
1691+
16501692
self.seek = function (ticks, player) {
16511693
ticks = Math.max(0, ticks);
16521694

src/plugins/htmlVideoPlayer/plugin.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,10 @@ export class HtmlVideoPlayer {
734734
return this.#currentTrackOffset;
735735
}
736736

737+
getCurrentTrackEvents() {
738+
return this.#currentTrackEvents || [];
739+
}
740+
737741
isPrimaryTrack(textTrackIndex) {
738742
return textTrackIndex === PRIMARY_TEXT_TRACK_INDEX;
739743
}

0 commit comments

Comments
 (0)