Skip to content

Commit 6cd4bc8

Browse files
authored
feat: allow transcript from url (#737)
* feat: allow transcript url * chore: transcript analytics * chore: transcript analytics
1 parent 69dfde2 commit 6cd4bc8

File tree

3 files changed

+65
-53
lines changed

3 files changed

+65
-53
lines changed

docs/subtitles-and-captions.html

Lines changed: 49 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,7 @@
117117

118118
// Paced
119119
const pacedPlayer = cloudinary.videoPlayer('paced', {
120-
cloudName: 'demo',
121-
autoplay: true,
122-
muted: true
120+
cloudName: 'demo'
123121
});
124122

125123
const publicId = 'lincoln';
@@ -180,9 +178,7 @@
180178

181179
// Karaoke
182180
const karaokePlayer = cloudinary.videoPlayer('karaoke', {
183-
cloudName: 'demo',
184-
autoplay: true,
185-
muted: true
181+
cloudName: 'demo'
186182
});
187183

188184
karaokePlayer.source('lincoln', {
@@ -212,6 +208,22 @@
212208
}
213209
}
214210
});
211+
212+
// Transcript from URL
213+
const urlTranscriptPlayer = cloudinary.videoPlayer('url-transcript', {
214+
cloudName: 'demo'
215+
});
216+
217+
urlTranscriptPlayer.source('elephants', {
218+
textTracks: {
219+
captions: {
220+
label: "Lincoln's Transcript",
221+
url: 'https://res.cloudinary.com/demo/raw/upload/lincoln.transcript',
222+
wordHighlight: true,
223+
maxWords: 8
224+
}
225+
}
226+
});
215227
}, false);
216228
</script>
217229
</head>
@@ -227,8 +239,6 @@ <h3 class="mb-4">Subtitles & Captions</h3>
227239
id="player"
228240
playsinline
229241
controls
230-
muted
231-
autoplay
232242
class="cld-video-player cld-fluid"
233243
crossorigin="anonymous"
234244
width="500"
@@ -240,7 +250,6 @@ <h4 class="mt-4 mb-2">Playlist Subtitles (switch per source)</h4>
240250
id="playlist"
241251
playsinline
242252
controls
243-
muted
244253
class="cld-video-player cld-fluid"
245254
crossorigin="anonymous"
246255
width="500"
@@ -290,7 +299,6 @@ <h4 class="mt-4 mb-2">Paced & Styled Captions</h4>
290299
id="paced"
291300
playsinline
292301
controls
293-
muted
294302
class="cld-video-player cld-fluid"
295303
crossorigin="anonymous"
296304
width="500"
@@ -302,7 +310,17 @@ <h4 class="mt-4 mb-2">Karaoke player</h4>
302310
id="karaoke"
303311
playsinline
304312
controls
305-
muted
313+
class="cld-video-player cld-fluid"
314+
crossorigin="anonymous"
315+
width="500"
316+
></video>
317+
318+
<h4 class="mt-4 mb-2">Transcript from URL</h4>
319+
320+
<video
321+
id="url-transcript"
322+
playsinline
323+
controls
306324
class="cld-video-player cld-fluid"
307325
crossorigin="anonymous"
308326
width="500"
@@ -318,45 +336,16 @@ <h3 class="mt-4">Example Code:</h3>
318336
&lt;video
319337
id="player"
320338
controls
321-
muted
322-
autoplay
323-
class="cld-video-player"
324-
crossorigin="anonymous"
325-
width="500">
326-
&lt;/video&gt;
327-
328-
&lt;video
329-
id="playlist"
330-
controls
331-
muted
332339
class="cld-video-player"
333340
crossorigin="anonymous"
334341
width="500"&gt;
335342
&lt;/video&gt;
336343

337-
&lt;video
338-
id="paced"
339-
controls
340-
muted
341-
autoplay
342-
class="cld-video-player"
343-
crossorigin="anonymous"
344-
width="500">
345-
&lt;/video&gt;
346-
347-
&lt;video
348-
id="karaoke"
349-
controls
350-
muted
351-
autoplay
352-
class="cld-video-player"
353-
crossorigin="anonymous"
354-
width="500">
355-
&lt;/video&gt;
344+
&lt;!-- ... a few more &lt;video&gt; tags --&gt;
356345
</code>
357346
<code class="language-javascript">
358347

359-
// Initialize player
348+
// Initialize players
360349
var player = cloudinary.videoPlayer('player', { cloud_name: 'demo' });
361350

