* VRFS-3668 - show download errors in popup player, VRFS-3659 - cache tracks in popup player

This commit is contained in:
Seth Call 2015-10-21 10:44:02 -05:00
parent f086ff74c3
commit d3d9a2db49
3 changed files with 75 additions and 23 deletions

View File

@ -75,14 +75,8 @@ mixins.push(Reflux.listenTo(JamTrackPlayerStore, 'onJamTrackPlayerStoreChanged')
disabled = true
if selectedMixdown.client_state?
switch selectedMixdown.client_state
when 'cant_open'
customMixName = `<h5>{selectedMixdown.name}<img src="/assets/content/icon-mix-fail@2X.png" /></h5>`
when 'keying_timeout'
customMixName = `<h5>{selectedMixdown.name}<img src="/assets/content/icon-mix-fail@2X.png" /></h5>`
when 'download_fail'
customMixName = `<h5>{selectedMixdown.name}<img src="/assets/content/icon-mix-fail@2X.png" /></h5>`
when 'keying'
customMixName = `<h5>Loading selected mix... <img src="/assets/shared/spinner.gif" /></h5>`
when 'downloading'
customMixName = `<h5>Loading selected mix... <img src="/assets/shared/spinner.gif" /></h5>`
when 'ready'
@ -110,6 +104,8 @@ mixins.push(Reflux.listenTo(JamTrackPlayerStore, 'onJamTrackPlayerStoreChanged')
switch selectedStem.client_state
when 'downloading'
customMixName = `<h5>Loading {trackName}... <img src="/assets/shared/spinner.gif" /></h5>`
when 'download_fail'
customMixName = `<h5>{trackName}<img src="/assets/content/icon-mix-fail@2X.png" /></h5>`
when 'ready'
customMixName = `<h5>{trackName}</h5>`
disabled = false
@ -119,6 +115,8 @@ mixins.push(Reflux.listenTo(JamTrackPlayerStore, 'onJamTrackPlayerStoreChanged')
else
if jamTrack?.client_state == 'downloading'
downloader = `<img src="/assets/shared/spinner.gif" />`
else if jamTrack?.client_state == 'download_fail'
downloader = `<img src="/assets/content/icon-mix-fail@2X.png" />`
jamTrackTypeHeader = `<span>Full JamTrack {downloader}</span>`

View File

@ -14,8 +14,11 @@ BrowserMediaActions = @BrowserMediaActions
loading: false
playing: false
paused: false
load_error: false
id: null
media_type: null
cachedAudio: []
cache_size: 10
playbackState:(position, time) ->
state = {}
@ -29,7 +32,6 @@ BrowserMediaActions = @BrowserMediaActions
state.playbackStateChanged = !@state? || @state.isPlaying != @playing || @state.paused != @paused
state.positionUpdateChanged = !@state? || @state.positionMs != position
state.currentTimeChanged = !@state? || @state.time != time
state
changed: () ->
@ -39,38 +41,54 @@ BrowserMediaActions = @BrowserMediaActions
# XXX: how to deal with duration? no mention in Howler API
target = {id: @id, isPlaying: @playing, loaded: @loaded, paused: @paused, positionMs: position, time: time, durationMs: @onGetPlayDuration()}
target = {id: @id, isPlaying: @playing, loaded: @loaded, paused: @paused, loading: @loading, load_error: @load_error, positionMs: position, time: time, durationMs: @onGetPlayDuration()}
$.extend(true, target, playbackState)
@state = target
@trigger(@state)
onLoad: (id, urls, media_type) ->
if @loading
logger.error("you can't switch to different audio while loading due to weird errors seen in Howler")
return
if @audio
@audio.stop()
@audio.unload()
@loaded = false
@loading = false
@playing = false
@paused = false
@load_error = false
@audio = null
@id = id
@media_type = media_type
@loading = true
@playing = false
@paused = false
console.log("URLS", urls)
@audio = new Howl({
src: urls,
autoplay: false,
loop: false,
volume: 1,
preload: true,
onend: @onAudioEnded,
onload: @onAudioLoaded,
onpause: @onAudioPause,
onplay: @onAudioPlay
})
for cacheItem in @cachedAudio
if cacheItem.id == id
# items in our own cache are only there if we saw that it fully loaded
@audio = cacheItem.audio
@loaded = true
@loading = false
unless @audio?
@audio = new Howl({
src: urls,
autoplay: false,
loop: false,
volume: 1,
preload: true,
onend: @onAudioEnded,
onload: @onAudioLoaded,
onloaderror: @onAudioLoadError,
onpause: @onAudioPause,
onplay: @onAudioPlay
})
@audio.jkid = id
@changed()
@ -135,13 +153,30 @@ BrowserMediaActions = @BrowserMediaActions
0
onAudioEnded: () ->
logger.debug("onAudioEnded", this, arguments)
logger.debug("onAudioEnded")
@playing = false
@changed()
onAudioLoaded: () ->
logger.debug("onAudioLoaded")
logger.debug("onAudioLoaded", arguments)
@loaded = true
@loading = false
# add audio to cache, and ageout cached audio items if more than 10 \
if @cachedAudio.length >= @cache_size
audio = @cachedAudio.shift()
try
audio.audio.unload()
catch e
logger.error("unable to unload aged audio", @audio)
@cachedAudio.push({id: @audio.jkid, audio: @audio})
@changed()
onAudioLoadError: () ->
logger.debug("onAudioLoadError", arguments)
@load_error = true
@loading = false
@changed()
onAudioPause: () ->

View File

@ -167,6 +167,8 @@ BrowserMediaActions = @BrowserMediaActions
else
if @browserMediaState.loaded
@jamTrack.activeStem.client_state = 'ready'
else if @browserMediaState.load_error
@jamTrack.activeStem.client_state = 'download_fail'
else
@jamTrack.activeStem.client_state = 'downloading'
@ -185,6 +187,8 @@ BrowserMediaActions = @BrowserMediaActions
else
if @browserMediaState.loaded
@jamTrack.activeMixdown.client_state = 'ready'
else if @browserMediaState.load_error
@jamTrack.activeMixdown.client_state = 'download_fail'
else
@jamTrack.activeMixdown.client_state = 'downloading'
@ -202,6 +206,8 @@ BrowserMediaActions = @BrowserMediaActions
else
if @browserMediaState.loaded
@jamTrack.client_state = 'ready'
else if @browserMediaState.load_error
@jamTrack.client_state = 'download_fail'
else
@jamTrack.client_state = 'downloading'
else
@ -278,6 +284,10 @@ BrowserMediaActions = @BrowserMediaActions
alert("stop playing")
onOpenMixdown: (mixdown) ->
if @browserMediaState.loading
logger.warn("can not activate mixdown while browser media is loading")
return
logger.debug("opening mixdown", mixdown)
# check if it's already available in the backend or not
@ -295,6 +305,10 @@ BrowserMediaActions = @BrowserMediaActions
)
onOpenStem: (stem_id) ->
if @browserMediaState.loading
logger.warn("can not activate stem while browser media is loading")
return
logger.debug("opening stem", stem_id)
# check if it's already available in the backend or not
@ -312,6 +326,11 @@ BrowserMediaActions = @BrowserMediaActions
)
onActivateNoMixdown: (jamTrack) ->
if @browserMediaState.loading
logger.warn("can not activate JamTrack while browser media is loading")
return
logger.debug("activating no mixdown")
rest.markMixdownActive({id: @jamTrack.id, mixdown_id: null})