playerReducer.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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. export const actionTrackLoad = (trackIndex) =>
  70. ({type:'ACTION_TRACK_LOAD', trackIndex})
  71. export function* trackLoadWorker (action) {
  72. let {trackIndex} = action
  73. let {player:{playlist}} = yield select ()
  74. // if (playlistIndex !== trackIndex) {
  75. audio.src = backURL + '/'+ playlist[trackIndex].url
  76. audio.load()
  77. console.log(trackIndex)
  78. audio.ondurationchange = function(){actionSetDuration()}
  79. audio.ontimeupdate = function(){actionTrackCurrentTime()}
  80. yield put({type:"TRACK_LOAD",playlistIndex:trackIndex})
  81. yield put (actionTrackPlay())
  82. }
  83. export function* trackLoadWatcher() {
  84. yield takeEvery ('ACTION_TRACK_LOAD',trackLoadWorker)
  85. }
  86. export const actionTrackPlay = () =>
  87. ({type:'ACTION_TRACK_PLAY'})
  88. export function* trackPlayWorker () {
  89. yield audio.play()
  90. yield put({type:"TRACK_PLAY",isPlaying:true,isPaused:false})
  91. console.log('play')
  92. }
  93. export function* trackPlayWatcher() {
  94. yield takeEvery ('ACTION_TRACK_PLAY',trackPlayWorker)
  95. }
  96. export const actionNextTrack = () =>
  97. ({type:'ACTION_NEXT_TRACK'})
  98. export function* nextTrackWorker () {
  99. let {player} = yield select ()
  100. let playlistIndex = player.playlistIndex
  101. let playlist = player.playlist
  102. if (playlist.length === playlistIndex + 1) {
  103. yield put({type:"NEXT_TRACK",playlistIndex:0})
  104. audio.src = backURL + '/'+ player.playlist[0].url
  105. audio.load()
  106. audio.ondurationchange = function(){actionSetDuration()}
  107. audio.ontimeupdate = function(){actionTrackCurrentTime()}
  108. audio.play()
  109. } else {
  110. yield put({type:"NEXT_TRACK",playlistIndex:playlistIndex+1})
  111. audio.src = backURL + '/'+ player.playlist[playlistIndex+1].url
  112. audio.load()
  113. audio.ondurationchange = function(){actionSetDuration()}
  114. audio.ontimeupdate = function(){actionTrackCurrentTime()}
  115. audio.play()
  116. }
  117. console.log(playlistIndex)
  118. }
  119. export function* nextTrackWatcher() {
  120. yield takeEvery ('ACTION_NEXT_TRACK',nextTrackWorker)
  121. }
  122. export const actionPreviousTrack = () =>
  123. ({type:'ACTION_PREVIOUS_TRACK'})
  124. export function* previousTrackWorker () {
  125. let {player} = yield select ()
  126. let p = player.playlistIndex
  127. if (p < 1) {
  128. yield put({type:"NEXT_TRACK",playlistIndex:0})
  129. audio.src = backURL + '/'+ player.playlist[0].url
  130. audio.load()
  131. audio.ondurationchange = function(){actionSetDuration()}
  132. audio.ontimeupdate = function(){actionTrackCurrentTime()}
  133. audio.play()
  134. } else {
  135. yield put({type:"PREVIOUS_TRACK",playlistIndex:p-1})
  136. audio.src = backURL + '/'+ player.playlist[p-1].url
  137. audio.load()
  138. audio.ondurationchange = function(){actionSetDuration()}
  139. audio.ontimeupdate = function(){actionTrackCurrentTime()}
  140. audio.play()
  141. }
  142. }
  143. export function* previousTrackWatcher() {
  144. yield takeEvery ('ACTION_PREVIOUS_TRACK',previousTrackWorker)
  145. }
  146. export const actionTrackStop = () =>
  147. ({type: 'ACTION_TRACK_STOP'})
  148. export function* trackStopWorker () {
  149. audio.pause()
  150. yield put({type:"TRACK_STOP",isPlaying:false,isPaused:true})
  151. }
  152. export function* trackStopWatcher() {
  153. yield takeEvery ('ACTION_TRACK_STOP',trackStopWorker)
  154. }
  155. export const actionTrackVolume = (e) =>
  156. ({type:'ACTION_TRACK_VOLUME', e})
  157. export function* trackVolumeWorker (action) {
  158. let {e} = action
  159. audio.volume = e
  160. yield put({type:"TRACK_VOLUME", volume:e})
  161. }
  162. export function* trackVolumeWatcher() {
  163. yield takeEvery ('ACTION_TRACK_VOLUME',trackVolumeWorker)
  164. }
  165. export const actionSetDuration = () => {
  166. let e = audio.duration
  167. store.dispatch({type:"TRACK_DURATION",duration:e})
  168. }
  169. export const actionTrackCurrentTime = () => {
  170. let e = audio.currentTime
  171. store.dispatch({type:"TRACK_CURRENT_TIME", currentTime:e})
  172. }
  173. export const actionSetPlaylist = (playlistP,trackIndex,track) =>
  174. ({type:'ACTION_SET_PLAYLIST', playlistP,trackIndex,track})
  175. export function* setPlaylistWorker(action) {
  176. let {playlistP, trackIndex,track} = action
  177. yield put ({type:"SET_PLAYLIST", playlist:playlistP,track:track})
  178. yield put (actionTrackLoad(trackIndex))
  179. }
  180. export function* setPlaylistWatcher() {
  181. yield takeEvery ('ACTION_SET_PLAYLIST',setPlaylistWorker)
  182. }