视频播放器仓库

api.js 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /**
  2. * These are custom helper methods that are not native
  3. * to the HTMLMediaElement API. Pass in the native
  4. * Video element, state and optional desired value to
  5. * set. To be primarily used in `mapVideoElToProps`.
  6. */
  7. export const togglePause = (videoEl, { paused }) => {
  8. const videoTitleEl = document.getElementById("videoTitle")
  9. if (videoTitleEl) {
  10. if (paused) {
  11. videoEl.play();
  12. videoTitleEl.style.display = 'none';
  13. } else {
  14. videoEl.pause();
  15. videoTitleEl.style.display = '';
  16. }
  17. }
  18. };
  19. export const setCurrentTime = (videoEl, state, value) => {
  20. videoEl.currentTime = value;
  21. };
  22. export const setVolume = (videoEl, state, value) => {
  23. videoEl.muted = false;
  24. videoEl.volume = value;
  25. };
  26. export const mute = (videoEl) => {
  27. videoEl.muted = true;
  28. };
  29. export const unmute = (videoEl) => {
  30. videoEl.muted = false;
  31. };
  32. export const toggleMute = (videoEl, { volume, muted }) => {
  33. if (muted || volume <= 0) {
  34. if (volume <= 0) {
  35. videoEl.volume = 1;
  36. }
  37. videoEl.muted = false;
  38. } else {
  39. videoEl.muted = true;
  40. }
  41. };
  42. export const toggleFullscreen = (videoEl, callback) => {
  43. videoEl.requestFullScreen =
  44. videoEl.requestFullscreen
  45. || videoEl.msRequestFullscreen
  46. || videoEl.mozRequestFullScreen
  47. || videoEl.webkitRequestFullscreen;
  48. document.exitFullscreen =
  49. document.exitFullscreen
  50. || document.msExitFullscreen
  51. || document.mozCancelFullScreen
  52. || document.webkitExitFullscreen;
  53. const fullscreenElement =
  54. document.fullscreenElement
  55. || document.msFullscreenElement
  56. || document.mozFullScreenElement
  57. || document.webkitFullscreenElement;
  58. if (fullscreenElement === videoEl) {
  59. document.querySelector('video').style.maxHeight = '100%';
  60. window.fullscreen = false;
  61. document.exitFullscreen();
  62. } else {
  63. document.querySelector('video').style.maxHeight = '100%';
  64. window.fullscreen = true;
  65. videoEl.requestFullScreen();
  66. }
  67. };
  68. export const showTrack = ({ textTracks }, track) => {
  69. hideTracks({ textTracks });
  70. track.mode = track.SHOWING || 'showing';
  71. };
  72. export const hideTracks = ({ textTracks }) => {
  73. for (var i = 0; i < textTracks.length; i++) {
  74. textTracks[i].mode = textTracks[i].DISABLED || 'disabled';
  75. }
  76. };
  77. export const toggleTracks = (() => {
  78. let previousTrack;
  79. return ({ textTracks }) => {
  80. let currentTrack = [...textTracks]
  81. .filter((track) => track.mode === track.SHOWING || track.mode === 'showing')[0];
  82. if (currentTrack) {
  83. hideTracks({ textTracks });
  84. previousTrack = currentTrack;
  85. } else {
  86. showTrack({ textTracks }, previousTrack || textTracks[0]);
  87. }
  88. }
  89. })();
  90. export const showSpeed = (videoEl, state, speed) => {
  91. let playbackrates = state.playbackrates;
  92. hideSpeeds(videoEl, { playbackrates });
  93. speed.mode = speed.SHOWING || 'showing';
  94. if (videoEl.dataset) {
  95. videoEl.dataset['playbackrates'] = JSON.stringify(playbackrates);
  96. } else {
  97. videoEl.setAttribute("data-playbackrates", JSON.stringify(playbackrates));
  98. }
  99. videoEl.playbackRate = speed.id;
  100. };
  101. export const hideSpeeds = (videoEl, state) => {
  102. let playbackrates = state.playbackrates;
  103. for (var i = 0; i < playbackrates.length; i++) {
  104. playbackrates[i].mode = playbackrates[i].DISABLED || 'disabled';
  105. }
  106. };
  107. export const toggleSpeeds = (() => {
  108. let previousSpeed;
  109. return (videoEl, state) => {
  110. let playbackrates = state.playbackrates;
  111. let currentSpeed = playbackrates
  112. .filter((item) => item.mode === 'showing')[0];
  113. if (currentSpeed) {
  114. hideSpeeds(videoEl, { playbackrates });
  115. previousSpeed = currentSpeed;
  116. } else {
  117. showSpeed(videoEl, { playbackrates }, previousSpeed || playbackrates[0]);
  118. }
  119. }
  120. })();
  121. /**
  122. * Custom getter methods that are commonly used
  123. * across video layouts. To be primarily used in
  124. * `mapStateToProps`
  125. */
  126. export const getPercentageBuffered = ({ buffered, duration }) =>
  127. buffered && buffered.length && buffered.end(buffered.length - 1) / duration * 100 || 0;
  128. export const getPercentagePlayed = ({ currentTime, duration }) =>
  129. currentTime / duration * 100;