Source: lib/text/web_vtt_generator.js

  1. /*! @license
  2. * Shaka Player
  3. * Copyright 2016 Google LLC
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. goog.provide('shaka.text.WebVttGenerator');
  7. goog.require('shaka.text.Cue');
  8. goog.require('shaka.text.Utils');
  9. /**
  10. * @summary Manage the conversion to WebVTT.
  11. * @export
  12. */
  13. shaka.text.WebVttGenerator = class {
  14. /**
  15. * @param {!Array<!shaka.text.Cue>} cues
  16. * @param {!Array<!shaka.extern.AdCuePoint>} adCuePoints
  17. * @return {string}
  18. */
  19. static convert(cues, adCuePoints) {
  20. const webvttTimeString = (time) => {
  21. let newTime = time;
  22. for (const adCuePoint of adCuePoints) {
  23. if (adCuePoint.end && adCuePoint.start < time) {
  24. const offset = adCuePoint.end - adCuePoint.start;
  25. newTime += offset;
  26. }
  27. }
  28. const hours = Math.floor(newTime / 3600);
  29. const minutes = Math.floor(newTime / 60 % 60);
  30. const seconds = Math.floor(newTime % 60);
  31. const milliseconds = Math.floor(newTime * 1000 % 1000);
  32. return (hours < 10 ? '0' : '') + hours + ':' +
  33. (minutes < 10 ? '0' : '') + minutes + ':' +
  34. (seconds < 10 ? '0' : '') + seconds + '.' +
  35. (milliseconds < 100 ? (milliseconds < 10 ? '00' : '0') : '') +
  36. milliseconds;
  37. };
  38. const flattenedCues = shaka.text.Utils.getCuesToFlatten(cues);
  39. let webvttString = 'WEBVTT\n\n';
  40. for (const cue of flattenedCues) {
  41. const webvttSettings = (cue) => {
  42. const settings = [];
  43. const Cue = shaka.text.Cue;
  44. switch (cue.textAlign) {
  45. case Cue.textAlign.LEFT:
  46. settings.push('align:left');
  47. break;
  48. case Cue.textAlign.RIGHT:
  49. settings.push('align:right');
  50. break;
  51. case Cue.textAlign.CENTER:
  52. settings.push('align:middle');
  53. break;
  54. case Cue.textAlign.START:
  55. settings.push('align:start');
  56. break;
  57. case Cue.textAlign.END:
  58. settings.push('align:end');
  59. break;
  60. }
  61. switch (cue.writingMode) {
  62. case Cue.writingMode.VERTICAL_LEFT_TO_RIGHT:
  63. settings.push('vertical:lr');
  64. break;
  65. case Cue.writingMode.VERTICAL_RIGHT_TO_LEFT:
  66. settings.push('vertical:rl');
  67. break;
  68. }
  69. if (settings.length) {
  70. return ' ' + settings.join(' ');
  71. }
  72. return '';
  73. };
  74. webvttString += webvttTimeString(cue.startTime) + ' --> ' +
  75. webvttTimeString(cue.endTime) + webvttSettings(cue) + '\n';
  76. webvttString += cue.payload + '\n\n';
  77. }
  78. return webvttString;
  79. }
  80. };