362351
player.source(
@@ -443,9 +432,7 @@ <h3 class="mt-4">Example Code:</h3>
443432

444433
// Paced
445434
const pacedPlayer = cloudinary.videoPlayer('paced', {
446-
cloudName: 'demo',
447-
autoplay: true,
448-
muted: true
435+
cloudName: 'demo'
449436
});
450437

451438
pacedPlayer.source('lincoln', {
@@ -488,9 +475,7 @@ <h3 class="mt-4">Example Code:</h3>
488475

489476
// Karaoke
490477
const karaokePlayer = cloudinary.videoPlayer('karaoke', {
491-
cloudName: 'demo',
492-
autoplay: true,
493-
muted: true
478+
cloudName: 'demo'
494479
});
495480

496481
karaokePlayer.source('lincoln', {
@@ -521,6 +506,22 @@ <h3 class="mt-4">Example Code:</h3>
521506
}
522507
});
523508

509+
// Transcript from URL
510+
const urlTranscriptPlayer = cloudinary.videoPlayer('url-transcript', {
511+
cloudName: 'demo'
512+
});
513+
514+
urlTranscriptPlayer.source('elephants', {
515+
textTracks: {
516+
captions: {
517+
label: "Lincoln's Transcript",
518+
url: 'https://res.cloudinary.com/demo/raw/upload/lincoln.transcript',
519+
wordHighlight: true,
520+
maxWords: 8
521+
}
522+
}
523+
});
524+
524525
</code>
525526
</pre>
526527
</div>

src/utils/cloudinary.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,13 @@ const isKeyInTransformation = (transformation, key) => {
101101

102102
const addTextTracks = (tracks, videojs) => {
103103
tracks.forEach(track => {
104-
if (track.src) {
104+
if (track.src && track.src.endsWith('.vtt')) {
105105
fetch(track.src, GET_ERROR_DEFAULT_REQUEST).then(r => {
106106
if (r.status >= 200 && r.status <= 399) {
107107
videojs.addRemoteTextTrack(track, true);
108108
}
109109
});
110-
} else if (videojs.pacedTranscript) {
110+
} else if (videojs.pacedTranscript && (!track.src || track.src.endsWith('.transcript'))) {
111111
videojs.pacedTranscript(track);
112112
}
113113
});

src/utils/get-analytics-player-options.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,19 @@ const getCloudinaryOptions = (cloudinaryOptions = {}) => ({
1919
posterOptionsPublicId: cloudinaryOptions.posterOptions && hasConfig(cloudinaryOptions.posterOptions.publicId)
2020
});
2121

22+
const getTranscriptOptions = (textTracks = {}) => {
23+
const tracksArr = [textTracks.captions, ...textTracks.subtitles];
24+
return {
25+
textTracks: hasConfig(textTracks),
26+
pacedTextTracks: hasConfig(textTracks) && JSON.stringify(textTracks || {}).includes('"maxWords":') || null,
27+
wordHighlight: hasConfig(textTracks) && JSON.stringify(textTracks || {}).includes('"wordHighlight":') || null,
28+
transcriptAutoLoaded: tracksArr.some((track) => !track.url) || null,
29+
transcriptFromURl: tracksArr.some((track) => track.url?.endsWith('.transcript')) || null,
30+
transcriptLanguages: tracksArr.filter((track) => !track.url).map((track) => track.language || '').join(',') || null,
31+
vttFromUrl: tracksArr.some((track) => track.url?.endsWith('.vtt')) || null
32+
};
33+
};
34+
2235
const getSourceOptions = (sourceOptions = {}) => ({
2336
chapters: sourceOptions.chapters && (sourceOptions.chapters.url ? 'url' : 'inline-chapters'),
2437
recommendations: sourceOptions.recommendations && sourceOptions.recommendations.length,
@@ -30,9 +43,7 @@ const getSourceOptions = (sourceOptions = {}) => ({
3043
sourceInfoDescription: sourceOptions.info.description
3144
} : {}),
3245
...(sourceOptions.textTracks ? {
33-
textTracks: hasConfig(sourceOptions.textTracks),
34-
pacedTextTracks: hasConfig(sourceOptions.textTracks) && JSON.stringify(sourceOptions.textTracks || {}).includes('"maxWords":'),
35-
wordHighlight: hasConfig(sourceOptions.textTracks) && JSON.stringify(sourceOptions.textTracks || {}).includes('"wordHighlight":'),
46+
...(hasConfig(sourceOptions.textTracks) && getTranscriptOptions(sourceOptions.textTracks)),
3647
...(sourceOptions.textTracks.options ? {
3748
styledTextTracksTheme: sourceOptions.textTracks.options.theme,
3849
styledTextTracksFont: sourceOptions.textTracks.options.fontFace,

0 commit comments

Comments
 (0)