Source: lib/text/simple_text_displayer.js

  1. /*! @license
  2. * Shaka Player
  3. * Copyright 2016 Google LLC
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /**
  7. * @fileoverview
  8. */
  9. goog.provide('shaka.text.SimpleTextDisplayer');
  10. goog.require('shaka.Deprecate');
  11. goog.require('shaka.text.Utils');
  12. /**
  13. * A text displayer plugin using the browser's native VTTCue interface.
  14. *
  15. * @implements {shaka.extern.TextDisplayer}
  16. * @deprecated
  17. * @export
  18. */
  19. shaka.text.SimpleTextDisplayer = class {
  20. /**
  21. * @param {HTMLMediaElement} video
  22. * @param {string} label
  23. */
  24. constructor(video, label) {
  25. shaka.Deprecate.deprecateFeature(5,
  26. 'SimpleTextDisplayer', 'Please migrate to NativeTextDisplayer');
  27. /** @private {HTMLMediaElement} */
  28. this.video_ = video;
  29. /** @private {string} */
  30. this.textTrackLabel_ = label;
  31. /** @private {TextTrack} */
  32. this.textTrack_ = null;
  33. // TODO: Test that in all cases, the built-in CC controls in the video
  34. // element are toggling our TextTrack.
  35. // If the video element has TextTracks, disable them. If we see one that
  36. // was created by a previous instance of Shaka Player, reuse it.
  37. for (const track of Array.from(this.video_.textTracks)) {
  38. if (track.kind === 'metadata' || track.kind === 'chapters') {
  39. continue;
  40. }
  41. // NOTE: There is no API available to remove a TextTrack from a video
  42. // element.
  43. track.mode = 'disabled';
  44. if (track.label == this.textTrackLabel_) {
  45. this.textTrack_ = track;
  46. }
  47. }
  48. if (this.textTrack_) {
  49. this.textTrack_.mode = 'hidden';
  50. }
  51. }
  52. /**
  53. * @override
  54. * @export
  55. */
  56. configure(config) {
  57. // Unused.
  58. }
  59. /**
  60. * @override
  61. * @export
  62. */
  63. remove(start, end) {
  64. // Check that the displayer hasn't been destroyed.
  65. if (!this.textTrack_) {
  66. return false;
  67. }
  68. const removeInRange = (cue) => {
  69. const inside = cue.startTime < end && cue.endTime > start;
  70. return inside;
  71. };
  72. shaka.text.Utils.removeCuesFromTextTrack(this.textTrack_, removeInRange);
  73. return true;
  74. }
  75. /**
  76. * @override
  77. * @export
  78. */
  79. append(cues) {
  80. if (!this.textTrack_) {
  81. return;
  82. }
  83. shaka.text.Utils.appendCuesToTextTrack(this.textTrack_, cues);
  84. }
  85. /**
  86. * @override
  87. * @export
  88. */
  89. destroy() {
  90. if (this.textTrack_) {
  91. const removeIt = (cue) => true;
  92. shaka.text.Utils.removeCuesFromTextTrack(this.textTrack_, removeIt);
  93. // NOTE: There is no API available to remove a TextTrack from a video
  94. // element.
  95. this.textTrack_.mode = 'disabled';
  96. }
  97. this.video_ = null;
  98. this.textTrack_ = null;
  99. return Promise.resolve();
  100. }
  101. /**
  102. * @override
  103. * @export
  104. */
  105. isTextVisible() {
  106. if (!this.textTrack_) {
  107. return false;
  108. }
  109. return this.textTrack_.mode == 'showing';
  110. }
  111. /**
  112. * @override
  113. * @export
  114. */
  115. setTextVisibility(on) {
  116. if (on && !this.textTrack_) {
  117. this.createTextTrack_();
  118. }
  119. if (this.textTrack_) {
  120. this.textTrack_.mode = on ? 'showing' : 'hidden';
  121. }
  122. }
  123. /**
  124. * @override
  125. * @export
  126. */
  127. setTextLanguage(language) {
  128. }
  129. /**
  130. * @override
  131. * @export
  132. */
  133. enableTextDisplayer() {
  134. this.createTextTrack_();
  135. }
  136. /**
  137. * @private
  138. */
  139. createTextTrack_() {
  140. if (this.video_ && !this.textTrack_) {
  141. // As far as I can tell, there is no observable difference between setting
  142. // kind to 'subtitles' or 'captions' when creating the TextTrack object.
  143. // The individual text tracks from the manifest will still have their own
  144. // kinds which can be displayed in the app's UI.
  145. this.textTrack_ =
  146. this.video_.addTextTrack('subtitles', this.textTrackLabel_);
  147. this.textTrack_.mode = 'hidden';
  148. }
  149. }
  150. };