视频播放器仓库

api.js 3.8KB

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