playerReducer.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. import {backURL} from "../actions";
  2. import { select, put, takeEvery } from "redux-saga/effects";
  3. import {store} from "./store";
  4. export const playerReducer = (
  5. state = {},
  6. {type,track,isPlaying=false,isPaused,duration,
  7. playlist,playlistIndex,currentTime=0,volume=1,}) => {
  8. if (type === "NEXT_TRACK") {
  9. return {
  10. ...state,
  11. playlistIndex,
  12. }
  13. }
  14. if (type === "PREVIOUS_TRACK") {
  15. return {
  16. ...state,
  17. playlistIndex,
  18. }
  19. }
  20. if (type === "TRACK_LOAD") {
  21. return {
  22. ...state,
  23. playlistIndex,
  24. }
  25. }
  26. if (type === "TRACK_PLAY") {
  27. return {
  28. ...state,
  29. isPlaying,
  30. isPaused: !isPlaying,
  31. };
  32. }
  33. if (type === "TRACK_STOP") {
  34. return {
  35. ...state,
  36. isPaused,
  37. isPlaying: !isPaused,
  38. };
  39. }
  40. if (type === "TRACK_VOLUME") {
  41. return {
  42. ...state,
  43. volume,
  44. };
  45. }
  46. if (type === "TRACK_DURATION") {
  47. return {
  48. ...state,
  49. duration,
  50. };
  51. }
  52. if (type === "TRACK_CURRENT_TIME") {
  53. return {
  54. ...state,
  55. currentTime,
  56. };
  57. }
  58. if (type === "SET_PLAYLIST") {
  59. console.log(playlist,'lol')
  60. return {
  61. ...state,
  62. playlist,
  63. track,
  64. };
  65. }
  66. return state;
  67. };
  68. export const audio = new Audio()
  69. audio.onended = () => store.dispatch (actionNextTrack())
  70. const trackActions = (urlVar) => {
  71. audio.src = backURL + '/'+ urlVar.url
  72. audio.load()
  73. audio.ondurationchange = function(){actionSetDuration()}
  74. audio.ontimeupdate = function(){actionTrackCurrentTime()}
  75. }
  76. export const actionTrackLoad = (trackIndex) =>
  77. ({type:'ACTION_TRACK_LOAD', trackIndex})
  78. export function* trackLoadWorker (action) {
  79. let {trackIndex} = action
  80. let {player:{playlist}} = yield select ()
  81. trackActions(playlist[trackIndex])
  82. yield put({type:"TRACK_LOAD",playlistIndex:trackIndex})
  83. yield put (actionTrackPlay())
  84. }
  85. export function* trackLoadWatcher() {
  86. yield takeEvery ('ACTION_TRACK_LOAD',trackLoadWorker)
  87. }
  88. export const actionTrackPlay = () =>
  89. ({type:'ACTION_TRACK_PLAY'})
  90. export function* trackPlayWorker () {
  91. yield audio.play()
  92. yield put({type:"TRACK_PLAY",isPlaying:true,isPaused:false})
  93. }
  94. export function* trackPlayWatcher() {
  95. yield takeEvery ('ACTION_TRACK_PLAY',trackPlayWorker)
  96. }
  97. export const actionNextTrack = () =>
  98. ({type:'ACTION_NEXT_TRACK'})
  99. export function* nextTrackWorker () {
  100. let {player} = yield select ()
  101. let playlistIndex = player.playlistIndex
  102. let playlist = player.playlist
  103. if (playlist.length === playlistIndex + 1) {
  104. yield put({type:"NEXT_TRACK",playlistIndex:0})
  105. trackActions(player.playlist[0])
  106. yield put (actionTrackPlay())
  107. } else {
  108. yield put({type:"NEXT_TRACK",playlistIndex:playlistIndex+1})
  109. trackActions(player.playlist[playlistIndex+1])
  110. yield put (actionTrackPlay())
  111. }
  112. console.log(playlistIndex)
  113. }
  114. export function* nextTrackWatcher() {
  115. yield takeEvery ('ACTION_NEXT_TRACK',nextTrackWorker)
  116. }
  117. export const actionPreviousTrack = () =>
  118. ({type:'ACTION_PREVIOUS_TRACK'})
  119. export function* previousTrackWorker () {
  120. let {player} = yield select ()
  121. let p = player.playlistIndex
  122. if (p < 1) {
  123. yield put({type:"NEXT_TRACK",playlistIndex:0})
  124. trackActions(player.playlist[0])
  125. yield put (actionTrackPlay())
  126. } else {
  127. yield put({type:"PREVIOUS_TRACK",playlistIndex:p-1})
  128. trackActions(player.playlist[p-1])
  129. yield put (actionTrackPlay())
  130. }
  131. }
  132. export function* previousTrackWatcher() {
  133. yield takeEvery ('ACTION_PREVIOUS_TRACK',previousTrackWorker)
  134. }
  135. export const actionTrackStop = () =>
  136. ({type: 'ACTION_TRACK_STOP'})
  137. export function* trackStopWorker () {
  138. audio.pause()
  139. yield put({type:"TRACK_STOP",isPlaying:false,isPaused:true})
  140. }
  141. export function* trackStopWatcher() {
  142. yield takeEvery ('ACTION_TRACK_STOP',trackStopWorker)
  143. }
  144. export const actionTrackVolume = (e) =>
  145. ({type:'ACTION_TRACK_VOLUME', e})
  146. export function* trackVolumeWorker (action) {
  147. let {e} = action
  148. audio.volume = e
  149. yield put({type:"TRACK_VOLUME", volume:e})
  150. }
  151. export function* trackVolumeWatcher() {
  152. yield takeEvery ('ACTION_TRACK_VOLUME',trackVolumeWorker)
  153. }
  154. export const actionSetDuration = () => {
  155. let e = audio.duration
  156. store.dispatch({type:"TRACK_DURATION",duration:e})
  157. }
  158. export const actionTrackCurrentTime = (e) => {
  159. if (e) {
  160. audio.currentTime = e
  161. store.dispatch({type:"TRACK_CURRENT_TIME", currentTime:e})
  162. } else {
  163. let e = audio.currentTime
  164. store.dispatch({type:"TRACK_CURRENT_TIME", currentTime:e})
  165. }
  166. }
  167. //
  168. // export const actionTrackCurrentTime = (e) =>
  169. // ({type:'CURRENT_TIME', e})
  170. //
  171. //
  172. // export function* trackCurrentTimeWorker (action) {
  173. // let {e} = action
  174. // if (e) {
  175. // audio.currentTime = e
  176. // yield put({type:"TRACK_CURRENT_TIME", currentTime:e})
  177. // } else {
  178. // e = audio.currentTime
  179. // yield put({type:"TRACK_CURRENT_TIME", currentTime:e})
  180. // }
  181. //
  182. // }
  183. //
  184. // export function* trackCurrentTimeWatcher() {
  185. // yield takeEvery('CURRENT_TIME', trackCurrentTimeWorker)
  186. // }
  187. export const actionSetPlaylist = (playlistP,trackIndex,track) =>
  188. ({type:'ACTION_SET_PLAYLIST', playlistP,trackIndex,track})
  189. export function* setPlaylistWorker(action) {
  190. let {playlistP, trackIndex,track} = action
  191. yield put ({type:"SET_PLAYLIST", playlist:playlistP,track:track})
  192. yield put (actionTrackLoad(trackIndex))
  193. }
  194. export function* setPlaylistWatcher() {
  195. yield takeEvery ('ACTION_SET_PLAYLIST',setPlaylistWorker)
  196. }