playerReducer.js 5.8 KB

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