playerReducer.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. import {backURL} from "../actions";
  2. import { select, put, takeEvery } from "redux-saga/effects";
  3. import {store} from "./store";
  4. //import React, {useEffect, useRef, useState} from 'react';
  5. // import AudioSpectrum from 'react-audio-spectrum'
  6. export const playerReducer = (
  7. state = {},
  8. {type,track,isPlaying=false,isPaused,duration,
  9. playlist,playlistIndex,currentTime=0,volume=1,audio}) => {
  10. if (type === "NEXT_TRACK") {
  11. return {
  12. ...state,
  13. playlistIndex,
  14. }
  15. }
  16. if (type === "PREVIOUS_TRACK") {
  17. return {
  18. ...state,
  19. playlistIndex,
  20. }
  21. }
  22. if (type === "TRACK_LOAD") {
  23. return {
  24. ...state,
  25. playlistIndex,
  26. }
  27. }
  28. if (type === "TRACK_PLAY") {
  29. return {
  30. ...state,
  31. isPlaying,
  32. isPaused: !isPlaying,
  33. audio,
  34. };
  35. }
  36. if (type === "TRACK_STOP") {
  37. return {
  38. ...state,
  39. isPaused,
  40. isPlaying: !isPaused,
  41. };
  42. }
  43. if (type === "TRACK_VOLUME") {
  44. return {
  45. ...state,
  46. volume,
  47. };
  48. }
  49. if (type === "TRACK_DURATION") {
  50. return {
  51. ...state,
  52. duration,
  53. };
  54. }
  55. if (type === "TRACK_CURRENT_TIME") {
  56. return {
  57. ...state,
  58. currentTime,
  59. };
  60. }
  61. if (type === "SET_PLAYLIST") {
  62. console.log(playlist,'lol')
  63. return {
  64. ...state,
  65. playlist,
  66. track,
  67. };
  68. }
  69. return state;
  70. };
  71. export const audio = new Audio()
  72. audio.onended = () => store.dispatch (actionNextTrack())
  73. const trackActions = (urlVar) => {
  74. audio.src = backURL + '/'+ urlVar.url
  75. audio.load()
  76. audio.ondurationchange = function(){actionSetDuration()}
  77. audio.ontimeupdate = function(){actionTrackCurrentTime()}
  78. }
  79. export const actionTrackLoad = (trackIndex) =>
  80. ({type:'ACTION_TRACK_LOAD', trackIndex})
  81. export function* trackLoadWorker (action) {
  82. let {trackIndex} = action
  83. let {player:{playlist}} = yield select ()
  84. trackActions(playlist[trackIndex])
  85. yield put({type:"TRACK_LOAD",playlistIndex:trackIndex})
  86. yield put (actionTrackPlay())
  87. }
  88. export function* trackLoadWatcher() {
  89. yield takeEvery ('ACTION_TRACK_LOAD',trackLoadWorker)
  90. }
  91. export const actionTrackPlay = () =>
  92. ({type:'ACTION_TRACK_PLAY'})
  93. export function* trackPlayWorker () {
  94. yield audio.play()
  95. yield put({type:"TRACK_PLAY",isPlaying:true,isPaused:false,audio:audio})
  96. }
  97. export function* trackPlayWatcher() {
  98. yield takeEvery ('ACTION_TRACK_PLAY',trackPlayWorker)
  99. }
  100. export const actionNextTrack = () =>
  101. ({type:'ACTION_NEXT_TRACK'})
  102. export function* nextTrackWorker () {
  103. let {player} = yield select ()
  104. let playlistIndex = player.playlistIndex
  105. let playlist = player.playlist
  106. if (playlist.length === playlistIndex + 1) {
  107. yield put({type:"NEXT_TRACK",playlistIndex:0})
  108. trackActions(player.playlist[0])
  109. yield put (actionTrackPlay())
  110. } else {
  111. yield put({type:"NEXT_TRACK",playlistIndex:playlistIndex+1})
  112. trackActions(player.playlist[playlistIndex+1])
  113. yield put (actionTrackPlay())
  114. }
  115. console.log(playlistIndex)
  116. }
  117. export function* nextTrackWatcher() {
  118. yield takeEvery ('ACTION_NEXT_TRACK',nextTrackWorker)
  119. }
  120. export const actionPreviousTrack = () =>
  121. ({type:'ACTION_PREVIOUS_TRACK'})
  122. export function* previousTrackWorker () {
  123. let {player} = yield select ()
  124. let p = player.playlistIndex
  125. if (p < 1) {
  126. yield put({type:"NEXT_TRACK",playlistIndex:0})
  127. trackActions(player.playlist[0])
  128. yield put (actionTrackPlay())
  129. } else {
  130. yield put({type:"PREVIOUS_TRACK",playlistIndex:p-1})
  131. trackActions(player.playlist[p-1])
  132. yield put (actionTrackPlay())
  133. }
  134. }
  135. export function* previousTrackWatcher() {
  136. yield takeEvery ('ACTION_PREVIOUS_TRACK',previousTrackWorker)
  137. }
  138. export const actionTrackStop = () =>
  139. ({type: 'ACTION_TRACK_STOP'})
  140. export function* trackStopWorker () {
  141. audio.pause()
  142. yield put({type:"TRACK_STOP",isPlaying:false,isPaused:true})
  143. }
  144. export function* trackStopWatcher() {
  145. yield takeEvery ('ACTION_TRACK_STOP',trackStopWorker)
  146. }
  147. export const actionTrackVolume = (e) =>
  148. ({type:'ACTION_TRACK_VOLUME', e})
  149. export function* trackVolumeWorker (action) {
  150. let {e} = action
  151. audio.volume = e
  152. yield put({type:"TRACK_VOLUME", volume:e})
  153. }
  154. export function* trackVolumeWatcher() {
  155. yield takeEvery ('ACTION_TRACK_VOLUME',trackVolumeWorker)
  156. }
  157. export const actionSetDuration = () => {
  158. let e = audio.duration
  159. store.dispatch({type:"TRACK_DURATION",duration:e})
  160. }
  161. export const actionTrackCurrentTime = (e) => {
  162. if (e) {
  163. audio.currentTime = e
  164. store.dispatch({type:"TRACK_CURRENT_TIME", currentTime:e})
  165. } else {
  166. let e = audio.currentTime
  167. store.dispatch({type:"TRACK_CURRENT_TIME", currentTime:e})
  168. }
  169. }
  170. export const actionSetPlaylist = (playlistP,trackIndex,track) =>
  171. ({type:'ACTION_SET_PLAYLIST', playlistP,trackIndex,track})
  172. export function* setPlaylistWorker(action) {
  173. let {playlistP, trackIndex,track} = action
  174. yield put ({type:"SET_PLAYLIST", playlist:playlistP,track:track})
  175. yield put (actionTrackLoad(trackIndex))
  176. }
  177. export function* setPlaylistWatcher() {
  178. yield takeEvery ('ACTION_SET_PLAYLIST',setPlaylistWorker)
  179. }
  180. // Visualiser (not working)
  181. // const onInputChange = (e) => {
  182. // var sound = document.getElementById('sound');
  183. // sound.src = URL.createObjectURL(e.target.files[0]);
  184. // }
  185. // export const Visualiser = () => {
  186. //
  187. // const track = useRef(audio || {})
  188. //
  189. // useEffect(() => {
  190. // track.current = (audio|| {})
  191. // },[audio])
  192. //
  193. // // let sound = document.getElementById('sound');
  194. // const [capColor, setCapColor] = useState(' ')
  195. // const [capHeight, setCapHeight] = useState(4)
  196. // const [meterWidth, setMeterWidth] = useState(3)
  197. // const [meterCount, setMeterCount] = useState(512)
  198. // const [gap, setGap] = useState(5)
  199. // const [meterColor1, setMeterColor1] = useState('#f00')
  200. // const [meterColor2, setMeterColor2] = useState('#0C70FD')
  201. // const [meterColor3, setMeterColor3] = useState('#0CFD70')
  202. //
  203. // console.log(track.current,'111')
  204. //
  205. // return (
  206. // <div className="Visualiser">
  207. //
  208. // {/*<div style={{*/}
  209. // {/* display: 'flex',*/}
  210. // {/*}}>*/}
  211. // {/* <div className="setting-section file">*/}
  212. // {/* <input type="file" id="input" accept="audio/*" onChange={onInputChange} />*/}
  213. // {/* <audio id="sound" controls></audio>*/}
  214. // {/* </div>*/}
  215. //
  216. // {/*</div>*/}
  217. // <AudioSpectrum
  218. // id="audio-canvas"
  219. // style={{
  220. // padding: 10
  221. // }}
  222. // height={500}
  223. // width={900}
  224. // audioEle={track.current}
  225. // capColor={capColor}
  226. // capHeight={capHeight}
  227. // meterWidth={meterWidth}
  228. // meterCount={meterCount}
  229. // meterColor={[
  230. // {stop: 0, color: meterColor1},
  231. // {stop: 0.5, color: meterColor2},
  232. // {stop: 1, color: meterColor3}
  233. // ]}
  234. // gap={gap}
  235. // />
  236. // </div>
  237. // );
  238. // }
  239. //