视频播放器仓库

api.js 4.2KB

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