Skip to content

Commit 30b7a4e

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 bd390c6 commit 30b7a4e

2 files changed

Lines changed: 48 additions & 0 deletions

File tree

src/components/playback/playbackmanager.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1647,6 +1647,50 @@ 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 && player.getCurrentTrackEvents) {
1664+
const events = player.getCurrentTrackEvents();
1665+
if (events && 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 && player.getTextTracks) {
1677+
const textTracks = player.getTextTracks();
1678+
if (textTracks && textTracks.length > 0) {
1679+
const activeTrack = textTracks[0];
1680+
if (activeTrack && activeTrack.cues && activeTrack.cues.length > 0) {
1681+
// Convert VTTCues to our format
1682+
return Array.from(activeTrack.cues).map(cue => ({
1683+
startTime: cue.startTime,
1684+
endTime: cue.endTime,
1685+
text: cue.text || ''
1686+
}));
1687+
}
1688+
}
1689+
}
1690+
1691+
return null;
1692+
};
1693+
16501694
self.seek = function (ticks, player) {
16511695
ticks = Math.max(0, ticks);
16521696

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)