Skip to content

Commit adc955d

Browse files
committed
refactor(srgssr-middleware): deduplicate text track logic
Consolidate the creation and removal of the text track into the `createTextTrack` method to simplifie the code. - remove redundant code in `addBlockedSegments` - remove redundant code in `addChapters` - remove redundant code in `addIntervals` - update test cases use `async/await` instead of manual timer manipulation
1 parent 22a7e5d commit adc955d

2 files changed

Lines changed: 21 additions & 45 deletions

File tree

src/middleware/srgssr.js

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,8 @@ class SrgSsr {
3030
*/
3131
static async addBlockedSegments(player, segments = []) {
3232
const trackId = 'srgssr-blocked-segments';
33-
const removeTrack = player.textTracks().getTrackById(trackId);
34-
35-
if (removeTrack) {
36-
player.textTracks().removeTrack(removeTrack);
37-
}
38-
3933
const segmentTrack = await SrgSsr.createTextTrack(player, trackId);
4034

41-
player.textTracks().addTrack(segmentTrack);
42-
4335
if (!Array.isArray(segments) || !segments.length) return;
4436

4537
const blockedSegments = segments.filter(segment => segment.blockReason);
@@ -120,16 +112,8 @@ class SrgSsr {
120112
*/
121113
static async addChapters(player, chapterUrn, chapters = []) {
122114
const trackId = 'srgssr-chapters';
123-
const removeTrack = player.textTracks().getTrackById(trackId);
124-
125-
if (removeTrack) {
126-
player.textTracks().removeTrack(removeTrack);
127-
}
128-
129115
const chapterTrack = await SrgSsr.createTextTrack(player, trackId);
130116

131-
player.textTracks().addTrack(chapterTrack);
132-
133117
if (!Array.isArray(chapters) || !chapters.length) return;
134118

135119
chapters.forEach(chapter => {
@@ -147,16 +131,8 @@ class SrgSsr {
147131
*/
148132
static async addIntervals(player, intervals = []) {
149133
const trackId = 'srgssr-intervals';
150-
const removeTrack = player.textTracks().getTrackById(trackId);
151-
152-
if (removeTrack) {
153-
player.textTracks().removeTrack(removeTrack);
154-
}
155-
156134
const intervalTrack = await SrgSsr.createTextTrack(player, trackId);
157135

158-
player.textTracks().addTrack(intervalTrack);
159-
160136
if (!Array.isArray(intervals) || !intervals.length) return;
161137

162138
intervals.forEach(interval => {
@@ -275,16 +251,24 @@ class SrgSsr {
275251
}
276252

277253
/**
278-
* Create a new metadata text track.
254+
* Create a new metadata text track and add it to the player.
255+
*
256+
* If a text track with the same trackId exists, it is deleted beforehand.
279257
*
280258
* @param {Player} player
281259
* @param {String} trackId Text track unique ID
282260
*
283261
* @returns {Promise<TextTrack>}
284262
*/
285-
static createTextTrack(player, trackId) {
263+
static async createTextTrack(player, trackId) {
264+
const removeTrack = player.textTracks().getTrackById(trackId);
265+
266+
if (removeTrack) {
267+
player.textTracks().removeTrack(removeTrack);
268+
}
269+
286270
// See https://github.com/videojs/video.js/issues/8519
287-
return new Promise((resolve) => {
271+
const textTrack = await new Promise((resolve) => {
288272
setTimeout(() => {
289273
resolve(new Pillarbox.TextTrack({
290274
id: trackId,
@@ -294,6 +278,10 @@ class SrgSsr {
294278
}));
295279
}, 100);
296280
});
281+
282+
player.textTracks().addTrack(textTrack);
283+
284+
return textTrack;
297285
}
298286

299287
/**

test/middleware/srgssr.spec.js

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -119,16 +119,14 @@ describe('SrgSsr', () => {
119119
});
120120

121121
it('Should add 2 blocked segments', async () => {
122-
jest.useFakeTimers();
123-
124122
const result = [];
125123

126124
Pillarbox.TextTrack
127125
.prototype
128126
.addCue
129127
.mockImplementation((cue) => result.push(cue));
130128

131-
SrgSsr.addBlockedSegments(player, [{
129+
await SrgSsr.addBlockedSegments(player, [{
132130
blockReason: 'GEOBLOCK',
133131
markIn: 10_0000,
134132
markOut: 25_0000
@@ -145,9 +143,7 @@ describe('SrgSsr', () => {
145143
markOut: 70_0000
146144
}]);
147145

148-
jest.advanceTimersByTime(100);
149-
150-
expect(await result).toHaveLength(2);
146+
expect(result).toHaveLength(2);
151147
});
152148
});
153149

@@ -210,8 +206,6 @@ describe('SrgSsr', () => {
210206
});
211207

212208
it('should add all chapters that are not the main chapter', async () => {
213-
jest.useFakeTimers();
214-
215209
const chapterUrn = 'urn:full:length';
216210
const result = [];
217211

@@ -220,7 +214,7 @@ describe('SrgSsr', () => {
220214
.addCue
221215
.mockImplementation((cue) => result.push(cue));
222216

223-
SrgSsr.addChapters(player, chapterUrn, [{
217+
await SrgSsr.addChapters(player, chapterUrn, [{
224218
fullLengthMarkIn: 0,
225219
fullLengthMarkOut: 10000
226220
}, {
@@ -233,9 +227,7 @@ describe('SrgSsr', () => {
233227
fullLengthMarkOut: 9500
234228
}]);
235229

236-
jest.advanceTimersByTime(100);
237-
238-
expect(await result).toHaveLength(2);
230+
expect(result).toHaveLength(2);
239231
expect(result[0].startTime).toBe(2.5);
240232
expect(result[0].endTime).toBe(5);
241233
expect(result[1].startTime).toBe(6);
@@ -280,16 +272,14 @@ describe('SrgSsr', () => {
280272
});
281273

282274
it('should add intervals to the player', async () => {
283-
jest.useFakeTimers();
284-
285275
const result = [];
286276

287277
Pillarbox.TextTrack
288278
.prototype
289279
.addCue
290280
.mockImplementation((cue) => result.push(cue));
291281

292-
SrgSsr.addIntervals(player, [{
282+
await SrgSsr.addIntervals(player, [{
293283
markIn: 1_000,
294284
markOut: 2_000,
295285
type: 'OPENING_CREDITS'
@@ -299,9 +289,7 @@ describe('SrgSsr', () => {
299289
type: 'CLOSING_CREDITS'
300290
}]);
301291

302-
jest.advanceTimersByTime(100);
303-
304-
expect(await result).toHaveLength(2);
292+
expect(result).toHaveLength(2);
305293
expect(JSON.parse(result[0].text).type).toBe('OPENING_CREDITS');
306294
expect(JSON.parse(result[1].text).type).toBe('CLOSING_CREDITS');
307295
});

0 commit comments

Comments
 (0)